extensions/sdktools/vhelpers.cpp
author David Anderson <dvander@alliedmods.net>
Wed Aug 01 02:48:11 2007 +0000 (2007-08-01)
changeset 1233 e9cfc03b9bb8
parent 1169 47a8892d2c81
child 1330 ab94316bb52b
permissions -rw-r--r--
updated sdktools license headers
dvander@1169
     1
/**
dvander@1169
     2
 * vim: set ts=4 :
dvander@1233
     3
 * ================================================================
dvander@1233
     4
 * SourceMod SDKTools Extension
dvander@1233
     5
 * Copyright (C) 2004-2007 AlliedModders LLC.  All rights reserved.
dvander@1233
     6
 * ================================================================
dvander@1169
     7
 *
dvander@1233
     8
 * This program is free software; you can redistribute it and/or 
dvander@1233
     9
 * modify it under the terms of the GNU General Public License, 
dvander@1233
    10
 * version 3.0, as published by the Free Software Foundation.
dvander@1233
    11
 * 
dvander@1169
    12
 * This program is distributed in the hope that it will be useful,
dvander@1169
    13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
dvander@1169
    14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
dvander@1169
    15
 * GNU General Public License for more details.
dvander@1233
    16
 *
dvander@1169
    17
 * You should have received a copy of the GNU General Public License
dvander@1233
    18
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
dvander@1233
    19
 *
dvander@1233
    20
 * As a special exception, AlliedModders LLC gives you permission to 
dvander@1233
    21
 * link the code of this program (as well as its derivative works) to 
dvander@1233
    22
 * "Half-Life 2," the "Source Engine," the "SourcePawn JIT," and any 
dvander@1233
    23
 * Game MODs that run on software by the Valve Corporation.  You must 
dvander@1233
    24
 * obey the GNU General Public License in all respects for all other 
dvander@1233
    25
 * code used. Additionally, AlliedModders LLC grants this exception 
dvander@1233
    26
 * to all derivative works. AlliedModders LLC defines further 
dvander@1233
    27
 * exceptions, found in LICENSE.txt (as of this writing, version 
dvander@1233
    28
 * JULY-31-2007), or <http://www.sourcemod.net/license.php>.
dvander@1169
    29
 *
dvander@1169
    30
 * Version: $Id$
dvander@1169
    31
 */
dvander@1233
    32
dvander@1169
    33
#include "extension.h"
dvander@1169
    34
#include "vhelpers.h"
dvander@1169
    35
dvander@1169
    36
CallHelper s_Teleport;
dvander@1169
    37
CallHelper s_GetVelocity;
dvander@1169
    38
dvander@1169
    39
bool SetupTeleport()
dvander@1169
    40
{
dvander@1169
    41
	if (s_Teleport.setup)
dvander@1169
    42
	{
dvander@1169
    43
		return s_Teleport.supported;
dvander@1169
    44
	}
dvander@1169
    45
dvander@1169
    46
	/* Setup Teleport */
dvander@1169
    47
	int offset;
dvander@1169
    48
	if (g_pGameConf->GetOffset("Teleport", &offset))
dvander@1169
    49
	{
dvander@1169
    50
		PassInfo info[3];
dvander@1169
    51
		info[0].flags = info[1].flags = info[2].flags = PASSFLAG_BYVAL;
dvander@1169
    52
		info[0].size = info[1].size = info[2].size = sizeof(void *);
dvander@1169
    53
		info[0].type = info[1].type = info[2].type = PassType_Basic;
dvander@1169
    54
dvander@1169
    55
		s_Teleport.call = g_pBinTools->CreateVCall(offset, 0, 0, NULL, info, 3);
dvander@1169
    56
dvander@1169
    57
		if (s_Teleport.call)
dvander@1169
    58
		{
dvander@1169
    59
			s_Teleport.supported = true;
dvander@1169
    60
		}
dvander@1169
    61
	}
dvander@1169
    62
dvander@1169
    63
	s_Teleport.setup = true;
dvander@1169
    64
dvander@1169
    65
	return s_Teleport.supported;
dvander@1169
    66
}
dvander@1169
    67
dvander@1169
    68
void Teleport(CBaseEntity *pEntity, Vector *origin, QAngle *ang, Vector *velocity)
dvander@1169
    69
{
dvander@1169
    70
	unsigned char params[sizeof(void *) * 4];
dvander@1169
    71
	unsigned char *vptr = params;
dvander@1169
    72
	*(CBaseEntity **)vptr = pEntity;
dvander@1169
    73
	vptr += sizeof(CBaseEntity *);
dvander@1169
    74
	*(Vector **)vptr = origin;
dvander@1169
    75
	vptr += sizeof(Vector *);
dvander@1169
    76
	*(QAngle **)vptr = ang;
dvander@1169
    77
	vptr += sizeof(QAngle *);
dvander@1169
    78
	*(Vector **)vptr = velocity;
dvander@1169
    79
	
dvander@1169
    80
	s_Teleport.call->Execute(params, NULL);
dvander@1169
    81
}
dvander@1169
    82
dvander@1169
    83
bool IsTeleportSupported()
dvander@1169
    84
{
dvander@1169
    85
	return SetupTeleport();
dvander@1169
    86
}
dvander@1169
    87
dvander@1169
    88
bool SetupGetVelocity()
dvander@1169
    89
{
dvander@1169
    90
	if (s_GetVelocity.setup)
dvander@1169
    91
	{
dvander@1169
    92
		return s_GetVelocity.supported;
dvander@1169
    93
	}
dvander@1169
    94
dvander@1169
    95
	int offset;
dvander@1169
    96
	if (g_pGameConf->GetOffset("GetVelocity", &offset))
dvander@1169
    97
	{
dvander@1169
    98
		PassInfo info[2];
dvander@1169
    99
		info[0].flags = info[1].flags = PASSFLAG_BYVAL;
dvander@1169
   100
		info[0].size = info[1].size = sizeof(void *);
dvander@1169
   101
		info[0].type = info[1].type = PassType_Basic;
dvander@1169
   102
dvander@1169
   103
		s_GetVelocity.call = g_pBinTools->CreateVCall(offset, 0, 0, NULL, info, 2);
dvander@1169
   104
dvander@1169
   105
		if (s_GetVelocity.call)
dvander@1169
   106
		{
dvander@1169
   107
			s_GetVelocity.supported = true;
dvander@1169
   108
		}
dvander@1169
   109
	}
dvander@1169
   110
dvander@1169
   111
	s_GetVelocity.setup = true;
dvander@1169
   112
dvander@1169
   113
	return s_GetVelocity.supported;
dvander@1169
   114
}
dvander@1169
   115
dvander@1169
   116
void GetVelocity(CBaseEntity *pEntity, Vector *velocity, AngularImpulse *angvelocity)
dvander@1169
   117
{
dvander@1169
   118
	unsigned char params[sizeof(void *) * 3];
dvander@1169
   119
	unsigned char *vptr = params;
dvander@1169
   120
	*(CBaseEntity **)vptr = pEntity;
dvander@1169
   121
	vptr += sizeof(CBaseEntity *);
dvander@1169
   122
	*(Vector **)vptr = velocity;
dvander@1169
   123
	vptr += sizeof(Vector *);
dvander@1169
   124
	*(AngularImpulse **)vptr = angvelocity;
dvander@1169
   125
dvander@1169
   126
	s_GetVelocity.call->Execute(params, NULL);
dvander@1169
   127
}
dvander@1169
   128
dvander@1169
   129
bool IsGetVelocitySupported()
dvander@1169
   130
{
dvander@1169
   131
	return SetupGetVelocity();
dvander@1169
   132
}
dvander@1169
   133
dvander@1169
   134
void ShutdownHelpers()
dvander@1169
   135
{
dvander@1169
   136
	s_Teleport.Shutdown();
dvander@1169
   137
	s_GetVelocity.Shutdown();
dvander@1169
   138
}