diff -r 324a19ea3468 -r 47a8892d2c81 extensions/sdktools/vhelpers.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/extensions/sdktools/vhelpers.cpp Wed Jul 25 20:23:34 2007 +0000 @@ -0,0 +1,128 @@ +/** + * vim: set ts=4 : + * =============================================================== + * SourceMod SDK Tools Extension + * Copyright (C) 2004-2007 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 + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Version: $Id$ + */ +#include "extension.h" +#include "vhelpers.h" + +CallHelper s_Teleport; +CallHelper s_GetVelocity; + +bool SetupTeleport() +{ + if (s_Teleport.setup) + { + return s_Teleport.supported; + } + + /* Setup Teleport */ + int offset; + if (g_pGameConf->GetOffset("Teleport", &offset)) + { + PassInfo info[3]; + info[0].flags = info[1].flags = info[2].flags = PASSFLAG_BYVAL; + info[0].size = info[1].size = info[2].size = sizeof(void *); + info[0].type = info[1].type = info[2].type = PassType_Basic; + + s_Teleport.call = g_pBinTools->CreateVCall(offset, 0, 0, NULL, info, 3); + + if (s_Teleport.call) + { + s_Teleport.supported = true; + } + } + + s_Teleport.setup = true; + + return s_Teleport.supported; +} + +void Teleport(CBaseEntity *pEntity, Vector *origin, QAngle *ang, Vector *velocity) +{ + unsigned char params[sizeof(void *) * 4]; + unsigned char *vptr = params; + *(CBaseEntity **)vptr = pEntity; + vptr += sizeof(CBaseEntity *); + *(Vector **)vptr = origin; + vptr += sizeof(Vector *); + *(QAngle **)vptr = ang; + vptr += sizeof(QAngle *); + *(Vector **)vptr = velocity; + + s_Teleport.call->Execute(params, NULL); +} + +bool IsTeleportSupported() +{ + return SetupTeleport(); +} + +bool SetupGetVelocity() +{ + if (s_GetVelocity.setup) + { + return s_GetVelocity.supported; + } + + int offset; + if (g_pGameConf->GetOffset("GetVelocity", &offset)) + { + PassInfo info[2]; + info[0].flags = info[1].flags = PASSFLAG_BYVAL; + info[0].size = info[1].size = sizeof(void *); + info[0].type = info[1].type = PassType_Basic; + + s_GetVelocity.call = g_pBinTools->CreateVCall(offset, 0, 0, NULL, info, 2); + + if (s_GetVelocity.call) + { + s_GetVelocity.supported = true; + } + } + + s_GetVelocity.setup = true; + + return s_GetVelocity.supported; +} + +void GetVelocity(CBaseEntity *pEntity, Vector *velocity, AngularImpulse *angvelocity) +{ + unsigned char params[sizeof(void *) * 3]; + unsigned char *vptr = params; + *(CBaseEntity **)vptr = pEntity; + vptr += sizeof(CBaseEntity *); + *(Vector **)vptr = velocity; + vptr += sizeof(Vector *); + *(AngularImpulse **)vptr = angvelocity; + + s_GetVelocity.call->Execute(params, NULL); +} + +bool IsGetVelocitySupported() +{ + return SetupGetVelocity(); +} + +void ShutdownHelpers() +{ + s_Teleport.Shutdown(); + s_GetVelocity.Shutdown(); +}