From 97e39635e0c75a97ad1bc03879be8f5d467d88b4 Mon Sep 17 00:00:00 2001 From: Federico Cecchetto Date: Fri, 10 Jun 2022 18:54:34 +0200 Subject: [PATCH] SP Support --- src/component/gsc.cpp | 31 ++-- src/dllmain.cpp | 5 - src/game/game.cpp | 43 ++++-- src/game/game.hpp | 9 +- src/game/scripting/array.cpp | 220 ++++++++++++++++++++-------- src/game/scripting/execution.cpp | 8 +- src/game/scripting/script_value.cpp | 4 +- src/game/scripting/script_value.hpp | 2 +- src/game/scripting/thread.cpp | 6 +- src/game/structs.hpp | 54 +++++-- src/game/symbols.hpp | 59 ++++---- 11 files changed, 293 insertions(+), 148 deletions(-) diff --git a/src/component/gsc.cpp b/src/component/gsc.cpp index c42bd63..fe4a59b 100644 --- a/src/component/gsc.cpp +++ b/src/component/gsc.cpp @@ -169,7 +169,7 @@ namespace gsc utils::hook::detour scr_settings_hook; void scr_settings_stub(int /*developer*/, int developer_script, int /*abort_on_error*/, int inst) { - scr_settings_hook.invoke(SELECT_VALUE(0x0, 0x55D010), developer_script, developer_script, 0, inst); + scr_settings_hook.invoke(developer_script, developer_script, 0, inst); } } @@ -177,20 +177,21 @@ namespace gsc { void add_internal(const std::string& name, const function_t& function) { - functions[name] = function; - const auto call_wrap = wrap_function_call(name); - function_wraps[name] = call_wrap; + const auto name_ = utils::string::to_lower(name); + functions[name_] = function; + const auto call_wrap = wrap_function_call(name_); + function_wraps[name_] = call_wrap; } } namespace method { - template void add_internal(const std::string& name, const function_t& method) { - methods[name] = method; - const auto call_wrap = wrap_method_call(name); - method_wraps[name] = call_wrap; + const auto name_ = utils::string::to_lower(name); + methods[name_] = method; + const auto call_wrap = wrap_method_call(name_); + method_wraps[name_] = call_wrap; } } @@ -200,16 +201,16 @@ namespace gsc void post_unpack() override { // Don't com_error on gsc errors - utils::hook::nop(SELECT_VALUE(0x0, 0x4D9BB1), 5); - utils::hook::jump(SELECT_VALUE(0x0, 0x568B90), print); + utils::hook::nop(SELECT_VALUE(0x5A17E1, 0x4D9BB1), 5); + utils::hook::jump(SELECT_VALUE(0x5DFC40, 0x568B90), print); - scr_settings_hook.create(SELECT_VALUE(0x0, 0x55D010), scr_settings_stub); - get_function_hook.create(SELECT_VALUE(0x0, 0x465E20), get_function_stub); - get_method_hook.create(SELECT_VALUE(0x0, 0x555580), get_method_stub); + scr_settings_hook.create(SELECT_VALUE(0x4CEEA0, 0x55D010), scr_settings_stub); + get_function_hook.create(SELECT_VALUE(0x52BF80, 0x465E20), get_function_stub); + get_method_hook.create(SELECT_VALUE(0x68A640, 0x555580), get_method_stub); // \n******* script runtime error *******\n%s\n - utils::hook::set(0xAABA68 + 40, '\n'); - utils::hook::set(0xAABA68 + 41, '\0'); + utils::hook::set(SELECT_VALUE(0x9FC5C0 + 40, 0xAABA68 + 40), '\n'); + utils::hook::set(SELECT_VALUE(0x9FC5C0 + 41, 0xAABA68 + 41), '\0'); } }; } diff --git a/src/dllmain.cpp b/src/dllmain.cpp index 0d10007..f628648 100644 --- a/src/dllmain.cpp +++ b/src/dllmain.cpp @@ -9,11 +9,6 @@ BOOL APIENTRY DllMain(HMODULE /*module_*/, DWORD ul_reason_for_call, LPVOID /*re { if (ul_reason_for_call == DLL_PROCESS_ATTACH) { - if (game::plutonium::is_up_to_date()) - { - utils::hook::jump(reinterpret_cast(&printf), game::plutonium::printf); - } - component_loader::post_unpack(); } diff --git a/src/game/game.cpp b/src/game/game.cpp index 39a033a..0bfbe80 100644 --- a/src/game/game.cpp +++ b/src/game/game.cpp @@ -27,6 +27,34 @@ namespace game AddRefToValue_(inst, value->type, value->u); } + void RemoveRefToValue(scriptInstance_t inst, const int type, VariableUnion value) + { + if (game::environment::is_mp()) + { + mp::RemoveRefToValue(inst, type, value); + } + else + { + game::VariableValue var{}; + var.type = type; + var.u = value; + + sp::RemoveRefToValue(inst, &var); + } + } + + unsigned int GetObjectType(scriptInstance_t, unsigned int id) + { + if (game::environment::is_sp()) + { + return game::scr_VarGlob->variableList_sp[id + 1].w.type & 0x1F; + } + else + { + return game::scr_VarGlob->variableList_mp[id + 1].w.type & 0x1F; + } + } + unsigned int AllocVariable(scriptInstance_t inst) { static const auto func = utils::hook::assemble([](utils::hook::assembler& a) @@ -67,16 +95,13 @@ namespace game unsigned int Scr_GetSelf(scriptInstance_t, unsigned int threadId) { - return game::scr_VarGlob->variableList[threadId + 1].u.o.u.self; - } - - namespace plutonium - { - bool is_up_to_date() + if (game::environment::is_sp()) { - //const auto value = *reinterpret_cast(0); - //return value == 0; - return false; + return game::scr_VarGlob->variableList_sp[threadId + 1].u.o.size; + } + else + { + return game::scr_VarGlob->variableList_mp[threadId + 1].u.o.u.self; } } } diff --git a/src/game/game.hpp b/src/game/game.hpp index a80695c..c39e538 100644 --- a/src/game/game.hpp +++ b/src/game/game.hpp @@ -57,15 +57,14 @@ namespace game }; void AddRefToValue(scriptInstance_t inst, const VariableValue* value); + void RemoveRefToValue(scriptInstance_t inst, const int type, VariableUnion value); + + unsigned int GetObjectType(scriptInstance_t, unsigned int id); + unsigned int AllocVariable(scriptInstance_t inst); VariableValue Scr_GetArrayIndexValue(scriptInstance_t inst, unsigned int name); unsigned int Scr_GetSelf(scriptInstance_t inst, unsigned int threadId); - - namespace plutonium - { - bool is_up_to_date(); - } } #include "symbols.hpp" diff --git a/src/game/scripting/array.cpp b/src/game/scripting/array.cpp index 335ab4b..bc26357 100644 --- a/src/game/scripting/array.cpp +++ b/src/game/scripting/array.cpp @@ -4,6 +4,57 @@ namespace scripting { + namespace + { + std::vector get_keys_sp(unsigned int id) + { + std::vector result; + + auto current = game::scr_VarGlob->variableList_sp[id + 1].nextSibling; + + while (current) + { + const auto var = &game::scr_VarGlob->variableList_sp[current + 0x6000]; + const auto key_value = game::Scr_GetArrayIndexValue(game::SCRIPTINSTANCE_SERVER, var->w.status >> 8); + result.push_back(key_value); + + const auto next_sibling = game::scr_VarGlob->variableList_sp[current + 0x6000].nextSibling; + if (!next_sibling) + { + break; + } + + current = static_cast(game::scr_VarGlob->variableList_sp[next_sibling + 0x6000].id); + } + + return result; + } + + std::vector get_keys_mp(unsigned int id) + { + std::vector result; + + auto current = game::scr_VarGlob->variableList_mp[id + 1].nextSibling; + + while (current) + { + const auto var = &game::scr_VarGlob->variableList_mp[current + 0x8000]; + const auto key_value = game::Scr_GetArrayIndexValue(game::SCRIPTINSTANCE_SERVER, var->w.status >> 8); + result.push_back(key_value); + + const auto next_sibling = game::scr_VarGlob->variableList_mp[current + 0x8000].nextSibling; + if (!next_sibling) + { + break; + } + + current = game::scr_VarGlob->variableList_mp[next_sibling + 0x8000].hash.id; + } + + return result; + } + } + array_value::array_value(unsigned int parent_id, unsigned int id) : id_(id) , parent_id_(parent_id) @@ -13,12 +64,22 @@ namespace scripting return; } - const auto value = game::scr_VarGlob->variableList[this->id_]; - game::VariableValue variable{}; - variable.u = value.u.u; - variable.type = value.w.type & 0x1F; + game::VariableValue variable_{}; - this->value_ = variable; + if (game::environment::is_sp()) + { + const auto variable = &game::scr_VarGlob->variableList_sp[this->id_ + 0x6000]; + variable_.type = variable->w.type & 0x1F; + variable_.u = variable->u.u; + } + else + { + const auto variable = &game::scr_VarGlob->variableList_mp[this->id_ + 0x8000]; + variable_.type = variable->w.type & 0x1F; + variable_.u = variable->u.u; + } + + this->value_ = variable_; } void array_value::operator=(const script_value& value) @@ -30,16 +91,29 @@ namespace scripting const auto& value_0 = value.get_raw(); - const auto variable = &game::scr_VarGlob->variableList[this->id_]; - game::VariableValue variable_{}; - variable_.type = variable->w.type & 0x1F; - variable_.u = variable->u.u; + game::VariableValue previous{}; + + if (game::environment::is_sp()) + { + const auto variable = &game::scr_VarGlob->variableList_sp[this->id_ + 0x6000]; + previous.type = variable->w.type & 0x1F; + previous.u = variable->u.u; + + variable->w.type |= value_0.type; + variable->u.u = value_0.u; + } + else + { + const auto variable = &game::scr_VarGlob->variableList_mp[this->id_ + 0x8000]; + previous.type = variable->w.type & 0x1F; + previous.u = variable->u.u; + + variable->w.type |= value_0.type; + variable->u.u = value_0.u; + } game::AddRefToValue(game::SCRIPTINSTANCE_SERVER, &value_0); - game::RemoveRefToValue(game::SCRIPTINSTANCE_SERVER, variable_.type, variable_.u); - - variable->w.type = value_0.type & 0x1F; - variable->u.u = value_0.u; + game::RemoveRefToValue(game::SCRIPTINSTANCE_SERVER, previous.type, previous.u); this->value_ = value_0; } @@ -121,26 +195,7 @@ namespace scripting std::vector array::get_keys() const { - std::vector result; - - auto current = game::scr_VarGlob->variableList[this->id_ + 1].nextSibling; - - while (current) - { - const auto var = &game::scr_VarGlob->variableList[current + 0x8000]; - const auto key_value = game::Scr_GetArrayIndexValue(game::SCRIPTINSTANCE_SERVER, var->w.status >> 8); - result.push_back(key_value); - - const auto next_sibling = game::scr_VarGlob->variableList[current + 0x8000].nextSibling; - if (!next_sibling) - { - break; - } - - current = game::scr_VarGlob->variableList[next_sibling + 0x8000].hash.id; - } - - return result; + return SELECT_VALUE(get_keys_sp, get_keys_mp)(this->id_); } int array::size() const @@ -190,12 +245,22 @@ namespace scripting return {}; } - const auto value = game::scr_VarGlob->variableList[variable_id + 0x8000]; - game::VariableValue variable{}; - variable.u = value.u.u; - variable.type = value.w.type & 0x1F; + game::VariableValue variable_{}; - return variable; + if (game::environment::is_sp()) + { + const auto variable = &game::scr_VarGlob->variableList_sp[variable_id + 0x6000]; + variable_.type = variable->w.type & 0x1F; + variable_.u = variable->u.u; + } + else + { + const auto variable = &game::scr_VarGlob->variableList_mp[variable_id + 0x8000]; + variable_.type = variable->w.type & 0x1F; + variable_.u = variable->u.u; + } + + return variable_; } script_value array::get(const unsigned int index) const @@ -207,12 +272,22 @@ namespace scripting return {}; } - const auto value = game::scr_VarGlob->variableList[variable_id + 0x8000]; - game::VariableValue variable{}; - variable.u = value.u.u; - variable.type = value.w.type & 0x1F; + game::VariableValue variable_{}; - return variable; + if (game::environment::is_sp()) + { + const auto variable = &game::scr_VarGlob->variableList_sp[variable_id + 0x6000]; + variable_.type = variable->w.type & 0x1F; + variable_.u = variable->u.u; + } + else + { + const auto variable = &game::scr_VarGlob->variableList_mp[variable_id + 0x8000]; + variable_.type = variable->w.type & 0x1F; + variable_.u = variable->u.u; + } + + return variable_; } script_value array::get(const script_value& key) const @@ -240,16 +315,29 @@ namespace scripting return; } - const auto variable = &game::scr_VarGlob->variableList[variable_id + 0x8000]; - game::VariableValue variable_{}; - variable_.type = variable->w.type & 0x1F; - variable_.u = variable->u.u; + game::VariableValue previous{}; + + if (game::environment::is_sp()) + { + const auto variable = &game::scr_VarGlob->variableList_sp[variable_id + 0x6000]; + previous.type = variable->w.type & 0x1F; + previous.u = variable->u.u; + + variable->w.type |= value_.type; + variable->u.u = value_.u; + } + else + { + const auto variable = &game::scr_VarGlob->variableList_mp[variable_id + 0x8000]; + previous.type = variable->w.type & 0x1F; + previous.u = variable->u.u; + + variable->w.type |= value_.type; + variable->u.u = value_.u; + } game::AddRefToValue(game::SCRIPTINSTANCE_SERVER, &value_); - game::RemoveRefToValue(game::SCRIPTINSTANCE_SERVER, variable_.type, variable_.u); - - variable->w.type |= value_.type; - variable->u.u = value_.u; + game::RemoveRefToValue(game::SCRIPTINSTANCE_SERVER, previous.type, previous.u); } void array::set(const unsigned int index, const script_value& value) const @@ -262,17 +350,29 @@ namespace scripting return; } - auto variable_list = *game::scr_VarGlob; - const auto variable = &game::scr_VarGlob->variableList[variable_id + 0x8000]; - game::VariableValue variable_{}; - variable_.type = variable->w.type & 0x1F; - variable_.u = variable->u.u; + game::VariableValue previous{}; + + if (game::environment::is_sp()) + { + const auto variable = &game::scr_VarGlob->variableList_sp[variable_id + 0x6000]; + previous.type = variable->w.type & 0x1F; + previous.u = variable->u.u; + + variable->w.type |= value_.type; + variable->u.u = value_.u; + } + else + { + const auto variable = &game::scr_VarGlob->variableList_mp[variable_id + 0x8000]; + previous.type = variable->w.type & 0x1F; + previous.u = variable->u.u; + + variable->w.type |= value_.type; + variable->u.u = value_.u; + } game::AddRefToValue(game::SCRIPTINSTANCE_SERVER, &value_); - game::RemoveRefToValue(game::SCRIPTINSTANCE_SERVER, variable_.type, variable_.u); - - variable->w.type |= value_.type; - variable->u.u = value_.u; + game::RemoveRefToValue(game::SCRIPTINSTANCE_SERVER, previous.type, previous.u); } void array::set(const script_value& key, const script_value& _value) const diff --git a/src/game/scripting/execution.cpp b/src/game/scripting/execution.cpp index 3a17f94..cd885d1 100644 --- a/src/game/scripting/execution.cpp +++ b/src/game/scripting/execution.cpp @@ -149,12 +149,6 @@ namespace scripting unsigned int make_object() { - unsigned int index = 0; - const auto id = game::AllocVariable(game::SCRIPTINSTANCE_SERVER); - const auto variable = &game::scr_VarGlob->variableList[id + 1]; - variable->w.type = game::SCRIPT_STRUCT; - variable->u.o.refCount = 0; - - return index; + return 0; } } \ No newline at end of file diff --git a/src/game/scripting/script_value.cpp b/src/game/scripting/script_value.cpp index 08b739e..18a8138 100644 --- a/src/game/scripting/script_value.cpp +++ b/src/game/scripting/script_value.cpp @@ -258,7 +258,7 @@ namespace scripting } const auto id = this->get_raw().u.uintValue; - const auto type = game::scr_VarGlob->variableList[id + 1].w.type & 0x1F; + const auto type = game::GetObjectType(game::SCRIPTINSTANCE_SERVER, id); return type == game::SCRIPT_ARRAY; } @@ -282,7 +282,7 @@ namespace scripting } const auto id = this->get_raw().u.uintValue; - const auto type = game::scr_VarGlob->variableList[id + 1].w.type & 0x1F; + const auto type = game::GetObjectType(game::SCRIPTINSTANCE_SERVER, id); return type == game::SCRIPT_STRUCT || type == game::SCRIPT_ENTITY; } diff --git a/src/game/scripting/script_value.hpp b/src/game/scripting/script_value.hpp index 5c2e8cd..b139768 100644 --- a/src/game/scripting/script_value.hpp +++ b/src/game/scripting/script_value.hpp @@ -46,7 +46,7 @@ namespace scripting auto type_ = 0; if (value.type == game::SCRIPT_OBJECT) { - type_ = game::scr_VarGlob->variableList[value.u.uintValue].w.type & 0x1F; + type_ = game::GetObjectType(game::SCRIPTINSTANCE_SERVER, value.u.uintValue); } else { diff --git a/src/game/scripting/thread.cpp b/src/game/scripting/thread.cpp index 2b1247f..975002e 100644 --- a/src/game/scripting/thread.cpp +++ b/src/game/scripting/thread.cpp @@ -7,7 +7,7 @@ namespace scripting { thread::thread(unsigned int id) : id_(id) - , type_(game::scr_VarGlob->variableList[id].w.type & 0x7F) + , type_(game::GetObjectType(game::SCRIPTINSTANCE_SERVER, id)) { } @@ -32,12 +32,12 @@ namespace scripting unsigned int thread::get_wait_time() const { - return game::scr_VarGlob->variableList[this->id_].w.waitTime >> 8; + return 0; } unsigned int thread::get_notify_name_id() const { - return game::scr_VarGlob->variableList[this->id_].w.notifyName >> 8; + return 0; } unsigned int thread::get_self() const diff --git a/src/game/structs.hpp b/src/game/structs.hpp index 462fbe6..fc04743 100644 --- a/src/game/structs.hpp +++ b/src/game/structs.hpp @@ -210,23 +210,51 @@ namespace game unsigned int index; }; - struct VariableValueInternal + namespace sp { - Variable hash; - VariableValueInternal_u u; - VariableValueInternal_w w; - VariableValueInternal_v v; - unsigned int nextSibling; - }; + struct ObjectInfo + { + unsigned __int16 refCount; + unsigned __int16 size; + }; - static_assert(sizeof(VariableValueInternal) == 28); - static_assert(offsetof(VariableValueInternal, hash) == 0); - static_assert(offsetof(VariableValueInternal, u) == 8); - static_assert(offsetof(VariableValueInternal, w) == 16); + union VariableValueInternal_u + { + VariableUnion u; + ObjectInfo o; + }; - struct scrVarGlob_t + struct VariableValueInternal + { + unsigned int id; + VariableValueInternal_u u; + VariableValueInternal_w w; + char __pad1[2]; + unsigned __int16 nextSibling; + }; + + static_assert(sizeof(VariableValueInternal) == 16); + static_assert(offsetof(VariableValueInternal, nextSibling) == 14); + static_assert(offsetof(VariableValueInternal, u) == 4); + static_assert(offsetof(VariableValueInternal, w) == 8); + } + + namespace mp { - VariableValueInternal* variableList; + struct VariableValueInternal + { + Variable hash; + VariableValueInternal_u u; + VariableValueInternal_w w; + VariableValueInternal_v v; + unsigned int nextSibling; + }; + } + + union scrVarGlob_t + { + sp::VariableValueInternal* variableList_sp; + mp::VariableValueInternal* variableList_mp; }; struct scr_classStruct_t diff --git a/src/game/symbols.hpp b/src/game/symbols.hpp index 6d89aea..4a6fa66 100644 --- a/src/game/symbols.hpp +++ b/src/game/symbols.hpp @@ -37,23 +37,31 @@ namespace game WEAK symbol Scr_AddVector{0x0, 0x0}; WEAK symbol Scr_AddObject{0x0, 0x0}; - WEAK symbol Scr_ClearOutParams{0x0, 0x588680}; + WEAK symbol Scr_ClearOutParams{0x654D10, 0x588680}; WEAK symbol AllocObject{0x0, 0x0}; WEAK symbol AllocThread{0x0, 0x0}; WEAK symbol RemoveRefToObject{0x0, 0x0}; WEAK symbol RemoveRefToVector{0x0, 0x0}; - WEAK symbol AddRefToValue_{0x0, 0x6706B0}; - WEAK symbol RemoveRefToValue{0x0, 0x4249C0}; + WEAK symbol AddRefToValue_{0x53FD50, 0x6706B0}; + + namespace mp + { + WEAK symbol RemoveRefToValue{0x0, 0x4249C0}; + } + + namespace sp + { + WEAK symbol RemoveRefToValue{0x556830, 0x0}; + } + WEAK symbol RemoveVariableValue{0x0, 0x0}; - WEAK symbol FindVariable{0x0, 0x5DF7E0}; - WEAK symbol FindArrayVariable{0x0, 0x509230}; + WEAK symbol FindVariable{0x476720, 0x5DF7E0}; + WEAK symbol FindArrayVariable{0x62F8E0, 0x509230}; WEAK symbol GetVariable{0x0, 0x0}; - WEAK symbol GetNewVariable{0x0, 0x5B3750}; - WEAK symbol GetNewArrayVariable{0x0, 0x468BC0}; - WEAK symbol GetVariableValueAddress{0x0, 0x651390}; - WEAK symbol SetNewVariableValue{0x0, 0x4DCA30}; + WEAK symbol GetNewVariable{0x674820, 0x5B3750}; + WEAK symbol GetNewArrayVariable{0x689C60, 0x468BC0}; WEAK symbol Scr_SetObjectField{0x0, 0x0}; WEAK symbol GetEntityFieldValue{0x0, 0x0}; @@ -62,8 +70,8 @@ namespace game WEAK symbol Scr_NotifyId{0x0, 0x0}; WEAK symbol Scr_NotifyNum{0x0, 0x0}; - WEAK symbol SL_GetString{0x0, 0x4B1770}; - WEAK symbol SL_ConvertToString{0x0, 0x624C70}; + WEAK symbol SL_GetString{0x463130, 0x4B1770}; + WEAK symbol SL_ConvertToString{0x687530, 0x624C70}; WEAK symbol SL_GetCanonicalString{0x0, 0x0}; WEAK symbol Scr_GetNumParam{0x0, 0x0}; @@ -72,18 +80,18 @@ namespace game WEAK symbol Scr_GetInt{0x0, 0x0}; WEAK symbol Scr_GetString{0x0, 0x0}; WEAK symbol Scr_GetVector{0x0, 0x0}; - WEAK symbol Scr_AllocVector{0x0, 0x4C4440}; + WEAK symbol Scr_AllocVector{0x41B400, 0x4C4440}; WEAK symbol Scr_GetFunctionHandle{0x0, 0x0}; WEAK symbol Scr_AddClassField{0x0, 0x0}; - WEAK symbol Scr_GetEntityId{0x0, 0x6A07D0}; + WEAK symbol Scr_GetEntityId{0x4B7050, 0x6A07D0}; WEAK symbol GetStartLocalId{0x0, 0x0}; WEAK symbol Scr_TerminateRunningThread{0x0, 0x0}; - WEAK symbol Scr_Error{0x0, 0x6245E0}; + WEAK symbol Scr_Error{0x4B5940, 0x6245E0}; WEAK symbol Scr_ParamError{0x0, 0x0}; WEAK symbol Scr_ObjectError{0x0, 0x0}; - WEAK symbol Scr_GetEntityIdRef{0x0, 0x6A53C0}; - WEAK symbol Scr_AllocArray{0x0, 0x5B8400}; + WEAK symbol Scr_GetEntityIdRef{0x433B60, 0x6A53C0}; + WEAK symbol Scr_AllocArray{0x438800, 0x5B8400}; WEAK symbol GetPlayerEntity{0x0, 0x0}; @@ -96,17 +104,17 @@ namespace game WEAK symbol Sys_GetValue{0x0, 0x0}; WEAK symbol Sys_Milliseconds{0x0, 0x0}; - WEAK symbol longjmp{0x0, 0x9D05C4}; - WEAK symbol _setjmp{0x0, 0x9CED5C}; + WEAK symbol longjmp{0x96B980, 0x9D05C4}; + WEAK symbol _setjmp{0x969EAC, 0x9CED5C}; // Variables - WEAK symbol g_script_error_level{0x0, 0x3DD4A18}; - WEAK symbol g_script_error{0x0, 0x3DD3998}; + WEAK symbol g_script_error_level{0x32D1E18, 0x3DD4A18}; + WEAK symbol g_script_error{0x32D0D98, 0x3DD3998}; - WEAK symbol scr_VmPub{0x0, 0x3DCB338}; - WEAK symbol scr_VarGlob{0x0, 0x3DCB180}; - WEAK symbol scr_VarPub{0x0, 0x3DCB280}; + WEAK symbol scr_VmPub{0x32C8738, 0x3DCB338}; + WEAK symbol scr_VarGlob{0x32C8580, 0x3DCB180}; + WEAK symbol scr_VarPub{0x32C8680, 0x3DCB280}; WEAK symbol scr_starttime{0x0, 0x0}; WEAK symbol fs{0x0, 0x0}; @@ -118,9 +126,4 @@ namespace game WEAK symbol levelEntityId{0x0, 0x0}; WEAK symbol svs_clients{0x0, 0x0}; - - namespace plutonium - { - WEAK symbol printf{0x0, 0x0}; - } }