dvander@530: /** ds@653: * vim: set ts=4 : dvander@530: * =============================================================== dvander@530: * SourceMod (C)2004-2007 AlliedModders LLC. All rights reserved. dvander@530: * =============================================================== dvander@530: * dvander@530: * This file is not open source and may not be copied without explicit dvander@530: * written permission of AlliedModders LLC. This file may not be redistributed dvander@530: * in whole or significant part. dvander@530: * For information, see LICENSE.txt or http://www.sourcemod.net/license.php dvander@530: * dvander@530: * Version: $Id$ dvander@530: */ dvander@530: dvander@530: #include "sm_globals.h" dvander@532: #include "sourcemod.h" dvander@530: #include "sourcemm_api.h" dvander@591: #include "PlayerManager.h" dvander@530: dvander@530: static cell_t SetRandomSeed(IPluginContext *pContext, const cell_t *params) dvander@530: { dvander@530: engrandom->SetSeed(params[1]); dvander@530: dvander@530: return 1; dvander@530: } dvander@530: dvander@530: static cell_t GetRandomFloat(IPluginContext *pContext, const cell_t *params) dvander@530: { dvander@530: float fMin = sp_ctof(params[1]); dvander@530: float fMax = sp_ctof(params[2]); dvander@530: dvander@530: float fRandom = engrandom->RandomFloat(fMin, fMax); dvander@530: dvander@530: return sp_ftoc(fRandom); dvander@530: } dvander@530: dvander@530: static cell_t GetRandomInt(IPluginContext *pContext, const cell_t *params) dvander@530: { dvander@530: return engrandom->RandomInt(params[1], params[2]); dvander@530: } dvander@530: dvander@532: static cell_t IsMapValid(IPluginContext *pContext, const cell_t *params) dvander@532: { dvander@532: char *map; dvander@532: pContext->LocalToString(params[1], &map); dvander@532: dvander@532: return engine->IsMapValid(map); dvander@532: } dvander@532: dvander@532: static cell_t IsDedicatedServer(IPluginContext *pContext, const cell_t *params) dvander@532: { dvander@532: return engine->IsDedicatedServer(); dvander@532: } dvander@532: dvander@532: static cell_t GetEngineTime(IPluginContext *pContext, const cell_t *params) dvander@532: { dvander@532: float fTime = engine->Time(); dvander@532: return sp_ftoc(fTime); dvander@532: } dvander@532: dvander@532: static cell_t GetGameTime(IPluginContext *pContext, const cell_t *params) dvander@532: { dvander@532: return sp_ftoc(gpGlobals->curtime); dvander@532: } dvander@532: dvander@532: static cell_t CreateFakeClient(IPluginContext *pContext, const cell_t *params) dvander@532: { dvander@532: char *netname; dvander@532: dvander@532: pContext->LocalToString(params[1], &netname); dvander@532: dvander@532: edict_t *pEdict = engine->CreateFakeClient(netname); dvander@532: dvander@532: /* :TODO: does the engine fire forwards for us and whatnot? no idea... */ dvander@532: dvander@532: if (!pEdict) dvander@532: { dvander@532: return 0; dvander@532: } dvander@532: dvander@532: return engine->IndexOfEdict(pEdict); dvander@532: } dvander@532: dvander@532: static cell_t SetFakeClientConVar(IPluginContext *pContext, const cell_t *params) dvander@532: { dvander@532: CPlayer *pPlayer = g_Players.GetPlayerByIndex(params[1]); dvander@532: dvander@532: if (!pPlayer) dvander@532: { dvander@532: return pContext->ThrowNativeError("Player %d is not a valid player", params[1]); dvander@532: } dvander@532: dvander@532: if (!pPlayer->IsConnected()) dvander@532: { dvander@532: return pContext->ThrowNativeError("Player %d is not connected", params[1]); dvander@532: } dvander@532: dvander@532: if (!pPlayer->IsFakeClient()) dvander@532: { dvander@532: return pContext->ThrowNativeError("Player %d is not a fake client", params[1]); dvander@532: } dvander@532: dvander@532: char *cvar, *value; dvander@532: dvander@532: pContext->LocalToString(params[2], &cvar); dvander@532: pContext->LocalToString(params[3], &value); dvander@532: dvander@532: engine->SetFakeClientConVarValue(pPlayer->GetEdict(), cvar, value); dvander@532: dvander@532: return 1; dvander@532: } dvander@532: dvander@532: static cell_t GetGameDescription(IPluginContext *pContext, const cell_t *params) dvander@532: { dvander@532: const char *description; dvander@532: dvander@532: if (params[3]) dvander@532: { dvander@532: description = gamedll->GetGameDescription(); dvander@532: } else { dvander@532: description = SERVER_CALL(GetGameDescription)(); dvander@532: } dvander@532: dvander@532: size_t numBytes; dvander@532: dvander@532: pContext->StringToLocalUTF8(params[1], params[2], description, &numBytes); dvander@532: dvander@532: return numBytes; dvander@532: } dvander@532: dvander@532: static cell_t GetCurrentMap(IPluginContext *pContext, const cell_t *params) dvander@532: { dvander@532: size_t bytes; dvander@532: pContext->StringToLocalUTF8(params[1], params[2], STRING(gpGlobals->mapname), &bytes); dvander@532: return bytes; dvander@532: } dvander@532: faluco@656: static cell_t PrecacheModel(IPluginContext *pContext, const cell_t *params) faluco@656: { faluco@656: char *model; faluco@656: pContext->LocalToString(params[1], &model); faluco@656: faluco@656: return engine->PrecacheModel(model, params[2] ? true : false); faluco@656: } faluco@656: faluco@656: static cell_t PrecacheSentenceFile(IPluginContext *pContext, const cell_t *params) faluco@656: { faluco@656: char *sentencefile; faluco@656: pContext->LocalToString(params[1], &sentencefile); faluco@656: faluco@656: return engine->PrecacheSentenceFile(sentencefile, params[2] ? true : false); faluco@656: } faluco@656: faluco@656: static cell_t PrecacheDecal(IPluginContext *pContext, const cell_t *params) faluco@656: { faluco@656: char *decal; faluco@656: pContext->LocalToString(params[1], &decal); faluco@656: faluco@656: return engine->PrecacheDecal(decal, params[2] ? true : false); faluco@656: } faluco@656: faluco@656: static cell_t PrecacheGeneric(IPluginContext *pContext, const cell_t *params) faluco@656: { faluco@656: char *generic; faluco@656: pContext->LocalToString(params[1], &generic); faluco@656: faluco@656: return engine->PrecacheGeneric(generic, params[2] ? true : false); faluco@656: } faluco@656: faluco@656: static cell_t IsModelPrecached(IPluginContext *pContext, const cell_t *params) faluco@656: { faluco@656: char *model; faluco@656: pContext->LocalToString(params[1], &model); faluco@656: faluco@656: return engine->IsModelPrecached(model) ? 1 : 0; faluco@656: } faluco@656: faluco@656: static cell_t IsDecalPrecached(IPluginContext *pContext, const cell_t *params) faluco@656: { faluco@656: char *decal; faluco@656: pContext->LocalToString(params[1], &decal); faluco@656: faluco@656: return engine->IsDecalPrecached(decal) ? 1 : 0; faluco@656: } faluco@656: faluco@656: static cell_t IsGenericPrecached(IPluginContext *pContext, const cell_t *params) faluco@656: { faluco@656: char *generic; faluco@656: pContext->LocalToString(params[1], &generic); faluco@656: faluco@656: return engine->IsGenericPrecached(generic) ? 1 : 0; faluco@656: } faluco@656: faluco@656: static cell_t PrecacheSound(IPluginContext *pContext, const cell_t *params) faluco@656: { faluco@656: char *sample; faluco@656: pContext->LocalToString(params[1], &sample); faluco@656: faluco@656: return enginesound->PrecacheSound(sample, params[2] ? true : false) ? 1 : 0; faluco@656: } faluco@656: faluco@656: static cell_t IsSoundPrecached(IPluginContext *pContext, const cell_t *params) faluco@656: { faluco@656: char *sample; faluco@656: pContext->LocalToString(params[1], &sample); faluco@656: faluco@656: return enginesound->IsSoundPrecached(sample) ? 1 : 0; faluco@656: } faluco@656: faluco@659: static cell_t FakeClientCommand(IPluginContext *pContext, const cell_t *params) faluco@659: { faluco@659: CPlayer *pPlayer = g_Players.GetPlayerByIndex(params[1]); faluco@659: faluco@659: if (!pPlayer) faluco@659: { faluco@659: return pContext->ThrowNativeError("Player %d is not a valid player", params[1]); faluco@659: } faluco@659: faluco@659: if (!pPlayer->IsConnected()) faluco@659: { faluco@659: return pContext->ThrowNativeError("Player %d is not connected", params[1]); faluco@659: } faluco@659: faluco@659: char buffer[256]; faluco@659: g_SourceMod.FormatString(buffer, sizeof(buffer)-1, pContext, params, 2); faluco@659: faluco@659: serverpluginhelpers->ClientCommand(pPlayer->GetEdict(), buffer); faluco@659: faluco@659: return 1; faluco@659: } faluco@659: dvander@530: REGISTER_NATIVES(halflifeNatives) dvander@530: { dvander@532: {"CreateFakeClient", CreateFakeClient}, dvander@532: {"GetCurrentMap", GetCurrentMap}, dvander@532: {"GetEngineTime", GetEngineTime}, dvander@532: {"GetGameDescription", GetGameDescription}, dvander@532: {"GetGameTime", GetGameTime}, dvander@530: {"GetRandomFloat", GetRandomFloat}, dvander@530: {"GetRandomInt", GetRandomInt}, dvander@532: {"IsDedicatedServer", IsDedicatedServer}, dvander@532: {"IsMapValid", IsMapValid}, dvander@532: {"SetFakeClientConVar", SetFakeClientConVar}, dvander@532: {"SetRandomSeed", SetRandomSeed}, faluco@656: {"PrecacheModel", PrecacheModel}, faluco@656: {"PrecacheSentenceFile", PrecacheSentenceFile}, faluco@656: {"PrecacheDecal", PrecacheDecal}, faluco@656: {"PrecacheGeneric", PrecacheGeneric}, faluco@656: {"IsModelPrecached", IsModelPrecached}, faluco@656: {"IsDecalPrecached", IsDecalPrecached}, faluco@656: {"IsGenericPrecached", IsGenericPrecached}, faluco@656: {"PrecacheSound", PrecacheSound}, faluco@656: {"IsSoundPrecached", IsSoundPrecached}, faluco@659: {"FakeClientCommand", FakeClientCommand}, dvander@530: {NULL, NULL}, dvander@530: };