core/smn_halflife.cpp
author David Anderson <dvander@alliedmods.net>
Mon Feb 26 09:21:08 2007 +0000 (2007-02-26)
changeset 539 fa7e8a232a18
parent 532 fe6bb91d79b1
child 554 acf114bd5fd6
permissions -rw-r--r--
fixed stupid export
dvander@530
     1
/**
dvander@530
     2
 * ===============================================================
dvander@530
     3
 * SourceMod (C)2004-2007 AlliedModders LLC.  All rights reserved.
dvander@530
     4
 * ===============================================================
dvander@530
     5
 *
dvander@530
     6
 * This file is not open source and may not be copied without explicit
dvander@530
     7
 * written permission of AlliedModders LLC.  This file may not be redistributed 
dvander@530
     8
 * in whole or significant part.
dvander@530
     9
 * For information, see LICENSE.txt or http://www.sourcemod.net/license.php
dvander@530
    10
 *
dvander@530
    11
 * Version: $Id$
dvander@530
    12
 */
dvander@530
    13
dvander@530
    14
#include "sm_globals.h"
dvander@532
    15
#include "sourcemod.h"
dvander@530
    16
#include "sourcemm_api.h"
dvander@532
    17
#include "CPlayerManager.h"
dvander@530
    18
dvander@530
    19
static cell_t SetRandomSeed(IPluginContext *pContext, const cell_t *params)
dvander@530
    20
{
dvander@530
    21
	engrandom->SetSeed(params[1]);
dvander@530
    22
dvander@530
    23
	return 1;
dvander@530
    24
}
dvander@530
    25
dvander@530
    26
static cell_t GetRandomFloat(IPluginContext *pContext, const cell_t *params)
dvander@530
    27
{
dvander@530
    28
	float fMin = sp_ctof(params[1]);
dvander@530
    29
	float fMax = sp_ctof(params[2]);
dvander@530
    30
dvander@530
    31
	float fRandom = engrandom->RandomFloat(fMin, fMax);
dvander@530
    32
dvander@530
    33
	return sp_ftoc(fRandom);
dvander@530
    34
}
dvander@530
    35
dvander@530
    36
static cell_t GetRandomInt(IPluginContext *pContext, const cell_t *params)
dvander@530
    37
{
dvander@530
    38
	return engrandom->RandomInt(params[1], params[2]);
dvander@530
    39
}
dvander@530
    40
dvander@532
    41
static cell_t IsMapValid(IPluginContext *pContext, const cell_t *params)
dvander@532
    42
{
dvander@532
    43
	char *map;
dvander@532
    44
	pContext->LocalToString(params[1], &map);
dvander@532
    45
dvander@532
    46
	return engine->IsMapValid(map);
dvander@532
    47
}
dvander@532
    48
dvander@532
    49
static cell_t IsDedicatedServer(IPluginContext *pContext, const cell_t *params)
dvander@532
    50
{
dvander@532
    51
	return engine->IsDedicatedServer();
dvander@532
    52
}
dvander@532
    53
dvander@532
    54
static cell_t GetEntityCount(IPluginContext *pContext, const cell_t *params)
dvander@532
    55
{
dvander@532
    56
	return engine->GetEntityCount();
dvander@532
    57
}
dvander@532
    58
dvander@532
    59
static cell_t IsValidEntity(IPluginContext *pContext, const cell_t *params)
dvander@532
    60
{
dvander@532
    61
	edict_t *pEdict = engine->PEntityOfEntIndex(params[1]);
dvander@532
    62
dvander@532
    63
	if (!pEdict)
dvander@532
    64
	{
dvander@532
    65
		return 0;
dvander@532
    66
	}
dvander@532
    67
dvander@532
    68
	/* Shouldn't be necessary... not sure though */
dvander@532
    69
	return pEdict->IsFree() ? 0 : 1;
dvander@532
    70
}
dvander@532
    71
dvander@532
    72
static cell_t CreateEdict(IPluginContext *pContext, const cell_t *params)
dvander@532
    73
{
dvander@532
    74
	edict_t *pEdict = engine->CreateEdict();
dvander@532
    75
dvander@532
    76
	if (!pEdict)
dvander@532
    77
	{
dvander@532
    78
		return 0;
dvander@532
    79
	}
dvander@532
    80
dvander@532
    81
	return engine->IndexOfEdict(pEdict);
dvander@532
    82
}
dvander@532
    83
dvander@532
    84
static cell_t RemoveEdict(IPluginContext *pContext, const cell_t *params)
dvander@532
    85
{
dvander@532
    86
	edict_t *pEdict = engine->PEntityOfEntIndex(params[1]);
dvander@532
    87
dvander@532
    88
	if (!pEdict)
dvander@532
    89
	{
dvander@532
    90
		return pContext->ThrowNativeError("Edict %d is not a valid edict", params[1]);
dvander@532
    91
	}
dvander@532
    92
dvander@532
    93
	engine->RemoveEdict(pEdict);
dvander@532
    94
dvander@532
    95
	return 1;
dvander@532
    96
}
dvander@532
    97
dvander@532
    98
static cell_t GetEngineTime(IPluginContext *pContext, const cell_t *params)
dvander@532
    99
{
dvander@532
   100
	float fTime = engine->Time();
dvander@532
   101
	return sp_ftoc(fTime);
dvander@532
   102
}
dvander@532
   103
dvander@532
   104
static cell_t GetGameTime(IPluginContext *pContext, const cell_t *params)
dvander@532
   105
{
dvander@532
   106
	return sp_ftoc(gpGlobals->curtime);
dvander@532
   107
}
dvander@532
   108
dvander@532
   109
static cell_t CreateFakeClient(IPluginContext *pContext, const cell_t *params)
dvander@532
   110
{
dvander@532
   111
	char *netname;
dvander@532
   112
dvander@532
   113
	pContext->LocalToString(params[1], &netname);
dvander@532
   114
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
dvander@532
   124
	return engine->IndexOfEdict(pEdict);
dvander@532
   125
}
dvander@532
   126
dvander@532
   127
static cell_t SetFakeClientConVar(IPluginContext *pContext, const cell_t *params)
dvander@532
   128
{
dvander@532
   129
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(params[1]);
dvander@532
   130
dvander@532
   131
	if (!pPlayer)
dvander@532
   132
	{
dvander@532
   133
		return pContext->ThrowNativeError("Player %d is not a valid player", params[1]);
dvander@532
   134
	}
dvander@532
   135
dvander@532
   136
	if (!pPlayer->IsConnected())
dvander@532
   137
	{
dvander@532
   138
		return pContext->ThrowNativeError("Player %d is not connected", params[1]);
dvander@532
   139
	}
dvander@532
   140
dvander@532
   141
	if (!pPlayer->IsFakeClient())
dvander@532
   142
	{
dvander@532
   143
		return pContext->ThrowNativeError("Player %d is not a fake client", params[1]);
dvander@532
   144
	}
dvander@532
   145
dvander@532
   146
	char *cvar, *value;
dvander@532
   147
dvander@532
   148
	pContext->LocalToString(params[2], &cvar);
dvander@532
   149
	pContext->LocalToString(params[3], &value);
dvander@532
   150
dvander@532
   151
	engine->SetFakeClientConVarValue(pPlayer->GetEdict(), cvar, value);
dvander@532
   152
dvander@532
   153
	return 1;
dvander@532
   154
}
dvander@532
   155
dvander@532
   156
static cell_t GetGameDescription(IPluginContext *pContext, const cell_t *params)
dvander@532
   157
{
dvander@532
   158
	const char *description;
dvander@532
   159
dvander@532
   160
	if (params[3])
dvander@532
   161
	{
dvander@532
   162
		description = gamedll->GetGameDescription();
dvander@532
   163
	} else {
dvander@532
   164
		description = SERVER_CALL(GetGameDescription)();
dvander@532
   165
	}
dvander@532
   166
dvander@532
   167
	size_t numBytes;
dvander@532
   168
	
dvander@532
   169
	pContext->StringToLocalUTF8(params[1], params[2], description, &numBytes);
dvander@532
   170
dvander@532
   171
	return numBytes;
dvander@532
   172
}
dvander@532
   173
dvander@532
   174
static cell_t GetMaxEntities(IPluginContext *pContext, const cell_t *params)
dvander@532
   175
{
dvander@532
   176
	return gpGlobals->maxEntities;
dvander@532
   177
}
dvander@532
   178
dvander@532
   179
static cell_t GetCurrentMap(IPluginContext *pContext, const cell_t *params)
dvander@532
   180
{
dvander@532
   181
	size_t bytes;
dvander@532
   182
	pContext->StringToLocalUTF8(params[1], params[2], STRING(gpGlobals->mapname), &bytes);
dvander@532
   183
	return bytes;
dvander@532
   184
}
dvander@532
   185
dvander@530
   186
REGISTER_NATIVES(halflifeNatives)
dvander@530
   187
{
dvander@532
   188
	{"CreateEdict",				CreateEdict},
dvander@532
   189
	{"CreateFakeClient",		CreateFakeClient},
dvander@532
   190
	{"GetCurrentMap",			GetCurrentMap},
dvander@532
   191
	{"GetEngineTime",			GetEngineTime},
dvander@532
   192
	{"GetEntityCount",			GetEntityCount},
dvander@532
   193
	{"GetGameDescription",		GetGameDescription},
dvander@532
   194
	{"GetGameTime",				GetGameTime},
dvander@532
   195
	{"GetMaxEntities",			GetMaxEntities},
dvander@530
   196
	{"GetRandomFloat",			GetRandomFloat},
dvander@530
   197
	{"GetRandomInt",			GetRandomInt},
dvander@532
   198
	{"IsDedicatedServer",		IsDedicatedServer},
dvander@532
   199
	{"IsMapValid",				IsMapValid},
dvander@532
   200
	{"IsValidEntity",			IsValidEntity},
dvander@532
   201
	{"RemoveEdict",				RemoveEdict},
dvander@532
   202
	{"SetFakeClientConVar",		SetFakeClientConVar},
dvander@532
   203
	{"SetRandomSeed",			SetRandomSeed},
dvander@530
   204
	{NULL,						NULL},
dvander@530
   205
};