extensions/tf2/natives.cpp
author Nicholas Hastings <skamonkey@gmail.com>
Wed Dec 19 07:55:03 2012 -0500 (2012-12-19)
changeset 3713 a825343bb3f2
parent 3606 e75ddff9d0b9
child 3818 f25d64a5cd7a
permissions -rw-r--r--
Added new param for CTFPlayerShared::AddCond call in TF2 ext.
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
skamonkey@3272
    37
// native TF2_MakeBleed(client, attacker, Float:duration)
abkowald@3096
    38
cell_t TF2_MakeBleed(IPluginContext *pContext, const cell_t *params)
abkowald@3096
    39
{
abkowald@3096
    40
	static ICallWrapper *pWrapper = NULL;
abkowald@3096
    41
skamonkey@3606
    42
	// CTFPlayerShared::MakeBleed(CTFPlayer*, CTFWeaponBase*, float, int=4)
abkowald@3096
    43
	if(!pWrapper)
abkowald@3096
    44
	{
abkowald@3096
    45
		REGISTER_NATIVE_ADDR("MakeBleed",
skamonkey@3606
    46
			PassInfo pass[4]; \
abkowald@3096
    47
			pass[0].flags = PASSFLAG_BYVAL; \
abkowald@3096
    48
			pass[0].size = sizeof(CBaseEntity *); \
abkowald@3096
    49
			pass[0].type = PassType_Basic; \
abkowald@3096
    50
			pass[1].flags = PASSFLAG_BYVAL; \
abkowald@3096
    51
			pass[1].size = sizeof(CBaseEntity *); \
abkowald@3096
    52
			pass[1].type = PassType_Basic; \
abkowald@3096
    53
			pass[2].flags = PASSFLAG_BYVAL; \
abkowald@3096
    54
			pass[2].size = sizeof(float); \
abkowald@3096
    55
			pass[2].type = PassType_Basic; \
skamonkey@3606
    56
			pass[3].flags = PASSFLAG_BYVAL; \
skamonkey@3606
    57
			pass[3].size = sizeof(int); \
skamonkey@3606
    58
			pass[3].type = PassType_Basic; \
skamonkey@3606
    59
			pWrapper = g_pBinTools->CreateCall(addr, CallConv_ThisCall, NULL, pass, 4))
abkowald@3096
    60
	}
abkowald@3096
    61
abkowald@3096
    62
	CBaseEntity *pEntity;
abkowald@3096
    63
	if (!(pEntity = UTIL_GetCBaseEntity(params[1], true)))
abkowald@3096
    64
	{
abkowald@3096
    65
		return pContext->ThrowNativeError("Client index %d is not valid", params[1]);
abkowald@3096
    66
	}
abkowald@3096
    67
skamonkey@3272
    68
	CBaseEntity *pAttacker;
skamonkey@3272
    69
	if (!(pAttacker = UTIL_GetCBaseEntity(params[2], true)))
abkowald@3096
    70
	{
abkowald@3096
    71
		return pContext->ThrowNativeError("Client index %d is not valid", params[2]);
abkowald@3096
    72
	}
abkowald@3096
    73
abkowald@3096
    74
	void *obj = (void *)((uint8_t *)pEntity + playerSharedOffset->actual_offset);
abkowald@3096
    75
abkowald@3096
    76
	unsigned char vstk[sizeof(void *) + 2*sizeof(CBaseEntity *) + sizeof(float)];
abkowald@3096
    77
	unsigned char *vptr = vstk;
abkowald@3096
    78
abkowald@3096
    79
	*(void **)vptr = obj;
abkowald@3096
    80
	vptr += sizeof(void *);
skamonkey@3272
    81
	*(CBaseEntity **)vptr = pAttacker;
abkowald@3096
    82
	vptr += sizeof(CBaseEntity *);
abkowald@3096
    83
	*(CBaseEntity **)vptr = NULL;
abkowald@3096
    84
	vptr += sizeof(CBaseEntity *);
abkowald@3096
    85
	*(float *)vptr = sp_ctof(params[3]);
skamonkey@3606
    86
	vptr += sizeof(float);
skamonkey@3606
    87
	*(int *)vptr = 4;
abkowald@3096
    88
abkowald@3096
    89
	pWrapper->Execute(vstk, NULL);
abkowald@3096
    90
abkowald@3096
    91
	return 1;
abkowald@3096
    92
}
dvander@1945
    93
pred@1963
    94
// native TF2_Burn(client, target)
dvander@1945
    95
cell_t TF2_Burn(IPluginContext *pContext, const cell_t *params)
dvander@1945
    96
{
dvander@1945
    97
	static ICallWrapper *pWrapper = NULL;
dvander@1945
    98
fyrenmoo@2673
    99
	// CTFPlayerShared::Burn(CTFPlayer*, CTFWeaponBase*)
dvander@1945
   100
	if (!pWrapper)
dvander@1945
   101
	{
dvander@1945
   102
		REGISTER_NATIVE_ADDR("Burn", 
ds@2097
   103
			PassInfo pass[2]; \
dvander@1945
   104
			pass[0].flags = PASSFLAG_BYVAL; \
dvander@1945
   105
			pass[0].size = sizeof(CBaseEntity *); \
dvander@1945
   106
			pass[0].type = PassType_Basic; \
ds@2097
   107
			pass[1].flags = PASSFLAG_BYVAL; \
ds@2097
   108
			pass[1].size = sizeof(CBaseEntity *); \
ds@2097
   109
			pass[1].type = PassType_Basic; \
ds@2097
   110
			pWrapper = g_pBinTools->CreateCall(addr, CallConv_ThisCall, NULL, pass, 2))
dvander@1945
   111
	}
dvander@1945
   112
dvander@1945
   113
	CBaseEntity *pEntity;
pred@1963
   114
	if (!(pEntity = UTIL_GetCBaseEntity(params[1], true)))
dvander@1945
   115
	{
dvander@1945
   116
		return pContext->ThrowNativeError("Client index %d is not valid", params[1]);
dvander@1945
   117
	}
dvander@1945
   118
pred@1963
   119
	CBaseEntity *pTarget;
pred@1963
   120
	if (!(pTarget = UTIL_GetCBaseEntity(params[2], true)))
pred@1963
   121
	{
pred@1963
   122
		return pContext->ThrowNativeError("Client index %d is not valid", params[2]);
pred@1963
   123
	}
pred@1963
   124
pred@1963
   125
	void *obj = (void *)((uint8_t *)pEntity + playerSharedOffset->actual_offset);
dvander@1945
   126
fyrenmoo@2673
   127
	unsigned char vstk[sizeof(void *) + 2*sizeof(CBaseEntity *)];
dvander@1945
   128
	unsigned char *vptr = vstk;
dvander@1945
   129
dvander@1945
   130
	*(void **)vptr = obj;
dvander@1945
   131
	vptr += sizeof(void *);
pred@1963
   132
	*(CBaseEntity **)vptr = pTarget;
ds@2097
   133
	vptr += sizeof(CBaseEntity *);
ds@2097
   134
	*(CBaseEntity **)vptr = NULL;
ds@1952
   135
ds@1952
   136
	pWrapper->Execute(vstk, NULL);
ds@1952
   137
ds@1952
   138
	return 1;
ds@1952
   139
}
ds@1952
   140
pred@1963
   141
// native TF2_Invuln(client, bool:enabled)
ds@1952
   142
cell_t TF2_Invuln(IPluginContext *pContext, const cell_t *params)
ds@1952
   143
{
pred@2039
   144
	return pContext->ThrowNativeError("TF2_SetPlayerInvuln is no longer available");
pred@1963
   145
}
pred@1963
   146
pred@1963
   147
cell_t TF2_Disguise(IPluginContext *pContext, const cell_t *params)
pred@1963
   148
{
pred@1963
   149
	static ICallWrapper *pWrapper = NULL;
pred@1963
   150
skamonkey@3128
   151
	//CTFPlayerShared::Disguise(int, int, CTFPlayer *)
pred@1963
   152
	if (!pWrapper)
pred@1963
   153
	{
pred@1963
   154
		REGISTER_NATIVE_ADDR("Disguise", 
skamonkey@3255
   155
			PassInfo pass[4]; \
pred@1963
   156
			pass[0].flags = PASSFLAG_BYVAL; \
pred@1963
   157
			pass[0].size = sizeof(int); \
pred@1963
   158
			pass[0].type = PassType_Basic; \
pred@1963
   159
			pass[1].flags = PASSFLAG_BYVAL; \
pred@1963
   160
			pass[1].size = sizeof(int); \
pred@1963
   161
			pass[1].type = PassType_Basic; \
skamonkey@3128
   162
			pass[2].flags = PASSFLAG_BYVAL; \
skamonkey@3128
   163
			pass[2].size = sizeof(CBaseEntity *); \
skamonkey@3128
   164
			pass[2].type = PassType_Basic; \
skamonkey@3255
   165
			pass[3].flags = PASSFLAG_BYVAL; \
skamonkey@3255
   166
			pass[3].size = sizeof(bool); \
skamonkey@3255
   167
			pass[3].type = PassType_Basic; \
skamonkey@3255
   168
			pWrapper = g_pBinTools->CreateCall(addr, CallConv_ThisCall, NULL, pass, 4))
pred@1963
   169
	}
pred@1963
   170
pred@1963
   171
	CBaseEntity *pEntity;
pred@1963
   172
	if (!(pEntity = UTIL_GetCBaseEntity(params[1], true)))
pred@1963
   173
	{
pred@1963
   174
		return pContext->ThrowNativeError("Client index %d is not valid", params[1]);
pred@1963
   175
	}
pred@1963
   176
pred@1963
   177
	void *obj = (void *)((uint8_t *)pEntity + playerSharedOffset->actual_offset);
skamonkey@3128
   178
	
skamonkey@3128
   179
	CBaseEntity *pTarget = NULL;
skamonkey@3128
   180
	// Compatibility fix for the newly-added target parameter
skamonkey@3128
   181
	if (params[0] >= 4 && params[4] > 0 && !(pTarget = UTIL_GetCBaseEntity(params[4], true)))
skamonkey@3128
   182
	{
asherkin@3555
   183
		return pContext->ThrowNativeError("Target client index %d is not valid", params[4]);
skamonkey@3128
   184
	}
pred@1963
   185
skamonkey@3255
   186
	unsigned char vstk[sizeof(void *) + 2*sizeof(int) + sizeof(bool)];
pred@1963
   187
	unsigned char *vptr = vstk;
pred@1963
   188
pred@1963
   189
pred@1963
   190
	*(void **)vptr = obj;
pred@1963
   191
	vptr += sizeof(void *);
pred@1963
   192
	*(int *)vptr = params[2];
pred@1963
   193
	vptr += sizeof(int);
pred@1963
   194
	*(int *)vptr = params[3];
skamonkey@3128
   195
	vptr += sizeof(int);
skamonkey@3128
   196
	*(CBaseEntity **)vptr = pTarget;
skamonkey@3255
   197
	vptr += sizeof(CBaseEntity *);
skamonkey@3255
   198
	*(bool *)vptr = true;
skamonkey@3255
   199
	
dvander@1945
   200
	pWrapper->Execute(vstk, NULL);
dvander@1945
   201
dvander@1945
   202
	return 1;
dvander@1945
   203
}
dvander@1945
   204
pred@1963
   205
cell_t TF2_RemoveDisguise(IPluginContext *pContext, const cell_t *params)
dvander@1945
   206
{
dvander@1945
   207
	static ICallWrapper *pWrapper = NULL;
dvander@1945
   208
pred@1963
   209
	//CTFPlayerShared::RemoveDisguise()
dvander@1945
   210
	if (!pWrapper)
dvander@1945
   211
	{
pred@1963
   212
		REGISTER_NATIVE_ADDR("RemoveDisguise", 
pred@1963
   213
				pWrapper = g_pBinTools->CreateCall(addr, CallConv_ThisCall, NULL, NULL, 0))
dvander@1945
   214
	}
dvander@1945
   215
dvander@1945
   216
	CBaseEntity *pEntity;
pred@1963
   217
	if (!(pEntity = UTIL_GetCBaseEntity(params[1], true)))
dvander@1945
   218
	{
dvander@1945
   219
		return pContext->ThrowNativeError("Client index %d is not valid", params[1]);
dvander@1945
   220
	}
dvander@1945
   221
pred@1963
   222
	void *obj = (void *)((uint8_t *)pEntity + playerSharedOffset->actual_offset);
dvander@1945
   223
pred@1963
   224
	unsigned char vstk[sizeof(void *)];
dvander@1945
   225
	unsigned char *vptr = vstk;
dvander@1945
   226
dvander@1945
   227
dvander@1945
   228
	*(void **)vptr = obj;
dvander@1945
   229
dvander@1945
   230
	pWrapper->Execute(vstk, NULL);
dvander@1945
   231
dvander@1945
   232
	return 1;
dvander@1945
   233
}
dvander@1945
   234
skamonkey@2939
   235
cell_t TF2_AddCondition(IPluginContext *pContext, const cell_t *params)
skamonkey@2939
   236
{
skamonkey@2939
   237
	static ICallWrapper *pWrapper = NULL;
skamonkey@2939
   238
skamonkey@2939
   239
	// CTFPlayerShared::AddCond(int, float)
skamonkey@2939
   240
	if (!pWrapper)
skamonkey@2939
   241
	{
skamonkey@2939
   242
		REGISTER_NATIVE_ADDR("AddCondition", 
skamonkey@3713
   243
			PassInfo pass[3]; \
skamonkey@2939
   244
			pass[0].flags = PASSFLAG_BYVAL; \
skamonkey@2939
   245
			pass[0].size = sizeof(int); \
skamonkey@2939
   246
			pass[0].type = PassType_Basic; \
skamonkey@2939
   247
			pass[1].flags = PASSFLAG_BYVAL; \
skamonkey@2939
   248
			pass[1].size = sizeof(float); \
skamonkey@2939
   249
			pass[1].type = PassType_Basic; \
skamonkey@3713
   250
			pass[2].flags = PASSFLAG_BYVAL; \
skamonkey@3713
   251
			pass[2].size = sizeof(CBaseEntity *); \
skamonkey@3713
   252
			pass[2].type = PassType_Basic; \
skamonkey@3713
   253
			pWrapper = g_pBinTools->CreateCall(addr, CallConv_ThisCall, NULL, pass, 3))
skamonkey@2939
   254
	}
skamonkey@2939
   255
skamonkey@2939
   256
	CBaseEntity *pEntity;
skamonkey@2939
   257
	if (!(pEntity = UTIL_GetCBaseEntity(params[1], true)))
skamonkey@2939
   258
	{
skamonkey@2939
   259
		return pContext->ThrowNativeError("Client index %d is not valid", params[1]);
skamonkey@2939
   260
	}
skamonkey@2939
   261
skamonkey@2939
   262
	void *obj = (void *)((uint8_t *)pEntity + playerSharedOffset->actual_offset);
skamonkey@2939
   263
skamonkey@3713
   264
	unsigned char vstk[sizeof(void *) + sizeof(int) + sizeof(float) + sizeof(CBaseEntity *)];
skamonkey@2939
   265
	unsigned char *vptr = vstk;
skamonkey@2939
   266
skamonkey@2939
   267
	*(void **)vptr = obj;
skamonkey@2939
   268
	vptr += sizeof(void *);
skamonkey@2939
   269
	*(int *)vptr = params[2];
skamonkey@2939
   270
	vptr += sizeof(int);
skamonkey@2939
   271
	*(float *)vptr = *(float *)&params[3];
skamonkey@3713
   272
	vptr += sizeof(float);
skamonkey@3713
   273
	*(CBaseEntity **)vptr = NULL;
skamonkey@2939
   274
skamonkey@2939
   275
	pWrapper->Execute(vstk, NULL);
skamonkey@2939
   276
skamonkey@2939
   277
	return 1;
skamonkey@2939
   278
}
skamonkey@2939
   279
skamonkey@2939
   280
cell_t TF2_RemoveCondition(IPluginContext *pContext, const cell_t *params)
skamonkey@2939
   281
{
skamonkey@2939
   282
	static ICallWrapper *pWrapper = NULL;
skamonkey@2939
   283
skamonkey@3128
   284
	// CTFPlayerShared::RemoveCond(int, bool)
skamonkey@2939
   285
	if (!pWrapper)
skamonkey@2939
   286
	{
skamonkey@2939
   287
		REGISTER_NATIVE_ADDR("RemoveCondition", 
skamonkey@3127
   288
			PassInfo pass[2]; \
skamonkey@2939
   289
			pass[0].flags = PASSFLAG_BYVAL; \
skamonkey@2939
   290
			pass[0].size = sizeof(int); \
skamonkey@2939
   291
			pass[0].type = PassType_Basic; \
skamonkey@3127
   292
			pass[1].flags = PASSFLAG_BYVAL; \
skamonkey@3127
   293
			pass[1].size = sizeof(bool); \
skamonkey@3127
   294
			pass[1].type = PassType_Basic; \
skamonkey@3127
   295
			pWrapper = g_pBinTools->CreateCall(addr, CallConv_ThisCall, NULL, pass, 2))
skamonkey@2939
   296
	}
skamonkey@2939
   297
skamonkey@2939
   298
	CBaseEntity *pEntity;
skamonkey@2939
   299
	if (!(pEntity = UTIL_GetCBaseEntity(params[1], true)))
skamonkey@2939
   300
	{
skamonkey@2939
   301
		return pContext->ThrowNativeError("Client index %d is not valid", params[1]);
skamonkey@2939
   302
	}
skamonkey@2939
   303
skamonkey@2939
   304
	void *obj = (void *)((uint8_t *)pEntity + playerSharedOffset->actual_offset);
skamonkey@2939
   305
skamonkey@3127
   306
	unsigned char vstk[sizeof(void *) + sizeof(int) + sizeof(bool)];
skamonkey@2939
   307
	unsigned char *vptr = vstk;
skamonkey@2939
   308
skamonkey@2939
   309
	*(void **)vptr = obj;
skamonkey@2939
   310
	vptr += sizeof(void *);
skamonkey@2939
   311
	*(int *)vptr = params[2];
skamonkey@3127
   312
	vptr += sizeof(int);
skamonkey@3318
   313
	*(bool *)vptr = true;
skamonkey@2939
   314
skamonkey@2939
   315
	pWrapper->Execute(vstk, NULL);
skamonkey@2939
   316
skamonkey@2939
   317
	return 1;
skamonkey@2939
   318
}
skamonkey@2939
   319
skamonkey@2943
   320
cell_t TF2_StunPlayer(IPluginContext *pContext, const cell_t *params)
skamonkey@2943
   321
{
skamonkey@2943
   322
	static ICallWrapper *pWrapper = NULL;
skamonkey@2943
   323
skamonkey@2943
   324
	// CTFPlayerShared::StunPlayer(float, float, int, CTFPlayer *)
skamonkey@2943
   325
	if (!pWrapper)
skamonkey@2943
   326
	{
skamonkey@2943
   327
		REGISTER_NATIVE_ADDR("StunPlayer", 
skamonkey@2943
   328
			PassInfo pass[4]; \
skamonkey@2943
   329
			pass[0].flags = PASSFLAG_BYVAL; \
skamonkey@2943
   330
			pass[0].size = sizeof(float); \
skamonkey@2943
   331
			pass[0].type = PassType_Basic; \
skamonkey@2943
   332
			pass[1].flags = PASSFLAG_BYVAL; \
skamonkey@2943
   333
			pass[1].size = sizeof(float); \
skamonkey@2943
   334
			pass[1].type = PassType_Basic; \
skamonkey@2943
   335
			pass[2].flags = PASSFLAG_BYVAL; \
skamonkey@2943
   336
			pass[2].size = sizeof(int); \
skamonkey@2943
   337
			pass[2].type = PassType_Basic; \
skamonkey@2943
   338
			pass[3].flags = PASSFLAG_BYVAL; \
skamonkey@2943
   339
			pass[3].size = sizeof(CBaseEntity *); \
skamonkey@2943
   340
			pass[3].type = PassType_Basic; \
skamonkey@2943
   341
			pWrapper = g_pBinTools->CreateCall(addr, CallConv_ThisCall, NULL, pass, 4))
skamonkey@2943
   342
	}
skamonkey@2943
   343
skamonkey@2943
   344
	CBaseEntity *pEntity;
skamonkey@2943
   345
	if (!(pEntity = UTIL_GetCBaseEntity(params[1], true)))
skamonkey@2943
   346
	{
skamonkey@2943
   347
		return pContext->ThrowNativeError("Client index %d is not valid", params[1]);
skamonkey@2943
   348
	}
skamonkey@2943
   349
skamonkey@2943
   350
	bool bByPlayer = (params[5] != 0);
skamonkey@2943
   351
	CBaseEntity *pAttacker = NULL;
skamonkey@2943
   352
	if (bByPlayer && !(pAttacker = UTIL_GetCBaseEntity(params[5], true)))
skamonkey@2943
   353
	{
skamonkey@2943
   354
		return pContext->ThrowNativeError("Attacker index %d is not valid", params[5]);
skamonkey@2943
   355
	}
skamonkey@2943
   356
skamonkey@2943
   357
	void *obj = (void *)((uint8_t *)pEntity + playerSharedOffset->actual_offset);
skamonkey@2943
   358
skamonkey@2943
   359
	unsigned char vstk[sizeof(void *) + 2*sizeof(float) + sizeof(int) + sizeof(CBaseEntity *)];
skamonkey@2943
   360
	unsigned char *vptr = vstk;
skamonkey@2943
   361
skamonkey@2943
   362
	*(void **)vptr = obj;
skamonkey@2943
   363
	vptr += sizeof(void *);
skamonkey@2943
   364
	*(float *)vptr = sp_ctof(params[2]);
skamonkey@2943
   365
	vptr += sizeof(float);
skamonkey@2943
   366
	*(float *)vptr = sp_ctof(params[3]);
skamonkey@2943
   367
	vptr += sizeof(float);
skamonkey@2943
   368
	*(int *)vptr = params[4];
skamonkey@2943
   369
	vptr += sizeof(int);
skamonkey@2943
   370
	*(CBaseEntity **)vptr = pAttacker;
skamonkey@2943
   371
skamonkey@2943
   372
	pWrapper->Execute(vstk, NULL);
skamonkey@2943
   373
skamonkey@2943
   374
	return 1;
skamonkey@2943
   375
}
skamonkey@2943
   376
skamonkey@2939
   377
cell_t TF2_SetPowerplayEnabled(IPluginContext *pContext, const cell_t *params)
skamonkey@2939
   378
{
skamonkey@2939
   379
	static ICallWrapper *pWrapper = NULL;
skamonkey@2939
   380
skamonkey@2939
   381
	// CTFPlayer::SetPowerPlayEnabled(bool)
skamonkey@2939
   382
	if (!pWrapper)
skamonkey@2939
   383
	{
skamonkey@2939
   384
		REGISTER_NATIVE_ADDR("SetPowerplayEnabled", 
skamonkey@2939
   385
			PassInfo pass[1]; \
skamonkey@2939
   386
			pass[0].flags = PASSFLAG_BYVAL; \
skamonkey@2939
   387
			pass[0].size = sizeof(bool); \
skamonkey@2939
   388
			pass[0].type = PassType_Basic; \
skamonkey@2939
   389
			pWrapper = g_pBinTools->CreateCall(addr, CallConv_ThisCall, NULL, pass, 1))
skamonkey@2939
   390
	}
skamonkey@2939
   391
skamonkey@2939
   392
	CBaseEntity *pEntity;
skamonkey@2939
   393
	if (!(pEntity = UTIL_GetCBaseEntity(params[1], true)))
skamonkey@2939
   394
	{
skamonkey@2939
   395
		return pContext->ThrowNativeError("Client index %d is not valid", params[1]);
skamonkey@2939
   396
	}
skamonkey@2939
   397
skamonkey@2939
   398
	bool bEnablePP = false;
skamonkey@2939
   399
	if (params[2] != 0)
skamonkey@2939
   400
	{
skamonkey@2939
   401
		bEnablePP = true;
skamonkey@2939
   402
	}
skamonkey@2939
   403
skamonkey@2939
   404
	unsigned char vstk[sizeof(void *) + sizeof(bool)];
skamonkey@2939
   405
	unsigned char *vptr = vstk;
skamonkey@2939
   406
skamonkey@2939
   407
	*(void **)vptr = (void *)pEntity;
skamonkey@2939
   408
	vptr += sizeof(void *);
skamonkey@2939
   409
	*(bool *)vptr = bEnablePP;
skamonkey@2939
   410
skamonkey@2939
   411
	pWrapper->Execute(vstk, NULL);
skamonkey@2939
   412
skamonkey@2939
   413
	return 1;
skamonkey@2939
   414
}
skamonkey@2939
   415
pred@1963
   416
cell_t TF2_Respawn(IPluginContext *pContext, const cell_t *params)
pred@1963
   417
{
pred@1963
   418
	static ICallWrapper *pWrapper = NULL;
pred@1963
   419
pred@1963
   420
	//CTFPlayer::ForceRespawn()
pred@1963
   421
pred@1963
   422
	if (!pWrapper)
pred@1963
   423
	{
pred@1963
   424
		int offset;
pred@1963
   425
pred@1963
   426
		if (!g_pGameConf->GetOffset("ForceRespawn", &offset))
pred@1963
   427
		{
pred@1963
   428
			return pContext->ThrowNativeError("Failed to locate function");
pred@1963
   429
		}
pred@1963
   430
pred@1963
   431
		pWrapper = g_pBinTools->CreateVCall(offset,
pred@1963
   432
											0,
pred@1963
   433
											0,
pred@1963
   434
											NULL,
pred@1963
   435
											NULL,
pred@1963
   436
											0);
pred@1963
   437
pred@1963
   438
		g_RegNatives.Register(pWrapper);
pred@1963
   439
	}
pred@1963
   440
pred@1963
   441
	CBaseEntity *pEntity;
pred@1963
   442
	if (!(pEntity = UTIL_GetCBaseEntity(params[1], true)))
pred@1963
   443
	{
pred@1963
   444
		return pContext->ThrowNativeError("Client index %d is not valid", params[1]);
pred@1963
   445
	}
pred@1963
   446
pred@1963
   447
	unsigned char vstk[sizeof(void *)];
pred@1963
   448
	unsigned char *vptr = vstk;
pred@1963
   449
pred@1963
   450
pred@1963
   451
	*(void **)vptr = (void *)pEntity;
pred@1963
   452
pred@1963
   453
	pWrapper->Execute(vstk, NULL);
pred@1963
   454
pred@1963
   455
	return 1;
pred@1963
   456
}
pred@1963
   457
skamonkey@2939
   458
cell_t TF2_Regenerate(IPluginContext *pContext, const cell_t *params)
skamonkey@2939
   459
{
skamonkey@2939
   460
	static ICallWrapper *pWrapper = NULL;
skamonkey@2939
   461
skamonkey@3606
   462
	//CTFPlayer::Regenerate( bool=true )
skamonkey@2939
   463
skamonkey@2939
   464
	if (!pWrapper)
skamonkey@2939
   465
	{
skamonkey@2939
   466
		REGISTER_NATIVE_ADDR("Regenerate", 
skamonkey@3606
   467
			PassInfo pass[1]; \
skamonkey@3606
   468
			pass[0].flags = PASSFLAG_BYVAL; \
skamonkey@3606
   469
			pass[0].size = sizeof(bool); \
skamonkey@3606
   470
			pass[0].type = PassType_Basic; \
skamonkey@3606
   471
			pWrapper = g_pBinTools->CreateCall(addr, CallConv_ThisCall, NULL, pass, 1))
skamonkey@2939
   472
	}
skamonkey@2939
   473
skamonkey@2939
   474
	CBaseEntity *pEntity;
skamonkey@2939
   475
	if (!(pEntity = UTIL_GetCBaseEntity(params[1], true)))
skamonkey@2939
   476
	{
skamonkey@2939
   477
		return pContext->ThrowNativeError("Client index %d is not valid", params[1]);
skamonkey@2939
   478
	}
skamonkey@3606
   479
	
skamonkey@3606
   480
	unsigned char vstk[sizeof(void *) + sizeof(bool)];
skamonkey@3606
   481
	unsigned char *vptr = vstk;
skamonkey@3606
   482
skamonkey@3606
   483
	*(void **)vptr = (void *)pEntity;
skamonkey@3606
   484
	vptr += sizeof(void *);
skamonkey@3606
   485
	*(bool *)vptr = true;
skamonkey@3606
   486
skamonkey@3606
   487
	pWrapper->Execute(vstk, NULL);
skamonkey@2939
   488
skamonkey@2939
   489
	return 1;
skamonkey@2939
   490
}
skamonkey@2939
   491
pred@1963
   492
cell_t TF2_GetResourceEntity(IPluginContext *pContext, const cell_t *params)
pred@1963
   493
{
pred@1963
   494
	return g_resourceEntity;
pred@1963
   495
}
pred@1963
   496
pred@1963
   497
cell_t TF2_GetClass(IPluginContext *pContext, const cell_t *params)
pred@1963
   498
{
pred@1963
   499
	char *str;
pred@1963
   500
	pContext->LocalToString(params[1], &str);
pred@1963
   501
pred@1963
   502
	return (cell_t)ClassnameToType(str);
pred@1963
   503
}
dvander@1945
   504
tf2@3147
   505
// native TF2_IsPlayerInDuel(client)
tf2@3147
   506
cell_t TF2_IsPlayerInDuel(IPluginContext *pContext, const cell_t *params)
tf2@3147
   507
{
tf2@3147
   508
	static ICallWrapper *pWrapper = NULL;
tf2@3147
   509
tf2@3147
   510
	// DuelMiniGame_IsPlayerInDuel(CTFPlayer *)
tf2@3147
   511
	if (!pWrapper)
tf2@3147
   512
	{
tf2@3147
   513
		REGISTER_NATIVE_ADDR("IsPlayerInDuel", 
tf2@3147
   514
			PassInfo pass[1]; \
tf2@3147
   515
			pass[0].flags = PASSFLAG_BYVAL; \
tf2@3147
   516
			pass[0].size = sizeof(CBaseEntity *); \
tf2@3147
   517
			pass[0].type = PassType_Basic; \
tf2@3147
   518
			PassInfo ret; \
tf2@3147
   519
			ret.flags = PASSFLAG_BYVAL; \
tf2@3147
   520
			ret.size = sizeof(bool); \
tf2@3147
   521
			ret.type = PassType_Basic; \
tf2@3147
   522
			pWrapper = g_pBinTools->CreateCall(addr, CallConv_Cdecl, &ret, pass, 1))
tf2@3147
   523
	}
tf2@3147
   524
tf2@3147
   525
	CBaseEntity *pPlayer;
tf2@3147
   526
	if (!(pPlayer = UTIL_GetCBaseEntity(params[1], true)))
tf2@3147
   527
	{
tf2@3147
   528
		return pContext->ThrowNativeError("Client index %d is not valid", params[1]);
tf2@3147
   529
	}
tf2@3147
   530
tf2@3147
   531
	unsigned char vstk[sizeof(CBaseEntity *)];
tf2@3147
   532
	unsigned char *vptr = vstk;
tf2@3147
   533
	*(CBaseEntity **)vptr = pPlayer;
tf2@3147
   534
tf2@3147
   535
	bool retValue;
tf2@3147
   536
	pWrapper->Execute(vstk, &retValue);
tf2@3147
   537
tf2@3147
   538
	return (retValue) ? 1 : 0;
tf2@3147
   539
}
tf2@3147
   540
dvander@1945
   541
sp_nativeinfo_t g_TFNatives[] = 
dvander@1945
   542
{
pred@1963
   543
	{"TF2_IgnitePlayer",			TF2_Burn},
pred@1963
   544
	{"TF2_SetPlayerInvuln",			TF2_Invuln},
pred@1963
   545
	{"TF2_RespawnPlayer",			TF2_Respawn},
pred@1963
   546
	{"TF2_DisguisePlayer",			TF2_Disguise},
pred@1963
   547
	{"TF2_RemovePlayerDisguise",	TF2_RemoveDisguise},
pred@1963
   548
	{"TF2_GetResourceEntity",		TF2_GetResourceEntity},
pred@1963
   549
	{"TF2_GetClass",				TF2_GetClass},
skamonkey@2939
   550
	{"TF2_RegeneratePlayer",		TF2_Regenerate},
skamonkey@2939
   551
	{"TF2_AddCondition",			TF2_AddCondition},
skamonkey@2939
   552
	{"TF2_RemoveCondition",			TF2_RemoveCondition},
skamonkey@2943
   553
	{"TF2_SetPlayerPowerPlay",		TF2_SetPowerplayEnabled},
skamonkey@2943
   554
	{"TF2_StunPlayer",				TF2_StunPlayer},
abkowald@3096
   555
	{"TF2_MakeBleed",				TF2_MakeBleed},
tf2@3147
   556
	{"TF2_IsPlayerInDuel",				TF2_IsPlayerInDuel},
dvander@1945
   557
	{NULL,							NULL}
dvander@1945
   558
};