diff --git a/core/logic/intercom.h b/core/logic/intercom.h index b2f622c1..4af7e6de 100644 --- a/core/logic/intercom.h +++ b/core/logic/intercom.h @@ -42,7 +42,7 @@ using namespace SourceMod; * Add 1 to the RHS of this expression to bump the intercom file * This is to prevent mismatching core/logic binaries */ -#define SM_LOGIC_MAGIC (0x0F47C0DE - 14) +#define SM_LOGIC_MAGIC (0x0F47C0DE - 15) #if defined SM_LOGIC class IVEngineServer diff --git a/core/logic/smn_admin.cpp b/core/logic/smn_admin.cpp index b4121dc9..0d7d6ea4 100644 --- a/core/logic/smn_admin.cpp +++ b/core/logic/smn_admin.cpp @@ -507,6 +507,22 @@ static cell_t FindFlagByChar(IPluginContext *pContext, const cell_t *params) return 1; } +static cell_t FindFlagChar(IPluginContext *pContext, const cell_t *params) +{ + cell_t *addr; + pContext->LocalToPhysAddr(params[2], &addr); + + char flagchar; + if (!adminsys->FindFlagChar((AdminFlag)params[1], &flagchar)) + { + return 0; + } + + *addr = (cell_t)flagchar; + + return 1; +} + static cell_t ReadFlagString(IPluginContext *pContext, const cell_t *params) { char *flag; @@ -563,6 +579,7 @@ REGISTER_NATIVES(adminNatives) {"CreateAuthMethod", CreateAuthMethod}, {"FindFlagByName", FindFlagByName}, {"FindFlagByChar", FindFlagByChar}, + {"FindFlagChar", FindFlagChar}, {"ReadFlagString", ReadFlagString}, {"GetAdmGroupImmunityLevel",GetAdmGroupImmunityLevel}, {"SetAdmGroupImmunityLevel",SetAdmGroupImmunityLevel}, 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..12ee8e43 --- /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(); +} 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/core.games/engine.ep2.txt b/gamedata/core.games/engine.ep2.txt index 8fcc84de..0e5bbe78 100644 --- a/gamedata/core.games/engine.ep2.txt +++ b/gamedata/core.games/engine.ep2.txt @@ -19,7 +19,6 @@ "game" "ageofchivalry" "game" "zps" "game" "bg2" - "game" "garrysmod" "game" "pvkii" "game" "gesource" "game" "empires" diff --git a/gamedata/core.games/engine.ep2valve.txt b/gamedata/core.games/engine.ep2valve.txt index feaa2431..258ef158 100644 --- a/gamedata/core.games/engine.ep2valve.txt +++ b/gamedata/core.games/engine.ep2valve.txt @@ -19,6 +19,7 @@ "game" "dod" "game" "tf" "game" "cstrike" + "game" "garrysmod" } "Offsets" diff --git a/gamedata/sdktools.games/engine.ep2.txt b/gamedata/sdktools.games/engine.ep2.txt index 091634e4..db621aca 100644 --- a/gamedata/sdktools.games/engine.ep2.txt +++ b/gamedata/sdktools.games/engine.ep2.txt @@ -21,7 +21,6 @@ "game" "empires" "game" "synergy" "game" "bg2" - "game" "garrysmod" "game" "pvkii" "game" "gesource" } @@ -124,7 +123,6 @@ "game" "empires" "game" "synergy" "game" "bg2" - "game" "garrysmod" "game" "pvkii" "game" "gesource" "game" "RnLBeta" diff --git a/gamedata/sdktools.games/engine.ep2valve.txt b/gamedata/sdktools.games/engine.ep2valve.txt index c9ef7204..b546abf7 100644 --- a/gamedata/sdktools.games/engine.ep2valve.txt +++ b/gamedata/sdktools.games/engine.ep2valve.txt @@ -19,6 +19,7 @@ "game" "dod" "game" "tf" "game" "cstrike" + "game" "garrysmod" } "Offsets" @@ -124,6 +125,7 @@ "game" "dod" "game" "tf" "game" "cstrike" + "game" "garrysmod" } "Offsets" diff --git a/gamedata/sdktools.games/game.garrysmod.txt b/gamedata/sdktools.games/game.garrysmod.txt index 53cd9462..beafa4d8 100644 --- a/gamedata/sdktools.games/game.garrysmod.txt +++ b/gamedata/sdktools.games/game.garrysmod.txt @@ -11,48 +11,46 @@ "Games" { - /* Garry's Mod 10 - Windows only - * This mod is not officially supported - */ + /* Garry's Mod - Windows only */ "garrysmod" { "Offsets" { "GiveNamedItem" { - "windows" "391" + "windows" "426" } "RemovePlayerItem" { - "windows" "279" + "windows" "300" } "Weapon_GetSlot" { - "windows" "277" + "windows" "298" } "Ignite" { - "windows" "228" + "windows" "237" } "Extinguish" { - "windows" "232" + "windows" "241" } "Teleport" { - "windows" "101" + "windows" "106" } "CommitSuicide" { - "windows" "429" + "windows" "464" } "GetVelocity" { - "windows" "131" + "windows" "138" } "EyeAngles" { - "windows" "123" + "windows" "129" } "AcceptInput" { @@ -76,7 +74,7 @@ } "WeaponEquip" { - "windows" "270" + "windows" "291" } "Activate" { @@ -84,7 +82,7 @@ } "PlayerRunCmd" { - "windows" "409" + "windows" "444" } "FireOutputBackup" { 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/admin.inc b/plugins/include/admin.inc index 20ba921a..6afd5ba1 100644 --- a/plugins/include/admin.inc +++ b/plugins/include/admin.inc @@ -516,6 +516,15 @@ native bool:FindFlagByName(const String:name[], &AdminFlag:flag); */ native bool:FindFlagByChar(c, &AdminFlag:flag); +/** + * Finds a flag char by a gived admin flag. + * + * @param flag Flag to look up. + * @param c Variable to store flag char. + * @return True on success, false if not found. + */ +native bool:FindFlagChar(AdminFlag:flag, &c); + /** * Converts a string of flag characters to a bit string. * 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! */ diff --git a/public/IAdminSystem.h b/public/IAdminSystem.h index 8aa8961e..17317159 100644 --- a/public/IAdminSystem.h +++ b/public/IAdminSystem.h @@ -35,7 +35,7 @@ #include #define SMINTERFACE_ADMINSYS_NAME "IAdminSys" -#define SMINTERFACE_ADMINSYS_VERSION 5 +#define SMINTERFACE_ADMINSYS_VERSION 6 /** * @file IAdminSystem.h @@ -717,6 +717,15 @@ namespace SourceMod const char *cmd, FlagBits flags, bool override_only) =0; + + /** + * @brief Reads a flag as the corresponding character. + * + * @param flag Flag to look up. + * @param c Variable to store flag char. + * @return True on success, false if not found. + */ + virtual bool FindFlagChar(AdminFlag flag, char *c) =0; }; } diff --git a/pushbuild.txt b/pushbuild.txt index c0b5cf27..94cf8ec3 100644 --- a/pushbuild.txt +++ b/pushbuild.txt @@ -1,4 +1,4 @@ -a billion and nanas +a billion and nanas joys of buildbot, part 2: buildbot and the very lonely square-shaped duck joys of buildbot, part 3: an accidental event proves troublesome for a psychic fish joys of buildbot, part 4: a transient mummy is perplexed by a broken wand