Added forward/detour for TF2's GetHoliday function (bug 4462, r=pred)
This commit is contained in:
		
							parent
							
								
									5d5400a9ac
								
							
						
					
					
						commit
						e4832f0d08
					
				| @ -16,6 +16,7 @@ binary.AddSourceFiles('extensions/tf2', [ | ||||
| 	'RegNatives.cpp', | ||||
| 	'util.cpp', | ||||
| 	'criticals.cpp', | ||||
| 	'holiday.cpp', | ||||
| 	'CDetour/detours.cpp', | ||||
| 	'sdk/smsdk_ext.cpp', | ||||
| 	'asm/asm.c' | ||||
|  | ||||
| @ -19,7 +19,7 @@ PROJECT = game.tf2 | ||||
| USEMETA = true | ||||
| 
 | ||||
| OBJECTS = sdk/smsdk_ext.cpp extension.cpp natives.cpp RegNatives.cpp criticals.cpp \
 | ||||
| 	util.cpp CDetour/detours.cpp asm/asm.c | ||||
| 	holiday.cpp util.cpp CDetour/detours.cpp asm/asm.c | ||||
| 
 | ||||
| ##############################################
 | ||||
| ### CONFIGURE ANY OTHER FLAGS/OPTIONS HERE ###
 | ||||
|  | ||||
| @ -188,7 +188,7 @@ DETOUR_DECL_MEMBER0(CalcIsAttackCriticalHelperBow, bool) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void InitialiseDetours() | ||||
| void InitialiseCritDetours() | ||||
| { | ||||
| 	calcIsAttackCriticalDetour = DETOUR_CREATE_MEMBER(CalcIsAttackCriticalHelper, "CalcCritical"); | ||||
| 	calcIsAttackCriticalMeleeDetour = DETOUR_CREATE_MEMBER(CalcIsAttackCriticalHelperMelee, "CalcCriticalMelee"); | ||||
| @ -222,7 +222,7 @@ void InitialiseDetours() | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| void RemoveDetours() | ||||
| void RemoveCritDetours() | ||||
| { | ||||
| 	calcIsAttackCriticalDetour->Destroy(); | ||||
| 	calcIsAttackCriticalMeleeDetour->Destroy(); | ||||
|  | ||||
| @ -37,8 +37,8 @@ | ||||
| #include <jit/x86/x86_macros.h> | ||||
| #include "CDetour/detours.h" | ||||
| 
 | ||||
| void InitialiseDetours(); | ||||
| void RemoveDetours(); | ||||
| void InitialiseCritDetours(); | ||||
| void RemoveCritDetours(); | ||||
| 
 | ||||
| extern IForward *g_critForward; | ||||
| 
 | ||||
|  | ||||
| @ -36,6 +36,7 @@ | ||||
| #include "iplayerinfo.h" | ||||
| #include "sm_trie_tpl.h" | ||||
| #include "criticals.h" | ||||
| #include "holiday.h" | ||||
| #include "CDetour/detours.h" | ||||
| 
 | ||||
| /**
 | ||||
| @ -108,10 +109,12 @@ bool TF2Tools::SDK_OnLoad(char *error, size_t maxlength, bool late) | ||||
| 	playerhelpers->RegisterCommandTargetProcessor(this); | ||||
| 
 | ||||
| 	g_critForward = forwards->CreateForward("TF2_CalcIsAttackCritical", ET_Hook, 4, NULL, Param_Cell, Param_Cell, Param_String, Param_CellByRef); | ||||
| 	g_getHolidayForward = forwards->CreateForward("TF2_OnGetHoliday", ET_Event, 1, NULL, Param_CellByRef); | ||||
| 
 | ||||
| 	g_pCVar = icvar; | ||||
| 
 | ||||
| 	m_DetoursEnabled = false; | ||||
| 	m_CritDetoursEnabled = false; | ||||
| 	m_GetHolidayDetourEnabled = false; | ||||
| 
 | ||||
| 	return true; | ||||
| } | ||||
| @ -155,6 +158,7 @@ void TF2Tools::SDK_OnUnload() | ||||
| 	plsys->RemovePluginsListener(this); | ||||
| 
 | ||||
| 	forwards->ReleaseForward(g_critForward); | ||||
| 	forwards->ReleaseForward(g_getHolidayForward); | ||||
| } | ||||
| 
 | ||||
| void TF2Tools::SDK_OnAllLoaded() | ||||
| @ -297,19 +301,29 @@ bool TF2Tools::ProcessCommandTarget(cmd_target_info_t *info) | ||||
| 
 | ||||
| void TF2Tools::OnPluginLoaded(IPlugin *plugin) | ||||
| { | ||||
| 	if (!m_DetoursEnabled && g_critForward->GetFunctionCount()) | ||||
| 	if (!m_CritDetoursEnabled && g_critForward->GetFunctionCount()) | ||||
| 	{ | ||||
| 		InitialiseDetours(); | ||||
| 		m_DetoursEnabled = true; | ||||
| 		InitialiseCritDetours(); | ||||
| 		m_CritDetoursEnabled = true; | ||||
| 	} | ||||
| 	if (!m_GetHolidayDetourEnabled && g_getHolidayForward->GetFunctionCount()) | ||||
| 	{ | ||||
| 		InitialiseGetHolidayDetour(); | ||||
| 		m_GetHolidayDetourEnabled = true; | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void TF2Tools::OnPluginUnloaded(IPlugin *plugin) | ||||
| { | ||||
| 	if (m_DetoursEnabled && !g_critForward->GetFunctionCount()) | ||||
| 	if (m_CritDetoursEnabled && !g_critForward->GetFunctionCount()) | ||||
| 	{ | ||||
| 		RemoveDetours(); | ||||
| 		m_DetoursEnabled = false; | ||||
| 		RemoveCritDetours(); | ||||
| 		m_CritDetoursEnabled = false; | ||||
| 	} | ||||
| 	if (m_GetHolidayDetourEnabled && !g_getHolidayForward->GetFunctionCount()) | ||||
| 	{ | ||||
| 		RemoveGetHolidayDetour(); | ||||
| 		m_GetHolidayDetourEnabled = false; | ||||
| 	} | ||||
| } | ||||
| int FindResourceEntity() | ||||
|  | ||||
| @ -112,7 +112,8 @@ public: | ||||
| 	virtual bool SDK_OnMetamodLoad(ISmmAPI *ismm, char *error, size_t maxlength, bool late); | ||||
| #endif | ||||
| private: | ||||
| 	bool m_DetoursEnabled; | ||||
| 	bool m_CritDetoursEnabled; | ||||
| 	bool m_GetHolidayDetourEnabled; | ||||
| }; | ||||
| 
 | ||||
| enum TFClassType | ||||
|  | ||||
							
								
								
									
										77
									
								
								extensions/tf2/holiday.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								extensions/tf2/holiday.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,77 @@ | ||||
| /**
 | ||||
|  * vim: set ts=4 : | ||||
|  * ============================================================================= | ||||
|  * SourceMod Team Fortress 2 Extension | ||||
|  * Copyright (C) 2004-2008 AlliedModders LLC.  All rights reserved. | ||||
|  * ============================================================================= | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or modify it under | ||||
|  * the terms of the GNU General Public License, version 3.0, as published by the | ||||
|  * Free Software Foundation. | ||||
|  *  | ||||
|  * This program is distributed in the hope that it will be useful, but WITHOUT | ||||
|  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | ||||
|  * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more | ||||
|  * details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License along with | ||||
|  * this program.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
|  * | ||||
|  * As a special exception, AlliedModders LLC gives you permission to link the | ||||
|  * code of this program (as well as its derivative works) to "Half-Life 2," the | ||||
|  * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software | ||||
|  * by the Valve Corporation.  You must obey the GNU General Public License in | ||||
|  * all respects for all other code used.  Additionally, AlliedModders LLC grants | ||||
|  * this exception to all derivative works.  AlliedModders LLC defines further | ||||
|  * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), | ||||
|  * or <http://www.sourcemod.net/license.php>.
 | ||||
|  * | ||||
|  * Version: $Id$ | ||||
|  */ | ||||
| 
 | ||||
| #include "holiday.h" | ||||
| 
 | ||||
| CDetour *getHolidayDetour = NULL; | ||||
| 
 | ||||
| IForward *g_getHolidayForward = NULL; | ||||
| 
 | ||||
| DETOUR_DECL_MEMBER0(GetHoliday, int) | ||||
| { | ||||
| 	int actualres = DETOUR_MEMBER_CALL(GetHoliday)(); | ||||
| 	if (!g_getHolidayForward) | ||||
| 	{ | ||||
| 		g_pSM->LogMessage(myself, "Invalid Forward"); | ||||
| 		return actualres; | ||||
| 	} | ||||
| 
 | ||||
| 	cell_t result = 0; | ||||
| 	int newres = actualres; | ||||
| 
 | ||||
| 	g_getHolidayForward->PushCellByRef(&newres); | ||||
| 	g_getHolidayForward->Execute(&result); | ||||
| 	 | ||||
| 	if (result == Pl_Changed) | ||||
| 	{ | ||||
| 		return newres; | ||||
| 	} | ||||
| 
 | ||||
| 	return actualres; | ||||
| } | ||||
| 
 | ||||
| void InitialiseGetHolidayDetour() | ||||
| { | ||||
| 	getHolidayDetour = DETOUR_CREATE_MEMBER(GetHoliday, "GetHoliday"); | ||||
| 
 | ||||
| 	if (!getHolidayDetour) | ||||
| 	{ | ||||
| 		g_pSM->LogError(myself, "GetHoliday detour failed"); | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	getHolidayDetour->EnableDetour(); | ||||
| } | ||||
| 
 | ||||
| void RemoveGetHolidayDetour() | ||||
| { | ||||
| 	getHolidayDetour->Destroy(); | ||||
| } | ||||
							
								
								
									
										45
									
								
								extensions/tf2/holiday.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								extensions/tf2/holiday.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,45 @@ | ||||
| /**
 | ||||
|  * vim: set ts=4 : | ||||
|  * ============================================================================= | ||||
|  * SourceMod Team Fortress 2 Extension | ||||
|  * Copyright (C) 2004-2008 AlliedModders LLC.  All rights reserved. | ||||
|  * ============================================================================= | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or modify it under | ||||
|  * the terms of the GNU General Public License, version 3.0, as published by the | ||||
|  * Free Software Foundation. | ||||
|  *  | ||||
|  * This program is distributed in the hope that it will be useful, but WITHOUT | ||||
|  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | ||||
|  * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more | ||||
|  * details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License along with | ||||
|  * this program.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
|  * | ||||
|  * As a special exception, AlliedModders LLC gives you permission to link the | ||||
|  * code of this program (as well as its derivative works) to "Half-Life 2," the | ||||
|  * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software | ||||
|  * by the Valve Corporation.  You must obey the GNU General Public License in | ||||
|  * all respects for all other code used.  Additionally, AlliedModders LLC grants | ||||
|  * this exception to all derivative works.  AlliedModders LLC defines further | ||||
|  * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), | ||||
|  * or <http://www.sourcemod.net/license.php>.
 | ||||
|  * | ||||
|  * Version: $Id$ | ||||
|  */ | ||||
| 
 | ||||
| #ifndef _INCLUDE_SOURCEMOD_HOLIDAY_H_ | ||||
| #define _INCLUDE_SOURCEMOD_HOLIDAY_H_ | ||||
| 
 | ||||
| #include "extension.h" | ||||
| #include <jit/jit_helpers.h> | ||||
| #include <jit/x86/x86_macros.h> | ||||
| #include "CDetour/detours.h" | ||||
| 
 | ||||
| void InitialiseGetHolidayDetour(); | ||||
| void RemoveGetHolidayDetour(); | ||||
| 
 | ||||
| extern IForward *g_getHolidayForward; | ||||
| 
 | ||||
| #endif //_INCLUDE_SOURCEMOD_HOLIDAY_H_
 | ||||
| @ -194,6 +194,10 @@ | ||||
| 				RelativePath="..\extension.cpp" | ||||
| 				> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath="..\holiday.cpp" | ||||
| 				> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath="..\natives.cpp" | ||||
| 				> | ||||
| @ -220,6 +224,10 @@ | ||||
| 				RelativePath="..\extension.h" | ||||
| 				> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath="..\holiday.h" | ||||
| 				> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath="..\RegNatives.h" | ||||
| 				> | ||||
|  | ||||
| @ -92,6 +92,13 @@ | ||||
| 				"linux"		"@_ZN15CTFPlayerShared10StunPlayerEffiP9CTFPlayer" | ||||
| 				"mac"		"@_ZN15CTFPlayerShared10StunPlayerEffiP9CTFPlayer" | ||||
| 			} | ||||
| 			"GetHoliday" | ||||
| 			{ | ||||
| 				"library"	"server" | ||||
| 				"windows"	"\x81\xEC\x2A\x2A\x2A\x2A\xA1\x2A\x2A\x2A\x2A\x83\x2A\x2A\x2A\x56\x8B\xF1\x89\x2A\x2A\x2A\x74\x2A\xB8" | ||||
| 				"linux"		"@_ZN12CTFGameRules10GetHolidayEv" | ||||
| 				"mac"		"@_ZN12CTFGameRules10GetHolidayEv" | ||||
| 			} | ||||
| 		} | ||||
| 		"Offsets" | ||||
| 		{ | ||||
|  | ||||
| @ -99,6 +99,13 @@ enum TFCond | ||||
| 	TFCond_Jarated | ||||
| }; | ||||
| 
 | ||||
| enum TFHoliday | ||||
| { | ||||
| 	TFHoliday_None = 1, | ||||
| 	TFHoliday_Halloween, | ||||
| 	TFHoliday_Birthday | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * Sets a client on fire for 10 seconds. | ||||
|  * | ||||
| @ -224,6 +231,16 @@ native TFClassType:TF2_GetClass(const String:classname[]); | ||||
|  */ | ||||
| forward Action:TF2_CalcIsAttackCritical(client, weapon, String:weaponname[], &bool:result); | ||||
| 
 | ||||
| /** | ||||
|  * Called when the game checks to see if the current day is one of its tracked holidays | ||||
|  * | ||||
|  * @note Change the value of holiday and return Plugin_Changed to override. | ||||
|  *       Return Plugin_Continue for no change. | ||||
|  * | ||||
|  * @param holiday		Current Holiday | ||||
|  */ | ||||
| forward Action:TF2_OnGetHoliday(&TFHoliday:holiday); | ||||
| 
 | ||||
| /** | ||||
|  * Do not edit below this line! | ||||
|  */ | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user