Cstrike: Make CS_OnBuy forward more reliable - part 1
Purpose is to have the forward be called only on actual buying. This has been requested on the forum.
This commit is contained in:
		@@ -165,16 +165,22 @@
 | 
				
			|||||||
	#define CS_IDENT_CANBUYTHIS			"_Z10CanBuyThisP11CBasePlayeri"
 | 
						#define CS_IDENT_CANBUYTHIS			"_Z10CanBuyThisP11CBasePlayeri"
 | 
				
			||||||
	#define CS_IDENT_BUYITEM			"_Z7BuyItemP11CBasePlayeri" 
 | 
						#define CS_IDENT_BUYITEM			"_Z7BuyItemP11CBasePlayeri" 
 | 
				
			||||||
	#define CS_IDENT_BUYGUNAMMO			"_Z10BuyGunAmmoR11CBasePlayerR15CBasePlayerItemb"
 | 
						#define CS_IDENT_BUYGUNAMMO			"_Z10BuyGunAmmoR11CBasePlayerR15CBasePlayerItemb"
 | 
				
			||||||
 | 
						#define CS_IDENT_GIVENAMEDITEM		"_ZN11CBasePlayer13GiveNamedItemEPKc"
 | 
				
			||||||
 | 
						#define CS_IDENT_ADDACCOUNT			"_ZN11CBasePlayer10AddAccountEib"
 | 
				
			||||||
	#define CS_IDENT_HIDDEN_STATE		false
 | 
						#define CS_IDENT_HIDDEN_STATE		false
 | 
				
			||||||
#elif defined(__APPLE__)
 | 
					#elif defined(__APPLE__)
 | 
				
			||||||
	#define CS_IDENT_CANBUYTHIS			"_Z10CanBuyThisP11CBasePlayeri"
 | 
						#define CS_IDENT_CANBUYTHIS			"_Z10CanBuyThisP11CBasePlayeri"
 | 
				
			||||||
	#define CS_IDENT_BUYITEM			"_Z7BuyItemP11CBasePlayeri" 
 | 
						#define CS_IDENT_BUYITEM			"_Z7BuyItemP11CBasePlayeri" 
 | 
				
			||||||
	#define CS_IDENT_BUYGUNAMMO			"_Z10BuyGunAmmoR11CBasePlayerR15CBasePlayerItemb"
 | 
						#define CS_IDENT_BUYGUNAMMO			"_Z10BuyGunAmmoR11CBasePlayerR15CBasePlayerItemb"
 | 
				
			||||||
 | 
						#define CS_IDENT_GIVENAMEDITEM		"_ZN11CBasePlayer13GiveNamedItemEPKc"
 | 
				
			||||||
 | 
						#define CS_IDENT_ADDACCOUNT			"_ZN11CBasePlayer10AddAccountEib"
 | 
				
			||||||
	#define CS_IDENT_HIDDEN_STATE		true
 | 
						#define CS_IDENT_HIDDEN_STATE		true
 | 
				
			||||||
#elif defined(WIN32)
 | 
					#elif defined(WIN32)
 | 
				
			||||||
	#define CS_IDENT_CANBUYTHIS			"\\x53\\x8B\\x2A\\x2A\\x2A\\x2A\\x2A\\x56\\x8B\\x2A\\x2A\\x2A\\x57"
 | 
						#define CS_IDENT_CANBUYTHIS			"\\x53\\x8B\\x2A\\x2A\\x2A\\x2A\\x2A\\x56\\x8B\\x2A\\x2A\\x2A\\x57"
 | 
				
			||||||
	#define CS_IDENT_BUYITEM			"\\x53\\x56\\x8B\\x2A\\x2A\\x2A\\xBB\\x2A\\x2A\\x2A\\x2A\\x57\\x53"
 | 
						#define CS_IDENT_BUYITEM			"\\x53\\x56\\x8B\\x2A\\x2A\\x2A\\xBB\\x2A\\x2A\\x2A\\x2A\\x57\\x53"
 | 
				
			||||||
	#define CS_IDENT_BUYGUNAMMO			"\\x56\\x57\\x8B\\x2A\\x2A\\x2A\\x6A\\x2A\\x8B\\x2A\\xE8\\x2A\\x2A\\x2A\\x2A\\x84\\x2A\\x0F"
 | 
						#define CS_IDENT_BUYGUNAMMO			"\\x56\\x57\\x8B\\x2A\\x2A\\x2A\\x6A\\x2A\\x8B\\x2A\\xE8\\x2A\\x2A\\x2A\\x2A\\x84\\x2A\\x0F"
 | 
				
			||||||
 | 
						#define CS_IDENT_GIVENAMEDITEM		"\\x8B\\x2A\\x2A\\x2A\\x56\\x57\\x8B\\x2A\\x8B\\x2A\\x2A\\x2A\\x2A\\x2A\\x2B"
 | 
				
			||||||
 | 
						#define CS_IDENT_ADDACCOUNT			"\\x8B\\x2A\\x2A\\x2A\\x56\\x8B\\x2A\\x8B\\x2A\\x2A\\x2A\\x2A\\x2A\\x03"
 | 
				
			||||||
	#define CS_IDENT_HIDDEN_STATE		false
 | 
						#define CS_IDENT_HIDDEN_STATE		false
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -47,7 +47,8 @@ CDetour *g_ClientCommandDetour = NULL;
 | 
				
			|||||||
CDetour *g_CanBuyThisDetour = NULL;
 | 
					CDetour *g_CanBuyThisDetour = NULL;
 | 
				
			||||||
CDetour *g_BuyItemDetour = NULL;
 | 
					CDetour *g_BuyItemDetour = NULL;
 | 
				
			||||||
CDetour *g_BuyGunAmmoDetour = NULL;
 | 
					CDetour *g_BuyGunAmmoDetour = NULL;
 | 
				
			||||||
 | 
					CDetour *g_GiveNamedItemDetour = NULL;
 | 
				
			||||||
 | 
					CDetour *g_AddAccountDetour = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void InitializeHacks()
 | 
					void InitializeHacks()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -137,6 +138,17 @@ DETOUR_DECL_STATIC3(BuyGunAmmo, bool, void*, pvPlayer, void*, pvWeapon, bool, bB
 | 
				
			|||||||
	return DETOUR_STATIC_CALL(BuyGunAmmo)(pvPlayer, pvWeapon, bBlinkMoney);
 | 
						return DETOUR_STATIC_CALL(BuyGunAmmo)(pvPlayer, pvWeapon, bBlinkMoney);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DETOUR_DECL_MEMBER1(GiveNamedItem, void, const char*, pszName) // void CBasePlayer::GiveNamedItem(const char *pszName)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						DETOUR_MEMBER_CALL(GiveNamedItem)(pszName);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DETOUR_DECL_MEMBER2(AddAccount, void, int, amount, bool, bTrackChange) // void CBasePlayer::AddAccount(int amount, bool bTrackChange)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						DETOUR_MEMBER_CALL(AddAccount)(amount, bTrackChange);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void CtrlDetours_ClientCommand(bool set)
 | 
					void CtrlDetours_ClientCommand(bool set)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -180,15 +192,23 @@ void CtrlDetours_BuyCommands(bool set)
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
	if (set)
 | 
						if (set)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		void *canBuyThisAddress = UTIL_FindAddressFromEntry(CS_IDENT_CANBUYTHIS, CS_IDENT_HIDDEN_STATE);
 | 
							void *canBuyThisAddress    = UTIL_FindAddressFromEntry(CS_IDENT_CANBUYTHIS   , CS_IDENT_HIDDEN_STATE);
 | 
				
			||||||
		void *buyItemAddress	= UTIL_FindAddressFromEntry(CS_IDENT_BUYITEM, CS_IDENT_HIDDEN_STATE);
 | 
							void *buyItemAddress	   = UTIL_FindAddressFromEntry(CS_IDENT_BUYITEM      , CS_IDENT_HIDDEN_STATE);
 | 
				
			||||||
		void *buyGunAmmoAddress = UTIL_FindAddressFromEntry(CS_IDENT_BUYGUNAMMO, CS_IDENT_HIDDEN_STATE);
 | 
							void *buyGunAmmoAddress    = UTIL_FindAddressFromEntry(CS_IDENT_BUYGUNAMMO   , CS_IDENT_HIDDEN_STATE);
 | 
				
			||||||
 | 
							void *giveNamedItemAddress = UTIL_FindAddressFromEntry(CS_IDENT_GIVENAMEDITEM, CS_IDENT_HIDDEN_STATE);
 | 
				
			||||||
 | 
							void *addAccountAddress    = UTIL_FindAddressFromEntry(CS_IDENT_ADDACCOUNT   , CS_IDENT_HIDDEN_STATE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		g_CanBuyThisDetour	= DETOUR_CREATE_STATIC_FIXED(CanBuyThis, canBuyThisAddress);
 | 
							g_CanBuyThisDetour	  = DETOUR_CREATE_STATIC_FIXED(CanBuyThis, canBuyThisAddress);
 | 
				
			||||||
		g_BuyItemDetour		= DETOUR_CREATE_STATIC_FIXED(BuyItem, buyItemAddress);
 | 
							g_BuyItemDetour		  = DETOUR_CREATE_STATIC_FIXED(BuyItem, buyItemAddress);
 | 
				
			||||||
		g_BuyGunAmmoDetour	= DETOUR_CREATE_STATIC_FIXED(BuyGunAmmo, buyGunAmmoAddress);
 | 
							g_BuyGunAmmoDetour	  = DETOUR_CREATE_STATIC_FIXED(BuyGunAmmo, buyGunAmmoAddress);
 | 
				
			||||||
 | 
							g_GiveNamedItemDetour = DETOUR_CREATE_MEMBER_FIXED(GiveNamedItem, giveNamedItemAddress);
 | 
				
			||||||
 | 
							g_AddAccountDetour    = DETOUR_CREATE_MEMBER_FIXED(AddAccount, addAccountAddress);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (g_CanBuyThisDetour == NULL || g_BuyItemDetour == NULL || g_BuyGunAmmoDetour == NULL)
 | 
							if (g_CanBuyThisDetour == NULL    || 
 | 
				
			||||||
 | 
								g_BuyItemDetour == NULL       || 
 | 
				
			||||||
 | 
								g_BuyGunAmmoDetour == NULL    || 
 | 
				
			||||||
 | 
								g_GiveNamedItemDetour == NULL || 
 | 
				
			||||||
 | 
								g_AddAccountDetour == NULL)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			MF_Log("No Buy Commands detours could be initialized - Disabled Buy forward.");
 | 
								MF_Log("No Buy Commands detours could be initialized - Disabled Buy forward.");
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -203,6 +223,12 @@ void CtrlDetours_BuyCommands(bool set)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		if (g_BuyGunAmmoDetour)
 | 
							if (g_BuyGunAmmoDetour)
 | 
				
			||||||
			g_BuyGunAmmoDetour->Destroy();
 | 
								g_BuyGunAmmoDetour->Destroy();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (g_GiveNamedItemDetour)
 | 
				
			||||||
 | 
								g_GiveNamedItemDetour->Destroy();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (g_AddAccountDetour)
 | 
				
			||||||
 | 
								g_AddAccountDetour->Destroy();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -216,4 +242,10 @@ void ToggleDetour_BuyCommands(bool enable)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	if (g_BuyGunAmmoDetour)
 | 
						if (g_BuyGunAmmoDetour)
 | 
				
			||||||
		(enable) ? g_BuyGunAmmoDetour->EnableDetour() : g_BuyGunAmmoDetour->DisableDetour();
 | 
							(enable) ? g_BuyGunAmmoDetour->EnableDetour() : g_BuyGunAmmoDetour->DisableDetour();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (g_GiveNamedItemDetour)
 | 
				
			||||||
 | 
							(enable) ? g_GiveNamedItemDetour->EnableDetour() : g_GiveNamedItemDetour->DisableDetour();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (g_AddAccountDetour)
 | 
				
			||||||
 | 
							(enable) ? g_AddAccountDetour->EnableDetour() : g_AddAccountDetour->DisableDetour();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -136,6 +136,7 @@ ret name##Class::name(p1type p1name, p2type p2name, p3type p3name, p4type p4name
 | 
				
			|||||||
#define GET_STATIC_TRAMPOLINE(name) (void **)&name##_Actual
 | 
					#define GET_STATIC_TRAMPOLINE(name) (void **)&name##_Actual
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define DETOUR_CREATE_MEMBER(name, gamedata, target)	CDetourManager::CreateDetour(GET_MEMBER_CALLBACK(name), GET_MEMBER_TRAMPOLINE(name), gamedata, target);
 | 
					#define DETOUR_CREATE_MEMBER(name, gamedata, target)	CDetourManager::CreateDetour(GET_MEMBER_CALLBACK(name), GET_MEMBER_TRAMPOLINE(name), gamedata, target);
 | 
				
			||||||
 | 
					#define DETOUR_CREATE_MEMBER_FIXED(name, address)		CDetourManager::CreateDetour(GET_MEMBER_CALLBACK(name), GET_MEMBER_TRAMPOLINE(name), address);
 | 
				
			||||||
#define DETOUR_CREATE_STATIC(name, gamedata, target)	CDetourManager::CreateDetour(GET_STATIC_CALLBACK(name), GET_STATIC_TRAMPOLINE(name), gamedata, target);
 | 
					#define DETOUR_CREATE_STATIC(name, gamedata, target)	CDetourManager::CreateDetour(GET_STATIC_CALLBACK(name), GET_STATIC_TRAMPOLINE(name), gamedata, target);
 | 
				
			||||||
#define DETOUR_CREATE_STATIC_FIXED(name, address)		CDetourManager::CreateDetour(GET_STATIC_CALLBACK(name), GET_STATIC_TRAMPOLINE(name), address);
 | 
					#define DETOUR_CREATE_STATIC_FIXED(name, address)		CDetourManager::CreateDetour(GET_STATIC_CALLBACK(name), GET_STATIC_TRAMPOLINE(name), address);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user