Added ISDKHooks interface with entity listeners (
bug 5602, r=psychonic).
3 * =============================================================================
4 * SourceMod Team Fortress 2 Extension
5 * Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
6 * =============================================================================
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.
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
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/>.
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>.
32 #include "teleporter.h"
34 CDetour *canPlayerTeleportDetour = NULL;
36 IForward *g_teleportForward = NULL;
40 DETOUR_DECL_MEMBER1(CanPlayerBeTeleported, bool, CTFPlayer *, pPlayer)
42 bool origCanTeleport = DETOUR_MEMBER_CALL(CanPlayerBeTeleported)(pPlayer);
44 cell_t teleporterCell = gamehelpers->EntityToBCompatRef((CBaseEntity *)this);
45 cell_t playerCell = gamehelpers->EntityToBCompatRef((CBaseEntity *)pPlayer);
47 if (!g_teleportForward)
49 g_pSM->LogMessage(myself, "Teleport forward is invalid");
50 return origCanTeleport;
53 cell_t returnValue = origCanTeleport ? 1 : 0;
55 g_teleportForward->PushCell(playerCell); // client
56 g_teleportForward->PushCell(teleporterCell); // teleporter
57 g_teleportForward->PushCellByRef(&returnValue); // return value
61 g_teleportForward->Execute(&result);
63 if (result > Pl_Continue)
65 // plugin wants to override the game (returned something other than Plugin_Continue)
66 return returnValue == 1;
70 return origCanTeleport; // let the game decide
74 bool InitialiseTeleporterDetour()
76 canPlayerTeleportDetour = DETOUR_CREATE_MEMBER(CanPlayerBeTeleported, "CanPlayerTeleport");
78 if (canPlayerTeleportDetour != NULL)
80 canPlayerTeleportDetour->EnableDetour();
84 g_pSM->LogError(myself, "Teleport forward could not be initialized - Disabled hook");
89 void RemoveTeleporterDetour()
91 if (canPlayerTeleportDetour != NULL)
93 canPlayerTeleportDetour->Destroy();
94 canPlayerTeleportDetour = NULL;