/* Easy vehicle saving Version 0.1 ~ By [HiC]TheKiller ~ */ /* native SaveVehicle(playerid, slotid = 1) native LoadVehicle(playerid, slotid = 1, type = TYPE_CREATE_VEHICLE, respawntime = 999999999999) native DoesPlayerHaveVehicleInSlot(playerid, slotid) native GetVehicleModelInSlot(playerid, slotid) native DeleteVehicleInSlot(playerid, slotid) native CountPlayerVehicles(playerid) native ReturnPlayerVehicleSlots(playerid, arraydest[]) native GetTotalVehiclesSaved() */ //Compiler stuff #if defined _samp_included #else #include #define _samp_included #endif #if defined Included_tkvehicle #endinput #endif #define Included_tkvehicle //==================================== //Defines for returns #define SUCCESSFUL_SAVE 1 #define NO_VEHICLE_IN_SLOT 2 #define UNABLE_TO_SAVE_VEHICLE 3 #define PLAYER_NOT_IN_VEHICLE 4 #define PLAYER_NOT_CONNECTED 5 #define TYPE_CREATE_VEHICLE 1 #define TYPE_ADD_STATIC_VEHICLE 2 #define TYPE_ADD_STATIC_VEHICLE_EX 3 //==================================== //Global variables / used defines new DB:vehicledb, DBResult:queryresult; #define vdb_query(%1) db_query(vehicledb, %1) //========================================== //Hooks public OnGameModeInit() { vehicledb = db_open("vehicledb.db"); vdb_query("CREATE TABLE IF NOT EXISTS vehicleinfo (username VARCHAR(24), vehicleinfo VARCHAR(300), slotid INT)"); return CallLocalFunction("hooking_OnGameModeInit", ""); } #if defined _ALS_OnGameModeInit #undef OnGameModeInit #else #define _ALS_OnGameModeInit #endif #define OnGameModeInit hooking_OnGameModeInit forward hooking_OnGameModeInit(); public OnFilterScriptInit() { vehicledb = db_open("vehicledb.db"); vdb_query("CREATE TABLE IF NOT EXISTS vehicleinfo (username VARCHAR(24), vehicleinfo VARCHAR(300), slotid INT)"); return CallLocalFunction("hooking_OnFilterScriptInit", ""); } #if defined _ALS_OnFilterScriptInit #undef OnFilterScriptInit #else #define _ALS_OnFilterScriptInit #endif #define OnFilterScriptInit hooking_OnFilterScriptInit forward hooking_OnFilterScriptInit(); //============================================================== //The following is mostly Ryder's include but it has been edited //Credits go to Ryder :) //============================================================== #define PROPERTY_OFFSET_P(%0) \ ((((%0) * ((%0) << 1)) << 2) + 65536*2) #define PROPERTY_OFFSET_C(%0) \ ((((%0) * ((%0) << 1)) << 2) + 65536) public OnVehiclePaintjob(playerid, vehicleid, paintjobid) { new str[50]; valstr(str, paintjobid); setproperty(_, "", PROPERTY_OFFSET_P(vehicleid), str); return CallLocalFunction("hooking_OnVehiclePaintjob", ""); } #if defined _ALS_OnVehiclePaintjob #undef OnVehiclePaintjob #else #define _ALS_OnVehiclePaintjob #endif #define OnVehiclePaintjob hooking_OnVehiclePaintjob forward hooking_OnVehiclePaintjob(); stock x_ChangeVehiclePaintjob(_vehicleID, _paintjobid) { new str[50]; valstr(str, _paintjobid); setproperty(_, "", PROPERTY_OFFSET_P(_vehicleID), str); return ChangeVehiclePaintjob(_vehicleID, _paintjobid); } stock GetVehiclePaintJob(_vehicleID) { _vehicleID = PROPERTY_OFFSET_P(_vehicleID); if(existproperty(_, "", _vehicleID)) { new str[5]; getproperty(_, "", _vehicleID, str); strunpack(str, str); return strval(str); } return 0; } stock x_AddStaticVehicle(modelID, Float: spawn_X, Float: spawn_Y, Float: spawn_Z, Float: z_Angle, color1, color2, paintjob = -1) { if(color1 < -1 || color2 < 0) { color1 = random(127); color2 = random(127); } modelID = AddStaticVehicle(modelID, spawn_X, spawn_Y, spawn_Z, z_Angle, color1, color2); new colorStr[24]; format(colorStr, sizeof(colorStr), "%d-%d", color1, color2); setproperty(_, "", PROPERTY_OFFSET_C(modelID), colorStr); valstr(colorStr, paintjob); setproperty(_, "", PROPERTY_OFFSET_P(modelID), colorStr); if(paintjob != -1) ChangeVehiclePaintjob(modelID, paintjob); return modelID; } stock x_AddStaticVehicleEx(modelID, Float: spawn_X, Float: spawn_Y, Float: spawn_Z, Float: z_Angle, color1, color2, respawn_Delay, paintjob = -1) { if(color1 < 0 || color2 < 0) { color1 = random(127); color2 = random(127); } modelID = AddStaticVehicleEx(modelID, spawn_X, spawn_Y, spawn_Z, z_Angle, color1, color2, respawn_Delay); new colorStr[24]; format(colorStr, sizeof(colorStr), "%d-%d", color1, color2); setproperty(_, "", PROPERTY_OFFSET_C(modelID), colorStr); valstr(colorStr, paintjob); setproperty(_, "", PROPERTY_OFFSET_P(modelID), colorStr); if(paintjob != -1) ChangeVehiclePaintjob(modelID, paintjob); return modelID; } stock x_CreateVehicle(modelID, Float: spawn_X, Float: spawn_Y, Float: spawn_Z, Float: z_Angle, color1, color2, respawn_Delay, paintjob = -1) { if(color1 < 0 || color2 < 0) { color1 = random(127); color2 = random(127); } modelID = CreateVehicle(modelID, spawn_X, spawn_Y, spawn_Z, z_Angle, color1, color2, respawn_Delay); new colorStr[24]; format(colorStr, sizeof(colorStr), "%d-%d", color1, color2); setproperty(_, "", PROPERTY_OFFSET_C(modelID), colorStr); valstr(colorStr, paintjob); setproperty(_, "", PROPERTY_OFFSET_P(modelID), colorStr); if(paintjob != -1) ChangeVehiclePaintjob(modelID, paintjob); return modelID; } stock x_DestroyVehicle(vehicleID) { deleteproperty(_, "", PROPERTY_OFFSET_C(vehicleID)); deleteproperty(_, "", PROPERTY_OFFSET_P(vehicleID)); return DestroyVehicle(vehicleID); } stock x_ChangeVehicleColor(vehicleID, color1, color2) { new colorStr[24]; format(colorStr, sizeof(colorStr), "%d-%d", color1, color2); setproperty(_, "", PROPERTY_OFFSET_C(vehicleID), colorStr); return ChangeVehicleColor(vehicleID, color1, color2); } public OnVehicleRespray(playerid, vehicleid, color1, color2) { new colorStr[24]; format(colorStr, sizeof(colorStr), "%d-%d", color1, color2); setproperty(_, "", PROPERTY_OFFSET_C(vehicleid), colorStr); return CallLocalFunction("x_OnVehicleRespray", "iiii", playerid, vehicleid, color1, color2); } stock GetVehicleColor(vehicleID, &color1, &color2) { vehicleID = PROPERTY_OFFSET_C(vehicleID); if(existproperty(_, "", vehicleID)) { new colorStr[24], strPos; getproperty(_, "", vehicleID, colorStr); strunpack(colorStr, colorStr); while(colorStr[strPos] != '-') strPos++; color1 = strval(colorStr); color2 = strval(colorStr[strPos + 1]); return 1; } return 0; } #define AddStaticVehicle x_AddStaticVehicle #define AddStaticVehicleEx x_AddStaticVehicleEx #define CreateVehicle x_CreateVehicle #define DestroyVehicle x_DestroyVehicle #define ChangeVehicleColor x_ChangeVehicleColor #define ChangeVehiclePaintjob x_ChangeVehiclePaintjob #if defined _ALS_OnVehicleRespray #undef OnVehicleRespray #else #define _ALS_OnVehicleRespray #endif #define OnVehicleRespray x_OnVehicleRespray forward x_OnVehicleRespray(playerid, vehicleid, color1, color2); //================================================= stock SaveVehicle(playerid, slotid = 1) { if(!IsPlayerInAnyVehicle(playerid)) return PLAYER_NOT_IN_VEHICLE; if(!IsPlayerConnected(playerid)) return PLAYER_NOT_CONNECTED; new v_color[2], v_id = GetPlayerVehicleID(playerid), vehinfo[250]; GetVehicleColor(v_id, v_color[0], v_color[1]); format(vehinfo, sizeof(vehinfo), "%s%d-%d-%d-%d", vehinfo, GetVehicleModel(v_id), v_color[0], v_color[1], GetVehiclePaintJob(v_id)); for ( new z; z < 14; z++ ) format(vehinfo, sizeof(vehinfo), "%s-%d", vehinfo, GetVehicleComponentInSlot(v_id, z)); new pname[24], v_query[350]; GetPlayerName(playerid, pname, 24); format(v_query, sizeof(v_query), "SELECT slotid FROM vehicleinfo WHERE username = '%s' AND slotid = %d", pname, slotid); queryresult = vdb_query(v_query); if(db_num_rows(queryresult) == 1) format(v_query, sizeof(v_query), "UPDATE vehicleinfo SET vehicleinfo = '%s' WHERE username = '%s' AND slotid = %d", vehinfo, pname, slotid); else format(v_query, sizeof(v_query), "INSERT INTO vehicleinfo (username, vehicleinfo, slotid) VALUES ('%s', '%s', %d)", pname, vehinfo, slotid); db_free_result(queryresult); vdb_query(v_query); return SUCCESSFUL_SAVE; } stock LoadVehicle(playerid, slotid = 1, type = TYPE_CREATE_VEHICLE, respawntime = 999999999999) { new pname[24], v_query[150], vehinfo[350], veh_id; GetPlayerName(playerid, pname, 24); format(v_query, sizeof(v_query), "SELECT vehicleinfo FROM vehicleinfo WHERE username = '%s' AND slotid = %d", pname, slotid); queryresult = vdb_query(v_query); if(!db_num_rows(queryresult)) { db_free_result(queryresult); return NO_VEHICLE_IN_SLOT; } else { db_get_field_assoc(queryresult, "vehicleinfo", vehinfo, sizeof(vehinfo)); db_free_result(queryresult); new veh_info[19]; #if defined sscanf sscanf(vehinfo, "p<->ddddddddddddddddddd", veh_info[0], veh_info[1], veh_info[2], veh_info[3], veh_info[4], veh_info[5], veh_info[6], veh_info[7],veh_info[8], veh_info[9], veh_info[10], veh_info[11], veh_info[12],veh_info[13], veh_info[14], veh_info[15], veh_info[16], veh_info[17], veh_info[18]); #else new vehinformation[19][7]; split(vehinfo, vehinformation, '-'); for( new xx; xx<18; xx++ ) { veh_info[xx] = strval(vehinformation[xx]); } #endif new Float:pos[4]; GetPlayerPos(playerid, pos[0], pos[1], pos[2]); GetPlayerFacingAngle(playerid, pos[3]); if(type == TYPE_CREATE_VEHICLE) veh_id = CreateVehicle(veh_info[0], pos[0], pos[1], pos[2], pos[3], veh_info[1], veh_info[2], respawntime, veh_info[3]); if(type == TYPE_ADD_STATIC_VEHICLE) veh_id = AddStaticVehicle(veh_info[0], pos[0], pos[1], pos[2], pos[3], veh_info[1], veh_info[2], veh_info[3]); if(type == TYPE_ADD_STATIC_VEHICLE_EX) veh_id = AddStaticVehicleEx(veh_info[0], pos[0], pos[1], pos[2], pos[3], veh_info[1], veh_info[2], respawntime, veh_info[3]); for( new xx; xx<13; xx++ ) if(veh_info[xx + 4] != 0) AddVehicleComponent(veh_id, veh_info[xx + 4]); PutPlayerInVehicle(playerid, veh_id, 0); } return veh_id; } stock DoesPlayerHaveVehicleInSlot(playerid, slotid) { new pname[24], v_query[150]; GetPlayerName(playerid, pname, 24); format(v_query, sizeof(v_query), "SELECT slotid FROM vehicleinfo WHERE username = '%s' AND slotid = %d", pname, slotid); queryresult = vdb_query(v_query); new numresults = db_num_rows(queryresult); db_free_result(queryresult); if(!numresults) return false; return true; } stock GetVehicleModelInSlot(playerid, slotid) { new pname[24], v_query[150], vehinfo[200], modelid[10]; GetPlayerName(playerid, pname, 24); format(v_query, sizeof(v_query), "SELECT vehicleinfo FROM vehicleinfo WHERE username = '%s' AND slotid = %d", pname, slotid); queryresult = vdb_query(v_query); if(!db_num_rows(queryresult)) { db_free_result(queryresult); return NO_VEHICLE_IN_SLOT; } else { db_get_field_assoc(queryresult, "vehicleinfo", vehinfo, sizeof(vehinfo)); db_free_result(queryresult); new id; while(vehinfo[id] != '-') id++; strmid(modelid, vehinfo, 0, id); } return strval(modelid); } stock DeleteVehicleInSlot(playerid, slotid) { new pname[24], v_query[150]; GetPlayerName(playerid, pname, 24); format(v_query, sizeof(v_query), "DELETE FROM vehicleinfo WHERE username = '%s' AND slotid = %d", pname, slotid); vdb_query(v_query); return 1; } stock CountPlayerVehicles(playerid) { new pname[24], v_query[150]; GetPlayerName(playerid, pname, 24); format(v_query, sizeof(v_query), "SELECT slotid FROM vehicleinfo WHERE username = '%s'", pname); queryresult = vdb_query(v_query); new numresults = db_num_rows(queryresult); db_free_result(queryresult); return numresults; } stock ReturnPlayerVehicleSlots(playerid, arraydest[]) { new pname[24], v_query[150], slotid[10]; GetPlayerName(playerid, pname, 24); format(v_query, sizeof(v_query), "SELECT slotid FROM vehicleinfo WHERE username = '%s'", pname); queryresult = vdb_query(v_query); new numresults = db_num_rows(queryresult); db_free_result(queryresult); if(numresults == 1) { db_get_field_assoc(queryresult, "slotid", slotid, 10); arraydest[0] = strval(slotid); } else { for(new r; r < numresults; r++ ) { db_get_field_assoc(queryresult, "slotid", slotid, 10); arraydest[r] = strval(slotid); db_next_row(queryresult); } } return numresults; } stock GetTotalVehiclesSaved() { queryresult = vdb_query("SELECT slotid FROM vehicleinfo"); new numresults = db_num_rows(queryresult); db_free_result(queryresult); return numresults; } #if defined sscanf #else //modded version of split stock split(const strsrc[], strdest[][], delimiter) { new li, aNum, len, lenx = strlen(strsrc); for (new i; i <= lenx; i++) { if(strsrc[i] == delimiter || i == lenx) { len = strmid(strdest[aNum], strsrc, li, i, 10); strdest[aNum][len] = 0; li = i+1; aNum++; } } return 1; } #endif