extensions/sdktools/vhelpers.cpp
author Scott Ehlert <ds@alliedmods.net>
Wed Aug 15 06:19:30 2007 +0000 (2007-08-15)
changeset 1330 ab94316bb52b
parent 1233 e9cfc03b9bb8
child 1611 1bd18b7530eb
permissions -rw-r--r--
Updated license headers on virtually all files with extremely minor changes in the name of some sort of strange consistency.
All plugin and include file headers also have been changed to say about GPL3 instead of GPL2.

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