extensions/cstrike/extension.cpp
author David Anderson <dvander@alliedmods.net>
Sat Nov 17 05:41:47 2007 +0000 (2007-11-17)
changeset 1692 dc5dcaaeb744
parent 1573 979f2ccfee5a
child 1756 33f9fa5adfe3
permissions -rw-r--r--
fix for amb1156 - CS:S Tools overrides the PrintHintText native with its own version. this is a fail-safe for CS:S being loaded, as we can have better control from an extension.
     1 /**
     2  * vim: set ts=4 :
     3  * =============================================================================
     4  * SourceMod Counter-Strike:Source Extension
     5  * Copyright (C) 2004-2007 AlliedModders LLC.  All rights reserved.
     6  * =============================================================================
     7  *
     8  * This program is free software; you can redistribute it and/or modify it under
     9  * the terms of the GNU General Public License, version 3.0, as published by the
    10  * Free Software Foundation.
    11  * 
    12  * This program is distributed in the hope that it will be useful, but WITHOUT
    13  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
    14  * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
    15  * details.
    16  *
    17  * You should have received a copy of the GNU General Public License along with
    18  * this program.  If not, see <http://www.gnu.org/licenses/>.
    19  *
    20  * As a special exception, AlliedModders LLC gives you permission to link the
    21  * code of this program (as well as its derivative works) to "Half-Life 2," the
    22  * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
    23  * by the Valve Corporation.  You must obey the GNU General Public License in
    24  * all respects for all other code used.  Additionally, AlliedModders LLC grants
    25  * this exception to all derivative works.  AlliedModders LLC defines further
    26  * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
    27  * or <http://www.sourcemod.net/license.php>.
    28  *
    29  * Version: $Id$
    30  */
    31 
    32 #include "extension.h"
    33 #include "RegNatives.h"
    34 #include "timeleft.h"
    35 
    36 /**
    37  * @file extension.cpp
    38  * @brief Implement extension code here.
    39  */
    40 
    41 SH_DECL_HOOK6(IServerGameDLL, LevelInit, SH_NOATTRIB, false, bool, const char *, const char *, const char *, const char *, bool, bool);
    42 
    43 CStrike g_CStrike;		/**< Global singleton for extension's main interface */
    44 IBinTools *g_pBinTools = NULL;
    45 IGameConfig *g_pGameConf = NULL;
    46 IGameEventManager2 *gameevents = NULL;
    47 bool hooked_everything = false;
    48 int g_msgHintText = -1;
    49 
    50 SMEXT_LINK(&g_CStrike);
    51 
    52 extern sp_nativeinfo_t g_CSNatives[];
    53 
    54 bool CStrike::SDK_OnLoad(char *error, size_t maxlength, bool late)
    55 {
    56 	sharesys->AddDependency(myself, "bintools.ext", true, true);
    57 
    58 	char conf_error[255];
    59 	if (!gameconfs->LoadGameConfigFile("sm-cstrike.games", &g_pGameConf, conf_error, sizeof(conf_error)))
    60 	{
    61 		if (error)
    62 		{
    63 			snprintf(error, maxlength, "Could not read sm-cstrike.games.txt: %s", conf_error);
    64 		}
    65 		return false;
    66 	}
    67 
    68 	sharesys->AddNatives(myself, g_CSNatives);
    69 	sharesys->RegisterLibrary(myself, "cstrike");
    70 
    71 	if ((g_msgHintText = usermsgs->GetMessageIndex("HintText")) != -1)
    72 	{
    73 		sharesys->OverrideNatives(myself, g_CS_PrintHintText);
    74 	}
    75 
    76 	return true;
    77 }
    78 
    79 bool CStrike::SDK_OnMetamodLoad(ISmmAPI *ismm, char *error, size_t maxlen, bool late)
    80 {
    81 	GET_V_IFACE_CURRENT(GetEngineFactory, gameevents, IGameEventManager2, INTERFACEVERSION_GAMEEVENTSMANAGER2);
    82 	GET_V_IFACE_CURRENT(GetEngineFactory, engine, IVEngineServer, INTERFACEVERSION_VENGINESERVER);
    83 
    84 	return true;
    85 }
    86 
    87 void CStrike::SDK_OnUnload()
    88 {
    89 	if (hooked_everything)
    90 	{
    91 		gameevents->RemoveListener(&g_TimeLeftEvents);
    92 		SH_REMOVE_HOOK_MEMFUNC(IServerGameDLL, LevelInit, gamedll, &g_TimeLeftEvents, &TimeLeftEvents::LevelInit, true);
    93 		hooked_everything = false;
    94 	}
    95 	g_RegNatives.UnregisterAll();
    96 	gameconfs->CloseGameConfigFile(g_pGameConf);
    97 }
    98 
    99 void CStrike::SDK_OnAllLoaded()
   100 {
   101 	gameevents->AddListener(&g_TimeLeftEvents, "round_start", true);
   102 	gameevents->AddListener(&g_TimeLeftEvents, "round_end", true);
   103 	SH_ADD_HOOK_MEMFUNC(IServerGameDLL, LevelInit, gamedll, &g_TimeLeftEvents, &TimeLeftEvents::LevelInit, true);
   104 	hooked_everything = true;
   105 
   106 	SM_GET_LATE_IFACE(BINTOOLS, g_pBinTools);
   107 }
   108 
   109 bool CStrike::QueryRunning(char *error, size_t maxlength)
   110 {
   111 	SM_CHECK_IFACE(BINTOOLS, g_pBinTools);
   112 
   113 	return true;
   114 }
   115 
   116 bool CStrike::QueryInterfaceDrop(SMInterface *pInterface)
   117 {
   118 	if (pInterface == g_pBinTools)
   119 	{
   120 		return false;
   121 	}
   122 
   123 	return IExtensionInterface::QueryInterfaceDrop(pInterface);
   124 }
   125 
   126 void CStrike::NotifyInterfaceDrop(SMInterface *pInterface)
   127 {
   128 	g_RegNatives.UnregisterAll();
   129 }