diff --git a/extensions/tf2/AMBuilder b/extensions/tf2/AMBuilder index 88bc5787..8d0b53e9 100644 --- a/extensions/tf2/AMBuilder +++ b/extensions/tf2/AMBuilder @@ -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' diff --git a/extensions/tf2/Makefile b/extensions/tf2/Makefile index b5bfc926..9c1df180 100644 --- a/extensions/tf2/Makefile +++ b/extensions/tf2/Makefile @@ -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 ### diff --git a/extensions/tf2/criticals.cpp b/extensions/tf2/criticals.cpp index 447b8257..4c523a3d 100644 --- a/extensions/tf2/criticals.cpp +++ b/extensions/tf2/criticals.cpp @@ -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(); diff --git a/extensions/tf2/criticals.h b/extensions/tf2/criticals.h index 7c0410a3..8aac6f48 100644 --- a/extensions/tf2/criticals.h +++ b/extensions/tf2/criticals.h @@ -37,8 +37,8 @@ #include #include "CDetour/detours.h" -void InitialiseDetours(); -void RemoveDetours(); +void InitialiseCritDetours(); +void RemoveCritDetours(); extern IForward *g_critForward; diff --git a/extensions/tf2/extension.cpp b/extensions/tf2/extension.cpp index 8add2636..ff71b55d 100644 --- a/extensions/tf2/extension.cpp +++ b/extensions/tf2/extension.cpp @@ -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() diff --git a/extensions/tf2/extension.h b/extensions/tf2/extension.h index d6878c8e..dd1d374c 100644 --- a/extensions/tf2/extension.h +++ b/extensions/tf2/extension.h @@ -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 diff --git a/extensions/tf2/holiday.cpp b/extensions/tf2/holiday.cpp new file mode 100644 index 00000000..7c3872be --- /dev/null +++ b/extensions/tf2/holiday.cpp @@ -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 . + * + * 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 . + * + * 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(); +} \ No newline at end of file diff --git a/extensions/tf2/holiday.h b/extensions/tf2/holiday.h new file mode 100644 index 00000000..ad20bf63 --- /dev/null +++ b/extensions/tf2/holiday.h @@ -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 . + * + * 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 . + * + * Version: $Id$ + */ + +#ifndef _INCLUDE_SOURCEMOD_HOLIDAY_H_ +#define _INCLUDE_SOURCEMOD_HOLIDAY_H_ + +#include "extension.h" +#include +#include +#include "CDetour/detours.h" + +void InitialiseGetHolidayDetour(); +void RemoveGetHolidayDetour(); + +extern IForward *g_getHolidayForward; + +#endif //_INCLUDE_SOURCEMOD_HOLIDAY_H_ diff --git a/extensions/tf2/msvc9/tf2.vcproj b/extensions/tf2/msvc9/tf2.vcproj index 2471153c..d9a1d677 100644 --- a/extensions/tf2/msvc9/tf2.vcproj +++ b/extensions/tf2/msvc9/tf2.vcproj @@ -194,6 +194,10 @@ RelativePath="..\extension.cpp" > + + @@ -220,6 +224,10 @@ RelativePath="..\extension.h" > + + diff --git a/gamedata/sm-tf2.games.txt b/gamedata/sm-tf2.games.txt index 0b67f33b..efdf0d64 100644 --- a/gamedata/sm-tf2.games.txt +++ b/gamedata/sm-tf2.games.txt @@ -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" { diff --git a/plugins/include/tf2.inc b/plugins/include/tf2.inc index 1715953a..4b567424 100644 --- a/plugins/include/tf2.inc +++ b/plugins/include/tf2.inc @@ -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! */