fabio3 Posted February 24, 2019 Share Posted February 24, 2019 (edited) Garage Save eXtender (or GSX for short) is an ASI mod for GTA San Andreas that allows other mods to store more info/data for cars saved in garages. Showing the Vehicle License Plate Save mod: The data stored is identified by name and exclusive for the vehicle it belongs You can use the GSX in mods CLEO, C/C++, Lua or CLEO and C/C++ (Portuguese) GSX save files located in Documents/GTA San Andreas User Files/gsx Code examples included in download. Thread in Mixmods forum (Portuguese) Download GSX (+API and examples) Mods currently using GSX: Download License Plate Save Mod ASI (requires the gsx.asi) VehFuncs - new vehicle functions [Lua] Vehicle Paint using RGB colors (Portuguese) [Lua] Other vehicles painted with RGB colors (Portuguese) [Lua] Gas stations (Portuguese) Reserved data names: _hash Contains a unsigned 64bits integer hash for the vehicle TODO: Documentation of all functions More tests in GSX.asi Spoiler License Plate Save (with logging for debug) source code: Spoiler Requires: GSX API (included in GSX download) Plugin-SDK LINK/2012's Injector //#define _CRT_SECURE_NO_WARNINGS #include <Windows.h> #include <injector\injector.hpp> #include <injector\assembly.hpp> #include <injector\calling.hpp> #include <injector\saving.hpp> #include <game_sa\CVehicle.h> #include <game_sa\CMatrix.h> #include <game_sa\RenderWare.h> #include <string> #include "CStoredCar.h" #include "GSXAPI.h" #include <fstream> static auto getVehicleModelInfoByID = injector::cstd<CVehicleModelInfo*(int id)>::call<0x00403DA0>; auto CustomCarPlate_TextureCreate = injector::thiscall<bool(CVehicle *, CVehicleModelInfo *)>::call<0x006D10E0>; std::fstream saveLicensePlateLog("saveLicensePlate.log", std::ios::out | std::ios::trunc); void callback(const GSX::externalCallbackStructure *test) { using namespace GSX; if (test->veh) { switch (test->status) { case GSX::LOAD_CAR: { if (dataToLoadExists(test->veh, "carplate")) { const char *plateText = (const char *)getSavedData(test->veh, "carplate"); if (plateText != nullptr) { CVehicleModelInfo *info = getVehicleModelInfoByID(test->veh->m_wModelIndex); strncpy(info->m_plateText, plateText, 8u); if (CustomCarPlate_TextureCreate(test->veh, info)) { //RwFrame; //RpClump; char testPlate[9] = { 0 }; strncpy(testPlate, plateText, 8u); testPlate[8] = 0; saveLicensePlateLog << std::to_string((uintptr_t)test->veh) << " GTA SA function CustomCarPlate_TextureCreate: OK " << testPlate << std::endl; } else { //MessageBoxA(0, "error plate", "", 0); saveLicensePlateLog << std::to_string((uintptr_t)test->veh) << " GTA SA function CustomCarPlate_TextureCreate: error" << std::endl; } } else { saveLicensePlateLog << std::to_string((uintptr_t)test->veh) << " plateText is nullptr " << std::endl; } } else { saveLicensePlateLog << std::to_string((uintptr_t)test->veh) << " GSX carplate not exists" << std::endl; } break; } case GSX::SAVE_CAR: { if (test->veh->m_pCustomCarPlate) { setDataToSaveLater(test->veh, "carplate", 8, test->veh->m_pCustomCarPlate->name, true); char testPlate[9] = {0}; strncpy(testPlate, test->veh->m_pCustomCarPlate->name, 8u); testPlate[8] = 0; saveLicensePlateLog << std::to_string((uintptr_t)test->veh) << " saving license plate " << testPlate << std::endl; } else { saveLicensePlateLog << std::to_string((uintptr_t)test->veh) << " veh->m_pCustomCarPlate is nullptr" << std::endl; } break; } default: saveLicensePlateLog << "GSX unknow status" << std::endl; break; } } else { saveLicensePlateLog << "GSX Veh is nullptr" << std::endl; } } void onload(int id) { static bool loaded = false; if (!loaded) { saveLicensePlateLog << "ASI date/time: " __DATE__ " " __TIME__ << std::endl; loaded = true; addNotifyCallback(callback); } } void inject() { injector::save_manager::on_load(onload); } BOOL WINAPI DllMain( _In_ HINSTANCE hinstDLL, _In_ DWORD fdwReason, _In_ LPVOID lpvReserved ){ if (fdwReason == DLL_PROCESS_ATTACH) inject(); return true; } Edited April 16, 2020 by fabio3 Grinch_, HzanRsxa2959, ural and 6 others 8 1 Link to comment Share on other sites More sharing options...
lockout18yt Posted September 9, 2021 Share Posted September 9, 2021 Hey! Do you know why this could be crashing with GTA Underground? I'm thinking because of the added cars, but maybe that's not it. Any help would be appreciated! Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now