core/smn_halflife.cpp
author David Anderson <dvander@alliedmods.net>
Fri Aug 30 10:16:28 2013 -0700 (2013-08-30)
changeset 4109 10eb68d668af
parent 4023 3c83ddef5985
child 4141 8ff66ae5ffcc
permissions -rw-r--r--
Use Refcounted to manage to NativeEntry (bug 5852 part 4, r=ds).
dvander@530
     1
/**
ds@653
     2
 * vim: set ts=4 :
ds@1330
     3
 * =============================================================================
dvander@1231
     4
 * SourceMod
ds@3099
     5
 * Copyright (C) 2004-2010 AlliedModders LLC.  All rights reserved.
ds@1330
     6
 * =============================================================================
dvander@530
     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@1231
    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@1231
    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@1231
    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@530
    28
 *
dvander@530
    29
 * Version: $Id$
dvander@530
    30
 */
dvander@530
    31
dvander@530
    32
#include "sm_globals.h"
dvander@532
    33
#include "sourcemod.h"
dvander@530
    34
#include "sourcemm_api.h"
dvander@591
    35
#include "PlayerManager.h"
ds@873
    36
#include "HalfLife2.h"
ds@874
    37
dvander@530
    38
static cell_t SetRandomSeed(IPluginContext *pContext, const cell_t *params)
dvander@530
    39
{
dvander@530
    40
	engrandom->SetSeed(params[1]);
dvander@530
    41
dvander@530
    42
	return 1;
dvander@530
    43
}
dvander@530
    44
dvander@530
    45
static cell_t GetRandomFloat(IPluginContext *pContext, const cell_t *params)
dvander@530
    46
{
dvander@530
    47
	float fMin = sp_ctof(params[1]);
dvander@530
    48
	float fMax = sp_ctof(params[2]);
dvander@530
    49
dvander@530
    50
	float fRandom = engrandom->RandomFloat(fMin, fMax);
dvander@530
    51
dvander@530
    52
	return sp_ftoc(fRandom);
dvander@530
    53
}
dvander@530
    54
dvander@530
    55
static cell_t GetRandomInt(IPluginContext *pContext, const cell_t *params)
dvander@530
    56
{
dvander@530
    57
	return engrandom->RandomInt(params[1], params[2]);
dvander@530
    58
}
dvander@530
    59
dvander@532
    60
static cell_t IsMapValid(IPluginContext *pContext, const cell_t *params)
dvander@532
    61
{
dvander@532
    62
	char *map;
dvander@532
    63
	pContext->LocalToString(params[1], &map);
dvander@532
    64
skamonkey@3789
    65
	return g_HL2.IsMapValid(map);
dvander@532
    66
}
dvander@532
    67
dvander@532
    68
static cell_t IsDedicatedServer(IPluginContext *pContext, const cell_t *params)
dvander@532
    69
{
dvander@532
    70
	return engine->IsDedicatedServer();
dvander@532
    71
}
dvander@532
    72
dvander@532
    73
static cell_t GetEngineTime(IPluginContext *pContext, const cell_t *params)
dvander@532
    74
{
skamonkey@3961
    75
#if SOURCE_ENGINE >= SE_NUCLEARDAWN
pred@2850
    76
	float fTime = Plat_FloatTime();
fyrenmoo@2851
    77
#else
fyrenmoo@2851
    78
	float fTime = engine->Time();
fyrenmoo@2851
    79
#endif
pred@2850
    80
	
dvander@532
    81
	return sp_ftoc(fTime);
dvander@532
    82
}
dvander@532
    83
dvander@532
    84
static cell_t GetGameTime(IPluginContext *pContext, const cell_t *params)
dvander@532
    85
{
dvander@532
    86
	return sp_ftoc(gpGlobals->curtime);
dvander@532
    87
}
dvander@532
    88
aangione@3540
    89
static cell_t GetGameTickCount(IPluginContext *pContext, const cell_t *params)
aangione@3540
    90
{
aangione@3540
    91
	return gpGlobals->tickcount;
aangione@3540
    92
}
aangione@3540
    93
dvander@532
    94
static cell_t CreateFakeClient(IPluginContext *pContext, const cell_t *params)
dvander@532
    95
{
skamonkey@3401
    96
	if (!g_SourceMod.IsMapRunning())
skamonkey@3401
    97
	{
skamonkey@3401
    98
		return pContext->ThrowNativeError("Cannot create fakeclient when no map is active");
skamonkey@3401
    99
	}
skamonkey@3401
   100
dvander@532
   101
	char *netname;
dvander@532
   102
dvander@532
   103
	pContext->LocalToString(params[1], &netname);
dvander@532
   104
skamonkey@3913
   105
#if SOURCE_ENGINE == SE_DOTA
skamonkey@3942
   106
	int index = engine->CreateFakeClient(netname).Get();
skamonkey@3913
   107
	
skamonkey@3913
   108
	if (index == -1)
skamonkey@3913
   109
	{
skamonkey@3913
   110
		return 0;
skamonkey@3913
   111
	}
skamonkey@3913
   112
skamonkey@3913
   113
	return index;
skamonkey@3913
   114
#else
dvander@532
   115
	edict_t *pEdict = engine->CreateFakeClient(netname);
dvander@532
   116
dvander@532
   117
	/* :TODO: does the engine fire forwards for us and whatnot? no idea... */
dvander@532
   118
dvander@532
   119
	if (!pEdict)
dvander@532
   120
	{
dvander@532
   121
		return 0;
dvander@532
   122
	}
dvander@532
   123
ds@2400
   124
	return IndexOfEdict(pEdict);
skamonkey@3913
   125
#endif
dvander@532
   126
}
dvander@532
   127
dvander@532
   128
static cell_t SetFakeClientConVar(IPluginContext *pContext, const cell_t *params)
dvander@532
   129
{
dvander@532
   130
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(params[1]);
dvander@532
   131
dvander@532
   132
	if (!pPlayer)
dvander@532
   133
	{
ds@994
   134
		return pContext->ThrowNativeError("Client index %d is invalid", params[1]);
dvander@532
   135
	}
dvander@532
   136
dvander@532
   137
	if (!pPlayer->IsConnected())
dvander@532
   138
	{
ds@994
   139
		return pContext->ThrowNativeError("Client %d is not connected", params[1]);
dvander@532
   140
	}
dvander@532
   141
dvander@532
   142
	if (!pPlayer->IsFakeClient())
dvander@532
   143
	{
ds@994
   144
		return pContext->ThrowNativeError("Client %d is not a fake client", params[1]);
dvander@532
   145
	}
dvander@532
   146
dvander@532
   147
	char *cvar, *value;
dvander@532
   148
dvander@532
   149
	pContext->LocalToString(params[2], &cvar);
dvander@532
   150
	pContext->LocalToString(params[3], &value);
dvander@532
   151
skamonkey@3913
   152
#if SOURCE_ENGINE == SE_DOTA
skamonkey@3913
   153
	engine->SetFakeClientConVarValue(pPlayer->GetIndex(), cvar, value);
skamonkey@3913
   154
#else
dvander@532
   155
	engine->SetFakeClientConVarValue(pPlayer->GetEdict(), cvar, value);
skamonkey@3913
   156
#endif
dvander@532
   157
dvander@532
   158
	return 1;
dvander@532
   159
}
dvander@532
   160
dvander@532
   161
static cell_t GetGameDescription(IPluginContext *pContext, const cell_t *params)
dvander@532
   162
{
dvander@532
   163
	const char *description;
dvander@532
   164
dvander@532
   165
	if (params[3])
dvander@532
   166
	{
dvander@532
   167
		description = gamedll->GetGameDescription();
dvander@532
   168
	} else {
dvander@532
   169
		description = SERVER_CALL(GetGameDescription)();
dvander@532
   170
	}
dvander@532
   171
dvander@532
   172
	size_t numBytes;
dvander@532
   173
	
dvander@532
   174
	pContext->StringToLocalUTF8(params[1], params[2], description, &numBytes);
dvander@532
   175
dvander@532
   176
	return numBytes;
dvander@532
   177
}
dvander@532
   178
ds@721
   179
static cell_t GetGameFolderName(IPluginContext *pContext, const cell_t *params)
ds@721
   180
{
ds@729
   181
	const char *name = g_SourceMod.GetGameFolderName();
ds@721
   182
	size_t numBytes;
ds@721
   183
ds@721
   184
	pContext->StringToLocalUTF8(params[1], params[2], name, &numBytes);
ds@721
   185
ds@721
   186
	return numBytes;
ds@721
   187
}
ds@721
   188
dvander@1604
   189
/* Useless comment to bump the build */
dvander@532
   190
static cell_t GetCurrentMap(IPluginContext *pContext, const cell_t *params)
dvander@532
   191
{
dvander@532
   192
	size_t bytes;
dvander@532
   193
	pContext->StringToLocalUTF8(params[1], params[2], STRING(gpGlobals->mapname), &bytes);
dvander@532
   194
	return bytes;
dvander@532
   195
}
dvander@532
   196
faluco@656
   197
static cell_t PrecacheModel(IPluginContext *pContext, const cell_t *params)
faluco@656
   198
{
faluco@656
   199
	char *model;
faluco@656
   200
	pContext->LocalToString(params[1], &model);
faluco@656
   201
faluco@656
   202
	return engine->PrecacheModel(model, params[2] ? true : false);
faluco@656
   203
}
faluco@656
   204
faluco@656
   205
static cell_t PrecacheSentenceFile(IPluginContext *pContext, const cell_t *params)
faluco@656
   206
{
faluco@656
   207
	char *sentencefile;
faluco@656
   208
	pContext->LocalToString(params[1], &sentencefile);
faluco@656
   209
faluco@656
   210
	return engine->PrecacheSentenceFile(sentencefile, params[2] ? true : false);
faluco@656
   211
}
faluco@656
   212
faluco@656
   213
static cell_t PrecacheDecal(IPluginContext *pContext, const cell_t *params)
faluco@656
   214
{
faluco@656
   215
	char *decal;
faluco@656
   216
	pContext->LocalToString(params[1], &decal);
faluco@656
   217
faluco@656
   218
	return engine->PrecacheDecal(decal, params[2] ? true : false);
faluco@656
   219
}
faluco@656
   220
faluco@656
   221
static cell_t PrecacheGeneric(IPluginContext *pContext, const cell_t *params)
faluco@656
   222
{
faluco@656
   223
	char *generic;
faluco@656
   224
	pContext->LocalToString(params[1], &generic);
faluco@656
   225
faluco@656
   226
	return engine->PrecacheGeneric(generic, params[2] ? true : false);
faluco@656
   227
}
faluco@656
   228
faluco@656
   229
static cell_t IsModelPrecached(IPluginContext *pContext, const cell_t *params)
faluco@656
   230
{
faluco@656
   231
	char *model;
faluco@656
   232
	pContext->LocalToString(params[1], &model);
faluco@656
   233
faluco@656
   234
	return engine->IsModelPrecached(model) ? 1 : 0;
faluco@656
   235
}
faluco@656
   236
faluco@656
   237
static cell_t IsDecalPrecached(IPluginContext *pContext, const cell_t *params)
faluco@656
   238
{
faluco@656
   239
	char *decal;
faluco@656
   240
	pContext->LocalToString(params[1], &decal);
faluco@656
   241
faluco@656
   242
	return engine->IsDecalPrecached(decal) ? 1 : 0;
faluco@656
   243
}
faluco@656
   244
faluco@656
   245
static cell_t IsGenericPrecached(IPluginContext *pContext, const cell_t *params)
faluco@656
   246
{
faluco@656
   247
	char *generic;
faluco@656
   248
	pContext->LocalToString(params[1], &generic);
faluco@656
   249
faluco@656
   250
	return engine->IsGenericPrecached(generic) ? 1 : 0;
faluco@656
   251
}
faluco@656
   252
faluco@656
   253
static cell_t PrecacheSound(IPluginContext *pContext, const cell_t *params)
faluco@656
   254
{
faluco@656
   255
	char *sample;
faluco@656
   256
	pContext->LocalToString(params[1], &sample);
faluco@656
   257
faluco@656
   258
	return enginesound->PrecacheSound(sample, params[2] ? true : false) ? 1 : 0;
faluco@656
   259
}
faluco@656
   260
faluco@656
   261
static cell_t IsSoundPrecached(IPluginContext *pContext, const cell_t *params)
faluco@656
   262
{
faluco@656
   263
	char *sample;
faluco@656
   264
	pContext->LocalToString(params[1], &sample);
faluco@656
   265
faluco@656
   266
	return enginesound->IsSoundPrecached(sample) ? 1 : 0;
faluco@656
   267
}
faluco@656
   268
faluco@682
   269
static cell_t smn_CreateDialog(IPluginContext *pContext, const cell_t *params)
faluco@682
   270
{
skamonkey@3854
   271
#if SOURCE_ENGINE == SE_DOTA
skamonkey@3854
   272
	return pContext->ThrowNativeError("CreateDialog is not supported on this game");
skamonkey@3854
   273
#else
faluco@682
   274
	KeyValues *pKV;
faluco@682
   275
	HandleError herr;
faluco@682
   276
	Handle_t hndl = static_cast<Handle_t>(params[2]);
faluco@682
   277
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(params[1]);
faluco@682
   278
faluco@682
   279
	if (!pPlayer)
faluco@682
   280
	{
ds@994
   281
		return pContext->ThrowNativeError("Client index %d is invalid", params[1]);
faluco@682
   282
	}
faluco@682
   283
ds@891
   284
	if (!pPlayer->IsInGame())
faluco@682
   285
	{
ds@891
   286
		return pContext->ThrowNativeError("Client %d is not in game", params[1]);
faluco@682
   287
	}
faluco@682
   288
faluco@682
   289
	pKV = g_SourceMod.ReadKeyValuesHandle(hndl, &herr, true);
faluco@682
   290
	if (herr != HandleError_None)
faluco@682
   291
	{
faluco@682
   292
		return pContext->ThrowNativeError("Invalid key value handle %x (error %d)", hndl, herr);
faluco@682
   293
	}
faluco@682
   294
dvander@1581
   295
	serverpluginhelpers->CreateMessage(pPlayer->GetEdict(), 
dvander@1581
   296
		static_cast<DIALOG_TYPE>(params[3]), 
dvander@1581
   297
		pKV, 
dvander@1581
   298
		vsp_interface);
faluco@682
   299
faluco@682
   300
	return 1;
skamonkey@3854
   301
#endif // DOTA
faluco@682
   302
}
faluco@682
   303
ds@873
   304
static cell_t PrintToChat(IPluginContext *pContext, const cell_t *params)
ds@873
   305
{
ds@873
   306
	int client = params[1];
ds@873
   307
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
ds@873
   308
ds@873
   309
	if (!pPlayer)
ds@873
   310
	{
ds@994
   311
		return pContext->ThrowNativeError("Client index %d is invalid", client);
ds@873
   312
	}
ds@873
   313
ds@891
   314
	if (!pPlayer->IsInGame())
ds@873
   315
	{
ds@892
   316
		return pContext->ThrowNativeError("Client %d is not in game", client);
ds@873
   317
	}
ds@873
   318
dvander@1011
   319
	g_SourceMod.SetGlobalTarget(client);
dvander@1011
   320
ds@899
   321
	char buffer[192];
ds@873
   322
	g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, 2);
ds@873
   323
dvander@1017
   324
	/* Check for an error before printing to the client */
dvander@2175
   325
	if (pContext->GetLastNativeError() != SP_ERROR_NONE)
dvander@1017
   326
	{
dvander@1017
   327
		return 0;
dvander@1017
   328
	}
dvander@1017
   329
dvander@1132
   330
	if (!g_HL2.TextMsg(client, HUD_PRINTTALK, buffer))
dvander@1132
   331
	{
dvander@1132
   332
		return pContext->ThrowNativeError("Could not send a usermessage");
dvander@1132
   333
	}
ds@873
   334
ds@873
   335
	return 1;
ds@873
   336
}
ds@873
   337
ds@873
   338
static cell_t PrintCenterText(IPluginContext *pContext, const cell_t *params)
ds@873
   339
{
ds@873
   340
	int client = params[1];
ds@873
   341
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
ds@873
   342
ds@873
   343
	if (!pPlayer)
ds@873
   344
	{
ds@994
   345
		return pContext->ThrowNativeError("Client index %d is invalid", client);
ds@873
   346
	}
ds@873
   347
ds@891
   348
	if (!pPlayer->IsInGame())
ds@873
   349
	{
ds@892
   350
		return pContext->ThrowNativeError("Client %d is not in game", client);
ds@873
   351
	}
ds@873
   352
dvander@1011
   353
	g_SourceMod.SetGlobalTarget(client);
dvander@1011
   354
ds@899
   355
	char buffer[192];
ds@873
   356
	g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, 2);
ds@873
   357
dvander@1017
   358
	/* Check for an error before printing to the client */
dvander@2175
   359
	if (pContext->GetLastNativeError() != SP_ERROR_NONE)
dvander@1017
   360
	{
dvander@1017
   361
		return 0;
dvander@1017
   362
	}
dvander@1017
   363
dvander@1132
   364
	if (!g_HL2.TextMsg(client, HUD_PRINTCENTER, buffer))
dvander@1132
   365
	{
dvander@1132
   366
		return pContext->ThrowNativeError("Could not send a usermessage");
dvander@1132
   367
	}
ds@873
   368
ds@873
   369
	return 1;
ds@873
   370
}
ds@873
   371
faluco@1218
   372
static cell_t PrintHintText(IPluginContext *pContext, const cell_t *params)
faluco@1218
   373
{
faluco@1218
   374
	int client = params[1];
faluco@1218
   375
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
faluco@1218
   376
faluco@1218
   377
	if (!pPlayer)
faluco@1218
   378
	{
faluco@1218
   379
		return pContext->ThrowNativeError("Client index %d is invalid", client);
faluco@1218
   380
	}
faluco@1218
   381
faluco@1218
   382
	if (!pPlayer->IsInGame())
faluco@1218
   383
	{
faluco@1218
   384
		return pContext->ThrowNativeError("Client %d is not in game", client);
faluco@1218
   385
	}
faluco@1218
   386
faluco@1218
   387
	g_SourceMod.SetGlobalTarget(client);
faluco@1218
   388
faluco@1218
   389
	char buffer[192];
faluco@1218
   390
	g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, 2);
faluco@1218
   391
faluco@1218
   392
	/* Check for an error before printing to the client */
dvander@2175
   393
	if (pContext->GetLastNativeError() != SP_ERROR_NONE)
faluco@1218
   394
	{
faluco@1218
   395
		return 0;
faluco@1218
   396
	}
faluco@1218
   397
teame06@1264
   398
	if (!g_HL2.HintTextMsg(client, buffer))
faluco@1218
   399
	{
faluco@1218
   400
		return pContext->ThrowNativeError("Could not send a usermessage");
faluco@1218
   401
	}
faluco@1218
   402
faluco@1218
   403
	return 1;
faluco@1218
   404
}
faluco@1218
   405
faluco@1218
   406
static cell_t ShowVGUIPanel(IPluginContext *pContext, const cell_t *params)
faluco@1218
   407
{
faluco@1218
   408
	HandleError herr;
faluco@1218
   409
	char *name;
faluco@1218
   410
	KeyValues *pKV = NULL;
faluco@1218
   411
	int client = params[1];
faluco@1218
   412
	Handle_t hndl = static_cast<Handle_t>(params[3]);
faluco@1218
   413
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
faluco@1218
   414
faluco@1218
   415
	if (!pPlayer)
faluco@1218
   416
	{
faluco@1218
   417
		return pContext->ThrowNativeError("Client index %d is invalid", client);
faluco@1218
   418
	}
faluco@1218
   419
faluco@1218
   420
	if (!pPlayer->IsInGame())
faluco@1218
   421
	{
faluco@1218
   422
		return pContext->ThrowNativeError("Client %d is not in game", client);
faluco@1218
   423
	}
faluco@1218
   424
faluco@1218
   425
	if (hndl != BAD_HANDLE)
faluco@1218
   426
	{
faluco@1218
   427
		pKV = g_SourceMod.ReadKeyValuesHandle(hndl, &herr, true);
faluco@1218
   428
		if (herr != HandleError_None)
faluco@1218
   429
		{
faluco@1218
   430
			return pContext->ThrowNativeError("Invalid key value handle %x (error %d)", hndl, herr);
faluco@1218
   431
		}
faluco@1218
   432
	}
faluco@1218
   433
faluco@1218
   434
	pContext->LocalToString(params[2], &name);
faluco@1218
   435
faluco@1218
   436
	if (!g_HL2.ShowVGUIMenu(client, name, pKV, (params[4]) ? true : false))
faluco@1218
   437
	{
faluco@1218
   438
		return pContext->ThrowNativeError("Could not send a usermessage");
faluco@1218
   439
	}
faluco@1218
   440
faluco@1218
   441
	return 1;
faluco@1218
   442
}
faluco@1218
   443
dvander@1621
   444
static cell_t smn_IsPlayerAlive(IPluginContext *pContext, const cell_t *params)
dvander@1621
   445
{
dvander@1621
   446
	CPlayer *player = g_Players.GetPlayerByIndex(params[1]);
dvander@1621
   447
	if (player == NULL)
dvander@1621
   448
	{
dvander@1621
   449
		return pContext->ThrowNativeError("Invalid client index %d", params[1]);
dvander@1621
   450
	}
dvander@1621
   451
	else if (!player->IsInGame())
dvander@1621
   452
	{
dvander@1621
   453
		return pContext->ThrowNativeError("Client %d is not in game", params[1]);
dvander@1621
   454
	}
dvander@1621
   455
dvander@1621
   456
	unsigned int state = player->GetLifeState();
dvander@1621
   457
dvander@1621
   458
	if (state == PLAYER_LIFE_UNKNOWN)
dvander@1621
   459
	{
dvander@1621
   460
		return pContext->ThrowNativeError("\"IsPlayerAlive\" not supported by this mod");
dvander@1621
   461
	}
dvander@1621
   462
	else if (state == PLAYER_LIFE_ALIVE)
dvander@1621
   463
	{
dvander@1621
   464
		return 1;
dvander@1621
   465
	}
dvander@1621
   466
	else
dvander@1621
   467
	{
dvander@1621
   468
		return 0;
dvander@1621
   469
	}
dvander@1621
   470
}
dvander@1621
   471
dvander@1837
   472
static cell_t GuessSDKVersion(IPluginContext *pContext, const cell_t *params)
dvander@1837
   473
{
dvander@2846
   474
#if defined METAMOD_PLAPI_VERSION || PLAPI_VERSION >= 11
dvander@1837
   475
	int version = g_SMAPI->GetSourceEngineBuild();
dvander@1837
   476
dvander@2846
   477
	switch (version)
dvander@1837
   478
	{
dvander@2846
   479
	case SOURCE_ENGINE_ORIGINAL:
dvander@2846
   480
		return 10;
dvander@2846
   481
	case SOURCE_ENGINE_EPISODEONE:
dvander@1837
   482
		return 20;
dvander@2846
   483
fyrenmoo@2857
   484
# if defined METAMOD_PLAPI_VERSION
dvander@2846
   485
	/* Newer games. */
dvander@2846
   486
	case SOURCE_ENGINE_DARKMESSIAH:
dvander@2846
   487
		return 15;
dvander@2846
   488
	case SOURCE_ENGINE_ORANGEBOX:
dvander@1837
   489
		return 30;
skamonkey@3180
   490
	case SOURCE_ENGINE_BLOODYGOODTIME:
skamonkey@3180
   491
		return 32;
skamonkey@3373
   492
	case SOURCE_ENGINE_EYE:
skamonkey@3427
   493
		return 33;
skamonkey@3613
   494
	case SOURCE_ENGINE_CSS:
skamonkey@3613
   495
		return 34;
skamonkey@4023
   496
	case SOURCE_ENGINE_ORANGEBOXVALVE_DEPRECATED:
skamonkey@3961
   497
	case SOURCE_ENGINE_HL2DM:
skamonkey@3961
   498
	case SOURCE_ENGINE_DODS:
skamonkey@3961
   499
	case SOURCE_ENGINE_TF2:
fyrenmoo@2889
   500
		return 35;
dvander@2846
   501
	case SOURCE_ENGINE_LEFT4DEAD:
fyrenmoo@2731
   502
		return 40;
skamonkey@3961
   503
	case SOURCE_ENGINE_NUCLEARDAWN:
fyrenmoo@2851
   504
	case SOURCE_ENGINE_LEFT4DEAD2:
fyrenmoo@2851
   505
		return 50;
ds@3099
   506
	case SOURCE_ENGINE_ALIENSWARM:
ds@3099
   507
		return 60;
skamonkey@3515
   508
	case SOURCE_ENGINE_PORTAL2:
skamonkey@3515
   509
		return 70;
skamonkey@3515
   510
	case SOURCE_ENGINE_CSGO:
skamonkey@3515
   511
		return 80;
skamonkey@3853
   512
	case SOURCE_ENGINE_DOTA:
skamonkey@3853
   513
		return 90;
dvander@2846
   514
# endif
fyrenmoo@2731
   515
	}
dvander@1837
   516
#else
dvander@1837
   517
	if (g_HL2.IsOriginalEngine())
dvander@1837
   518
	{
dvander@1837
   519
		return 10;
dvander@1837
   520
	}
dvander@1837
   521
	else
dvander@1837
   522
	{
dvander@1837
   523
		return 20;
dvander@1837
   524
	}
dvander@1837
   525
#endif
dvander@1837
   526
dvander@1837
   527
	return 0;
dvander@1837
   528
}
dvander@1837
   529
skamonkey@3961
   530
static cell_t GetEngineVersion(IPluginContext *pContext, const cell_t *params)
skamonkey@3961
   531
{
skamonkey@3961
   532
	return g_SMAPI->GetSourceEngineBuild();
skamonkey@3961
   533
}
skamonkey@3961
   534
pred@2746
   535
static cell_t IndexToReference(IPluginContext *pContext, const cell_t *params)
pred@2746
   536
{
pred@2746
   537
	if (params[1] >= NUM_ENT_ENTRIES || params[1] < 0)
pred@2746
   538
	{
pred@2746
   539
		return pContext->ThrowNativeError("Invalid entity index %i", params[1]);
pred@2746
   540
	}
pred@2746
   541
pred@2746
   542
	return g_HL2.IndexToReference(params[1]);
pred@2746
   543
}
pred@2746
   544
pred@2746
   545
static cell_t ReferenceToIndex(IPluginContext *pContext, const cell_t *params)
pred@2746
   546
{
pred@2746
   547
	return g_HL2.ReferenceToIndex(params[1]);
pred@2746
   548
}
pred@2746
   549
pred@2746
   550
static cell_t ReferenceToBCompatRef(IPluginContext *pContext, const cell_t *params)
pred@2746
   551
{
pred@2746
   552
	return g_HL2.ReferenceToBCompatRef(params[1]);
pred@2746
   553
}
pred@2746
   554
dvander@530
   555
REGISTER_NATIVES(halflifeNatives)
dvander@530
   556
{
dvander@532
   557
	{"CreateFakeClient",		CreateFakeClient},
dvander@532
   558
	{"GetCurrentMap",			GetCurrentMap},
dvander@532
   559
	{"GetEngineTime",			GetEngineTime},
dvander@532
   560
	{"GetGameDescription",		GetGameDescription},
ds@721
   561
	{"GetGameFolderName",		GetGameFolderName},
dvander@532
   562
	{"GetGameTime",				GetGameTime},
aangione@3540
   563
	{"GetGameTickCount",		GetGameTickCount},
dvander@530
   564
	{"GetRandomFloat",			GetRandomFloat},
dvander@530
   565
	{"GetRandomInt",			GetRandomInt},
dvander@532
   566
	{"IsDedicatedServer",		IsDedicatedServer},
dvander@532
   567
	{"IsMapValid",				IsMapValid},
dvander@532
   568
	{"SetFakeClientConVar",		SetFakeClientConVar},
dvander@532
   569
	{"SetRandomSeed",			SetRandomSeed},
faluco@656
   570
	{"PrecacheModel",			PrecacheModel},
faluco@656
   571
	{"PrecacheSentenceFile",	PrecacheSentenceFile},
faluco@656
   572
	{"PrecacheDecal",			PrecacheDecal},
faluco@656
   573
	{"PrecacheGeneric",			PrecacheGeneric},
faluco@656
   574
	{"IsModelPrecached",		IsModelPrecached},
faluco@656
   575
	{"IsDecalPrecached",		IsDecalPrecached},
faluco@656
   576
	{"IsGenericPrecached",		IsGenericPrecached},
faluco@656
   577
	{"PrecacheSound",			PrecacheSound},
faluco@656
   578
	{"IsSoundPrecached",		IsSoundPrecached},
faluco@682
   579
	{"CreateDialog",			smn_CreateDialog},
ds@873
   580
	{"PrintToChat",				PrintToChat},
ds@873
   581
	{"PrintCenterText",			PrintCenterText},
faluco@1218
   582
	{"PrintHintText",			PrintHintText},
faluco@1218
   583
	{"ShowVGUIPanel",			ShowVGUIPanel},
dvander@1621
   584
	{"IsPlayerAlive",			smn_IsPlayerAlive},
dvander@1837
   585
	{"GuessSDKVersion",			GuessSDKVersion},
skamonkey@3961
   586
	{"GetEngineVersion",		GetEngineVersion},
pred@2746
   587
	{"EntIndexToEntRef",		IndexToReference},
pred@2746
   588
	{"EntRefToEntIndex",		ReferenceToIndex},
pred@2746
   589
	{"MakeCompatEntRef",		ReferenceToBCompatRef},
dvander@530
   590
	{NULL,						NULL},
dvander@530
   591
};