diff --git a/src/client/component/bots.cpp b/src/client/component/bots.cpp index e9a25628..81f74628 100644 --- a/src/client/component/bots.cpp +++ b/src/client/component/bots.cpp @@ -7,6 +7,7 @@ #include "party.hpp" #include "game/game.hpp" +#include "game/scripting/execution.hpp" #include #include @@ -28,20 +29,16 @@ namespace bots // TODO: when scripting comes, fix this to use better notifies void bot_team_join(const int entity_num) { - scheduler::once([entity_num]() + const game::scr_entref_t entref{static_cast(entity_num), 0}; + scheduler::once([entref]() { - game::SV_ExecuteClientCommand(&game::mp::svs_clients[entity_num], - utils::string::va("lui 68 2 %i", *game::mp::sv_serverId_value), - false); - - // scheduler the select class call - scheduler::once([entity_num]() + scripting::notify(entref, "luinotifyserver", {"team_select", 2}); + scheduler::once([entref]() { - game::SV_ExecuteClientCommand(&game::mp::svs_clients[entity_num], - utils::string::va("lui 5 %i %i", (rand() % 5) + 10, - *game::mp::sv_serverId_value), false); - }, scheduler::pipeline::server, 1s); - }, scheduler::pipeline::server, 1s); + auto* _class = utils::string::va("class%d", utils::cryptography::random::get_integer() % 5); + scripting::notify(entref, "luinotifyserver", {"class_select", _class}); + }, scheduler::pipeline::server, 2s); + }, scheduler::pipeline::server, 2s); } void spawn_bot(const int entity_num) diff --git a/src/client/component/logfile.cpp b/src/client/component/logfile.cpp new file mode 100644 index 00000000..fc949d92 --- /dev/null +++ b/src/client/component/logfile.cpp @@ -0,0 +1,317 @@ +#include +#include "loader/component_loader.hpp" +#include "scheduler.hpp" + +#include "game/scripting/entity.hpp" +#include "game/scripting/execution.hpp" +#include "game/scripting/lua/value_conversion.hpp" +#include "game/scripting/lua/error.hpp" + +#include + +#include "logfile.hpp" + +namespace logfile +{ + std::unordered_map vm_execute_hooks; + + namespace + { + utils::hook::detour scr_player_killed_hook; + utils::hook::detour scr_player_damage_hook; + + std::vector player_killed_callbacks; + std::vector player_damage_callbacks; + + utils::hook::detour vm_execute_hook; + char empty_function[2] = {0x32, 0x34}; // CHECK_CLEAR_PARAMS, END + bool hook_enabled = true; + + sol::lua_value convert_entity(lua_State* state, const game::mp::gentity_s* ent) + { + if (!ent) + { + return {}; + } + + const scripting::entity player{game::Scr_GetEntityId(ent->s.entityNum, 0)}; + return scripting::lua::convert(state, player); + } + + std::string get_weapon_name(unsigned int weapon, bool isAlternate) + { + char output[1024] = {0}; + game::BG_GetWeaponNameComplete(weapon, isAlternate, output, 1024); + return output; + } + + sol::lua_value convert_vector(lua_State* state, const float* vec) + { + if (!vec) + { + return {}; + } + + const auto vec_ = scripting::vector(vec); + return scripting::lua::convert(state, vec_); + } + + std::string convert_mod(const int meansOfDeath) + { + const auto value = reinterpret_cast(0x140FEC3F0)[meansOfDeath]; + const auto string = game::SL_ConvertToString(*value); + return string; + } + + void scr_player_killed_stub(game::mp::gentity_s* self, const game::mp::gentity_s* inflictor, + game::mp::gentity_s* attacker, int damage, const int meansOfDeath, const unsigned int weapon, + const bool isAlternate, const float* vDir, const unsigned int hitLoc, int psTimeOffset, int deathAnimDuration) + { + { + const std::string hitloc = reinterpret_cast(0x140FEC4D0)[hitLoc]; + const auto mod_ = convert_mod(meansOfDeath); + + const auto weapon_ = get_weapon_name(weapon, isAlternate); + + for (const auto& callback : player_killed_callbacks) + { + const auto state = callback.lua_state(); + + const auto self_ = convert_entity(state, self); + const auto inflictor_ = convert_entity(state, inflictor); + const auto attacker_ = convert_entity(state, attacker); + + const auto dir = convert_vector(state, vDir); + + const auto result = callback(self_, inflictor_, attacker_, damage, + mod_, weapon_, dir, hitloc, psTimeOffset, deathAnimDuration); + + scripting::lua::handle_error(result); + + if (result.valid() && result.get_type() == sol::type::number) + { + damage = result.get(); + } + } + + if (damage == 0) + { + return; + } + } + + scr_player_killed_hook.invoke(self, inflictor, attacker, damage, meansOfDeath, + weapon, isAlternate, vDir, hitLoc, psTimeOffset, deathAnimDuration); + } + + void scr_player_damage_stub(game::mp::gentity_s* self, const game::mp::gentity_s* inflictor, + game::mp::gentity_s* attacker, int damage, int dflags, const int meansOfDeath, + const unsigned int weapon, const bool isAlternate, const float* vPoint, + const float* vDir, const unsigned int hitLoc, const int timeOffset) + { + { + const std::string hitloc = reinterpret_cast(0x140FEC4D0)[hitLoc]; + const auto mod_ = convert_mod(meansOfDeath); + + const auto weapon_ = get_weapon_name(weapon, isAlternate); + + for (const auto& callback : player_damage_callbacks) + { + const auto state = callback.lua_state(); + + const auto self_ = convert_entity(state, self); + const auto inflictor_ = convert_entity(state, inflictor); + const auto attacker_ = convert_entity(state, attacker); + + const auto point = convert_vector(state, vPoint); + const auto dir = convert_vector(state, vDir); + + const auto result = callback(self_, inflictor_, attacker_, + damage, dflags, mod_, weapon_, point, dir, hitloc); + + scripting::lua::handle_error(result); + + if (result.valid() && result.get_type() == sol::type::number) + { + damage = result.get(); + } + } + + if (damage == 0) + { + return; + } + } + + scr_player_damage_hook.invoke(self, inflictor, attacker, damage, dflags, + meansOfDeath, weapon, isAlternate, vPoint, vDir, hitLoc, timeOffset); + } + + void client_command_stub(const int clientNum) + { + auto self = &game::mp::g_entities[clientNum]; + char cmd[1024] = {0}; + + game::SV_Cmd_ArgvBuffer(0, cmd, 1024); + + if (cmd == "say"s || cmd == "say_team"s) + { + auto hidden = false; + std::string message(game::ConcatArgs(1)); + + hidden = message[1] == '/'; + message.erase(0, hidden ? 2 : 1); + + scheduler::once([cmd, message, self]() + { + const scripting::entity level{*game::levelEntityId}; + const scripting::entity player{game::Scr_GetEntityId(self->s.entityNum, 0)}; + + scripting::notify(level, cmd, {player, message}); + scripting::notify(player, cmd, {message}); + }, scheduler::pipeline::server); + + if (hidden) + { + return; + } + } + + // ClientCommand + return utils::hook::invoke(0x140336000, clientNum); + } + + void g_shutdown_game_stub(const int freeScripts) + { + { + const scripting::entity level{*game::levelEntityId}; + scripting::notify(level, "shutdownGame_called", {1}); + } + + // G_ShutdownGame + return utils::hook::invoke(0x140345A60, freeScripts); + } + + unsigned int local_id_to_entity(unsigned int local_id) + { + const auto variable = game::scr_VarGlob->objectVariableValue[local_id]; + return variable.u.f.next; + } + + bool execute_vm_hook(const char* pos) + { + if (vm_execute_hooks.find(pos) == vm_execute_hooks.end()) + { + hook_enabled = true; + return false; + } + + if (!hook_enabled && pos > reinterpret_cast(vm_execute_hooks.size())) + { + hook_enabled = true; + return false; + } + + const auto hook = vm_execute_hooks[pos]; + const auto state = hook.lua_state(); + + const scripting::entity self = local_id_to_entity(game::scr_VmPub->function_frame->fs.localId); + + std::vector args; + + const auto top = game::scr_function_stack->top; + + for (auto* value = top; value->type != game::SCRIPT_END; --value) + { + args.push_back(scripting::lua::convert(state, *value)); + } + + const auto result = hook(self, sol::as_args(args)); + scripting::lua::handle_error(result); + + return true; + } + + void vm_execute_stub(utils::hook::assembler& a) + { + const auto replace = a.newLabel(); + const auto end = a.newLabel(); + + a.pushad64(); + + a.mov(rcx, r14); + a.call_aligned(execute_vm_hook); + + a.cmp(al, 0); + a.jne(replace); + + a.popad64(); + a.jmp(end); + + a.bind(end); + + a.movzx(r15d, byte_ptr(r14)); + a.inc(r14); + a.mov(dword_ptr(rbp, 0xA4), r15d); + + a.jmp(SELECT_VALUE(0x140376663, 0x140444653)); + + a.bind(replace); + + a.popad64(); + a.mov(r14, reinterpret_cast(empty_function)); + a.jmp(end); + } + } + + void add_player_damage_callback(const sol::protected_function& callback) + { + player_damage_callbacks.push_back(callback); + } + + void add_player_killed_callback(const sol::protected_function& callback) + { + player_killed_callbacks.push_back(callback); + } + + void clear_callbacks() + { + player_damage_callbacks.clear(); + player_killed_callbacks.clear(); + vm_execute_hooks.clear(); + } + + void enable_vm_execute_hook() + { + hook_enabled = true; + } + + void disable_vm_execute_hook() + { + hook_enabled = false; + } + + class component final : public component_interface + { + public: + void post_unpack() override + { + if (game::environment::is_sp()) + { + return; + } + + utils::hook::call(0x14048191D, client_command_stub); + + scr_player_damage_hook.create(0x14037DC50, scr_player_damage_stub); + scr_player_killed_hook.create(0x14037DF30, scr_player_killed_stub); + + utils::hook::call(0x140484EC0, g_shutdown_game_stub); + utils::hook::call(0x1404853C1, g_shutdown_game_stub); + + utils::hook::jump(SELECT_VALUE(0x140376655, 0x140444645), utils::hook::assemble(vm_execute_stub), true); + } + }; +} + +REGISTER_COMPONENT(logfile::component) \ No newline at end of file diff --git a/src/client/component/logfile.hpp b/src/client/component/logfile.hpp new file mode 100644 index 00000000..77f699c8 --- /dev/null +++ b/src/client/component/logfile.hpp @@ -0,0 +1,13 @@ +#pragma once + +namespace logfile +{ + extern std::unordered_map vm_execute_hooks; + + void add_player_damage_callback(const sol::protected_function& callback); + void add_player_killed_callback(const sol::protected_function& callback); + void clear_callbacks(); + + void enable_vm_execute_hook(); + void disable_vm_execute_hook(); +} \ No newline at end of file diff --git a/src/client/component/renderer.cpp b/src/client/component/renderer.cpp index f782b3b7..b315be76 100644 --- a/src/client/component/renderer.cpp +++ b/src/client/component/renderer.cpp @@ -35,7 +35,7 @@ namespace renderer { if (dvars::r_fullbright->modified) { - game::Dvar_ClearModified(dvars::r_fullbright); + //game::Dvar_ClearModified(dvars::r_fullbright); game::R_SyncRenderThread(); gfxdrawmethod(); diff --git a/src/client/component/scripting.cpp b/src/client/component/scripting.cpp new file mode 100644 index 00000000..e3116122 --- /dev/null +++ b/src/client/component/scripting.cpp @@ -0,0 +1,141 @@ +#include +#include "loader/component_loader.hpp" + +#include "game/game.hpp" +#include + +#include "game/scripting/entity.hpp" +#include "game/scripting/functions.hpp" +#include "game/scripting/event.hpp" +#include "game/scripting/lua/engine.hpp" +#include "game/scripting/execution.hpp" + +#include "scheduler.hpp" +#include "scripting.hpp" + +namespace scripting +{ + std::unordered_map> fields_table; + std::unordered_map> script_function_table; + + namespace + { + utils::hook::detour vm_notify_hook; + utils::hook::detour scr_load_level_hook; + utils::hook::detour g_shutdown_game_hook; + + utils::hook::detour scr_add_class_field_hook; + + utils::hook::detour scr_set_thread_position_hook; + utils::hook::detour process_script_hook; + + std::string current_file; + + void vm_notify_stub(const unsigned int notify_list_owner_id, const game::scr_string_t string_value, + game::VariableValue* top) + { + if (!game::VirtualLobby_Loaded()) + { + const auto* string = game::SL_ConvertToString(string_value); + if (string) + { + event e; + e.name = string; + e.entity = notify_list_owner_id; + + for (auto* value = top; value->type != game::SCRIPT_END; --value) + { + e.arguments.emplace_back(*value); + } + + if (e.name == "entitydeleted") + { + scripting::clear_entity_fields(e.entity); + } + + lua::engine::notify(e); + } + } + + vm_notify_hook.invoke(notify_list_owner_id, string_value, top); + } + + void scr_load_level_stub() + { + scr_load_level_hook.invoke(); + if (!game::VirtualLobby_Loaded()) + { + lua::engine::start(); + } + } + + void g_shutdown_game_stub(const int free_scripts) + { + lua::engine::stop(); + return g_shutdown_game_hook.invoke(free_scripts); + } + + void scr_add_class_field_stub(unsigned int classnum, game::scr_string_t _name, unsigned int canonicalString, unsigned int offset) + { + const auto name = game::SL_ConvertToString(_name); + + if (fields_table[classnum].find(name) == fields_table[classnum].end()) + { + fields_table[classnum][name] = offset; + } + + scr_add_class_field_hook.invoke(classnum, _name, canonicalString, offset); + } + + void process_script_stub(const char* filename) + { + const auto file_id = atoi(filename); + if (file_id) + { + current_file = scripting::find_token(file_id); + } + else + { + current_file = filename; + } + + process_script_hook.invoke(filename); + } + + void scr_set_thread_position_stub(unsigned int threadName, const char* codePos) + { + const auto function_name = scripting::find_token(threadName); + script_function_table[current_file][function_name] = codePos; + scr_set_thread_position_hook.invoke(threadName, codePos); + } + } + + class component final : public component_interface + { + public: + void post_unpack() override + { + if (game::environment::is_sp()) + { + return; + } + + vm_notify_hook.create(SELECT_VALUE(0x140379A00, 0x1404479F0), vm_notify_stub); + + scr_add_class_field_hook.create(SELECT_VALUE(0x140370370, 0x14043E2C0), scr_add_class_field_stub); + + scr_set_thread_position_hook.create(SELECT_VALUE(0x14036A180, 0x140437D10), scr_set_thread_position_stub); + process_script_hook.create(SELECT_VALUE(0x1403737E0, 0x1404417E0), process_script_stub); + + scr_load_level_hook.create(SELECT_VALUE(0x1402A5BE0, 0x1403727C0), scr_load_level_stub); + g_shutdown_game_hook.create(SELECT_VALUE(0x140277D40, 0x140345A60), g_shutdown_game_stub); + + scheduler::loop([]() + { + lua::engine::run_frame(); + }, scheduler::pipeline::server); + } + }; +} + +REGISTER_COMPONENT(scripting::component) \ No newline at end of file diff --git a/src/client/component/scripting.hpp b/src/client/component/scripting.hpp new file mode 100644 index 00000000..865ae858 --- /dev/null +++ b/src/client/component/scripting.hpp @@ -0,0 +1,8 @@ +#pragma once +#include + +namespace scripting +{ + extern std::unordered_map> fields_table; + extern std::unordered_map> script_function_table; +} \ No newline at end of file diff --git a/src/client/component/server_list.cpp b/src/client/component/server_list.cpp index 5f01c8c5..dace554a 100644 --- a/src/client/component/server_list.cpp +++ b/src/client/component/server_list.cpp @@ -12,6 +12,7 @@ #include #include "console.hpp" +#include "command.hpp" namespace server_list { @@ -377,7 +378,15 @@ namespace server_list if (!game::environment::is_mp()) return; localized_strings::override("PLATFORM_SYSTEM_LINK_TITLE", "SERVER LIST"); + localized_strings::override("MENU_NUMPLAYERS", "Players"); + // small command until ui scripting + command::add("openServerList", []() + { + refresh_server_list(); + command::execute("lui_open menu_systemlink_join\n"); + }); + // hook LUI_OpenMenu to refresh server list for system link menu lui_open_menu_hook.create(game::LUI_OpenMenu, lui_open_menu_stub); diff --git a/src/client/game/scripting/entity.cpp b/src/client/game/scripting/entity.cpp new file mode 100644 index 00000000..b81dea1b --- /dev/null +++ b/src/client/game/scripting/entity.cpp @@ -0,0 +1,120 @@ +#include +#include "entity.hpp" +#include "script_value.hpp" +#include "execution.hpp" + +namespace scripting +{ + entity::entity() + : entity(0) + { + } + + entity::entity(const entity& other) : entity(other.entity_id_) + { + } + + entity::entity(entity&& other) noexcept + { + this->entity_id_ = other.entity_id_; + other.entity_id_ = 0; + } + + entity::entity(const unsigned int entity_id) + : entity_id_(entity_id) + { + this->add(); + } + + entity::entity(game::scr_entref_t entref) + : entity(game::FindEntityId(entref.entnum, entref.classnum)) + { + } + + entity::~entity() + { + this->release(); + } + + entity& entity::operator=(const entity& other) + { + if (&other != this) + { + this->release(); + this->entity_id_ = other.entity_id_; + this->add(); + } + + return *this; + } + + entity& entity::operator=(entity&& other) noexcept + { + if (&other != this) + { + this->release(); + this->entity_id_ = other.entity_id_; + other.entity_id_ = 0; + } + + return *this; + } + + unsigned int entity::get_entity_id() const + { + return this->entity_id_; + } + + game::scr_entref_t entity::get_entity_reference() const + { + if (!this->entity_id_) + { + const auto not_null = static_cast(~0ui16); + return game::scr_entref_t{not_null, not_null}; + } + + return game::Scr_GetEntityIdRef(this->get_entity_id()); + } + + bool entity::operator==(const entity& other) const noexcept + { + return this->get_entity_id() == other.get_entity_id(); + } + + bool entity::operator!=(const entity& other) const noexcept + { + return !this->operator==(other); + } + + void entity::add() const + { + if (this->entity_id_) + { + game::AddRefToValue(game::SCRIPT_OBJECT, {static_cast(this->entity_id_)}); + } + } + + void entity::release() const + { + if (this->entity_id_) + { + game::RemoveRefToValue(game::SCRIPT_OBJECT, {static_cast(this->entity_id_)}); + } + } + + void entity::set(const std::string& field, const script_value& value) const + { + set_entity_field(*this, field, value); + } + + template <> + script_value entity::get(const std::string& field) const + { + return get_entity_field(*this, field); + } + + script_value entity::call(const std::string& name, const std::vector& arguments) const + { + return call_function(name, *this, arguments); + } +} diff --git a/src/client/game/scripting/entity.hpp b/src/client/game/scripting/entity.hpp new file mode 100644 index 00000000..b1702379 --- /dev/null +++ b/src/client/game/scripting/entity.hpp @@ -0,0 +1,50 @@ +#pragma once +#include "game/game.hpp" +#include "script_value.hpp" + +namespace scripting +{ + class entity final + { + public: + entity(); + entity(unsigned int entity_id); + entity(game::scr_entref_t entref); + + entity(const entity& other); + entity(entity&& other) noexcept; + + ~entity(); + + entity& operator=(const entity& other); + entity& operator=(entity&& other) noexcept; + + void set(const std::string& field, const script_value& value) const; + + template + T get(const std::string& field) const; + + script_value call(const std::string& name, const std::vector& arguments = {}) const; + + unsigned int get_entity_id() const; + game::scr_entref_t get_entity_reference() const; + + bool operator ==(const entity& other) const noexcept; + bool operator !=(const entity& other) const noexcept; + + private: + unsigned int entity_id_; + + void add() const; + void release() const; + }; + + template <> + script_value entity::get(const std::string& field) const; + + template + T entity::get(const std::string& field) const + { + return this->get(field).as(); + } +} diff --git a/src/client/game/scripting/event.hpp b/src/client/game/scripting/event.hpp new file mode 100644 index 00000000..bc1d53e0 --- /dev/null +++ b/src/client/game/scripting/event.hpp @@ -0,0 +1,13 @@ +#pragma once +#include "script_value.hpp" +#include "entity.hpp" + +namespace scripting +{ + struct event + { + std::string name; + entity entity{}; + std::vector arguments; + }; +} diff --git a/src/client/game/scripting/execution.cpp b/src/client/game/scripting/execution.cpp new file mode 100644 index 00000000..29faaad4 --- /dev/null +++ b/src/client/game/scripting/execution.cpp @@ -0,0 +1,240 @@ +#include +#include "execution.hpp" +#include "safe_execution.hpp" +#include "stack_isolation.hpp" + +#include "component/scripting.hpp" + +namespace scripting +{ + namespace + { + game::VariableValue* allocate_argument() + { + game::VariableValue* value_ptr = ++game::scr_VmPub->top; + ++game::scr_VmPub->inparamcount; + return value_ptr; + } + + void push_value(const script_value& value) + { + auto* value_ptr = allocate_argument(); + *value_ptr = value.get_raw(); + + game::AddRefToValue(value_ptr->type, value_ptr->u); + } + + int get_field_id(const int classnum, const std::string& field) + { + if (scripting::fields_table[classnum].find(field) != scripting::fields_table[classnum].end()) + { + return scripting::fields_table[classnum][field]; + } + + return -1; + } + + script_value get_return_value() + { + if (game::scr_VmPub->inparamcount == 0) + { + return {}; + } + + game::Scr_ClearOutParams(); + game::scr_VmPub->outparamcount = game::scr_VmPub->inparamcount; + game::scr_VmPub->inparamcount = 0; + + return script_value(game::scr_VmPub->top[1 - game::scr_VmPub->outparamcount]); + } + } + + void notify(const entity& entity, const std::string& event, const std::vector& arguments) + { + stack_isolation _; + for (auto i = arguments.rbegin(); i != arguments.rend(); ++i) + { + push_value(*i); + } + + const auto event_id = game::SL_GetString(event.data(), 0); + game::Scr_NotifyId(entity.get_entity_id(), event_id, game::scr_VmPub->inparamcount); + } + + script_value call_function(const std::string& name, const entity& entity, + const std::vector& arguments) + { + const auto entref = entity.get_entity_reference(); + + const auto is_method_call = *reinterpret_cast(&entref) != -1; + const auto function = find_function(name, !is_method_call); + if (function == nullptr) + { + throw std::runtime_error("Unknown "s + (is_method_call ? "method" : "function") + " '" + name + "'"); + } + + stack_isolation _; + + for (auto i = arguments.rbegin(); i != arguments.rend(); ++i) + { + push_value(*i); + } + + game::scr_VmPub->outparamcount = game::scr_VmPub->inparamcount; + game::scr_VmPub->inparamcount = 0; + + if (!safe_execution::call(function, entref)) + { + throw std::runtime_error( + "Error executing "s + (is_method_call ? "method" : "function") + " '" + name + "'"); + } + + return get_return_value(); + } + + script_value call_function(const std::string& name, const std::vector& arguments) + { + return call_function(name, entity(), arguments); + } + + template <> + script_value call(const std::string& name, const std::vector& arguments) + { + return call_function(name, arguments); + } + + script_value exec_ent_thread(const entity& entity, const char* pos, const std::vector& arguments) + { + const auto id = entity.get_entity_id(); + + stack_isolation _; + for (auto i = arguments.rbegin(); i != arguments.rend(); ++i) + { + scripting::push_value(*i); + } + + game::AddRefToObject(id); + + const auto local_id = game::AllocThread(id); + const auto result = game::VM_Execute(local_id, pos, (unsigned int)arguments.size()); + game::RemoveRefToObject(result); + + return get_return_value(); + } + + const char* get_function_pos(const std::string& filename, const std::string& function) + { + if (scripting::script_function_table.find(filename) == scripting::script_function_table.end()) + { + throw std::runtime_error("File '" + filename + "' not found"); + }; + + const auto functions = scripting::script_function_table[filename]; + if (functions.find(function) == functions.end()) + { + throw std::runtime_error("Function '" + function + "' in file '" + filename + "' not found"); + } + + return functions.at(function); + } + + script_value call_script_function(const entity& entity, const std::string& filename, + const std::string& function, const std::vector& arguments) + { + const auto pos = get_function_pos(filename, function); + return exec_ent_thread(entity, pos, arguments); + } + + static std::unordered_map> custom_fields; + + script_value get_custom_field(const entity& entity, const std::string& field) + { + auto& fields = custom_fields[entity.get_entity_id()]; + const auto _field = fields.find(field); + if (_field != fields.end()) + { + return _field->second; + } + return {}; + } + + void set_custom_field(const entity& entity, const std::string& field, const script_value& value) + { + const auto id = entity.get_entity_id(); + + if (custom_fields[id].find(field) != custom_fields[id].end()) + { + custom_fields[id][field] = value; + return; + } + + custom_fields[id].insert(std::make_pair(field, value)); + } + + void clear_entity_fields(const entity& entity) + { + const auto id = entity.get_entity_id(); + + if (custom_fields.find(id) != custom_fields.end()) + { + custom_fields[id].clear(); + } + } + + void clear_custom_fields() + { + custom_fields.clear(); + } + + void set_entity_field(const entity& entity, const std::string& field, const script_value& value) + { + const auto entref = entity.get_entity_reference(); + const int id = get_field_id(entref.classnum, field); + + if (id != -1) + { + stack_isolation _; + push_value(value); + + game::scr_VmPub->outparamcount = game::scr_VmPub->inparamcount; + game::scr_VmPub->inparamcount = 0; + + if (!safe_execution::set_entity_field(entref, id)) + { + throw std::runtime_error("Failed to set value for field '" + field + "'"); + } + } + else + { + // Read custom fields + set_custom_field(entity, field, value); + } + } + + script_value get_entity_field(const entity& entity, const std::string& field) + { + const auto entref = entity.get_entity_reference(); + const auto id = get_field_id(entref.classnum, field); + + if (id != -1) + { + stack_isolation _; + + game::VariableValue value{}; + if (!safe_execution::get_entity_field(entref, id, &value)) + { + throw std::runtime_error("Failed to get value for field '" + field + "'"); + } + + const auto __ = gsl::finally([value]() + { + game::RemoveRefToValue(value.type, value.u); + }); + + return value; + } + + // Add custom fields + return get_custom_field(entity, field); + } +} diff --git a/src/client/game/scripting/execution.hpp b/src/client/game/scripting/execution.hpp new file mode 100644 index 00000000..7fff1840 --- /dev/null +++ b/src/client/game/scripting/execution.hpp @@ -0,0 +1,36 @@ +#pragma once +#include "game/game.hpp" +#include "entity.hpp" +#include "script_value.hpp" + +namespace scripting +{ + script_value call_function(const std::string& name, const std::vector& arguments); + script_value call_function(const std::string& name, const entity& entity, + const std::vector& arguments); + + template + T call(const std::string& name, const std::vector& arguments = {}); + + template <> + script_value call(const std::string& name, const std::vector& arguments); + + template + T call(const std::string& name, const std::vector& arguments) + { + return call(name, arguments).as(); + } + + script_value exec_ent_thread(const entity& entity, const char* pos, const std::vector& arguments); + const char* get_function_pos(const std::string& filename, const std::string& function); + script_value call_script_function(const entity& entity, const std::string& filename, + const std::string& function, const std::vector& arguments); + + void clear_entity_fields(const entity& entity); + void clear_custom_fields(); + + void set_entity_field(const entity& entity, const std::string& field, const script_value& value); + script_value get_entity_field(const entity& entity, const std::string& field); + + void notify(const entity& entity, const std::string& event, const std::vector& arguments); +} diff --git a/src/client/game/scripting/function_tables.cpp b/src/client/game/scripting/function_tables.cpp new file mode 100644 index 00000000..9a70a9dd --- /dev/null +++ b/src/client/game/scripting/function_tables.cpp @@ -0,0 +1,3480 @@ +#include + +// This file has been generated. +// Do not touch! + +// https://github.com/xensik/gsc-tool/blob/dev/src/h1/xsk/resolver.cpp :) + +namespace scripting +{ + std::unordered_map function_map = + { + {"_func_001", 0x001}, // SP 0x14029D940 MP 0x140368EA0 + {"getweaponarray", 0x002}, // SP 0x14028F750 MP 0x140357B80 + {"_func_003", 0x003}, // SP 0x1405D92F0 MP 0x1403668A0 + {"_func_004", 0x004}, // SP 0x1402ACD70 MP 0x000000000 + {"_func_005", 0x005}, // SP 0x1402ADB70 MP 0x000000000 + {"_func_006", 0x006}, // SP 0x1402A8E20 MP 0x000000000 + {"_func_007", 0x007}, // SP 0x1402A8B20 MP 0x000000000 + {"_func_008", 0x008}, // SP 0x1402A8B40 MP 0x000000000 + {"_func_009", 0x009}, // SP 0x1402A8BC0 MP 0x000000000 + {"_func_00A", 0x00A}, // SP 0x1402A8B60 MP 0x000000000 + {"_func_00B", 0x00B}, // SP 0x1402A8960 MP 0x000000000 + {"_func_00C", 0x00C}, // SP 0x1402ADBE0 MP 0x000000000 + {"_func_00D", 0x00D}, // SP 0x1402ADC60 MP 0x000000000 + {"_func_00E", 0x00E}, // SP 0x1402ADC90 MP 0x000000000 + {"_func_00F", 0x00F}, // SP 0x1405D92F0 MP 0x1403669E0 + {"_func_010", 0x010}, // SP 0x14029AF60 MP 0x1403669F0 + {"_func_011", 0x011}, // SP 0x14029AF60 MP 0x140366D40 + {"_func_012", 0x012}, // SP 0x1405D92F0 MP 0x140367400 + {"_func_013", 0x013}, // SP 0x1405D92F0 MP 0x140367520 + {"_func_014", 0x014}, // SP 0x1405D92F0 MP 0x140367530 + {"_func_015", 0x015}, // SP 0x1405D92F0 MP 0x1403675E0 + {"_func_016", 0x016}, // SP 0x1405D92F0 MP 0x140367660 + {"_func_017", 0x017}, // SP 0x1405D92F0 MP 0x140367890 + {"spawnturret", 0x018}, // SP 0x14029D650 MP 0x140368B10 + {"canspawnturret", 0x019}, // SP 0x14029D870 MP 0x140368E80 + {"_func_01A", 0x01A}, // SP 0x14029C9B0 MP 0x1403678A0 + {"_func_01B", 0x01B}, // SP 0x1402AB640 MP 0x000000000 + {"_func_01C", 0x01C}, // SP 0x1402AB670 MP 0x000000000 + {"_func_01D", 0x01D}, // SP 0x1402AB7A0 MP 0x000000000 + {"_func_01E", 0x01E}, // SP 0x1402AB960 MP 0x000000000 + {"badplace_delete", 0x01F}, // SP 0x14028F340 MP 0x140358600 + {"badplace_cylinder", 0x020}, // SP 0x14028F4B0 MP 0x140358C50 + {"badplace_arc", 0x021}, // SP 0x14028F830 MP 0x140359110 + {"badplace_brush", 0x022}, // SP 0x14028FF10 MP 0x140359CB0 + {"_func_023", 0x023}, // SP 0x1402AC9D0 MP 0x000000000 + {"_func_024", 0x024}, // SP 0x1402CC640 MP 0x000000000 + {"_func_025", 0x025}, // SP 0x1402CC6E0 MP 0x000000000 + {"_func_026", 0x026}, // SP 0x1402CC570 MP 0x000000000 + {"_func_027", 0x027}, // SP 0x1402CC430 MP 0x000000000 + {"_func_02A", 0x02A}, // SP 0x1405D92F0 MP 0x000000000 + {"_func_02B", 0x02B}, // SP 0x1405D92F0 MP 0x000000000 + {"_func_02C", 0x02C}, // SP 0x1402ACD10 MP 0x000000000 + {"_func_02D", 0x02D}, // SP 0x14029C9B0 MP 0x140367950 + {"_func_02E", 0x02E}, // SP 0x14029CAC0 MP 0x140367980 + {"isdefined", 0x02F}, // SP 0x14029D000 MP 0x140368520 + {"isvalidmissile", 0x030}, // SP 0x14029D3E0 MP 0x140368A70 + {"_func_031", 0x031}, // SP 0x14029D630 MP 0x140368D30 + {"_func_032", 0x032}, // SP 0x14029E0A0 MP 0x14036A580 + {"_func_033", 0x033}, // SP 0x14029E220 MP 0x14036A7C0 + {"setdynamicdvar", 0x034}, // SP 0x14029EB20 MP 0x14036AE70 + {"_func_035", 0x035}, // SP 0x000000000 MP 0x14036B600 + {"_func_036", 0x036}, // SP 0x14029F8F0 MP 0x14036BB60 + {"setdvar", 0x037}, // SP 0x14029F1C0 MP 0x14036B7F0 + {"_func_038", 0x038}, // SP 0x14029F8F0 MP 0x14036C070 + {"getdvar", 0x039}, // SP 0x14029FE30 MP 0x14036C350 + {"getdvarint", 0x03A}, // SP 0x1402A0270 MP 0x14036C7B0 + {"getdvarfloat", 0x03B}, // SP 0x1402A0810 MP 0x14036CDD0 + {"getdvarvector", 0x03C}, // SP 0x1402A10E0 MP 0x14036D190 + {"_func_03D", 0x03D}, // SP 0x1402A1A50 MP 0x14036DB40 + {"_func_03E", 0x03E}, // SP 0x1402A1A60 MP 0x14036DD80 + {"_func_03F", 0x03F}, // SP 0x1402A1AC0 MP 0x14036DDA0 + {"getentbynum", 0x040}, // SP 0x1402A1C50 MP 0x14036DF50 + {"_func_041", 0x041}, // SP 0x1402A1D10 MP 0x000000000 + {"_func_042", 0x042}, // SP 0x1402A1D20 MP 0x000000000 + {"_func_043", 0x043}, // SP 0x1402A1D30 MP 0x14036E110 + {"_func_044", 0x044}, // SP 0x1402ABBE0 MP 0x000000000 + {"_func_045", 0x045}, // SP 0x1402ABCF0 MP 0x000000000 + {"_func_046", 0x046}, // SP 0x1402ABD30 MP 0x000000000 + {"_func_047", 0x047}, // SP 0x1402ABD90 MP 0x1403775E0 + {"_func_048", 0x048}, // SP 0x1402ABE60 MP 0x140377840 + {"_func_049", 0x049}, // SP 0x1402ABF90 MP 0x000000000 + {"_func_04A", 0x04A}, // SP 0x1402ABFC0 MP 0x000000000 + {"_func_04B", 0x04B}, // SP 0x1402AC0E0 MP 0x000000000 + {"_func_04C", 0x04C}, // SP 0x1402AC210 MP 0x000000000 + {"_func_04D", 0x04D}, // SP 0x1402AC520 MP 0x000000000 + {"_func_04E", 0x04E}, // SP 0x1402AC6F0 MP 0x000000000 + {"_func_04F", 0x04F}, // SP 0x1402AC720 MP 0x000000000 + {"_func_050", 0x050}, // SP 0x1402AC740 MP 0x000000000 + {"_func_051", 0x051}, // SP 0x1402AC760 MP 0x000000000 + {"_func_052", 0x052}, // SP 0x1402AC780 MP 0x000000000 + {"_func_053", 0x053}, // SP 0x1402AC830 MP 0x000000000 + {"_func_054", 0x054}, // SP 0x1402AD6E0 MP 0x000000000 + {"_func_055", 0x055}, // SP 0x1402AAEC0 MP 0x000000000 + {"_func_056", 0x056}, // SP 0x1402AAF60 MP 0x000000000 + {"_func_057", 0x057}, // SP 0x1402AB040 MP 0x000000000 + {"_func_058", 0x058}, // SP 0x1402AB060 MP 0x000000000 + {"_func_059", 0x059}, // SP 0x1402AB140 MP 0x000000000 + {"_func_05A", 0x05A}, // SP 0x1402AB1E0 MP 0x000000000 + {"_func_05B", 0x05B}, // SP 0x1402AB2A0 MP 0x000000000 + {"_func_05C", 0x05C}, // SP 0x1402AB420 MP 0x000000000 + {"_func_05D", 0x05D}, // SP 0x1402AB4A0 MP 0x000000000 + {"_func_05E", 0x05E}, // SP 0x1402AB620 MP 0x000000000 + {"_func_05F", 0x05F}, // SP 0x1402A2410 MP 0x14036E740 + {"_func_060", 0x060}, // SP 0x1402A2910 MP 0x14036ED60 + {"_func_061", 0x061}, // SP 0x1402A3170 MP 0x14036F3E0 + {"_func_062", 0x062}, // SP 0x1402A34D0 MP 0x140357CA0 + {"getweaponreticlename", 0x063}, // SP 0x14028DEA0 MP 0x140358890 + {"_func_064", 0x064}, // SP 0x14028E0B0 MP 0x140358B80 + {"getanimlength", 0x065}, // SP 0x14028FB80 MP 0x14035AB80 + {"animhasnotetrack", 0x066}, // SP 0x14028FD60 MP 0x14035B110 + {"getnotetracktimes", 0x067}, // SP 0x14028FDC0 MP 0x14035B220 + {"spawn", 0x068}, // SP 0x14029D0C0 MP 0x140368410 + {"spawnloopsound", 0x069}, // SP 0x14029D0C0 MP 0x140368410 + {"_func_06A", 0x06A}, // SP 0x140444BB0 MP 0x14036AF90 + {"_func_06B", 0x06B}, // SP 0x14029E950 MP 0x140366EF0 + {"_func_06C", 0x06C}, // SP 0x1402BBCA0 MP 0x000000000 + {"_func_06D", 0x06D}, // SP 0x1402BB830 MP 0x000000000 + {"_func_06E", 0x06E}, // SP 0x1402BB990 MP 0x000000000 + {"_func_06F", 0x06F}, // SP 0x14025D860 MP 0x140375D40 + {"_func_070", 0x070}, // SP 0x14025D770 MP 0x140375F10 + {"_func_071", 0x071}, // SP 0x14025D630 MP 0x000000000 + {"_func_072", 0x072}, // SP 0x1402AB510 MP 0x000000000 + {"_func_073", 0x073}, // SP 0x1402981B0 MP 0x140364BC0 + {"_func_074", 0x074}, // SP 0x1402AFD80 MP 0x000000000 + {"_func_075", 0x075}, // SP 0x1402AFEA0 MP 0x000000000 + {"_func_076", 0x076}, // SP 0x1402A78A0 MP 0x000000000 + {"_func_077", 0x077}, // SP 0x1402A79D0 MP 0x000000000 + {"_func_078", 0x078}, // SP 0x14029E170 MP 0x140367970 + {"_func_079", 0x079}, // SP 0x14029E210 MP 0x140367990 + {"_func_07A", 0x07A}, // SP 0x14029E2D0 MP 0x140367D70 + {"_func_07B", 0x07B}, // SP 0x14029E320 MP 0x140367F30 + {"_func_07C", 0x07C}, // SP 0x14029E330 MP 0x140367F40 + {"_func_07D", 0x07D}, // SP 0x14029E730 MP 0x140367FA0 + {"_func_07E", 0x07E}, // SP 0x1402A7BF0 MP 0x000000000 + {"_func_07F", 0x07F}, // SP 0x1402A8BB0 MP 0x000000000 + {"_func_080", 0x080}, // SP 0x1402A7A80 MP 0x000000000 + {"_func_081", 0x081}, // SP 0x1402AAE30 MP 0x000000000 + {"_func_083", 0x083}, // SP 0x1402AAE50 MP 0x000000000 + {"_func_084", 0x084}, // SP 0x1402AAEA0 MP 0x000000000 + {"_func_085", 0x085}, // SP 0x1402A8CB0 MP 0x000000000 + {"_func_086", 0x086}, // SP 0x1402A9990 MP 0x000000000 + {"_func_087", 0x087}, // SP 0x1402A99B0 MP 0x000000000 + {"_func_088", 0x088}, // SP 0x1402A9100 MP 0x000000000 + {"_func_089", 0x089}, // SP 0x1402A99D0 MP 0x000000000 + {"_func_08A", 0x08A}, // SP 0x1402A9A70 MP 0x000000000 + {"_func_08B", 0x08B}, // SP 0x1402AB690 MP 0x000000000 + {"_func_08C", 0x08C}, // SP 0x1402ABB90 MP 0x000000000 + {"bullettracepassed", 0x08D}, // SP 0x14029F480 MP 0x140367410 + {"_func_08E", 0x08E}, // SP 0x14029F7A0 MP 0x140367670 + {"_func_08F", 0x08F}, // SP 0x14029FF90 MP 0x140367E20 + {"_func_090", 0x090}, // SP 0x1402A0360 MP 0x140368180 + {"_func_091", 0x091}, // SP 0x1402A2670 MP 0x14036A300 + {"getangledelta", 0x092}, // SP 0x14028F3D0 MP 0x14036E210 + {"getangledelta3d", 0x093}, // SP 0x14028FA60 MP 0x14036E910 + {"getnorthyaw", 0x094}, // SP 0x1402903E0 MP 0x140357C50 + {"_func_095", 0x095}, // SP 0x1402A7970 MP 0x000000000 + {"_func_096", 0x096}, // SP 0x1402A7A50 MP 0x000000000 + {"_func_097", 0x097}, // SP 0x1402A9B20 MP 0x000000000 + {"_func_098", 0x098}, // SP 0x1402A9B70 MP 0x000000000 + {"_func_099", 0x099}, // SP 0x1402A9AE0 MP 0x000000000 + {"_func_09A", 0x09A}, // SP 0x1402AE4D0 MP 0x000000000 + {"_func_09B", 0x09B}, // SP 0x1402BB040 MP 0x000000000 + {"_func_09C", 0x09C}, // SP 0x1402BB410 MP 0x000000000 + {"_func_09D", 0x09D}, // SP 0x1402BB6F0 MP 0x000000000 + {"_func_09E", 0x09E}, // SP 0x1402BB6B0 MP 0x000000000 + {"_func_09F", 0x09F}, // SP 0x1402BC260 MP 0x000000000 + {"_func_0A0", 0x0A0}, // SP 0x1402BBF00 MP 0x000000000 + {"_func_0A1", 0x0A1}, // SP 0x1402BB590 MP 0x000000000 + {"_func_0A2", 0x0A2}, // SP 0x1402BB520 MP 0x000000000 + {"_func_0A3", 0x0A3}, // SP 0x1402BC390 MP 0x000000000 + {"_func_0A4", 0x0A4}, // SP 0x1402BB060 MP 0x000000000 + {"_func_0A5", 0x0A5}, // SP 0x1402BB4A0 MP 0x000000000 + {"_func_0A6", 0x0A6}, // SP 0x1402BB630 MP 0x000000000 + {"_func_0A7", 0x0A7}, // SP 0x1402BB710 MP 0x000000000 + {"_func_0A8", 0x0A8}, // SP 0x1402BBB80 MP 0x000000000 + {"_func_0A9", 0x0A9}, // SP 0x1402BB510 MP 0x000000000 + {"_func_0AA", 0x0AA}, // SP 0x1402BC380 MP 0x000000000 + {"_func_0AB", 0x0AB}, // SP 0x1402BC140 MP 0x000000000 + {"_func_0AC", 0x0AC}, // SP 0x1402BB090 MP 0x000000000 + {"_func_0AD", 0x0AD}, // SP 0x1402BB2C0 MP 0x000000000 + {"_func_0AE", 0x0AE}, // SP 0x1402BB1C0 MP 0x000000000 + {"_func_0AF", 0x0AF}, // SP 0x1402BBDB0 MP 0x000000000 + {"_func_0B0", 0x0B0}, // SP 0x140290420 MP 0x140357E90 + {"setslowmotion", 0x0B1}, // SP 0x14029BC60 MP 0x140365480 + {"randomint", 0x0B2}, // SP 0x1402A2ED0 MP 0x14036A770 + {"randomfloat", 0x0B3}, // SP 0x1402A3140 MP 0x14036A9E0 + {"randomintrange", 0x0B4}, // SP 0x1402A3240 MP 0x14036ACD0 + {"randomfloatrange", 0x0B5}, // SP 0x1402A3310 MP 0x14036AE10 + {"sin", 0x0B6}, // SP 0x1402A3440 MP 0x14036B240 + {"cos", 0x0B7}, // SP 0x1402A34A0 MP 0x14036B550 + {"tan", 0x0B8}, // SP 0x1402A3610 MP 0x14036B5A0 + {"asin", 0x0B9}, // SP 0x1402A37D0 MP 0x14036B720 + {"acos", 0x0BA}, // SP 0x1402A3A60 MP 0x14036B7A0 + {"atan", 0x0BB}, // SP 0x14028D680 MP 0x14036BAE0 + {"int", 0x0BC}, // SP 0x14028DAE0 MP 0x14036BBF0 + {"float", 0x0BD}, // SP 0x14028DE30 MP 0x14036C000 + {"abs", 0x0BE}, // SP 0x14028DFC0 MP 0x14036C320 + {"_func_0BF", 0x0BF}, // SP 0x14028DFF0 MP 0x14036C580 + {"_func_0C0", 0x0C0}, // SP 0x1402B7A30 MP 0x000000000 + {"_func_0C1", 0x0C1}, // SP 0x1402B7B50 MP 0x000000000 + {"_func_0C2", 0x0C2}, // SP 0x1402B7BF0 MP 0x000000000 + {"getnode", 0x0C3}, // SP 0x1402CBED0 MP 0x14031FA00 + {"getnodearray", 0x0C4}, // SP 0x1402CBFE0 MP 0x14031FB10 + {"getallnodes", 0x0C5}, // SP 0x1402CBCD0 MP 0x14031F7E0 + {"_func_0C6", 0x0C6}, // SP 0x1402CC0F0 MP 0x14031FCC0 + {"_func_0C7", 0x0C7}, // SP 0x1402CC100 MP 0x14031FCD0 + {"_func_0C8", 0x0C8}, // SP 0x1402CBD20 MP 0x14031F830 + {"_func_0C9", 0x0C9}, // SP 0x1405D92F0 MP 0x000000000 + {"_func_0CA", 0x0CA}, // SP 0x1405D92F0 MP 0x000000000 + {"_func_0CB", 0x0CB}, // SP 0x140468CF0 MP 0x000000000 + {"_func_0CC", 0x0CC}, // SP 0x140468DD0 MP 0x000000000 + {"_func_0CD", 0x0CD}, // SP 0x140468CA0 MP 0x000000000 + {"isarray", 0x0CE}, // SP 0x140291BF0 MP 0x14035E620 + {"isai", 0x0CF}, // SP 0x1402ADC10 MP 0x140377460 + {"getindexforluincstring", 0x0D0}, // SP 0x14029DB50 MP 0x140369C50 + {"issentient", 0x0D1}, // SP 0x14029D7D0 MP 0x140368DA0 + {"_func_0D2", 0x0D2}, // SP 0x1402ADD90 MP 0x000000000 + {"_func_0D3", 0x0D3}, // SP 0x1402ADED0 MP 0x000000000 + {"_func_0D4", 0x0D4}, // SP 0x1402ADF60 MP 0x000000000 + {"_func_0D5", 0x0D5}, // SP 0x1402ADFD0 MP 0x000000000 + {"_func_0D6", 0x0D6}, // SP 0x1402AE020 MP 0x000000000 + {"_func_0D7", 0x0D7}, // SP 0x1402AE4E0 MP 0x000000000 + {"_func_0D8", 0x0D8}, // SP 0x1402AE4F0 MP 0x000000000 + {"_func_0D9", 0x0D9}, // SP 0x1402AE7A0 MP 0x000000000 + {"_func_0DA", 0x0DA}, // SP 0x1402AF980 MP 0x000000000 + {"_func_0DB", 0x0DB}, // SP 0x1402AFBD0 MP 0x000000000 + {"_func_0DC", 0x0DC}, // SP 0x1402AFB20 MP 0x000000000 + {"_func_0DD", 0x0DD}, // SP 0x1402AFCE0 MP 0x000000000 + {"_func_0DE", 0x0DE}, // SP 0x1402AFE20 MP 0x000000000 + {"_func_0DF", 0x0DF}, // SP 0x14029CAC0 MP 0x000000000 + {"_func_0E0", 0x0E0}, // SP 0x1402A7830 MP 0x000000000 + {"_func_0E1", 0x0E1}, // SP 0x14028E170 MP 0x14036C720 + {"floor", 0x0E2}, // SP 0x14028E1C0 MP 0x14036C750 + {"ceil", 0x0E3}, // SP 0x14028E260 MP 0x14036C770 + {"exp", 0x0E4}, // SP 0x14028E280 MP 0x14036C790 + {"exp", 0x0E5}, // SP 0x14028E370 MP 0x14036C820 + {"log", 0x0E6}, // SP 0x14028E410 MP 0x14036C840 + {"sqrt", 0x0E7}, // SP 0x14028E470 MP 0x14036CB80 + {"squared", 0x0E8}, // SP 0x14028E4B0 MP 0x14036CBA0 + {"_func_0E9", 0x0E9}, // SP 0x14028E770 MP 0x14036CE40 + {"_func_0EA", 0x0EA}, // SP 0x14028E8C0 MP 0x14036CF30 + {"angleclamp180", 0x0EB}, // SP 0x14028E920 MP 0x14036CFB0 + {"vectorfromlinetopoint", 0x0EC}, // SP 0x140290740 MP 0x14036E5A0 + {"pointonsegmentnearesttopoint", 0x0ED}, // SP 0x140290B60 MP 0x14036EB30 + {"_func_0EE", 0x0EE}, // SP 0x140291260 MP 0x14036F6E0 + {"_func_0EF", 0x0EF}, // SP 0x1402913A0 MP 0x14036F790 + {"_func_0F0", 0x0F0}, // SP 0x140291600 MP 0x140357E10 + {"_func_0F1", 0x0F1}, // SP 0x1402918C0 MP 0x140357FB0 + {"_func_0F2", 0x0F2}, // SP 0x140291930 MP 0x140358030 + {"_func_0F3", 0x0F3}, // SP 0x140291AF0 MP 0x140358130 + {"_func_0F4", 0x0F4}, // SP 0x140291B30 MP 0x140358190 + {"_func_0F5", 0x0F5}, // SP 0x140291C20 MP 0x1403581E0 + {"_func_0F6", 0x0F6}, // SP 0x140291EB0 MP 0x140358570 + {"_func_0F7", 0x0F7}, // SP 0x140291F80 MP 0x140358640 + {"axistoangles", 0x0F8}, // SP 0x140292690 MP 0x140359050 + {"_func_0F9", 0x0F9}, // SP 0x1402ABB50 MP 0x1403771E0 + {"_func_0FA", 0x0FA}, // SP 0x1402ABB60 MP 0x140377260 + {"_func_0FB", 0x0FB}, // SP 0x000000000 MP 0x14037B950 + {"_func_0FC", 0x0FC}, // SP 0x000000000 MP 0x140374E10 + {"getmapcustom", 0x0FD}, // SP 0x000000000 MP 0x140378260 + {"_func_0FE", 0x0FE}, // SP 0x000000000 MP 0x1403765A0 + {"incrementcounter", 0x0FF}, // SP 0x1402AE370 MP 0x140374FE0 + {"getcountertotal", 0x100}, // SP 0x1402AE3C0 MP 0x140375100 + {"_func_101", 0x101}, // SP 0x1402A1AE0 MP 0x000000000 + {"_func_102", 0x102}, // SP 0x14028E970 MP 0x000000000 + {"_func_103", 0x103}, // SP 0x14028ED80 MP 0x000000000 + {"_func_104", 0x104}, // SP 0x1405D92F0 MP 0x14042C2C0 + {"_func_105", 0x105}, // SP 0x1405D92F0 MP 0x14042C2D0 + {"_func_106", 0x106}, // SP 0x14028D7F0 MP 0x000000000 + {"createthreatbiasgroup", 0x107}, // SP 0x1402D79E0 MP 0x1400774E0 + {"threatbiasgroupexists", 0x108}, // SP 0x1402D7A10 MP 0x140077510 + {"getthreatbias", 0x109}, // SP 0x1402D7A50 MP 0x140077550 + {"setthreatbias", 0x10A}, // SP 0x1402D7AB0 MP 0x1400775B0 + {"setthreatbiasagainstall", 0x10B}, // SP 0x1402D7B30 MP 0x140077630 + {"setignoremegroup", 0x10C}, // SP 0x1402D7B80 MP 0x140077680 + {"isenemyteam", 0x10D}, // SP 0x1402D7CC0 MP 0x140077820 + {"_func_10E", 0x10E}, // SP 0x1402B7530 MP 0x000000000 + {"_func_10F", 0x10F}, // SP 0x1402B77F0 MP 0x000000000 + {"_func_110", 0x110}, // SP 0x1402B7800 MP 0x000000000 + {"_func_111", 0x111}, // SP 0x1402B7810 MP 0x000000000 + {"_func_112", 0x112}, // SP 0x1402B79C0 MP 0x000000000 + {"_func_113", 0x113}, // SP 0x1402B7A20 MP 0x000000000 + {"vectornormalize", 0x114}, // SP 0x140292150 MP 0x1403587A0 + {"vectortoangles", 0x115}, // SP 0x140292290 MP 0x140358A90 + {"vectortoyaw", 0x116}, // SP 0x1402924D0 MP 0x140358B10 + {"vectorlerp", 0x117}, // SP 0x140292510 MP 0x140358E60 + {"anglestoup", 0x118}, // SP 0x140292C80 MP 0x1403596E0 + {"_func_119", 0x119}, // SP 0x140292D50 MP 0x140359890 + {"_func_11A", 0x11A}, // SP 0x140292F80 MP 0x140359930 + {"anglesdelta", 0x11B}, // SP 0x1402930E0 MP 0x140359BC0 + {"_func_11C", 0x11C}, // SP 0x1402934C0 MP 0x14035A0F0 + {"_func_11D", 0x11D}, // SP 0x140293670 MP 0x14035A280 + {"_func_11E", 0x11E}, // SP 0x1402956B0 MP 0x14035B550 + {"_func_11F", 0x11F}, // SP 0x140295850 MP 0x14035B7F0 + {"issubstr", 0x120}, // SP 0x140296960 MP 0x14035CB70 + {"isendstr", 0x121}, // SP 0x1402969A0 MP 0x14035CD40 + {"getsubstr", 0x122}, // SP 0x140296BB0 MP 0x14035CF80 + {"tolower", 0x123}, // SP 0x140296DC0 MP 0x14035D360 + {"_func_124", 0x124}, // SP 0x140297230 MP 0x14035DA90 + {"_func_125", 0x125}, // SP 0x140297970 MP 0x14035E690 + {"_func_126", 0x126}, // SP 0x14029FA50 MP 0x1403679A0 + {"getuavstrengthmax", 0x127}, // SP 0x000000000 MP 0x14037B790 + {"getuavstrengthlevelshowenemyfastsweep", 0x128}, // SP 0x000000000 MP 0x14037B7A0 + {"isdedicatedserver", 0x129}, // SP 0x000000000 MP 0x14037B7B0 + {"worldentnumber", 0x12A}, // SP 0x000000000 MP 0x14037B7C0 + {"blockteamradar", 0x12B}, // SP 0x000000000 MP 0x14037B7D0 + {"unblockteamradar", 0x12C}, // SP 0x000000000 MP 0x14037B830 + {"isteamradarblocked", 0x12D}, // SP 0x000000000 MP 0x14037B8B0 + {"_func_12E", 0x12E}, // SP 0x000000000 MP 0x140378110 + {"_func_12F", 0x12F}, // SP 0x000000000 MP 0x14037A7B0 + {"_func_130", 0x130}, // SP 0x000000000 MP 0x140378420 + {"sendmatchdata", 0x131}, // SP 0x000000000 MP 0x140378490 + {"_func_132", 0x132}, // SP 0x000000000 MP 0x140378F40 + {"_func_133", 0x133}, // SP 0x000000000 MP 0x14037A820 + {"_func_134", 0x134}, // SP 0x000000000 MP 0x140378FE0 + {"setmatchdataid", 0x135}, // SP 0x000000000 MP 0x140378DD0 + {"_func_136", 0x136}, // SP 0x000000000 MP 0x140378F70 + {"getmatchdata", 0x137}, // SP 0x000000000 MP 0x140378290 + {"_func_138", 0x138}, // SP 0x000000000 MP 0x14037A8D0 + {"sendclientmatchdata", 0x139}, // SP 0x000000000 MP 0x14037ADE0 + {"getbuildversion", 0x13A}, // SP 0x000000000 MP 0x14037AEB0 + {"getsquadassaultelo", 0x13B}, // SP 0x000000000 MP 0x14037B0E0 + {"getsystemtime", 0x13C}, // SP 0x000000000 MP 0x14037B100 + {"getmatchrulesdata", 0x13D}, // SP 0x000000000 MP 0x14037AA30 + {"isusingmatchrulesdata", 0x13E}, // SP 0x000000000 MP 0x14037AB20 + {"_func_13F", 0x13F}, // SP 0x000000000 MP 0x1403769E0 + {"ishairrunning", 0x140}, // SP 0x1402ACD00 MP 0x140378030 + {"setmapcenter", 0x141}, // SP 0x000000000 MP 0x14037B550 + {"setgameendtime", 0x142}, // SP 0x000000000 MP 0x14037B5A0 + {"visionsetthermal", 0x143}, // SP 0x1402ABA00 MP 0x140376D40 + {"visionsetpain", 0x144}, // SP 0x1402ABA10 MP 0x1403770E0 + {"visionsetpostapply", 0x145}, // SP 0x1402ABA20 MP 0x140377160 + {"_func_146", 0x146}, // SP 0x1402A12A0 MP 0x1403699C0 + {"_func_147", 0x147}, // SP 0x140298040 MP 0x14035F250 + {"_func_148", 0x148}, // SP 0x140298370 MP 0x14035F7A0 + {"_func_149", 0x149}, // SP 0x14029E7B0 MP 0x140366DA0 + {"_func_14A", 0x14A}, // SP 0x14029ECC0 MP 0x140366E30 + {"_func_14B", 0x14B}, // SP 0x14029F2B0 MP 0x1403673D0 + {"_func_14C", 0x14C}, // SP 0x14029F3E0 MP 0x140367540 + {"_func_14D", 0x14D}, // SP 0x14029F5B0 MP 0x1403675F0 + {"_func_14E", 0x14E}, // SP 0x1402982C0 MP 0x14035F470 + {"_func_14F", 0x14F}, // SP 0x14029EDB0 MP 0x1403670E0 + {"loadfx", 0x150}, // SP 0x140290A80 MP 0x1403583B0 + {"_func_151", 0x151}, // SP 0x140291730 MP 0x140359620 + {"playfxontag", 0x152}, // SP 0x140292A40 MP 0x14035AF90 + {"stopfxontag", 0x153}, // SP 0x140294440 MP 0x14035C4B0 + {"_func_154", 0x154}, // SP 0x140294DD0 MP 0x14035D560 + {"playloopedfx", 0x155}, // SP 0x140474350 MP 0x14037DA70 + {"spawnfx", 0x156}, // SP 0x1404746B0 MP 0x14037E2D0 + {"triggerfx", 0x157}, // SP 0x140474940 MP 0x14037E8B0 + {"_func_158", 0x158}, // SP 0x140292ED0 MP 0x14035B2B0 + {"_func_159", 0x159}, // SP 0x140474640 MP 0x14037E1D0 + {"_func_15A", 0x15A}, // SP 0x140293D50 MP 0x14035BFE0 + {"_func_15B", 0x15B}, // SP 0x000000000 MP 0x1403778C0 + {"_func_15C", 0x15C}, // SP 0x000000000 MP 0x140377920 + {"clientannouncement", 0x15D}, // SP 0x000000000 MP 0x1403779A0 + {"setteammode", 0x15E}, // SP 0x000000000 MP 0x140377A40 + {"getteamscore", 0x15F}, // SP 0x000000000 MP 0x140377BE0 + {"setteamscore", 0x160}, // SP 0x000000000 MP 0x140377C50 + {"setclientnamemode", 0x161}, // SP 0x000000000 MP 0x140377D70 + {"updateclientnames", 0x162}, // SP 0x000000000 MP 0x140377DC0 + {"getteamplayersalive", 0x163}, // SP 0x000000000 MP 0x140377EB0 + {"_func_164", 0x164}, // SP 0x000000000 MP 0x140375460 + {"_func_165", 0x165}, // SP 0x000000000 MP 0x140375480 + {"_func_166", 0x166}, // SP 0x000000000 MP 0x1403754A0 + {"_func_167", 0x167}, // SP 0x000000000 MP 0x1403756D0 + {"_func_168", 0x168}, // SP 0x000000000 MP 0x1403759C0 + {"_func_169", 0x169}, // SP 0x000000000 MP 0x1403760D0 + {"_func_16A", 0x16A}, // SP 0x14029F100 MP 0x1403673A0 + {"_func_16B", 0x16B}, // SP 0x000000000 MP 0x140376BE0 + {"_func_16C", 0x16C}, // SP 0x000000000 MP 0x140376C60 + {"map_restart", 0x16D}, // SP 0x000000000 MP 0x140376550 + {"exitlevel", 0x16E}, // SP 0x000000000 MP 0x140376630 + {"_func_16F", 0x16F}, // SP 0x000000000 MP 0x140376680 + {"addagent", 0x170}, // SP 0x000000000 MP 0x140376860 + {"_func_171", 0x171}, // SP 0x000000000 MP 0x140378020 + {"_func_172", 0x172}, // SP 0x000000000 MP 0x140376880 + {"_func_173", 0x173}, // SP 0x000000000 MP 0x140376B60 + {"mapexists", 0x174}, // SP 0x000000000 MP 0x140376910 + {"isvalidgametype", 0x175}, // SP 0x000000000 MP 0x140376950 + {"_func_176", 0x176}, // SP 0x000000000 MP 0x140378040 + {"setplayerteamrank", 0x177}, // SP 0x000000000 MP 0x140378050 + {"_func_178", 0x178}, // SP 0x000000000 MP 0x140378100 + {"setteamradar", 0x179}, // SP 0x000000000 MP 0x14037B5D0 + {"getteamradar", 0x17A}, // SP 0x000000000 MP 0x14037B640 + {"setteamradarstrength", 0x17B}, // SP 0x000000000 MP 0x14037B6A0 + {"getteamradarstrength", 0x17C}, // SP 0x000000000 MP 0x14037B720 + {"getuavstrengthmin", 0x17D}, // SP 0x000000000 MP 0x14037B780 + {"_func_17E", 0x17E}, // SP 0x140295500 MP 0x14035E730 + {"physicsexplosionsphere", 0x17F}, // SP 0x140296890 MP 0x14035FE90 + {"physicsradiusjolt", 0x180}, // SP 0x140295F60 MP 0x14035F2D0 + {"physicsradiusjitter", 0x181}, // SP 0x1402963A0 MP 0x14035F900 + {"_func_182", 0x182}, // SP 0x140299880 MP 0x140362E20 + {"_func_183", 0x183}, // SP 0x140299900 MP 0x140363010 + {"_func_184", 0x184}, // SP 0x140299F70 MP 0x140363800 + {"_func_185", 0x185}, // SP 0x14029A180 MP 0x140363920 + {"_func_186", 0x186}, // SP 0x14029A220 MP 0x140363B00 + {"_func_187", 0x187}, // SP 0x14029A4B0 MP 0x140363E60 + {"isexplosivedamagemod", 0x188}, // SP 0x1402A2800 MP 0x14036ADB0 + {"radiusdamage", 0x189}, // SP 0x1402A3690 MP 0x14036C110 + {"setplayerignoreradiusdamage", 0x18A}, // SP 0x14028DFA0 MP 0x14036CF90 + {"_func_18B", 0x18B}, // SP 0x1402A3950 MP 0x14036C1E0 + {"_func_18C", 0x18C}, // SP 0x14029B460 MP 0x140366A00 + {"getnumparts", 0x18D}, // SP 0x14029A830 MP 0x140363F40 + {"_func_18E", 0x18E}, // SP 0x1402B76D0 MP 0x140383170 + {"_func_18F", 0x18F}, // SP 0x000000000 MP 0x1403831D0 + {"objective_team", 0x190}, // SP 0x000000000 MP 0x140383310 + {"objective_player", 0x191}, // SP 0x000000000 MP 0x1403833B0 + {"_func_192", 0x192}, // SP 0x000000000 MP 0x140383410 + {"_func_193", 0x193}, // SP 0x000000000 MP 0x1403834B0 + {"_func_194", 0x194}, // SP 0x000000000 MP 0x1403835B0 + {"_func_195", 0x195}, // SP 0x000000000 MP 0x1403835F0 + {"objective_playermask_showtoall", 0x196}, // SP 0x000000000 MP 0x140382DA0 + {"_func_197", 0x197}, // SP 0x000000000 MP 0x140382DE0 + {"_func_198", 0x198}, // SP 0x1402AD860 MP 0x140377360 + {"_func_199", 0x199}, // SP 0x1402AD8C0 MP 0x1403773E0 + {"_func_19A", 0x19A}, // SP 0x1405D92F0 MP 0x140377C30 + {"getent", 0x19B}, // SP 0x1402B9570 MP 0x1403845D0 + {"getentarray", 0x19C}, // SP 0x1402B95E0 MP 0x1403846A0 + {"_func_19D", 0x19D}, // SP 0x000000000 MP 0x140384C00 + {"spawnplane", 0x19E}, // SP 0x000000000 MP 0x140377670 + {"spawnstruct", 0x19F}, // SP 0x140374110 MP 0x140442170 + {"_func_1A0", 0x1A0}, // SP 0x000000000 MP 0x140377A90 + {"isalive", 0x1A1}, // SP 0x1402AD940 MP 0x140377410 + {"isspawner", 0x1A2}, // SP 0x1402ADB20 MP 0x1403774F0 + {"_func_1A3", 0x1A3}, // SP 0x140282D00 MP 0x14034F8E0 + {"missile_createattractorent", 0x1A4}, // SP 0x140282D10 MP 0x14034F8F0 + {"missile_createattractororigin", 0x1A5}, // SP 0x140282FD0 MP 0x14034FBA0 + {"_func_1A6", 0x1A6}, // SP 0x140282FE0 MP 0x14034FBB0 + {"_func_1A7", 0x1A7}, // SP 0x140282FF0 MP 0x14034FBC0 + {"playsoundatpos", 0x1A8}, // SP 0x000000000 MP 0x140378150 + {"newhudelem", 0x1A9}, // SP 0x14026F000 MP 0x14033CF50 + {"newclienthudelem", 0x1AA}, // SP 0x14026EFB0 MP 0x14033CEF0 + {"newteamhudelem", 0x1AB}, // SP 0x000000000 MP 0x14033CF80 + {"resettimeout", 0x1AC}, // SP 0x140375910 MP 0x1404438F0 + {"isplayer", 0x1AD}, // SP 0x1402ADB90 MP 0x140377390 + {"isplayernumber", 0x1AE}, // SP 0x000000000 MP 0x1403774C0 + {"getpartname", 0x1AF}, // SP 0x14029A9A0 MP 0x140364120 + {"_func_1B0", 0x1B0}, // SP 0x14029CDC0 MP 0x140363D50 + {"_func_1B1", 0x1B1}, // SP 0x1402999A0 MP 0x140360B10 + {"_func_1B2", 0x1B2}, // SP 0x14029AA30 MP 0x140361AC0 + {"_func_1B3", 0x1B3}, // SP 0x14029ADB0 MP 0x140361CE0 + {"_func_1B4", 0x1B4}, // SP 0x14029B360 MP 0x1403622D0 + {"_func_1B5", 0x1B5}, // SP 0x14029B580 MP 0x140362520 + {"_func_1B6", 0x1B6}, // SP 0x14029B020 MP 0x140361EC0 + {"_func_1B7", 0x1B7}, // SP 0x14029B7A0 MP 0x140362920 + {"weaponclass", 0x1B8}, // SP 0x14029B8E0 MP 0x140362A60 + {"getnextarraykey", 0x1B9}, // SP 0x1402A35D0 MP 0x14036D000 + {"_func_1BA", 0x1BA}, // SP 0x14028D850 MP 0x14036D690 + {"_func_1BB", 0x1BB}, // SP 0x14029CCC0 MP 0x1403664F0 + {"tablelookupistringbyrow", 0x1BC}, // SP 0x14029D970 MP 0x1403671B0 + {"_func_1BD", 0x1BD}, // SP 0x14029CF50 MP 0x1403667F0 + {"tablelookuprownum", 0x1BE}, // SP 0x14029DC10 MP 0x140367320 + {"_func_1BF", 0x1BF}, // SP 0x14029D280 MP 0x140366C90 + {"tableexists", 0x1C0}, // SP 0x14029D820 MP 0x140366DE0 + {"getmissileowner", 0x1C1}, // SP 0x14029AD10 MP 0x140366490 + {"_func_1C2", 0x1C2}, // SP 0x140294EF0 MP 0x14035E270 + {"getweaponflashtagname", 0x1C3}, // SP 0x140295DC0 MP 0x14035F290 + {"averagepoint", 0x1C4}, // SP 0x14029A870 MP 0x140363F90 + {"_func_1C5", 0x1C5}, // SP 0x14029AB60 MP 0x140364300 + {"getspawnerarray", 0x1C6}, // SP 0x140466C40 MP 0x140564030 + {"playrumbleonposition", 0x1C7}, // SP 0x140299410 MP 0x140360540 + {"playrumblelooponposition", 0x1C8}, // SP 0x140299470 MP 0x1403605E0 + {"_func_1C9", 0x1C9}, // SP 0x1402996F0 MP 0x140360670 + {"soundexists", 0x1CA}, // SP 0x140290B30 MP 0x14035C2D0 + {"_func_1CB", 0x1CB}, // SP 0x1405D92F0 MP 0x14036B580 + {"_func_1CC", 0x1CC}, // SP 0x1405D92F0 MP 0x14036B590 + {"_func_1CD", 0x1CD}, // SP 0x1405D92F0 MP 0x14036B710 + {"_func_1CE", 0x1CE}, // SP 0x1405D92F0 MP 0x14036B770 + {"_func_1CF", 0x1CF}, // SP 0x1405D92F0 MP 0x14036B780 + {"_func_1D0", 0x1D0}, // SP 0x1405D92F0 MP 0x14036B790 + {"setminimap", 0x1D1}, // SP 0x1402A2200 MP 0x14036C3C0 + {"_func_1D2", 0x1D2}, // SP 0x1402A28F0 MP 0x14036CA90 + {"_func_1D3", 0x1D3}, // SP 0x1402A3410 MP 0x14036CDA0 + {"getfirstarraykey", 0x1D4}, // SP 0x1402A3470 MP 0x14036CF00 + {"getglass", 0x1D5}, // SP 0x14029AD60 MP 0x1403644F0 + {"getglassarray", 0x1D6}, // SP 0x14029B110 MP 0x1403647D0 + {"getglassorigin", 0x1D7}, // SP 0x14029B410 MP 0x1403649E0 + {"isglassdestroyed", 0x1D8}, // SP 0x14029B630 MP 0x140364CF0 + {"destroyglass", 0x1D9}, // SP 0x14029B850 MP 0x140365010 + {"_func_1DA", 0x1DA}, // SP 0x14029B9F0 MP 0x1403651E0 + {"_func_1DB", 0x1DB}, // SP 0x14029C0E0 MP 0x140365F50 + {"_func_1DC", 0x1DC}, // SP 0x14029C160 MP 0x140366130 + {"objective_add", 0x1DD}, // SP 0x1402B7080 MP 0x140382E50 + {"_func_1DE", 0x1DE}, // SP 0x1402B74F0 MP 0x140382F80 + {"objective_state", 0x1DF}, // SP 0x1402B77E0 MP 0x140382FF0 + {"objective_icon", 0x1E0}, // SP 0x1402B7820 MP 0x140383090 + {"_func_1E1", 0x1E1}, // SP 0x1402B7900 MP 0x000000000 + {"objective_position", 0x1E2}, // SP 0x1402B7980 MP 0x1403830D0 + {"objective_current", 0x1E3}, // SP 0x1402B7A10 MP 0x140383230 + {"_func_1E4", 0x1E4}, // SP 0x14029BA70 MP 0x140362C20 + {"_func_1E5", 0x1E5}, // SP 0x14029BE70 MP 0x140362F00 + {"_func_1E6", 0x1E6}, // SP 0x14029BF80 MP 0x140363300 + {"_func_1E7", 0x1E7}, // SP 0x14029C9D0 MP 0x140363950 + {"isweaponcliponly", 0x1E8}, // SP 0x14029D050 MP 0x140364220 + {"_func_1E9", 0x1E9}, // SP 0x14029D330 MP 0x140364590 + {"_func_1EA", 0x1EA}, // SP 0x14029D720 MP 0x140364870 + {"_func_1EB", 0x1EB}, // SP 0x14029D9F0 MP 0x140364E70 + {"_func_1EC", 0x1EC}, // SP 0x14045D5C0 MP 0x14055A900 + {"getvehiclenodearray", 0x1ED}, // SP 0x14045D6B0 MP 0x14055A9F0 + {"_func_1EE", 0x1EE}, // SP 0x14045D550 MP 0x14055A890 + {"_func_1EF", 0x1EF}, // SP 0x1404669B0 MP 0x140563DA0 + {"_func_1F0", 0x1F0}, // SP 0x140466CC0 MP 0x140564110 + {"spawnvehicle", 0x1F1}, // SP 0x140466D20 MP 0x140564170 + {"vehicle_getarray", 0x1F2}, // SP 0x1404669F0 MP 0x140563DE0 + {"pow", 0x1F3}, // SP 0x14028E710 MP 0x14036CBC0 + {"_func_1F4", 0x1F4}, // SP 0x14028D7B0 MP 0x14036BB10 + {"botgetmemoryevents", 0x1F5}, // SP 0x000000000 MP 0x14047A600 + {"botautoconnectenabled", 0x1F6}, // SP 0x000000000 MP 0x14047ABF0 + {"botzonegetcount", 0x1F7}, // SP 0x000000000 MP 0x14047AC20 + {"botzonesetteam", 0x1F8}, // SP 0x000000000 MP 0x14047AF10 + {"_func_1F9", 0x1F9}, // SP 0x000000000 MP 0x14047AD50 + {"botmemoryflags", 0x1FA}, // SP 0x000000000 MP 0x14047A940 + {"botflagmemoryevents", 0x1FB}, // SP 0x000000000 MP 0x14047A320 + {"botzonegetindoorpercent", 0x1FC}, // SP 0x000000000 MP 0x14047ACF0 + {"botsentientswap", 0x1FD}, // SP 0x000000000 MP 0x14047A990 + {"isbot", 0x1FE}, // SP 0x000000000 MP 0x14047AF70 + {"isagent", 0x1FF}, // SP 0x000000000 MP 0x14037B2B0 + {"getmaxagents", 0x200}, // SP 0x000000000 MP 0x140450E50 + {"_func_201", 0x201}, // SP 0x000000000 MP 0x14047A310 + {"botgetclosestnavigablepoint", 0x202}, // SP 0x000000000 MP 0x14047A550 + {"getnodesintrigger", 0x203}, // SP 0x000000000 MP 0x14031FCE0 + {"nodesvisible", 0x204}, // SP 0x1402CC4A0 MP 0x140320EA0 + {"_func_205", 0x205}, // SP 0x1402CC110 MP 0x14031FDD0 + {"_func_206", 0x206}, // SP 0x000000000 MP 0x1403201B0 + {"getzonenearest", 0x207}, // SP 0x000000000 MP 0x1403201C0 + {"_func_208", 0x208}, // SP 0x000000000 MP 0x140320320 + {"_func_209", 0x209}, // SP 0x000000000 MP 0x140320A10 + {"_func_20A", 0x20A}, // SP 0x000000000 MP 0x140320960 + {"getnodezone", 0x20B}, // SP 0x000000000 MP 0x14031FC20 + {"_func_20C", 0x20C}, // SP 0x000000000 MP 0x140320600 + {"getzonenodeforindex", 0x20D}, // SP 0x000000000 MP 0x1403202E0 + {"_func_20E", 0x20E}, // SP 0x1402AFFC0 MP 0x14037AE40 + {"_func_211", 0x211}, // SP 0x000000000 MP 0x140320C70 + {"findentrances", 0x212}, // SP 0x000000000 MP 0x14031F6F0 + {"badplace_global", 0x213}, // SP 0x000000000 MP 0x14035A190 + {"_func_214", 0x214}, // SP 0x000000000 MP 0x140375150 + {"_func_215", 0x215}, // SP 0x1402CBE10 MP 0x14031F940 + {"disconnectnodepair", 0x216}, // SP 0x14028E840 MP 0x14036F800 + {"connectnodepair", 0x217}, // SP 0x14028EAC0 MP 0x140357F30 + {"_func_218", 0x218}, // SP 0x1402AE000 MP 0x000000000 + {"_func_21B", 0x21B}, // SP 0x1405D92F0 MP 0x1403780E0 + {"_func_21C", 0x21C}, // SP 0x000000000 MP 0x140374FD0 + {"_func_21D", 0x21D}, // SP 0x14037AA30 MP 0x000000000 + {"_func_21E", 0x21E}, // SP 0x14037AC70 MP 0x000000000 + {"_func_21F", 0x21F}, // SP 0x14037ABB0 MP 0x000000000 + {"_func_220", 0x220}, // SP 0x14037AB50 MP 0x000000000 + {"_func_221", 0x221}, // SP 0x14037A730 MP 0x000000000 + {"_func_222", 0x222}, // SP 0x14037A7B0 MP 0x000000000 + {"_func_223", 0x223}, // SP 0x14037A760 MP 0x000000000 + {"_func_224", 0x224}, // SP 0x14037A7F0 MP 0x000000000 + {"distance2dsquared", 0x225}, // SP 0x1402914F0 MP 0x140357BF0 + {"getangledelta3d", 0x226}, // SP 0x14028FE10 MP 0x14036F1C0 + {"activateclientexploder", 0x227}, // SP 0x140290710 MP 0x14035B7B0 + {"_func_228", 0x228}, // SP 0x1402909E0 MP 0x14035CED0 + {"_func_229", 0x229}, // SP 0x140290DF0 MP 0x14035D200 + {"trajectorycalculateexitangle", 0x22A}, // SP 0x140290FA0 MP 0x14035D4C0 + {"_func_22B", 0x22B}, // SP 0x1402911D0 MP 0x14035D830 + {"trajectorycomputedeltaheightattime", 0x22C}, // SP 0x140291530 MP 0x14035DFB0 + {"trajectoryestimatedesiredinairtime", 0x22D}, // SP 0x140291910 MP 0x14035E0B0 + {"_func_22E", 0x22E}, // SP 0x1405D92F0 MP 0x140367D60 + {"ispointinvolume", 0x22F}, // SP 0x140291190 MP 0x14036F5A0 + {"_func_230", 0x230}, // SP 0x1402AB600 MP 0x000000000 + {"_func_231", 0x231}, // SP 0x1402AB4F0 MP 0x000000000 + {"_func_232", 0x232}, // SP 0x1402AB4D0 MP 0x000000000 + {"_func_234", 0x234}, // SP 0x1405D92F0 MP 0x1403605D0 + {"getscriptablearray", 0x236}, // SP 0x140294380 MP 0x140360720 + {"_func_237", 0x237}, // SP 0x140297840 MP 0x140360C40 + {"_func_238", 0x238}, // SP 0x1402A87C0 MP 0x14037B1D0 + {"_func_239", 0x239}, // SP 0x1402AA280 MP 0x000000000 + {"_func_23A", 0x23A}, // SP 0x140292220 MP 0x14035E710 + {"_func_23B", 0x23B}, // SP 0x140292220 MP 0x14035E860 + {"_func_23D", 0x23D}, // SP 0x1402A06D0 MP 0x1403686B0 + {"_func_23E", 0x23E}, // SP 0x1402A0900 MP 0x140368C00 + {"_func_23F", 0x23F}, // SP 0x14029DDC0 MP 0x140365220 + {"_func_240", 0x240}, // SP 0x14029DDC0 MP 0x140365440 + {"_func_241", 0x241}, // SP 0x1402ACD00 MP 0x140365460 + {"_func_242", 0x242}, // SP 0x1402ACD00 MP 0x140365470 + {"_func_243", 0x243}, // SP 0x1402ACD00 MP 0x140365630 + {"_func_244", 0x244}, // SP 0x000000000 MP 0x1403784C0 + {"_func_245", 0x245}, // SP 0x140292D40 MP 0x14035FAF0 + {"_func_246", 0x246}, // SP 0x000000000 MP 0x1403784E0 + {"_func_247", 0x247}, // SP 0x000000000 MP 0x140378DA0 + {"_func_248", 0x248}, // SP 0x000000000 MP 0x140378DB0 + {"_func_249", 0x249}, // SP 0x000000000 MP 0x140378DC0 + {"_func_24A", 0x24A}, // SP 0x1402A8F70 MP 0x000000000 + {"_func_24B", 0x24B}, // SP 0x1402A8FF0 MP 0x000000000 + {"_func_24C", 0x24C}, // SP 0x1402946A0 MP 0x14035ABF0 + {"_func_24D", 0x24D}, // SP 0x140290110 MP 0x14036DF90 + {"_func_24E", 0x24E}, // SP 0x140292B00 MP 0x140359490 + {"_func_24F", 0x24F}, // SP 0x1402ABB80 MP 0x000000000 + {"_func_250", 0x250}, // SP 0x1405D92F0 MP 0x140360370 + {"_func_251", 0x251}, // SP 0x1405D92F0 MP 0x1403604B0 + {"_func_252", 0x252}, // SP 0x1405D92F0 MP 0x140360530 + {"_func_253", 0x253}, // SP 0x140293F90 MP 0x14035A6C0 + {"_func_254", 0x254}, // SP 0x140293FF0 MP 0x14035A7C0 + {"_func_255", 0x255}, // SP 0x140294500 MP 0x14035A9F0 + {"_func_256", 0x256}, // SP 0x000000000 MP 0x1403844C0 + {"_func_257", 0x257}, // SP 0x1402ADE20 MP 0x000000000 + {"_func_258", 0x258}, // SP 0x14029F640 MP 0x1403677A0 + {"_func_259", 0x259}, // SP 0x14029F710 MP 0x1403678C0 + {"getcsplinecount", 0x25A}, // SP 0x1402954E0 MP 0x1403611E0 + {"getcsplinepointcount", 0x25B}, // SP 0x1402955F0 MP 0x140361200 + {"getcsplinelength", 0x25C}, // SP 0x140295790 MP 0x1403613C0 + {"getcsplinepointid", 0x25D}, // SP 0x140295AD0 MP 0x1403615F0 + {"getcsplinepointlabel", 0x25E}, // SP 0x140295E00 MP 0x140361A30 + {"getcsplinepointtension", 0x25F}, // SP 0x140296150 MP 0x140361DD0 + {"_func_260", 0x260}, // SP 0x1402965B0 MP 0x140362020 + {"_func_261", 0x261}, // SP 0x140296740 MP 0x140362470 + {"_func_262", 0x262}, // SP 0x140296B10 MP 0x140362680 + {"getcsplinepointdisttonextpoint", 0x263}, // SP 0x140296CE0 MP 0x140362AE0 + {"_func_264", 0x264}, // SP 0x140296EE0 MP 0x140362D50 + {"_func_265", 0x265}, // SP 0x1402970D0 MP 0x140363430 + {"_func_266", 0x266}, // SP 0x140297580 MP 0x1403636C0 + {"setnojipscore", 0x267}, // SP 0x140297820 MP 0x140363AB0 + {"setnojiptime", 0x268}, // SP 0x140297820 MP 0x140363C90 + {"getpredictedentityposition", 0x269}, // SP 0x000000000 MP 0x14037AEC0 + {"_func_26A", 0x26A}, // SP 0x1405D92F0 MP 0x140363F80 + {"_func_26B", 0x26B}, // SP 0x1405D92F0 MP 0x140364110 + {"_func_26C", 0x26C}, // SP 0x1405D92F0 MP 0x1403642F0 + {"_func_26D", 0x26D}, // SP 0x1405D92F0 MP 0x1403644E0 + {"_func_26E", 0x26E}, // SP 0x1405D92F0 MP 0x140364540 + {"_func_26F", 0x26F}, // SP 0x1405D92F0 MP 0x140364700 + {"queuedialog", 0x270}, // SP 0x000000000 MP 0x140378930 + {"_func_271", 0x271}, // SP 0x1405D92F0 MP 0x000000000 + {"_func_272", 0x272}, // SP 0x1405D92F0 MP 0x000000000 + {"_func_273", 0x273}, // SP 0x1405D92F0 MP 0x140364710 + {"_func_274", 0x274}, // SP 0x1405D92F0 MP 0x140364860 + {"_func_275", 0x275}, // SP 0x1405D92F0 MP 0x140364970 + {"_func_276", 0x276}, // SP 0x1405D92F0 MP 0x1403649D0 + {"triggerportableradarping", 0x277}, // SP 0x000000000 MP 0x14037B980 + {"botgetteamlimit", 0x279}, // SP 0x000000000 MP 0x14047A900 + {"spawnfxforclient", 0x27A}, // SP 0x000000000 MP 0x14037E430 + {"botgetteamdifficulty", 0x27B}, // SP 0x000000000 MP 0x14047A8C0 + {"_func_27C", 0x27C}, // SP 0x1405D92F0 MP 0x1403675D0 + {"_func_27D", 0x27D}, // SP 0x14029CAC0 MP 0x14033CF40 + {"_func_27E", 0x27E}, // SP 0x1405D92F0 MP 0x140363CE0 + {"_func_27F", 0x27F}, // SP 0x1405D92F0 MP 0x140363E50 + {"_func_280", 0x280}, // SP 0x1405D92F0 MP 0x140360610 + {"_func_281", 0x281}, // SP 0x14029DC90 MP 0x140369F80 + {"getstarttime", 0x282}, // SP 0x000000000 MP 0x14037BBD0 + {"getbuildnumber", 0x283}, // SP 0x000000000 MP 0x14037BBE0 + {"_func_284", 0x284}, // SP 0x000000000 MP 0x14037BC00 + {"_func_285", 0x285}, // SP 0x000000000 MP 0x1403748B0 + {"_func_286", 0x286}, // SP 0x000000000 MP 0x140374B00 + {"_func_287", 0x287}, // SP 0x1405D92F0 MP 0x140360660 + {"_func_288", 0x288}, // SP 0x000000000 MP 0x1403772E0 + {"_func_289", 0x289}, // SP 0x000000000 MP 0x140376690 + {"_func_28A", 0x28A}, // SP 0x1402ACD00 MP 0x140365450 + {"_func_28B", 0x28B}, // SP 0x140295B60 MP 0x14035BD90 + {"_func_28C", 0x28C}, // SP 0x140296230 MP 0x14035C6E0 + {"_func_28D", 0x28D}, // SP 0x000000000 MP 0x1400777C0 + {"_func_28E", 0x28E}, // SP 0x000000000 MP 0x1403767D0 + {"_func_28F", 0x28F}, // SP 0x000000000 MP 0x140320120 + {"_func_290", 0x290}, // SP 0x000000000 MP 0x1403775D0 + {"_func_291", 0x291}, // SP 0x14029E770 MP 0x140368040 + {"_func_292", 0x292}, // SP 0x14029E7F0 MP 0x140368150 + {"_func_293", 0x293}, // SP 0x1402ADDE0 MP 0x000000000 + {"_func_294", 0x294}, // SP 0x1402988E0 MP 0x140365640 + {"_func_295", 0x295}, // SP 0x14029C2F0 MP 0x140368F40 + {"_func_296", 0x296}, // SP 0x14029B680 MP 0x140364D50 + {"_func_297", 0x297}, // SP 0x14029BD80 MP 0x140365540 + {"_func_298", 0x298}, // SP 0x14029C1B0 MP 0x140366230 + {"_func_299", 0x299}, // SP 0x1402ABA30 MP 0x000000000 + {"_func_29A", 0x29A}, // SP 0x1405D92F0 MP 0x14035B9A0 + {"_func_29B", 0x29B}, // SP 0x140291040 MP 0x14036F330 + {"_func_29C", 0x29C}, // SP 0x14029D240 MP 0x140368760 + {"_func_29D", 0x29D}, // SP 0x14029DE30 MP 0x1403674E0 + {"_func_29E", 0x29E}, // SP 0x14029DEC0 MP 0x140367620 + {"_func_29F", 0x29F}, // SP 0x000000000 MP 0x140375690 + {"_func_2A0", 0x2A0}, // SP 0x000000000 MP 0x1403756A0 + {"_func_2A1", 0x2A1}, // SP 0x14029D890 MP 0x140364AB0 + {"_func_2A2", 0x2A2}, // SP 0x1402ABC20 MP 0x000000000 + {"_func_2A3", 0x2A3}, // SP 0x1402A2F20 MP 0x14036F010 + {"_func_2A4", 0x2A4}, // SP 0x140290710 MP 0x14035B890 + {"_func_2A5", 0x2A5}, // SP 0x14029DF00 MP 0x14036D0F0 + {"_func_2A6", 0x2A6}, // SP 0x1405D92F0 MP 0x14036DAE0 + {"_func_2A7", 0x2A7}, // SP 0x1405D92F0 MP 0x14036DA60 + {"_func_2A8", 0x2A8}, // SP 0x000000000 MP 0x140376390 + {"_func_2A9", 0x2A9}, // SP 0x1402AE820 MP 0x000000000 + {"_func_2AA", 0x2AA}, // SP 0x14029AE80 MP 0x140364550 + {"_func_2AB", 0x2AB}, // SP 0x1405D92F0 MP 0x14036E590 + {"_func_2AC", 0x2AC}, // SP 0x1402ACD00 MP 0x14036E310 + {"_func_2AD", 0x2AD}, // SP 0x1405D92F0 MP 0x14036E3E0 + {"_func_2AE", 0x2AE}, // SP 0x1405D92F0 MP 0x14036E470 + {"_func_2AF", 0x2AF}, // SP 0x1405D92F0 MP 0x14036E730 + {"_func_2B0", 0x2B0}, // SP 0x000000000 MP 0x140375320 + {"_func_2B1", 0x2B1}, // SP 0x000000000 MP 0x1403753F0 + {"_func_2B2", 0x2B2}, // SP 0x000000000 MP 0x140375430 + {"_func_2B3", 0x2B3}, // SP 0x000000000 MP 0x140375A40 + {"_func_2B4", 0x2B4}, // SP 0x1405D92F0 MP 0x14035C9D0 + {"_func_2B5", 0x2B5}, // SP 0x1405D92F0 MP 0x14035D920 + {"_func_2B6", 0x2B6}, // SP 0x140291AD0 MP 0x14035E150 + {"_func_2B7", 0x2B7}, // SP 0x1402A85B0 MP 0x000000000 + {"_func_2B8", 0x2B8}, // SP 0x000000000 MP 0x140378570 + {"_func_2B9", 0x2B9}, // SP 0x000000000 MP 0x1403787D0 + {"_func_2BA", 0x2BA}, // SP 0x000000000 MP 0x140378850 + {"_func_2BB", 0x2BB}, // SP 0x000000000 MP 0x140379930 + {"_func_2BC", 0x2BC}, // SP 0x14028EBB0 MP 0x140359E00 + {"_func_2BD", 0x2BD}, // SP 0x1402A8640 MP 0x000000000 + {"_func_2BE", 0x2BE}, // SP 0x14029B310 MP 0x140366D50 + {"_func_2BF", 0x2BF}, // SP 0x000000000 MP 0x140383570 + {"_func_2C0", 0x2C0}, // SP 0x1405D92F0 MP 0x14036E8A0 + {"_func_2C1", 0x2C1}, // SP 0x1405D92F0 MP 0x14036E900 + {"_func_2C2", 0x2C2}, // SP 0x140291E10 MP 0x14035E670 + {"_func_2C3", 0x2C3}, // SP 0x1402A1A30 MP 0x14036DA40 + {"_func_2C4", 0x2C4}, // SP 0x1402A1A30 MP 0x14036DAC0 + {"_func_2C5", 0x2C5}, // SP 0x1402A8810 MP 0x000000000 + {"_func_2C6", 0x2C6}, // SP 0x000000000 MP 0x140379A80 + {"_func_2C6", 0x2C7}, // SP 0x000000000 MP 0x140320DC0 + {"_func_2C8", 0x2C8}, // SP 0x000000000 MP 0x140320E20 + {"_func_2C9", 0x2C9}, // SP 0x000000000 MP 0x14037E5E0 + {"_func_2CA", 0x2CA}, // SP 0x000000000 MP 0x14037E650 + {"_func_2CB", 0x2CB}, // SP 0x000000000 MP 0x14037BC40 + {"_func_2CC", 0x2CC}, // SP 0x000000000 MP 0x14037BD00 + {"_func_2CD", 0x2CD}, // SP 0x000000000 MP 0x140374820 + {"_func_2CE", 0x2CE}, // SP 0x1402A79A0 MP 0x000000000 + {"_func_2CF", 0x2CF}, // SP 0x000000000 MP 0x14037AB40 + {"_func_2D4", 0x2D4}, // SP 0x1402A7CB0 MP 0x000000000 + {"_func_2D5", 0x2D5}, // SP 0x14029E120 MP 0x14036D640 + {"_func_2D6", 0x2D6}, // SP 0x000000000 MP 0x14037BE30 + {"_func_2D7", 0x2D7}, // SP 0x1405D92F0 MP 0x14036DB50 + {"_func_2D8", 0x2D8}, // SP 0x1402ABB70 MP 0x000000000 + {"_func_2D9", 0x2D9}, // SP 0x000000000 MP 0x140320D50 + {"_func_2DA", 0x2DA}, // SP 0x1405D92F0 MP 0x000000000 + {"_func_2DB", 0x2DB}, // SP 0x000000000 MP 0x14037ABB0 + {"_func_2DC", 0x2DC}, // SP 0x000000000 MP 0x14037E1C0 + {"_func_2DD", 0x2DD}, // SP 0x000000000 MP 0x14037E1B0 + {"_func_2DF", 0x2DF}, // SP 0x140292220 MP 0x14036F7F0 + {"_func_2E0", 0x2E0}, // SP 0x140297C80 MP 0x14035EDE0 + {"_func_2E1", 0x2E1}, // SP 0x000000000 MP 0x1403788D0 + {"_func_2E2", 0x2E2}, // SP 0x1405D92F0 MP 0x14035B3B0 + {"_func_2E3", 0x2E3}, // SP 0x1405D92F0 MP 0x14035D0B0 + {"_func_2E4", 0x2E4}, // SP 0x1405D92F0 MP 0x14035E170 + {"_func_2E5", 0x2E5}, // SP 0x1402A8730 MP 0x000000000 + {"_func_2E6", 0x2E6}, // SP 0x140295A10 MP 0x14035EFF0 + {"_func_2E7", 0x2E7}, // SP 0x140295CF0 MP 0x14035F120 + {"_func_2E8", 0x2E8}, // SP 0x1402AC850 MP 0x000000000 + {"_func_2E9", 0x2E9}, // SP 0x14029E760 MP 0x140366680 + {"_func_2EA", 0x2EA}, // SP 0x000000000 MP 0x140376DC0 + {"_func_2EB", 0x2EB}, // SP 0x000000000 MP 0x140377540 + {"_func_2EC", 0x2EC}, // SP 0x000000000 MP 0x140377880 + {"_func_2ED", 0x2ED}, // SP 0x1402ACD00 MP 0x14036BA50 + {"_func_2EE", 0x2EE}, // SP 0x1402A1E10 MP 0x14036BA60 + {"_func_2EF", 0x2EF}, // SP 0x1402A1FB0 MP 0x14036BA70 + {"_func_2F0", 0x2F0}, // SP 0x1402A21F0 MP 0x14036BB50 + {"_func_2F1", 0x2F1}, // SP 0x1402ACD00 MP 0x14036BC60 + {"_func_2F2", 0x2F2}, // SP 0x1402A1E10 MP 0x14036BC70 + {"_func_2F3", 0x2F3}, // SP 0x1402A1FB0 MP 0x14036BF90 + {"_func_2F4", 0x2F4}, // SP 0x1402A21F0 MP 0x14036C100 + {"_func_2F5", 0x2F5}, // SP 0x1402A1E10 MP 0x14036C120 + {"_func_2F6", 0x2F6}, // SP 0x1402A1FB0 MP 0x14036C170 + {"_func_2F7", 0x2F7}, // SP 0x1402A21F0 MP 0x14036C310 + {"_func_2F8", 0x2F8}, // SP 0x14028D700 MP 0x1403582B0 + {"_func_2F9", 0x2F9}, // SP 0x14029CAC0 MP 0x14036D300 + {"_func_2FA", 0x2FA}, // SP 0x14029CAC0 MP 0x14036DDC0 + {"_func_2FB", 0x2FB}, // SP 0x14029DB60 MP 0x140365110 + {"_func_2FC", 0x2FC}, // SP 0x14029CB20 MP 0x140367DD0 + {"_func_2FD", 0x2FD}, // SP 0x14029CEA0 MP 0x140368000 + {"_func_2FE", 0x2FE}, // SP 0x14029CEE0 MP 0x140368290 + {"_func_2FF", 0x2FF}, // SP 0x000000000 MP 0x140367110 + {"_func_300", 0x300}, // SP 0x000000000 MP 0x140377870 + {"_func_301", 0x301}, // SP 0x1405D92F0 MP 0x140363E90 + }; + + std::unordered_map method_map = + { + {"motionblurhqenable", 0x8000}, // SP 0x14029B0D0 MP 0x140362FD0 + {"_meth_8001", 0x8001}, // SP 0x1402A8AC0 MP 0x000000000 + {"setdamagestage", 0x8002}, // SP 0x000000000 MP 0x14055A000 + {"_meth_8003", 0x8003}, // SP 0x000000000 MP 0x140378300 + {"playsoundtoplayer", 0x8004}, // SP 0x000000000 MP 0x1403784F0 + {"playerhide", 0x8005}, // SP 0x000000000 MP 0x14037AB70 + {"_meth_8006", 0x8006}, // SP 0x000000000 MP 0x14037ABD0 + {"showtoplayer", 0x8007}, // SP 0x000000000 MP 0x14037AC50 + {"_meth_8008", 0x8008}, // SP 0x000000000 MP 0x14037ACB0 + {"_meth_8009", 0x8009}, // SP 0x000000000 MP 0x14037ACC0 + {"enableplayeruse", 0x800A}, // SP 0x000000000 MP 0x140374B10 + {"disableplayeruse", 0x800B}, // SP 0x000000000 MP 0x140374BB0 + {"_meth_800C", 0x800C}, // SP 0x000000000 MP 0x140374D70 + {"_meth_800D", 0x800D}, // SP 0x000000000 MP 0x140374C90 + {"makescrambler", 0x800E}, // SP 0x000000000 MP 0x14037B890 + {"makeportableradar", 0x800F}, // SP 0x000000000 MP 0x14037B930 + {"clearscrambler", 0x8010}, // SP 0x000000000 MP 0x14037B910 + {"clearportableradar", 0x8011}, // SP 0x000000000 MP 0x14037B960 + {"addplayermantleblockage", 0x8012}, // SP 0x000000000 MP 0x1403760E0 + {"setteamfortrigger", 0x8013}, // SP 0x000000000 MP 0x14037B130 + {"clientclaimtrigger", 0x8014}, // SP 0x000000000 MP 0x14037B220 + {"clientreleasetrigger", 0x8015}, // SP 0x000000000 MP 0x14037B300 + {"releaseclaimedtrigger", 0x8016}, // SP 0x000000000 MP 0x14037B510 + {"_meth_8017", 0x8017}, // SP 0x000000000 MP 0x14037AC10 + {"_meth_8018", 0x8018}, // SP 0x000000000 MP 0x14037ACD0 + {"_meth_8019", 0x8019}, // SP 0x000000000 MP 0x140378210 + {"_meth_801A", 0x801A}, // SP 0x14028F380 MP 0x14036F540 + {"getcorpseanim", 0x801B}, // SP 0x000000000 MP 0x14037BD60 + {"playerforcedeathanim", 0x801C}, // SP 0x000000000 MP 0x140374A30 + {"_meth_801D", 0x801D}, // SP 0x14029DCF0 MP 0x140369D40 + {"_meth_801E", 0x801E}, // SP 0x1402AD230 MP 0x000000000 + {"_meth_801F", 0x801F}, // SP 0x1402AD490 MP 0x000000000 + {"_meth_8020", 0x8020}, // SP 0x1402AD4C0 MP 0x000000000 + {"_meth_8021", 0x8021}, // SP 0x1402AD640 MP 0x000000000 + {"_meth_8022", 0x8022}, // SP 0x1402AD660 MP 0x000000000 + {"_meth_8023", 0x8023}, // SP 0x1402AD920 MP 0x14037BA50 + {"_meth_8024", 0x8024}, // SP 0x1402ADA90 MP 0x000000000 + {"_meth_8025", 0x8025}, // SP 0x1405D92F0 MP 0x14035CB60 + {"_meth_8026", 0x8026}, // SP 0x1405D92F0 MP 0x140377C40 + {"_meth_8028", 0x8028}, // SP 0x1402ADE80 MP 0x000000000 + {"_meth_8029", 0x8029}, // SP 0x14029AEC0 MP 0x140362D10 + {"_meth_802A", 0x802A}, // SP 0x14029E0E0 MP 0x14036A480 + {"detachall", 0x802B}, // SP 0x14029E180 MP 0x14036A4C0 + {"getattachsize", 0x802C}, // SP 0x1402A0610 MP 0x14036C860 + {"getattachmodelname", 0x802D}, // SP 0x1402A0890 MP 0x14036CE90 + {"_meth_802E", 0x802E}, // SP 0x1402A0A90 MP 0x14036D040 + {"_meth_802F", 0x802F}, // SP 0x1402AE150 MP 0x000000000 + {"_meth_8030", 0x8030}, // SP 0x1402AE270 MP 0x000000000 + {"_meth_8031", 0x8031}, // SP 0x1402AE410 MP 0x000000000 + {"_meth_8032", 0x8032}, // SP 0x1402AE620 MP 0x000000000 + {"_meth_8033", 0x8033}, // SP 0x1402AE6E0 MP 0x000000000 + {"_meth_8034", 0x8034}, // SP 0x1402CBC10 MP 0x000000000 + {"gethighestnodestance", 0x8035}, // SP 0x1402CBBA0 MP 0x14031F650 + {"doesnodeallowstance", 0x8036}, // SP 0x1402CBA70 MP 0x14031F520 + {"setforcespectatorclient", 0x8037}, // SP 0x1402CBB20 MP 0x14031F5D0 + {"_meth_8038", 0x8038}, // SP 0x1402AB240 MP 0x000000000 + {"_meth_8039", 0x8039}, // SP 0x1402AB320 MP 0x000000000 + {"_meth_803A", 0x803A}, // SP 0x1402AB6D0 MP 0x000000000 + {"_meth_803B", 0x803B}, // SP 0x1402ACA20 MP 0x000000000 + {"_meth_803C", 0x803C}, // SP 0x1402ACA40 MP 0x000000000 + {"_meth_803D", 0x803D}, // SP 0x1402ACBA0 MP 0x000000000 + {"_meth_803E", 0x803E}, // SP 0x1402AFA80 MP 0x000000000 + {"_meth_803F", 0x803F}, // SP 0x1402AFAC0 MP 0x000000000 + {"_meth_8040", 0x8040}, // SP 0x1402AFB90 MP 0x000000000 + {"_meth_8041", 0x8041}, // SP 0x1402AFC50 MP 0x000000000 + {"_meth_8042", 0x8042}, // SP 0x1402AFCA0 MP 0x000000000 + {"_meth_8043", 0x8043}, // SP 0x1402A8990 MP 0x000000000 + {"_meth_8044", 0x8044}, // SP 0x1402A89F0 MP 0x000000000 + {"_meth_8045", 0x8045}, // SP 0x14028F020 MP 0x14036EDF0 + {"_meth_8046", 0x8046}, // SP 0x14028F1F0 MP 0x14036EEE0 + {"_meth_8047", 0x8047}, // SP 0x1402ACE10 MP 0x000000000 + {"_meth_8048", 0x8048}, // SP 0x1402ACE50 MP 0x000000000 + {"getattachignorecollision", 0x8049}, // SP 0x1402A1060 MP 0x14036D280 + {"hidepart", 0x804A}, // SP 0x1402A1500 MP 0x14036D940 + {"hidepartallinstances", 0x804B}, // SP 0x1402A1930 MP 0x14036DC50 + {"_meth_804C", 0x804C}, // SP 0x1402A1C90 MP 0x14036E320 + {"showpart", 0x804D}, // SP 0x1402A2000 MP 0x14036E480 + {"_meth_804E", 0x804E}, // SP 0x1402A2370 MP 0x14036ECC0 + {"_meth_804F", 0x804F}, // SP 0x1402A3670 MP 0x140358AF0 + {"_meth_8050", 0x8050}, // SP 0x1402A3AB0 MP 0x140359830 + {"_meth_8051", 0x8051}, // SP 0x1402A3AD0 MP 0x140359850 + {"_meth_8052", 0x8052}, // SP 0x1402AD0F0 MP 0x140379AD0 + {"_meth_8053", 0x8053}, // SP 0x1402A2B80 MP 0x14036B270 + {"_meth_8054", 0x8054}, // SP 0x1402AD260 MP 0x000000000 + {"show", 0x8055}, // SP 0x1402AD6A0 MP 0x14037A9E0 + {"hide", 0x8056}, // SP 0x1402AD6C0 MP 0x14037AAA0 + {"_meth_8057", 0x8057}, // SP 0x1402AD7A0 MP 0x000000000 + {"_meth_8058", 0x8058}, // SP 0x1402AD7D0 MP 0x000000000 + {"disconnectpaths", 0x8059}, // SP 0x14028E1E0 MP 0x14036F090 + {"connectpaths", 0x805A}, // SP 0x14028E390 MP 0x14036F4C0 + {"_meth_805B", 0x805B}, // SP 0x14028E490 MP 0x14036F5F0 + {"_meth_805C", 0x805C}, // SP 0x14028E750 MP 0x14036F770 + {"_meth_805D", 0x805D}, // SP 0x1402A8420 MP 0x000000000 + {"_meth_805E", 0x805E}, // SP 0x1402A8440 MP 0x000000000 + {"_meth_805F", 0x805F}, // SP 0x1402A8460 MP 0x000000000 + {"_meth_8060", 0x8060}, // SP 0x1402A8480 MP 0x000000000 + {"_meth_8061", 0x8061}, // SP 0x1402A9250 MP 0x000000000 + {"_meth_8062", 0x8062}, // SP 0x1402A92D0 MP 0x000000000 + {"_meth_8063", 0x8063}, // SP 0x1402A9BC0 MP 0x000000000 + {"_meth_8064", 0x8064}, // SP 0x1402AABA0 MP 0x000000000 + {"_meth_8065", 0x8065}, // SP 0x1402AAC10 MP 0x000000000 + {"setmode", 0x8067}, // SP 0x1402AD9A0 MP 0x140375030 + {"_meth_8068", 0x8068}, // SP 0x1402ADCD0 MP 0x140375210 + {"_meth_8069", 0x8069}, // SP 0x1402ADF10 MP 0x000000000 + {"islinked", 0x806A}, // SP 0x14028D6B0 MP 0x1403598E0 + {"enablelinkto", 0x806B}, // SP 0x14028EA50 MP 0x14035A950 + {"_meth_806C", 0x806C}, // SP 0x1402ACB60 MP 0x000000000 + {"_meth_806E", 0x806E}, // SP 0x1402A27D0 MP 0x14035AB10 + {"_meth_806F", 0x806F}, // SP 0x1402A23E0 MP 0x14035A9C0 + {"_meth_8070", 0x8070}, // SP 0x1402A2980 MP 0x14035B0D0 + {"_meth_8071", 0x8071}, // SP 0x1402A28C0 MP 0x14035AB50 + {"_meth_8072", 0x8072}, // SP 0x140291F10 MP 0x000000000 + {"_meth_8073", 0x8073}, // SP 0x1405D92F0 MP 0x000000000 + {"_meth_8074", 0x8074}, // SP 0x1405D92F0 MP 0x000000000 + {"_meth_8075", 0x8075}, // SP 0x1405D92F0 MP 0x000000000 + {"_meth_8076", 0x8076}, // SP 0x1402ACC40 MP 0x1403798B0 + {"playloopsound", 0x8077}, // SP 0x1402ACC60 MP 0x1403798F0 + {"_meth_8078", 0x8078}, // SP 0x1402ACCD0 MP 0x000000000 + {"_meth_8079", 0x8079}, // SP 0x1402ACD40 MP 0x000000000 + {"_meth_807A", 0x807A}, // SP 0x1402ACDD0 MP 0x000000000 + {"_meth_807B", 0x807B}, // SP 0x1402ACE30 MP 0x000000000 + {"_meth_807C", 0x807C}, // SP 0x1402ACEE0 MP 0x000000000 + {"getnormalhealth", 0x807D}, // SP 0x1402ACFF0 MP 0x1403799E0 + {"_meth_807E", 0x807E}, // SP 0x14028FA50 MP 0x14035B880 + {"_meth_807F", 0x807F}, // SP 0x14028FB40 MP 0x14035B8D0 + {"_meth_8080", 0x8080}, // SP 0x14028FB60 MP 0x14035BD70 + {"playerlinktoabsolute", 0x8081}, // SP 0x14028FBE0 MP 0x14035C100 + {"playerlinktoblend", 0x8082}, // SP 0x140292720 MP 0x14035DCB0 + {"playerlinkedoffsetenable", 0x8083}, // SP 0x140290050 MP 0x14035C5A0 + {"_meth_8084", 0x8084}, // SP 0x14026DC10 MP 0x14033BBF0 + {"_meth_8085", 0x8085}, // SP 0x14026DC60 MP 0x14033BC00 + {"changefontscaleovertime", 0x8086}, // SP 0x14026E020 MP 0x14033BF50 + {"scaleovertime", 0x8087}, // SP 0x14026E160 MP 0x14033C090 + {"_meth_8088", 0x8088}, // SP 0x14026E240 MP 0x14033C170 + {"_meth_8089", 0x8089}, // SP 0x14026E380 MP 0x14033C230 + {"destroy", 0x808A}, // SP 0x14026E3C0 MP 0x14033C310 + {"_meth_808B", 0x808B}, // SP 0x14026E500 MP 0x14033C3F0 + {"_meth_808C", 0x808C}, // SP 0x14026E440 MP 0x14033C360 + {"fadeovertime", 0x808D}, // SP 0x14026E0C0 MP 0x14033BFF0 + {"_meth_808E", 0x808E}, // SP 0x1402A83E0 MP 0x000000000 + {"_meth_808F", 0x808F}, // SP 0x1402A8400 MP 0x000000000 + {"_meth_8090", 0x8090}, // SP 0x1402A8970 MP 0x000000000 + {"_meth_8091", 0x8091}, // SP 0x1402A89D0 MP 0x000000000 + {"_meth_8092", 0x8092}, // SP 0x1402AD800 MP 0x000000000 + {"playersetgroundreferenceent", 0x8093}, // SP 0x1402A9070 MP 0x1403752A0 + {"dontinterpolate", 0x8094}, // SP 0x1402A0070 MP 0x140358360 + {"_meth_8095", 0x8095}, // SP 0x1402AAC80 MP 0x000000000 + {"_meth_8096", 0x8096}, // SP 0x1402AAD20 MP 0x000000000 + {"_meth_8097", 0x8097}, // SP 0x1402AADC0 MP 0x140377CA0 + {"_meth_8098", 0x8098}, // SP 0x1402AAE70 MP 0x000000000 + {"_meth_8099", 0x8099}, // SP 0x1402AAF90 MP 0x000000000 + {"_meth_809A", 0x809A}, // SP 0x1402AC1D0 MP 0x000000000 + {"useby", 0x809B}, // SP 0x1402AC470 MP 0x140377D00 + {"playsound", 0x809C}, // SP 0x1402AC9B0 MP 0x140377F40 + {"playerlinkedoffsetdisable", 0x80A1}, // SP 0x140290320 MP 0x14035CAF0 + {"playerlinkedsetviewznear", 0x80A2}, // SP 0x140290680 MP 0x14035CE40 + {"playerlinkedsetusebaseangleforviewclamp", 0x80A3}, // SP 0x140290960 MP 0x14035D290 + {"_meth_80A4", 0x80A4}, // SP 0x140294B30 MP 0x14035F4A0 + {"_meth_80A5", 0x80A5}, // SP 0x140295300 MP 0x14035FD70 + {"_meth_80A6", 0x80A6}, // SP 0x1402958C0 MP 0x000000000 + {"_meth_80A7", 0x80A7}, // SP 0x1402960D0 MP 0x000000000 + {"_meth_80A8", 0x80A8}, // SP 0x140297190 MP 0x000000000 + {"_meth_80A9", 0x80A9}, // SP 0x140297C20 MP 0x000000000 + {"_meth_80AA", 0x80AA}, // SP 0x14029DDD0 MP 0x1403663C0 + {"istouching", 0x80AB}, // SP 0x140290390 MP 0x14035B440 + {"getistouchingentities", 0x80AC}, // SP 0x1402904A0 MP 0x14035B650 + {"_meth_80AD", 0x80AD}, // SP 0x1402987B0 MP 0x14035FAA0 + {"stopsounds", 0x80AE}, // SP 0x140290F40 MP 0x14035C610 + {"playrumbleonentity", 0x80AF}, // SP 0x140299090 MP 0x140360200 + {"playrumblelooponentity", 0x80B0}, // SP 0x140299200 MP 0x1403602A0 + {"stoprumble", 0x80B1}, // SP 0x1402997D0 MP 0x1403608E0 + {"delete", 0x80B2}, // SP 0x14029DAA0 MP 0x140366320 + {"setmodel", 0x80B3}, // SP 0x14029C8F0 MP 0x1403677D0 + {"_meth_80B4", 0x80B4}, // SP 0x14029A0F0 MP 0x140361C30 + {"_meth_80B5", 0x80B5}, // SP 0x14029A250 MP 0x140361F90 + {"thermalvisionon", 0x80B8}, // SP 0x14029A450 MP 0x1403623A0 + {"thermalvisionoff", 0x80B9}, // SP 0x14029AAF0 MP 0x140362B70 + {"_meth_80BA", 0x80BA}, // SP 0x14029BF20 MP 0x140364290 + {"_meth_80BB", 0x80BB}, // SP 0x14029C080 MP 0x140364630 + {"_meth_80BC", 0x80BC}, // SP 0x000000000 MP 0x140364910 + {"autospotoverlayon", 0x80BD}, // SP 0x000000000 MP 0x140364A50 + {"_meth_80BE", 0x80BE}, // SP 0x000000000 MP 0x140364D40 + {"setcontents", 0x80C0}, // SP 0x140297CC0 MP 0x14035FDD0 + {"makeusable", 0x80C1}, // SP 0x140297E90 MP 0x1403600D0 + {"makeunusable", 0x80C2}, // SP 0x140297FF0 MP 0x140360320 + {"_meth_80C3", 0x80C3}, // SP 0x1402A1730 MP 0x140359740 + {"_meth_80C4", 0x80C4}, // SP 0x1402A1A80 MP 0x140359DC0 + {"_meth_80C5", 0x80C5}, // SP 0x140266A20 MP 0x000000000 + {"_meth_80C6", 0x80C6}, // SP 0x1402634D0 MP 0x000000000 + {"_meth_80C7", 0x80C7}, // SP 0x1404657D0 MP 0x000000000 + {"_meth_80C8", 0x80C8}, // SP 0x140463A30 MP 0x000000000 + {"_meth_80C9", 0x80C9}, // SP 0x140465630 MP 0x000000000 + {"_meth_80CA", 0x80CA}, // SP 0x1404656C0 MP 0x000000000 + {"_meth_80CB", 0x80CB}, // SP 0x140464F50 MP 0x000000000 + {"settext", 0x80CC}, // SP 0x14026CE20 MP 0x14033AF40 + {"_meth_80CD", 0x80CD}, // SP 0x1405D92F0 MP 0x14033B030 + {"setshader", 0x80CE}, // SP 0x14026CEE0 MP 0x14033B040 + {"_meth_80CF", 0x80CF}, // SP 0x14026D230 MP 0x14033B3A0 + {"_meth_80D0", 0x80D0}, // SP 0x14026D3B0 MP 0x14033B530 + {"_meth_80D1", 0x80D1}, // SP 0x14026D490 MP 0x14033B600 + {"_meth_80D2", 0x80D2}, // SP 0x14026D560 MP 0x14033B6C0 + {"_meth_80D3", 0x80D3}, // SP 0x14026D630 MP 0x14033B760 + {"_meth_80D4", 0x80D4}, // SP 0x14026D700 MP 0x14033B810 + {"_meth_80D5", 0x80D5}, // SP 0x14026D7D0 MP 0x14033B8D0 + {"_meth_80D6", 0x80D6}, // SP 0x14026D8A0 MP 0x14033B970 + {"setclock", 0x80D7}, // SP 0x14026D970 MP 0x14033BA20 + {"setclockup", 0x80D8}, // SP 0x14026D990 MP 0x14033BA40 + {"setvalue", 0x80D9}, // SP 0x14026D9B0 MP 0x14033BA60 + {"setwaypoint", 0x80DA}, // SP 0x14026DA50 MP 0x14033BAE0 + {"_meth_80DB", 0x80DB}, // SP 0x14026DBC0 MP 0x14033BBE0 + {"setcursorhint", 0x80DC}, // SP 0x1402983E0 MP 0x1403607E0 + {"sethintstring", 0x80DD}, // SP 0x140299300 MP 0x140361060 + {"_meth_80DE", 0x80DE}, // SP 0x000000000 MP 0x140375C60 + {"forceusehinton", 0x80DF}, // SP 0x140299730 MP 0x140361260 + {"_meth_80E0", 0x80E0}, // SP 0x140299930 MP 0x140361530 + {"_meth_80E1", 0x80E1}, // SP 0x140298080 MP 0x140360440 + {"_meth_80E2", 0x80E2}, // SP 0x140298160 MP 0x140360570 + {"entitywillneverchange", 0x80E3}, // SP 0x1405D92F0 MP 0x140360620 + {"_meth_80E4", 0x80E4}, // SP 0x140291140 MP 0x14035D1B0 + {"_meth_80E5", 0x80E5}, // SP 0x1402912D0 MP 0x14035D310 + {"isfiringturret", 0x80E6}, // SP 0x140291490 MP 0x14035D460 + {"startbarrelspin", 0x80E7}, // SP 0x1402915B0 MP 0x14035D650 + {"stopbarrelspin", 0x80E8}, // SP 0x1402916E0 MP 0x14035D8D0 + {"getbarrelspinrate", 0x80E9}, // SP 0x140291A10 MP 0x14035DA40 + {"_meth_80EA", 0x80EA}, // SP 0x000000000 MP 0x14035C870 + {"remotecontrolturretoff", 0x80EB}, // SP 0x000000000 MP 0x14035CDD0 + {"_meth_80EC", 0x80EC}, // SP 0x140293380 MP 0x14035E870 + {"getturretowner", 0x80ED}, // SP 0x140293430 MP 0x14035EE50 + {"_meth_80EE", 0x80EE}, // SP 0x140268590 MP 0x000000000 + {"_meth_80EF", 0x80EF}, // SP 0x1402685F0 MP 0x000000000 + {"_meth_80F0", 0x80F0}, // SP 0x140268640 MP 0x000000000 + {"_meth_80F1", 0x80F1}, // SP 0x140268690 MP 0x000000000 + {"_meth_80F2", 0x80F2}, // SP 0x1402686F0 MP 0x000000000 + {"_meth_80F3", 0x80F3}, // SP 0x140268750 MP 0x000000000 + {"_meth_80F4", 0x80F4}, // SP 0x1402687A0 MP 0x000000000 + {"_meth_80F5", 0x80F5}, // SP 0x140268AF0 MP 0x000000000 + {"_meth_80F6", 0x80F6}, // SP 0x140268CC0 MP 0x000000000 + {"_meth_80F7", 0x80F7}, // SP 0x140268D20 MP 0x000000000 + {"_meth_80F8", 0x80F8}, // SP 0x140268D80 MP 0x000000000 + {"_meth_80F9", 0x80F9}, // SP 0x140268E10 MP 0x000000000 + {"_meth_80FA", 0x80FA}, // SP 0x140268EC0 MP 0x000000000 + {"_meth_80FB", 0x80FB}, // SP 0x140262E80 MP 0x14032F050 + {"_meth_80FC", 0x80FC}, // SP 0x140268890 MP 0x000000000 + {"_meth_80FD", 0x80FD}, // SP 0x1402688E0 MP 0x000000000 + {"_meth_80FE", 0x80FE}, // SP 0x1402689B0 MP 0x000000000 + {"_meth_80FF", 0x80FF}, // SP 0x140268A40 MP 0x000000000 + {"_meth_8100", 0x8100}, // SP 0x1402611F0 MP 0x14032CF70 + {"_meth_8101", 0x8101}, // SP 0x140261420 MP 0x14032D270 + {"_meth_8102", 0x8102}, // SP 0x140268930 MP 0x000000000 + {"_meth_8103", 0x8103}, // SP 0x1402616E0 MP 0x000000000 + {"_meth_8104", 0x8104}, // SP 0x1402667A0 MP 0x000000000 + {"setsentryowner", 0x8105}, // SP 0x1402935E0 MP 0x14035EF40 + {"setsentrycarrier", 0x8106}, // SP 0x140293F00 MP 0x14035F1B0 + {"setturretminimapvisible", 0x8107}, // SP 0x1402942F0 MP 0x14035F6D0 + {"settargetentity", 0x8108}, // SP 0x140294600 MP 0x14035F860 + {"snaptotargetentity", 0x8109}, // SP 0x140294A20 MP 0x14035FB70 + {"cleartargetentity", 0x810A}, // SP 0x140294E90 MP 0x14035FE30 + {"getturrettarget", 0x810B}, // SP 0x140295270 MP 0x140360040 + {"setplayerspread", 0x810C}, // SP 0x1402957F0 MP 0x1403606C0 + {"_meth_810D", 0x810D}, // SP 0x140295A70 MP 0x140360990 + {"_meth_810E", 0x810E}, // SP 0x140295D50 MP 0x1403609A0 + {"_meth_810F", 0x810F}, // SP 0x14028A710 MP 0x000000000 + {"_meth_8110", 0x8110}, // SP 0x14028A730 MP 0x000000000 + {"_meth_8111", 0x8111}, // SP 0x14028A750 MP 0x000000000 + {"_meth_8112", 0x8112}, // SP 0x14028A770 MP 0x000000000 + {"_meth_8113", 0x8113}, // SP 0x14028A790 MP 0x000000000 + {"_meth_8114", 0x8114}, // SP 0x14028A7B0 MP 0x000000000 + {"_meth_8115", 0x8115}, // SP 0x14028A7C0 MP 0x000000000 + {"_meth_8116", 0x8116}, // SP 0x14028A7E0 MP 0x000000000 + {"_meth_8117", 0x8117}, // SP 0x14028A800 MP 0x000000000 + {"_meth_8118", 0x8118}, // SP 0x14028A8E0 MP 0x000000000 + {"_meth_8119", 0x8119}, // SP 0x14028A960 MP 0x000000000 + {"_meth_811A", 0x811A}, // SP 0x140261760 MP 0x14032D140 + {"_meth_811B", 0x811B}, // SP 0x140261870 MP 0x14032D2D0 + {"_meth_811C", 0x811C}, // SP 0x140261950 MP 0x14032D630 + {"_meth_811D", 0x811D}, // SP 0x140261A30 MP 0x14032D780 + {"_meth_811E", 0x811E}, // SP 0x140269090 MP 0x000000000 + {"_meth_811F", 0x811F}, // SP 0x140269510 MP 0x000000000 + {"_meth_8121", 0x8121}, // SP 0x1402692D0 MP 0x000000000 + {"_meth_8122", 0x8122}, // SP 0x140269350 MP 0x000000000 + {"_meth_8123", 0x8123}, // SP 0x140269650 MP 0x000000000 + {"_meth_8128", 0x8128}, // SP 0x140269650 MP 0x000000000 + {"_meth_8129", 0x8129}, // SP 0x140269370 MP 0x000000000 + {"_meth_812A", 0x812A}, // SP 0x1402680B0 MP 0x000000000 + {"_meth_812B", 0x812B}, // SP 0x1402681E0 MP 0x000000000 + {"_meth_812C", 0x812C}, // SP 0x1402691F0 MP 0x000000000 + {"_meth_812D", 0x812D}, // SP 0x140268290 MP 0x000000000 + {"_meth_812E", 0x812E}, // SP 0x140267290 MP 0x14032B170 + {"_meth_812F", 0x812F}, // SP 0x140267650 MP 0x14032B720 + {"_meth_8130", 0x8130}, // SP 0x140262E20 MP 0x14032F570 + {"_meth_8131", 0x8131}, // SP 0x1402684C0 MP 0x000000000 + {"_meth_8132", 0x8132}, // SP 0x140261580 MP 0x14032CD50 + {"_meth_8133", 0x8133}, // SP 0x140261670 MP 0x14032CF00 + {"_meth_8134", 0x8134}, // SP 0x140268530 MP 0x000000000 + {"setconvergencetime", 0x8135}, // SP 0x140295E90 MP 0x140360A40 + {"setconvergenceheightpercent", 0x8136}, // SP 0x140296650 MP 0x140360E90 + {"setturretteam", 0x8137}, // SP 0x1402967E0 MP 0x140361150 + {"_meth_8138", 0x8138}, // SP 0x140296C90 MP 0x140361320 + {"startfiring", 0x8139}, // SP 0x140296D70 MP 0x140361370 + {"stopfiring", 0x813A}, // SP 0x140296E90 MP 0x1403615A0 + {"_meth_813B", 0x813B}, // SP 0x1402D7DD0 MP 0x140077920 + {"freeentitysentient", 0x813C}, // SP 0x1402D7EE0 MP 0x140077A40 + {"_meth_813D", 0x813D}, // SP 0x1402D7FE0 MP 0x000000000 + {"_meth_813E", 0x813E}, // SP 0x1402D8040 MP 0x000000000 + {"_meth_813F", 0x813F}, // SP 0x1402D80E0 MP 0x000000000 + {"_meth_8140", 0x8140}, // SP 0x14028A390 MP 0x000000000 + {"_meth_8142", 0x8142}, // SP 0x14028A3D0 MP 0x000000000 + {"_meth_8143", 0x8143}, // SP 0x14028A370 MP 0x000000000 + {"_meth_8144", 0x8144}, // SP 0x14028A410 MP 0x000000000 + {"_meth_8145", 0x8145}, // SP 0x14028A490 MP 0x000000000 + {"_meth_8146", 0x8146}, // SP 0x14028A4B0 MP 0x000000000 + {"_meth_8147", 0x8147}, // SP 0x14028A4C0 MP 0x000000000 + {"_meth_8148", 0x8148}, // SP 0x14028A4E0 MP 0x000000000 + {"_meth_8149", 0x8149}, // SP 0x14028A500 MP 0x000000000 + {"_meth_814A", 0x814A}, // SP 0x14028A520 MP 0x000000000 + {"_meth_814B", 0x814B}, // SP 0x14028A530 MP 0x000000000 + {"_meth_814C", 0x814C}, // SP 0x14028A550 MP 0x000000000 + {"_meth_814D", 0x814D}, // SP 0x14028A570 MP 0x000000000 + {"_meth_814E", 0x814E}, // SP 0x14028A590 MP 0x000000000 + {"_meth_814F", 0x814F}, // SP 0x14028A5A0 MP 0x000000000 + {"_meth_8150", 0x8150}, // SP 0x14028A5C0 MP 0x000000000 + {"_meth_8151", 0x8151}, // SP 0x14028A5E0 MP 0x000000000 + {"_meth_8152", 0x8152}, // SP 0x14028A650 MP 0x000000000 + {"_meth_8153", 0x8153}, // SP 0x14028A690 MP 0x000000000 + {"_meth_8154", 0x8154}, // SP 0x14028A6E0 MP 0x000000000 + {"_meth_8155", 0x8155}, // SP 0x14028A700 MP 0x000000000 + {"_meth_8156", 0x8156}, // SP 0x1405D92F0 MP 0x140361680 + {"_meth_8157", 0x8157}, // SP 0x140297730 MP 0x140362260 + {"_meth_8158", 0x8158}, // SP 0x140297890 MP 0x140362410 + {"_meth_8159", 0x8159}, // SP 0x140297D20 MP 0x1403629F0 + {"_meth_815A", 0x815A}, // SP 0x140297F90 MP 0x140362CB0 + {"setautorotationdelay", 0x815B}, // SP 0x1402980D0 MP 0x140363040 + {"_meth_815C", 0x815C}, // SP 0x140298800 MP 0x1403638A0 + {"restoredefaultdroppitch", 0x815D}, // SP 0x140298880 MP 0x140363B30 + {"turretfiredisable", 0x815E}, // SP 0x140299040 MP 0x140363CF0 + {"_meth_815F", 0x815F}, // SP 0x1402495F0 MP 0x000000000 + {"_meth_8160", 0x8160}, // SP 0x1402496C0 MP 0x000000000 + {"_meth_8161", 0x8161}, // SP 0x140249790 MP 0x000000000 + {"_meth_8162", 0x8162}, // SP 0x140249810 MP 0x000000000 + {"_meth_8163", 0x8163}, // SP 0x140249950 MP 0x000000000 + {"_meth_8164", 0x8164}, // SP 0x140249A30 MP 0x000000000 + {"_meth_8165", 0x8165}, // SP 0x140249AC0 MP 0x000000000 + {"_meth_8166", 0x8166}, // SP 0x140249B00 MP 0x000000000 + {"_meth_8167", 0x8167}, // SP 0x140249BE0 MP 0x000000000 + {"_meth_8168", 0x8168}, // SP 0x140249C70 MP 0x000000000 + {"_meth_8169", 0x8169}, // SP 0x140262B90 MP 0x14032E0A0 + {"_meth_816A", 0x816A}, // SP 0x140249D10 MP 0x000000000 + {"_meth_816B", 0x816B}, // SP 0x140249EE0 MP 0x000000000 + {"_meth_816C", 0x816C}, // SP 0x14024A0E0 MP 0x000000000 + {"_meth_816D", 0x816D}, // SP 0x14024A200 MP 0x000000000 + {"_meth_816E", 0x816E}, // SP 0x14024A2D0 MP 0x000000000 + {"_meth_816F", 0x816F}, // SP 0x14024A3F0 MP 0x000000000 + {"_meth_8170", 0x8170}, // SP 0x14024A480 MP 0x000000000 + {"_meth_8171", 0x8171}, // SP 0x14024A5C0 MP 0x000000000 + {"_meth_8172", 0x8172}, // SP 0x14024A630 MP 0x000000000 + {"_meth_8173", 0x8173}, // SP 0x14024A710 MP 0x000000000 + {"_meth_8174", 0x8174}, // SP 0x14024A880 MP 0x000000000 + {"_meth_8175", 0x8175}, // SP 0x14024AAD0 MP 0x000000000 + {"_meth_8176", 0x8176}, // SP 0x14024AB30 MP 0x000000000 + {"_meth_8177", 0x8177}, // SP 0x14024AB90 MP 0x000000000 + {"_meth_8178", 0x8178}, // SP 0x14024AC50 MP 0x000000000 + {"getenemysqdist", 0x8179}, // SP 0x1402D77E0 MP 0x1400772C0 + {"_meth_817A", 0x817A}, // SP 0x1402D7820 MP 0x140077300 + {"setthreatbiasgroup", 0x817B}, // SP 0x1402D7BE0 MP 0x1400776E0 + {"getthreatbiasgroup", 0x817C}, // SP 0x1402D7C50 MP 0x140077750 + {"turretfireenable", 0x817D}, // SP 0x140299220 MP 0x140363EE0 + {"setturretmodechangewait", 0x817E}, // SP 0x1402994D0 MP 0x140364690 + {"usetriggerrequirelookat", 0x817F}, // SP 0x140297DE0 MP 0x14035EEE0 + {"getstance", 0x8180}, // SP 0x14029D1C0 MP 0x140364F90 + {"_meth_8181", 0x8181}, // SP 0x14029D430 MP 0x140365230 + {"itemweaponsetammo", 0x8182}, // SP 0x140299FA0 MP 0x140360F20 + {"_meth_8183", 0x8183}, // SP 0x14029A5A0 MP 0x140361420 + {"gettagorigin", 0x8184}, // SP 0x14029E360 MP 0x140368090 + {"gettagangles", 0x8185}, // SP 0x14029E810 MP 0x140368320 + {"_meth_8186", 0x8186}, // SP 0x14028E580 MP 0x14036D490 + {"stunplayer", 0x8187}, // SP 0x14028F160 MP 0x14036DEC0 + {"_meth_8188", 0x8188}, // SP 0x14029B970 MP 0x140366E70 + {"_meth_8189", 0x8189}, // SP 0x14029BB30 MP 0x140367230 + {"setdepthoffield", 0x818A}, // SP 0x14029EF20 MP 0x140368890 + {"setviewmodeldepthoffield", 0x818B}, // SP 0x14029F990 MP 0x140369900 + {"_meth_818C", 0x818C}, // SP 0x1402A15D0 MP 0x14036AD20 + {"_meth_818D", 0x818D}, // SP 0x140247D90 MP 0x000000000 + {"_meth_818E", 0x818E}, // SP 0x140247DE0 MP 0x000000000 + {"_meth_818F", 0x818F}, // SP 0x140247E50 MP 0x000000000 + {"_meth_8190", 0x8190}, // SP 0x140247E90 MP 0x000000000 + {"_meth_8191", 0x8191}, // SP 0x140247F00 MP 0x000000000 + {"_meth_8192", 0x8192}, // SP 0x140247F90 MP 0x000000000 + {"_meth_8193", 0x8193}, // SP 0x140248160 MP 0x000000000 + {"_meth_8194", 0x8194}, // SP 0x1402484A0 MP 0x000000000 + {"_meth_8195", 0x8195}, // SP 0x1402485A0 MP 0x000000000 + {"_meth_8196", 0x8196}, // SP 0x1402485F0 MP 0x000000000 + {"_meth_8197", 0x8197}, // SP 0x140248640 MP 0x000000000 + {"_meth_8198", 0x8198}, // SP 0x1402486A0 MP 0x000000000 + {"_meth_8199", 0x8199}, // SP 0x1402486F0 MP 0x000000000 + {"_meth_819E", 0x819E}, // SP 0x1402487C0 MP 0x000000000 + {"_meth_819F", 0x819F}, // SP 0x140248870 MP 0x000000000 + {"_meth_81A0", 0x81A0}, // SP 0x1402488C0 MP 0x000000000 + {"getnegotiationstartnode", 0x81A1}, // SP 0x140248970 MP 0x14044F980 + {"getnegotiationendnode", 0x81A2}, // SP 0x1402489E0 MP 0x14044F830 + {"getnegotiationnextnode", 0x81A3}, // SP 0x140248A50 MP 0x14044F8D0 + {"_meth_81A4", 0x81A4}, // SP 0x140248B30 MP 0x000000000 + {"_meth_81A5", 0x81A5}, // SP 0x140248BD0 MP 0x000000000 + {"_meth_81A6", 0x81A6}, // SP 0x140248CC0 MP 0x000000000 + {"_meth_81A7", 0x81A7}, // SP 0x140248DD0 MP 0x000000000 + {"_meth_81A8", 0x81A8}, // SP 0x140247750 MP 0x000000000 + {"_meth_81A9", 0x81A9}, // SP 0x140248E30 MP 0x000000000 + {"_meth_81AA", 0x81AA}, // SP 0x140248FB0 MP 0x000000000 + {"_meth_81AB", 0x81AB}, // SP 0x1402490D0 MP 0x000000000 + {"_meth_81AC", 0x81AC}, // SP 0x140249170 MP 0x000000000 + {"_meth_81AD", 0x81AD}, // SP 0x140249290 MP 0x000000000 + {"_meth_81AE", 0x81AE}, // SP 0x140249460 MP 0x000000000 + {"_meth_81AF", 0x81AF}, // SP 0x1402494B0 MP 0x000000000 + {"_meth_81B0", 0x81B0}, // SP 0x140249500 MP 0x000000000 + {"_meth_81B1", 0x81B1}, // SP 0x1402A15D0 MP 0x14036ADA0 + {"_meth_81B2", 0x81B2}, // SP 0x1402A15D0 MP 0x14036AE60 + {"viewkick", 0x81B3}, // SP 0x1402A1640 MP 0x14036AFA0 + {"_meth_81B4", 0x81B4}, // SP 0x14029B1E0 MP 0x1403668B0 + {"_meth_81B5", 0x81B5}, // SP 0x1402998B0 MP 0x140364980 + {"autoboltmissileeffects", 0x81B6}, // SP 0x140299AA0 MP 0x140364B50 + {"enablegrenadetouchdamage", 0x81B7}, // SP 0x140299CA0 MP 0x140364F40 + {"disablegrenadetouchdamage", 0x81B8}, // SP 0x140299F20 MP 0x1403650C0 + {"_meth_81B9", 0x81B9}, // SP 0x14029AF00 MP 0x1403665A0 + {"_meth_81BA", 0x81BA}, // SP 0x14024AF80 MP 0x000000000 + {"_meth_81BB", 0x81BB}, // SP 0x14024B160 MP 0x000000000 + {"_meth_81BC", 0x81BC}, // SP 0x14024B3B0 MP 0x000000000 + {"_meth_81BD", 0x81BD}, // SP 0x14024B4F0 MP 0x000000000 + {"_meth_81BE", 0x81BE}, // SP 0x14024B570 MP 0x000000000 + {"_meth_81BF", 0x81BF}, // SP 0x14024B910 MP 0x000000000 + {"_meth_81C0", 0x81C0}, // SP 0x14024BA40 MP 0x000000000 + {"_meth_81C1", 0x81C1}, // SP 0x14024BB20 MP 0x000000000 + {"_meth_81C2", 0x81C2}, // SP 0x14024BB90 MP 0x000000000 + {"_meth_81C3", 0x81C3}, // SP 0x14024BC40 MP 0x000000000 + {"_meth_81C4", 0x81C4}, // SP 0x1402D7F30 MP 0x140077AA0 + {"_meth_81C5", 0x81C5}, // SP 0x1402D7F90 MP 0x140077B00 + {"_meth_81C6", 0x81C6}, // SP 0x14024BD90 MP 0x000000000 + {"_meth_81C7", 0x81C7}, // SP 0x14024C010 MP 0x000000000 + {"_meth_81C8", 0x81C8}, // SP 0x14024C150 MP 0x000000000 + {"_meth_81C9", 0x81C9}, // SP 0x14024C240 MP 0x000000000 + {"_meth_81CA", 0x81CA}, // SP 0x14024C250 MP 0x000000000 + {"_meth_81CB", 0x81CB}, // SP 0x14024C270 MP 0x000000000 + {"_meth_81CC", 0x81CC}, // SP 0x14024C290 MP 0x000000000 + {"_meth_81CD", 0x81CD}, // SP 0x14024C2F0 MP 0x000000000 + {"_meth_81CE", 0x81CE}, // SP 0x14024C360 MP 0x000000000 + {"_meth_81CF", 0x81CF}, // SP 0x14024C430 MP 0x000000000 + {"_meth_81D0", 0x81D0}, // SP 0x14024C520 MP 0x000000000 + {"_meth_81D1", 0x81D1}, // SP 0x14024C560 MP 0x000000000 + {"_meth_81D2", 0x81D2}, // SP 0x14024C5A0 MP 0x000000000 + {"_meth_81D3", 0x81D3}, // SP 0x14024C5E0 MP 0x000000000 + {"_meth_81D4", 0x81D4}, // SP 0x140247BF0 MP 0x000000000 + {"_meth_81D5", 0x81D5}, // SP 0x140247CE0 MP 0x000000000 + {"_meth_81D6", 0x81D6}, // SP 0x140247930 MP 0x000000000 + {"_meth_81D7", 0x81D7}, // SP 0x14029B180 MP 0x140366790 + {"entityradiusdamage", 0x81D8}, // SP 0x1402A3840 MP 0x14036C130 + {"_meth_81D9", 0x81D9}, // SP 0x14028DCF0 MP 0x14036CAB0 + {"bddatachunk::deserialize", 0x81DA}, // SP 0x14028E350 MP 0x14036D0C0 + {"_meth_81DB", 0x81DB}, // SP 0x14028E430 MP 0x14036D150 + {"_meth_81DC", 0x81DC}, // SP 0x14029A340 MP 0x140365D80 + {"_meth_81DD", 0x81DD}, // SP 0x14029A4E0 MP 0x140365E90 + {"_meth_81DE", 0x81DE}, // SP 0x14029A700 MP 0x140366180 + {"missilesetflightmodedirect", 0x81DF}, // SP 0x14029AA10 MP 0x1403663A0 + {"missilesetflightmodetop", 0x81E0}, // SP 0x14029AB50 MP 0x140366480 + {"getlightintensity", 0x81E1}, // SP 0x14028EA00 MP 0x14036E8B0 + {"_meth_81E2", 0x81E2}, // SP 0x14028EB40 MP 0x14036EAB0 + {"isragdoll", 0x81E3}, // SP 0x14028F2F0 MP 0x14036F2E0 + {"setmovespeedscale", 0x81E4}, // SP 0x1402A2860 MP 0x14036EF80 + {"cameralinkto", 0x81E5}, // SP 0x14028FFC0 MP 0x1403584E0 + {"cameraunlink", 0x81E6}, // SP 0x1402900C0 MP 0x140358750 + {"_meth_81E7", 0x81E7}, // SP 0x140248F30 MP 0x000000000 + {"_meth_81E8", 0x81E8}, // SP 0x1402491F0 MP 0x000000000 + {"_meth_81E9", 0x81E9}, // SP 0x140249230 MP 0x000000000 + {"_meth_81EA", 0x81EA}, // SP 0x140249370 MP 0x000000000 + {"_meth_81EB", 0x81EB}, // SP 0x140249650 MP 0x000000000 + {"_meth_81EC", 0x81EC}, // SP 0x140249710 MP 0x000000000 + {"_meth_81ED", 0x81ED}, // SP 0x1402499B0 MP 0x000000000 + {"_meth_81EE", 0x81EE}, // SP 0x140249A70 MP 0x000000000 + {"_meth_81EF", 0x81EF}, // SP 0x140249B80 MP 0x000000000 + {"_meth_81F0", 0x81F0}, // SP 0x140249C30 MP 0x000000000 + {"_meth_81F1", 0x81F1}, // SP 0x140249CC0 MP 0x000000000 + {"_meth_81F2", 0x81F2}, // SP 0x140249E00 MP 0x000000000 + {"_meth_81F3", 0x81F3}, // SP 0x140249E50 MP 0x000000000 + {"_meth_81F4", 0x81F4}, // SP 0x14024A010 MP 0x000000000 + {"_meth_81F5", 0x81F5}, // SP 0x14024A080 MP 0x000000000 + {"_meth_81F6", 0x81F6}, // SP 0x14024A190 MP 0x000000000 + {"_meth_81F7", 0x81F7}, // SP 0x14024A330 MP 0x000000000 + {"_meth_81F8", 0x81F8}, // SP 0x14024A390 MP 0x000000000 + {"_meth_81F9", 0x81F9}, // SP 0x14024A260 MP 0x000000000 + {"_meth_81FA", 0x81FA}, // SP 0x14024A440 MP 0x000000000 + {"_meth_81FB", 0x81FB}, // SP 0x14024A4F0 MP 0x000000000 + {"_meth_81FC", 0x81FC}, // SP 0x14024A6B0 MP 0x000000000 + {"_meth_81FD", 0x81FD}, // SP 0x14024A780 MP 0x000000000 + {"_meth_81FE", 0x81FE}, // SP 0x14024A950 MP 0x000000000 + {"_meth_81FF", 0x81FF}, // SP 0x14024AC00 MP 0x000000000 + {"_meth_8200", 0x8200}, // SP 0x14024AD60 MP 0x000000000 + {"_meth_8201", 0x8201}, // SP 0x14024AE60 MP 0x000000000 + {"_meth_8202", 0x8202}, // SP 0x14024B1D0 MP 0x000000000 + {"_meth_8203", 0x8203}, // SP 0x14024B2C0 MP 0x000000000 + {"controlslinkto", 0x8204}, // SP 0x1402905D0 MP 0x140358F20 + {"controlsunlink", 0x8205}, // SP 0x1402908B0 MP 0x1403593C0 + {"_meth_8206", 0x8206}, // SP 0x000000000 MP 0x14035AB40 + {"_meth_8207", 0x8207}, // SP 0x1402AA5F0 MP 0x000000000 + {"_meth_8208", 0x8208}, // SP 0x000000000 MP 0x14035ABE0 + {"_meth_820A", 0x820A}, // SP 0x000000000 MP 0x14035B100 + {"_meth_820B", 0x820B}, // SP 0x000000000 MP 0x14035B170 + {"_meth_820C", 0x820C}, // SP 0x000000000 MP 0x14035B380 + {"_meth_820D", 0x820D}, // SP 0x000000000 MP 0x14035B210 + {"_meth_820E", 0x820E}, // SP 0x000000000 MP 0x14035B270 + {"drivevehicleandcontrolturret", 0x820F}, // SP 0x140291CD0 MP 0x14035C250 + {"drivevehicleandcontrolturretoff", 0x8210}, // SP 0x140292090 MP 0x14035C420 + {"_meth_8211", 0x8211}, // SP 0x1402923D0 MP 0x14035C930 + {"_meth_8212", 0x8212}, // SP 0x1402931B0 MP 0x14035CBB0 + {"_meth_8213", 0x8213}, // SP 0x1402940E0 MP 0x14035D6A0 + {"_meth_8214", 0x8214}, // SP 0x140296080 MP 0x14035F750 + {"_meth_8215", 0x8215}, // SP 0x1402961E0 MP 0x14035F810 + {"_meth_8216", 0x8216}, // SP 0x140296540 MP 0x14035FB00 + {"_meth_8217", 0x8217}, // SP 0x1402966E0 MP 0x14035FC80 + {"circle", 0x8218}, // SP 0x1402990B0 MP 0x1403620D0 + {"rect", 0x8219}, // SP 0x140299540 MP 0x140362730 + {"_meth_821A", 0x821A}, // SP 0x140299B00 MP 0x140362E50 + {"transfermarkstonewscriptmodel", 0x821B}, // SP 0x14029A1B0 MP 0x140363790 + {"setwatersheeting", 0x821C}, // SP 0x140290290 MP 0x140358930 + {"_meth_821D", 0x821D}, // SP 0x1402A29B0 MP 0x000000000 + {"_meth_821E", 0x821E}, // SP 0x1402A32F0 MP 0x000000000 + {"setweaponhudiconoverride", 0x821F}, // SP 0x140296A30 MP 0x14035FC90 + {"getweaponhudiconoverride", 0x8220}, // SP 0x140297010 MP 0x140360380 + {"_meth_8221", 0x8221}, // SP 0x1402976A0 MP 0x1403609B0 + {"_meth_8222", 0x8222}, // SP 0x140299CF0 MP 0x1403635A0 + {"_meth_8223", 0x8223}, // SP 0x140299B90 MP 0x1403630E0 + {"_meth_8224", 0x8224}, // SP 0x14029A2C0 MP 0x140363C10 + {"_meth_8225", 0x8225}, // SP 0x14029DF50 MP 0x140365F70 + {"_meth_8226", 0x8226}, // SP 0x1402A17F0 MP 0x14036B0B0 + {"vehicleturretcontroloff", 0x8227}, // SP 0x140464260 MP 0x140562970 + {"isturretready", 0x8228}, // SP 0x140464340 MP 0x1405629E0 + {"_meth_8229", 0x8229}, // SP 0x140464570 MP 0x140562C70 + {"dospawn", 0x822A}, // SP 0x1404646D0 MP 0x140562D90 + {"isphysveh", 0x822B}, // SP 0x1404647A0 MP 0x140562E80 + {"crash", 0x822C}, // SP 0x140464840 MP 0x140562F80 + {"launch", 0x822D}, // SP 0x140464980 MP 0x1405630A0 + {"disablecrashing", 0x822E}, // SP 0x140464B20 MP 0x140563240 + {"enablecrashing", 0x822F}, // SP 0x140464C10 MP 0x140563310 + {"setspeed", 0x8230}, // SP 0x140464C90 MP 0x1405633E0 + {"setconveyorbelt", 0x8231}, // SP 0x140464E50 MP 0x140563610 + {"freevehicle", 0x8232}, // SP 0x000000000 MP 0x1405609B0 + {"_meth_8233", 0x8233}, // SP 0x140290E70 MP 0x000000000 + {"_meth_8234", 0x8234}, // SP 0x1402910E0 MP 0x000000000 + {"_meth_8235", 0x8235}, // SP 0x140291670 MP 0x000000000 + {"_meth_8236", 0x8236}, // SP 0x140291A60 MP 0x000000000 + {"_meth_8237", 0x8237}, // SP 0x140292010 MP 0x000000000 + {"_meth_8238", 0x8238}, // SP 0x140292230 MP 0x000000000 + {"_meth_8239", 0x8239}, // SP 0x14029C2A0 MP 0x000000000 + {"_meth_823A", 0x823A}, // SP 0x14029CAD0 MP 0x000000000 + {"_meth_823B", 0x823B}, // SP 0x14029CD70 MP 0x000000000 + {"_meth_823C", 0x823C}, // SP 0x14029CF00 MP 0x000000000 + {"_meth_823D", 0x823D}, // SP 0x140292BA0 MP 0x000000000 + {"_meth_823E", 0x823E}, // SP 0x140292DF0 MP 0x000000000 + {"_meth_8240", 0x8240}, // SP 0x1402A3880 MP 0x000000000 + {"_meth_8241", 0x8241}, // SP 0x140248AD0 MP 0x000000000 + {"_meth_8242", 0x8242}, // SP 0x140248EA0 MP 0x000000000 + {"_meth_8243", 0x8243}, // SP 0x1402A1AF0 MP 0x14036B910 + {"_meth_8244", 0x8244}, // SP 0x1402A1E20 MP 0x14036BE30 + {"_meth_8245", 0x8245}, // SP 0x1402A24D0 MP 0x14036C5B0 + {"trackerupdate", 0x8246}, // SP 0x14028DC50 MP 0x14036E800 + {"pingplayer", 0x8247}, // SP 0x000000000 MP 0x140332B50 + {"_meth_8248", 0x8248}, // SP 0x140268FE0 MP 0x140332B40 + {"sayteam", 0x8249}, // SP 0x000000000 MP 0x1403345F0 + {"sayall", 0x824A}, // SP 0x000000000 MP 0x1403346A0 + {"_meth_824B", 0x824B}, // SP 0x000000000 MP 0x140332C90 + {"_meth_824C", 0x824C}, // SP 0x140265080 MP 0x140330FE0 + {"dropscavengerbag", 0x824D}, // SP 0x000000000 MP 0x140332FB0 + {"setjitterparams", 0x824E}, // SP 0x140461E80 MP 0x140560640 + {"sethoverparams", 0x824F}, // SP 0x140461F50 MP 0x140560710 + {"joltbody", 0x8250}, // SP 0x140462070 MP 0x1405607B0 + {"freevehicle", 0x8251}, // SP 0x140462250 MP 0x1405609B0 + {"_meth_8252", 0x8252}, // SP 0x140462300 MP 0x140560A20 + {"getvehicleowner", 0x8253}, // SP 0x140462550 MP 0x140560C70 + {"setvehiclelookattext", 0x8254}, // SP 0x1404625D0 MP 0x140560CF0 + {"setvehicleteam", 0x8255}, // SP 0x140462660 MP 0x140560D80 + {"neargoalnotifydist", 0x8256}, // SP 0x1404626E0 MP 0x140560F10 + {"setgoalpos", 0x8257}, // SP 0x140462750 MP 0x140560F80 + {"setgoalyaw", 0x8258}, // SP 0x140462840 MP 0x1405610A0 + {"cleargoalyaw", 0x8259}, // SP 0x1404628D0 MP 0x140561130 + {"settargetyaw", 0x825A}, // SP 0x140462950 MP 0x1405611B0 + {"cleartargetyaw", 0x825B}, // SP 0x1404629E0 MP 0x140561240 + {"helisetgoal", 0x825C}, // SP 0x140462A60 MP 0x1405612C0 + {"_meth_825D", 0x825D}, // SP 0x140463320 MP 0x140561B60 + {"setturrettargetent", 0x825E}, // SP 0x140463410 MP 0x140561C60 + {"clearturrettargetent", 0x825F}, // SP 0x140463510 MP 0x140561D60 + {"canturrettargetpoint", 0x8260}, // SP 0x1404635A0 MP 0x140561DF0 + {"setlookatent", 0x8261}, // SP 0x1404638A0 MP 0x1405620F0 + {"clearlookatent", 0x8262}, // SP 0x140463950 MP 0x1405621A0 + {"setweapon", 0x8263}, // SP 0x140463AB0 MP 0x140562280 + {"_meth_8264", 0x8264}, // SP 0x140463B20 MP 0x1405622F0 + {"vehicleturretcontrolon", 0x8265}, // SP 0x1404641D0 MP 0x1405628F0 + {"finishplayerdamage", 0x8266}, // SP 0x000000000 MP 0x1403337A0 + {"suicide", 0x8267}, // SP 0x000000000 MP 0x140333E20 + {"_meth_8268", 0x8268}, // SP 0x000000000 MP 0x140334010 + {"_meth_8269", 0x8269}, // SP 0x000000000 MP 0x1403340A0 + {"_meth_826A", 0x826A}, // SP 0x000000000 MP 0x140334120 + {"spawn", 0x826B}, // SP 0x000000000 MP 0x1403341A0 + {"_meth_826C", 0x826C}, // SP 0x000000000 MP 0x140334230 + {"_meth_826D", 0x826D}, // SP 0x000000000 MP 0x140334290 + {"istalking", 0x826E}, // SP 0x000000000 MP 0x140334570 + {"allowspectateteam", 0x826F}, // SP 0x000000000 MP 0x140334750 + {"_meth_8270", 0x8270}, // SP 0x000000000 MP 0x140334980 + {"getguid", 0x8271}, // SP 0x000000000 MP 0x140334B20 + {"_meth_8272", 0x8272}, // SP 0x1402B3CA0 MP 0x14037FA00 + {"_meth_8273", 0x8273}, // SP 0x1402B3EC0 MP 0x14037FC50 + {"clonebrushmodeltoscriptmodel", 0x8274}, // SP 0x1402B4500 MP 0x140380380 + {"_meth_8275", 0x8275}, // SP 0x000000000 MP 0x140380450 + {"scriptmodelclearanim", 0x8276}, // SP 0x000000000 MP 0x140380700 + {"_meth_8277", 0x8277}, // SP 0x000000000 MP 0x140380570 + {"_meth_8278", 0x8278}, // SP 0x140465060 MP 0x1405637F0 + {"attachpath", 0x8279}, // SP 0x1404651E0 MP 0x14055F040 + {"getattachpos", 0x827A}, // SP 0x1404652F0 MP 0x14055F170 + {"startpath", 0x827B}, // SP 0x1404654A0 MP 0x14055F340 + {"setswitchnode", 0x827C}, // SP 0x140465740 MP 0x14055F4D0 + {"setwaitspeed", 0x827D}, // SP 0x140465840 MP 0x14055F560 + {"finishdamage", 0x827E}, // SP 0x000000000 MP 0x14055F5E0 + {"setspeed", 0x827F}, // SP 0x1404658C0 MP 0x14055F840 + {"setspeedimmediate", 0x8280}, // SP 0x140465930 MP 0x14055F8B0 + {"_meth_8281", 0x8281}, // SP 0x140465AC0 MP 0x14055FA60 + {"getspeed", 0x8282}, // SP 0x140465BE0 MP 0x14055FB80 + {"getvelocity", 0x8283}, // SP 0x140465CD0 MP 0x14055FC70 + {"getbodyvelocity", 0x8284}, // SP 0x140465D40 MP 0x14055FCE0 + {"getsteering", 0x8285}, // SP 0x140465DB0 MP 0x14055FD50 + {"getthrottle", 0x8286}, // SP 0x140465E30 MP 0x14055FDE0 + {"turnengineoff", 0x8287}, // SP 0x140465EA0 MP 0x14055FE50 + {"turnengineon", 0x8288}, // SP 0x140465F00 MP 0x14055FEC0 + {"_meth_8289", 0x8289}, // SP 0x140465F60 MP 0x000000000 + {"getgoalspeedmph", 0x828A}, // SP 0x140466020 MP 0x14055FF30 + {"_meth_828B", 0x828B}, // SP 0x140466090 MP 0x14055FFA0 + {"setacceleration", 0x828C}, // SP 0x140466100 MP 0x140560010 + {"resumespeed", 0x828D}, // SP 0x140466170 MP 0x140560080 + {"setyawspeed", 0x828E}, // SP 0x140466200 MP 0x140560110 + {"setyawspeedbyname", 0x828F}, // SP 0x140466360 MP 0x140560270 + {"setmaxpitchroll", 0x8290}, // SP 0x140461CC0 MP 0x140560480 + {"setairresitance", 0x8291}, // SP 0x140461D80 MP 0x140560540 + {"setturningability", 0x8292}, // SP 0x140461E10 MP 0x1405605D0 + {"_meth_8293", 0x8293}, // SP 0x140260F20 MP 0x140334B90 + {"_meth_8294", 0x8294}, // SP 0x000000000 MP 0x140334D50 + {"ismlgspectator", 0x8295}, // SP 0x000000000 MP 0x140334DB0 + {"getclanidhigh", 0x8296}, // SP 0x000000000 MP 0x140334E10 + {"getclanidlow", 0x8297}, // SP 0x000000000 MP 0x140334E70 + {"_meth_8298", 0x8298}, // SP 0x000000000 MP 0x140334ED0 + {"getspectatingplayer", 0x8299}, // SP 0x000000000 MP 0x140334F60 + {"predictstreampos", 0x829A}, // SP 0x000000000 MP 0x140334FE0 + {"_meth_829B", 0x829B}, // SP 0x000000000 MP 0x1403350D0 + {"_meth_829C", 0x829C}, // SP 0x000000000 MP 0x1403350E0 + {"setrank", 0x829D}, // SP 0x000000000 MP 0x1403350F0 + {"_meth_829E", 0x829E}, // SP 0x000000000 MP 0x140335190 + {"setmlgspectator", 0x829F}, // SP 0x140260730 MP 0x14032CA40 + {"visionsyncwithplayer", 0x82A0}, // SP 0x000000000 MP 0x14032ED90 + {"showhudsplash", 0x82A1}, // SP 0x140263850 MP 0x14032FB10 + {"setperk", 0x82A2}, // SP 0x140265490 MP 0x1403297E0 + {"_meth_82A3", 0x82A3}, // SP 0x1402659A0 MP 0x140329D00 + {"_meth_82A4", 0x82A4}, // SP 0x1402661B0 MP 0x14032A460 + {"_meth_82A5", 0x82A5}, // SP 0x140265D40 MP 0x14032A0A0 + {"registerparty", 0x82A6}, // SP 0x000000000 MP 0x1403323C0 + {"_meth_82A7", 0x82A7}, // SP 0x000000000 MP 0x1403324F0 + {"_meth_82A8", 0x82A8}, // SP 0x1405D92F0 MP 0x14032A8F0 + {"_meth_82A9", 0x82A9}, // SP 0x1405D92F0 MP 0x14032A900 + {"moveto", 0x82AA}, // SP 0x1402B2A10 MP 0x14037E950 + {"rotatepitch", 0x82AB}, // SP 0x1402B2F60 MP 0x14037EEB0 + {"rotateyaw", 0x82AC}, // SP 0x1402B2F70 MP 0x14037EEC0 + {"rotateroll", 0x82AD}, // SP 0x1402B2F90 MP 0x14037EEE0 + {"_meth_82AE", 0x82AE}, // SP 0x1402B2C10 MP 0x14037EB00 + {"_meth_82AF", 0x82AF}, // SP 0x1402B2D70 MP 0x14037EC90 + {"_meth_82B0", 0x82B0}, // SP 0x1402B2EE0 MP 0x14037EE20 + {"rotateby", 0x82B1}, // SP 0x1402B3030 MP 0x14037EF10 + {"_meth_82B2", 0x82B2}, // SP 0x1402B3460 MP 0x14037F060 + {"_meth_82B3", 0x82B3}, // SP 0x1402B3470 MP 0x14037F070 + {"_meth_82B4", 0x82B4}, // SP 0x1402B3490 MP 0x14037F090 + {"_meth_82B5", 0x82B5}, // SP 0x1402B3410 MP 0x14037F010 + {"_meth_82B6", 0x82B6}, // SP 0x1402B3430 MP 0x14037F030 + {"_meth_82B7", 0x82B7}, // SP 0x1402B3450 MP 0x14037F050 + {"_meth_82B8", 0x82B8}, // SP 0x1402B34B0 MP 0x14037F0B0 + {"_meth_82B9", 0x82B9}, // SP 0x1402B3700 MP 0x14037F3C0 + {"solid", 0x82BA}, // SP 0x1402B45E0 MP 0x1403808A0 + {"notsolid", 0x82BB}, // SP 0x1402B4690 MP 0x140380950 + {"setcandamage", 0x82BC}, // SP 0x1402B3880 MP 0x14037F590 + {"setcanradiusdamage", 0x82BD}, // SP 0x1402B38E0 MP 0x14037F5F0 + {"physicslaunchclient", 0x82BE}, // SP 0x1402B3960 MP 0x14037F670 + {"_meth_82BF", 0x82BF}, // SP 0x000000000 MP 0x1403351A0 + {"_meth_82C0", 0x82C0}, // SP 0x000000000 MP 0x1403351B0 + {"setcarddisplayslot", 0x82C1}, // SP 0x000000000 MP 0x1403351C0 + {"regweaponforfxremoval", 0x82C2}, // SP 0x000000000 MP 0x1403352B0 + {"laststandrevive", 0x82C3}, // SP 0x000000000 MP 0x140331E00 + {"_meth_82C4", 0x82C4}, // SP 0x000000000 MP 0x140331E70 + {"setspectatedefaults", 0x82C5}, // SP 0x000000000 MP 0x140331EE0 + {"getthirdpersoncrosshairoffset", 0x82C6}, // SP 0x000000000 MP 0x140332250 + {"_meth_82C7", 0x82C7}, // SP 0x140262950 MP 0x14032EF00 + {"_meth_82C8", 0x82C8}, // SP 0x140262A60 MP 0x14032EFF0 + {"_meth_82C9", 0x82C9}, // SP 0x140262AB0 MP 0x14032F0D0 + {"_meth_82CA", 0x82CA}, // SP 0x000000000 MP 0x1403322C0 + {"getweaponslistexclusives", 0x82CB}, // SP 0x1402623D0 MP 0x14032E3A0 + {"_meth_82CC", 0x82CC}, // SP 0x1402624C0 MP 0x14032E4B0 + {"_meth_82CD", 0x82CD}, // SP 0x1402625B0 MP 0x14032E650 + {"getweaponslist", 0x82CE}, // SP 0x140262720 MP 0x14032E790 + {"canplayerplacesentry", 0x82CF}, // SP 0x140264D00 MP 0x140331530 + {"canplayerplacetank", 0x82D0}, // SP 0x1402651B0 MP 0x1403292E0 + {"visionsetnakedforplayer", 0x82D1}, // SP 0x140263410 MP 0x14032FC00 + {"visionsetnightforplayer", 0x82D2}, // SP 0x1402636D0 MP 0x14032FC10 + {"visionsetmissilecamforplayer", 0x82D3}, // SP 0x1402636F0 MP 0x14032FC30 + {"visionsetthermalforplayer", 0x82D4}, // SP 0x140263710 MP 0x14032FD20 + {"visionsetpainforplayer", 0x82D5}, // SP 0x140263730 MP 0x14032FD40 + {"setblurforplayer", 0x82D6}, // SP 0x140264890 MP 0x140330B80 + {"_meth_82D7", 0x82D7}, // SP 0x140264C80 MP 0x140331310 + {"_meth_82D8", 0x82D8}, // SP 0x140264C80 MP 0x140331330 + {"_meth_82D9", 0x82D9}, // SP 0x1402ABE90 MP 0x000000000 + {"getbuildnumber", 0x82DA}, // SP 0x1402663A0 MP 0x14032A910 + {"_meth_82DB", 0x82DB}, // SP 0x140266AF0 MP 0x14032AE90 + {"_meth_82DC", 0x82DC}, // SP 0x140266CD0 MP 0x14032B120 + {"_meth_82DD", 0x82DD}, // SP 0x140266FE0 MP 0x14032B500 + {"playfx", 0x82DE}, // SP 0x140267330 MP 0x14032B9F0 + {"playerrecoilscaleon", 0x82DF}, // SP 0x140267530 MP 0x14032BD00 + {"_meth_82E0", 0x82E0}, // SP 0x140267600 MP 0x14032BDD0 + {"weaponlockstart", 0x82E1}, // SP 0x1402676E0 MP 0x14032C000 + {"weaponlockfinalize", 0x82E2}, // SP 0x140260240 MP 0x14032C240 + {"disableautoreload", 0x82E3}, // SP 0x140260540 MP 0x14032C6C0 + {"setentertime", 0x82E4}, // SP 0x1402605E0 MP 0x14032C7F0 + {"usinggamepad", 0x82E5}, // SP 0x000000000 MP 0x140332300 + {"_meth_82E6", 0x82E6}, // SP 0x000000000 MP 0x140332380 + {"_meth_82E7", 0x82E7}, // SP 0x000000000 MP 0x140332390 + {"_meth_82E8", 0x82E8}, // SP 0x000000000 MP 0x1403323B0 + {"_meth_82E9", 0x82E9}, // SP 0x000000000 MP 0x1403323A0 + {"_meth_82EA", 0x82EA}, // SP 0x1402628A0 MP 0x14032E5C0 + {"_meth_82EB", 0x82EB}, // SP 0x1402619B0 MP 0x14032D5A0 + {"_meth_82EC", 0x82EC}, // SP 0x140261AA0 MP 0x14032D6D0 + {"issighted", 0x82ED}, // SP 0x140263D40 MP 0x14032FA10 + {"setvelocity", 0x82EE}, // SP 0x1402601C0 MP 0x14032BBE0 + {"_meth_82EF", 0x82EF}, // SP 0x140260AD0 MP 0x14032C3C0 + {"_meth_82F0", 0x82F0}, // SP 0x140260E80 MP 0x14032C5E0 + {"_meth_82F1", 0x82F1}, // SP 0x1402677A0 MP 0x14032BE30 + {"_meth_82F2", 0x82F2}, // SP 0x140260130 MP 0x14032BF20 + {"_meth_82F3", 0x82F3}, // SP 0x140264AD0 MP 0x140330E20 + {"setweaponammostock", 0x82F4}, // SP 0x140264EB0 MP 0x140331350 + {"_meth_82F5", 0x82F5}, // SP 0x140265380 MP 0x1403293A0 + {"getweaponammostock", 0x82F6}, // SP 0x1402655D0 MP 0x140329580 + {"_meth_82F7", 0x82F7}, // SP 0x140265820 MP 0x140329990 + {"stoplocalsound", 0x82F8}, // SP 0x140265F20 MP 0x14032A3B0 + {"setclientdvar", 0x82F9}, // SP 0x140266410 MP 0x14032A990 + {"_meth_82FA", 0x82FA}, // SP 0x1402666C0 MP 0x14032B260 + {"_meth_82FB", 0x82FB}, // SP 0x000000000 MP 0x14032AC30 + {"_meth_82FC", 0x82FC}, // SP 0x000000000 MP 0x14032AD80 + {"allowads", 0x82FD}, // SP 0x140261130 MP 0x14032C940 + {"_meth_82FE", 0x82FE}, // SP 0x140261440 MP 0x14032CAB0 + {"_meth_82FF", 0x82FF}, // SP 0x140261B20 MP 0x14032D890 + {"_meth_8300", 0x8300}, // SP 0x140261C00 MP 0x14032DA40 + {"weaponlocktargettooclose", 0x8301}, // SP 0x140261CE0 MP 0x14032DBB0 + {"setspreadoverride", 0x8302}, // SP 0x140262B00 MP 0x14032ED00 + {"resetspreadoverride", 0x8303}, // SP 0x140262CC0 MP 0x14032EE80 + {"_meth_8304", 0x8304}, // SP 0x140262D90 MP 0x14032EF60 + {"setactionslot", 0x8305}, // SP 0x140261F10 MP 0x14032DD50 + {"setviewkickscale", 0x8306}, // SP 0x1402608B0 MP 0x14032CB90 + {"getviewkickscale", 0x8307}, // SP 0x140260A80 MP 0x14032CCC0 + {"getweaponslistoffhands", 0x8308}, // SP 0x1402621A0 MP 0x14032E120 + {"getweaponslistitems", 0x8309}, // SP 0x1402622E0 MP 0x14032E230 + {"_meth_830A", 0x830A}, // SP 0x140261090 MP 0x14032C720 + {"_meth_830B", 0x830B}, // SP 0x140262F00 MP 0x14032EA90 + {"_meth_830C", 0x830C}, // SP 0x140263380 MP 0x14032F210 + {"takeallweapons", 0x830D}, // SP 0x1402635B0 MP 0x14032F310 + {"getcurrentweapon", 0x830E}, // SP 0x140263750 MP 0x14032F5E0 + {"getcurrentprimaryweapon", 0x830F}, // SP 0x140263A30 MP 0x14032F860 + {"getcurrentoffhand", 0x8310}, // SP 0x140263EF0 MP 0x14032FC50 + {"givestartammo", 0x8311}, // SP 0x1402647A0 MP 0x140330740 + {"switchtoweapon", 0x8312}, // SP 0x140264CA0 MP 0x140330D20 + {"switchtoweaponimmediate", 0x8313}, // SP 0x140264E50 MP 0x140330D90 + {"_meth_8314", 0x8314}, // SP 0x140265950 MP 0x140329520 + {"switchtooffhand", 0x8315}, // SP 0x140265B80 MP 0x1403296D0 + {"_meth_8316", 0x8316}, // SP 0x140264440 MP 0x140330340 + {"getcustomizationbody", 0x8317}, // SP 0x140264600 MP 0x140330520 + {"beginlocationselection", 0x8318}, // SP 0x140260C90 MP 0x14032C470 + {"_meth_8319", 0x8319}, // SP 0x140261020 MP 0x14032C780 + {"_meth_831A", 0x831A}, // SP 0x140263E90 MP 0x1403302E0 + {"_meth_831B", 0x831B}, // SP 0x140264020 MP 0x140330410 + {"_meth_831C", 0x831C}, // SP 0x140264150 MP 0x1403305B0 + {"_meth_831D", 0x831D}, // SP 0x140264270 MP 0x1403306E0 + {"_meth_831E", 0x831E}, // SP 0x140264660 MP 0x140330B20 + {"_meth_831F", 0x831F}, // SP 0x140264750 MP 0x140330CC0 + {"setaimspreadmovementscale", 0x8320}, // SP 0x1402631F0 MP 0x14032F130 + {"closemenu", 0x8321}, // SP 0x140263290 MP 0x14032F3A0 + {"_meth_8322", 0x8322}, // SP 0x140263330 MP 0x14032F4E0 + {"openpopupmenu", 0x8323}, // SP 0x140263430 MP 0x14032F6C0 + {"openpopupmenunomouse", 0x8324}, // SP 0x140263630 MP 0x14032F930 + {"freezecontrols", 0x8326}, // SP 0x140263B10 MP 0x14032FD60 + {"disableusability", 0x8327}, // SP 0x140263C10 MP 0x14032FFE0 + {"enableusability", 0x8328}, // SP 0x140263E40 MP 0x1403300F0 + {"_meth_8329", 0x8329}, // SP 0x140266C00 MP 0x14032B640 + {"_meth_832A", 0x832A}, // SP 0x140266D10 MP 0x14032B800 + {"_meth_832B", 0x832B}, // SP 0x140266EA0 MP 0x14032B9C0 + {"_meth_832C", 0x832C}, // SP 0x140267180 MP 0x14032B9E0 + {"deactivatechannelvolumes", 0x832D}, // SP 0x140267410 MP 0x14032BB00 + {"_meth_832E", 0x832E}, // SP 0x140265FA0 MP 0x140329C00 + {"_meth_832F", 0x832F}, // SP 0x140266200 MP 0x140329F00 + {"_meth_8330", 0x8330}, // SP 0x140266560 MP 0x14032A240 + {"_meth_8331", 0x8331}, // SP 0x140266820 MP 0x14032A6F0 + {"isdualwielding", 0x8332}, // SP 0x140266E10 MP 0x14032ABC0 + {"_meth_8333", 0x8333}, // SP 0x140267030 MP 0x14032AD00 + {"isreloading", 0x8334}, // SP 0x140267100 MP 0x14032AEE0 + {"setorigin", 0x8335}, // SP 0x1402677C0 MP 0x14032B8D0 + {"getvelocity", 0x8336}, // SP 0x1402604D0 MP 0x14032BC80 + {"_meth_8337", 0x8337}, // SP 0x140260930 MP 0x14032BE70 + {"forcemantle", 0x8338}, // SP 0x140260990 MP 0x14032C0D0 + {"attackbuttonpressed", 0x8339}, // SP 0x140261500 MP 0x14032CE10 + {"_meth_833A", 0x833A}, // SP 0x1402615F0 MP 0x14032D0B0 + {"meleebuttonpressed", 0x833B}, // SP 0x1402617D0 MP 0x14032D1B0 + {"jumpbuttonpressed", 0x833C}, // SP 0x1402618D0 MP 0x14032D450 + {"getviewheight", 0x833D}, // SP 0x140262070 MP 0x14032DC20 + {"_meth_833E", 0x833E}, // SP 0x1402620C0 MP 0x14032DCE0 + {"isonladder", 0x833F}, // SP 0x140262280 MP 0x14032DF80 + {"setviewmodel", 0x8340}, // SP 0x1402626A0 MP 0x14032DFF0 + {"_meth_8341", 0x8341}, // SP 0x140264090 MP 0x14032FF10 + {"_meth_8342", 0x8342}, // SP 0x1402642C0 MP 0x140330170 + {"_meth_8343", 0x8343}, // SP 0x140260360 MP 0x000000000 + {"_meth_8344", 0x8344}, // SP 0x140260640 MP 0x000000000 + {"_meth_8345", 0x8345}, // SP 0x1402607E0 MP 0x000000000 + {"_meth_8346", 0x8346}, // SP 0x1402609E0 MP 0x000000000 + {"_meth_8347", 0x8347}, // SP 0x14026D000 MP 0x14033B150 + {"forcethirdpersonwhenfollowing", 0x8348}, // SP 0x000000000 MP 0x140374D30 + {"disableforcethirdpersonwhenfollowing", 0x8349}, // SP 0x000000000 MP 0x140374DD0 + {"_meth_834A", 0x834A}, // SP 0x140260C10 MP 0x14032C5D0 + {"_meth_834B", 0x834B}, // SP 0x000000000 MP 0x14037B380 + {"secondaryoffhandbuttonpressed", 0x834C}, // SP 0x140261D40 MP 0x14032D9C0 + {"_meth_834D", 0x834D}, // SP 0x000000000 MP 0x140374B70 + {"_meth_834E", 0x834E}, // SP 0x000000000 MP 0x140374C10 + {"botsetflag", 0x834F}, // SP 0x000000000 MP 0x1404798E0 + {"botsetstance", 0x8350}, // SP 0x000000000 MP 0x14047A0F0 + {"botsetscriptmove", 0x8351}, // SP 0x000000000 MP 0x140479F70 + {"_meth_8352", 0x8352}, // SP 0x000000000 MP 0x140479BC0 + {"_meth_8353", 0x8353}, // SP 0x000000000 MP 0x140479DB0 + {"botclearscriptgoal", 0x8354}, // SP 0x000000000 MP 0x140477C80 + {"getnearestnode", 0x8355}, // SP 0x000000000 MP 0x140479B00 + {"botclearscriptenemy", 0x8356}, // SP 0x000000000 MP 0x140477C00 + {"botsetattacker", 0x8357}, // SP 0x000000000 MP 0x1404796A0 + {"botgetscriptgoal", 0x8358}, // SP 0x000000000 MP 0x1404784A0 + {"botgetscriptgoalradius", 0x8359}, // SP 0x000000000 MP 0x1404785F0 + {"botgetscriptgoalyaw", 0x835A}, // SP 0x000000000 MP 0x1404786F0 + {"botgetscriptgoaltype", 0x835B}, // SP 0x000000000 MP 0x140478670 + {"_meth_835D", 0x835D}, // SP 0x000000000 MP 0x140478850 + {"_meth_835E", 0x835E}, // SP 0x000000000 MP 0x140478E10 + {"botfindnoderandom", 0x835F}, // SP 0x000000000 MP 0x140477D00 + {"botmemoryevent", 0x8360}, // SP 0x000000000 MP 0x140478B70 + {"_meth_8362", 0x8362}, // SP 0x000000000 MP 0x140478EB0 + {"bothasscriptgoal", 0x8363}, // SP 0x000000000 MP 0x140478890 + {"botgetpersonality", 0x8364}, // SP 0x000000000 MP 0x140478420 + {"_meth_8365", 0x8365}, // SP 0x000000000 MP 0x14047A1C0 + {"botsetpersonality", 0x8367}, // SP 0x000000000 MP 0x140479A70 + {"botsetdifficulty", 0x8368}, // SP 0x000000000 MP 0x1404797B0 + {"botgetdifficulty", 0x8369}, // SP 0x000000000 MP 0x140477E90 + {"botgetworldclosestedge", 0x836A}, // SP 0x000000000 MP 0x140478770 + {"_meth_836B", 0x836B}, // SP 0x000000000 MP 0x140478990 + {"botpredictseepoint", 0x836C}, // SP 0x000000000 MP 0x140479420 + {"botcanseeentity", 0x836D}, // SP 0x000000000 MP 0x140477A90 + {"botgetnodesonpath", 0x836E}, // SP 0x000000000 MP 0x140478230 + {"_meth_836F", 0x836F}, // SP 0x000000000 MP 0x140479020 + {"_meth_8371", 0x8371}, // SP 0x000000000 MP 0x140477FD0 + {"botsetawareness", 0x8372}, // SP 0x000000000 MP 0x140479720 + {"_meth_8373", 0x8373}, // SP 0x000000000 MP 0x140479610 + {"botgetscriptgoalnode", 0x8374}, // SP 0x000000000 MP 0x140478560 + {"botgetimperfectenemyinfo", 0x8375}, // SP 0x000000000 MP 0x1404780D0 + {"botsetpathingstyle", 0x8377}, // SP 0x000000000 MP 0x1404799A0 + {"botsetdifficultysetting", 0x8378}, // SP 0x000000000 MP 0x140479840 + {"botgetdifficultysetting", 0x8379}, // SP 0x000000000 MP 0x140477F20 + {"botgetpathdist", 0x837A}, // SP 0x000000000 MP 0x1404782F0 + {"_meth_837B", 0x837B}, // SP 0x000000000 MP 0x140478910 + {"_meth_837C", 0x837C}, // SP 0x000000000 MP 0x140479510 + {"botclearbutton", 0x837D}, // SP 0x000000000 MP 0x140477B70 + {"_meth_837E", 0x837E}, // SP 0x000000000 MP 0x1404791D0 + {"getnodenumber", 0x837F}, // SP 0x000000000 MP 0x14032E760 + {"setclientowner", 0x8380}, // SP 0x000000000 MP 0x14037AD60 + {"_meth_8381", 0x8381}, // SP 0x000000000 MP 0x14037A3B0 + {"setaisightlinevisible", 0x8382}, // SP 0x1402A15D0 MP 0x140358460 + {"setentityowner", 0x8383}, // SP 0x000000000 MP 0x14037A980 + {"nodeisdisconnected", 0x8384}, // SP 0x000000000 MP 0x14032E920 + {"_meth_8385", 0x8385}, // SP 0x140262C60 MP 0x14032E340 + {"_meth_8386", 0x8386}, // SP 0x000000000 MP 0x14037B1B0 + {"_meth_8388", 0x8388}, // SP 0x000000000 MP 0x14044EF90 + {"_meth_8389", 0x8389}, // SP 0x000000000 MP 0x14044E610 + {"setagentattacker", 0x838A}, // SP 0x000000000 MP 0x14044EE40 + {"_meth_838B", 0x838B}, // SP 0x000000000 MP 0x14044E0E0 + {"agentcanseesentient", 0x838C}, // SP 0x000000000 MP 0x14044DF00 + {"setwaypoint", 0x838D}, // SP 0x000000000 MP 0x140450B20 + {"setgoalpos", 0x838E}, // SP 0x000000000 MP 0x140450120 + {"getgoalpos", 0x838F}, // SP 0x000000000 MP 0x14044F670 + {"setgoalnode", 0x8390}, // SP 0x000000000 MP 0x140450090 + {"setgoalentity", 0x8391}, // SP 0x000000000 MP 0x140450000 + {"setgoalradius", 0x8392}, // SP 0x000000000 MP 0x140450260 + {"_meth_8393", 0x8393}, // SP 0x000000000 MP 0x14044FEC0 + {"setorientmode", 0x8394}, // SP 0x000000000 MP 0x140450540 + {"setanimmode", 0x8395}, // SP 0x000000000 MP 0x14044FDA0 + {"setphysicsmode", 0x8396}, // SP 0x000000000 MP 0x140450780 + {"setclipmode", 0x8397}, // SP 0x000000000 MP 0x14044FF60 + {"setmaxturnspeed", 0x8398}, // SP 0x000000000 MP 0x140450370 + {"getmaxturnspeed", 0x8399}, // SP 0x000000000 MP 0x14044F7A0 + {"beginmelee", 0x839A}, // SP 0x000000000 MP 0x14044F2A0 + {"getmlgspectatorteam", 0x839B}, // SP 0x000000000 MP 0x140450840 + {"dotrajectory", 0x839C}, // SP 0x000000000 MP 0x14044F5D0 + {"doanimlerp", 0x839D}, // SP 0x000000000 MP 0x14044F480 + {"setviewheight", 0x839E}, // SP 0x000000000 MP 0x140450AA0 + {"claimnode", 0x839F}, // SP 0x000000000 MP 0x14044F370 + {"relinquishclaimednode", 0x83A0}, // SP 0x000000000 MP 0x14044FC90 + {"_meth_83A1", 0x83A1}, // SP 0x14026DD90 MP 0x14033BCE0 + {"_meth_83A2", 0x83A2}, // SP 0x14026DE40 MP 0x14033BD90 + {"_meth_83A3", 0x83A3}, // SP 0x14026DEB0 MP 0x14033BDF0 + {"_meth_83A4", 0x83A4}, // SP 0x14026DF20 MP 0x14033BE50 + {"_meth_83A5", 0x83A5}, // SP 0x1402A84A0 MP 0x000000000 + {"_meth_83A6", 0x83A6}, // SP 0x140260B80 MP 0x14032CDC0 + {"_meth_83A7", 0x83A7}, // SP 0x140260DE0 MP 0x14032CEA0 + {"_meth_83A8", 0x83A8}, // SP 0x140268480 MP 0x000000000 + {"_meth_83A9", 0x83A9}, // SP 0x1402A8750 MP 0x000000000 + {"_meth_83AA", 0x83AA}, // SP 0x1402A8860 MP 0x000000000 + {"_meth_83AB", 0x83AB}, // SP 0x140268330 MP 0x000000000 + {"_meth_83AC", 0x83AC}, // SP 0x140268410 MP 0x000000000 + {"_meth_83AD", 0x83AD}, // SP 0x1402683A0 MP 0x000000000 + {"_meth_83B0", 0x83B0}, // SP 0x1405D92F0 MP 0x14032CC20 + {"_meth_83B1", 0x83B1}, // SP 0x1402670A0 MP 0x14032B5D0 + {"_meth_83B2", 0x83B2}, // SP 0x140267250 MP 0x14032B7B0 + {"_meth_83B3", 0x83B3}, // SP 0x1404651B0 MP 0x14055F010 + {"_meth_83B4", 0x83B4}, // SP 0x1404651C0 MP 0x14055F020 + {"_meth_83B5", 0x83B5}, // SP 0x000000000 MP 0x14037BCD0 + {"_meth_83B6", 0x83B6}, // SP 0x14029C100 MP 0x140367570 + {"_meth_83B7", 0x83B7}, // SP 0x140299860 MP 0x140364840 + {"_meth_83B8", 0x83B8}, // SP 0x14028E830 MP 0x140364960 + {"_meth_83B9", 0x83B9}, // SP 0x140261C60 MP 0x14032D930 + {"_meth_83BA", 0x83BA}, // SP 0x140462CB0 MP 0x1405614F0 + {"_meth_83BB", 0x83BB}, // SP 0x140462D60 MP 0x1405615A0 + {"_meth_83BC", 0x83BC}, // SP 0x140462DE0 MP 0x140561620 + {"_meth_83BD", 0x83BD}, // SP 0x14028AB00 MP 0x000000000 + {"_meth_83BE", 0x83BE}, // SP 0x140263B80 MP 0x140330060 + {"_meth_83BF", 0x83BF}, // SP 0x140263C60 MP 0x140330200 + {"_meth_83C0", 0x83C0}, // SP 0x140263F70 MP 0x140330470 + {"_meth_83C1", 0x83C1}, // SP 0x1402B3B00 MP 0x14037F840 + {"_meth_83C2", 0x83C2}, // SP 0x1402D7D50 MP 0x1400778A0 + {"_meth_83C3", 0x83C3}, // SP 0x1404623A0 MP 0x140560AC0 + {"_meth_83C4", 0x83C4}, // SP 0x1405D92F0 MP 0x14032D370 + {"_meth_83C5", 0x83C5}, // SP 0x14028AA90 MP 0x000000000 + {"_meth_83C6", 0x83C6}, // SP 0x14024AEF0 MP 0x000000000 + {"_meth_83C7", 0x83C7}, // SP 0x14024B000 MP 0x000000000 + {"_meth_83C8", 0x83C8}, // SP 0x14024B340 MP 0x000000000 + {"_meth_83C9", 0x83C9}, // SP 0x14024B420 MP 0x000000000 + {"_meth_83CA", 0x83CA}, // SP 0x14024B6D0 MP 0x000000000 + {"_meth_83CB", 0x83CB}, // SP 0x14024B660 MP 0x000000000 + {"_meth_83CC", 0x83CC}, // SP 0x14024B740 MP 0x000000000 + {"_meth_83CD", 0x83CD}, // SP 0x14024B7A0 MP 0x000000000 + {"setanimclass", 0x83CE}, // SP 0x000000000 MP 0x1400781E0 + {"enableanimstate", 0x83CF}, // SP 0x000000000 MP 0x140077CB0 + {"_meth_83D0", 0x83D0}, // SP 0x000000000 MP 0x140078250 + {"getanimentry", 0x83D1}, // SP 0x000000000 MP 0x140077DF0 + {"getanimentryname", 0x83D2}, // SP 0x000000000 MP 0x140077FA0 + {"getanimentryalias", 0x83D3}, // SP 0x000000000 MP 0x140077E80 + {"getanimentrycount", 0x83D4}, // SP 0x000000000 MP 0x140077EE0 + {"_meth_83D5", 0x83D5}, // SP 0x1402AE190 MP 0x000000000 + {"issprinting", 0x83D6}, // SP 0x1402613C0 MP 0x14032CB20 + {"_meth_83D7", 0x83D7}, // SP 0x140291320 MP 0x000000000 + {"_meth_83D8", 0x83D8}, // SP 0x1402495B0 MP 0x000000000 + {"_meth_83D9", 0x83D9}, // SP 0x1405D92F0 MP 0x140358020 + {"_meth_83DA", 0x83DA}, // SP 0x140264C80 MP 0x000000000 + {"_meth_83DB", 0x83DB}, // SP 0x140264C80 MP 0x000000000 + {"_meth_83DC", 0x83DC}, // SP 0x140261B80 MP 0x14032D800 + {"rotateto", 0x83DD}, // SP 0x1402B3200 MP 0x14037EF90 + {"getlookaheaddir", 0x83DE}, // SP 0x000000000 MP 0x14044F710 + {"getpathgoalpos", 0x83DF}, // SP 0x000000000 MP 0x14044FAD0 + {"_meth_83E0", 0x83E0}, // SP 0x1402A15D0 MP 0x14036E1F0 + {"setcorpsefalling", 0x83E1}, // SP 0x000000000 MP 0x140374840 + {"setsurfacetype", 0x83E2}, // SP 0x14029FD00 MP 0x140358090 + {"_meth_83E3", 0x83E3}, // SP 0x1402A0C60 MP 0x140369520 + {"_meth_83E4", 0x83E4}, // SP 0x1402A20D0 MP 0x140369FE0 + {"_meth_83E5", 0x83E5}, // SP 0x1405D92F0 MP 0x14033B020 + {"_meth_83E6", 0x83E6}, // SP 0x1402A7B00 MP 0x000000000 + {"_meth_83E7", 0x83E7}, // SP 0x1402A7C90 MP 0x000000000 + {"visionsetstage", 0x83E8}, // SP 0x140263140 MP 0x14032F7A0 + {"hudoutlineenableforclients", 0x83E9}, // SP 0x14026D2E0 MP 0x14033B450 + {"getlinkedparent", 0x83EA}, // SP 0x14028DB50 MP 0x140359B60 + {"getmovingplatformparent", 0x83EB}, // SP 0x14028E2A0 MP 0x14035A4D0 + {"_meth_83EC", 0x83EC}, // SP 0x000000000 MP 0x14032CEF0 + {"_meth_83ED", 0x83ED}, // SP 0x1402ADF90 MP 0x000000000 + {"_meth_83EF", 0x83EF}, // SP 0x1402A0B60 MP 0x14036A5C0 + {"_meth_83F0", 0x83F0}, // SP 0x14029F670 MP 0x140369790 + {"makevehiclenotcollidewithplayers", 0x83F1}, // SP 0x1402913E0 MP 0x14035B490 + {"_meth_83F2", 0x83F2}, // SP 0x140269130 MP 0x000000000 + {"_meth_83F3", 0x83F3}, // SP 0x140269190 MP 0x000000000 + {"setscriptablepartstate", 0x83F4}, // SP 0x1402A0760 MP 0x1403589E0 + {"_meth_83F5", 0x83F5}, // SP 0x1405D92F0 MP 0x140359100 + {"_meth_83F6", 0x83F6}, // SP 0x1402A15D0 MP 0x14036E200 + {"_meth_83F7", 0x83F7}, // SP 0x140465020 MP 0x140560DF0 + {"_meth_83F8", 0x83F8}, // SP 0x1405D92F0 MP 0x1403636B0 + {"_meth_83F9", 0x83F9}, // SP 0x1405D92F0 MP 0x140363830 + {"motionblurhqdisable", 0x83FA}, // SP 0x14029BA30 MP 0x140363EA0 + {"_meth_83FB", 0x83FB}, // SP 0x14029BC20 MP 0x1403640D0 + {"_meth_83FC", 0x83FC}, // SP 0x1402AA870 MP 0x000000000 + {"_meth_83FD", 0x83FD}, // SP 0x14024AD20 MP 0x000000000 + {"worldpointtoscreenpos", 0x83FE}, // SP 0x140297A40 MP 0x140360C90 + {"_meth_83FF", 0x83FF}, // SP 0x1402974B0 MP 0x000000000 + {"_meth_8400", 0x8400}, // SP 0x1402498E0 MP 0x000000000 + {"_meth_8401", 0x8401}, // SP 0x000000000 MP 0x140477D90 + {"_meth_8402", 0x8402}, // SP 0x140263950 MP 0x000000000 + {"_meth_8403", 0x8403}, // SP 0x140268F10 MP 0x000000000 + {"_meth_8404", 0x8404}, // SP 0x1402977A0 MP 0x000000000 + {"_meth_8405", 0x8405}, // SP 0x1402978F0 MP 0x000000000 + {"_meth_8406", 0x8406}, // SP 0x14029A680 MP 0x000000000 + {"emissiveblend", 0x8407}, // SP 0x000000000 MP 0x140375810 + {"_meth_8408", 0x8408}, // SP 0x1402687F0 MP 0x000000000 + {"_meth_8409", 0x8409}, // SP 0x140268840 MP 0x000000000 + {"_meth_840A", 0x840A}, // SP 0x1402AF930 MP 0x000000000 + {"_meth_840B", 0x840B}, // SP 0x1402AE490 MP 0x000000000 + {"_meth_840C", 0x840C}, // SP 0x1402AE5D0 MP 0x000000000 + {"_meth_840D", 0x840D}, // SP 0x1402B4000 MP 0x14037FDE0 + {"_meth_840E", 0x840E}, // SP 0x1402B40B0 MP 0x14037FE90 + {"physicsgetlinspeed", 0x840F}, // SP 0x1402B4160 MP 0x14037FF40 + {"_meth_8410", 0x8410}, // SP 0x1402B41F0 MP 0x140380000 + {"physicsgetangvel", 0x8411}, // SP 0x1402B42B0 MP 0x1403800E0 + {"physicsgetangspeed", 0x8412}, // SP 0x1402B4340 MP 0x1403801A0 + {"disablemissileboosting", 0x8413}, // SP 0x000000000 MP 0x14035A430 + {"enablemissileboosting", 0x8414}, // SP 0x000000000 MP 0x14035A480 + {"canspawntestclient", 0x8415}, // SP 0x000000000 MP 0x140376790 + {"spawntestclient", 0x8416}, // SP 0x000000000 MP 0x1403767B0 + {"setgrenadethrowscale", 0x8417}, // SP 0x000000000 MP 0x14036F610 + {"ismantling", 0x8418}, // SP 0x000000000 MP 0x140357DB0 + {"_meth_8419", 0x8419}, // SP 0x000000000 MP 0x1403767E0 + {"_meth_841A", 0x841A}, // SP 0x1405D92F0 MP 0x1403630D0 + {"_meth_841B", 0x841B}, // SP 0x1405D92F0 MP 0x140363500 + {"_meth_841C", 0x841C}, // SP 0x1405D92F0 MP 0x140363590 + {"_meth_841D", 0x841D}, // SP 0x1405D92F0 MP 0x140363620 + {"turretsetbarrelspinenabled", 0x841E}, // SP 0x140299270 MP 0x140364190 + {"_meth_841F", 0x841F}, // SP 0x000000000 MP 0x1403326E0 + {"autospotoverlayoff", 0x8420}, // SP 0x000000000 MP 0x1403328E0 + {"_meth_8421", 0x8421}, // SP 0x14029FEB0 MP 0x140369B60 + {"_meth_8422", 0x8422}, // SP 0x1402A00C0 MP 0x140369E10 + {"doanimrelative", 0x8423}, // SP 0x000000000 MP 0x14044F520 + {"_meth_8424", 0x8424}, // SP 0x1402B30B0 MP 0x000000000 + {"_meth_8425", 0x8425}, // SP 0x1402B3280 MP 0x000000000 + {"_meth_8426", 0x8426}, // SP 0x1402B3320 MP 0x000000000 + {"getcorpseentity", 0x8427}, // SP 0x000000000 MP 0x1403748F0 + {"_meth_8428", 0x8428}, // SP 0x1402ABE20 MP 0x000000000 + {"_meth_8429", 0x8429}, // SP 0x000000000 MP 0x140379520 + {"_meth_842A", 0x842A}, // SP 0x000000000 MP 0x140379B70 + {"queuedialogforplayer", 0x842B}, // SP 0x000000000 MP 0x1403785F0 + {"setmlgcameradefaults", 0x842C}, // SP 0x000000000 MP 0x1403321B0 + {"_meth_842D", 0x842D}, // SP 0x000000000 MP 0x140334A60 + {"_meth_842E", 0x842E}, // SP 0x140262C10 MP 0x14032F2B0 + {"_meth_842F", 0x842F}, // SP 0x140262D40 MP 0x14032F480 + {"_meth_8430", 0x8430}, // SP 0x1405D92F0 MP 0x000000000 + {"getlinkedchildren", 0x8431}, // SP 0x14028E020 MP 0x14035A3A0 + {"_meth_8432", 0x8432}, // SP 0x000000000 MP 0x140479320 + {"playsoundonmovingent", 0x8433}, // SP 0x000000000 MP 0x140377F80 + {"cancelmantle", 0x8434}, // SP 0x140266DD0 MP 0x14032B210 + {"hasfemalecustomizationmodel", 0x8435}, // SP 0x000000000 MP 0x140332F50 + {"setscriptabledamageowner", 0x8437}, // SP 0x1402A0440 MP 0x1403586F0 + {"_meth_8438", 0x8438}, // SP 0x1402A0B00 MP 0x140358FF0 + {"_meth_8439", 0x8439}, // SP 0x000000000 MP 0x140379890 + {"_meth_843A", 0x843A}, // SP 0x14024B810 MP 0x000000000 + {"_meth_843B", 0x843B}, // SP 0x14024B8B0 MP 0x000000000 + {"_meth_843C", 0x843C}, // SP 0x140265900 MP 0x1403294C0 + {"_meth_843D", 0x843D}, // SP 0x14024BCE0 MP 0x000000000 + {"_meth_843E", 0x843E}, // SP 0x14029EC40 MP 0x140368630 + {"_meth_843F", 0x843F}, // SP 0x1405D92F0 MP 0x14032D4E0 + {"_meth_8440", 0x8440}, // SP 0x1404639C0 MP 0x140562210 + {"_meth_8441", 0x8441}, // SP 0x140462EA0 MP 0x1405616E0 + {"_meth_8442", 0x8442}, // SP 0x1402A36A0 MP 0x140358B60 + {"_meth_8443", 0x8443}, // SP 0x140266090 MP 0x14032A550 + {"_meth_8444", 0x8444}, // SP 0x1402A8A40 MP 0x000000000 + {"_meth_8445", 0x8445}, // SP 0x1402A8A80 MP 0x000000000 + {"_meth_8446", 0x8446}, // SP 0x1402A2F70 MP 0x14036CC00 + {"_meth_8447", 0x8447}, // SP 0x1405D92F0 MP 0x140363840 + {"_meth_8448", 0x8448}, // SP 0x1405D92F0 MP 0x140363A50 + {"_meth_8449", 0x8449}, // SP 0x1402611B0 MP 0x14032C860 + {"_meth_844A", 0x844A}, // SP 0x140295480 MP 0x1403602C0 + {"_meth_844B", 0x844B}, // SP 0x140295650 MP 0x1403604C0 + {"_meth_844C", 0x844C}, // SP 0x140463020 MP 0x140561860 + {"_meth_844D", 0x844D}, // SP 0x140463040 MP 0x140561880 + {"_meth_844E", 0x844E}, // SP 0x140463060 MP 0x1405618A0 + {"_meth_844F", 0x844F}, // SP 0x140463080 MP 0x1405618C0 + {"_meth_8450", 0x8450}, // SP 0x1402AC9E0 MP 0x000000000 + {"_meth_8451", 0x8451}, // SP 0x1402ACB20 MP 0x000000000 + {"_meth_8452", 0x8452}, // SP 0x140462F60 MP 0x1405617A0 + {"_meth_8453", 0x8453}, // SP 0x140261E30 MP 0x14032DC80 + {"_meth_8454", 0x8454}, // SP 0x1402612F0 MP 0x000000000 + {"_meth_8455", 0x8455}, // SP 0x1402AD1E0 MP 0x000000000 + {"getvieworigin", 0x8458}, // SP 0x14029DE70 MP 0x140366600 + {"_meth_8459", 0x8459}, // SP 0x140265E70 MP 0x140329A80 + {"_meth_845A", 0x845A}, // SP 0x000000000 MP 0x140359980 + {"stopridingvehicle", 0x845B}, // SP 0x000000000 MP 0x14035A040 + {"_meth_845C", 0x845C}, // SP 0x140264C80 MP 0x000000000 + {"_meth_845D", 0x845D}, // SP 0x14028E7C0 MP 0x14035A8D0 + {"disablemissilestick", 0x845E}, // SP 0x000000000 MP 0x1403762F0 + {"enablemissilestick", 0x845F}, // SP 0x000000000 MP 0x140376340 + {"setmissileminimapvisible", 0x8460}, // SP 0x000000000 MP 0x140347ED0 + {"isoffhandweaponreadytothrow", 0x8461}, // SP 0x1402675A0 MP 0x14032B560 + {"isleaning", 0x8462}, // SP 0x1402614A0 MP 0x14032CC30 + {"makecollidewithitemclip", 0x8463}, // SP 0x140291970 MP 0x14035B8F0 + {"_meth_8464", 0x8464}, // SP 0x140261DC0 MP 0x000000000 + {"visionsetpostapplyforplayer", 0x8465}, // SP 0x000000000 MP 0x14032FE10 + {"_meth_8466", 0x8466}, // SP 0x1402B47A0 MP 0x140380A60 + {"_meth_8467", 0x8467}, // SP 0x1402B4950 MP 0x140380C30 + {"_meth_8468", 0x8468}, // SP 0x1402A2E30 MP 0x000000000 + {"_meth_8469", 0x8469}, // SP 0x1402A3290 MP 0x000000000 + {"_meth_846A", 0x846A}, // SP 0x1402A3360 MP 0x000000000 + {"_meth_846B", 0x846B}, // SP 0x1402A36C0 MP 0x000000000 + {"_meth_846C", 0x846C}, // SP 0x14028DBB0 MP 0x000000000 + {"_meth_846D", 0x846D}, // SP 0x140260B20 MP 0x000000000 + {"_meth_846E", 0x846E}, // SP 0x1402A8530 MP 0x000000000 + {"_meth_846F", 0x846F}, // SP 0x140463100 MP 0x140561940 + {"_meth_8470", 0x8470}, // SP 0x140463140 MP 0x140561980 + {"_meth_8471", 0x8471}, // SP 0x1404631A0 MP 0x1405619E0 + {"_meth_8472", 0x8472}, // SP 0x1404631F0 MP 0x140561A30 + {"_meth_8473", 0x8473}, // SP 0x140463210 MP 0x140561A50 + {"_meth_8474", 0x8474}, // SP 0x140291B70 MP 0x14035E030 + {"_meth_8475", 0x8475}, // SP 0x140291E30 MP 0x14035E0D0 + {"_meth_8476", 0x8476}, // SP 0x140263970 MP 0x14032FE30 + {"_meth_8477", 0x8477}, // SP 0x1402A85E0 MP 0x000000000 + {"_meth_8478", 0x8478}, // SP 0x1402A86E0 MP 0x000000000 + {"_meth_8479", 0x8479}, // SP 0x1405D92F0 MP 0x14032C130 + {"_meth_847A", 0x847A}, // SP 0x1405D92F0 MP 0x14032C420 + {"_meth_847B", 0x847B}, // SP 0x140462450 MP 0x140560B70 + {"_meth_847C", 0x847C}, // SP 0x1404624D0 MP 0x140560BF0 + {"_meth_847D", 0x847D}, // SP 0x140262900 MP 0x14032E940 + {"_meth_847E", 0x847E}, // SP 0x1402629A0 MP 0x14032E9D0 + {"_meth_847F", 0x847F}, // SP 0x14029CB70 MP 0x140367C30 + {"_meth_8480", 0x8480}, // SP 0x140291DA0 MP 0x000000000 + {"_meth_8481", 0x8481}, // SP 0x1405D92F0 MP 0x14032CD40 + {"_meth_8482", 0x8482}, // SP 0x1405D92F0 MP 0x14032CD30 + {"_meth_8483", 0x8483}, // SP 0x000000000 MP 0x14044E5B0 + {"_meth_8484", 0x8484}, // SP 0x140464FB0 MP 0x140563710 + {"_meth_8485", 0x8485}, // SP 0x1404630B0 MP 0x1405618F0 + {"_meth_8486", 0x8486}, // SP 0x000000000 MP 0x14044DF90 + {"_meth_8487", 0x8487}, // SP 0x000000000 MP 0x140380630 + {"_meth_8488", 0x8488}, // SP 0x1402B3150 MP 0x000000000 + {"_meth_8489", 0x8489}, // SP 0x1405D92F0 MP 0x14032CD20 + {"_meth_848A", 0x848A}, // SP 0x140465030 MP 0x140563790 + {"_meth_848B", 0x848B}, // SP 0x140465020 MP 0x140563720 + {"_meth_848C", 0x848C}, // SP 0x1402641A0 MP 0x140330610 + {"_meth_848D", 0x848D}, // SP 0x140264320 MP 0x140330840 + {"_meth_848E", 0x848E}, // SP 0x140264550 MP 0x140330970 + {"_meth_848F", 0x848F}, // SP 0x1402694A0 MP 0x000000000 + {"_meth_8490", 0x8490}, // SP 0x1405D92F0 MP 0x14035E610 + {"_meth_8491", 0x8491}, // SP 0x000000000 MP 0x14037A4A0 + {"_meth_8492", 0x8492}, // SP 0x000000000 MP 0x14037A510 + {"_meth_8493", 0x8493}, // SP 0x1402ACF90 MP 0x000000000 + {"_meth_8494", 0x8494}, // SP 0x1402AD070 MP 0x000000000 + {"_meth_8495", 0x8495}, // SP 0x140268C60 MP 0x000000000 + {"_meth_8496", 0x8496}, // SP 0x000000000 MP 0x140375380 + {"_meth_8497", 0x8497}, // SP 0x000000000 MP 0x140376030 + {"_meth_8498", 0x8498}, // SP 0x140266500 MP 0x14032AB70 + {"_meth_8499", 0x8499}, // SP 0x140266B20 MP 0x14032AF60 + {"_meth_849A", 0x849A}, // SP 0x1405D92F0 MP 0x14032CCB0 + {"_meth_849B", 0x849B}, // SP 0x000000000 MP 0x140375470 + {"_meth_849C", 0x849C}, // SP 0x000000000 MP 0x140375490 + {"_meth_849D", 0x849D}, // SP 0x000000000 MP 0x140375640 + {"_meth_849E", 0x849E}, // SP 0x000000000 MP 0x140375650 + {"_meth_849F", 0x849F}, // SP 0x000000000 MP 0x140375660 + {"_meth_84A0", 0x84A0}, // SP 0x000000000 MP 0x140375680 + {"_meth_84A1", 0x84A1}, // SP 0x000000000 MP 0x140375670 + {"_meth_84A2", 0x84A2}, // SP 0x000000000 MP 0x1403756C0 + {"_meth_84A3", 0x84A3}, // SP 0x000000000 MP 0x1403757F0 + {"_meth_84A4", 0x84A4}, // SP 0x000000000 MP 0x1403756B0 + {"_meth_84A5", 0x84A5}, // SP 0x14029FDA0 MP 0x140369CB0 + {"_meth_84A6", 0x84A6}, // SP 0x1402A02F0 MP 0x14036A120 + {"_meth_84A7", 0x84A7}, // SP 0x1402A04A0 MP 0x14036A190 + {"_meth_84A8", 0x84A8}, // SP 0x1402A0FE0 MP 0x14036A960 + {"_meth_84A9", 0x84A9}, // SP 0x140465C50 MP 0x14055FBF0 + {"_meth_84AA", 0x84AA}, // SP 0x1402979E0 MP 0x1403625A0 + {"_meth_84AB", 0x84AB}, // SP 0x140297E40 MP 0x140362BD0 + {"_meth_84AC", 0x84AC}, // SP 0x140261E70 MP 0x14032DAE0 + {"_meth_84AD", 0x84AD}, // SP 0x1404663D0 MP 0x1405602E0 + {"_meth_84AE", 0x84AE}, // SP 0x1404664D0 MP 0x1405603E0 + {"_meth_84AF", 0x84AF}, // SP 0x000000000 MP 0x140333050 + {"_meth_84B0", 0x84B0}, // SP 0x1405D92F0 MP 0x140369850 + {"_meth_84B1", 0x84B1}, // SP 0x1402922D0 MP 0x14035E650 + {"_meth_84B2", 0x84B2}, // SP 0x1402925B0 MP 0x14035E660 + {"_meth_84B3", 0x84B3}, // SP 0x140292CD0 MP 0x14035E700 + {"_meth_84B4", 0x84B4}, // SP 0x140292FC0 MP 0x14035E720 + {"_meth_84B5", 0x84B5}, // SP 0x1405D92F0 MP 0x140364AA0 + {"_meth_84B6", 0x84B6}, // SP 0x1405D92F0 MP 0x14036BC80 + {"_meth_84B7", 0x84B7}, // SP 0x1404655C0 MP 0x14055F460 + {"_meth_84B8", 0x84B8}, // SP 0x1402A09C0 MP 0x14036A6A0 + {"_meth_84B9", 0x84B9}, // SP 0x000000000 MP 0x1403807B0 + {"_meth_84BB", 0x84BB}, // SP 0x1402643F0 MP 0x140330910 + {"_meth_84BC", 0x84BC}, // SP 0x140264500 MP 0x140330A20 + {"_meth_84BD", 0x84BD}, // SP 0x000000000 MP 0x1403330D0 + {"_meth_84BE", 0x84BE}, // SP 0x000000000 MP 0x1403335E0 + {"_meth_84BF", 0x84BF}, // SP 0x140265260 MP 0x1403311D0 + {"_meth_84C0", 0x84C0}, // SP 0x140265710 MP 0x1403291C0 + {"_meth_84C1", 0x84C1}, // SP 0x000000000 MP 0x1403766D0 + {"_meth_84C2", 0x84C2}, // SP 0x14029E430 MP 0x14036AA10 + {"_meth_84C3", 0x84C3}, // SP 0x140463250 MP 0x140561A90 + {"_meth_84C4", 0x84C4}, // SP 0x000000000 MP 0x140450E40 + {"_meth_84C5", 0x84C5}, // SP 0x000000000 MP 0x140450B10 + {"_meth_84C6", 0x84C6}, // SP 0x140260790 MP 0x14032BD80 + {"_meth_84C7", 0x84C7}, // SP 0x140260590 MP 0x000000000 + {"_meth_84C8", 0x84C8}, // SP 0x1402606E0 MP 0x000000000 + {"_meth_84C9", 0x84C9}, // SP 0x140464D30 MP 0x1405634E0 + {"_meth_84CA", 0x84CA}, // SP 0x140464DC0 MP 0x140563580 + {"_meth_84CB", 0x84CB}, // SP 0x000000000 MP 0x140334CC0 + {"_meth_84CC", 0x84CC}, // SP 0x140463270 MP 0x140561AB0 + {"_meth_84CD", 0x84CD}, // SP 0x1402A1470 MP 0x14036A8C0 + {"_meth_84CE", 0x84CE}, // SP 0x1402A15E0 MP 0x14036AD30 + {"_meth_84CF", 0x84CF}, // SP 0x14029ED60 MP 0x1403685E0 + {"_meth_84D0", 0x84D0}, // SP 0x14029EED0 MP 0x1403687A0 + {"_meth_84D1", 0x84D1}, // SP 0x14029F130 MP 0x1403687F0 + {"_meth_84D2", 0x84D2}, // SP 0x14029F300 MP 0x140368AC0 + {"_meth_84D3", 0x84D3}, // SP 0x14029F350 MP 0x140368CE0 + {"_meth_84D4", 0x84D4}, // SP 0x14029F410 MP 0x140368D50 + {"_meth_84D5", 0x84D5}, // SP 0x14029F530 MP 0x140368DF0 + {"_meth_84D6", 0x84D6}, // SP 0x14029F5E0 MP 0x140368ED0 + {"_meth_84D8", 0x84D8}, // SP 0x1402674E0 MP 0x14032B4A0 + {"_meth_84D9", 0x84D9}, // SP 0x1402B4400 MP 0x140380280 + {"_meth_84DA", 0x84DA}, // SP 0x000000000 MP 0x14035B2A0 + {"_meth_84DB", 0x84DB}, // SP 0x140248770 MP 0x000000000 + {"_meth_84DC", 0x84DC}, // SP 0x140461FF0 MP 0x000000000 + {"_meth_84DF", 0x84DF}, // SP 0x14028DF20 MP 0x14035B180 + {"_meth_84E0", 0x84E0}, // SP 0x14026E2F0 MP 0x14033C220 + {"_meth_84E1", 0x84E1}, // SP 0x1404632B0 MP 0x140561AF0 + {"_meth_84E2", 0x84E2}, // SP 0x000000000 MP 0x14036F110 + {"_meth_84E3", 0x84E3}, // SP 0x140264A30 MP 0x140331120 + {"_meth_84E4", 0x84E4}, // SP 0x1405D92F0 MP 0x1403604A0 + {"_meth_84E5", 0x84E5}, // SP 0x1402A88B0 MP 0x000000000 + {"_meth_84E6", 0x84E6}, // SP 0x1405D92F0 MP 0x14036C920 + {"_meth_84E8", 0x84E8}, // SP 0x140264970 MP 0x140330E00 + {"_meth_84E9", 0x84E9}, // SP 0x1402649D0 MP 0x140330E10 + {"_meth_84EA", 0x84EA}, // SP 0x14028ABB0 MP 0x000000000 + {"_meth_84EB", 0x84EB}, // SP 0x14029AF70 MP 0x140364720 + {"_meth_84EC", 0x84EC}, // SP 0x1402A11C0 MP 0x140359610 + {"_meth_84ED", 0x84ED}, // SP 0x140293540 MP 0x140360150 + {"_meth_84EE", 0x84EE}, // SP 0x140298540 MP 0x140361720 + {"_meth_84EF", 0x84EF}, // SP 0x14029B960 MP 0x140363B90 + {"_meth_84F0", 0x84F0}, // SP 0x1404643D0 MP 0x140562AB0 + {"_meth_84F1", 0x84F1}, // SP 0x1404644E0 MP 0x140562BE0 + {"_meth_84F2", 0x84F2}, // SP 0x1405D92F0 MP 0x14035B8C0 + {"_meth_84F3", 0x84F3}, // SP 0x1405D92F0 MP 0x14035B990 + {"_meth_84F4", 0x84F4}, // SP 0x14028E1A0 MP 0x14035B280 + {"_meth_84F5", 0x84F5}, // SP 0x14028E1A0 MP 0x14035B360 + {"_meth_84F6", 0x84F6}, // SP 0x1405D92F0 MP 0x14035B390 + {"_meth_84F7", 0x84F7}, // SP 0x14028E830 MP 0x14035B3A0 + {"_meth_84F8", 0x84F8}, // SP 0x14028E830 MP 0x14035B430 + {"_meth_84F9", 0x84F9}, // SP 0x14028E830 MP 0x14035B540 + {"_meth_84FA", 0x84FA}, // SP 0x1405D92F0 MP 0x14035B7A0 + {"_meth_84FB", 0x84FB}, // SP 0x14029EDE0 MP 0x14036EA10 + {"_meth_84FC", 0x84FC}, // SP 0x140290D70 MP 0x14035A740 + {"_meth_84FD", 0x84FD}, // SP 0x000000000 MP 0x140334AC0 + {"_meth_84FE", 0x84FE}, // SP 0x000000000 MP 0x140376800 + {"_meth_84FF", 0x84FF}, // SP 0x000000000 MP 0x1403768C0 + {"_meth_8500", 0x8500}, // SP 0x14028F5A0 MP 0x14035A550 + {"_meth_8501", 0x8501}, // SP 0x14028E4D0 MP 0x140359550 + {"_meth_8502", 0x8502}, // SP 0x000000000 MP 0x1403767F0 + {"_meth_8503", 0x8503}, // SP 0x14028F6E0 MP 0x14035C670 + {"_meth_8504", 0x8504}, // SP 0x000000000 MP 0x14037A470 + {"_meth_8505", 0x8505}, // SP 0x000000000 MP 0x140374F20 + {"_meth_8506", 0x8506}, // SP 0x000000000 MP 0x14037ADD0 + {"_meth_8507", 0x8507}, // SP 0x000000000 MP 0x14037AAF0 + {"_meth_8508", 0x8508}, // SP 0x000000000 MP 0x140332BC0 + {"_meth_8509", 0x8509}, // SP 0x1402AC990 MP 0x000000000 + {"_meth_850A", 0x850A}, // SP 0x1402646B0 MP 0x140330A80 + {"_meth_850B", 0x850B}, // SP 0x14026DCB0 MP 0x14033BC10 + {"_meth_850C", 0x850C}, // SP 0x000000000 MP 0x140376020 + {"_meth_850D", 0x850D}, // SP 0x14029E8F0 MP 0x1403682B0 + {"_meth_850E", 0x850E}, // SP 0x14029ED00 MP 0x140368570 + {"_meth_850F", 0x850F}, // SP 0x14029A7B0 MP 0x140362600 + {"_meth_8510", 0x8510}, // SP 0x140267840 MP 0x14032BE50 + {"_meth_8511", 0x8511}, // SP 0x140290ED0 MP 0x14035A8E0 + {"_meth_8512", 0x8512}, // SP 0x1404632E0 MP 0x140561B20 + {"_meth_8513", 0x8513}, // SP 0x140463300 MP 0x140561B40 + {"_meth_8514", 0x8514}, // SP 0x14028E830 MP 0x14032B9B0 + {"_meth_8515", 0x8515}, // SP 0x14028E830 MP 0x14032B9D0 + {"_meth_8516", 0x8516}, // SP 0x140299C10 MP 0x140361690 + {"_meth_8517", 0x8517}, // SP 0x000000000 MP 0x1403747A0 + {"_meth_8518", 0x8518}, // SP 0x14026D400 MP 0x14033B580 + {"_meth_8519", 0x8519}, // SP 0x000000000 MP 0x140376990 + {"_meth_851A", 0x851A}, // SP 0x140261370 MP 0x14032C9D0 + {"_meth_851B", 0x851B}, // SP 0x14029F3C0 MP 0x14036EEC0 + {"_meth_851C", 0x851C}, // SP 0x14028E830 MP 0x14036E3D0 + {"_meth_851D", 0x851D}, // SP 0x1402B4480 MP 0x140380300 + {"_meth_851E", 0x851E}, // SP 0x14028A8B0 MP 0x000000000 + {"_meth_851F", 0x851F}, // SP 0x000000000 MP 0x140333EE0 + {"_meth_8520", 0x8520}, // SP 0x000000000 MP 0x14044EEC0 + {"_meth_8521", 0x8521}, // SP 0x140263930 MP 0x000000000 + {"_meth_8522", 0x8522}, // SP 0x000000000 MP 0x140332340 + {"_meth_8523", 0x8523}, // SP 0x1405D92F0 MP 0x140358DC0 + {"_meth_8524", 0x8524}, // SP 0x14028DDD0 MP 0x140359FE0 + {"_meth_8525", 0x8525}, // SP 0x000000000 MP 0x140374C50 + {"_meth_8526", 0x8526}, // SP 0x000000000 MP 0x140374CF0 + {"_meth_8527", 0x8527}, // SP 0x14026DD20 MP 0x14033BC70 + {"_meth_8528", 0x8528}, // SP 0x000000000 MP 0x140332E80 + {"_meth_8529", 0x8529}, // SP 0x14028F7C0 MP 0x14035C9C0 + {"_meth_852A", 0x852A}, // SP 0x140297EF0 MP 0x14035F080 + {"_meth_852B", 0x852B}, // SP 0x000000000 MP 0x140332AD0 + {"_meth_852C", 0x852C}, // SP 0x000000000 MP 0x140331F50 + {"_meth_852D", 0x852D}, // SP 0x14028E830 MP 0x14035B7E0 + {"_meth_852E", 0x852E}, // SP 0x000000000 MP 0x140376A60 + {"_meth_852F", 0x852F}, // SP 0x000000000 MP 0x1404508B0 + {"_meth_8530", 0x8530}, // SP 0x000000000 MP 0x14044F1E0 + {"_meth_8531", 0x8531}, // SP 0x000000000 MP 0x1404503F0 + {"_meth_8532", 0x8532}, // SP 0x000000000 MP 0x140333250 + {"_meth_8533", 0x8533}, // SP 0x000000000 MP 0x14044EC20 + {"_meth_8534", 0x8534}, // SP 0x000000000 MP 0x140450670 + {"_meth_8535", 0x8535}, // SP 0x000000000 MP 0x14044FD10 + {"_meth_8536", 0x8536}, // SP 0x000000000 MP 0x1404504B0 + {"_meth_8537", 0x8537}, // SP 0x000000000 MP 0x1404502E0 + {"_meth_8538", 0x8538}, // SP 0x000000000 MP 0x1404506F0 + {"_meth_8539", 0x8539}, // SP 0x000000000 MP 0x140333F40 + {"_meth_853A", 0x853A}, // SP 0x000000000 MP 0x14037F320 + {"_meth_853B", 0x853B}, // SP 0x000000000 MP 0x14044E080 + {"_meth_853C", 0x853C}, // SP 0x14028F0D0 MP 0x14035BF40 + {"_meth_853D", 0x853D}, // SP 0x14028E830 MP 0x14032CCA0 + {"_meth_853E", 0x853E}, // SP 0x000000000 MP 0x140376AC0 + {"_meth_853F", 0x853F}, // SP 0x000000000 MP 0x14044DFF0 + {"_meth_8540", 0x8540}, // SP 0x140299D70 MP 0x140363160 + {"_meth_8541", 0x8541}, // SP 0x14028F260 MP 0x14035C380 + {"_meth_8542", 0x8542}, // SP 0x000000000 MP 0x140376C00 + {"_meth_8543", 0x8543}, // SP 0x000000000 MP 0x140375800 + {"_meth_8544", 0x8544}, // SP 0x000000000 MP 0x14044FA10 + {"_meth_8545", 0x8545}, // SP 0x000000000 MP 0x140333640 + {"_meth_8547", 0x8547}, // SP 0x000000000 MP 0x140450C20 + {"_meth_8548", 0x8548}, // SP 0x140262130 MP 0x14032DF00 + {"_meth_8549", 0x8549}, // SP 0x000000000 MP 0x140333FA0 + {"_meth_854A", 0x854A}, // SP 0x000000000 MP 0x140376C90 + {"_meth_854B", 0x854B}, // SP 0x000000000 MP 0x14044FBA0 + {"_meth_854C", 0x854C}, // SP 0x000000000 MP 0x1403331F0 + {"_meth_854D", 0x854D}, // SP 0x140290CE0 MP 0x14035C300 + {"_meth_854E", 0x854E}, // SP 0x000000000 MP 0x140450A10 + {"_meth_854F", 0x854F}, // SP 0x000000000 MP 0x14044FC10 + {"_meth_8550", 0x8550}, // SP 0x1402B4720 MP 0x1403809E0 + {"_meth_8551", 0x8551}, // SP 0x1402A15D0 MP 0x14035FB60 + {"_meth_8552", 0x8552}, // SP 0x000000000 MP 0x140450C30 + {"_meth_8553", 0x8553}, // SP 0x000000000 MP 0x140375E30 + {"_meth_8554", 0x8554}, // SP 0x000000000 MP 0x14044F3F0 + {"_meth_8555", 0x8555}, // SP 0x000000000 MP 0x140450D30 + {"_meth_8556", 0x8556}, // SP 0x000000000 MP 0x140374980 + {"_meth_8557", 0x8557}, // SP 0x000000000 MP 0x1403749D0 + {"_meth_8558", 0x8558}, // SP 0x000000000 MP 0x140078140 + {"_meth_8559", 0x8559}, // SP 0x1405D92F0 MP 0x14032D760 + {"_meth_855A", 0x855A}, // SP 0x1405D92F0 MP 0x14032D770 + {"_meth_855B", 0x855B}, // SP 0x1405D92F0 MP 0x14032D7F0 + {"_meth_855C", 0x855C}, // SP 0x000000000 MP 0x140376CB0 + {"_meth_855D", 0x855D}, // SP 0x1402A0220 MP 0x1403585F0 + {"_meth_855E", 0x855E}, // SP 0x140293780 MP 0x14035E8C0 + {"_meth_855F", 0x855F}, // SP 0x000000000 MP 0x140374EC0 + {"_meth_8560", 0x8560}, // SP 0x000000000 MP 0x140374F70 + {"_meth_8561", 0x8561}, // SP 0x140292D90 MP 0x14035FB10 + {"_meth_8562", 0x8562}, // SP 0x140293080 MP 0x14035FD80 + {"_meth_8563", 0x8563}, // SP 0x1402B2FB0 MP 0x14037EF00 + {"_meth_8564", 0x8564}, // SP 0x1402CBB60 MP 0x14031F610 + {"_meth_8565", 0x8565}, // SP 0x1402478E0 MP 0x000000000 + {"_meth_8566", 0x8566}, // SP 0x1402A8F10 MP 0x000000000 + {"_meth_8567", 0x8567}, // SP 0x140248F70 MP 0x000000000 + {"_meth_8568", 0x8568}, // SP 0x1402A3820 MP 0x14036E3F0 + {"_meth_8569", 0x8569}, // SP 0x1402982F0 MP 0x140363510 + {"_meth_856A", 0x856A}, // SP 0x1402984C0 MP 0x140363630 + {"_meth_856B", 0x856B}, // SP 0x140296FA0 MP 0x1403619C0 + {"_meth_856C", 0x856C}, // SP 0x140297420 MP 0x140361BA0 + {"_meth_856D", 0x856D}, // SP 0x140297640 MP 0x140361E60 + {"_meth_856E", 0x856E}, // SP 0x14028ABF0 MP 0x000000000 + {"_meth_856F", 0x856F}, // SP 0x14028AC10 MP 0x000000000 + {"_meth_8570", 0x8570}, // SP 0x14028AC60 MP 0x000000000 + {"_meth_8571", 0x8571}, // SP 0x140249010 MP 0x000000000 + {"_meth_8572", 0x8572}, // SP 0x14024AE00 MP 0x000000000 + {"_meth_8573", 0x8573}, // SP 0x140260B70 MP 0x14032C5C0 + {"_meth_8574", 0x8574}, // SP 0x140265AD0 MP 0x140329B40 + {"_meth_8575", 0x8575}, // SP 0x140265C90 MP 0x140329E40 + {"_meth_8576", 0x8576}, // SP 0x000000000 MP 0x140478050 + {"_meth_8577", 0x8577}, // SP 0x000000000 MP 0x140333650 + {"_meth_8578", 0x8578}, // SP 0x140297D90 MP 0x14035FFF0 + {"_meth_8579", 0x8579}, // SP 0x1402933D0 MP 0x14035FF90 + {"_meth_857A", 0x857A}, // SP 0x000000000 MP 0x1403336F0 + {"_meth_857B", 0x857B}, // SP 0x000000000 MP 0x14032B050 + {"_meth_857C", 0x857C}, // SP 0x1405D92F0 MP 0x14036D0E0 + {"_meth_857D", 0x857D}, // SP 0x000000000 MP 0x140334820 + {"_meth_857E", 0x857E}, // SP 0x000000000 MP 0x1403348E0 + {"_meth_857F", 0x857F}, // SP 0x000000000 MP 0x1403329F0 + }; + + std::unordered_map token_map = + { + {"pl#", 0x001}, + {"-", 0x002}, + {"radius`", 0x003}, + {"note:", 0x004}, + {"_", 0x005}, + {"_custom", 0x006}, + {"a", 0x007}, + {"ability", 0x008}, + {"accumulate", 0x009}, + {"accuracy", 0x00A}, + {"actionslot1", 0x00B}, + {"actionslot2", 0x00C}, + {"actionslot3", 0x00D}, + {"actionslot4", 0x00E}, + {"actionslot5", 0x00F}, + {"actionslot6", 0x010}, + {"actionslot7", 0x011}, + {"actionslot8", 0x012}, + {"activator", 0x013}, + {"active", 0x014}, + {"activecostume", 0x015}, + {"activeemblemslot", 0x016}, + {"activesquadmember", 0x017}, + {"activevisionset", 0x018}, + {"activevisionsetduration", 0x019}, + {"agent", 0x01A}, + {"agenthealth", 0x01B}, + {"agentname", 0x01C}, + {"agentteam", 0x01D}, + {"ai_event", 0x01E}, + {"ai_sight_line_cycle_group", 0x01F}, + {"ai_sight_line_group", 0x020}, + {"aim_highest_bone", 0x021}, + {"aim_vis_bone", 0x022}, + {"aiSpread", 0x023}, + {"aisquadmembers", 0x024}, + {"alert", 0x025}, + {"alertlevel", 0x026}, + {"alertlevelint", 0x027}, + {"alien", 0x028}, + {"alienplayerloadout", 0x029}, + {"alienplayerstats", 0x02A}, + {"aliensession", 0x02B}, + {"alignx", 0x02C}, + {"aligny", 0x02D}, + {"all", 0x02E}, + {"allies", 0x02F}, + {"allowcrouch", 0x030}, + {"allowdeath", 0x031}, + {"allowjump", 0x032}, + {"allowladders", 0x033}, + {"allowpain", 0x034}, + {"allowprone", 0x035}, + {"allstreaksrestricted", 0x036}, + {"alpha", 0x037}, + {"altmode", 0x038}, + {"always", 0x039}, + {"ambient", 0x03A}, + {"ambienttrack", 0x03B}, + {"ambienttrack_ac130", 0x03C}, + {"ambush", 0x03D}, + {"ambush_nodes_only", 0x03E}, + {"angle_deltas", 0x03F}, + {"anglelerprate", 0x040}, + {"angles", 0x041}, + {"anim_angle_delta", 0x042}, + {"anim_deltas", 0x043}, + {"anim_pose", 0x044}, + {"anim_will_finish", 0x045}, + {"animation", 0x046}, + {"animscript", 0x047}, + {"archived", 0x048}, + {"archivetime", 0x049}, + {"armor", 0x04A}, + {"asleep", 0x04B}, + {"aspectratio", 0x04C}, + {"assaultstreaks", 0x04D}, + {"assignedbucket", 0x04E}, + {"assists", 0x04F}, + {"attachment", 0x050}, + {"attachmentclassrestricted", 0x051}, + {"attachmentrestricted", 0x052}, + {"attachments", 0x053}, + {"attachtag", 0x054}, + {"attacker", 0x055}, + {"attackeraccuracy", 0x056}, + {"attackercount", 0x057}, + {"attackerisjuggernaut", 0x058}, + {"attackerpos", 0x059}, + {"author", 0x05A}, + {"auto_ai", 0x05B}, + {"auto_change", 0x05C}, + {"auto_nonai", 0x05D}, + {"avoidanceboundshalfsize", 0x05E}, + {"awards", 0x05F}, + {"axis", 0x060}, + {"b", 0x061}, + {"back", 0x062}, + {"back_left", 0x063}, + {"back_low", 0x064}, + {"back_mid", 0x065}, + {"back_right", 0x066}, + {"back_up", 0x067}, + {"background", 0x068}, + {"bad_guys", 0x069}, + {"bad_path", 0x06A}, + {"badplaceawareness", 0x06B}, + {"ball_off", 0x06C}, + {"ball_on", 0x06D}, + {"ball_pass", 0x06E}, + {"bandwidthdown", 0x06F}, + {"bandwidthtestcount", 0x070}, + {"bandwidthup", 0x071}, + {"baselineoverflow_max", 0x072}, + {"baselineoverflow_worst", 0x073}, + {"battery_discharge_begin", 0x074}, + {"battery_discharge_end", 0x075}, + {"begin", 0x076}, + {"begin_custom_anim", 0x077}, + {"begin_firing", 0x078}, + {"begin_firing_left", 0x079}, + {"bestweapon", 0x07A}, + {"bestweaponindex", 0x07B}, + {"bipods", 0x07C}, + {"birthtime", 0x07D}, + {"bl_rotor1", 0x07E}, + {"bl_rotor2", 0x07F}, + {"bl_rotor3", 0x080}, + {"blackops2prestige", 0x081}, + {"blackops2rank", 0x082}, + {"blade_hide", 0x083}, + {"blade_show", 0x084}, + {"blockfriendlies", 0x085}, + {"blurradius", 0x086}, + {"body", 0x087}, + {"body_animate_jnt", 0x088}, + {"bottomarc", 0x089}, + {"br_rotor1", 0x08A}, + {"br_rotor2", 0x08B}, + {"br_rotor3", 0x08C}, + {"breadcrumbheader", 0x08D}, + {"buff", 0x08E}, + {"bullet_hitshield", 0x08F}, + {"bullethit", 0x090}, + {"bulletwhizby", 0x091}, + {"c", 0x092}, + {"callingcardindex", 0x093}, + {"camo", 0x094}, + {"cancel_location", 0x095}, + {"canclimbladders", 0x096}, + {"canjumppath", 0x097}, + {"cardicon", 0x098}, + {"cardnameplate", 0x099}, + {"cardtitle", 0x09A}, + {"cgmchecksum", 0x09B}, + {"ch_prestige", 0x09C}, + {"ch_prestige_max", 0x09D}, + {"chainfallback", 0x09E}, + {"chainnode", 0x09F}, + {"challengeprogress", 0x0A0}, + {"challengestate", 0x0A1}, + {"chest", 0x0A2}, + {"churnscores", 0x0A3}, + {"chyron_message1", 0x0A4}, + {"chyron_message2", 0x0A5}, + {"chyron_message3", 0x0A6}, + {"civilian", 0x0A7}, + {"clanidhigh", 0x0A8}, + {"clanidlow", 0x0A9}, + {"classname", 0x0AA}, + {"clipdistance", 0x0AB}, + {"code_classname", 0x0AC}, + {"code_damageradius", 0x0AD}, + {"code_move", 0x0AE}, + {"code_move_slide", 0x0AF}, + {"codecallback_agentadded", 0x0B0}, + {"codecallback_agentdamaged", 0x0B1}, + {"codecallback_agentkilled", 0x0B2}, + {"codecallback_bullethitentity", 0x0B3}, + {"codecallback_codeendgame", 0x0B4}, + {"codecallback_entitydamage", 0x0B5}, + {"codecallback_entityoutofworld", 0x0B6}, + {"codecallback_handleinstantmessage", 0x0B7}, + {"codecallback_hostmigration", 0x0B8}, + {"codecallback_leaderdialog", 0x0B9}, + {"codecallback_partymembers", 0x0BA}, + {"codecallback_playerconnect", 0x0BB}, + {"codecallback_playerdamage", 0x0BC}, + {"codecallback_playerdisconnect", 0x0BD}, + {"codecallback_playergrenadesuicide", 0x0BE}, + {"codecallback_playerkilled", 0x0BF}, + {"codecallback_playerlaststand", 0x0C0}, + {"codecallback_playermigrated", 0x0C1}, + {"codecallback_startgametype", 0x0C2}, + {"codecallback_vehicledamage", 0x0C3}, + {"color", 0x0C4}, + {"color_blind_toggled", 0x0C5}, + {"combat", 0x0C6}, + {"combatmode", 0x0C7}, + {"combatrecord", 0x0C8}, + {"commonoption", 0x0C9}, + {"confirm_location", 0x0CA}, + {"connection_id", 0x0CB}, + {"connectionidchunkhigh", 0x0CC}, + {"connectionidchunklow", 0x0CD}, + {"consolegame", 0x0CE}, + {"consoleidchunkhigh", 0x0CF}, + {"consoleidchunklow", 0x0D0}, + {"constrained", 0x0D1}, + {"contact", 0x0D2}, + {"contextleanenabled", 0x0D3}, + {"convergencetime", 0x0D4}, + {"coopactivesquadmember", 0x0D5}, + {"coopsquadmembers", 0x0D6}, + {"costumes", 0x0D7}, + {"count", 0x0D8}, + {"cover", 0x0D9}, + {"cover_approach", 0x0DA}, + {"coversearchinterval", 0x0DB}, + {"createstruct", 0x0DC}, + {"createtime", 0x0DD}, + {"criticalbulletdamagedist", 0x0DE}, + {"crouch", 0x0DF}, + {"currency", 0x0E0}, + {"current", 0x0E1}, + {"currentanimtime", 0x0E2}, + {"currentgen", 0x0E3}, + {"currentwinstreak", 0x0E4}, + {"cursorhint", 0x0E5}, + {"custom_attach_00", 0x0E6}, + {"custom_attach_01", 0x0E7}, + {"custom_attach_02", 0x0E8}, + {"custom_attach_03", 0x0E9}, + {"custom_attach_04", 0x0EA}, + {"custom_attach_05", 0x0EB}, + {"custom_attach_06", 0x0EC}, + {"custom_attach_07", 0x0ED}, + {"custom_attach_08", 0x0EE}, + {"custom_attach_09", 0x0EF}, + {"custom_attach_10", 0x0F0}, + {"custom_attach_11", 0x0F1}, + {"custom_attach_12", 0x0F2}, + {"custom_attach_13", 0x0F3}, + {"custom_attach_14", 0x0F4}, + {"custom_attach_15", 0x0F5}, + {"customclasses", 0x0F6}, + {"customization_loaded", 0x0F7}, + {"d", 0x0F8}, + {"dailychallengeid", 0x0F9}, + {"damage", 0x0FA}, + {"damage_notdone", 0x0FB}, + {"damagedir", 0x0FC}, + {"damagelocation", 0x0FD}, + {"damagemod", 0x0FE}, + {"damagemultiplier", 0x0FF}, + {"damageshield", 0x100}, + {"damagetaken", 0x101}, + {"damageweapon", 0x102}, + {"damageyaw", 0x103}, + {"dangerreactduration", 0x104}, + {"datalength", 0x105}, + {"dcid", 0x106}, + {"dead", 0x107}, + {"death", 0x108}, + {"deathangles", 0x109}, + {"deathinvulnerabletime", 0x10A}, + {"deathplant", 0x10B}, + {"deathpos", 0x10C}, + {"deaths", 0x10D}, + {"deathshield", 0x10E}, + {"defaultclasses", 0x10F}, + {"defense", 0x110}, + {"defense_level", 0x111}, + {"delayeddeath", 0x112}, + {"deploy_riotshield", 0x113}, + {"desc", 0x114}, + {"descmodified", 0x115}, + {"desiredangle", 0x116}, + {"destructible_type", 0x117}, + {"detectable", 0x118}, + {"detected", 0x119}, + {"detonate", 0x11A}, + {"device_id_high", 0x11B}, + {"device_id_low", 0x11C}, + {"deviceconnectionhistory", 0x11D}, + {"deviceusefrequency", 0x11E}, + {"diequietly", 0x11F}, + {"diffusefraction", 0x120}, + {"direct", 0x121}, + {"disable", 0x122}, + {"disableplayeradsloscheck", 0x123}, + {"dlight", 0x124}, + {"dmg", 0x125}, + {"dodamagetoall", 0x126}, + {"dodangerreact", 0x127}, + {"doffar", 0x128}, + {"dofnear", 0x129}, + {"dofphysicalfocusdistance", 0x12A}, + {"dofphysicalfstop", 0x12B}, + {"dog", 0x12C}, + {"doghandler", 0x12D}, + {"doingambush", 0x12E}, + {"done", 0x12F}, + {"dontavoidplayer", 0x130}, + {"dotofdeath", 0x131}, + {"down", 0x132}, + {"downaimlimit", 0x133}, + {"drawoncompass", 0x134}, + {"dropweapon", 0x135}, + {"duration", 0x136}, + {"eftarc", 0x137}, + {"empty", 0x138}, + {"empty_offhand", 0x139}, + {"enable", 0x13A}, + {"enablehudlighting", 0x13B}, + {"enableshadows", 0x13C}, + {"end_firing", 0x13D}, + {"end_firing_left", 0x13E}, + {"end_script", 0x13F}, + {"enddeaths", 0x140}, + {"endkills", 0x141}, + {"enemy", 0x142}, + {"enemy_sighted", 0x143}, + {"enemy_sighted_lost", 0x144}, + {"enemy_visible", 0x145}, + {"enemyname", 0x146}, + {"enemyplatform", 0x147}, + {"enemyradarmode", 0x148}, + {"enemyxuidhigh", 0x149}, + {"enemyxuidlow", 0x14A}, + {"energy_fire", 0x14B}, + {"engagemaxdist", 0x14C}, + {"engagemaxfalloffdist", 0x14D}, + {"engagemindist", 0x14E}, + {"engageminfalloffdist", 0x14F}, + {"enhanceable", 0x150}, + {"entity", 0x151}, + {"entitydeleted", 0x152}, + {"entityoverflow_max", 0x153}, + {"entityoverflow_worst", 0x154}, + {"equipment", 0x155}, + {"equipmentsetups", 0x156}, + {"escaped", 0x157}, + {"exclusive", 0x158}, + {"exo_ability_activate", 0x159}, + {"exo_adrenaline_fire", 0x15A}, + {"exo_boost", 0x15B}, + {"exo_dodge", 0x15C}, + {"exo_power", 0x15D}, + {"exo_slide", 0x15E}, + {"exo_slide_hit_player", 0x15F}, + {"exoattachment1", 0x160}, + {"exoattachment2", 0x161}, + {"experience", 0x162}, + {"explode", 0x163}, + {"exposedduration", 0x164}, + {"extracustomclassesentitlement", 0x165}, + {"extracustomclassesprestige", 0x166}, + {"extrascore0", 0x167}, + {"extrascore1", 0x168}, + {"face_angle", 0x169}, + {"face_angle_3d", 0x16A}, + {"face_angle_abs", 0x16B}, + {"face_angle_rel", 0x16C}, + {"face_current", 0x16D}, + {"face_default", 0x16E}, + {"face_direction", 0x16F}, + {"face_enemy", 0x170}, + {"face_enemy_or_motion", 0x171}, + {"face_goal", 0x172}, + {"face_motion", 0x173}, + {"face_point", 0x174}, + {"facemotion", 0x175}, + {"failed", 0x176}, + {"falling", 0x177}, + {"fast_radar", 0x178}, + {"favoriteenemy", 0x179}, + {"finalaccuracy", 0x17A}, + {"first_person", 0x17B}, + {"firstplayedsptime", 0x17C}, + {"fixednode", 0x17D}, + {"fixednodesaferadius", 0x17E}, + {"fl_rotor1", 0x17F}, + {"fl_rotor2", 0x180}, + {"fl_rotor3", 0x181}, + {"flash", 0x182}, + {"flashbang", 0x183}, + {"foley", 0x184}, + {"follow", 0x185}, + {"followmax", 0x186}, + {"followmin", 0x187}, + {"font", 0x188}, + {"fontscale", 0x189}, + {"foot_ik_active", 0x18A}, + {"foot_ik_blend_in", 0x18B}, + {"foot_ik_blend_out", 0x18C}, + {"foot_ik_inactive", 0x18D}, + {"footstepdetectdist", 0x18E}, + {"footstepdetectdistsprint", 0x18F}, + {"footstepdetectdistwalk", 0x190}, + {"force_off", 0x191}, + {"force_on", 0x192}, + {"force_fully_on", 0x193}, + {"forcepartyskillignore", 0x194}, + {"forceragdollimmediate", 0x195}, + {"forcespectatorclient", 0x196}, + {"foregrip_off", 0x197}, + {"foreground", 0x198}, + {"forward", 0x199}, + {"fov", 0x19A}, + {"fovcosine", 0x19B}, + {"fovcosinebusy", 0x19C}, + {"fovcosinez", 0x19D}, + {"fr_rotor1", 0x19E}, + {"fr_rotor2", 0x19F}, + {"fr_rotor3", 0x1A0}, + {"fraction", 0x1A1}, + {"frag", 0x1A2}, + {"free", 0x1A3}, + {"freecamera", 0x1A4}, + {"freelook", 0x1A5}, + {"frequency", 0x1A6}, + {"friendlyfire", 0x1A7}, + {"front_left", 0x1A8}, + {"front_right", 0x1A9}, + {"frontshieldanglecos", 0x1AA}, + {"fs_concrete", 0x1AB}, + {"fs_dirt", 0x1AC}, + {"fs_metal", 0x1AD}, + {"fs_wood", 0x1AE}, + {"game_extrainfo", 0x1AF}, + {"gamecount", 0x1B0}, + {"gamertag", 0x1B1}, + {"gamesplayed", 0x1B2}, + {"gametype", 0x1B3}, + {"gender", 0x1B4}, + {"ghostsprestige", 0x1B5}, + {"ghostsrank", 0x1B6}, + {"glass", 0x1B7}, + {"glass_damaged", 0x1B8}, + {"glass_destroyed", 0x1B9}, + {"globalcostume", 0x1BA}, + {"gloves", 0x1BB}, + {"glowalpha", 0x1BC}, + {"glowcolor", 0x1BD}, + {"goal", 0x1BE}, + {"goal_changed", 0x1BF}, + {"goal_reached", 0x1C0}, + {"goal_yaw", 0x1C1}, + {"goalheight", 0x1C2}, + {"goalpos", 0x1C3}, + {"goalradius", 0x1C4}, + {"goaltime", 0x1C5}, + {"goalweight", 0x1C6}, + {"goingtoruntopos", 0x1C7}, + {"gravity", 0x1C8}, + {"gravity_noclip", 0x1C9}, + {"grenade", 0x1CA}, + {"grenade_fire", 0x1CB}, + {"grenade_off", 0x1CC}, + {"grenade_on", 0x1CD}, + {"grenade_pullback", 0x1CE}, + {"grenade_return_hand_tag", 0x1CF}, + {"grenadeammo", 0x1D0}, + {"grenadeawareness", 0x1D1}, + {"grenadedanger", 0x1D2}, + {"grenadeweapon", 0x1D3}, + {"ground_slam", 0x1D4}, + {"ground_slam_hit_player", 0x1D5}, + {"groundentchanged", 0x1D6}, + {"groundtype", 0x1D7}, + {"gunblockedbywall", 0x1D8}, + {"gunshot", 0x1D9}, + {"gunshot_teammate", 0x1DA}, + {"hardcoremodeon", 0x1DB}, + {"hasdoublexpitem", 0x1DC}, + {"hasradar", 0x1DD}, + {"hasvalidcostumeselfieimage", 0x1DE}, + {"head", 0x1DF}, + {"headicon", 0x1E0}, + {"headiconteam", 0x1E1}, + {"headshots", 0x1E2}, + {"health", 0x1E3}, + {"healthregen", 0x1E4}, + {"height", 0x1E5}, + {"helmet", 0x1E6}, + {"hidein3rdperson", 0x1E7}, + {"hidewhendead", 0x1E8}, + {"hidewhenindemo", 0x1E9}, + {"hidewheninmenu", 0x1EA}, + {"high_priority", 0x1EB}, + {"highlyawareradius", 0x1EC}, + {"hindlegstraceoffset", 0x1ED}, + {"hintstring", 0x1EE}, + {"hit_by_missile", 0x1EF}, + {"horzalign", 0x1F0}, + {"host_sucks_end_game", 0x1F1}, + {"hostfailures", 0x1F2}, + {"hostquits", 0x1F3}, + {"hostsuccesses", 0x1F4}, + {"human", 0x1F5}, + {"iconnew", 0x1F6}, + {"iconunlocked", 0x1F7}, + {"ignoreall", 0x1F8}, + {"ignoreclosefoliage", 0x1F9}, + {"ignoreexplosionevents", 0x1FA}, + {"ignoreforfixednodesafecheck", 0x1FB}, + {"ignoreme", 0x1FC}, + {"ignorerandombulletdamage", 0x1FD}, + {"ignoresuppression", 0x1FE}, + {"ignoretriggers", 0x1FF}, + {"ikweight", 0x200}, + {"index", 0x201}, + {"infinite_energy", 0x202}, + {"info_notnull", 0x203}, + {"info_player_start", 0x204}, + {"init", 0x205}, + {"initstructs", 0x206}, + {"insolid", 0x207}, + {"intermission", 0x208}, + {"interval", 0x209}, + {"inuse", 0x20A}, + {"invalid_parent", 0x20B}, + {"invisible", 0x20C}, + {"isradarblocked", 0x20D}, + {"item", 0x20E}, + {"j_exo_rcket_arm02", 0x20F}, + {"j_exoclav04_l", 0x210}, + {"j_exoclav04_r", 0x211}, + {"j_exohip04_l", 0x212}, + {"j_exohip04_r", 0x213}, + {"j_eyeball_le", 0x214}, + {"j_eyeball_ri", 0x215}, + {"j_gun", 0x216}, + {"j_head", 0x217}, + {"j_hip_l", 0x218}, + {"j_hip_r", 0x219}, + {"j_knee_le", 0x21A}, + {"j_knee_ri", 0x21B}, + {"j_left_elbow", 0x21C}, + {"j_left_hand", 0x21D}, + {"j_left_shoulder", 0x21E}, + {"j_mainroot", 0x21F}, + {"j_neck", 0x220}, + {"j_right_elbow", 0x221}, + {"j_right_hand", 0x222}, + {"j_right_hand_placement", 0x223}, + {"j_right_shoulder", 0x224}, + {"j_rocket", 0x225}, + {"j_spine4", 0x226}, + {"j_spinelower", 0x227}, + {"j_spineupper", 0x228}, + {"jumpcost", 0x229}, + {"jumping", 0x22A}, + {"justclass", 0x22B}, + {"kdratio", 0x22C}, + {"keepclaimednode", 0x22D}, + {"keepclaimednodeifvalid", 0x22E}, + {"keepnodeduringscriptedanim", 0x22F}, + {"key1", 0x230}, + {"key2", 0x231}, + {"kill_timestamp", 0x232}, + {"killanimscript", 0x233}, + {"killcamentity", 0x234}, + {"killcamentitylookat", 0x235}, + {"kills", 0x236}, + {"killstreak", 0x237}, + {"killstreakcount", 0x238}, + {"killstreakrestricted", 0x239}, + {"killstreakunlocked", 0x23A}, + {"knife_off", 0x23B}, + {"knife_on", 0x23C}, + {"known_event", 0x23D}, + {"label", 0x23E}, + {"ladder_down", 0x23F}, + {"ladder_up", 0x240}, + {"land", 0x241}, + {"last_stand_count", 0x242}, + {"lastattacker", 0x243}, + {"lastenemysightpos", 0x244}, + {"lastplayedtime", 0x245}, + {"laststand", 0x246}, + {"leanamount", 0x247}, + {"ledge", 0x248}, + {"left", 0x249}, + {"leftaimlimit", 0x24A}, + {"leftarc", 0x24B}, + {"lethal", 0x24C}, + {"lifecount", 0x24D}, + {"light", 0x24E}, + {"lives", 0x24F}, + {"loadouts", 0x250}, + {"lockorientation", 0x251}, + {"lod", 0x252}, + {"look", 0x253}, + {"lookahead", 0x254}, + {"lookaheaddir", 0x255}, + {"lookaheaddist", 0x256}, + {"lookaheadhitsstairs", 0x257}, + {"lookforward", 0x258}, + {"lookright", 0x259}, + {"looktarget", 0x25A}, + {"lookup", 0x25B}, + {"loot", 0x25C}, + {"lootnew", 0x25D}, + {"loses", 0x25E}, + {"low_priority", 0x25F}, + {"lowresbackground", 0x260}, + {"luinotifyserver", 0x261}, + {"mag_eject", 0x262}, + {"mag_eject_left", 0x263}, + {"main", 0x264}, + {"manual", 0x265}, + {"manual_ai", 0x266}, + {"manual_change", 0x267}, + {"map", 0x268}, + {"matchid", 0x269}, + {"matchmakingsettingsversion", 0x26A}, + {"matchmakingtesttype", 0x26B}, + {"max_time", 0x26C}, + {"maxfaceenemydist", 0x26D}, + {"maxhealth", 0x26E}, + {"maxrange", 0x26F}, + {"maxsightdistsqrd", 0x270}, + {"maxturnspeed", 0x271}, + {"maxvisibledist", 0x272}, + {"melee_fired", 0x273}, + {"melee_hit_react", 0x274}, + {"meleeattackdist", 0x275}, + {"menuresponse", 0x276}, + {"micro_dlc_bits_last_gen", 0x277}, + {"micro_dlc_bits_next_gen", 0x278}, + {"middle_left", 0x279}, + {"middle_right", 0x27A}, + {"migrateablequits", 0x27B}, + {"min_energy", 0x27C}, + {"min_time", 0x27D}, + {"minpaindamage", 0x27E}, + {"minusedistsq", 0x27F}, + {"missile_fire", 0x280}, + {"missile_passed_target", 0x281}, + {"missile_stuck", 0x282}, + {"mlgversion", 0x283}, + {"mod", 0x284}, + {"mod_crush", 0x285}, + {"mod_energy", 0x286}, + {"mod_explosive", 0x287}, + {"mod_explosive_bullet", 0x288}, + {"mod_falling", 0x289}, + {"mod_grenade", 0x28A}, + {"mod_grenade_splash", 0x28B}, + {"mod_head_shot", 0x28C}, + {"mod_impact", 0x28D}, + {"mod_melee", 0x28E}, + {"mod_melee_alien", 0x28F}, + {"mod_melee_alt", 0x290}, + {"mod_melee_dog", 0x291}, + {"mod_pistol_bullet", 0x292}, + {"mod_projectile", 0x293}, + {"mod_projectile_splash", 0x294}, + {"mod_rifle_bullet", 0x295}, + {"mod_suicide", 0x296}, + {"mod_trigger_hurt", 0x297}, + {"mod_unknown", 0x298}, + {"model", 0x299}, + {"modeprefix", 0x29A}, + {"modifiers", 0x29B}, + {"motiontrackerenabled", 0x29C}, + {"mounted_dlc_bits", 0x29D}, + {"movedone", 0x29E}, + {"movemode", 0x29F}, + {"munition", 0x2A0}, + {"munition_level", 0x2A1}, + {"mw3prestige", 0x2A2}, + {"mw3rank", 0x2A3}, + {"name", 0x2A4}, + {"namemodified", 0x2A5}, + {"near_goal", 0x2A6}, + {"nearz", 0x2A7}, + {"neutral", 0x2A8}, + {"never", 0x2A9}, + {"newenemyreactiondistsq", 0x2AA}, + {"newentitlement", 0x2AB}, + {"nextgen", 0x2AC}, + {"nextreadblackops2", 0x2AD}, + {"nextreadghosts0", 0x2AE}, + {"nextreadghosts1", 0x2AF}, + {"nextreadmw3", 0x2B0}, + {"night_vision_off", 0x2B1}, + {"night_vision_on", 0x2B2}, + {"no_bot_random_path", 0x2B3}, + {"no_cover", 0x2B4}, + {"no_gravity", 0x2B5}, + {"noattackeraccuracymod", 0x2B6}, + {"noclip", 0x2B7}, + {"node", 0x2B8}, + {"node_not_safe", 0x2B9}, + {"node_out_of_range", 0x2BA}, + {"node_relinquished", 0x2BB}, + {"node_taken", 0x2BC}, + {"nodeoffsetpos", 0x2BD}, + {"nododgemove", 0x2BE}, + {"nogravity", 0x2BF}, + {"nogrenadereturnthrow", 0x2C0}, + {"noncombat", 0x2C1}, + {"none", 0x2C2}, + {"nonmigrateablequits", 0x2C3}, + {"nophysics", 0x2C4}, + {"normal", 0x2C5}, + {"normal_radar", 0x2C6}, + {"northyaw", 0x2C7}, + {"notifyname", 0x2C8}, + {"notinsolid", 0x2C9}, + {"num0", 0x2CA}, + {"num1", 0x2CB}, + {"num2", 0x2CC}, + {"num3", 0x2CD}, + {"num4", 0x2CE}, + {"objective", 0x2CF}, + {"obstacle", 0x2D0}, + {"offense", 0x2D1}, + {"offense_level", 0x2D2}, + {"offhand", 0x2D3}, + {"offhand_end", 0x2D4}, + {"offhandweapon", 0x2D5}, + {"oldtime", 0x2D6}, + {"ondeactivate", 0x2D7}, + {"onenterstate", 0x2D8}, + {"only_sky", 0x2D9}, + {"onlygoodnearestnodes", 0x2DA}, + {"onwifi", 0x2DB}, + {"operationsdeadline", 0x2DC}, + {"oriented", 0x2DD}, + {"orientto_complete", 0x2DE}, + {"origin", 0x2DF}, + {"other", 0x2E0}, + {"over", 0x2E1}, + {"owner", 0x2E2}, + {"pacifist", 0x2E3}, + {"pacifistwait", 0x2E4}, + {"pain", 0x2E5}, + {"pantssize", 0x2E6}, + {"parentindex", 0x2E7}, + {"parentname", 0x2E8}, + {"partyid", 0x2E9}, + {"pasttitledata", 0x2EA}, + {"patch", 0x2EB}, + {"patchbacking", 0x2EC}, + {"path_blocked", 0x2ED}, + {"path_changed", 0x2EE}, + {"path_dir_change", 0x2EF}, + {"path_enemy", 0x2F0}, + {"path_need_dodge", 0x2F1}, + {"path_set", 0x2F2}, + {"pathenemyfightdist", 0x2F3}, + {"pathenemylookahead", 0x2F4}, + {"pathgoalpos", 0x2F5}, + {"pathlookaheaddist", 0x2F6}, + {"pathrandompercent", 0x2F7}, + {"pc", 0x2F8}, + {"pccg", 0x2F9}, + {"pelvis", 0x2FA}, + {"perk1", 0x2FB}, + {"perk2", 0x2FC}, + {"perk3", 0x2FD}, + {"perk4", 0x2FE}, + {"perk5", 0x2FF}, + {"perk6", 0x300}, + {"perkclassrestricted", 0x301}, + {"perkrestricted", 0x302}, + {"perks", 0x303}, + {"perkslots", 0x304}, + {"pers", 0x305}, + {"persistentperksunlocked", 0x306}, + {"persistentweaponsunlocked", 0x307}, + {"phone_off", 0x308}, + {"phone_on", 0x309}, + {"physics_finished", 0x30A}, + {"physics_impact", 0x30B}, + {"pickup", 0x30C}, + {"pickup_riotshield", 0x30D}, + {"pistol", 0x30E}, + {"pitchamount", 0x30F}, + {"pitchconvergencetime", 0x310}, + {"plane_waypoint", 0x311}, + {"playedblackops2", 0x312}, + {"playedghosts", 0x313}, + {"playedmw3", 0x314}, + {"player", 0x315}, + {"player_controller", 0x316}, + {"player_pushed", 0x317}, + {"playercardbackground", 0x318}, + {"playercardpatch", 0x319}, + {"playercardpatchbacking", 0x31A}, + {"playerconnectionhistory", 0x31B}, + {"playerid", 0x31C}, + {"playerip", 0x31D}, + {"playername", 0x31E}, + {"playerpositions", 0x31F}, + {"players", 0x320}, + {"playerSpread", 0x321}, + {"playerxuidhigh", 0x322}, + {"playerxuidlow", 0x323}, + {"playing", 0x324}, + {"points", 0x325}, + {"position", 0x326}, + {"positioninworld", 0x327}, + {"postsharpturnlookaheaddist", 0x328}, + {"precache", 0x329}, + {"predicted_projectile_impact", 0x32A}, + {"prestige", 0x32B}, + {"prestigedoublexp", 0x32C}, + {"prestigedoublexpmaxtimeplayed", 0x32D}, + {"prestigeshoptokens", 0x32E}, + {"prestigeshoptokensentitlement", 0x32F}, + {"prevanimdelta", 0x330}, + {"prevnode", 0x331}, + {"prevscript", 0x332}, + {"primary", 0x333}, + {"primaryattachment1", 0x334}, + {"primaryattachment2", 0x335}, + {"primaryattachment3", 0x336}, + {"primaryattachments", 0x337}, + {"primaryattachkit", 0x338}, + {"primarycamo", 0x339}, + {"primaryfurniturekit", 0x33A}, + {"primaryoffhand", 0x33B}, + {"primaryreticle", 0x33C}, + {"primaryweapon", 0x33D}, + {"privatematchactivesquadmember", 0x33E}, + {"privatematchcustomclasses", 0x33F}, + {"privatematchsquadmembers", 0x340}, + {"projectile_impact", 0x341}, + {"projectile_impact_player", 0x342}, + {"prone", 0x343}, + {"proneok", 0x344}, + {"providecoveringfire", 0x345}, + {"ps3", 0x346}, + {"ps4", 0x347}, + {"psoffsettime", 0x348}, + {"pushable", 0x349}, + {"radaralwayson", 0x34A}, + {"radarmode", 0x34B}, + {"radarshowenemydirection", 0x34C}, + {"radarstrength", 0x34D}, + {"radius", 0x34E}, + {"ragdoll_early_result", 0x34F}, + {"raise_riotshield", 0x350}, + {"rank", 0x351}, + {"rate", 0x352}, + {"reached_end_node", 0x353}, + {"reached_wait_node", 0x354}, + {"reached_wait_speed", 0x355}, + {"reactiontargetpos", 0x356}, + {"realtimedelta", 0x357}, + {"receiver", 0x358}, + {"recipename", 0x359}, + {"reciprocality", 0x35A}, + {"reflection_clear_color", 0x35B}, + {"reinforcement", 0x35C}, + {"relativedir", 0x35D}, + {"relativeoffset", 0x35E}, + {"reload", 0x35F}, + {"reload_start", 0x360}, + {"remotemissilespawn", 0x361}, + {"rendertotexture", 0x362}, + {"reportindex", 0x363}, + {"reports", 0x364}, + {"reputation", 0x365}, + {"requestarrivalnotify", 0x366}, + {"requirement_beat100waves", 0x367}, + {"requirement_beat200waves", 0x368}, + {"requirement_beat50waves", 0x369}, + {"requirement_beatenzombies", 0x36A}, + {"requirement_maxarmorproficiency", 0x36B}, + {"requirement_maxweaponproficiency", 0x36C}, + {"requirement_playedallmaps", 0x36D}, + {"requirement_unlockedprison", 0x36E}, + {"requirement_unlockedtier2", 0x36F}, + {"requirement_unlockedtier3", 0x370}, + {"reserved", 0x371}, + {"respawndelay", 0x372}, + {"result", 0x373}, + {"reticle", 0x374}, + {"return_pitch", 0x375}, + {"reverse", 0x376}, + {"revives", 0x377}, + {"right", 0x378}, + {"rightaimlimit", 0x379}, + {"rightarc", 0x37A}, + {"riotshield_damaged", 0x37B}, + {"riotshield_hit", 0x37C}, + {"rocket", 0x37D}, + {"rocket_off", 0x37E}, + {"rocket_on", 0x37F}, + {"rotatedone", 0x380}, + {"rotation", 0x381}, + {"run", 0x382}, + {"runcost", 0x383}, + {"runto_arrived", 0x384}, + {"safetochangescript", 0x385}, + {"scavenger", 0x386}, + {"scope_cap", 0x387}, + {"scope_center", 0x388}, + {"scope_top", 0x389}, + {"score", 0x38A}, + {"script", 0x38B}, + {"script_brushmodel", 0x38C}, + {"script_clut", 0x38D}, + {"script_context", 0x38E}, + {"script_delay", 0x38F}, + {"script_goal_changed", 0x390}, + {"script_label", 0x391}, + {"script_lightset", 0x392}, + {"script_linkname", 0x393}, + {"script_model", 0x394}, + {"script_noteworthy", 0x395}, + {"script_origin", 0x396}, + {"script_parent", 0x397}, + {"script_parentname", 0x398}, + {"script_pushable", 0x399}, + {"script_vehicle", 0x39A}, + {"script_vehicle_collision", 0x39B}, + {"script_vehicle_collmap", 0x39C}, + {"script_vehicle_corpse", 0x39D}, + {"script_visionset", 0x39E}, + {"script_water", 0x39F}, + {"script_reverb", 0x3A0}, + {"script_zone", 0x3A1}, + {"scriptable", 0x3A2}, + {"scriptableactor", 0x3A3}, + {"scripted_viewmodel_anim", 0x3A4}, + {"scriptedarrivalent", 0x3A5}, + {"search_end", 0x3A6}, + {"secondary", 0x3A7}, + {"secondaryattachment1", 0x3A8}, + {"secondaryattachment2", 0x3A9}, + {"secondaryattachments", 0x3AA}, + {"secondaryattachkit", 0x3AB}, + {"secondarycamo", 0x3AC}, + {"secondaryfurniturekit", 0x3AD}, + {"secondaryoffhand", 0x3AE}, + {"secondaryreticle", 0x3AF}, + {"secondaryweapon", 0x3B0}, + {"sentry", 0x3B1}, + {"sentry_manual", 0x3B2}, + {"sentry_offline", 0x3B3}, + {"servertimecount", 0x3B4}, + {"servertimeexceedcount", 0x3B5}, + {"servertimemax", 0x3B6}, + {"servertimetotal", 0x3B7}, + {"servertimetotalexceed", 0x3B8}, + {"sessionstate", 0x3B9}, + {"sessionteam", 0x3BA}, + {"sharpturn", 0x3BB}, + {"sharpturnlookaheaddist", 0x3BC}, + {"sharpturnnotifydist", 0x3BD}, + {"sharpturntooclosetodestdist", 0x3BE}, + {"shirt", 0x3BF}, + {"showinkillcam", 0x3C0}, + {"showkillcam", 0x3C1}, + {"sightlatency", 0x3C2}, + {"silenced_shot", 0x3C3}, + {"skill_points", 0x3C4}, + {"skillbucket", 0x3C5}, + {"skillrating", 0x3C6}, + {"skillratingtype", 0x3C7}, + {"slidevelocity", 0x3C8}, + {"slowmo_active", 0x3C9}, + {"slowmo_passive", 0x3CA}, + {"smoke", 0x3CB}, + {"snd_channelvolprio_holdbreath", 0x3CC}, + {"snd_channelvolprio_pain", 0x3CD}, + {"snd_channelvolprio_shellshock", 0x3CE}, + {"snd_enveffectsprio_level", 0x3CF}, + {"snd_enveffectsprio_shellshock", 0x3D0}, + {"sort", 0x3D1}, + {"sound_blend", 0x3D2}, + {"soundeventdone", 0x3D3}, + {"space", 0x3D4}, + {"spawned", 0x3D5}, + {"spawner", 0x3D6}, + {"spawnflags", 0x3D7}, + {"spawnpos", 0x3D8}, + {"spawntime", 0x3D9}, + {"specialgrenade", 0x3DA}, + {"spectatekillcam", 0x3DB}, + {"spectating_cycle", 0x3DC}, + {"spectator", 0x3DD}, + {"speechcommand", 0x3DE}, + {"speed", 0x3DF}, + {"splatter", 0x3E0}, + {"splineplanereachednode", 0x3E1}, + {"sprint_begin", 0x3E2}, + {"sprint_end", 0x3E3}, + {"sprint_slide_begin", 0x3E4}, + {"sprint_slide_end", 0x3E5}, + {"squad_base", 0x3E6}, + {"squad_mode", 0x3E7}, + {"squad_name", 0x3E8}, + {"squadhq", 0x3E9}, + {"squadmembers", 0x3EA}, + {"squadmemxp", 0x3EB}, + {"squadname", 0x3EC}, + {"stairs", 0x3ED}, + {"stairsstate", 0x3EE}, + {"stand", 0x3EF}, + {"start_blend", 0x3F0}, + {"start_move", 0x3F1}, + {"start_ragdoll", 0x3F2}, + {"startdeaths", 0x3F3}, + {"startdeploy_riotshield", 0x3F4}, + {"startingoffsetforlife", 0x3F5}, + {"startkills", 0x3F6}, + {"state_changed", 0x3F7}, + {"statelocked", 0x3F8}, + {"stencil_disable", 0x3F9}, + {"stencil_onesided", 0x3FA}, + {"stencil_twosided", 0x3FB}, + {"stencilfunc_always", 0x3FC}, + {"stencilfunc_equal", 0x3FD}, + {"stencilfunc_greater", 0x3FE}, + {"stencilfunc_greaterequal", 0x3FF}, + {"stencilfunc_less", 0x400}, + {"stencilfunc_lessequal", 0x401}, + {"stencilfunc_never", 0x402}, + {"stencilfunc_notequal", 0x403}, + {"stencilop_decr", 0x404}, + {"stencilop_decrsat", 0x405}, + {"stencilop_incr", 0x406}, + {"stencilop_incrsat", 0x407}, + {"stencilop_invert", 0x408}, + {"stencilop_keep", 0x409}, + {"stencilop_replace", 0x40A}, + {"stencilop_zero", 0x40B}, + {"stop", 0x40C}, + {"stop_soon", 0x40D}, + {"stopanimdistsq", 0x40E}, + {"stopsoonnotifydist", 0x40F}, + {"streak", 0x410}, + {"streaktype", 0x411}, + {"suckedashost", 0x412}, + {"suncolor", 0x413}, + {"sundirection", 0x414}, + {"sunlight", 0x415}, + {"support", 0x416}, + {"support_level", 0x417}, + {"suppression", 0x418}, + {"suppression_end", 0x419}, + {"suppressionduration", 0x41A}, + {"suppressionmeter", 0x41B}, + {"suppressionstarttime", 0x41C}, + {"suppressionTime", 0x41D}, + {"suppressionwait", 0x41E}, + {"surfacetype", 0x41F}, + {"surprisedbymedistsq", 0x420}, + {"swimmer", 0x421}, + {"switched_var_grenade", 0x422}, + {"syncedmeleetarget", 0x423}, + {"tactical", 0x424}, + {"tag", 0x425}, + {"tag_ai_aim_target", 0x426}, + {"tag_aim", 0x427}, + {"tag_aim_animated", 0x428}, + {"tag_aim_pivot", 0x429}, + {"tag_barrel", 0x42A}, + {"tag_blade_off", 0x42B}, + {"tag_body", 0x42C}, + {"tag_brass", 0x42D}, + {"tag_brass_2", 0x42E}, + {"tag_butt", 0x42F}, + {"tag_camera", 0x430}, + {"tag_clip", 0x431}, + {"tag_clip_dual", 0x432}, + {"tag_clip_dual2", 0x433}, + {"tag_detach", 0x434}, + {"tag_engine_left", 0x435}, + {"tag_engine_right", 0x436}, + {"tag_eotech_reticle", 0x437}, + {"tag_eye", 0x438}, + {"tag_flash", 0x439}, + {"tag_flash_11", 0x43A}, + {"tag_flash_2", 0x43B}, + {"tag_flash_22", 0x43C}, + {"tag_flash_3", 0x43D}, + {"tag_flash_launcher", 0x43E}, + {"tag_flash_silenced", 0x43F}, + {"tag_fx", 0x440}, + {"tag_gasmask", 0x441}, + {"tag_gasmask2", 0x442}, + {"tag_ik_ankle_fl", 0x443}, + {"tag_ik_ankle_fr", 0x444}, + {"tag_ik_ankle_kl", 0x445}, + {"tag_ik_ankle_kr", 0x446}, + {"tag_ik_ankle_ml", 0x447}, + {"tag_ik_ankle_mr", 0x448}, + {"tag_ik_footflat_fl", 0x449}, + {"tag_ik_footflat_fr", 0x44A}, + {"tag_ik_footflat_kl", 0x44B}, + {"tag_ik_footflat_kr", 0x44C}, + {"tag_ik_footflat_ml", 0x44D}, + {"tag_ik_footflat_mr", 0x44E}, + {"tag_ik_hip_fl", 0x44F}, + {"tag_ik_hip_fr", 0x450}, + {"tag_ik_hip_kl", 0x451}, + {"tag_ik_hip_kr", 0x452}, + {"tag_ik_hip_ml", 0x453}, + {"tag_ik_hip_mr", 0x454}, + {"tag_ik_knee_fl", 0x455}, + {"tag_ik_knee_fr", 0x456}, + {"tag_ik_knee_kl", 0x457}, + {"tag_ik_knee_kr", 0x458}, + {"tag_ik_knee_ml", 0x459}, + {"tag_ik_knee_mr", 0x45A}, + {"tag_ik_loc_le", 0x45B}, + {"tag_ik_loc_le_foregrip", 0x45C}, + {"tag_ik_loc_le_launcher", 0x45D}, + {"tag_ik_loc_le_shotgun", 0x45E}, + {"tag_ik_target", 0x45F}, + {"tag_inhand", 0x460}, + {"tag_jetblast_fx", 0x461}, + {"tag_jetpack", 0x462}, + {"tag_knife_attach", 0x463}, + {"tag_knife_fx", 0x464}, + {"tag_laser", 0x465}, + {"tag_launcher", 0x466}, + {"tag_magnifier_eotech_reticle", 0x467}, + {"tag_mobile_cover_upright", 0x468}, + {"tag_motion_tracker_bl", 0x469}, + {"tag_motion_tracker_br", 0x46A}, + {"tag_motion_tracker_fx", 0x46B}, + {"tag_motion_tracker_tl", 0x46C}, + {"tag_origin", 0x46D}, + {"tag_player", 0x46E}, + {"tag_popout", 0x46F}, + {"tag_rail_master_off", 0x470}, + {"tag_rail_master_on", 0x471}, + {"tag_rail_side_off", 0x472}, + {"tag_rail_side_on", 0x473}, + {"tag_reticle_acog", 0x474}, + {"tag_reticle_default", 0x475}, + {"tag_reticle_default2", 0x476}, + {"tag_reticle_hamr", 0x477}, + {"tag_reticle_on", 0x478}, + {"tag_reticle_red_dot", 0x479}, + {"tag_reticle_reflex", 0x47A}, + {"tag_reticle_tavor_scope", 0x47B}, + {"tag_reticle_thermal_scope", 0x47C}, + {"tag_rider", 0x47D}, + {"tag_riot_shield", 0x47E}, + {"tag_rocket", 0x47F}, + {"tag_scope_ads_off", 0x480}, + {"tag_scope_ads_on", 0x481}, + {"tag_shield_back", 0x482}, + {"tag_shotgun", 0x483}, + {"tag_show_alt", 0x484}, + {"tag_sight_off", 0x485}, + {"tag_sight_on", 0x486}, + {"tag_stow_back_mid_attach", 0x487}, + {"tag_stowed_back", 0x488}, + {"tag_stowed_hip_rear", 0x489}, + {"tag_sync", 0x48A}, + {"tag_tip", 0x48B}, + {"tag_turret", 0x48C}, + {"tag_turret_base", 0x48D}, + {"tag_turret_pitch", 0x48E}, + {"tag_turret_yaw", 0x48F}, + {"tag_weapon", 0x490}, + {"tag_weapon_chest", 0x491}, + {"tag_weapon_left", 0x492}, + {"tag_weapon_right", 0x493}, + {"tag_wheel_back_left", 0x494}, + {"tag_wheel_back_right", 0x495}, + {"tag_wheel_front_left", 0x496}, + {"tag_wheel_front_right", 0x497}, + {"tag_wheel_middle_left", 0x498}, + {"tag_wheel_middle_right", 0x499}, + {"tag_wheel_spin_left01", 0x49A}, + {"tag_wheel_spin_left02", 0x49B}, + {"tag_wheel_spin_left03", 0x49C}, + {"tag_wheel_spin_right01", 0x49D}, + {"tag_wheel_spin_right02", 0x49E}, + {"tag_wheel_spin_right03", 0x49F}, + {"takedamage", 0x4A0}, + {"target", 0x4A1}, + {"target_script_trigger", 0x4A2}, + {"targetname", 0x4A3}, + {"team", 0x4A4}, + {"team3", 0x4A5}, + {"teambalanced", 0x4A6}, + {"teammode_axisallies", 0x4A7}, + {"teammode_ffa", 0x4A8}, + {"teammovewaittime", 0x4A9}, + {"their_score", 0x4AA}, + {"thermal", 0x4AB}, + {"thermalbodymaterial", 0x4AC}, + {"third_person", 0x4AD}, + {"threatbias", 0x4AE}, + {"threatbiasgroup", 0x4AF}, + {"threatsightdelayenabled", 0x4B0}, + {"threatsightdelayfalloff", 0x4B1}, + {"threshold", 0x4B2}, + {"throwingknife", 0x4B3}, + {"time", 0x4B4}, + {"timeplayedtotal", 0x4B5}, + {"titlenew", 0x4B6}, + {"titleunlocked", 0x4B7}, + {"top", 0x4B8}, + {"toparc", 0x4B9}, + {"totalxp", 0x4BA}, + {"touch", 0x4BB}, + {"touching_platform", 0x4BC}, + {"traverse_complete", 0x4BD}, + {"traverse_soon", 0x4BE}, + {"traversecost", 0x4BF}, + {"traversesoonnotifydist", 0x4C0}, + {"trend", 0x4C1}, + {"trigger", 0x4C2}, + {"trigger_damage", 0x4C3}, + {"trigger_use", 0x4C4}, + {"trigger_use_touch", 0x4C5}, + {"truck_cam", 0x4C6}, + {"turnrate", 0x4C7}, + {"turret_deactivate", 0x4C8}, + {"turret_fire", 0x4C9}, + {"turret_no_vis", 0x4CA}, + {"turret_not_on_target", 0x4CB}, + {"turret_on_target", 0x4CC}, + {"turret_on_vistarget", 0x4CD}, + {"turret_pitch_clamped", 0x4CE}, + {"turret_rotate_stopped", 0x4CF}, + {"turret_yaw_clamped", 0x4D0}, + {"turretinvulnerability", 0x4D1}, + {"turretownerchange", 0x4D2}, + {"turretstatechange", 0x4D3}, + {"type", 0x4D4}, + {"ucdidhigh", 0x4D5}, + {"ucdidlow", 0x4D6}, + {"unlockedcamo", 0x4D7}, + {"unlockedreticles", 0x4D8}, + {"unlockpoints", 0x4D9}, + {"unresolved_collision", 0x4DA}, + {"up", 0x4DB}, + {"upaimlimit", 0x4DC}, + {"upgradechallengeprogress", 0x4DD}, + {"upgradechallengestage", 0x4DE}, + {"upgradepoints", 0x4DF}, + {"upgradepurchased", 0x4E0}, + {"useable", 0x4E1}, + {"usechokepoints", 0x4E2}, + {"usecombatscriptatcover", 0x4E3}, + {"usedemblemslots", 0x4E4}, + {"useorcaavoidance", 0x4E5}, + {"usepathsmoothingvalues", 0x4E6}, + {"veh_boatbounce", 0x4E7}, + {"veh_boost_activated", 0x4E8}, + {"veh_boost_deactivated", 0x4E9}, + {"veh_brake", 0x4EA}, + {"veh_collision", 0x4EB}, + {"veh_contact", 0x4EC}, + {"veh_jolt", 0x4ED}, + {"veh_landed", 0x4EE}, + {"veh_leftground", 0x4EF}, + {"veh_pathdir", 0x4F0}, + {"veh_pathspeed", 0x4F1}, + {"veh_pathtype", 0x4F2}, + {"veh_predictedcollision", 0x4F3}, + {"veh_speed", 0x4F4}, + {"veh_throttle", 0x4F5}, + {"veh_topspeed", 0x4F6}, + {"veh_transmission", 0x4F7}, + {"vehicle_dismount", 0x4F8}, + {"vehicle_mount", 0x4F9}, + {"vehicletype", 0x4FA}, + {"velocity", 0x4FB}, + {"vertalign", 0x4FC}, + {"visionsetmissilecam", 0x4FD}, + {"visionsetmissilecamduration", 0x4FE}, + {"visionsetnaked", 0x4FF}, + {"visionsetnakedduration", 0x500}, + {"visionsetnight", 0x501}, + {"visionsetnightduration", 0x502}, + {"visionsetpain", 0x503}, + {"visionsetpainduration", 0x504}, + {"visionsetthermal", 0x505}, + {"visionsetthermalduration", 0x506}, + {"vote", 0x507}, + {"wait", 0x508}, + {"walk", 0x509}, + {"walkdist", 0x50A}, + {"walkdistfacingmotion", 0x50B}, + {"wastacticalinsertion", 0x50C}, + {"waypoint_reached", 0x50D}, + {"weapon", 0x50E}, + {"weapon_change", 0x50F}, + {"weapon_dropped", 0x510}, + {"weapon_fired", 0x511}, + {"weapon_model_change", 0x512}, + {"weapon_switch_invalid", 0x513}, + {"weapon_switch_started", 0x514}, + {"weapon_taken", 0x515}, + {"weaponchange", 0x516}, + {"weaponclassrestricted", 0x517}, + {"weaponinfo", 0x518}, + {"weaponrank", 0x519}, + {"weaponrestricted", 0x51A}, + {"weaponsetups", 0x51B}, + {"weaponstats", 0x51C}, + {"weeklychallengeid", 0x51D}, + {"weight", 0x51E}, + {"width", 0x51F}, + {"wildcard1", 0x520}, + {"wildcard2", 0x521}, + {"wildcard3", 0x522}, + {"wildcardslots", 0x523}, + {"win_streak", 0x524}, + {"winlossratio", 0x525}, + {"wins", 0x526}, + {"won_match", 0x527}, + {"world", 0x528}, + {"worldmodel", 0x529}, + {"worldspawn", 0x52A}, + {"x", 0x52B}, + {"xb3", 0x52C}, + {"xenon", 0x52D}, + {"xp", 0x52E}, + {"xp_multiplier", 0x52F}, + {"xpmaxmultipliertimeplayed", 0x530}, + {"xpmultiplier", 0x531}, + {"xuid", 0x532}, + {"y", 0x533}, + {"yawconvergencetime", 0x534}, + {"your_score", 0x535}, + {"z", 0x536}, + {"zonly_physics", 0x537}, + {"codescripts/delete", 0x53D}, + {"codescripts/struct", 0x53E}, + {"codescripts/message", 0x53F}, + {"maps/mp/gametypes/_callbacksetup", 0x540}, + }; +} diff --git a/src/client/game/scripting/functions.cpp b/src/client/game/scripting/functions.cpp new file mode 100644 index 00000000..3452c767 --- /dev/null +++ b/src/client/game/scripting/functions.cpp @@ -0,0 +1,106 @@ +#include +#include "functions.hpp" + +#include + +namespace scripting +{ + namespace + { + std::unordered_map lowercase_map( + const std::unordered_map& old_map) + { + std::unordered_map new_map{}; + for (auto& entry : old_map) + { + new_map[utils::string::to_lower(entry.first)] = entry.second; + } + + return new_map; + } + + const std::unordered_map& get_methods() + { + static auto methods = lowercase_map(method_map); + return methods; + } + + const std::unordered_map& get_functions() + { + static auto function = lowercase_map(function_map); + return function; + } + + int find_function_index(const std::string& name, const bool prefer_global) + { + const auto target = utils::string::to_lower(name); + + const auto& primary_map = prefer_global + ? get_functions() + : get_methods(); + const auto& secondary_map = !prefer_global + ? get_functions() + : get_methods(); + + auto function_entry = primary_map.find(target); + if (function_entry != primary_map.end()) + { + return function_entry->second; + } + + function_entry = secondary_map.find(target); + if (function_entry != secondary_map.end()) + { + return function_entry->second; + } + + return -1; + } + + script_function get_function_by_index(const unsigned index) + { + static const auto function_table = SELECT_VALUE(0x149668F50, 0x147DD1850); + static const auto method_table = SELECT_VALUE(0x14966A670, 0x147DD2F50); + + if (index < 0x2DF) + { + return reinterpret_cast(function_table)[index]; + } + + return reinterpret_cast(method_table)[index - 0x8000]; + } + } + + std::string find_token(unsigned int id) + { + for (const auto& token : token_map) + { + if (token.second == id) + { + return token.first; + } + } + + return utils::string::va("_ID%i", id); + } + + unsigned int find_token_id(const std::string& name) + { + const auto result = token_map.find(name); + + if (result != token_map.end()) + { + return result->second; + } + + return 0; + } + + script_function find_function(const std::string& name, const bool prefer_global) + { + const auto index = find_function_index(name, prefer_global); + if (index < 0) return nullptr; + + return get_function_by_index(index); + } +} diff --git a/src/client/game/scripting/functions.hpp b/src/client/game/scripting/functions.hpp new file mode 100644 index 00000000..0422bcf7 --- /dev/null +++ b/src/client/game/scripting/functions.hpp @@ -0,0 +1,16 @@ +#pragma once +#include "game/game.hpp" + +namespace scripting +{ + extern std::unordered_map method_map; + extern std::unordered_map function_map; + extern std::unordered_map token_map; + + using script_function = void(*)(game::scr_entref_t); + + std::string find_token(unsigned int id); + unsigned int find_token_id(const std::string& name); + + script_function find_function(const std::string& name, const bool prefer_global); +} diff --git a/src/client/game/scripting/lua/context.cpp b/src/client/game/scripting/lua/context.cpp new file mode 100644 index 00000000..7aaa9f89 --- /dev/null +++ b/src/client/game/scripting/lua/context.cpp @@ -0,0 +1,542 @@ +#include +#include "context.hpp" +#include "error.hpp" +#include "value_conversion.hpp" + +#include "../execution.hpp" +#include "../functions.hpp" + +#include "../../../component/command.hpp" +#include "../../../component/logfile.hpp" +#include "../../../component/scripting.hpp" + +#include +#include + +namespace scripting::lua +{ + namespace + { + + vector normalize_vector(const vector& vec) + { + const auto length = sqrt( + (vec.get_x() * vec.get_x()) + + (vec.get_y() * vec.get_y()) + + (vec.get_z() * vec.get_z()) + ); + + return vector( + vec.get_x() / length, + vec.get_y() / length, + vec.get_z() / length + ); + } + + void setup_io(sol::state& state) + { + state["io"]["fileexists"] = utils::io::file_exists; + state["io"]["writefile"] = utils::io::write_file; + state["io"]["remove_file"] = utils::io::remove_file; + state["io"]["filesize"] = utils::io::file_size; + state["io"]["createdirectory"] = utils::io::create_directory; + state["io"]["directoryexists"] = utils::io::directory_exists; + state["io"]["directoryisempty"] = utils::io::directory_is_empty; + state["io"]["listfiles"] = utils::io::list_files; + state["io"]["copyfolder"] = utils::io::copy_folder; + state["io"]["readfile"] = static_cast(utils::io::read_file); + } + + void setup_vector_type(sol::state& state) + { + auto vector_type = state.new_usertype("vector", sol::constructors()); + vector_type["x"] = sol::property(&vector::get_x, &vector::set_x); + vector_type["y"] = sol::property(&vector::get_y, &vector::set_y); + vector_type["z"] = sol::property(&vector::get_z, &vector::set_z); + + vector_type["r"] = sol::property(&vector::get_x, &vector::set_x); + vector_type["g"] = sol::property(&vector::get_y, &vector::set_y); + vector_type["b"] = sol::property(&vector::get_z, &vector::set_z); + + vector_type[sol::meta_function::addition] = sol::overload( + [](const vector& a, const vector& b) + { + return vector( + a.get_x() + b.get_x(), + a.get_y() + b.get_y(), + a.get_z() + b.get_z() + ); + }, + [](const vector& a, const int value) + { + return vector( + a.get_x() + value, + a.get_y() + value, + a.get_z() + value + ); + } + ); + + vector_type[sol::meta_function::subtraction] = sol::overload( + [](const vector& a, const vector& b) + { + return vector( + a.get_x() - b.get_x(), + a.get_y() - b.get_y(), + a.get_z() - b.get_z() + ); + }, + [](const vector& a, const int value) + { + return vector( + a.get_x() - value, + a.get_y() - value, + a.get_z() - value + ); + } + ); + + vector_type[sol::meta_function::multiplication] = sol::overload( + [](const vector& a, const vector& b) + { + return vector( + a.get_x() * b.get_x(), + a.get_y() * b.get_y(), + a.get_z() * b.get_z() + ); + }, + [](const vector& a, const int value) + { + return vector( + a.get_x() * value, + a.get_y() * value, + a.get_z() * value + ); + } + ); + + vector_type[sol::meta_function::division] = sol::overload( + [](const vector& a, const vector& b) + { + return vector( + a.get_x() / b.get_x(), + a.get_y() / b.get_y(), + a.get_z() / b.get_z() + ); + }, + [](const vector& a, const int value) + { + return vector( + a.get_x() / value, + a.get_y() / value, + a.get_z() / value + ); + } + ); + + vector_type[sol::meta_function::equal_to] = [](const vector& a, const vector& b) + { + return a.get_x() == b.get_x() && + a.get_y() == b.get_y() && + a.get_z() == b.get_z(); + }; + + vector_type[sol::meta_function::length] = [](const vector& a) + { + return sqrt((a.get_x() * a.get_x()) + (a.get_y() * a.get_y()) + (a.get_z() * a.get_z())); + }; + + vector_type[sol::meta_function::to_string] = [](const vector& a) + { + return utils::string::va("{x: %f, y: %f, z: %f}", a.get_x(), a.get_y(), a.get_z()); + }; + + vector_type["normalize"] = [](const vector& a) + { + return normalize_vector(a); + }; + } + + void setup_entity_type(sol::state& state, event_handler& handler, scheduler& scheduler) + { + state["level"] = entity{*game::levelEntityId}; + + auto entity_type = state.new_usertype("entity"); + + for (const auto& func : method_map) + { + const auto name = utils::string::to_lower(func.first); + entity_type[name.data()] = [name](const entity& entity, const sol::this_state s, sol::variadic_args va) + { + std::vector arguments{}; + + for (auto arg : va) + { + arguments.push_back(convert({s, arg})); + } + + return convert(s, entity.call(name, arguments)); + }; + } + + entity_type["set"] = [](const entity& entity, const std::string& field, + const sol::lua_value& value) + { + entity.set(field, convert(value)); + }; + + entity_type["get"] = [](const entity& entity, const sol::this_state s, const std::string& field) + { + return convert(s, entity.get(field)); + }; + + entity_type["notify"] = [](const entity& entity, const sol::this_state s, const std::string& event, + sol::variadic_args va) + { + std::vector arguments{}; + + for (auto arg : va) + { + arguments.push_back(convert({s, arg})); + } + + notify(entity, event, arguments); + }; + + entity_type["onnotify"] = [&handler](const entity& entity, const std::string& event, + const event_callback& callback) + { + event_listener listener{}; + listener.callback = callback; + listener.entity = entity; + listener.event = event; + listener.is_volatile = false; + + return handler.add_event_listener(std::move(listener)); + }; + + entity_type["onnotifyonce"] = [&handler](const entity& entity, const std::string& event, + const event_callback& callback) + { + event_listener listener{}; + listener.callback = callback; + listener.entity = entity; + listener.event = event; + listener.is_volatile = true; + + return handler.add_event_listener(std::move(listener)); + }; + + entity_type["call"] = [](const entity& entity, const sol::this_state s, const std::string& function, + sol::variadic_args va) + { + std::vector arguments{}; + + for (auto arg : va) + { + arguments.push_back(convert({s, arg})); + } + + return convert(s, entity.call(function, arguments)); + }; + + entity_type[sol::meta_function::new_index] = [](const entity& entity, const std::string& field, + const sol::lua_value& value) + { + entity.set(field, convert(value)); + }; + + entity_type[sol::meta_function::index] = [](const entity& entity, const sol::this_state s, const std::string& field) + { + return convert(s, entity.get(field)); + }; + + entity_type["getstruct"] = [](const entity& entity, const sol::this_state s) + { + const auto id = entity.get_entity_id(); + return scripting::lua::entity_to_struct(s, id); + }; + + entity_type["struct"] = sol::property([](const entity& entity, const sol::this_state s) + { + const auto id = entity.get_entity_id(); + return scripting::lua::entity_to_struct(s, id); + }); + + entity_type["scriptcall"] = [](const entity& entity, const sol::this_state s, const std::string& filename, + const std::string function, sol::variadic_args va) + { + std::vector arguments{}; + + for (auto arg : va) + { + arguments.push_back(convert({s, arg})); + } + + return convert(s, call_script_function(entity, filename, function, arguments)); + }; + + struct game + { + }; + auto game_type = state.new_usertype("game_"); + state["game"] = game(); + + for (const auto& func : function_map) + { + const auto name = utils::string::to_lower(func.first); + game_type[name] = [name](const game&, const sol::this_state s, sol::variadic_args va) + { + std::vector arguments{}; + + for (auto arg : va) + { + arguments.push_back(convert({s, arg})); + } + + return convert(s, call(name, arguments)); + }; + } + + game_type["call"] = [](const game&, const sol::this_state s, const std::string& function, + sol::variadic_args va) + { + std::vector arguments{}; + + for (auto arg : va) + { + arguments.push_back(convert({s, arg})); + } + + return convert(s, call(function, arguments)); + }; + + game_type["ontimeout"] = [&scheduler](const game&, const sol::protected_function& callback, + const long long milliseconds) + { + return scheduler.add(callback, milliseconds, true); + }; + + game_type["oninterval"] = [&scheduler](const game&, const sol::protected_function& callback, + const long long milliseconds) + { + return scheduler.add(callback, milliseconds, false); + }; + + game_type["executecommand"] = [](const game&, const std::string& command) + { + command::execute(command, false); + }; + + game_type["onplayerdamage"] = [](const game&, const sol::protected_function& callback) + { + logfile::add_player_damage_callback(callback); + }; + + game_type["onplayerkilled"] = [](const game&, const sol::protected_function& callback) + { + logfile::add_player_killed_callback(callback); + }; + + game_type["getgamevar"] = [](const sol::this_state s) + { + const auto value = ::game::scr_VarGlob->childVariableValue[*::game::gameEntityId]; + + ::game::VariableValue variable{}; + variable.type = value.type; + variable.u.uintValue = value.u.u.uintValue; + + return convert(s, variable); + }; + + game_type["getfunctions"] = [entity_type](const game&, const sol::this_state s, const std::string& filename) + { + if (scripting::script_function_table.find(filename) == scripting::script_function_table.end()) + { + throw std::runtime_error("File '" + filename + "' not found"); + } + + auto functions = sol::table::create(s.lua_state()); + + for (const auto& function : scripting::script_function_table[filename]) + { + functions[function.first] = sol::overload( + [filename, function](const entity& entity, const sol::this_state s, sol::variadic_args va) + { + std::vector arguments{}; + + for (auto arg : va) + { + arguments.push_back(convert({s, arg})); + } + + gsl::finally(&logfile::enable_vm_execute_hook); + logfile::disable_vm_execute_hook(); + + return convert(s, call_script_function(entity, filename, function.first, arguments)); + }, + [filename, function](const sol::this_state s, sol::variadic_args va) + { + std::vector arguments{}; + + for (auto arg : va) + { + arguments.push_back(convert({s, arg})); + } + + gsl::finally(&logfile::enable_vm_execute_hook); + logfile::disable_vm_execute_hook(); + + return convert(s, call_script_function(*::game::levelEntityId, filename, function.first, arguments)); + } + ); + } + + return functions; + }; + + game_type["scriptcall"] = [](const game&, const sol::this_state s, const std::string& filename, + const std::string function, sol::variadic_args va) + { + std::vector arguments{}; + + for (auto arg : va) + { + arguments.push_back(convert({s, arg})); + } + + gsl::finally(&logfile::enable_vm_execute_hook); + logfile::disable_vm_execute_hook(); + + return convert(s, call_script_function(*::game::levelEntityId, filename, function, arguments)); + }; + + game_type["detour"] = [](const game&, const sol::this_state s, const std::string& filename, + const std::string function_name, const sol::protected_function& function) + { + const auto pos = get_function_pos(filename, function_name); + logfile::vm_execute_hooks[pos] = function; + + auto detour = sol::table::create(function.lua_state()); + + detour["disable"] = [pos]() + { + logfile::vm_execute_hooks.erase(pos); + }; + + detour["enable"] = [pos, function]() + { + logfile::vm_execute_hooks[pos] = function; + }; + + detour["invoke"] = sol::overload( + [filename, function_name](const entity& entity, const sol::this_state s, sol::variadic_args va) + { + std::vector arguments{}; + + for (auto arg : va) + { + arguments.push_back(convert({s, arg})); + } + + gsl::finally(&logfile::enable_vm_execute_hook); + logfile::disable_vm_execute_hook(); + + return convert(s, call_script_function(entity, filename, function_name, arguments)); + }, + [filename, function_name](const sol::this_state s, sol::variadic_args va) + { + std::vector arguments{}; + + for (auto arg : va) + { + arguments.push_back(convert({s, arg})); + } + + gsl::finally(&logfile::enable_vm_execute_hook); + logfile::disable_vm_execute_hook(); + + return convert(s, call_script_function(*::game::levelEntityId, filename, function_name, arguments)); + } + ); + + return detour; + }; + } + } + + context::context(std::string folder) + : folder_(std::move(folder)) + , scheduler_(state_) + , event_handler_(state_) + + { + this->state_.open_libraries(sol::lib::base, + sol::lib::package, + sol::lib::io, + sol::lib::string, + sol::lib::os, + sol::lib::math, + sol::lib::table); + + this->state_["include"] = [this](const std::string& file) + { + this->load_script(file); + }; + + sol::function old_require = this->state_["require"]; + auto base_path = utils::string::replace(this->folder_, "/", ".") + "."; + this->state_["require"] = [base_path, old_require](const std::string& path) + { + return old_require(base_path + path); + }; + + this->state_["scriptdir"] = [this]() + { + return this->folder_; + }; + + setup_io(this->state_); + setup_vector_type(this->state_); + setup_entity_type(this->state_, this->event_handler_, this->scheduler_); + + printf("Loading script '%s'\n", this->folder_.data()); + this->load_script("__init__"); + } + + context::~context() + { + this->collect_garbage(); + this->scheduler_.clear(); + this->event_handler_.clear(); + this->state_ = {}; + } + + void context::run_frame() + { + this->scheduler_.run_frame(); + this->collect_garbage(); + } + + void context::notify(const event& e) + { + this->scheduler_.dispatch(e); + this->event_handler_.dispatch(e); + } + + void context::collect_garbage() + { + this->state_.collect_garbage(); + } + + void context::load_script(const std::string& script) + { + if (!this->loaded_scripts_.emplace(script).second) + { + return; + } + + const auto file = (std::filesystem::path{this->folder_} / (script + ".lua")).generic_string(); + handle_error(this->state_.safe_script_file(file, &sol::script_pass_on_error)); + } +} diff --git a/src/client/game/scripting/lua/context.hpp b/src/client/game/scripting/lua/context.hpp new file mode 100644 index 00000000..79a5e905 --- /dev/null +++ b/src/client/game/scripting/lua/context.hpp @@ -0,0 +1,45 @@ +#pragma once + +#include "../event.hpp" + +#pragma warning(push) +#pragma warning(disable: 4702) + +#define SOL_ALL_SAFETIES_ON 1 +#define SOL_PRINT_ERRORS 0 +#include + +#pragma warning(pop) + +#include "scheduler.hpp" +#include "event_handler.hpp" + +namespace scripting::lua +{ + class context + { + public: + context(std::string folder); + ~context(); + + context(context&&) noexcept = delete; + context& operator=(context&&) noexcept = delete; + + context(const context&) = delete; + context& operator=(const context&) = delete; + + void run_frame(); + void notify(const event& e); + void collect_garbage(); + + private: + sol::state state_{}; + std::string folder_; + std::unordered_set loaded_scripts_; + + scheduler scheduler_; + event_handler event_handler_; + + void load_script(const std::string& script); + }; +} diff --git a/src/client/game/scripting/lua/engine.cpp b/src/client/game/scripting/lua/engine.cpp new file mode 100644 index 00000000..351ad04b --- /dev/null +++ b/src/client/game/scripting/lua/engine.cpp @@ -0,0 +1,75 @@ +#include +#include "engine.hpp" +#include "context.hpp" + +#include "../execution.hpp" +#include "../../../component/logfile.hpp" +#include "../../../component/game_module.hpp" + +#include + +namespace scripting::lua::engine +{ + namespace + { + auto& get_scripts() + { + static std::vector> scripts{}; + return scripts; + } + + void load_scripts(const std::string& script_dir) + { + if (!utils::io::directory_exists(script_dir)) + { + return; + } + + const auto scripts = utils::io::list_files(script_dir); + + for (const auto& script : scripts) + { + if (std::filesystem::is_directory(script) && utils::io::file_exists(script + "/__init__.lua")) + { + get_scripts().push_back(std::make_unique(script)); + } + } + } + } + + void stop() + { + logfile::clear_callbacks(); + get_scripts().clear(); + } + + void start() + { + // No SP until there is a concept + if (game::environment::is_sp()) + { + return; + } + + stop(); + load_scripts(game_module::get_host_module().get_folder() + "/data/scripts/"); + load_scripts("h1-mod/scripts/"); + load_scripts("data/scripts/"); + } + + void notify(const event& e) + { + for (auto& script : get_scripts()) + { + script->notify(e); + } + } + + void run_frame() + { + for (auto& script : get_scripts()) + { + script->run_frame(); + } + } +} diff --git a/src/client/game/scripting/lua/engine.hpp b/src/client/game/scripting/lua/engine.hpp new file mode 100644 index 00000000..471316cd --- /dev/null +++ b/src/client/game/scripting/lua/engine.hpp @@ -0,0 +1,11 @@ +#pragma once + +#include "../event.hpp" + +namespace scripting::lua::engine +{ + void start(); + void stop(); + void notify(const event& e); + void run_frame(); +} diff --git a/src/client/game/scripting/lua/error.cpp b/src/client/game/scripting/lua/error.cpp new file mode 100644 index 00000000..935db0f0 --- /dev/null +++ b/src/client/game/scripting/lua/error.cpp @@ -0,0 +1,37 @@ +#include +#include "error.hpp" +#include "../execution.hpp" + +#include "component/console.hpp" + +namespace scripting::lua +{ + namespace + { + void notify_error() + { + try + { + call("iprintln", {"^1Script execution error!"}); + } + catch (...) + { + } + } + } + + void handle_error(const sol::protected_function_result& result) + { + if (!result.valid()) + { + console::error("************** Script execution error **************\n"); + + const sol::error err = result; + console::error("%s\n", err.what()); + + console::error("****************************************************\n"); + + notify_error(); + } + } +} diff --git a/src/client/game/scripting/lua/error.hpp b/src/client/game/scripting/lua/error.hpp new file mode 100644 index 00000000..dab56bee --- /dev/null +++ b/src/client/game/scripting/lua/error.hpp @@ -0,0 +1,8 @@ +#pragma once + +#include "context.hpp" + +namespace scripting::lua +{ + void handle_error(const sol::protected_function_result& result); +} diff --git a/src/client/game/scripting/lua/event_handler.cpp b/src/client/game/scripting/lua/event_handler.cpp new file mode 100644 index 00000000..7121ea63 --- /dev/null +++ b/src/client/game/scripting/lua/event_handler.cpp @@ -0,0 +1,174 @@ +#include "std_include.hpp" +#include "context.hpp" +#include "error.hpp" +#include "value_conversion.hpp" + +namespace scripting::lua +{ + event_handler::event_handler(sol::state& state) + : state_(state) + { + auto event_listener_handle_type = state.new_usertype("event_listener_handle"); + + event_listener_handle_type["clear"] = [this](const event_listener_handle& handle) + { + this->remove(handle); + }; + + event_listener_handle_type["endon"] = [this](const event_listener_handle& handle, const entity& entity, const std::string& event) + { + this->add_endon_condition(handle, entity, event); + }; + } + + void event_handler::dispatch(const event& event) + { + bool has_built_arguments = false; + event_arguments arguments{}; + + callbacks_.access([&](task_list& tasks) + { + this->merge_callbacks(); + this->handle_endon_conditions(event); + + for (auto i = tasks.begin(); i != tasks.end();) + { + if (i->event != event.name || i->entity != event.entity) + { + ++i; + continue; + } + + if (!i->is_deleted) + { + if(!has_built_arguments) + { + has_built_arguments = true; + arguments = this->build_arguments(event); + } + + handle_error(i->callback(sol::as_args(arguments))); + } + + if (i->is_volatile || i->is_deleted) + { + i = tasks.erase(i); + } + else + { + ++i; + } + } + }); + } + + event_listener_handle event_handler::add_event_listener(event_listener&& listener) + { + const uint64_t id = ++this->current_listener_id_; + listener.id = id; + listener.is_deleted = false; + + new_callbacks_.access([&listener](task_list& tasks) + { + tasks.emplace_back(std::move(listener)); + }); + + return {id}; + } + + void event_handler::add_endon_condition(const event_listener_handle& handle, const entity& entity, + const std::string& event) + { + auto merger = [&](task_list& tasks) + { + for(auto& task : tasks) + { + if(task.id == handle.id) + { + task.endon_conditions.emplace_back(entity, event); + } + } + }; + + callbacks_.access([&](task_list& tasks) + { + merger(tasks); + new_callbacks_.access(merger); + }); + } + + void event_handler::clear() + { + callbacks_.access([&](task_list& tasks) + { + new_callbacks_.access([&](task_list& new_tasks) + { + new_tasks.clear(); + tasks.clear(); + }); + }); + } + + void event_handler::remove(const event_listener_handle& handle) + { + auto mask_as_deleted = [&](task_list& tasks) + { + for (auto& task : tasks) + { + if (task.id == handle.id) + { + task.is_deleted = true; + break; + } + } + }; + + callbacks_.access(mask_as_deleted); + new_callbacks_.access(mask_as_deleted); + } + + void event_handler::merge_callbacks() + { + callbacks_.access([&](task_list& tasks) + { + new_callbacks_.access([&](task_list& new_tasks) + { + tasks.insert(tasks.end(), std::move_iterator(new_tasks.begin()), + std::move_iterator(new_tasks.end())); + new_tasks = {}; + }); + }); + } + + void event_handler::handle_endon_conditions(const event& event) + { + auto deleter = [&](task_list& tasks) + { + for(auto& task : tasks) + { + for(auto& condition : task.endon_conditions) + { + if(condition.first == event.entity && condition.second == event.name) + { + task.is_deleted = true; + break; + } + } + } + }; + + callbacks_.access(deleter); + } + + event_arguments event_handler::build_arguments(const event& event) const + { + event_arguments arguments; + + for (const auto& argument : event.arguments) + { + arguments.emplace_back(convert(this->state_, argument)); + } + + return arguments; + } +} diff --git a/src/client/game/scripting/lua/event_handler.hpp b/src/client/game/scripting/lua/event_handler.hpp new file mode 100644 index 00000000..fc95b704 --- /dev/null +++ b/src/client/game/scripting/lua/event_handler.hpp @@ -0,0 +1,58 @@ +#pragma once + +namespace scripting::lua +{ + using event_arguments = std::vector; + using event_callback = sol::protected_function; + + class event_listener_handle + { + public: + uint64_t id = 0; + }; + + class event_listener final : public event_listener_handle + { + public: + std::string event = {}; + entity entity{}; + event_callback callback = {}; + bool is_volatile = false; + bool is_deleted = false; + std::vector> endon_conditions{}; + }; + + class event_handler final + { + public: + event_handler(sol::state& state); + + event_handler(event_handler&&) noexcept = delete; + event_handler& operator=(event_handler&&) noexcept = delete; + + event_handler(const scheduler&) = delete; + event_handler& operator=(const event_handler&) = delete; + + void dispatch(const event& event); + + event_listener_handle add_event_listener(event_listener&& listener); + + void clear(); + + private: + sol::state& state_; + std::atomic_int64_t current_listener_id_ = 0; + + using task_list = std::vector; + utils::concurrency::container new_callbacks_; + utils::concurrency::container callbacks_; + + void remove(const event_listener_handle& handle); + void merge_callbacks(); + void handle_endon_conditions(const event& event); + + void add_endon_condition(const event_listener_handle& handle, const entity& entity, const std::string& event); + + event_arguments build_arguments(const event& event) const; + }; +} diff --git a/src/client/game/scripting/lua/scheduler.cpp b/src/client/game/scripting/lua/scheduler.cpp new file mode 100644 index 00000000..1afb7df2 --- /dev/null +++ b/src/client/game/scripting/lua/scheduler.cpp @@ -0,0 +1,171 @@ +#include "std_include.hpp" +#include "context.hpp" +#include "error.hpp" + +namespace scripting::lua +{ + scheduler::scheduler(sol::state& state) + { + auto task_handle_type = state.new_usertype("task_handle"); + + task_handle_type["clear"] = [this](const task_handle& handle) + { + this->remove(handle); + }; + + task_handle_type["endon"] = [this](const task_handle& handle, const entity& entity, const std::string& event) + { + this->add_endon_condition(handle, entity, event); + }; + } + + void scheduler::dispatch(const event& event) + { + auto deleter = [&](task_list& tasks) + { + for(auto& task : tasks) + { + for(auto& condition : task.endon_conditions) + { + if(condition.first == event.entity && condition.second == event.name) + { + task.is_deleted = true; + break; + } + } + } + }; + + callbacks_.access([&](task_list& tasks) + { + deleter(tasks); + new_callbacks_.access(deleter); + }); + } + + void scheduler::run_frame() + { + callbacks_.access([&](task_list& tasks) + { + this->merge_callbacks(); + + for (auto i = tasks.begin(); i != tasks.end();) + { + const auto now = std::chrono::high_resolution_clock::now(); + const auto diff = now - i->last_call; + + if (diff < i->delay) + { + ++i; + continue; + } + + i->last_call = now; + + if (!i->is_deleted) + { + handle_error(i->callback()); + } + + if (i->is_volatile || i->is_deleted) + { + i = tasks.erase(i); + } + else + { + ++i; + } + } + }); + } + + void scheduler::clear() + { + callbacks_.access([&](task_list& tasks) + { + new_callbacks_.access([&](task_list& new_tasks) + { + new_tasks.clear(); + tasks.clear(); + }); + }); + } + + task_handle scheduler::add(const sol::protected_function& callback, const long long milliseconds, + const bool is_volatile) + { + return this->add(callback, std::chrono::milliseconds(milliseconds), is_volatile); + } + + task_handle scheduler::add(const sol::protected_function& callback, const std::chrono::milliseconds delay, + const bool is_volatile) + { + const uint64_t id = ++this->current_task_id_; + + task task; + task.is_volatile = is_volatile; + task.callback = callback; + task.delay = delay; + task.last_call = std::chrono::steady_clock::now(); + task.id = id; + task.is_deleted = false; + + new_callbacks_.access([&task](task_list& tasks) + { + tasks.emplace_back(std::move(task)); + }); + + return {id}; + } + + void scheduler::add_endon_condition(const task_handle& handle, const entity& entity, const std::string& event) + { + auto merger = [&](task_list& tasks) + { + for(auto& task : tasks) + { + if(task.id == handle.id) + { + task.endon_conditions.emplace_back(entity, event); + } + } + }; + + callbacks_.access([&](task_list& tasks) + { + merger(tasks); + new_callbacks_.access(merger); + }); + } + + void scheduler::remove(const task_handle& handle) + { + auto mask_as_deleted = [&](task_list& tasks) + { + for (auto& task : tasks) + { + if (task.id == handle.id) + { + task.is_deleted = true; + break; + } + } + }; + + callbacks_.access(mask_as_deleted); + new_callbacks_.access(mask_as_deleted); + } + + void scheduler::merge_callbacks() + { + callbacks_.access([&](task_list& tasks) + { + new_callbacks_.access([&](task_list& new_tasks) + { + tasks.insert(tasks.end(), std::move_iterator(new_tasks.begin()), + std::move_iterator(new_tasks.end())); + new_tasks = {}; + }); + }); + } +} diff --git a/src/client/game/scripting/lua/scheduler.hpp b/src/client/game/scripting/lua/scheduler.hpp new file mode 100644 index 00000000..17c90797 --- /dev/null +++ b/src/client/game/scripting/lua/scheduler.hpp @@ -0,0 +1,54 @@ +#pragma once +#include + +namespace scripting::lua +{ + class context; + + class task_handle + { + public: + uint64_t id = 0; + }; + + class task final : public task_handle + { + public: + std::chrono::steady_clock::time_point last_call{}; + sol::protected_function callback{}; + std::chrono::milliseconds delay{}; + bool is_volatile = false; + bool is_deleted = false; + std::vector> endon_conditions{}; + }; + + class scheduler final + { + public: + scheduler(sol::state& state); + + scheduler(scheduler&&) noexcept = delete; + scheduler& operator=(scheduler&&) noexcept = delete; + + scheduler(const scheduler&) = delete; + scheduler& operator=(const scheduler&) = delete; + + void dispatch(const event& event); + void run_frame(); + void clear(); + + task_handle add(const sol::protected_function& callback, long long milliseconds, bool is_volatile); + task_handle add(const sol::protected_function& callback, std::chrono::milliseconds delay, bool is_volatile); + + private: + using task_list = std::vector; + utils::concurrency::container new_callbacks_; + utils::concurrency::container callbacks_; + std::atomic_int64_t current_task_id_ = 0; + + void add_endon_condition(const task_handle& handle, const entity& entity, const std::string& event); + + void remove(const task_handle& handle); + void merge_callbacks(); + }; +} diff --git a/src/client/game/scripting/lua/value_conversion.cpp b/src/client/game/scripting/lua/value_conversion.cpp new file mode 100644 index 00000000..3cc37e20 --- /dev/null +++ b/src/client/game/scripting/lua/value_conversion.cpp @@ -0,0 +1,319 @@ +#include +#include "value_conversion.hpp" +#include "../functions.hpp" +#include "../execution.hpp" +#include ".../../component/logfile.hpp" + +namespace scripting::lua +{ + namespace + { + struct array_value + { + int index; + script_value value; + }; + + sol::lua_value entity_to_array(lua_State* state, unsigned int id) + { + auto table = sol::table::create(state); + auto metatable = sol::table::create(state); + + std::unordered_map values; + + const auto offset = 0xA000 * (id & 3); + + auto current = game::scr_VarGlob->objectVariableChildren[id].firstChild; + auto idx = 1; + + for (auto i = offset + current; current; i = offset + current) + { + const auto var = game::scr_VarGlob->childVariableValue[i]; + + if (var.type == game::SCRIPT_NONE) + { + current = var.nextSibling; + continue; + } + + const auto string_value = (game::scr_string_t)((unsigned __int8)var.name_lo + (var.k.keys.name_hi << 8)); + const auto* str = game::SL_ConvertToString(string_value); + + std::string key = string_value < 0x40000 && str + ? str + : std::to_string(idx++); + + game::VariableValue variable{}; + variable.type = var.type; + variable.u = var.u.u; + + array_value value; + value.index = i; + value.value = variable; + + values[key] = value; + + current = var.nextSibling; + } + + table["getkeys"] = [values]() + { + std::vector _keys; + + for (const auto& entry : values) + { + _keys.push_back(entry.first); + } + + return _keys; + }; + + metatable[sol::meta_function::new_index] = [values](const sol::table t, const sol::this_state s, + const sol::lua_value& key_value, const sol::lua_value& value) + { + const auto key = key_value.is() + ? std::to_string(key_value.as()) + : key_value.as(); + + if (values.find(key) == values.end()) + { + return; + } + + const auto i = values.at(key).index; + const auto variable = &game::scr_VarGlob->childVariableValue[i]; + + const auto new_variable = convert({s, value}).get_raw(); + + game::AddRefToValue(new_variable.type, new_variable.u); + game::RemoveRefToValue(variable->type, variable->u.u); + + variable->type = (char)new_variable.type; + variable->u.u = new_variable.u; + }; + + metatable[sol::meta_function::index] = [values](const sol::table t, const sol::this_state s, + const sol::lua_value& key_value) + { + const auto key = key_value.is() + ? std::to_string(key_value.as()) + : key_value.as(); + + if (values.find(key) == values.end()) + { + return sol::lua_value{s, sol::lua_nil}; + } + + return convert(s, values.at(key).value); + }; + + metatable[sol::meta_function::length] = [values]() + { + return values.size(); + }; + + table[sol::metatable_key] = metatable; + + return {state, table}; + } + + game::VariableValue convert_function(sol::lua_value value) + { + const auto function = value.as(); + const auto index = reinterpret_cast(logfile::vm_execute_hooks.size()); + + logfile::vm_execute_hooks[index] = function; + + game::VariableValue func; + func.type = game::SCRIPT_FUNCTION; + func.u.codePosValue = index; + + return func; + } + + sol::lua_value convert_function(lua_State* state, const char* pos) + { + return sol::overload( + [pos](const entity& entity, const sol::this_state s, sol::variadic_args va) + { + std::vector arguments{}; + + for (auto arg : va) + { + arguments.push_back(convert({s, arg})); + } + + return convert(s, exec_ent_thread(entity, pos, arguments)); + }, + [pos](const sol::this_state s, sol::variadic_args va) + { + std::vector arguments{}; + + for (auto arg : va) + { + arguments.push_back(convert({s, arg})); + } + + return convert(s, exec_ent_thread(*game::levelEntityId, pos, arguments)); + } + ); + } + } + + sol::lua_value entity_to_struct(lua_State* state, unsigned int parent_id) + { + auto table = sol::table::create(state); + auto metatable = sol::table::create(state); + + const auto offset = 64000 * (parent_id & 3); + + metatable[sol::meta_function::new_index] = [offset, parent_id](const sol::table t, const sol::this_state s, + const sol::lua_value& field, const sol::lua_value& value) + { + const auto id = field.is() + ? scripting::find_token_id(field.as()) + : field.as(); + + if (!id) + { + return; + } + + const auto variable_id = game::GetVariable(parent_id, id); + const auto variable = &game::scr_VarGlob->childVariableValue[variable_id + offset]; + const auto new_variable = convert({s, value}).get_raw(); + + game::AddRefToValue(new_variable.type, new_variable.u); + game::RemoveRefToValue(variable->type, variable->u.u); + + variable->type = (char)new_variable.type; + variable->u.u = new_variable.u; + }; + + metatable[sol::meta_function::index] = [offset, parent_id](const sol::table t, const sol::this_state s, + const sol::lua_value& field) + { + const auto id = field.is() + ? scripting::find_token_id(field.as()) + : field.as(); + + if (!id) + { + return sol::lua_value{s, sol::lua_nil}; + } + + const auto variable_id = game::FindVariable(parent_id, id); + if (!variable_id) + { + return sol::lua_value{s, sol::lua_nil}; + } + + const auto variable = game::scr_VarGlob->childVariableValue[variable_id + offset]; + + game::VariableValue result{}; + result.u = variable.u.u; + result.type = (game::scriptType_e)variable.type; + + return convert(s, result); + }; + + table[sol::metatable_key] = metatable; + + return {state, table}; + } + + script_value convert(const sol::lua_value& value) + { + if (value.is()) + { + return {value.as()}; + } + + if (value.is()) + { + return {value.as()}; + } + + if (value.is()) + { + return {value.as()}; + } + + if (value.is()) + { + return {value.as()}; + } + + if (value.is()) + { + return {value.as()}; + } + + if (value.is()) + { + return {value.as()}; + } + + if (value.is()) + { + return {value.as()}; + } + + if (value.is()) + { + return {value.as()}; + } + + if (value.is()) + { + return convert_function(value); + } + + return {}; + } + + sol::lua_value convert(lua_State* state, const script_value& value) + { + if (value.is()) + { + return {state, value.as()}; + } + + if (value.is()) + { + return {state, value.as()}; + } + + if (value.is()) + { + return {state, value.as()}; + } + + if (value.is>()) + { + return entity_to_struct(state, value.get_raw().u.uintValue); + } + + if (value.is>()) + { + return entity_to_array(state, value.get_raw().u.uintValue); + } + + if (value.is>()) + { + return convert_function(state, value.get_raw().u.codePosValue); + } + + if (value.is()) + { + return {state, value.as()}; + } + + if (value.is()) + { + return {state, value.as()}; + } + + return {state, sol::lua_nil}; + } +} diff --git a/src/client/game/scripting/lua/value_conversion.hpp b/src/client/game/scripting/lua/value_conversion.hpp new file mode 100644 index 00000000..93256f80 --- /dev/null +++ b/src/client/game/scripting/lua/value_conversion.hpp @@ -0,0 +1,11 @@ +#pragma once + +#include "context.hpp" + +namespace scripting::lua +{ + sol::lua_value entity_to_struct(lua_State* state, unsigned int parent_id); + + script_value convert(const sol::lua_value& value); + sol::lua_value convert(lua_State* state, const script_value& value); +} diff --git a/src/client/game/scripting/safe_execution.cpp b/src/client/game/scripting/safe_execution.cpp new file mode 100644 index 00000000..92daa3b7 --- /dev/null +++ b/src/client/game/scripting/safe_execution.cpp @@ -0,0 +1,72 @@ +#include +#include "safe_execution.hpp" + +#pragma warning(push) +#pragma warning(disable: 4611) + +namespace scripting::safe_execution +{ + namespace + { + bool execute_with_seh(const script_function function, const game::scr_entref_t& entref) + { + __try + { + function(entref); + return true; + } + __except (EXCEPTION_EXECUTE_HANDLER) + { + return false; + } + } + } + + bool call(const script_function function, const game::scr_entref_t& entref) + { + *game::g_script_error_level += 1; + if (game::_setjmp(&game::g_script_error[*game::g_script_error_level])) + { + *game::g_script_error_level -= 1; + return false; + } + + const auto result = execute_with_seh(function, entref); + *game::g_script_error_level -= 1; + return result; + } + + bool set_entity_field(const game::scr_entref_t& entref, const int offset) + { + *game::g_script_error_level += 1; + if (game::_setjmp(&game::g_script_error[*game::g_script_error_level])) + { + *game::g_script_error_level -= 1; + return false; + } + + game::Scr_SetObjectField(entref.classnum, entref.entnum, offset); + + *game::g_script_error_level -= 1; + return true; + } + + bool get_entity_field(const game::scr_entref_t& entref, const int offset, game::VariableValue* value) + { + *game::g_script_error_level += 1; + if (game::_setjmp(&game::g_script_error[*game::g_script_error_level])) + { + value->type = game::SCRIPT_NONE; + value->u.intValue = 0; + *game::g_script_error_level -= 1; + return false; + } + + game::GetEntityFieldValue(value, entref.classnum, entref.entnum, offset); + + *game::g_script_error_level -= 1; + return true; + } +} + +#pragma warning(pop) diff --git a/src/client/game/scripting/safe_execution.hpp b/src/client/game/scripting/safe_execution.hpp new file mode 100644 index 00000000..6eea59d2 --- /dev/null +++ b/src/client/game/scripting/safe_execution.hpp @@ -0,0 +1,10 @@ +#pragma once +#include "functions.hpp" + +namespace scripting::safe_execution +{ + bool call(script_function function, const game::scr_entref_t& entref); + + bool set_entity_field(const game::scr_entref_t& entref, int offset); + bool get_entity_field(const game::scr_entref_t& entref, int offset, game::VariableValue* value); +} diff --git a/src/client/game/scripting/script_value.cpp b/src/client/game/scripting/script_value.cpp new file mode 100644 index 00000000..7d334f17 --- /dev/null +++ b/src/client/game/scripting/script_value.cpp @@ -0,0 +1,278 @@ +#include +#include "script_value.hpp" +#include "entity.hpp" + + +namespace scripting +{ + /*************************************************************** + * Constructors + **************************************************************/ + + script_value::script_value(const game::VariableValue& value) + : value_(value) + { + } + + script_value::script_value(const int value) + { + game::VariableValue variable{}; + variable.type = game::SCRIPT_INTEGER; + variable.u.intValue = value; + + this->value_ = variable; + } + + script_value::script_value(const unsigned int value) + { + game::VariableValue variable{}; + variable.type = game::SCRIPT_INTEGER; + variable.u.uintValue = value; + + this->value_ = variable; + } + + script_value::script_value(const bool value) + : script_value(static_cast(value)) + { + } + + script_value::script_value(const float value) + { + game::VariableValue variable{}; + variable.type = game::SCRIPT_FLOAT; + variable.u.floatValue = value; + + this->value_ = variable; + } + + script_value::script_value(const double value) + : script_value(static_cast(value)) + { + } + + script_value::script_value(const char* value) + { + game::VariableValue variable{}; + variable.type = game::SCRIPT_STRING; + variable.u.stringValue = game::SL_GetString(value, 0); + + const auto _ = gsl::finally([&variable]() + { + game::RemoveRefToValue(variable.type, variable.u); + }); + + this->value_ = variable; + } + + script_value::script_value(const std::string& value) + : script_value(value.data()) + { + } + + script_value::script_value(const entity& value) + { + game::VariableValue variable{}; + variable.type = game::SCRIPT_OBJECT; + variable.u.pointerValue = value.get_entity_id(); + + this->value_ = variable; + } + + script_value::script_value(const vector& value) + { + game::VariableValue variable{}; + variable.type = game::SCRIPT_VECTOR; + variable.u.vectorValue = game::Scr_AllocVector(value); + + const auto _ = gsl::finally([&variable]() + { + game::RemoveRefToValue(variable.type, variable.u); + }); + + this->value_ = variable; + } + + /*************************************************************** + * Integer + **************************************************************/ + + template <> + bool script_value::is() const + { + return this->get_raw().type == game::SCRIPT_INTEGER; + } + + template <> + bool script_value::is() const + { + return this->is(); + } + + template <> + bool script_value::is() const + { + return this->is(); + } + + template <> + int script_value::get() const + { + return this->get_raw().u.intValue; + } + + template <> + unsigned int script_value::get() const + { + return this->get_raw().u.uintValue; + } + + template <> + bool script_value::get() const + { + return this->get_raw().u.uintValue != 0; + } + + /*************************************************************** + * Float + **************************************************************/ + + template <> + bool script_value::is() const + { + return this->get_raw().type == game::SCRIPT_FLOAT; + } + + template <> + bool script_value::is() const + { + return this->is(); + } + + template <> + float script_value::get() const + { + return this->get_raw().u.floatValue; + } + + template <> + double script_value::get() const + { + return static_cast(this->get_raw().u.floatValue); + } + + /*************************************************************** + * String + **************************************************************/ + + template <> + bool script_value::is() const + { + return this->get_raw().type == game::SCRIPT_STRING; + } + + template <> + bool script_value::is() const + { + return this->is(); + } + + template <> + const char* script_value::get() const + { + return game::SL_ConvertToString(static_cast(this->get_raw().u.stringValue)); + } + + template <> + std::string script_value::get() const + { + return this->get(); + } + + /*************************************************************** + * Array + **************************************************************/ + + template <> + bool script_value::is>() const + { + if (this->get_raw().type != game::SCRIPT_OBJECT) + { + return false; + } + + const auto id = this->get_raw().u.uintValue; + const auto type = game::scr_VarGlob->objectVariableValue[id].w.type; + + return type == game::SCRIPT_ARRAY; + } + + /*************************************************************** + * Struct + **************************************************************/ + + template <> + bool script_value::is>() const + { + if (this->get_raw().type != game::SCRIPT_OBJECT) + { + return false; + } + + const auto id = this->get_raw().u.uintValue; + const auto type = game::scr_VarGlob->objectVariableValue[id].w.type; + + return type == game::SCRIPT_STRUCT; + } + + /*************************************************************** + * Function + **************************************************************/ + + template <> + bool script_value::is>() const + { + return this->get_raw().type == game::SCRIPT_FUNCTION; + } + + /*************************************************************** + * Entity + **************************************************************/ + + template <> + bool script_value::is() const + { + return this->get_raw().type == game::SCRIPT_OBJECT; + } + + template <> + entity script_value::get() const + { + return entity(this->get_raw().u.pointerValue); + } + + /*************************************************************** + * Vector + **************************************************************/ + + template <> + bool script_value::is() const + { + return this->get_raw().type == game::SCRIPT_VECTOR; + } + + template <> + vector script_value::get() const + { + return this->get_raw().u.vectorValue; + } + + /*************************************************************** + * + **************************************************************/ + + const game::VariableValue& script_value::get_raw() const + { + return this->value_.get(); + } +} diff --git a/src/client/game/scripting/script_value.hpp b/src/client/game/scripting/script_value.hpp new file mode 100644 index 00000000..df8a95b6 --- /dev/null +++ b/src/client/game/scripting/script_value.hpp @@ -0,0 +1,52 @@ +#pragma once +#include "game/game.hpp" +#include "variable_value.hpp" +#include "vector.hpp" + +namespace scripting +{ + class entity; + + class script_value + { + public: + script_value() = default; + script_value(const game::VariableValue& value); + + script_value(int value); + script_value(unsigned int value); + script_value(bool value); + + script_value(float value); + script_value(double value); + + script_value(const char* value); + script_value(const std::string& value); + + script_value(const entity& value); + + script_value(const vector& value); + + template + bool is() const; + + template + T as() const + { + if (!this->is()) + { + throw std::runtime_error("Invalid type"); + } + + return get(); + } + + const game::VariableValue& get_raw() const; + + private: + template + T get() const; + + variable_value value_{}; + }; +} diff --git a/src/client/game/scripting/stack_isolation.cpp b/src/client/game/scripting/stack_isolation.cpp new file mode 100644 index 00000000..646e2584 --- /dev/null +++ b/src/client/game/scripting/stack_isolation.cpp @@ -0,0 +1,27 @@ +#include +#include "stack_isolation.hpp" + +namespace scripting +{ + stack_isolation::stack_isolation() + { + this->in_param_count_ = game::scr_VmPub->inparamcount; + this->out_param_count_ = game::scr_VmPub->outparamcount; + this->top_ = game::scr_VmPub->top; + this->max_stack_ = game::scr_VmPub->maxstack; + + game::scr_VmPub->top = this->stack_; + game::scr_VmPub->maxstack = &this->stack_[ARRAYSIZE(this->stack_) - 1]; + game::scr_VmPub->inparamcount = 0; + game::scr_VmPub->outparamcount = 0; + } + + stack_isolation::~stack_isolation() + { + game::Scr_ClearOutParams(); + game::scr_VmPub->inparamcount = this->in_param_count_; + game::scr_VmPub->outparamcount = this->out_param_count_; + game::scr_VmPub->top = this->top_; + game::scr_VmPub->maxstack = this->max_stack_; + } +} diff --git a/src/client/game/scripting/stack_isolation.hpp b/src/client/game/scripting/stack_isolation.hpp new file mode 100644 index 00000000..8dffd4bc --- /dev/null +++ b/src/client/game/scripting/stack_isolation.hpp @@ -0,0 +1,25 @@ +#pragma once +#include "game/game.hpp" + +namespace scripting +{ + class stack_isolation final + { + public: + stack_isolation(); + ~stack_isolation(); + + stack_isolation(stack_isolation&&) = delete; + stack_isolation(const stack_isolation&) = delete; + stack_isolation& operator=(stack_isolation&&) = delete; + stack_isolation& operator=(const stack_isolation&) = delete; + + private: + game::VariableValue stack_[512]{}; + + game::VariableValue* max_stack_; + game::VariableValue* top_; + unsigned int in_param_count_; + unsigned int out_param_count_; + }; +} diff --git a/src/client/game/scripting/variable_value.cpp b/src/client/game/scripting/variable_value.cpp new file mode 100644 index 00000000..69a20023 --- /dev/null +++ b/src/client/game/scripting/variable_value.cpp @@ -0,0 +1,68 @@ +#include +#include "variable_value.hpp" + +namespace scripting +{ + variable_value::variable_value(const game::VariableValue& value) + { + this->assign(value); + } + + variable_value::variable_value(const variable_value& other) noexcept + { + this->operator=(other); + } + + variable_value::variable_value(variable_value&& other) noexcept + { + this->operator=(std::move(other)); + } + + variable_value& variable_value::operator=(const variable_value& other) noexcept + { + if (this != &other) + { + this->release(); + this->assign(other.value_); + } + + return *this; + } + + variable_value& variable_value::operator=(variable_value&& other) noexcept + { + if (this != &other) + { + this->release(); + this->value_ = other.value_; + other.value_.type = game::SCRIPT_NONE; + } + + return *this; + } + + variable_value::~variable_value() + { + this->release(); + } + + const game::VariableValue& variable_value::get() const + { + return this->value_; + } + + void variable_value::assign(const game::VariableValue& value) + { + this->value_ = value; + game::AddRefToValue(this->value_.type, this->value_.u); + } + + void variable_value::release() + { + if (this->value_.type != game::SCRIPT_NONE) + { + game::RemoveRefToValue(this->value_.type, this->value_.u); + this->value_.type = game::SCRIPT_NONE; + } + } +} diff --git a/src/client/game/scripting/variable_value.hpp b/src/client/game/scripting/variable_value.hpp new file mode 100644 index 00000000..7a962612 --- /dev/null +++ b/src/client/game/scripting/variable_value.hpp @@ -0,0 +1,27 @@ +#pragma once +#include "game/game.hpp" + +namespace scripting +{ + class variable_value + { + public: + variable_value() = default; + variable_value(const game::VariableValue& value); + variable_value(const variable_value& other) noexcept; + variable_value(variable_value&& other) noexcept; + + variable_value& operator=(const variable_value& other) noexcept; + variable_value& operator=(variable_value&& other) noexcept; + + ~variable_value(); + + const game::VariableValue& get() const; + + private: + void assign(const game::VariableValue& value); + void release(); + + game::VariableValue value_{{0}, game::SCRIPT_NONE}; + }; +} diff --git a/src/client/game/scripting/vector.cpp b/src/client/game/scripting/vector.cpp new file mode 100644 index 00000000..e3b66dcd --- /dev/null +++ b/src/client/game/scripting/vector.cpp @@ -0,0 +1,85 @@ +#include +#include "vector.hpp" + +namespace scripting +{ + vector::vector(const float* value) + { + for (auto i = 0; i < 3; ++i) + { + this->value_[i] = value[i]; + } + } + + vector::vector(const game::vec3_t& value) + : vector(&value[0]) + { + } + + vector::vector(const float x, const float y, const float z) + { + this->value_[0] = x; + this->value_[1] = y; + this->value_[2] = z; + } + + vector::operator game::vec3_t&() + { + return this->value_; + } + + vector::operator const game::vec3_t&() const + { + return this->value_; + } + + game::vec_t& vector::operator[](const size_t i) + { + if (i >= 3) + { + throw std::runtime_error("Out of bounds."); + } + + return this->value_[i]; + } + + const game::vec_t& vector::operator[](const size_t i) const + { + if (i >= 3) + { + throw std::runtime_error("Out of bounds."); + } + + return this->value_[i]; + } + + float vector::get_x() const + { + return this->operator[](0); + } + + float vector::get_y() const + { + return this->operator[](1); + } + + float vector::get_z() const + { + return this->operator[](2); + } + + void vector::set_x(const float value) + { + this->operator[](0) = value; + } + + void vector::set_y(const float value) + { + this->operator[](1) = value; + } + + void vector::set_z(const float value) + { + this->operator[](2) = value; + } +} diff --git a/src/client/game/scripting/vector.hpp b/src/client/game/scripting/vector.hpp new file mode 100644 index 00000000..70b146d6 --- /dev/null +++ b/src/client/game/scripting/vector.hpp @@ -0,0 +1,31 @@ +#pragma once +#include "game/game.hpp" + +namespace scripting +{ + class vector final + { + public: + vector() = default; + vector(const float* value); + vector(const game::vec3_t& value); + vector(float x, float y, float z); + + operator game::vec3_t&(); + operator const game::vec3_t&() const; + + game::vec_t& operator[](size_t i); + const game::vec_t& operator[](size_t i) const; + + float get_x() const; + float get_y() const; + float get_z() const; + + void set_x(float value); + void set_y(float value); + void set_z(float value); + + private: + game::vec3_t value_{0}; + }; +} diff --git a/src/client/game/structs.hpp b/src/client/game/structs.hpp index 842aebbc..e57d54c7 100644 --- a/src/client/game/structs.hpp +++ b/src/client/game/structs.hpp @@ -186,8 +186,8 @@ namespace game struct scrVarGlob_t { - ObjectVariableValue objectVariableValue[40960]; - ObjectVariableChildren objectVariableChildren[40960]; + ObjectVariableValue objectVariableValue[56320]; + ObjectVariableChildren objectVariableChildren[56320]; unsigned __int16 childVariableBucket[65536]; ChildVariableValue childVariableValue[384000]; }; @@ -1358,18 +1358,22 @@ namespace game struct EntityState { - char entityNum; + uint16_t entityNum; }; // size = ? +#pragma pack(push, 1) struct gentity_s { EntityState s; - char __pad0[343]; + char __pad0[342]; gclient_s* client; char __pad1[80]; int flags; char __pad2[300]; }; // size = 736 +#pragma pack(pop) + + static_assert(sizeof(gentity_s) == 736); struct playerState_s { diff --git a/src/client/game/symbols.hpp b/src/client/game/symbols.hpp index 6e9bd9e8..72a3d2bd 100644 --- a/src/client/game/symbols.hpp +++ b/src/client/game/symbols.hpp @@ -8,10 +8,17 @@ namespace game * Functions **************************************************************/ + WEAK symbol AddRefToValue{0x14036E600, 0x14043C580}; + WEAK symbol RemoveRefToValue{0x1403700F0, 0x14043E090}; + WEAK symbol AddRefToObject{0x14036E5F0, 0x14043C570}; + WEAK symbol RemoveRefToObject{0x14036FFE0, 0x14043DF80}; + WEAK symbol AllocThread{0x14036E960, 0x14043C8E0}; + WEAK symbol Cbuf_AddText{0x140342EB0, 0x1404033B0}; WEAK symbol Cbuf_ExecuteBufferInternal{0, 0x1404034C0}; + void (int, int, const char*))> Cbuf_ExecuteBufferInternal{0x140342FC0, 0x1404034C0}; WEAK symbol Conbuf_AppendText{0x1403E3300, 0x140513FF0}; + WEAK symbol ConcatArgs{0x1402697F0, 0x140335D70}; WEAK symbol Cmd_ExecuteSingleCommand{0x140343980, 0x140403F60}; WEAK symbol Cmd_AddCommandInternal{0x1403433E0, 0x140403950}; WEAK symbol Cmd_RemoveCommand{0x140343FF0, 0x1404045D0}; @@ -20,6 +27,9 @@ namespace game WEAK symbol AimAssist_AddToTargetList{0, 0x14009D0F0}; + WEAK symbol BG_GetWeaponNameComplete{0x140430550, 0x1401F9670}; + WEAK symbol Com_Frame_Try_Block_Function{0x1401CE8D0, 0x1400D8310}; WEAK symbol Com_GetCurrentCoDPlayMode{0, 0x1405039A0}; WEAK symbol Com_InFrontEnd{0x1400E4B30, 0x140176A30}; @@ -35,7 +45,6 @@ namespace game WEAK symbol Dvar_SetCommand{0x1403C72B0, 0x1404FD0A0}; WEAK symbol Dvar_FindVar{0x1403C5D50, 0x1404FBB00}; - WEAK symbol Dvar_ClearModified{0x0, 0x1404FB930}; WEAK symbol Dvar_GetCombinedString{0x140354DF0, 0x14041D830}; WEAK symbol Dvar_ValueToString{0x1403C8560, 0x1404FE660}; WEAK symbol FS_Startup{0x1403B85D0, 0x1404EDD30}; WEAK symbol FS_AddLocalizedGameDirectory{0x1403B6030, 0x1404EBE20}; + WEAK symbol GetVariable{0x14036FDD0, 0x1403F3730}; + + WEAK symbol GScr_LoadConsts{0x1402D13E0, 0x140393810}; + WEAK symbol FindVariable{0x14036F4B0, 0x14043D430}; + WEAK symbol FindEntityId{0x14036F3B0, 0x14043D330}; + WEAK symbol RemoveVariableValue{0x140370190, 0x14043E130}; + WEAK symbol GetEntityFieldValue{0x140373780, 0x140441780}; + WEAK symbol generateHashValue{0x1400FE8A0, 0x1401B1010}; - WEAK symbol G_Glass_Update{0, 0x14033A640}; + WEAK symbol G_Glass_Update{0x14026C570, 0x14033A640}; WEAK symbol G_GetClientScore{0, 0x140342F90}; WEAK symbol I_CleanStr{0x1403CD230, 0x140503D00}; @@ -78,7 +96,7 @@ namespace game WEAK symbol R_TextWidth{0x1404D43B0, 0x1405D94A0}; WEAK symbol R_GetFontHeight{0x1405EA360, 0x1405D92C0}; WEAK symbol R_DrawSomething{0x1404D37B0, 0x1405D8890}; - WEAK symbol R_SyncRenderThread{0, 0x1405FF3A0}; + WEAK symbol R_SyncRenderThread{0x1404F8240, 0x1405FF3A0}; WEAK symbol VM_Execute{0x140376360, 0x140444350}; + + WEAK symbol Scr_NotifyId{0x140375800, 0x1404437E0}; + WEAK symbol Scr_AllocVector{0x140370930, 0x14043E7D0}; WEAK symbol Scr_GetFloat{0x140374D20, 0x140442D10}; - WEAK symbol Scr_GetString{0, 0x14032F0A0}; + WEAK symbol Scr_GetString{0x140375210, 0x140443150}; WEAK symbol Scr_GetNumParam{0x140374F30, 0x140442E70}; + WEAK symbol Scr_ClearOutParams{0x140374460, 0x140442510}; + WEAK symbol Scr_GetEntityIdRef{0x140372D50, 0x140440D80}; + WEAK symbol Scr_GetEntityId{0x140372CA0, 0x140440CD0}; WEAK symbol ScrPlace_GetViewPlacement{0x1401981F0, 0x140288550}; WEAK symbol DB_GetXAssetTypeSize{0x14019A3B0, 0x14028BE70}; - WEAK symbol LUI_OpenMenu{0x14039D5F0, 0x1404CD210}; + WEAK symbol LUI_OpenMenu{0x14039D5F0, 0x1404CD210}; WEAK symbol Menu_IsMenuOpenAndVisible{0x1404709C0, 0x1404C7320}; - WEAK symbol SL_FindString{0x140314AF0, 0x14043B470}; + WEAK symbol SL_FindString{0x14036D700, 0x14043B470}; + WEAK symbol SL_GetString{0x14036D9A0, 0x14043B840}; + WEAK symbol SL_ConvertToString{0x14036D420, 0x14043B170}; + WEAK symbol Scr_SetObjectField{0x1402B9F60, 0x140385330}; WEAK symbol SV_DirectConnect{0, 0x140480860}; - WEAK symbol SV_Cmd_TokenizeString{0x1402EF050, 0x140404D20}; + WEAK symbol SV_Cmd_ArgvBuffer{0x1403446C0, 0x140404CA0}; + WEAK symbol SV_Cmd_TokenizeString{0x140344740, 0x140404D20}; WEAK symbol SV_Cmd_EndTokenizedString{0x140344700, 0x140404CE0}; WEAK symbol SV_AddBot{0, 0x140480190}; @@ -141,22 +173,36 @@ namespace game WEAK symbol UI_SafeTranslateString{0x140350430, 0x14041C580}; + WEAK symbol longjmp{0x140648FD4, 0x140779F64}; + WEAK symbol _setjmp{0x1406BFD30, 0x1407F5F90}; + /*************************************************************** * Variables **************************************************************/ WEAK symbol sv_cmd_args{0x14AD99A10, 0x14946BA20}; + WEAK symbol g_script_error_level{0x14A1917A8, 0x14A33C824}; + WEAK symbol g_script_error{0x14A1917B0, 0x14A33C940}; + + WEAK symbol levelEntityId{0x149AF55B0, 0x149CA0730}; + WEAK symbol gameEntityId{0x149CA0734, 0x14B65E3B4}; + WEAK symbol command_whitelist{0x141079A60, 0x14120C360}; WEAK symbol cmd_functions{0x14AD99AB8, 0x14946BAC8}; WEAK symbol cmd_args{0x14AD99960, 0x14946B970}; WEAK symbol g_poolSize{0, 0x140FEADF0}; + WEAK symbol g_classMap{0x14080A840, 0x1412106B0}; - WEAK symbol gfxDrawMethod{0, 0x14FD21180}; + WEAK symbol scr_VarGlob{0x14B686480, 0x149CC8800}; + WEAK symbol scr_VmPub{0x14A1938C0, 0x14A33EA40}; + WEAK symbol scr_function_stack{0x14BD06C40, 0x14A348FC0}; - WEAK symbol dvarCount{0, 0x14D064CF4}; - WEAK symbol sortedDvars{0, 0x14D064D00}; + WEAK symbol gfxDrawMethod{0x14F05CE50, 0x14FD21180}; + + WEAK symbol dvarCount{0x14C217D10, 0x14D064CF4}; + WEAK symbol dvarPool{0x14C217D20, 0x14D064D00}; WEAK symbol DB_XAssetPool{0x140DE8C80, 0x140FEB5D0};