#include hook OnGameModeInit() { Iter_Init(PropertyKey); Iter_Init(VehicleKey); } hook OnPlayerDisconnect(playerid, reason) { Iter_Clear(PropertyKey[playerid]); Iter_Clear(VehicleKey[playerid]); } hook OnCharacterLoaded(playerid) { inline const OnKeysLoaded() { new rows = cache_num_rows(); new type; new subjectid; for(new i; i < rows; i++) { cache_get_value_name_int(i, "type", type); cache_get_value_name_int(i, "subject_id", subjectid); switch(type) { case KEY_PROPERTY: Iter_Add(PropertyKey[playerid], subjectid); case KEY_VEHICLE: Iter_Add(VehicleKey[playerid], subjectid); } } } MySQL_TQueryInline(MySQL_GetHandle(), using inline OnKeysLoaded, "SELECT type, subject_id FROM character_keys WHERE owner_id = %d", Character_GetSQLID(playerid)); } CMD:givekey(playerid, params[]) { if(isnull(params)) return SendSyntaxMessage(playerid, "/givekey (property/vehicle)"); if(!strcmp(params, "property", true, 8)) { new targetid, propertyid; if(sscanf(params, "{s[9]}ui", targetid, propertyid)) return SendSyntaxMessage(playerid, "/givekey property (playerid) (propertyid)"); if(!IsPlayerConnected(targetid)) return SendErrorMessage(playerid, "You specified an invalid player."); if(!IsPlayerNearPlayer(playerid, targetid, 2.0)) return SendErrorMessage(playerid, "You're too far from that player."); if(!Iter_Contains(PropertyKey[playerid], propertyid)) return SendErrorMessage(playerid, "You don't have the keys to that property."); if(Iter_Contains(PropertyKey[targetid], propertyid)) return SendErrorMessage(playerid, "That player already has the keys to this property."); if(!IsPlayerOwningProperty(playerid, propertyid)) Iter_Remove(PropertyKey[playerid], propertyid); Iter_Add(PropertyKey[targetid], propertyid); SendInfoMessageF(playerid, "You gave a duplicate key to %s. (Property ID %d)", ReturnPlayerRPName(playerid), propertyid); SendInfoMessageF(targetid, "%s gave you a duplicate key for the %d property. (Use /dropduplicatekey to drop it)"); Key_Give(targetid, KEY_PROPERTY, propertyid); } else if(!strcmp(params, "vehicle", true, 7)) { new targetid, vehiclesqlid; if(sscanf(params, "{s[8]}ui", targetid, vehiclesqlid)) return SendSyntaxMessage(playerid, "/givekey vehicle (playerid) (vehicle SQL ID)"); if(!IsPlayerConnected(targetid)) return SendErrorMessage(playerid, "You specified an invalid player."); if(!IsPlayerNearPlayer(playerid, targetid, 2.0)) return SendErrorMessage(playerid, "You're too far from that player."); if(!Iter_Contains(VehicleKey[playerid], vehiclesqlid)) return SendErrorMessage(playerid, "You don't have the keys to that vehicle."); if(Iter_Contains(VehicleKey[targetid], vehiclesqlid)) return SendErrorMessage(playerid, "That player already has the keys to this vehicle."); if(!IsPlayerOwningVehicle(playerid, vehiclesqlid)) Iter_Remove(VehicleKey[playerid], vehiclesqlid); Iter_Add(VehicleKey[targetid], vehiclesqlid); SendInfoMessageF(playerid, "You gave a duplicate key to %s. (Vehicle SQL ID %d)", ReturnPlayerRPName(playerid), vehiclesqlid); SendInfoMessageF(targetid, "%s gave you a duplicate key for the %d vehicle SQL ID. (Use /dropvehiclekey to drop it)"); Key_Give(targetid, KEY_VEHICLE, vehiclesqlid); } else SendSyntaxMessage(playerid, "/givekey (property/vehicle)"); return 1; } CMD:dropkey(playerid, params[]) { if(isnull(params)) return SendSyntaxMessage(playerid, "/dropkey (property/vehicle)"); if(!strcmp(params, "property", true, 8)) { new propertyid; if(sscanf(params, "{s[9]}i", propertyid)) return SendSyntaxMessage(playerid, "/dropkey property (propertyid)"); if(!Iter_Contains(PropertyKey[playerid], propertyid)) return SendErrorMessage(playerid, "You don't have the keys to that property."); if(IsPlayerOwningProperty(playerid, propertyid)) return SendErrorMessage(playerid, "You can't drop the keys of your own property."); Iter_Remove(PropertyKey[playerid], propertyid); SendInfoMessageF(playerid, "You just dropped the keys to %d property.", propertyid); Key_Remove(playerid, KEY_PROPERTY, propertyid); } else if(!strcmp(params, "vehicle", true, 7)) { new vehiclesqlid; if(sscanf(params, "{s[8]}i", vehiclesqlid)) return SendSyntaxMessage(playerid, "/dropkey vehicle (vehicle SQL ID)"); if(!Iter_Contains(PropertyKey[playerid], vehiclesqlid)) return SendErrorMessage(playerid, "You don't have the keys to that vehicle."); if(IsPlayerOwningProperty(playerid, vehiclesqlid)) return SendErrorMessage(playerid, "You can't drop the keys of your own vehicle."); Iter_Remove(VehicleKey[playerid], vehiclesqlid); SendInfoMessageF(playerid, "You just dropped the keys to %d vehicle SQL ID.", vehiclesqlid); Key_Remove(playerid, KEY_VEHICLE, vehiclesqlid); } else SendSyntaxMessage(playerid, "/dropkey (property/vehicle)"); return 1; } Key_Give(playerid, type, subjectid) { new query[128]; mysql_format(MySQL_GetHandle(), query, sizeof(query), "INSERT INTO character_keys (owner_id, type, subject_id, created_at) VALUES (%d, %d, %d, NOW())", Character_GetSQLID(playerid), type, subjectid); mysql_tquery(MySQL_GetHandle(), query); } Key_Remove(playerid, type, subjectid) { new query[128]; mysql_format(MySQL_GetHandle(), query, sizeof(query), "DELETE FROM character_keys WHERE owner_id = %d AND type = %d AND subject_id = %d", Character_GetSQLID(playerid), type, subjectid); mysql_tquery(MySQL_GetHandle(), query); } stock bool:IsPlayerOwningVehicleKey(playerid, subjectid) { if(Iter_Contains(VehicleKey[playerid], subjectid)) { return true; } return false; } stock bool:IsPlayerOwningPropertyKey(playerid, subjectid) { if(Iter_Contains(PropertyKey[playerid], subjectid)) { return true; } return false; }