extensions/sdktools/tenatives.cpp
author Borja Ferrer <faluco@alliedmods.net>
Sat Aug 04 00:09:10 2007 +0000 (2007-08-04)
changeset 1262 843e9ed0ff29
parent 1255 e3db1a9eb578
child 1330 ab94316bb52b
permissions -rw-r--r--
fixed amb728, precache slap sounds
faluco@1031
     1
/**
faluco@1031
     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
 * ================================================================
faluco@1031
     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
 * 
faluco@1031
    12
 * This program is distributed in the hope that it will be useful,
faluco@1031
    13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
faluco@1031
    14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
faluco@1031
    15
 * GNU General Public License for more details.
dvander@1233
    16
 *
faluco@1031
    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>.
faluco@1031
    29
 *
faluco@1031
    30
 * Version: $Id$
faluco@1031
    31
 */
faluco@1031
    32
faluco@1031
    33
#include "tempents.h"
faluco@1031
    34
#include "CellRecipientFilter.h"
faluco@1255
    35
#include <IForwardSys.h>
faluco@1255
    36
faluco@1255
    37
SH_DECL_HOOK5_void(IVEngineServer, PlaybackTempEntity, SH_NOATTRIB, 0, IRecipientFilter &, float, const void *, const SendTable *, int);
faluco@1031
    38
faluco@1031
    39
CellRecipientFilter g_TERecFilter;
faluco@1031
    40
TempEntityInfo *g_CurrentTE = NULL;
faluco@1255
    41
int g_TEPlayers[256];
faluco@1255
    42
faluco@1255
    43
/*************************
faluco@1255
    44
*                        *
faluco@1255
    45
* Temp Entity Hook Class *
faluco@1255
    46
*                        *
faluco@1255
    47
**************************/
faluco@1255
    48
faluco@1255
    49
void TempEntHooks::Initialize()
faluco@1255
    50
{
faluco@1255
    51
	m_TEHooks = adtfactory->CreateBasicTrie();
faluco@1255
    52
}
faluco@1255
    53
faluco@1255
    54
void TempEntHooks::Shutdown()
faluco@1255
    55
{
faluco@1255
    56
	List<TEHookInfo *>::iterator iter;
faluco@1255
    57
	for (iter=m_HookInfo.begin(); iter!=m_HookInfo.end(); iter++)
faluco@1255
    58
	{
faluco@1255
    59
		delete (*iter);
faluco@1255
    60
	}
faluco@1255
    61
	if (m_HookCount)
faluco@1255
    62
	{
faluco@1255
    63
		m_HookCount = 1;
faluco@1255
    64
		_DecRefCounter();
faluco@1255
    65
	}
faluco@1255
    66
	m_TEHooks->Destroy();
faluco@1255
    67
}
faluco@1255
    68
faluco@1255
    69
void TempEntHooks::_IncRefCounter()
faluco@1255
    70
{
faluco@1255
    71
	if (m_HookCount++ == 0)
faluco@1255
    72
	{
faluco@1255
    73
		SH_ADD_HOOK_MEMFUNC(IVEngineServer, PlaybackTempEntity, engine, this, &TempEntHooks::OnPlaybackTempEntity, false);
faluco@1255
    74
	}
faluco@1255
    75
}
faluco@1255
    76
faluco@1255
    77
void TempEntHooks::_DecRefCounter()
faluco@1255
    78
{
faluco@1255
    79
	if (--m_HookCount == 0)
faluco@1255
    80
	{
faluco@1255
    81
		SH_REMOVE_HOOK_MEMFUNC(IVEngineServer, PlaybackTempEntity, engine, this, &TempEntHooks::OnPlaybackTempEntity, false);
faluco@1255
    82
	}
faluco@1255
    83
}
faluco@1255
    84
faluco@1255
    85
size_t TempEntHooks::_FillInPlayers(int *pl_array, IRecipientFilter *pFilter)
faluco@1255
    86
{
faluco@1255
    87
	size_t size = static_cast<size_t>(pFilter->GetRecipientCount());
faluco@1255
    88
faluco@1255
    89
	for (size_t i=0; i<size; i++)
faluco@1255
    90
	{
faluco@1255
    91
		pl_array[i] = pFilter->GetRecipientIndex(i);
faluco@1255
    92
	}
faluco@1255
    93
faluco@1255
    94
	return size;
faluco@1255
    95
}
faluco@1255
    96
faluco@1255
    97
bool TempEntHooks::AddHook(const char *name, IPluginFunction *pFunc)
faluco@1255
    98
{
faluco@1255
    99
	TEHookInfo *pInfo;
faluco@1255
   100
faluco@1255
   101
	if (m_TEHooks->Retrieve(name, reinterpret_cast<void **>(&pInfo)))
faluco@1255
   102
	{
faluco@1255
   103
		pInfo->lst.push_back(pFunc);
faluco@1255
   104
	} else {
faluco@1255
   105
		TempEntityInfo *te;
faluco@1255
   106
		if (!(te=g_TEManager.GetTempEntityInfo(name)))
faluco@1255
   107
		{
faluco@1255
   108
			return false;
faluco@1255
   109
		}
faluco@1255
   110
faluco@1255
   111
		pInfo = new TEHookInfo;
faluco@1255
   112
		pInfo->te = te;
faluco@1255
   113
		pInfo->lst.push_back(pFunc);
faluco@1255
   114
faluco@1255
   115
		m_TEHooks->Insert(name, reinterpret_cast<void *>(pInfo));
faluco@1255
   116
		m_HookInfo.push_back(pInfo);
faluco@1255
   117
	}
faluco@1255
   118
faluco@1255
   119
	_IncRefCounter();
faluco@1255
   120
faluco@1255
   121
	return true;
faluco@1255
   122
}
faluco@1255
   123
faluco@1255
   124
bool TempEntHooks::RemoveHook(const char *name, IPluginFunction *pFunc)
faluco@1255
   125
{
faluco@1255
   126
	TEHookInfo *pInfo;
faluco@1255
   127
faluco@1255
   128
	if (m_TEHooks->Retrieve(name, reinterpret_cast<void **>(&pInfo)))
faluco@1255
   129
	{
faluco@1255
   130
		List<IPluginFunction *>::iterator iter;
faluco@1255
   131
		if ((iter=pInfo->lst.find(pFunc)) != pInfo->lst.end())
faluco@1255
   132
		{
faluco@1255
   133
			pInfo->lst.erase(iter);
faluco@1255
   134
			if (pInfo->lst.empty())
faluco@1255
   135
			{
faluco@1255
   136
				m_HookInfo.remove(pInfo);
faluco@1255
   137
				m_TEHooks->Delete(name);
faluco@1255
   138
				delete pInfo;
faluco@1255
   139
			}
faluco@1255
   140
			_DecRefCounter();
faluco@1255
   141
		} else {
faluco@1255
   142
			return false;
faluco@1255
   143
		}
faluco@1255
   144
	} else {
faluco@1255
   145
		return false;
faluco@1255
   146
	}
faluco@1255
   147
faluco@1255
   148
	return true;
faluco@1255
   149
}
faluco@1255
   150
faluco@1255
   151
void TempEntHooks::OnPlaybackTempEntity(IRecipientFilter &filter, float delay, const void *pSender, const SendTable *pST, int classID)
faluco@1255
   152
{
faluco@1255
   153
	TEHookInfo *pInfo;
faluco@1255
   154
	const char *name = g_TEManager.GetNameFromThisPtr(const_cast<void *>(pSender));
faluco@1255
   155
faluco@1255
   156
	if (m_TEHooks->Retrieve(name, reinterpret_cast<void **>(&pInfo)))
faluco@1255
   157
	{
faluco@1255
   158
		List<IPluginFunction *>::iterator iter;
faluco@1255
   159
		IPluginFunction *pFunc;
faluco@1255
   160
		size_t size;
faluco@1255
   161
		cell_t res = static_cast<ResultType>(Pl_Continue);
faluco@1255
   162
faluco@1255
   163
		TempEntityInfo *oldinfo = g_CurrentTE;
faluco@1255
   164
		g_CurrentTE = pInfo->te;
faluco@1255
   165
		size = _FillInPlayers(g_TEPlayers, &filter);
faluco@1255
   166
faluco@1255
   167
		for (iter=pInfo->lst.begin(); iter!=pInfo->lst.end(); iter++)
faluco@1255
   168
		{
faluco@1255
   169
			pFunc = (*iter);
faluco@1255
   170
			pFunc->PushString(name);
faluco@1255
   171
			pFunc->PushArray(g_TEPlayers, size);
faluco@1255
   172
			pFunc->PushCell(size);
faluco@1255
   173
			pFunc->PushFloat(delay);
faluco@1255
   174
			pFunc->Execute(&res);
faluco@1255
   175
faluco@1255
   176
			if (res != Pl_Continue)
faluco@1255
   177
			{
faluco@1255
   178
				g_CurrentTE = oldinfo;
faluco@1255
   179
				RETURN_META(MRES_SUPERCEDE);
faluco@1255
   180
			}
faluco@1255
   181
		}
faluco@1255
   182
faluco@1255
   183
		g_CurrentTE = oldinfo;
faluco@1255
   184
		RETURN_META(MRES_IGNORED);
faluco@1255
   185
	}
faluco@1255
   186
}
faluco@1255
   187
faluco@1255
   188
/**********************
faluco@1255
   189
*                     *
faluco@1255
   190
* Temp Entity Natives *
faluco@1255
   191
*                     *
faluco@1255
   192
***********************/
faluco@1255
   193
faluco@1255
   194
TempEntHooks s_TempEntHooks;
faluco@1031
   195
faluco@1031
   196
static cell_t smn_TEStart(IPluginContext *pContext, const cell_t *params)
faluco@1031
   197
{
faluco@1031
   198
	if (!g_TEManager.IsAvailable())
faluco@1031
   199
	{
faluco@1031
   200
		return pContext->ThrowNativeError("TempEntity System unsupported or not available, file a bug report");
faluco@1031
   201
	}
faluco@1031
   202
faluco@1031
   203
	char *name;
faluco@1031
   204
	pContext->LocalToString(params[1], &name);
faluco@1031
   205
faluco@1031
   206
	g_CurrentTE = g_TEManager.GetTempEntityInfo(name);
faluco@1031
   207
	if (!g_CurrentTE)
faluco@1031
   208
	{
faluco@1031
   209
		return pContext->ThrowNativeError("Invalid TempEntity name: \"%s\"", name);
faluco@1031
   210
	}
faluco@1031
   211
faluco@1031
   212
	return 1;
faluco@1031
   213
}
faluco@1031
   214
faluco@1031
   215
static cell_t smn_TEWriteNum(IPluginContext *pContext, const cell_t *params)
faluco@1031
   216
{
faluco@1031
   217
	if (!g_TEManager.IsAvailable())
faluco@1031
   218
	{
faluco@1031
   219
		return pContext->ThrowNativeError("TempEntity System unsupported or not available, file a bug report");
faluco@1031
   220
	}
faluco@1031
   221
	if (!g_CurrentTE)
faluco@1031
   222
	{
faluco@1031
   223
		return pContext->ThrowNativeError("No TempEntity call is in progress");
faluco@1031
   224
	}
faluco@1031
   225
faluco@1031
   226
	char *prop;
faluco@1031
   227
	pContext->LocalToString(params[1], &prop);
faluco@1031
   228
faluco@1031
   229
	if (!g_CurrentTE->TE_SetEntData(prop, params[2]))
faluco@1031
   230
	{
faluco@1031
   231
		return pContext->ThrowNativeError("Temp entity property \"%s\" not found", prop);
faluco@1031
   232
	}
faluco@1031
   233
faluco@1031
   234
	return 1;
faluco@1031
   235
}
faluco@1031
   236
faluco@1255
   237
static cell_t smn_TEReadNum(IPluginContext *pContext, const cell_t *params)
faluco@1255
   238
{
faluco@1255
   239
	if (!g_TEManager.IsAvailable())
faluco@1255
   240
	{
faluco@1255
   241
		return pContext->ThrowNativeError("TempEntity System unsupported or not available, file a bug report");
faluco@1255
   242
	}
faluco@1255
   243
	if (!g_CurrentTE)
faluco@1255
   244
	{
faluco@1255
   245
		return pContext->ThrowNativeError("No TempEntity call is in progress");
faluco@1255
   246
	}
faluco@1255
   247
faluco@1255
   248
	char *prop;
faluco@1255
   249
	int val;
faluco@1255
   250
	pContext->LocalToString(params[1], &prop);
faluco@1255
   251
faluco@1255
   252
	if (!g_CurrentTE->TE_GetEntData(prop, &val))
faluco@1255
   253
	{
faluco@1255
   254
		return pContext->ThrowNativeError("Temp entity property \"%s\" not found", prop);
faluco@1255
   255
	}
faluco@1255
   256
faluco@1255
   257
	return val;
faluco@1255
   258
}
faluco@1255
   259
faluco@1031
   260
static cell_t smn_TE_WriteFloat(IPluginContext *pContext, const cell_t *params)
faluco@1031
   261
{
faluco@1031
   262
	if (!g_TEManager.IsAvailable())
faluco@1031
   263
	{
faluco@1031
   264
		return pContext->ThrowNativeError("TempEntity System unsupported or not available, file a bug report");
faluco@1031
   265
	}
faluco@1031
   266
	if (!g_CurrentTE)
faluco@1031
   267
	{
faluco@1031
   268
		return pContext->ThrowNativeError("No TempEntity call is in progress");
faluco@1031
   269
	}
faluco@1031
   270
faluco@1031
   271
	char *prop;
faluco@1031
   272
	pContext->LocalToString(params[1], &prop);
faluco@1031
   273
faluco@1031
   274
	if (!g_CurrentTE->TE_SetEntDataFloat(prop, sp_ctof(params[2])))
faluco@1031
   275
	{
faluco@1031
   276
		return pContext->ThrowNativeError("Temp entity property \"%s\" not found", prop);
faluco@1031
   277
	}
faluco@1031
   278
faluco@1031
   279
	return 1;
faluco@1031
   280
}
faluco@1031
   281
faluco@1255
   282
static cell_t smn_TE_ReadFloat(IPluginContext *pContext, const cell_t *params)
faluco@1255
   283
{
faluco@1255
   284
	if (!g_TEManager.IsAvailable())
faluco@1255
   285
	{
faluco@1255
   286
		return pContext->ThrowNativeError("TempEntity System unsupported or not available, file a bug report");
faluco@1255
   287
	}
faluco@1255
   288
	if (!g_CurrentTE)
faluco@1255
   289
	{
faluco@1255
   290
		return pContext->ThrowNativeError("No TempEntity call is in progress");
faluco@1255
   291
	}
faluco@1255
   292
faluco@1255
   293
	char *prop;
faluco@1255
   294
	float val;
faluco@1255
   295
	pContext->LocalToString(params[1], &prop);
faluco@1255
   296
faluco@1255
   297
	if (!g_CurrentTE->TE_GetEntDataFloat(prop, &val))
faluco@1255
   298
	{
faluco@1255
   299
		return pContext->ThrowNativeError("Temp entity property \"%s\" not found", prop);
faluco@1255
   300
	}
faluco@1255
   301
faluco@1255
   302
	return sp_ftoc(val);
faluco@1255
   303
}
faluco@1255
   304
faluco@1031
   305
static cell_t smn_TEWriteVector(IPluginContext *pContext, const cell_t *params)
faluco@1031
   306
{
faluco@1031
   307
	if (!g_TEManager.IsAvailable())
faluco@1031
   308
	{
faluco@1031
   309
		return pContext->ThrowNativeError("TempEntity System unsupported or not available, file a bug report");
faluco@1031
   310
	}
faluco@1031
   311
	if (!g_CurrentTE)
faluco@1031
   312
	{
faluco@1031
   313
		return pContext->ThrowNativeError("No TempEntity call is in progress");
faluco@1031
   314
	}
faluco@1031
   315
faluco@1031
   316
	char *prop;
faluco@1031
   317
	pContext->LocalToString(params[1], &prop);
faluco@1031
   318
faluco@1031
   319
	cell_t *addr;
faluco@1031
   320
	pContext->LocalToPhysAddr(params[2], &addr);
faluco@1031
   321
	float vec[3] = {sp_ctof(addr[0]), sp_ctof(addr[1]), sp_ctof(addr[2])};
faluco@1031
   322
faluco@1031
   323
	if (!g_CurrentTE->TE_SetEntDataVector(prop, vec))
faluco@1031
   324
	{
faluco@1031
   325
		return pContext->ThrowNativeError("Temp entity property \"%s\" not found", prop);
faluco@1031
   326
	}
faluco@1031
   327
faluco@1031
   328
	return 1;
faluco@1031
   329
}
faluco@1031
   330
faluco@1255
   331
static cell_t smn_TEReadVector(IPluginContext *pContext, const cell_t *params)
faluco@1255
   332
{
faluco@1255
   333
	if (!g_TEManager.IsAvailable())
faluco@1255
   334
	{
faluco@1255
   335
		return pContext->ThrowNativeError("TempEntity System unsupported or not available, file a bug report");
faluco@1255
   336
	}
faluco@1255
   337
	if (!g_CurrentTE)
faluco@1255
   338
	{
faluco@1255
   339
		return pContext->ThrowNativeError("No TempEntity call is in progress");
faluco@1255
   340
	}
faluco@1255
   341
faluco@1255
   342
	char *prop;
faluco@1255
   343
	pContext->LocalToString(params[1], &prop);
faluco@1255
   344
faluco@1255
   345
	cell_t *addr;
faluco@1255
   346
	float vec[3];
faluco@1255
   347
	pContext->LocalToPhysAddr(params[2], &addr);
faluco@1255
   348
faluco@1255
   349
	if (!g_CurrentTE->TE_GetEntDataVector(prop, vec))
faluco@1255
   350
	{
faluco@1255
   351
		return pContext->ThrowNativeError("Temp entity property \"%s\" not found", prop);
faluco@1255
   352
	}
faluco@1255
   353
faluco@1255
   354
	addr[0] = sp_ftoc(vec[0]);
faluco@1255
   355
	addr[1] = sp_ftoc(vec[1]);
faluco@1255
   356
	addr[2] = sp_ftoc(vec[2]);
faluco@1255
   357
faluco@1255
   358
	return 1;
faluco@1255
   359
}
faluco@1255
   360
faluco@1039
   361
static cell_t smn_TEWriteFloatArray(IPluginContext *pContext, const cell_t *params)
faluco@1039
   362
{
faluco@1039
   363
	if (!g_TEManager.IsAvailable())
faluco@1039
   364
	{
faluco@1039
   365
		return pContext->ThrowNativeError("TempEntity System unsupported or not available, file a bug report");
faluco@1039
   366
	}
faluco@1039
   367
	if (!g_CurrentTE)
faluco@1039
   368
	{
faluco@1039
   369
		return pContext->ThrowNativeError("No TempEntity call is in progress");
faluco@1039
   370
	}
faluco@1039
   371
faluco@1039
   372
	char *prop;
faluco@1039
   373
	pContext->LocalToString(params[1], &prop);
faluco@1039
   374
faluco@1039
   375
	cell_t *addr;
faluco@1039
   376
	pContext->LocalToPhysAddr(params[2], &addr);
faluco@1039
   377
faluco@1039
   378
	if (!g_CurrentTE->TE_SetEntDataFloatArray(prop, addr, params[3]))
faluco@1039
   379
	{
faluco@1039
   380
		return pContext->ThrowNativeError("Temp entity property \"%s\" not found", prop);
faluco@1039
   381
	}
faluco@1039
   382
faluco@1039
   383
	return 1;
faluco@1039
   384
}
faluco@1039
   385
faluco@1031
   386
static cell_t smn_TESend(IPluginContext *pContext, const cell_t *params)
faluco@1031
   387
{
faluco@1031
   388
	if (!g_TEManager.IsAvailable())
faluco@1031
   389
	{
faluco@1031
   390
		return pContext->ThrowNativeError("TempEntity System unsupported or not available, file a bug report");
faluco@1031
   391
	}
faluco@1031
   392
	if (!g_CurrentTE)
faluco@1031
   393
	{
faluco@1031
   394
		return pContext->ThrowNativeError("No TempEntity call is in progress");
faluco@1031
   395
	}
faluco@1031
   396
faluco@1031
   397
	cell_t *cl_array;
faluco@1031
   398
	pContext->LocalToPhysAddr(params[1], &cl_array);
faluco@1031
   399
faluco@1031
   400
	g_TERecFilter.Reset();
faluco@1031
   401
	g_TERecFilter.Initialize(cl_array, params[2]);
faluco@1031
   402
faluco@1031
   403
	g_CurrentTE->Send(g_TERecFilter, sp_ctof(params[3]));
faluco@1031
   404
	g_CurrentTE = NULL;
faluco@1031
   405
faluco@1031
   406
	return 1;
faluco@1031
   407
}
faluco@1031
   408
faluco@1031
   409
static cell_t smn_TEIsValidProp(IPluginContext *pContext, const cell_t *params)
faluco@1031
   410
{
faluco@1031
   411
	if (!g_TEManager.IsAvailable())
faluco@1031
   412
	{
faluco@1031
   413
		return pContext->ThrowNativeError("TempEntity System unsupported or not available, file a bug report");
faluco@1031
   414
	}
faluco@1031
   415
	if (!g_CurrentTE)
faluco@1031
   416
	{
faluco@1031
   417
		return pContext->ThrowNativeError("No TempEntity call is in progress");
faluco@1031
   418
	}
faluco@1031
   419
faluco@1031
   420
	char *prop;
faluco@1031
   421
	pContext->LocalToString(params[1], &prop);
faluco@1031
   422
faluco@1031
   423
	return g_CurrentTE->IsValidProp(prop) ? 1 : 0;
faluco@1031
   424
}
faluco@1031
   425
faluco@1255
   426
static cell_t smn_AddTempEntHook(IPluginContext *pContext, const cell_t *params)
faluco@1255
   427
{
faluco@1255
   428
	char *name;
faluco@1255
   429
	IPluginFunction *pFunc;
faluco@1255
   430
faluco@1262
   431
	if (!g_TEManager.IsAvailable())
faluco@1262
   432
	{
faluco@1262
   433
		return pContext->ThrowNativeError("TempEntity System unsupported or not available, file a bug report");
faluco@1262
   434
	}
faluco@1262
   435
faluco@1255
   436
	pContext->LocalToString(params[1], &name);
faluco@1255
   437
	pFunc = pContext->GetFunctionById(params[2]);
faluco@1255
   438
	if (!pFunc)
faluco@1255
   439
	{
faluco@1255
   440
		return pContext->ThrowNativeError("Invalid function id (%X)", params[2]);
faluco@1255
   441
	}
faluco@1255
   442
faluco@1255
   443
	if (!s_TempEntHooks.AddHook(name, pFunc))
faluco@1255
   444
	{
faluco@1255
   445
		return pContext->ThrowNativeError("Invalid TempEntity name: \"%s\"", name);
faluco@1255
   446
	}
faluco@1255
   447
faluco@1255
   448
	return 1;
faluco@1255
   449
}
faluco@1255
   450
faluco@1255
   451
static cell_t smn_RemoveTempEntHook(IPluginContext *pContext, const cell_t *params)
faluco@1255
   452
{
faluco@1255
   453
	char *name;
faluco@1255
   454
	IPluginFunction *pFunc;
faluco@1255
   455
faluco@1262
   456
	if (!g_TEManager.IsAvailable())
faluco@1262
   457
	{
faluco@1262
   458
		return pContext->ThrowNativeError("TempEntity System unsupported or not available, file a bug report");
faluco@1262
   459
	}
faluco@1262
   460
faluco@1255
   461
	pContext->LocalToString(params[1], &name);
faluco@1255
   462
	pFunc = pContext->GetFunctionById(params[2]);
faluco@1255
   463
	if (!pFunc)
faluco@1255
   464
	{
faluco@1255
   465
		return pContext->ThrowNativeError("Invalid function id (%X)", params[2]);
faluco@1255
   466
	}
faluco@1255
   467
faluco@1255
   468
	if (!s_TempEntHooks.RemoveHook(name, pFunc))
faluco@1255
   469
	{
faluco@1255
   470
		return pContext->ThrowNativeError("Invalid hooked TempEntity name or function");
faluco@1255
   471
	}
faluco@1255
   472
faluco@1255
   473
	return 1;
faluco@1255
   474
}
faluco@1255
   475
faluco@1031
   476
sp_nativeinfo_t g_TENatives[] = 
faluco@1031
   477
{
faluco@1031
   478
	{"TE_Start",				smn_TEStart},
faluco@1031
   479
	{"TE_WriteNum",				smn_TEWriteNum},
faluco@1255
   480
	{"TE_ReadNum",				smn_TEReadNum},
faluco@1031
   481
	{"TE_WriteFloat",			smn_TE_WriteFloat},
faluco@1255
   482
	{"TE_ReadFloat",			smn_TE_ReadFloat},
faluco@1031
   483
	{"TE_WriteVector",			smn_TEWriteVector},
faluco@1255
   484
	{"TE_ReadVector",			smn_TEReadVector},
faluco@1031
   485
	{"TE_WriteAngles",			smn_TEWriteVector},
faluco@1031
   486
	{"TE_Send",					smn_TESend},
faluco@1031
   487
	{"TE_IsValidProp",			smn_TEIsValidProp},
faluco@1039
   488
	{"TE_WriteFloatArray",		smn_TEWriteFloatArray},
faluco@1255
   489
	{"AddTempEntHook",			smn_AddTempEntHook},
faluco@1255
   490
	{"RemoveTempEntHook",		smn_RemoveTempEntHook},
faluco@1031
   491
	{NULL,						NULL}
faluco@1031
   492
};