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

    1. Red Dead Redemption 2

      1. Gameplay
      2. Missions
      3. Help & Support
    2. Red Dead Online

      1. Gameplay
      2. Find Lobbies & Outlaws
      3. Help & Support
    1. Crews & Posses

      1. Recruitment
    2. Events

    1. GTA Online

      1. Arena War
      2. After Hours
      3. Find Lobbies & Players
      4. Guides & Strategies
      5. Vehicles
      6. Content Creator
      7. Help & Support
    2. Grand Theft Auto Series

    3. GTA Next

    4. GTA V

      1. PC
      2. Guides & Strategies
      3. Help & Support
    5. GTA IV

      1. Episodes from Liberty City
      2. Multiplayer
      3. Guides & Strategies
      4. Help & Support
      5. GTA Mods
    6. GTA Chinatown Wars

    7. GTA Vice City Stories

    8. GTA Liberty City Stories

    9. GTA San Andreas

      1. Guides & Strategies
      2. Help & Support
      3. GTA Mods
    10. GTA Vice City

      1. Guides & Strategies
      2. Help & Support
      3. GTA Mods
    11. GTA III

      1. Guides & Strategies
      2. Help & Support
      3. GTA Mods
    12. Top Down Games

      1. GTA Advance
      2. GTA 2
      3. GTA
    13. Wiki

      1. Merchandising
    1. GTA Modding

      1. GTA V
      2. GTA IV
      3. GTA III, VC & SA
      4. Tutorials
    2. Mod Showroom

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

      1. DYOM
      2. OpenIV
      3. GTA: Underground
      4. GTA: Liberty City
      5. GTA: State of Liberty
    1. Red Dead Redemption

    2. Rockstar Games

    1. Off-Topic

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

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

    2. Forum Support

    3. Site Suggestions

fabio3

Garage Save eXtender

Recommended Posts

fabio3

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • 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.