Update CS:GO team score 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 <ISourceMod.h>
35 #include "common_logic.h"
37 #include "PluginSys.h"
39 using namespace SourceHook;
41 static cell_t s_curparams[SP_MAX_EXEC_PARAMS+1];
42 static FakeNative *s_curnative = NULL;
43 static IPluginContext *s_curcaller = NULL;
45 cell_t FakeNativeRouter(IPluginContext *pContext, const cell_t *params, void *pData)
47 FakeNative *native = (FakeNative *)pData;
49 /* Check if too many parameters were passed */
50 if (params[0] > SP_MAX_EXEC_PARAMS)
52 return pContext->ThrowNativeError("Called native with too many parameters (%d>%d)", params[0], SP_MAX_EXEC_PARAMS);
55 /* Check if the native is paused */
56 if (native->ctx->GetRuntime()->IsPaused())
58 return pContext->ThrowNativeError("Plugin owning this native is currently paused.");
61 CPlugin *pCaller = g_PluginSys.GetPluginByCtx(pContext->GetContext());
63 /* Save any old data on the stack */
64 FakeNative *pSaveNative = s_curnative;
65 IPluginContext *pSaveCaller = s_curcaller;
66 cell_t save_params[SP_MAX_EXEC_PARAMS+1];
67 if (pSaveNative != NULL)
69 /* Copy all old parameters */
70 for (cell_t i=0; i<=s_curparams[0]; i++)
72 save_params[i] = s_curparams[i];
76 /* Save the current parameters */
78 s_curcaller = pContext;
79 for (cell_t i=0; i<=params[0]; i++)
81 s_curparams[i] = params[i];
84 /* Push info and execute. */
86 native->call->PushCell(pCaller->GetMyHandle());
87 native->call->PushCell(params[0]);
89 if ((error=native->call->Execute(&result)) != SP_ERROR_NONE)
91 if (pContext->GetLastNativeError() == SP_ERROR_NONE)
93 pContext->ThrowNativeErrorEx(error, "Error encountered while processing a dynamic native");
97 /* Restore everything from the stack if necessary */
98 s_curnative = pSaveNative;
99 s_curcaller = pSaveCaller;
100 if (pSaveNative != NULL)
102 for (cell_t i=0; i<=save_params[0]; i++)
104 s_curparams[i] = save_params[i];
111 static cell_t CreateNative(IPluginContext *pContext, const cell_t *params)
116 pContext->LocalToString(params[1], &name);
118 IPluginFunction *pFunction = pContext->GetFunctionById(params[2]);
121 return pContext->ThrowNativeError("Function %x is not a valid function", params[2]);
124 pPlugin = g_PluginSys.GetPluginByCtx(pContext->GetContext());
126 if (!pPlugin->AddFakeNative(pFunction, name, FakeNativeRouter))
128 return pContext->ThrowNativeError("Fatal error creating dynamic native!");
134 static cell_t ThrowNativeError(IPluginContext *pContext, const cell_t *params)
136 if (!s_curnative || (s_curnative->ctx != pContext))
138 return pContext->ThrowNativeError("Not called from inside a native function");
141 g_pSM->SetGlobalTarget(SOURCEMOD_SERVER_LANGUAGE);
144 g_pSM->FormatString(buffer, sizeof(buffer), pContext, params, 2);
146 if (pContext->GetLastNativeError() != SP_ERROR_NONE)
148 s_curcaller->ThrowNativeError("Error encountered while processing a dynamic native");
150 s_curcaller->ThrowNativeErrorEx(params[1], "%s", buffer);
156 static cell_t GetNativeStringLength(IPluginContext *pContext, const cell_t *params)
158 if (!s_curnative || (s_curnative->ctx != pContext))
160 return pContext->ThrowNativeError("Not called from inside a native function");
163 cell_t param = params[1];
164 if (param < 1 || param > s_curparams[0])
166 return pContext->ThrowNativeErrorEx(SP_ERROR_PARAM, "Invalid parameter number: %d", param);
171 if ((err=s_curcaller->LocalToString(s_curparams[param], &str)) != SP_ERROR_NONE)
177 pContext->LocalToPhysAddr(params[2], &addr);
178 *addr = (cell_t)strlen(str);
180 return SP_ERROR_NONE;
183 static cell_t GetNativeString(IPluginContext *pContext, const cell_t *params)
185 if (!s_curnative || (s_curnative->ctx != pContext))
187 return pContext->ThrowNativeError("Not called from inside a native function");
190 cell_t param = params[1];
191 if (param < 1 || param > s_curparams[0])
193 return pContext->ThrowNativeErrorEx(SP_ERROR_PARAM, "Invalid parameter number: %d", param);
198 if ((err=s_curcaller->LocalToString(s_curparams[param], &str)) != SP_ERROR_NONE)
204 pContext->StringToLocalUTF8(params[2], params[3], str, &bytes);
207 pContext->LocalToPhysAddr(params[4], &addr);
208 *addr = (cell_t)bytes;
210 return SP_ERROR_NONE;
213 static cell_t SetNativeString(IPluginContext *pContext, const cell_t *params)
215 if (!s_curnative || (s_curnative->ctx != pContext))
217 return pContext->ThrowNativeError("Not called from inside a native function");
220 cell_t param = params[1];
221 if (param < 1 || param > s_curparams[0])
223 return pContext->ThrowNativeErrorEx(SP_ERROR_PARAM, "Invalid parameter number: %d", param);
227 pContext->LocalToString(params[2], &str);
233 err = s_curcaller->StringToLocalUTF8(s_curparams[param], params[3], str, &bytes);
235 err = s_curcaller->StringToLocal(s_curparams[param], params[3], str);
238 if (bytes >= (size_t)params[3])
240 bytes = params[3] - 1;
244 if (err != SP_ERROR_NONE)
250 pContext->LocalToPhysAddr(params[5], &addr);
251 *addr = (cell_t)bytes;
253 return SP_ERROR_NONE;
256 static cell_t GetNativeCell(IPluginContext *pContext, const cell_t *params)
258 if (!s_curnative || (s_curnative->ctx != pContext))
260 return pContext->ThrowNativeError("Not called from inside a native function");
263 cell_t param = params[1];
264 if (param < 1 || param > s_curparams[0])
266 return pContext->ThrowNativeErrorEx(SP_ERROR_PARAM, "Invalid parameter number: %d", param);
269 return s_curparams[param];
272 static cell_t GetNativeCellRef(IPluginContext *pContext, const cell_t *params)
274 if (!s_curnative || (s_curnative->ctx != pContext))
276 return pContext->ThrowNativeError("Not called from inside a native function");
279 cell_t param = params[1];
280 if (param < 1 || param > s_curparams[0])
282 return pContext->ThrowNativeErrorEx(SP_ERROR_PARAM, "Invalid parameter number: %d", param);
286 if (s_curcaller->LocalToPhysAddr(s_curparams[param], &addr) != SP_ERROR_NONE)
288 return s_curcaller->ThrowNativeErrorEx(SP_ERROR_INVALID_ADDRESS, "Invalid address value");
294 static cell_t SetNativeCellRef(IPluginContext *pContext, const cell_t *params)
296 if (!s_curnative || (s_curnative->ctx != pContext))
298 return pContext->ThrowNativeError("Not called from inside a native function");
301 cell_t param = params[1];
302 if (param < 1 || param > s_curparams[0])
304 return pContext->ThrowNativeErrorEx(SP_ERROR_PARAM, "Invalid parameter number: %d", param);
308 if (s_curcaller->LocalToPhysAddr(s_curparams[param], &addr) != SP_ERROR_NONE)
310 return s_curcaller->ThrowNativeErrorEx(SP_ERROR_INVALID_ADDRESS, "Invalid address value");
318 static cell_t GetNativeArray(IPluginContext *pContext, const cell_t *params)
320 if (!s_curnative || (s_curnative->ctx != pContext))
322 return pContext->ThrowNativeError("Not called from inside a native function");
325 cell_t param = params[1];
326 if (param < 1 || param > s_curparams[0])
328 return pContext->ThrowNativeErrorEx(SP_ERROR_PARAM, "Invalid parameter number: %d", param);
333 if ((err=s_curcaller->LocalToPhysAddr(s_curparams[param], &addr)) != SP_ERROR_NONE)
339 pContext->LocalToPhysAddr(params[2], &src);
341 memcpy(src, addr, sizeof(cell_t) * params[3]);
343 return SP_ERROR_NONE;
346 static cell_t SetNativeArray(IPluginContext *pContext, const cell_t *params)
348 if (!s_curnative || (s_curnative->ctx != pContext))
350 return pContext->ThrowNativeError("Not called from inside a native function");
353 cell_t param = params[1];
354 if (param < 1 || param > s_curparams[0])
356 return pContext->ThrowNativeErrorEx(SP_ERROR_PARAM, "Invalid parameter number: %d", param);
361 if ((err=s_curcaller->LocalToPhysAddr(s_curparams[param], &addr)) != SP_ERROR_NONE)
367 pContext->LocalToPhysAddr(params[2], &src);
369 memcpy(addr, src, sizeof(cell_t) * params[3]);
371 return SP_ERROR_NONE;
374 static cell_t FormatNativeString(IPluginContext *pContext, const cell_t *params)
376 if (!s_curnative || (s_curnative->ctx != pContext))
378 return pContext->ThrowNativeError("Not called from inside a native function");
381 int out_param = params[1];
382 int fmt_param = params[2];
383 int var_param = params[3];
386 if (out_param && (out_param < 1 || out_param > s_curparams[0]))
388 return pContext->ThrowNativeErrorEx(SP_ERROR_PARAM, "Invalid parameter number: %d", out_param);
390 if (fmt_param && (fmt_param < 1 || fmt_param > s_curparams[0]))
392 return pContext->ThrowNativeErrorEx(SP_ERROR_PARAM, "Invalid parameter number: %d", fmt_param);
394 if (var_param && (var_param < 1 || var_param > s_curparams[0] + 1))
396 return pContext->ThrowNativeErrorEx(SP_ERROR_PARAM, "Invalid parameter number: %d", fmt_param);
399 /* Get buffer information */
406 if ((err=s_curcaller->LocalToString(s_curparams[out_param], &output_buffer)) != SP_ERROR_NONE)
411 pContext->LocalToString(params[6], &output_buffer);
416 if ((err=s_curcaller->LocalToString(s_curparams[fmt_param], &format_buffer)) != SP_ERROR_NONE)
421 pContext->LocalToString(params[7], &format_buffer);
424 /* Get maximum length */
425 size_t maxlen = (size_t)params[4];
428 size_t written = smcore.atcprintf(output_buffer, maxlen, format_buffer, s_curcaller, s_curparams, &var_param);
431 pContext->LocalToPhysAddr(params[5], &addr);
432 *addr = (cell_t)written;
434 return s_curcaller->GetLastNativeError();
438 REGISTER_NATIVES(nativeNatives)
440 {"CreateNative", CreateNative},
441 {"GetNativeArray", GetNativeArray},
442 {"GetNativeCell", GetNativeCell},
443 {"GetNativeCellRef", GetNativeCellRef},
444 {"GetNativeString", GetNativeString},
445 {"GetNativeStringLength", GetNativeStringLength},
446 {"FormatNativeString", FormatNativeString},
447 {"ThrowNativeError", ThrowNativeError},
448 {"SetNativeArray", SetNativeArray},
449 {"SetNativeCellRef", SetNativeCellRef},
450 {"SetNativeString", SetNativeString},