Quantcast
Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
    1. Welcome to GTAForums!

    1. GTANet.com

    1. GTA Online

      1. The Cayo Perico Heist
      2. Find Lobbies & Players
      3. Guides & Strategies
      4. Vehicles
      5. Content Creator
      6. Help & Support
    2. Red Dead Online

      1. Frontier Pursuits
      2. Find Lobbies & Outlaws
      3. Help & Support
    3. Crews

    1. Red Dead Redemption 2

      1. PC
      2. Help & Support
    2. Red Dead Redemption

    1. Grand Theft Auto Series

    2. GTA VI

      1. St. Andrews Cathedral
    3. GTA V

      1. Guides & Strategies
      2. Help & Support
    4. GTA IV

      1. The Lost and Damned
      2. The Ballad of Gay Tony
      3. Guides & Strategies
      4. Help & Support
    5. GTA San Andreas

      1. Guides & Strategies
      2. Help & Support
    6. GTA Vice City

      1. Guides & Strategies
      2. Help & Support
    7. GTA III

      1. Guides & Strategies
      2. Help & Support
    8. Portable Games

      1. GTA Chinatown Wars
      2. GTA Vice City Stories
      3. GTA Liberty City Stories
    9. Top-Down Games

      1. GTA Advance
      2. GTA 2
      3. GTA
    1. GTA Mods

      1. GTA V
      2. GTA IV
      3. GTA III, VC & SA
      4. Tutorials
    2. Red Dead Mods

      1. Documentation
    3. Mod Showroom

      1. Scripts & Plugins
      2. Maps
      3. Total Conversions
      4. Vehicles
      5. Textures
      6. Characters
      7. Tools
      8. Other
      9. Workshop
    4. Featured Mods

      1. Design Your Own Mission
      2. OpenIV
      3. GTA: Underground
      4. GTA: Liberty City
      5. GTA: State of Liberty
    1. Rockstar Games

    2. Rockstar Collectors

    1. Off-Topic

      1. General Chat
      2. Gaming
      3. Technology
      4. Movies & TV
      5. Music
      6. Sports
      7. Vehicles
    2. Expression

      1. Graphics / Visual Arts
      2. GFX Requests & Tutorials
      3. Writers' Discussion
      4. Debates & Discussion
    3. Gangs

    1. Announcements

    2. Support

    3. Suggestions

Garage Save eXtender


fabio3

Recommended Posts

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

 

gsx11.jpg

 

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 by fabio3
  • Like 6
Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
  • 1 User Currently Viewing
    0 members, 0 Anonymous, 1 Guest

×
×
  • Create New...

Important Information

By using GTAForums.com, you agree to our Terms of Use and Privacy Policy.