extensions/tf2/natives.cpp
author Nicholas Hastings <skamonkey@gmail.com>
Wed Mar 31 08:51:25 2010 -0400 (2010-03-31)
changeset 2943 1bbdb33fee53
parent 2939 3d62874b9071
child 3096 edd61d1e1e26
permissions -rw-r--r--
Added TF2_StunPlayer native and TF2_GetPlayerConditionFlags stock to TF2 ext. (bug 4331, r=pred)
dvander@1945
     1
/**
dvander@1945
     2
 * vim: set ts=4 :
dvander@1945
     3
 * =============================================================================
pred@1963
     4
 * SourceMod Team Fortress 2 Extension
ds@1947
     5
 * Copyright (C) 2004-2008 AlliedModders LLC.  All rights reserved.
dvander@1945
     6
 * =============================================================================
dvander@1945
     7
 *
dvander@1945
     8
 * This program is free software; you can redistribute it and/or modify it under
dvander@1945
     9
 * the terms of the GNU General Public License, version 3.0, as published by the
dvander@1945
    10
 * Free Software Foundation.
dvander@1945
    11
 * 
dvander@1945
    12
 * This program is distributed in the hope that it will be useful, but WITHOUT
dvander@1945
    13
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
dvander@1945
    14
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
dvander@1945
    15
 * details.
dvander@1945
    16
 *
dvander@1945
    17
 * You should have received a copy of the GNU General Public License along with
dvander@1945
    18
 * this program.  If not, see <http://www.gnu.org/licenses/>.
dvander@1945
    19
 *
dvander@1945
    20
 * As a special exception, AlliedModders LLC gives you permission to link the
dvander@1945
    21
 * code of this program (as well as its derivative works) to "Half-Life 2," the
dvander@1945
    22
 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
dvander@1945
    23
 * by the Valve Corporation.  You must obey the GNU General Public License in
dvander@1945
    24
 * all respects for all other code used.  Additionally, AlliedModders LLC grants
dvander@1945
    25
 * this exception to all derivative works.  AlliedModders LLC defines further
dvander@1945
    26
 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
dvander@1945
    27
 * or <http://www.sourcemod.net/license.php>.
dvander@1945
    28
 *
dvander@1945
    29
 * Version: $Id$
dvander@1945
    30
 */
dvander@1945
    31
dvander@1945
    32
#include "extension.h"
pred@1963
    33
#include "util.h"
pred@1963
    34
#include "time.h"
dvander@1945
    35
#include "RegNatives.h"
dvander@1945
    36
dvander@1945
    37
pred@1963
    38
// native TF2_Burn(client, target)
dvander@1945
    39
cell_t TF2_Burn(IPluginContext *pContext, const cell_t *params)
dvander@1945
    40
{
dvander@1945
    41
	static ICallWrapper *pWrapper = NULL;
dvander@1945
    42
fyrenmoo@2673
    43
	// CTFPlayerShared::Burn(CTFPlayer*, CTFWeaponBase*)
dvander@1945
    44
	if (!pWrapper)
dvander@1945
    45
	{
dvander@1945
    46
		REGISTER_NATIVE_ADDR("Burn", 
ds@2097
    47
			PassInfo pass[2]; \
dvander@1945
    48
			pass[0].flags = PASSFLAG_BYVAL; \
dvander@1945
    49
			pass[0].size = sizeof(CBaseEntity *); \
dvander@1945
    50
			pass[0].type = PassType_Basic; \
ds@2097
    51
			pass[1].flags = PASSFLAG_BYVAL; \
ds@2097
    52
			pass[1].size = sizeof(CBaseEntity *); \
ds@2097
    53
			pass[1].type = PassType_Basic; \
ds@2097
    54
			pWrapper = g_pBinTools->CreateCall(addr, CallConv_ThisCall, NULL, pass, 2))
dvander@1945
    55
	}
dvander@1945
    56
dvander@1945
    57
	CBaseEntity *pEntity;
pred@1963
    58
	if (!(pEntity = UTIL_GetCBaseEntity(params[1], true)))
dvander@1945
    59
	{
dvander@1945
    60
		return pContext->ThrowNativeError("Client index %d is not valid", params[1]);
dvander@1945
    61
	}
dvander@1945
    62
pred@1963
    63
	CBaseEntity *pTarget;
pred@1963
    64
	if (!(pTarget = UTIL_GetCBaseEntity(params[2], true)))
pred@1963
    65
	{
pred@1963
    66
		return pContext->ThrowNativeError("Client index %d is not valid", params[2]);
pred@1963
    67
	}
pred@1963
    68
pred@1963
    69
	void *obj = (void *)((uint8_t *)pEntity + playerSharedOffset->actual_offset);
dvander@1945
    70
fyrenmoo@2673
    71
	unsigned char vstk[sizeof(void *) + 2*sizeof(CBaseEntity *)];
dvander@1945
    72
	unsigned char *vptr = vstk;
dvander@1945
    73
dvander@1945
    74
	*(void **)vptr = obj;
dvander@1945
    75
	vptr += sizeof(void *);
pred@1963
    76
	*(CBaseEntity **)vptr = pTarget;
ds@2097
    77
	vptr += sizeof(CBaseEntity *);
ds@2097
    78
	*(CBaseEntity **)vptr = NULL;
ds@1952
    79
ds@1952
    80
	pWrapper->Execute(vstk, NULL);
ds@1952
    81
ds@1952
    82
	return 1;
ds@1952
    83
}
ds@1952
    84
pred@1963
    85
// native TF2_Invuln(client, bool:enabled)
ds@1952
    86
cell_t TF2_Invuln(IPluginContext *pContext, const cell_t *params)
ds@1952
    87
{
pred@2039
    88
	return pContext->ThrowNativeError("TF2_SetPlayerInvuln is no longer available");
pred@1963
    89
}
pred@1963
    90
pred@1963
    91
cell_t TF2_Disguise(IPluginContext *pContext, const cell_t *params)
pred@1963
    92
{
pred@1963
    93
	static ICallWrapper *pWrapper = NULL;
pred@1963
    94
pred@1963
    95
	//CTFPlayerShared::Disguise(int, int)
pred@1963
    96
	if (!pWrapper)
pred@1963
    97
	{
pred@1963
    98
		REGISTER_NATIVE_ADDR("Disguise", 
pred@1963
    99
			PassInfo pass[2]; \
pred@1963
   100
			pass[0].flags = PASSFLAG_BYVAL; \
pred@1963
   101
			pass[0].size = sizeof(int); \
pred@1963
   102
			pass[0].type = PassType_Basic; \
pred@1963
   103
			pass[1].flags = PASSFLAG_BYVAL; \
pred@1963
   104
			pass[1].size = sizeof(int); \
pred@1963
   105
			pass[1].type = PassType_Basic; \
pred@1963
   106
			pWrapper = g_pBinTools->CreateCall(addr, CallConv_ThisCall, NULL, pass, 2))
pred@1963
   107
	}
pred@1963
   108
pred@1963
   109
	CBaseEntity *pEntity;
pred@1963
   110
	if (!(pEntity = UTIL_GetCBaseEntity(params[1], true)))
pred@1963
   111
	{
pred@1963
   112
		return pContext->ThrowNativeError("Client index %d is not valid", params[1]);
pred@1963
   113
	}
pred@1963
   114
pred@1963
   115
	void *obj = (void *)((uint8_t *)pEntity + playerSharedOffset->actual_offset);
pred@1963
   116
pred@1963
   117
	unsigned char vstk[sizeof(void *) + 2*sizeof(int)];
pred@1963
   118
	unsigned char *vptr = vstk;
pred@1963
   119
pred@1963
   120
pred@1963
   121
	*(void **)vptr = obj;
pred@1963
   122
	vptr += sizeof(void *);
pred@1963
   123
	*(int *)vptr = params[2];
pred@1963
   124
	vptr += sizeof(int);
pred@1963
   125
	*(int *)vptr = params[3];
dvander@1945
   126
dvander@1945
   127
	pWrapper->Execute(vstk, NULL);
dvander@1945
   128
dvander@1945
   129
	return 1;
dvander@1945
   130
}
dvander@1945
   131
pred@1963
   132
cell_t TF2_RemoveDisguise(IPluginContext *pContext, const cell_t *params)
dvander@1945
   133
{
dvander@1945
   134
	static ICallWrapper *pWrapper = NULL;
dvander@1945
   135
pred@1963
   136
	//CTFPlayerShared::RemoveDisguise()
dvander@1945
   137
	if (!pWrapper)
dvander@1945
   138
	{
pred@1963
   139
		REGISTER_NATIVE_ADDR("RemoveDisguise", 
pred@1963
   140
				pWrapper = g_pBinTools->CreateCall(addr, CallConv_ThisCall, NULL, NULL, 0))
dvander@1945
   141
	}
dvander@1945
   142
dvander@1945
   143
	CBaseEntity *pEntity;
pred@1963
   144
	if (!(pEntity = UTIL_GetCBaseEntity(params[1], true)))
dvander@1945
   145
	{
dvander@1945
   146
		return pContext->ThrowNativeError("Client index %d is not valid", params[1]);
dvander@1945
   147
	}
dvander@1945
   148
pred@1963
   149
	void *obj = (void *)((uint8_t *)pEntity + playerSharedOffset->actual_offset);
dvander@1945
   150
pred@1963
   151
	unsigned char vstk[sizeof(void *)];
dvander@1945
   152
	unsigned char *vptr = vstk;
dvander@1945
   153
dvander@1945
   154
dvander@1945
   155
	*(void **)vptr = obj;
dvander@1945
   156
dvander@1945
   157
	pWrapper->Execute(vstk, NULL);
dvander@1945
   158
dvander@1945
   159
	return 1;
dvander@1945
   160
}
dvander@1945
   161
skamonkey@2939
   162
cell_t TF2_AddCondition(IPluginContext *pContext, const cell_t *params)
skamonkey@2939
   163
{
skamonkey@2939
   164
	static ICallWrapper *pWrapper = NULL;
skamonkey@2939
   165
skamonkey@2939
   166
	// CTFPlayerShared::AddCond(int, float)
skamonkey@2939
   167
	if (!pWrapper)
skamonkey@2939
   168
	{
skamonkey@2939
   169
		REGISTER_NATIVE_ADDR("AddCondition", 
skamonkey@2939
   170
			PassInfo pass[2]; \
skamonkey@2939
   171
			pass[0].flags = PASSFLAG_BYVAL; \
skamonkey@2939
   172
			pass[0].size = sizeof(int); \
skamonkey@2939
   173
			pass[0].type = PassType_Basic; \
skamonkey@2939
   174
			pass[1].flags = PASSFLAG_BYVAL; \
skamonkey@2939
   175
			pass[1].size = sizeof(float); \
skamonkey@2939
   176
			pass[1].type = PassType_Basic; \
skamonkey@2939
   177
			pWrapper = g_pBinTools->CreateCall(addr, CallConv_ThisCall, NULL, pass, 2))
skamonkey@2939
   178
	}
skamonkey@2939
   179
skamonkey@2939
   180
	CBaseEntity *pEntity;
skamonkey@2939
   181
	if (!(pEntity = UTIL_GetCBaseEntity(params[1], true)))
skamonkey@2939
   182
	{
skamonkey@2939
   183
		return pContext->ThrowNativeError("Client index %d is not valid", params[1]);
skamonkey@2939
   184
	}
skamonkey@2939
   185
skamonkey@2939
   186
	void *obj = (void *)((uint8_t *)pEntity + playerSharedOffset->actual_offset);
skamonkey@2939
   187
skamonkey@2939
   188
	unsigned char vstk[sizeof(void *) + sizeof(int) + sizeof(float)];
skamonkey@2939
   189
	unsigned char *vptr = vstk;
skamonkey@2939
   190
skamonkey@2939
   191
	*(void **)vptr = obj;
skamonkey@2939
   192
	vptr += sizeof(void *);
skamonkey@2939
   193
	*(int *)vptr = params[2];
skamonkey@2939
   194
	vptr += sizeof(int);
skamonkey@2939
   195
	*(float *)vptr = *(float *)&params[3];
skamonkey@2939
   196
skamonkey@2939
   197
	pWrapper->Execute(vstk, NULL);
skamonkey@2939
   198
skamonkey@2939
   199
	return 1;
skamonkey@2939
   200
}
skamonkey@2939
   201
skamonkey@2939
   202
cell_t TF2_RemoveCondition(IPluginContext *pContext, const cell_t *params)
skamonkey@2939
   203
{
skamonkey@2939
   204
	static ICallWrapper *pWrapper = NULL;
skamonkey@2939
   205
skamonkey@2939
   206
	// CTFPlayerShared::RemoveCond(int)
skamonkey@2939
   207
	if (!pWrapper)
skamonkey@2939
   208
	{
skamonkey@2939
   209
		REGISTER_NATIVE_ADDR("RemoveCondition", 
skamonkey@2939
   210
			PassInfo pass[1]; \
skamonkey@2939
   211
			pass[0].flags = PASSFLAG_BYVAL; \
skamonkey@2939
   212
			pass[0].size = sizeof(int); \
skamonkey@2939
   213
			pass[0].type = PassType_Basic; \
skamonkey@2939
   214
			pWrapper = g_pBinTools->CreateCall(addr, CallConv_ThisCall, NULL, pass, 1))
skamonkey@2939
   215
	}
skamonkey@2939
   216
skamonkey@2939
   217
	CBaseEntity *pEntity;
skamonkey@2939
   218
	if (!(pEntity = UTIL_GetCBaseEntity(params[1], true)))
skamonkey@2939
   219
	{
skamonkey@2939
   220
		return pContext->ThrowNativeError("Client index %d is not valid", params[1]);
skamonkey@2939
   221
	}
skamonkey@2939
   222
skamonkey@2939
   223
	void *obj = (void *)((uint8_t *)pEntity + playerSharedOffset->actual_offset);
skamonkey@2939
   224
skamonkey@2939
   225
	unsigned char vstk[sizeof(void *) + sizeof(int)];
skamonkey@2939
   226
	unsigned char *vptr = vstk;
skamonkey@2939
   227
skamonkey@2939
   228
	*(void **)vptr = obj;
skamonkey@2939
   229
	vptr += sizeof(void *);
skamonkey@2939
   230
	*(int *)vptr = params[2];
skamonkey@2939
   231
skamonkey@2939
   232
	pWrapper->Execute(vstk, NULL);
skamonkey@2939
   233
skamonkey@2939
   234
	return 1;
skamonkey@2939
   235
}
skamonkey@2939
   236
skamonkey@2943
   237
cell_t TF2_StunPlayer(IPluginContext *pContext, const cell_t *params)
skamonkey@2943
   238
{
skamonkey@2943
   239
	static ICallWrapper *pWrapper = NULL;
skamonkey@2943
   240
skamonkey@2943
   241
	// CTFPlayerShared::StunPlayer(float, float, int, CTFPlayer *)
skamonkey@2943
   242
	if (!pWrapper)
skamonkey@2943
   243
	{
skamonkey@2943
   244
		REGISTER_NATIVE_ADDR("StunPlayer", 
skamonkey@2943
   245
			PassInfo pass[4]; \
skamonkey@2943
   246
			pass[0].flags = PASSFLAG_BYVAL; \
skamonkey@2943
   247
			pass[0].size = sizeof(float); \
skamonkey@2943
   248
			pass[0].type = PassType_Basic; \
skamonkey@2943
   249
			pass[1].flags = PASSFLAG_BYVAL; \
skamonkey@2943
   250
			pass[1].size = sizeof(float); \
skamonkey@2943
   251
			pass[1].type = PassType_Basic; \
skamonkey@2943
   252
			pass[2].flags = PASSFLAG_BYVAL; \
skamonkey@2943
   253
			pass[2].size = sizeof(int); \
skamonkey@2943
   254
			pass[2].type = PassType_Basic; \
skamonkey@2943
   255
			pass[3].flags = PASSFLAG_BYVAL; \
skamonkey@2943
   256
			pass[3].size = sizeof(CBaseEntity *); \
skamonkey@2943
   257
			pass[3].type = PassType_Basic; \
skamonkey@2943
   258
			pWrapper = g_pBinTools->CreateCall(addr, CallConv_ThisCall, NULL, pass, 4))
skamonkey@2943
   259
	}
skamonkey@2943
   260
skamonkey@2943
   261
	CBaseEntity *pEntity;
skamonkey@2943
   262
	if (!(pEntity = UTIL_GetCBaseEntity(params[1], true)))
skamonkey@2943
   263
	{
skamonkey@2943
   264
		return pContext->ThrowNativeError("Client index %d is not valid", params[1]);
skamonkey@2943
   265
	}
skamonkey@2943
   266
skamonkey@2943
   267
	bool bByPlayer = (params[5] != 0);
skamonkey@2943
   268
	CBaseEntity *pAttacker = NULL;
skamonkey@2943
   269
	if (bByPlayer && !(pAttacker = UTIL_GetCBaseEntity(params[5], true)))
skamonkey@2943
   270
	{
skamonkey@2943
   271
		return pContext->ThrowNativeError("Attacker index %d is not valid", params[5]);
skamonkey@2943
   272
	}
skamonkey@2943
   273
skamonkey@2943
   274
	void *obj = (void *)((uint8_t *)pEntity + playerSharedOffset->actual_offset);
skamonkey@2943
   275
skamonkey@2943
   276
	unsigned char vstk[sizeof(void *) + 2*sizeof(float) + sizeof(int) + sizeof(CBaseEntity *)];
skamonkey@2943
   277
	unsigned char *vptr = vstk;
skamonkey@2943
   278
skamonkey@2943
   279
	*(void **)vptr = obj;
skamonkey@2943
   280
	vptr += sizeof(void *);
skamonkey@2943
   281
	*(float *)vptr = sp_ctof(params[2]);
skamonkey@2943
   282
	vptr += sizeof(float);
skamonkey@2943
   283
	*(float *)vptr = sp_ctof(params[3]);
skamonkey@2943
   284
	vptr += sizeof(float);
skamonkey@2943
   285
	*(int *)vptr = params[4];
skamonkey@2943
   286
	vptr += sizeof(int);
skamonkey@2943
   287
	*(CBaseEntity **)vptr = pAttacker;
skamonkey@2943
   288
skamonkey@2943
   289
	pWrapper->Execute(vstk, NULL);
skamonkey@2943
   290
skamonkey@2943
   291
	return 1;
skamonkey@2943
   292
}
skamonkey@2943
   293
skamonkey@2939
   294
cell_t TF2_SetPowerplayEnabled(IPluginContext *pContext, const cell_t *params)
skamonkey@2939
   295
{
skamonkey@2939
   296
	static ICallWrapper *pWrapper = NULL;
skamonkey@2939
   297
skamonkey@2939
   298
	// CTFPlayer::SetPowerPlayEnabled(bool)
skamonkey@2939
   299
	if (!pWrapper)
skamonkey@2939
   300
	{
skamonkey@2939
   301
		REGISTER_NATIVE_ADDR("SetPowerplayEnabled", 
skamonkey@2939
   302
			PassInfo pass[1]; \
skamonkey@2939
   303
			pass[0].flags = PASSFLAG_BYVAL; \
skamonkey@2939
   304
			pass[0].size = sizeof(bool); \
skamonkey@2939
   305
			pass[0].type = PassType_Basic; \
skamonkey@2939
   306
			pWrapper = g_pBinTools->CreateCall(addr, CallConv_ThisCall, NULL, pass, 1))
skamonkey@2939
   307
	}
skamonkey@2939
   308
skamonkey@2939
   309
	CBaseEntity *pEntity;
skamonkey@2939
   310
	if (!(pEntity = UTIL_GetCBaseEntity(params[1], true)))
skamonkey@2939
   311
	{
skamonkey@2939
   312
		return pContext->ThrowNativeError("Client index %d is not valid", params[1]);
skamonkey@2939
   313
	}
skamonkey@2939
   314
skamonkey@2939
   315
	bool bEnablePP = false;
skamonkey@2939
   316
	if (params[2] != 0)
skamonkey@2939
   317
	{
skamonkey@2939
   318
		bEnablePP = true;
skamonkey@2939
   319
	}
skamonkey@2939
   320
skamonkey@2939
   321
	unsigned char vstk[sizeof(void *) + sizeof(bool)];
skamonkey@2939
   322
	unsigned char *vptr = vstk;
skamonkey@2939
   323
skamonkey@2939
   324
	*(void **)vptr = (void *)pEntity;
skamonkey@2939
   325
	vptr += sizeof(void *);
skamonkey@2939
   326
	*(bool *)vptr = bEnablePP;
skamonkey@2939
   327
skamonkey@2939
   328
	pWrapper->Execute(vstk, NULL);
skamonkey@2939
   329
skamonkey@2939
   330
	return 1;
skamonkey@2939
   331
}
skamonkey@2939
   332
pred@1963
   333
cell_t TF2_Respawn(IPluginContext *pContext, const cell_t *params)
pred@1963
   334
{
pred@1963
   335
	static ICallWrapper *pWrapper = NULL;
pred@1963
   336
pred@1963
   337
	//CTFPlayer::ForceRespawn()
pred@1963
   338
pred@1963
   339
	if (!pWrapper)
pred@1963
   340
	{
pred@1963
   341
		int offset;
pred@1963
   342
pred@1963
   343
		if (!g_pGameConf->GetOffset("ForceRespawn", &offset))
pred@1963
   344
		{
pred@1963
   345
			return pContext->ThrowNativeError("Failed to locate function");
pred@1963
   346
		}
pred@1963
   347
pred@1963
   348
		pWrapper = g_pBinTools->CreateVCall(offset,
pred@1963
   349
											0,
pred@1963
   350
											0,
pred@1963
   351
											NULL,
pred@1963
   352
											NULL,
pred@1963
   353
											0);
pred@1963
   354
pred@1963
   355
		g_RegNatives.Register(pWrapper);
pred@1963
   356
	}
pred@1963
   357
pred@1963
   358
	CBaseEntity *pEntity;
pred@1963
   359
	if (!(pEntity = UTIL_GetCBaseEntity(params[1], true)))
pred@1963
   360
	{
pred@1963
   361
		return pContext->ThrowNativeError("Client index %d is not valid", params[1]);
pred@1963
   362
	}
pred@1963
   363
pred@1963
   364
	unsigned char vstk[sizeof(void *)];
pred@1963
   365
	unsigned char *vptr = vstk;
pred@1963
   366
pred@1963
   367
pred@1963
   368
	*(void **)vptr = (void *)pEntity;
pred@1963
   369
pred@1963
   370
	pWrapper->Execute(vstk, NULL);
pred@1963
   371
pred@1963
   372
	return 1;
pred@1963
   373
}
pred@1963
   374
skamonkey@2939
   375
cell_t TF2_Regenerate(IPluginContext *pContext, const cell_t *params)
skamonkey@2939
   376
{
skamonkey@2939
   377
	static ICallWrapper *pWrapper = NULL;
skamonkey@2939
   378
skamonkey@2939
   379
	//CTFPlayer::Regenerate()
skamonkey@2939
   380
skamonkey@2939
   381
	if (!pWrapper)
skamonkey@2939
   382
	{
skamonkey@2939
   383
		REGISTER_NATIVE_ADDR("Regenerate", 
skamonkey@2939
   384
			pWrapper = g_pBinTools->CreateCall(addr, CallConv_ThisCall, NULL, NULL, 0));
skamonkey@2939
   385
	}
skamonkey@2939
   386
skamonkey@2939
   387
	CBaseEntity *pEntity;
skamonkey@2939
   388
	if (!(pEntity = UTIL_GetCBaseEntity(params[1], true)))
skamonkey@2939
   389
	{
skamonkey@2939
   390
		return pContext->ThrowNativeError("Client index %d is not valid", params[1]);
skamonkey@2939
   391
	}
skamonkey@2939
   392
	pWrapper->Execute(&pEntity, NULL);
skamonkey@2939
   393
skamonkey@2939
   394
	return 1;
skamonkey@2939
   395
}
skamonkey@2939
   396
pred@1963
   397
cell_t TF2_GetResourceEntity(IPluginContext *pContext, const cell_t *params)
pred@1963
   398
{
pred@1963
   399
	return g_resourceEntity;
pred@1963
   400
}
pred@1963
   401
pred@1963
   402
cell_t TF2_GetClass(IPluginContext *pContext, const cell_t *params)
pred@1963
   403
{
pred@1963
   404
	char *str;
pred@1963
   405
	pContext->LocalToString(params[1], &str);
pred@1963
   406
pred@1963
   407
	return (cell_t)ClassnameToType(str);
pred@1963
   408
}
dvander@1945
   409
dvander@1945
   410
sp_nativeinfo_t g_TFNatives[] = 
dvander@1945
   411
{
pred@1963
   412
	{"TF2_IgnitePlayer",			TF2_Burn},
pred@1963
   413
	{"TF2_SetPlayerInvuln",			TF2_Invuln},
pred@1963
   414
	{"TF2_RespawnPlayer",			TF2_Respawn},
pred@1963
   415
	{"TF2_DisguisePlayer",			TF2_Disguise},
pred@1963
   416
	{"TF2_RemovePlayerDisguise",	TF2_RemoveDisguise},
pred@1963
   417
	{"TF2_GetResourceEntity",		TF2_GetResourceEntity},
pred@1963
   418
	{"TF2_GetClass",				TF2_GetClass},
skamonkey@2939
   419
	{"TF2_RegeneratePlayer",		TF2_Regenerate},
skamonkey@2939
   420
	{"TF2_AddCondition",			TF2_AddCondition},
skamonkey@2939
   421
	{"TF2_RemoveCondition",			TF2_RemoveCondition},
skamonkey@2943
   422
	{"TF2_SetPlayerPowerPlay",		TF2_SetPowerplayEnabled},
skamonkey@2943
   423
	{"TF2_StunPlayer",				TF2_StunPlayer},
dvander@1945
   424
	{NULL,							NULL}
dvander@1945
   425
};