Updated some CS:GO gamedata.
3 * =============================================================================
5 * Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
6 * =============================================================================
8 * This program is free software; you can redistribute it and/or modify it under
9 * the terms of the GNU General Public License, version 3.0, as published by the
10 * Free Software Foundation.
12 * This program is distributed in the hope that it will be useful, but WITHOUT
13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
17 * You should have received a copy of the GNU General Public License along with
18 * this program. If not, see <http://www.gnu.org/licenses/>.
20 * As a special exception, AlliedModders LLC gives you permission to link the
21 * code of this program (as well as its derivative works) to "Half-Life 2," the
22 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
23 * by the Valve Corporation. You must obey the GNU General Public License in
24 * all respects for all other code used. Additionally, AlliedModders LLC grants
25 * this exception to all derivative works. AlliedModders LLC defines further
26 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
27 * or <http://www.sourcemod.net/license.php>.
33 #include <sh_string.h>
34 #include <sm_trie_tpl.h>
35 #include <ISourceMod.h>
36 #include "common_logic.h"
38 #include "PluginSys.h"
40 using namespace SourceHook;
42 static cell_t s_curparams[SP_MAX_EXEC_PARAMS+1];
43 static FakeNative *s_curnative = NULL;
44 static IPluginContext *s_curcaller = NULL;
46 cell_t FakeNativeRouter(IPluginContext *pContext, const cell_t *params, void *pData)
48 FakeNative *native = (FakeNative *)pData;
50 /* Check if too many parameters were passed */
51 if (params[0] > SP_MAX_EXEC_PARAMS)
53 return pContext->ThrowNativeError("Called native with too many parameters (%d>%d)", params[0], SP_MAX_EXEC_PARAMS);
56 /* Check if the native is paused */
57 if (native->ctx->GetRuntime()->IsPaused())
59 return pContext->ThrowNativeError("Plugin owning this native is currently paused.");
62 CPlugin *pCaller = g_PluginSys.GetPluginByCtx(pContext->GetContext());
64 /* Save any old data on the stack */
65 FakeNative *pSaveNative = s_curnative;
66 IPluginContext *pSaveCaller = s_curcaller;
67 cell_t save_params[SP_MAX_EXEC_PARAMS+1];
68 if (pSaveNative != NULL)
70 /* Copy all old parameters */
71 for (cell_t i=0; i<=s_curparams[0]; i++)
73 save_params[i] = s_curparams[i];
77 /* Save the current parameters */
79 s_curcaller = pContext;
80 for (cell_t i=0; i<=params[0]; i++)
82 s_curparams[i] = params[i];
85 /* Push info and execute. */
87 native->call->PushCell(pCaller->GetMyHandle());
88 native->call->PushCell(params[0]);
90 if ((error=native->call->Execute(&result)) != SP_ERROR_NONE)
92 if (pContext->GetLastNativeError() == SP_ERROR_NONE)
94 pContext->ThrowNativeErrorEx(error, "Error encountered while processing a dynamic native");
98 /* Restore everything from the stack if necessary */
99 s_curnative = pSaveNative;
100 s_curcaller = pSaveCaller;
101 if (pSaveNative != NULL)
103 for (cell_t i=0; i<=save_params[0]; i++)
105 s_curparams[i] = save_params[i];
112 static cell_t CreateNative(IPluginContext *pContext, const cell_t *params)
117 pContext->LocalToString(params[1], &name);
119 IPluginFunction *pFunction = pContext->GetFunctionById(params[2]);
122 return pContext->ThrowNativeError("Function %x is not a valid function", params[2]);
125 pPlugin = g_PluginSys.GetPluginByCtx(pContext->GetContext());
127 if (!pPlugin->AddFakeNative(pFunction, name, FakeNativeRouter))
129 return pContext->ThrowNativeError("Fatal error creating dynamic native!");
135 static cell_t ThrowNativeError(IPluginContext *pContext, const cell_t *params)
137 if (!s_curnative || (s_curnative->ctx != pContext))
139 return pContext->ThrowNativeError("Not called from inside a native function");
142 g_pSM->SetGlobalTarget(SOURCEMOD_SERVER_LANGUAGE);
145 g_pSM->FormatString(buffer, sizeof(buffer), pContext, params, 2);
147 if (pContext->GetLastNativeError() != SP_ERROR_NONE)
149 s_curcaller->ThrowNativeError("Error encountered while processing a dynamic native");
151 s_curcaller->ThrowNativeErrorEx(params[1], "%s", buffer);
157 static cell_t GetNativeStringLength(IPluginContext *pContext, const cell_t *params)
159 if (!s_curnative || (s_curnative->ctx != pContext))
161 return pContext->ThrowNativeError("Not called from inside a native function");
164 cell_t param = params[1];
165 if (param < 1 || param > s_curparams[0])
167 return pContext->ThrowNativeErrorEx(SP_ERROR_PARAM, "Invalid parameter number: %d", param);
172 if ((err=s_curcaller->LocalToString(s_curparams[param], &str)) != SP_ERROR_NONE)
178 pContext->LocalToPhysAddr(params[2], &addr);
179 *addr = (cell_t)strlen(str);
181 return SP_ERROR_NONE;
184 static cell_t GetNativeString(IPluginContext *pContext, const cell_t *params)
186 if (!s_curnative || (s_curnative->ctx != pContext))
188 return pContext->ThrowNativeError("Not called from inside a native function");
191 cell_t param = params[1];
192 if (param < 1 || param > s_curparams[0])
194 return pContext->ThrowNativeErrorEx(SP_ERROR_PARAM, "Invalid parameter number: %d", param);
199 if ((err=s_curcaller->LocalToString(s_curparams[param], &str)) != SP_ERROR_NONE)
205 pContext->StringToLocalUTF8(params[2], params[3], str, &bytes);
208 pContext->LocalToPhysAddr(params[4], &addr);
209 *addr = (cell_t)bytes;
211 return SP_ERROR_NONE;
214 static cell_t SetNativeString(IPluginContext *pContext, const cell_t *params)
216 if (!s_curnative || (s_curnative->ctx != pContext))
218 return pContext->ThrowNativeError("Not called from inside a native function");
221 cell_t param = params[1];
222 if (param < 1 || param > s_curparams[0])
224 return pContext->ThrowNativeErrorEx(SP_ERROR_PARAM, "Invalid parameter number: %d", param);
228 pContext->LocalToString(params[2], &str);
234 err = s_curcaller->StringToLocalUTF8(s_curparams[param], params[3], str, &bytes);
236 err = s_curcaller->StringToLocal(s_curparams[param], params[3], str);
239 if (bytes >= (size_t)params[3])
241 bytes = params[3] - 1;
245 if (err != SP_ERROR_NONE)
251 pContext->LocalToPhysAddr(params[5], &addr);
252 *addr = (cell_t)bytes;
254 return SP_ERROR_NONE;
257 static cell_t GetNativeCell(IPluginContext *pContext, const cell_t *params)
259 if (!s_curnative || (s_curnative->ctx != pContext))
261 return pContext->ThrowNativeError("Not called from inside a native function");
264 cell_t param = params[1];
265 if (param < 1 || param > s_curparams[0])
267 return pContext->ThrowNativeErrorEx(SP_ERROR_PARAM, "Invalid parameter number: %d", param);
270 return s_curparams[param];
273 static cell_t GetNativeCellRef(IPluginContext *pContext, const cell_t *params)
275 if (!s_curnative || (s_curnative->ctx != pContext))
277 return pContext->ThrowNativeError("Not called from inside a native function");
280 cell_t param = params[1];
281 if (param < 1 || param > s_curparams[0])
283 return pContext->ThrowNativeErrorEx(SP_ERROR_PARAM, "Invalid parameter number: %d", param);
287 if (s_curcaller->LocalToPhysAddr(s_curparams[param], &addr) != SP_ERROR_NONE)
289 return s_curcaller->ThrowNativeErrorEx(SP_ERROR_INVALID_ADDRESS, "Invalid address value");
295 static cell_t SetNativeCellRef(IPluginContext *pContext, const cell_t *params)
297 if (!s_curnative || (s_curnative->ctx != pContext))
299 return pContext->ThrowNativeError("Not called from inside a native function");
302 cell_t param = params[1];
303 if (param < 1 || param > s_curparams[0])
305 return pContext->ThrowNativeErrorEx(SP_ERROR_PARAM, "Invalid parameter number: %d", param);
309 if (s_curcaller->LocalToPhysAddr(s_curparams[param], &addr) != SP_ERROR_NONE)
311 return s_curcaller->ThrowNativeErrorEx(SP_ERROR_INVALID_ADDRESS, "Invalid address value");
319 static cell_t GetNativeArray(IPluginContext *pContext, const cell_t *params)
321 if (!s_curnative || (s_curnative->ctx != pContext))
323 return pContext->ThrowNativeError("Not called from inside a native function");
326 cell_t param = params[1];
327 if (param < 1 || param > s_curparams[0])
329 return pContext->ThrowNativeErrorEx(SP_ERROR_PARAM, "Invalid parameter number: %d", param);
334 if ((err=s_curcaller->LocalToPhysAddr(s_curparams[param], &addr)) != SP_ERROR_NONE)
340 pContext->LocalToPhysAddr(params[2], &src);
342 memcpy(src, addr, sizeof(cell_t) * params[3]);
344 return SP_ERROR_NONE;
347 static cell_t SetNativeArray(IPluginContext *pContext, const cell_t *params)
349 if (!s_curnative || (s_curnative->ctx != pContext))
351 return pContext->ThrowNativeError("Not called from inside a native function");
354 cell_t param = params[1];
355 if (param < 1 || param > s_curparams[0])
357 return pContext->ThrowNativeErrorEx(SP_ERROR_PARAM, "Invalid parameter number: %d", param);
362 if ((err=s_curcaller->LocalToPhysAddr(s_curparams[param], &addr)) != SP_ERROR_NONE)
368 pContext->LocalToPhysAddr(params[2], &src);
370 memcpy(addr, src, sizeof(cell_t) * params[3]);
372 return SP_ERROR_NONE;
375 static cell_t FormatNativeString(IPluginContext *pContext, const cell_t *params)
377 if (!s_curnative || (s_curnative->ctx != pContext))
379 return pContext->ThrowNativeError("Not called from inside a native function");
382 int out_param = params[1];
383 int fmt_param = params[2];
384 int var_param = params[3];
387 if (out_param && (out_param < 1 || out_param > s_curparams[0]))
389 return pContext->ThrowNativeErrorEx(SP_ERROR_PARAM, "Invalid parameter number: %d", out_param);
391 if (fmt_param && (fmt_param < 1 || fmt_param > s_curparams[0]))
393 return pContext->ThrowNativeErrorEx(SP_ERROR_PARAM, "Invalid parameter number: %d", fmt_param);
395 if (var_param && (var_param < 1 || var_param > s_curparams[0] + 1))
397 return pContext->ThrowNativeErrorEx(SP_ERROR_PARAM, "Invalid parameter number: %d", fmt_param);
400 /* Get buffer information */
407 if ((err=s_curcaller->LocalToString(s_curparams[out_param], &output_buffer)) != SP_ERROR_NONE)
412 pContext->LocalToString(params[6], &output_buffer);
417 if ((err=s_curcaller->LocalToString(s_curparams[fmt_param], &format_buffer)) != SP_ERROR_NONE)
422 pContext->LocalToString(params[7], &format_buffer);
425 /* Get maximum length */
426 size_t maxlen = (size_t)params[4];
429 size_t written = smcore.atcprintf(output_buffer, maxlen, format_buffer, s_curcaller, s_curparams, &var_param);
432 pContext->LocalToPhysAddr(params[5], &addr);
433 *addr = (cell_t)written;
435 return s_curcaller->GetLastNativeError();
439 REGISTER_NATIVES(nativeNatives)
441 {"CreateNative", CreateNative},
442 {"GetNativeArray", GetNativeArray},
443 {"GetNativeCell", GetNativeCell},
444 {"GetNativeCellRef", GetNativeCellRef},
445 {"GetNativeString", GetNativeString},
446 {"GetNativeStringLength", GetNativeStringLength},
447 {"FormatNativeString", FormatNativeString},
448 {"ThrowNativeError", ThrowNativeError},
449 {"SetNativeArray", SetNativeArray},
450 {"SetNativeCellRef", SetNativeCellRef},
451 {"SetNativeString", SetNativeString},