From bf631039eb51e12122cb6720908fba17d2cc2c6b Mon Sep 17 00:00:00 2001 From: Skull <86374920+skkuull@users.noreply.github.com> Date: Fri, 4 Feb 2022 03:51:51 +0200 Subject: [PATCH] no scripting for now --- src/client/game/scripting/entity.cpp | 120 -- src/client/game/scripting/entity.hpp | 50 - src/client/game/scripting/event.hpp | 13 - src/client/game/scripting/execution.cpp | 250 --- src/client/game/scripting/execution.hpp | 36 - src/client/game/scripting/function_tables.cpp | 1535 ----------------- src/client/game/scripting/functions.cpp | 106 -- src/client/game/scripting/functions.hpp | 16 - src/client/game/scripting/lua/context.cpp | 489 ------ src/client/game/scripting/lua/context.hpp | 45 - src/client/game/scripting/lua/engine.cpp | 75 - src/client/game/scripting/lua/engine.hpp | 11 - src/client/game/scripting/lua/error.cpp | 37 - src/client/game/scripting/lua/error.hpp | 8 - .../game/scripting/lua/event_handler.cpp | 174 -- .../game/scripting/lua/event_handler.hpp | 58 - src/client/game/scripting/lua/scheduler.cpp | 171 -- src/client/game/scripting/lua/scheduler.hpp | 54 - .../game/scripting/lua/value_conversion.cpp | 319 ---- .../game/scripting/lua/value_conversion.hpp | 11 - src/client/game/scripting/safe_execution.cpp | 72 - src/client/game/scripting/safe_execution.hpp | 10 - src/client/game/scripting/script_value.cpp | 278 --- src/client/game/scripting/script_value.hpp | 52 - src/client/game/scripting/stack_isolation.cpp | 27 - src/client/game/scripting/stack_isolation.hpp | 25 - src/client/game/scripting/variable_value.cpp | 68 - src/client/game/scripting/variable_value.hpp | 27 - src/client/game/scripting/vector.cpp | 85 - src/client/game/scripting/vector.hpp | 31 - src/client/game/ui_scripting/execution.cpp | 161 -- src/client/game/ui_scripting/execution.hpp | 18 - src/client/game/ui_scripting/lua/context.cpp | 205 --- src/client/game/ui_scripting/lua/context.hpp | 36 - src/client/game/ui_scripting/lua/engine.cpp | 61 - src/client/game/ui_scripting/lua/engine.hpp | 8 - src/client/game/ui_scripting/lua/error.cpp | 18 - src/client/game/ui_scripting/lua/error.hpp | 8 - .../game/ui_scripting/lua/scheduler.cpp | 122 -- .../game/ui_scripting/lua/scheduler.hpp | 50 - .../ui_scripting/lua/value_conversion.cpp | 144 -- .../ui_scripting/lua/value_conversion.hpp | 9 - src/client/game/ui_scripting/script_value.cpp | 274 --- src/client/game/ui_scripting/script_value.hpp | 56 - src/client/game/ui_scripting/types.cpp | 276 --- src/client/game/ui_scripting/types.hpp | 89 - src/client/resources/logo.bmp | Bin 109976 -> 109976 bytes 47 files changed, 5788 deletions(-) delete mode 100644 src/client/game/scripting/entity.cpp delete mode 100644 src/client/game/scripting/entity.hpp delete mode 100644 src/client/game/scripting/event.hpp delete mode 100644 src/client/game/scripting/execution.cpp delete mode 100644 src/client/game/scripting/execution.hpp delete mode 100644 src/client/game/scripting/function_tables.cpp delete mode 100644 src/client/game/scripting/functions.cpp delete mode 100644 src/client/game/scripting/functions.hpp delete mode 100644 src/client/game/scripting/lua/context.cpp delete mode 100644 src/client/game/scripting/lua/context.hpp delete mode 100644 src/client/game/scripting/lua/engine.cpp delete mode 100644 src/client/game/scripting/lua/engine.hpp delete mode 100644 src/client/game/scripting/lua/error.cpp delete mode 100644 src/client/game/scripting/lua/error.hpp delete mode 100644 src/client/game/scripting/lua/event_handler.cpp delete mode 100644 src/client/game/scripting/lua/event_handler.hpp delete mode 100644 src/client/game/scripting/lua/scheduler.cpp delete mode 100644 src/client/game/scripting/lua/scheduler.hpp delete mode 100644 src/client/game/scripting/lua/value_conversion.cpp delete mode 100644 src/client/game/scripting/lua/value_conversion.hpp delete mode 100644 src/client/game/scripting/safe_execution.cpp delete mode 100644 src/client/game/scripting/safe_execution.hpp delete mode 100644 src/client/game/scripting/script_value.cpp delete mode 100644 src/client/game/scripting/script_value.hpp delete mode 100644 src/client/game/scripting/stack_isolation.cpp delete mode 100644 src/client/game/scripting/stack_isolation.hpp delete mode 100644 src/client/game/scripting/variable_value.cpp delete mode 100644 src/client/game/scripting/variable_value.hpp delete mode 100644 src/client/game/scripting/vector.cpp delete mode 100644 src/client/game/scripting/vector.hpp delete mode 100644 src/client/game/ui_scripting/execution.cpp delete mode 100644 src/client/game/ui_scripting/execution.hpp delete mode 100644 src/client/game/ui_scripting/lua/context.cpp delete mode 100644 src/client/game/ui_scripting/lua/context.hpp delete mode 100644 src/client/game/ui_scripting/lua/engine.cpp delete mode 100644 src/client/game/ui_scripting/lua/engine.hpp delete mode 100644 src/client/game/ui_scripting/lua/error.cpp delete mode 100644 src/client/game/ui_scripting/lua/error.hpp delete mode 100644 src/client/game/ui_scripting/lua/scheduler.cpp delete mode 100644 src/client/game/ui_scripting/lua/scheduler.hpp delete mode 100644 src/client/game/ui_scripting/lua/value_conversion.cpp delete mode 100644 src/client/game/ui_scripting/lua/value_conversion.hpp delete mode 100644 src/client/game/ui_scripting/script_value.cpp delete mode 100644 src/client/game/ui_scripting/script_value.hpp delete mode 100644 src/client/game/ui_scripting/types.cpp delete mode 100644 src/client/game/ui_scripting/types.hpp diff --git a/src/client/game/scripting/entity.cpp b/src/client/game/scripting/entity.cpp deleted file mode 100644 index b81dea1b..00000000 --- a/src/client/game/scripting/entity.cpp +++ /dev/null @@ -1,120 +0,0 @@ -#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 deleted file mode 100644 index b1702379..00000000 --- a/src/client/game/scripting/entity.hpp +++ /dev/null @@ -1,50 +0,0 @@ -#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 deleted file mode 100644 index bc1d53e0..00000000 --- a/src/client/game/scripting/event.hpp +++ /dev/null @@ -1,13 +0,0 @@ -#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 deleted file mode 100644 index ba4e4abd..00000000 --- a/src/client/game/scripting/execution.cpp +++ /dev/null @@ -1,250 +0,0 @@ -#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) - { - const auto class_id = game::g_classMap[classnum].id; - const auto field_str = game::SL_GetString(field.data(), 0); - const auto _ = gsl::finally([field_str]() - { - game::RemoveRefToValue(game::SCRIPT_STRING, {static_cast(field_str)}); - }); - - const auto offset = game::FindVariable(class_id, field_str); - if (offset) - { - const auto index = 3 * (offset + 0xFA00 * (class_id & 3)); - const auto id = reinterpret_cast(SELECT_VALUE(0x149BB5680, 0x14821DF80))[index]; - return static_cast(id); - } - - 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 deleted file mode 100644 index 7fff1840..00000000 --- a/src/client/game/scripting/execution.hpp +++ /dev/null @@ -1,36 +0,0 @@ -#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 deleted file mode 100644 index 6eac3d97..00000000 --- a/src/client/game/scripting/function_tables.cpp +++ /dev/null @@ -1,1535 +0,0 @@ -#include - -// This file has been generated. -// Do not touch! - -namespace scripting -{ - std::unordered_map function_map = - { - {"precacheturret", 0}, - {"getweaponarray", 1}, - {"getnumparam", 15}, - {"getnumparam", 16}, - {"spawnturret", 23}, - {"canspawnturret", 24}, - {"assertexcmd", 25}, - {"badplace_delete", 30}, - {"badplace_cylinder", 31}, - {"badplace_arc", 32}, - {"badplace_brush", 33}, - {"assertexcmd0", 44}, - {"isdefined", 46}, - {"isvalidmissile", 47}, - {"isstring", 48}, - {"setomnvar", 49}, - {"getomnvar", 50}, - {"setdvar", 51}, - {"setdynamicdvar", 52}, - {"setdvarifuninitialized", 53}, - {"setdevdvar", 54}, - {"setdevdvarifuninitialized", 55}, - {"getdvar", 56}, - {"getdvarint", 57}, - {"getdvarfloat", 58}, - {"getdvarvector", 59}, - {"gettime", 60}, - {"getutc", 61}, - {"getradiometricunit", 62}, - {"getentbynum", 63}, - {"getweaponmodel", 64}, - {"setsunlight", 68}, - {"resetsunlight", 69}, - {"getweapondisplayname", 92}, - {"getweaponbasename", 93}, - {"getweaponattachments", 94}, - {"getweaponattachmentdisplaynames", 95}, - {"getweaponcamoname", 96}, - {"getweaponreticlename", 97}, - {"getanimlength", 98}, - {"animhasnotetrack", 99}, - {"getnotetracktimes", 100}, - {"spawn", 101}, - {"spawnloopingsound", 103}, - {"bullettrace", 104}, - {"getstartorigin", 108}, - {"getstartangles", 109}, - {"magicgrenademanual", 112}, - {"sub_140311ad0", 117}, - {"sub_140311d80", 118}, - {"sub_140311d90", 119}, - {"sub_140311df0", 120}, - {"sub_140311ef0", 121}, - {"sub_140311f50", 122}, - {"sub_14031fb60", 127}, - {"bullettracepassed", 138}, - {"sighttracepassed", 139}, - {"physicstrace", 140}, - {"playerphysicstrace", 141}, - {"getgroundposition", 142}, - {"getmovedelta", 143}, - {"getangledelta", 144}, - {"getnorthyaw", 145}, - {"setnorthyaw", 172}, - {"setslowmotion", 173}, - {"randomint", 174}, - {"randomfloat", 175}, - {"randomintrange", 176}, - {"randomfloatrange", 177}, - {"sin", 178}, - {"cos", 179}, - {"tan", 180}, - {"asin", 181}, - {"acos", 182}, - {"atan", 183}, - {"castint", 184}, - {"castfloat", 185}, - {"abs", 186}, - {"min", 187}, - {"getnode", 191}, - {"getnodearray", 192}, - {"getallnodes", 193}, - {"getnodesinradius", 194}, - {"getnodesinradiussorted", 195}, - {"getclosestnodeinsight", 196}, - {"isarray", 202}, - {"isai", 203}, - {"getindexforluincstring", 204}, - {"issentient", 205}, - {"max", 221}, - {"floor", 222}, - {"ceil", 223}, - {"exp", 224}, - {"log", 225}, - {"sqrt", 226}, - {"squared", 227}, - {"clamp", 228}, - {"angleclamp360", 229}, - {"angleclamp180", 230}, - {"vectorfromlinetopoint", 231}, - {"pointonsegmentnearesttopoint", 232}, - {"distance", 233}, - {"distance2d", 234}, - {"distancesquared", 235}, - {"length", 236}, - {"length2d", 237}, - {"lengthsquared", 238}, - {"length2dsquared", 239}, - {"closer", 240}, - {"vectordot", 241}, - {"vectorcross", 242}, - {"axistoangles", 243}, - {"visionsetthermal", 244}, - {"visionsetpain", 245}, - {"startservermigration", 246}, - {"setac130ambience", 247}, - {"getmapcustomfield", 248}, - {"spawnsighttrace", 249}, - {"incrementcounter", 250}, - {"getcountertotal", 251}, - {"createthreatbiasgroup", 258}, - {"threatbiasgroupexists", 259}, - {"getthreatbias", 260}, - {"setthreatbias", 261}, - {"setthreatbiasagainstall", 262}, - {"setignoremegroup", 263}, - {"isenemyteam", 264}, - {"vectornormalize", 271}, - {"vectortoangles", 272}, - {"vectortoyaw", 273}, - {"vectorlerp", 274}, - {"anglestoup", 275}, - {"anglestoright", 276}, - {"anglestoforward", 277}, - {"anglesdelta", 278}, - {"combineangles", 279}, - {"transformmove", 280}, - {"rotatevector", 281}, - {"rotatepointaroundvector", 282}, - {"issubstr", 283}, - {"isendstr", 284}, - {"getsubstr", 285}, - {"tolower", 286}, - {"strtok", 287}, - {"stricmp", 288}, - {"ambientplay", 289}, - {"getuavstrengthmax", 290}, - {"getuavstrengthlevelneutral", 291}, - {"getuavstrengthlevelshowenemyfastsweep", 292}, - {"getuavstrengthlevelshowenemydirectional", 293}, - {"blockteamradar", 294}, - {"unblockteamradar", 295}, - {"isteamradarblocked", 296}, - {"sub_140328710", 297}, - {"setmatchdata", 298}, - {"getmatchdata", 299}, - {"sendmatchdata", 300}, - {"clearmatchdata", 301}, - {"setmatchdatadef", 302}, - {"setmatchclientip", 303}, - {"setmatchdataid", 304}, - {"setclientmatchdata", 305}, - {"getclientmatchdata", 306}, - {"setclientmatchdatadef", 307}, - {"sendclientmatchdata", 308}, - {"getbuildversion", 309}, - {"getbuildnumber", 310}, - {"getsystemtime", 311}, - {"getmatchrulesdata", 312}, - {"isusingmatchrulesdata", 313}, - {"kickplayer", 314}, - {"issplitscreen", 315}, - {"setmapcenter", 316}, - {"setgameendtime", 317}, - {"visionsetnaked", 318}, - {"visionsetnight", 319}, - {"visionsetmissilecam", 320}, - {"ambientstop", 321}, - {"precachemodel", 322}, - {"precacheshellshock", 323}, - {"precacheitem", 324}, - {"precachematerial", 325}, - {"precachestring", 326}, - {"precachemenu", 327}, - {"precacherumble", 328}, - {"precachelocationselector", 329}, - {"precacheleaderboards", 330}, - {"loadfx", 331}, - {"playfx", 332}, - {"playfxontag", 333}, - {"stopfxontag", 334}, - {"killfxontag", 335}, - {"playloopedfx", 336}, - {"spawnfx", 337}, - {"triggerfx", 338}, - {"playfxontagforclients", 339}, - {"sub_1403326a0", 340}, - {"sub_14031be80", 341}, - {"setwinningteam", 342}, - {"announcement", 343}, - {"clientannouncement", 344}, - {"setteammode", 345}, - {"getteamscore", 346}, - {"setteamscore", 347}, - {"setclientnamemode", 348}, - {"updateclientnames", 349}, - {"getteamplayersalive", 350}, - {"worldentnumber", 352}, - {"obituary", 353}, - {"positionwouldtelefrag", 354}, - {"canspawn", 355}, - {"getstarttime", 356}, - {"precacheheadicon", 357}, - {"precacheminimapicon", 358}, - {"precachempanim", 359}, - {"maprestart", 360}, - {"exitlevel", 361}, - {"addtestclient", 362}, - {"addagent", 363}, - {"allclientsprint", 365}, - {"clientprint", 366}, - {"mapexists", 367}, - {"isvalidgametype", 368}, - {"setplayerteamrank", 370}, - {"setteamradar", 372}, - {"getteamradar", 373}, - {"setteamradarstrength", 374}, - {"getteamradarstrength", 375}, - {"getuavstrengthmin", 376}, - {"physicsexplosionsphere", 377}, - {"physicsexplosioncylinder", 378}, - {"physicsradiusjolt", 379}, - {"physicsradiusjitter", 380}, - {"setexpfog", 381}, - {"setexpfogext", 382}, - {"setexpfogdvarsonly", 383}, - {"setexpfogextdvarsonly", 384}, - {"setatmosfog", 385}, - {"setatmosfogdvarsonly", 386}, - {"isexplosivedamagemod", 387}, - {"radiusdamage", 388}, - {"setplayerignoreradiusdamage", 389}, - {"glassradiusdamage", 390}, - {"earthquake", 391}, - {"getnumparts", 392}, - {"objective_onentity", 393}, - {"objective_onentitywithrotation", 394}, - {"objective_team", 395}, - {"objective_player", 396}, - {"objective_playerteam", 397}, - {"objective_playerenemyteam", 398}, - {"objective_playermask_hidefromall", 399}, - {"objective_playermask_hidefrom", 400}, - {"objective_playermask_showtoall", 401}, - {"objective_playermask_showto", 402}, - {"iprintln", 403}, - {"iprintlnbold", 404}, - {"getent", 406}, - {"getentarray", 407}, - {"getspawnarray", 408}, - {"spawnplane", 409}, - {"addstruct", 410}, - {"spawnhelicopter", 411}, - {"isalive", 412}, - {"isspawner", 413}, - {"missilecreateattractorent", 414}, - {"missilecreateattractororigin", 415}, - {"missilecreaterepulsorent", 416}, - {"missilecreaterepulsororigin", 417}, - {"missiledeleteattractor", 418}, - {"playsoundatpos", 419}, - {"newhudelem", 420}, - {"newclienthudelem", 421}, - {"newteamhudelem", 422}, - {"resettimeout", 423}, - {"isplayer", 424}, - {"isplayernumber", 425}, - {"getpartname", 426}, - {"weaponfiretime", 427}, - {"weaponclipsize", 428}, - {"weaponisauto", 429}, - {"weaponissemiauto", 430}, - {"weaponisboltaction", 431}, - {"weaponinheritsperks", 432}, - {"weaponburstcount", 433}, - {"weapontype", 434}, - {"weaponclass", 435}, - {"getnextarraykey", 436}, - {"sortbydistance", 437}, - {"tablelookup", 438}, - {"tablelookupbyrow", 439}, - {"tablelookupistring", 440}, - {"tablelookupistringbyrow", 441}, - {"tablelookuprownum", 442}, - {"tableexists", 443}, - {"getmissileowner", 444}, - {"magicbullet", 445}, - {"getweaponflashtagname", 446}, - {"averagepoint", 447}, - {"averagenormal", 448}, - {"getspawnerarray", 449}, - {"playrumbleonposition", 450}, - {"playrumblelooponposition", 451}, - {"stopallrumbles", 452}, - {"soundexists", 453}, - {"setminimap", 460}, - {"setthermalbodymaterial", 461}, - {"getarraykeys", 462}, - {"getfirstarraykey", 463}, - {"getglass", 464}, - {"getglassarray", 465}, - {"getglassorigin", 466}, - {"isglassdestroyed", 467}, - {"destroyglass", 468}, - {"deleteglass", 469}, - {"getentchannelscount", 470}, - {"getentchannelname", 471}, - {"objective_add", 472}, - {"objective_delete", 473}, - {"objective_state", 474}, - {"objective_icon", 475}, - {"objective_position", 476}, - {"objective_current", 477}, - {"weaponinventorytype", 478}, - {"weaponstartammo", 479}, - {"weaponmaxammo", 480}, - {"weaponaltweaponname", 481}, - {"isweaponcliponly", 482}, - {"sub_14030dfc0", 483}, - {"sub_14030e400", 484}, - {"weaponhasthermalscope", 485}, - {"getvehiclenode", 486}, - {"getvehiclenodearray", 487}, - {"getallvehiclenodes", 488}, - {"getactivecount", 489}, - {"precache", 490}, - {"spawnvehicle", 491}, - {"getarray", 492}, - {"pow", 493}, - {"atan2", 494}, - {"botgetmemoryevents", 495}, - {"botautoconnectenabled", 496}, - {"botzonegetcount", 497}, - {"botzonesetteam", 498}, - {"botzonenearestcount", 499}, - {"botmemoryflags", 500}, - {"botflagmemoryevents", 501}, - {"botzonegetindoorpercent", 502}, - {"botsentientswap", 503}, - {"isbot", 504}, - {"isagent", 505}, - {"getmaxagents", 506}, - {"botgetclosestnavigablepoint", 508}, - {"getnodesintrigger", 509}, - {"nodesvisible", 510}, - {"getnodesonpath", 511}, - {"getzonecount", 512}, - {"getzonenearest", 513}, - {"getzonenodes", 514}, - {"getzonepath", 515}, - {"getzoneorigin", 516}, - {"getnodezone", 517}, - {"getzonenodesbydist", 518}, - {"getzonenodeforindex", 519}, - {"getweaponexplosionradius", 520}, - {"nodeexposedtosky", 523}, - {"findentrances", 524}, - {"badplace_global", 525}, - {"getpathdist", 526}, - {"getlinkednodes", 527}, - {"disconnectnodepair", 528}, - {"connectnodepair", 529}, - {"precachesound", 533}, - {"distance2dsquared", 543}, - {"getangledelta3d", 544}, - {"activateclientexploder", 545}, - {"trajectorycalculateinitialvelocity", 546}, - {"trajectorycalculateminimumvelocity", 547}, - {"trajectorycalculateexitangle", 548}, - {"trajectoryestimatedesiredinairtime", 549}, - {"trajectorycomputedeltaheightattime", 550}, - {"trajectorycanattemptaccuratejump", 551}, - {"ispointinvolume", 553}, - {"getscriptablearray", 560}, - {"clearfog", 561}, - {"setleveldopplerpreset", 562}, - {"isusinghdr", 564}, - {"sub_140321c40", 565}, - {"sub_140311a40", 567}, - {"sub_14030ec50", 568}, - {"sub_14030f050", 569}, - {"sub_14030f340", 570}, - {"sub_14030f550", 571}, - {"sub_14030f710", 572}, - {"sub_1403295e0", 573}, - {"sub_140322690", 574}, - {"sub_140329600", 575}, - {"sub_14031a690", 580}, - {"sub_1403163c0", 581}, - {"anglestoaxis", 582}, - {"invertangles", 587}, - {"rotatevectorinverted", 588}, - {"calculatestartorientation", 589}, - {"droptoground", 590}, - {"precachelaser", 592}, - {"getcsplinecount", 593}, - {"getcsplinepointcount", 594}, - {"getcsplinelength", 595}, - {"getcsplinepointid", 596}, - {"getcsplinepointlabel", 597}, - {"getcsplinepointtension", 598}, - {"getcsplinepointposition", 599}, - {"getcsplinepointcorridordims", 600}, - {"getcsplinepointtangent", 601}, - {"getcsplinepointdisttonextpoint", 602}, - {"calccsplineposition", 603}, - {"calccsplinetangent", 604}, - {"calccsplinecorridor", 605}, - {"setnojipscore", 606}, - {"setnojiptime", 607}, - {"getpredictedentityposition", 608}, - {"queuedialog", 615}, - {"triggerportableradarping", 622}, - {"botgetteamlimit", 624}, - {"spawnfxforclient", 625}, - {"botgetteamdifficulty", 626}, - {"loadluifile", 632}, - {"isdedicatedserver", 633}, - {"getplaylistversion", 634}, - {"getplaylistid", 635}, - {"getactiveclientcount", 636}, - {"issquadsmode", 637}, - {"visionsetpostapply", 639}, - {"addbot", 640}, - {"sub_140310ec0", 641}, - {"sub_14031bae0", 642}, - {"sub_14031c2b0", 643}, - {"isalliedsentient", 644}, - {"istestclient", 645}, - {"sub_1402d2850", 646}, - {"sub_140311ff0", 648}, - {"sub_140312040", 649}, - {"sub_140311100", 651}, - {"sub_140314c70", 652}, - {"sub_14030d340", 653}, - {"sub_14030da60", 654}, - {"sub_14030e5c0", 655}, - {"sub_14031fda0", 657}, - {"sub_140317140", 658}, - {"isremovedentity", 659}, - {"tablegetrowcount", 660}, - {"tablegetcolumncount", 661}, - {"batteryusepershot", 662}, - {"batteryreqtouse", 663}, - {"sub_14030e700", 664}, - {"getentityweaponname", 666}, - {"sub_14031fc20", 667}, - {"deployriotshield", 668}, - {"validatecostume", 669}, - {"randomcostume", 670}, - {"shootblank", 671}, - {"debugstringtostring", 673}, - {"sub_140319680", 675}, - {"playcinematicforall", 679}, - {"preloadcinematicforall", 680}, - {"stopcinematicforall", 681}, - {"capsuletracepassed", 682}, - {"sub_14031ca40", 683}, - {"sub_14031e1f0", 684}, - {"sub_140321880", 685}, - {"lootservicestarttrackingplaytime", 687}, - {"sub_1403297b0", 688}, - {"lootservicevalidateplaytime", 689}, - {"recordbreadcrumbdataforplayer", 690}, - {"sub_140317df0", 691}, - {"sysprint", 693}, - {"sub_140337920", 694}, - {"sub_140321ae0", 697}, - {"isonlinegame", 698}, - {"issystemlink", 699}, - {"getstanceandmotionstateforplayer", 701}, - {"sub_1402d3540", 702}, - {"sub_1402d35b0", 703}, - {"sub_140332a70", 704}, - {"sub_140332ae0", 705}, - {"getplaylistname", 706}, - {"getlocaltime", 707}, - {"sub_14032c820", 708}, - {"getchallengeid", 710}, - {"nodegetremotemissilename", 711}, - {"nodehasremotemissileset", 712}, - {"remotemissileenttracetooriginpassed", 713}, - {"bombingruntracepassed", 714}, - {"handlepickupdeployedriotshield", 716}, - {"sub_14032c6b0", 717}, - {"getcostumefromtable", 718}, - {"sub_1402d3460", 720}, - {"getchallenerewarditem", 722}, - {"setentplayerxuidforemblem", 723}, - {"resetentplayerxuidforemblems", 724}, - {"nodesetremotemissilename", 725}, - {"sub_14031aa80", 726}, - {"sub_14031ead0", 727}, - {"iszombie", 728}, - {"sub_14031b670", 729}, - {"sub_14031d3f0", 730}, - {"sub_14031e670", 731}, - {"getactiveplayerlist", 732}, - {"sub_140319200", 733}, - {"sub_140331e00", 734}, - }; - - std::unordered_map method_map = - { - {"thermaldrawdisable", 32768}, - {"heli_setdamagestage", 32770}, - {"playsoundtoteam", 32771}, - {"playsoundtoplayer", 32772}, - {"playerhide", 32773}, - {"playershow", 32774}, - {"showtoplayer", 32775}, - {"threatdetectedtoplayer", 32776}, - {"clearthreatdetected", 32777}, - {"enableplayeruse", 32778}, - {"disableplayeruse", 32779}, - {"enableammogeneration", 32780}, - {"disableammogeneration", 32781}, - {"makescrambler", 32782}, - {"makeportableradar", 32783}, - {"clearscrambler", 32784}, - {"clearportableradar", 32785}, - {"placespawnpoint", 32786}, - {"setteamfortrigger", 32787}, - {"clientclaimtrigger", 32788}, - {"clientreleasetrigger", 32789}, - {"releaseclaimedtrigger", 32790}, - {"isusingonlinedataoffline", 32791}, - {"getrestedtime", 32792}, - {"sendleaderboards", 32793}, - {"isonladder", 32794}, - {"getcorpseanim", 32795}, - {"playerforcedeathanim", 32796}, - {"attach", 32797}, - {"startragdoll", 32803}, - {"thermaldrawenable", 32809}, - {"detach", 32810}, - {"detachall", 32811}, - {"getattachsize", 32812}, - {"getattachmodelname", 32813}, - {"getattachtagname", 32814}, - {"gethighestnodestance", 32820}, - {"doesnodeallowstance", 32821}, - {"getlightcolor", 32835}, - {"setlightcolor", 32836}, - {"getattachignorecollision", 32839}, - {"hidepart", 32840}, - {"hidepartallinstances", 32841}, - {"hideallparts", 32842}, - {"showpart", 32843}, - {"showallparts", 32844}, - {"linkto", 32845}, - {"linktoblendtotag", 32846}, - {"unlink", 32847}, - {"setnormalhealth", 32848}, - {"dodamage", 32849}, - {"show", 32851}, - {"hide", 32852}, - {"disconnectpaths", 32855}, - {"connectpaths", 32856}, - {"disconnectnode", 32857}, - {"connectnode", 32858}, - {"digitaldistortsetparams", 32868}, - {"setmode", 32869}, - {"getmode", 32870}, - {"islinked", 32872}, - {"enablelinkto", 32873}, - {"setpitch", 32876}, - {"scalepitch", 32877}, - {"setvolume", 32878}, - {"scalevolume", 32879}, - {"playsound", 32884}, - {"playloopsound", 32885}, - {"getnormalhealth", 32891}, - {"playerlinkto", 32892}, - {"playerlinktodelta", 32893}, - {"playerlinkweaponviewtodelta", 32894}, - {"playerlinktoabsolute", 32895}, - {"playerlinktoblend", 32896}, - {"playerlinkedoffsetenable", 32897}, - {"setwaypointedgestyle_secondaryarrow", 32898}, - {"setwaypointiconoffscreenonly", 32899}, - {"fadeovertime", 32900}, - {"scaleovertime", 32901}, - {"moveovertime", 32902}, - {"reset", 32903}, - {"destroy", 32904}, - {"setpulsefx", 32905}, - {"setplayernamestring", 32906}, - {"changefontscaleovertime", 32907}, - {"playersetgroundreferenceent", 32913}, - {"dontinterpolate", 32914}, - {"getorigin", 32917}, - {"useby", 32921}, - {"playsoundasmaster", 32922}, - {"playerlinkedoffsetdisable", 32927}, - {"playerlinkedsetviewznear", 32928}, - {"playerlinkedsetusebaseangleforviewclamp", 32929}, - {"lerpviewangleclamp", 32930}, - {"geteye", 32936}, - {"istouching", 32937}, - {"getistouchingentities", 32938}, - {"stoploopsound", 32939}, - {"stopsounds", 32940}, - {"playrumbleonentity", 32941}, - {"playrumblelooponentity", 32942}, - {"stoprumble", 32943}, - {"delete", 32944}, - {"setmodel", 32945}, - {"laseron", 32946}, - {"laseroff", 32947}, - {"thermalvisionon", 32950}, - {"thermalvisionoff", 32951}, - {"thermalvisionfofoverlayon", 32952}, - {"thermalvisionfofoverlayoff", 32953}, - {"autospotoverlayon", 32954}, - {"autospotoverlayoff", 32955}, - {"seteyesonuplinkenabled", 32956}, - {"setcontents", 32958}, - {"makeusable", 32959}, - {"makeunusable", 32960}, - {"makeglobalusable", 32961}, - {"makeglobalunusable", 32962}, - {"settext", 32970}, - {"setmaterial", 32972}, - {"settargetent", 32973}, - {"cleartargetent", 32974}, - {"settimer", 32975}, - {"settimerup", 32976}, - {"settimerstatic", 32977}, - {"settenthstimer", 32978}, - {"settenthstimerup", 32979}, - {"settenthstimerstatic", 32980}, - {"setclock", 32981}, - {"setclockup", 32982}, - {"setvalue", 32983}, - {"setwaypoint", 32984}, - {"setwaypointedgestyle_rotatingicon", 32985}, - {"setcursorhint", 32986}, - {"sethintstring", 32987}, - {"setsecondaryhintstring", 32988}, - {"forceusehinton", 32989}, - {"forceusehintoff", 32990}, - {"makesoft", 32991}, - {"makehard", 32992}, - {"entitywillneverchange", 32993}, - {"startfiring", 32994}, - {"stopfiring", 32995}, - {"isfiringturret", 32996}, - {"startbarrelspin", 32997}, - {"stopbarrelspin", 32998}, - {"getbarrelspinrate", 32999}, - {"remotecontrolturret", 33000}, - {"remotecontrolturretoff", 33001}, - {"shootturret", 33002}, - {"getturretowner", 33003}, - {"giveachievement", 33017}, - {"sub_1402ddb00", 33022}, - {"sub_1402ddcc0", 33023}, - {"setsentryowner", 33027}, - {"setsentrycarrier", 33028}, - {"setturretminimapvisible", 33029}, - {"settargetentity", 33030}, - {"snaptotargetentity", 33031}, - {"cleartargetentity", 33032}, - {"getturrettarget", 33033}, - {"setplayerspread", 33034}, - {"setaispread", 33035}, - {"setsuppressiontime", 33036}, - {"allowstand", 33048}, - {"allowcrouch", 33049}, - {"allowprone", 33050}, - {"sub_1402dd9e0", 33051}, - {"isthrowinggrenade", 33068}, - {"isfiring", 33069}, - {"ismeleeing", 33070}, - {"allowmelee", 33072}, - {"allowfire", 33073}, - {"setconvergencetime", 33075}, - {"setconvergenceheightpercent", 33076}, - {"setturretteam", 33077}, - {"maketurretsolid", 33078}, - {"maketurretoperable", 33079}, - {"maketurretinoperable", 33080}, - {"makeentitysentient", 33081}, - {"freeentitysentient", 33082}, - {"setrightarc", 33109}, - {"setleftarc", 33110}, - {"settoparc", 33111}, - {"setbottomarc", 33112}, - {"setautorotationdelay", 33113}, - {"setdefaultdroppitch", 33114}, - {"restoredefaultdroppitch", 33115}, - {"turretfiredisable", 33116}, - {"getenemyinfo", 33125}, - {"getenemysqdist", 33141}, - {"getclosestenemysqdist", 33142}, - {"setthreatbiasgroup", 33143}, - {"getthreatbiasgroup", 33144}, - {"turretfireenable", 33145}, - {"setturretmodechangewait", 33146}, - {"usetriggerrequirelookat", 33147}, - {"getstance", 33148}, - {"setstance", 33149}, - {"itemweaponsetammo", 33150}, - {"getammocount", 33151}, - {"gettagorigin", 33152}, - {"gettagangles", 33153}, - {"shellshock", 33154}, - {"stunplayer", 33155}, - {"stopshellshock", 33156}, - {"fadeoutshellshock", 33157}, - {"setdepthoffield", 33158}, - {"setviewmodeldepthoffield", 33159}, - {"setmotionblurmovescale", 33160}, - {"getnegotiationstartnode", 33181}, - {"getnegotiationendnode", 33182}, - {"getnegotiationnextnode", 33183}, - {"setmotionblurturnscale", 33197}, - {"setmotionblurzoomscale", 33198}, - {"viewkick", 33199}, - {"localtoworldcoords", 33200}, - {"getentitynumber", 33201}, - {"getentityvelocity", 33202}, - {"enablegrenadetouchdamage", 33203}, - {"disablegrenadetouchdamage", 33204}, - {"enableaimassist", 33205}, - {"lastknowntime", 33216}, - {"lastknownpos", 33217}, - {"disableaimassist", 33236}, - {"entityradiusdamage", 33237}, - {"detonate", 33238}, - {"damageconetrace", 33239}, - {"sightconetrace", 33240}, - {"missilesettargetent", 33241}, - {"missilesettargetpos", 33242}, - {"missilecleartarget", 33243}, - {"missilesetflightmodedirect", 33244}, - {"missilesetflightmodetop", 33245}, - {"getlightintensity", 33246}, - {"setlightintensity", 33247}, - {"isragdoll", 33248}, - {"setmovespeedscale", 33249}, - {"cameralinkto", 33250}, - {"cameraunlink", 33251}, - {"controlslinkto", 33280}, - {"controlsunlink", 33281}, - {"makevehiclesolidcapsule", 33282}, - {"makevehiclesolidsphere", 33284}, - {"remotecontrolvehicle", 33286}, - {"remotecontrolvehicleoff", 33287}, - {"isfiringvehicleturret", 33288}, - {"remotecontrolvehicletarget", 33289}, - {"remotecontrolvehicletargetoff", 33290}, - {"drivevehicleandcontrolturret", 33291}, - {"drivevehicleandcontrolturretoff", 33292}, - {"getplayersetting", 33293}, - {"getlocalplayerprofiledata", 33294}, - {"setlocalplayerprofiledata", 33295}, - {"remotecamerasoundscapeon", 33296}, - {"remotecamerasoundscapeoff", 33297}, - {"setmotiontrackervisible", 33298}, - {"getmotiontrackervisible", 33299}, - {"worldpointinreticle_circle", 33300}, - {"worldpointinreticle_rect", 33301}, - {"getpointinbounds", 33302}, - {"transfermarkstonewscriptmodel", 33303}, - {"setwatersheeting", 33304}, - {"setweaponhudiconoverride", 33307}, - {"getweaponhudiconoverride", 33308}, - {"setempjammed", 33309}, - {"playersetexpfogext", 33310}, - {"playersetexpfog", 33311}, - {"playersetatmosfog", 33312}, - {"isitemunlocked", 33313}, - {"getplayerdata", 33314}, - {"getrankedplayerdata", 33315}, - {"getprivateplayerdata", 33316}, - {"getcoopplayerdata", 33317}, - {"getcommonplayerdata", 33318}, - {"vehicleturretcontroloff", 33319}, - {"isturretready", 33320}, - {"vehicledriveto", 33321}, - {"dospawn", 33322}, - {"isphysveh", 33323}, - {"crash", 33324}, - {"launch", 33325}, - {"disablecrashing", 33326}, - {"enablecrashing", 33327}, - {"setphysvehspeed", 33328}, - {"setconveyorbelt", 33329}, - {"freevehicle", 33330}, - {"setplayerdata", 33347}, - {"setrankedplayerdata", 33348}, - {"setprivateplayerdata", 33349}, - {"setcoopplayerdata", 33350}, - {"setcommonplayerdata", 33351}, - {"getcacplayerdata", 33352}, - {"setcacplayerdata", 33353}, - {"trackerupdate", 33354}, - {"pingplayer", 33355}, - {"buttonpressed", 33356}, - {"sayall", 33357}, - {"sayteam", 33358}, - {"setspawnweapon", 33359}, - {"dropitem", 33360}, - {"dropscavengerbag", 33361}, - {"setjitterparams", 33362}, - {"sethoverparams", 33363}, - {"joltbody", 33364}, - {"getwheelsurface", 33366}, - {"getvehicleowner", 33367}, - {"setvehiclelookattext", 33368}, - {"setvehicleteam", 33369}, - {"neargoalnotifydist", 33370}, - {"setvehgoalpos", 33371}, - {"setgoalyaw", 33372}, - {"cleargoalyaw", 33373}, - {"settargetyaw", 33374}, - {"cleartargetyaw", 33375}, - {"helisetgoal", 33376}, - {"setturrettargetvec", 33377}, - {"setturrettargetent", 33378}, - {"clearturrettargetent", 33379}, - {"canturrettargetpoint", 33380}, - {"setlookatent", 33381}, - {"clearlookatent", 33382}, - {"setweapon", 33383}, - {"fireweapon", 33384}, - {"vehicleturretcontrolon", 33385}, - {"finishplayerdamage", 33386}, - {"suicide", 33387}, - {"closeingamemenu", 33388}, - {"iclientprintln", 33389}, - {"iclientprintlnbold", 33390}, - {"spawn", 33391}, - {"setentertime", 33392}, - {"cloneplayer", 33393}, - {"istalking", 33394}, - {"allowspectateteam", 33395}, - {"forcespectatepov", 33396}, - {"getguid", 33397}, - {"physicslaunchserver", 33398}, - {"physicslaunchserveritem", 33399}, - {"clonebrushmodeltoscriptmodel", 33400}, - {"scriptmodelplayanim", 33401}, - {"scriptmodelclearanim", 33402}, - {"scriptmodelplayanimdeltamotion", 33403}, - {"teleport", 33404}, - {"attachpath", 33405}, - {"getattachpos", 33406}, - {"startpath", 33407}, - {"setswitchnode", 33408}, - {"setwaitspeed", 33409}, - {"finishdamage", 33410}, - {"setspeed", 33411}, - {"setspeedimmediate", 33412}, - {"rotatevehyaw", 33413}, - {"getspeed", 33414}, - {"getvehvelocity", 33415}, - {"getbodyvelocity", 33416}, - {"getsteering", 33417}, - {"getthrottle", 33418}, - {"turnengineoff", 33419}, - {"turnengineon", 33420}, - {"getgoalspeedmph", 33422}, - {"setacceleration", 33423}, - {"setdeceleration", 33424}, - {"resumespeed", 33425}, - {"setyawspeed", 33426}, - {"setyawspeedbyname", 33427}, - {"setmaxpitchroll", 33428}, - {"setairresitance", 33429}, - {"setturningability", 33430}, - {"getxuid", 33431}, - {"getucdidhigh", 33432}, - {"getucdidlow", 33433}, - {"getclanidhigh", 33434}, - {"getclanidlow", 33435}, - {"ishost", 33436}, - {"getspectatingplayer", 33437}, - {"predictstreampos", 33438}, - {"setrank", 33441}, - {"weaponlocknoclearance", 33443}, - {"visionsyncwithplayer", 33444}, - {"showhudsplash", 33445}, - {"setperk", 33446}, - {"hasperk", 33447}, - {"clearperks", 33448}, - {"unsetperk", 33449}, - {"registerparty", 33450}, - {"getfireteammembers", 33451}, - {"moveto", 33454}, - {"movex", 33455}, - {"movey", 33456}, - {"movez", 33457}, - {"gravitymove", 33458}, - {"moveslide", 33459}, - {"stopmoveslide", 33460}, - {"rotateto", 33461}, - {"rotatepitch", 33462}, - {"rotateyaw", 33463}, - {"rotateroll", 33464}, - {"addpitch", 33465}, - {"addyaw", 33466}, - {"addroll", 33467}, - {"vibrate", 33468}, - {"rotatevelocity", 33469}, - {"solid", 33470}, - {"notsolid", 33471}, - {"setcandamage", 33472}, - {"setcanradiusdamage", 33473}, - {"physicslaunchclient", 33474}, - {"setcarddisplayslot", 33477}, - {"kc_regweaponforfxremoval", 33478}, - {"laststandrevive", 33479}, - {"laststand", 33480}, - {"setspectatedefaults", 33481}, - {"getthirdpersoncrosshairoffset", 33482}, - {"disableweaponpickup", 33483}, - {"enableweaponpickup", 33484}, - {"issplitscreenplayer", 33485}, - {"getweaponslistoffhands", 33486}, - {"getweaponslistitems", 33487}, - {"getweaponslistexclusives", 33488}, - {"getweaponslist", 33489}, - {"canplayerplacesentry", 33490}, - {"canplayerplacetank", 33491}, - {"visionsetnakedforplayer", 33492}, - {"visionsetnightforplayer", 33493}, - {"visionsetmissilecamforplayer", 33494}, - {"visionsetthermalforplayer", 33495}, - {"visionsetpainforplayer", 33496}, - {"setblurforplayer", 33497}, - {"getplayerweaponmodel", 33498}, - {"getplayerknifemodel", 33499}, - {"notifyonplayercommand", 33501}, - {"canmantle", 33502}, - {"forcemantle", 33503}, - {"ismantling", 33504}, - {"playfx", 33505}, - {"playerrecoilscaleon", 33506}, - {"playerrecoilscaleoff", 33507}, - {"weaponlockstart", 33508}, - {"weaponlockfinalize", 33509}, - {"weaponlockfree", 33510}, - {"weaponlocktargettooclose", 33511}, - {"issplitscreenplayerprimary", 33512}, - {"markforeyeson", 33513}, - {"issighted", 33514}, - {"getsightedplayers", 33515}, - {"getplayerssightingme", 33516}, - {"getviewmodel", 33517}, - {"fragbuttonpressed", 33518}, - {"secondaryoffhandbuttonpressed", 33519}, - {"getcurrentweaponclipammo", 33520}, - {"setvelocity", 33521}, - {"getviewheight", 33522}, - {"getnormalizedmovement", 33523}, - {"playlocalsound", 33524}, - {"stoplocalsound", 33525}, - {"setweaponammoclip", 33526}, - {"setweaponammostock", 33527}, - {"getweaponammoclip", 33528}, - {"getweaponammostock", 33529}, - {"anyammoforweaponmodes", 33530}, - {"setclientomnvar", 33531}, - {"setclientdvar", 33532}, - {"setclientdvars", 33533}, - {"setclientspawnsighttraces", 33534}, - {"clientspawnsighttracepassed", 33535}, - {"allowads", 33536}, - {"allowjump", 33537}, - {"allowladder", 33538}, - {"allowmantle", 33539}, - {"allowsprint", 33540}, - {"setspreadoverride", 33541}, - {"resetspreadoverride", 33542}, - {"setaimspreadmovementscale", 33543}, - {"setactionslot", 33544}, - {"setviewkickscale", 33545}, - {"getviewkickscale", 33546}, - {"getweaponslistall", 33547}, - {"getweaponslistprimaries", 33548}, - {"getnormalizedcameramovement", 33549}, - {"giveweapon", 33550}, - {"takeweapon", 33551}, - {"takeallweapons", 33552}, - {"getcurrentweapon", 33553}, - {"getcurrentprimaryweapon", 33554}, - {"getcurrentoffhand", 33555}, - {"hasweapon", 33556}, - {"switchtoweapon", 33557}, - {"switchtoweaponimmediate", 33558}, - {"sub_1402e1d60", 33559}, - {"switchtooffhand", 33560}, - {"setoffhandsecondaryclass", 33561}, - {"getoffhandsecondaryclass", 33562}, - {"beginlocationselection", 33563}, - {"endlocationselection", 33564}, - {"disableweapons", 33565}, - {"enableweapons", 33566}, - {"disableoffhandweapons", 33567}, - {"enableoffhandweapons", 33568}, - {"disableweaponswitch", 33569}, - {"enableweaponswitch", 33570}, - {"openpopupmenu", 33571}, - {"openpopupmenunomouse", 33572}, - {"closepopupmenu", 33573}, - {"openmenu", 33574}, - {"closemenu", 33575}, - {"freezecontrols", 33577}, - {"disableusability", 33578}, - {"enableusability", 33579}, - {"setwhizbyspreads", 33580}, - {"setwhizbyradii", 33581}, - {"setchannelvolume", 33584}, - {"givestartammo", 33585}, - {"givemaxammo", 33586}, - {"getfractionstartammo", 33587}, - {"getfractionmaxammo", 33588}, - {"isdualwielding", 33589}, - {"isreloading", 33590}, - {"isswitchingweapon", 33591}, - {"setorigin", 33592}, - {"getvelocity", 33593}, - {"setangles", 33594}, - {"getangles", 33595}, - {"usebuttonpressed", 33596}, - {"attackbuttonpressed", 33597}, - {"adsbuttonpressed", 33598}, - {"meleebuttonpressed", 33599}, - {"playerads", 33600}, - {"isonground", 33601}, - {"isusingturret", 33602}, - {"setviewmodel", 33603}, - {"setoffhandprimaryclass", 33604}, - {"getoffhandprimaryclass", 33605}, - {"sub_14032dff0", 33610}, - {"sub_14032e040", 33611}, - {"enablemousesteer", 33612}, - {"setscriptmoverkillcam", 33613}, - {"usinggamepad", 33614}, - {"forcethirdpersonwhenfollowing", 33615}, - {"disableforcethirdpersonwhenfollowing", 33616}, - {"botsetflag", 33617}, - {"botsetstance", 33618}, - {"botsetscriptmove", 33619}, - {"botsetscriptgoal", 33620}, - {"botsetscriptgoalnode", 33621}, - {"botclearscriptgoal", 33622}, - {"botsetscriptenemy", 33623}, - {"botclearscriptenemy", 33624}, - {"botsetattacker", 33625}, - {"botgetscriptgoal", 33626}, - {"botgetscriptgoalradius", 33627}, - {"botgetscriptgoalyaw", 33628}, - {"botgetscriptgoaltype", 33629}, - {"botgetworldsize", 33631}, - {"botnodeavailable", 33632}, - {"botfindnoderandom", 33633}, - {"botmemoryevent", 33634}, - {"botnodepick", 33636}, - {"bothasscriptgoal", 33637}, - {"botgetpersonality", 33638}, - {"botthrowgrenade", 33639}, - {"botsetpersonality", 33641}, - {"botsetdifficulty", 33642}, - {"botgetdifficulty", 33643}, - {"botgetworldclosestedge", 33644}, - {"botlookatpoint", 33645}, - {"botpredictseepoint", 33646}, - {"botcanseeentity", 33647}, - {"botgetnodesonpath", 33648}, - {"botnodepickmultiple", 33649}, - {"botgetfovdot", 33651}, - {"botsetawareness", 33652}, - {"botpursuingscriptgoal", 33653}, - {"botgetscriptgoalnode", 33654}, - {"botgetimperfectenemyinfo", 33655}, - {"botsetpathingstyle", 33657}, - {"botsetdifficultysetting", 33658}, - {"botgetdifficultysetting", 33659}, - {"botgetpathdist", 33660}, - {"botisrandomized", 33661}, - {"botpressbutton", 33662}, - {"botclearbutton", 33663}, - {"botnodescoremultiple", 33664}, - {"getnodenumber", 33665}, - {"setclientowner", 33666}, - {"setotherent", 33667}, - {"setaisightlinevisible", 33668}, - {"setentityowner", 33669}, - {"nodeisdisconnected", 33670}, - {"getnearestnode", 33671}, - {"makeentitynomeleetarget", 33672}, - {"spawnagent", 33674}, - {"finishagentdamage", 33675}, - {"setagentattacker", 33676}, - {"cloneagent", 33677}, - {"agentcanseesentient", 33678}, - {"setagentwaypoint", 33679}, - {"setgoalpos", 33680}, - {"getgoalpos", 33681}, - {"setgoalnode", 33682}, - {"setgoalentity", 33683}, - {"setgoalradius", 33684}, - {"setanimscale", 33685}, - {"setorientmode", 33686}, - {"setanimmode", 33687}, - {"setphysicsmode", 33688}, - {"setclipmode", 33689}, - {"setmaxturnspeed", 33690}, - {"getmaxturnspeed", 33691}, - {"beginmelee", 33692}, - {"setscripted", 33693}, - {"dotrajectory", 33694}, - {"doanimlerp", 33695}, - {"setviewheight", 33696}, - {"claimnode", 33697}, - {"relinquishclaimednode", 33698}, - {"setradarping", 33699}, - {"visitfxent", 33700}, - {"sub_1402ef480", 33701}, - {"sub_1402ef4e0", 33702}, - {"sub_1402dd560", 33704}, - {"sub_1402dd590", 33705}, - {"allowhighjump", 33714}, - {"isjumping", 33715}, - {"ishighjumping", 33716}, - {"sub_140529a10", 33717}, - {"sub_140529a20", 33718}, - {"getbraggingright", 33719}, - {"getmodelfromentity", 33720}, - {"getweaponheatlevel", 33721}, - {"isweaponoverheated", 33722}, - {"isshiftbuttonpresseddown", 33723}, - {"sub_14052be00", 33724}, - {"sub_14052beb0", 33725}, - {"sub_14052bf30", 33726}, - {"lightsetforplayer", 33728}, - {"lightsetoverrideenableforplayer", 33729}, - {"lightsetoverridedisableforplayer", 33730}, - {"sub_140333c10", 33731}, - {"sub_140043710", 33732}, - {"sub_14052b420", 33733}, - {"sub_1402ddd70", 33734}, - {"setanimclass", 33744}, - {"enableanimstate", 33745}, - {"setanimstate", 33746}, - {"getanimentry", 33747}, - {"getanimentryname", 33748}, - {"getanimentryalias", 33749}, - {"getanimentrycount", 33750}, - {"issprinting", 33752}, - {"jumpbuttonpressed", 33758}, - {"rotateby", 33759}, - {"getlookaheaddir", 33760}, - {"getpathgoalpos", 33761}, - {"sub_140316940", 33762}, - {"setcorpsefalling", 33763}, - {"setsurfacetype", 33764}, - {"aiphysicstrace", 33765}, - {"aiphysicstracepassed", 33766}, - {"visionsetstage", 33770}, - {"linkwaypointtotargetwithoffset", 33771}, - {"getlinkedparent", 33772}, - {"getmovingplatformparent", 33773}, - {"setnameplatematerial", 33774}, - {"sub_140313d20", 33777}, - {"sub_1403131d0", 33778}, - {"makevehiclenotcollidewithplayers", 33779}, - {"setscriptablepartstate", 33782}, - {"stopsliding", 33783}, - {"sub_140316a60", 33784}, - {"setdronegoalpos", 33785}, - {"hudoutlineenable", 33786}, - {"hudoutlinedisable", 33787}, - {"worldpointtoscreenpos", 33792}, - {"botfirstavailablegrenade", 33795}, - {"emissiveblend", 33801}, - {"sub_1402e66d0", 33804}, - {"sub_1402e66e0", 33805}, - {"sub_1402e66f0", 33806}, - {"physicssetmaxlinvel", 33810}, - {"physicssetmaxangvel", 33811}, - {"physicsgetlinvel", 33812}, - {"physicsgetlinspeed", 33813}, - {"physicsgetangvel", 33814}, - {"physicsgetangspeed", 33815}, - {"disablemissileboosting", 33816}, - {"enablemissileboosting", 33817}, - {"canspawntestclient", 33818}, - {"spawntestclient", 33819}, - {"loadcustomizationplayerview", 33820}, - {"setgrenadethrowscale", 33821}, - {"setgrenadecookscale", 33822}, - {"setplanesplineid", 33823}, - {"hudoutlineenableforclient", 33824}, - {"hudoutlinedisableforclient", 33825}, - {"hudoutlineenableforclients", 33826}, - {"hudoutlinedisableforclients", 33827}, - {"turretsetbarrelspinenabled", 33828}, - {"hasloadedcustomizationplayerview", 33829}, - {"sub_140313420", 33830}, - {"sub_1403136f0", 33831}, - {"doanimrelative", 33832}, - {"getcorpseentity", 33836}, - {"logmatchdatalife", 33838}, - {"logmatchdatadeath", 33839}, - {"queuedialogforplayer", 33840}, - {"setmlgcameradefaults", 33841}, - {"ismlgspectator", 33842}, - {"disableautoreload", 33843}, - {"enableautoreload", 33844}, - {"getlinkedchildren", 33846}, - {"botpredictenemycampspots", 33847}, - {"playsoundonmovingent", 33848}, - {"cancelmantle", 33849}, - {"hasfemalecustomizationmodel", 33850}, - {"sub_1402e6bb0", 33851}, - {"setscriptabledamageowner", 33852}, - {"setfxkilldefondelete", 33853}, - {"sub_1402e1b80", 33856}, - {"sub_140310fb0", 33858}, - {"challengenotification", 33859}, - {"sub_140528300", 33860}, - {"sub_14052bff0", 33861}, - {"linktosynchronizedparent", 33862}, - {"getclientomnvar", 33863}, - {"getcacplayerdataforgroup", 33866}, - {"cloakingenable", 33867}, - {"cloakingdisable", 33868}, - {"getunnormalizedcameramovement", 33869}, - {"sub_14031edf0", 33870}, - {"isturretoverheated", 33871}, - {"sub_14052c170", 33872}, - {"sub_14052c190", 33873}, - {"sub_14052c1b0", 33874}, - {"sub_14052c1d0", 33875}, - {"sub_14052c0b0", 33878}, - {"sub_1402de140", 33879}, - {"getvieworigin", 33884}, - {"setweaponmodelvariant", 33885}, - {"ridevehicle", 33886}, - {"stopridingvehicle", 33887}, - {"autoboltmissileeffects", 33889}, - {"disablemissilestick", 33890}, - {"enablemissilestick", 33891}, - {"setmissileminimapvisible", 33892}, - {"isoffhandweaponreadytothrow", 33893}, - {"makecollidewithitemclip", 33895}, - {"visionsetpostapplyforplayer", 33897}, - {"setlookattarget", 33898}, - {"clearlookattarget", 33899}, - {"sub_14052c250", 33907}, - {"sub_14052c290", 33908}, - {"sub_14052c2f0", 33909}, - {"sub_14052c340", 33910}, - {"sub_14052c360", 33911}, - {"sub_14031c170", 33912}, - {"sub_14031c590", 33913}, - {"setclienttriggervisionset", 33914}, - {"sub_1402e41c0", 33917}, - {"sub_1402e43b0", 33918}, - {"sub_14052b4d0", 33919}, - {"sub_14052b550", 33920}, - {"showviewmodel", 33921}, - {"hideviewmodel", 33922}, - {"setpickupweapon", 33923}, - {"allowpowerslide", 33925}, - {"allowhighjumpdrop", 33926}, - {"sub_1404045e0", 33927}, - {"sub_1405297e0", 33928}, - {"sub_14052c200", 33929}, - {"clearentity", 33930}, - {"sub_140334a40", 33931}, - {"allowdodge", 33933}, - {"sub_140529860", 33934}, - {"setminimapvisible", 33935}, - {"sub_1402e0a90", 33936}, - {"sub_1402e0bc0", 33937}, - {"sub_1402e0cf0", 33938}, - {"setplayermech", 33940}, - {"setdamagecallbackon", 33941}, - {"finishentitydamage", 33942}, - {"designatefoftarget", 33946}, - {"sethintstringvisibleonlytoowner", 33947}, - {"notifyonplayercommandremove", 33948}, - {"sub_1402e3bf0", 33949}, - {"allowboostjump", 33950}, - {"batterydischargebegin", 33951}, - {"batterydischargeend", 33952}, - {"batterydischargeonce", 33953}, - {"batterygetcharge", 33954}, - {"batterysetcharge", 33955}, - {"batteryfullrecharge", 33956}, - {"batterygetsize", 33957}, - {"batterysetdischargescale", 33958}, - {"batterygetdischargerate", 33959}, - {"batteryisinuse", 33960}, - {"enablephysicaldepthoffieldscripting", 33961}, - {"disablephysicaldepthoffieldscripting", 33962}, - {"setphysicaldepthoffield", 33963}, - {"sub_140313860", 33964}, - {"sub_14052a560", 33965}, - {"sub_140321790", 33966}, - {"sub_140321a50", 33967}, - {"sub_1402dda50", 33968}, - {"sub_14052ac50", 33969}, - {"sub_14052ad50", 33970}, - {"setdemigod", 33971}, - {"sub_140310840", 33972}, - {"setcostumemodels", 33978}, - {"sub_140529e00", 33979}, - {"sub_140313510", 33980}, - {"scriptmodelpauseanim", 33981}, - {"digitaldistortsetmaterial", 33982}, - {"disableoffhandsecondaryweapons", 33983}, - {"enableoffhandsecondaryweapons", 33984}, - {"canplaceriotshield", 33985}, - {"setriotshieldfailhint", 33986}, - {"enabledetonate", 33987}, - {"getdetonateenabled", 33988}, - {"playergetuseent", 33989}, - {"refreshshieldmodels", 33990}, - {"sub_14052c3a0", 33991}, - {"locret_140406a70", 33993}, - {"getgravity", 33994}, - {"sub_140529560", 33997}, - {"sub_140529650", 33998}, - {"setcommonplayerdatareservedint", 33999}, - {"getrankedplayerdatareservedint", 34000}, - {"setrankedplayerdatareservedint", 34001}, - {"getcommonplayerdatareservedint", 34002}, - {"sub_1402e8a20", 34003}, - {"sub_14052c3c0", 34004}, - {"addsoundmutedevice", 34005}, - {"removesoundmutedevice", 34006}, - {"clientaddsoundsubmix", 34007}, - {"clientclearsoundsubmix", 34008}, - {"sub_140312520", 34009}, - {"sub_140312ba0", 34010}, - {"sub_140312bf0", 34011}, - {"sub_140312cb0", 34012}, - {"sub_140312df0", 34013}, - {"sub_140312ff0", 34014}, - {"isusingoffhand", 34016}, - {"physicsstop", 34017}, - {"sub_14031b9e0", 34018}, - {"sub_14031e3c0", 34023}, - {"sub_1402ef8a0", 34024}, - {"sub_14052c400", 34025}, - {"initwaterclienttrigger", 34026}, - {"getcurrentweaponmodelname", 34027}, - {"sub_14031f000", 34028}, - {"setignorefoliagesightingme", 34030}, - {"loadcostumemodels", 34031}, - {"sub_14030cd90", 34036}, - {"sub_14030b1c0", 34038}, - {"sub_140322450", 34039}, - {"iscloaked", 34040}, - {"sub_140528bc0", 34041}, - {"sub_140528cf0", 34042}, - {"sub_14031fb80", 34043}, - {"sub_140320180", 34044}, - {"selfieaccessselfievalidflaginplayerdef", 34045}, - {"selfieaccessselfiecustomassetsarestreamed", 34046}, - {"sub_14031ede0", 34048}, - {"selfiescreenshottaken", 34049}, - {"sub_14031f190", 34050}, - {"sub_140319de0", 34052}, - {"setmissilecoasting", 34053}, - {"setmlgspectator", 34054}, - {"gettotalmpxp", 34055}, - {"turretsetgroundaimentity", 34056}, - {"sub_140318610", 34057}, - {"sub_140317760", 34058}, - {"sub_14032e9a0", 34059}, - {"sub_140320830", 34060}, - {"sub_140329bc0", 34061}, - {"sub_14032e370", 34062}, - {"consumereinforcement", 34063}, - {"ghost", 34064}, - {"loadweapons", 34065}, - {"sub_1402e0e80", 34067}, - {"setwaypointiconfadeatcenter", 34068}, - {"setreinforcementhintstrings", 34069}, - {"playgoliathentryanim", 34070}, - {"playgoliathtoidleanim", 34071}, - {"sub_140312210", 34072}, - {"sub_140312280", 34073}, - {"sub_140321660", 34074}, - {"playlocalannouncersound", 34075}, - {"setmissilespecialclipmask", 34076}, - {"sub_140527c40", 34077}, - {"sub_140527c60", 34078}, - {"isdodging", 34079}, - {"ispowersliding", 34080}, - {"sub_140320ab0", 34081}, - {"getcurrentping", 34082}, - {"sub_1402eeb60", 34083}, - {"sub_140329390", 34084}, - {"gethordeplayerdata", 34085}, - {"sethordeplayerdata", 34086}, - {"sub_1402dcbc0", 34087}, - {"sub_14031a0b0", 34088}, - {"sub_1403198a0", 34089}, - {"sub_1403345e0", 34090}, - {"sub_1402e7d80", 34092}, - {"sub_140404f00", 34093}, - {"issplitscreenplayer2", 34095}, - {"setowneroriginal", 34096}, - {"getlinkedtagname", 34097}, - {"sub_14032de80", 34098}, - {"sub_14032dfb0", 34099}, - {"setwaypointaerialtargeting", 34100}, - {"worldweaponsloaded", 34101}, - {"sub_140320aa0", 34102}, - {"usetriggertouchcheckstance", 34103}, - {"onlystreamactiveweapon", 34104}, - {"precachekillcamiconforweapon", 34105}, - {"selfierequestupdate", 34106}, - {"getclanwarsbonus", 34107}, - {"sub_140406810", 34108}, - {"sub_1404051d0", 34109}, - {"sub_140406340", 34110}, - {"sub_1402e72a0", 34111}, - {"sub_140404c70", 34112}, - {"sub_1404065c0", 34113}, - {"sub_140405c60", 34114}, - {"sub_140406400", 34115}, - {"sub_140406230", 34116}, - {"sub_140406650", 34117}, - {"sub_1402e7de0", 34118}, - {"sub_140333550", 34119}, - {"sub_140403fe0", 34120}, - {"sub_140320360", 34121}, - {"canhighjump", 34122}, - {"setprestigemastery", 34123}, - {"sub_140403f50", 34124}, - {"sub_14030c7b0", 34125}, - {"sub_1403206b0", 34126}, - {"sub_140329960", 34127}, - {"sub_140328100", 34128}, - {"sub_140405990", 34129}, - {"sub_1402e70c0", 34130}, - {"sub_1403335f0", 34131}, - {"getcoopplayerdatareservedint", 34132}, - {"setcoopplayerdatareservedint", 34133}, - {"sub_140406b50", 34134}, - {"sub_1402de070", 34135}, - {"sub_1402e7e40", 34136}, - {"sub_140329ba0", 34137}, - {"sub_140405af0", 34138}, - {"sub_1402e7240", 34139}, - {"sub_14031a370", 34140}, - {"sub_140406970", 34141}, - {"sub_140405b60", 34142}, - {"sub_140334e10", 34143}, - {"sub_140320a90", 34144}, - {"sub_140406c00", 34145}, - {"sub_140328bf0", 34146}, - {"sub_1404053e0", 34147}, - {"sub_140406d20", 34148}, - {"sub_14032c900", 34149}, - {"sub_14032c9e0", 34150}, - {"sub_140044360", 34151}, - {"sub_140333680", 34152}, - {"sub_1402e7130", 34153}, - {"sub_1403294b0", 34154}, - {"sub_140320b40", 34155}, - {"sub_140333710", 34156}, - }; - - std::unordered_map token_map = - { - {"CodeCallback_BulletHitEntity", 180}, - {"CodeCallback_CodeEndGame", 181}, - {"CodeCallback_EntityDamage", 182}, - {"CodeCallback_EntityOutOfWorld", 183}, - {"CodeCallback_HostMigration", 185}, - {"CodeCallback_PartyMembers", 187}, - {"CodeCallback_PlayerConnect", 188}, - {"CodeCallback_PlayerDamage", 189}, - {"CodeCallback_PlayerDisconnect", 190}, - {"CodeCallback_PlayerGrenadeSuicide", 191}, - {"CodeCallback_PlayerKilled", 192}, - {"CodeCallback_PlayerLastStand", 193}, - {"CodeCallback_PlayerMigrated", 194}, - {"CodeCallback_StartGameType", 195}, - {"CodeCallback_VehicleDamage", 196}, - {"CreateStruct", 221}, - {"InitStructs", 522}, - {"main", 619}, - {"AbortLevel", 1727}, - {"callbackVoid", 6662}, - {"CodeCallback_GiveKillstreak", 8192}, - {"SetDefaultCallbacks", 32577}, - {"SetupCallbacks", 33531}, - {"SetupDamageFlags", 33542}, - {"struct", 36698}, - {"codescripts/delete", 0x053D}, - {"codescripts/struct", 0x053E}, - {"maps/mp/gametypes/_callbacksetup", 0x0540}, - {"codescripts/character", 0xA4E5}, - {"common_scripts/_artcommon", 42214}, - {"common_scripts/_bcs_location_trigs", 42215}, - {"common_scripts/_createfx", 42216}, - {"common_scripts/_createfxmenu", 42217}, - {"common_scripts/_destructible", 42218}, - {"common_scripts/_dynamic_world", 42219}, - {"maps/createart/mp_vlobby_room_art", 42735}, - {"maps/createart/mp_vlobby_room_fog", 42736}, - {"maps/createart/mp_vlobby_room_fog_hdr", 42737} - }; -} diff --git a/src/client/game/scripting/functions.cpp b/src/client/game/scripting/functions.cpp deleted file mode 100644 index 3452c767..00000000 --- a/src/client/game/scripting/functions.cpp +++ /dev/null @@ -1,106 +0,0 @@ -#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 deleted file mode 100644 index 0422bcf7..00000000 --- a/src/client/game/scripting/functions.hpp +++ /dev/null @@ -1,16 +0,0 @@ -#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 deleted file mode 100644 index 462a6628..00000000 --- a/src/client/game/scripting/lua/context.cpp +++ /dev/null @@ -1,489 +0,0 @@ -#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 - -namespace scripting::lua -{ - namespace - { - std::vector load_game_constants() - { - std::vector result{}; - - const auto constants = game::GScr_LoadConsts.get(); - - ud_t ud; - ud_init(&ud); - ud_set_mode(&ud, 64); - ud_set_pc(&ud, uint64_t(constants)); - ud_set_input_buffer(&ud, reinterpret_cast(constants), INT32_MAX); - - while (true) - { - ud_disassemble(&ud); - - if (ud_insn_mnemonic(&ud) == UD_Iret) - { - break; - } - - if (ud_insn_mnemonic(&ud) == UD_Imov) - { - const auto* operand = ud_insn_opr(&ud, 0); - if (operand && operand->type == UD_OP_REG && operand->base == UD_R_ECX) - { - operand = ud_insn_opr(&ud, 1); - if (operand && operand->type == UD_OP_IMM && (operand->base == UD_R_RAX || operand->base == UD_R_EAX)) - { - result.emplace_back(reinterpret_cast(0x1409C1CE0)[operand->lval.udword]); - } - } - } - - if (ud_insn_mnemonic(&ud) == UD_Ilea) - { - const auto* operand = ud_insn_opr(&ud, 0); - if (!operand || operand->type != UD_OP_REG || operand->base != UD_R_RCX) - { - continue; - } - - operand = ud_insn_opr(&ud, 1); - if (operand && operand->type == UD_OP_MEM && operand->base == UD_R_RIP) - { - auto* operand_ptr = reinterpret_cast(ud_insn_len(&ud) + ud_insn_off(&ud) + operand->lval. - sdword); - if (!utils::memory::is_bad_read_ptr(operand_ptr) && utils::memory::is_rdata_ptr(operand_ptr) && - strlen(operand_ptr) > 0) - { - result.emplace_back(operand_ptr); - } - } - } - - if (*reinterpret_cast(ud.pc) == 0xCC) break; // int 3 - } - - return result; - } - - const std::vector& get_game_constants() - { - static auto constants = load_game_constants(); - return constants; - } - - void setup_entity_type(sol::state& state, event_handler& handler, scheduler& scheduler) - { - state["level"] = entity{*game::levelEntityId}; - - 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); - - 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)); - }; - } - - for (const auto& constant : get_game_constants()) - { - entity_type[constant] = sol::property( - [constant](const entity& entity, const sol::this_state s) - { - return convert(s, entity.get(constant)); - }, - [constant](const entity& entity, const sol::this_state s, const sol::lua_value& value) - { - entity.set(constant, convert({s, value})); - }); - } - - 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 id = *reinterpret_cast(0x14815DEB4); - const auto value = ::game::scr_VarGlob->childVariableValue[id]; - - ::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_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 deleted file mode 100644 index 79a5e905..00000000 --- a/src/client/game/scripting/lua/context.hpp +++ /dev/null @@ -1,45 +0,0 @@ -#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 deleted file mode 100644 index 15863c1c..00000000 --- a/src/client/game/scripting/lua/engine.cpp +++ /dev/null @@ -1,75 +0,0 @@ -#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("s1x/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 deleted file mode 100644 index 471316cd..00000000 --- a/src/client/game/scripting/lua/engine.hpp +++ /dev/null @@ -1,11 +0,0 @@ -#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 deleted file mode 100644 index 935db0f0..00000000 --- a/src/client/game/scripting/lua/error.cpp +++ /dev/null @@ -1,37 +0,0 @@ -#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 deleted file mode 100644 index dab56bee..00000000 --- a/src/client/game/scripting/lua/error.hpp +++ /dev/null @@ -1,8 +0,0 @@ -#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 deleted file mode 100644 index 7121ea63..00000000 --- a/src/client/game/scripting/lua/event_handler.cpp +++ /dev/null @@ -1,174 +0,0 @@ -#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 deleted file mode 100644 index fc95b704..00000000 --- a/src/client/game/scripting/lua/event_handler.hpp +++ /dev/null @@ -1,58 +0,0 @@ -#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 deleted file mode 100644 index 1afb7df2..00000000 --- a/src/client/game/scripting/lua/scheduler.cpp +++ /dev/null @@ -1,171 +0,0 @@ -#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 deleted file mode 100644 index 17c90797..00000000 --- a/src/client/game/scripting/lua/scheduler.hpp +++ /dev/null @@ -1,54 +0,0 @@ -#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 deleted file mode 100644 index defbe14d..00000000 --- a/src/client/game/scripting/lua/value_conversion.cpp +++ /dev/null @@ -1,319 +0,0 @@ -#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 = 64000 * (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 deleted file mode 100644 index 93256f80..00000000 --- a/src/client/game/scripting/lua/value_conversion.hpp +++ /dev/null @@ -1,11 +0,0 @@ -#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 deleted file mode 100644 index 92daa3b7..00000000 --- a/src/client/game/scripting/safe_execution.cpp +++ /dev/null @@ -1,72 +0,0 @@ -#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 deleted file mode 100644 index 6eea59d2..00000000 --- a/src/client/game/scripting/safe_execution.hpp +++ /dev/null @@ -1,10 +0,0 @@ -#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 deleted file mode 100644 index 7d334f17..00000000 --- a/src/client/game/scripting/script_value.cpp +++ /dev/null @@ -1,278 +0,0 @@ -#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 deleted file mode 100644 index df8a95b6..00000000 --- a/src/client/game/scripting/script_value.hpp +++ /dev/null @@ -1,52 +0,0 @@ -#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 deleted file mode 100644 index 646e2584..00000000 --- a/src/client/game/scripting/stack_isolation.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#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 deleted file mode 100644 index 8dffd4bc..00000000 --- a/src/client/game/scripting/stack_isolation.hpp +++ /dev/null @@ -1,25 +0,0 @@ -#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 deleted file mode 100644 index 69a20023..00000000 --- a/src/client/game/scripting/variable_value.cpp +++ /dev/null @@ -1,68 +0,0 @@ -#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 deleted file mode 100644 index 7a962612..00000000 --- a/src/client/game/scripting/variable_value.hpp +++ /dev/null @@ -1,27 +0,0 @@ -#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 deleted file mode 100644 index e3b66dcd..00000000 --- a/src/client/game/scripting/vector.cpp +++ /dev/null @@ -1,85 +0,0 @@ -#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 deleted file mode 100644 index 70b146d6..00000000 --- a/src/client/game/scripting/vector.hpp +++ /dev/null @@ -1,31 +0,0 @@ -#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/ui_scripting/execution.cpp b/src/client/game/ui_scripting/execution.cpp deleted file mode 100644 index fff6b88e..00000000 --- a/src/client/game/ui_scripting/execution.cpp +++ /dev/null @@ -1,161 +0,0 @@ -#include -#include "execution.hpp" -#include "component/ui_scripting.hpp" - -#include - -namespace ui_scripting -{ - void push_value(const script_value& value) - { - const auto state = *game::hks::lua_state; - const auto value_ = value.get_raw(); - *state->m_apistack.top = value_; - state->m_apistack.top++; - } - - script_value get_return_value(int offset) - { - const auto state = *game::hks::lua_state; - return state->m_apistack.top[-1 - offset]; - } - - arguments get_return_values(int count) - { - arguments values; - - for (auto i = count - 1; i >= 0; i--) - { - values.push_back(get_return_value(i)); - } - - if (values.size() == 0) - { - values.push_back({}); - } - - return values; - } - - arguments call_script_function(const function& function, const arguments& arguments) - { - const auto state = *game::hks::lua_state; - state->m_apistack.top = state->m_apistack.base; - - push_value(function); - for (auto i = arguments.begin(); i != arguments.end(); ++i) - { - push_value(*i); - } - - const auto _1 = gsl::finally(&disable_error_hook); - enable_error_hook(); - - try - { - game::hks::vm_call_internal(state, static_cast(arguments.size()), -1, 0); - const auto count = static_cast(state->m_apistack.top - state->m_apistack.base); - return get_return_values(count); - } - catch (const std::exception& e) - { - throw std::runtime_error(std::string("Error executing script function: ") + e.what()); - } - } - - script_value get_field(const userdata& self, const script_value& key) - { - const auto state = *game::hks::lua_state; - state->m_apistack.top = state->m_apistack.base; - - push_value(key); - - const auto _1 = gsl::finally(&disable_error_hook); - enable_error_hook(); - - game::hks::HksObject value{}; - game::hks::HksObject userdata{}; - userdata.t = game::hks::TUSERDATA; - userdata.v.ptr = self.ptr; - - try - { - game::hks::hks_obj_gettable(&value, state, &userdata, &state->m_apistack.top[-1]); - return value; - } - catch (const std::exception& e) - { - throw std::runtime_error(std::string("Error getting userdata field: ") + e.what()); - } - } - - script_value get_field(const table& self, const script_value& key) - { - const auto state = *game::hks::lua_state; - state->m_apistack.top = state->m_apistack.base; - - push_value(key); - - const auto _1 = gsl::finally(&disable_error_hook); - enable_error_hook(); - - game::hks::HksObject value{}; - game::hks::HksObject userdata{}; - userdata.t = game::hks::TTABLE; - userdata.v.ptr = self.ptr; - - try - { - game::hks::hks_obj_gettable(&value, state, &userdata, &state->m_apistack.top[-1]); - return value; - } - catch (const std::exception& e) - { - throw std::runtime_error(std::string("Error getting table field: ") + e.what()); - } - } - - void set_field(const userdata& self, const script_value& key, const script_value& value) - { - const auto state = *game::hks::lua_state; - state->m_apistack.top = state->m_apistack.base; - - const auto _1 = gsl::finally(&disable_error_hook); - enable_error_hook(); - - game::hks::HksObject userdata{}; - userdata.t = game::hks::TUSERDATA; - userdata.v.ptr = self.ptr; - - try - { - game::hks::hks_obj_settable(state, &userdata, &key.get_raw(), &value.get_raw()); - } - catch (const std::exception& e) - { - throw std::runtime_error(std::string("Error setting userdata field: ") + e.what()); - } - } - - void set_field(const table& self, const script_value& key, const script_value& value) - { - const auto state = *game::hks::lua_state; - state->m_apistack.top = state->m_apistack.base; - - const auto _1 = gsl::finally(&disable_error_hook); - enable_error_hook(); - - game::hks::HksObject userdata{}; - userdata.t = game::hks::TTABLE; - userdata.v.ptr = self.ptr; - - try - { - game::hks::hks_obj_settable(state, &userdata, &key.get_raw(), &value.get_raw()); - } - catch (const std::exception& e) - { - throw std::runtime_error(std::string("Error setting table field: ") + e.what()); - } - } -} diff --git a/src/client/game/ui_scripting/execution.hpp b/src/client/game/ui_scripting/execution.hpp deleted file mode 100644 index 24f4dd72..00000000 --- a/src/client/game/ui_scripting/execution.hpp +++ /dev/null @@ -1,18 +0,0 @@ -#pragma once -#include "game/game.hpp" -#include "types.hpp" -#include "script_value.hpp" - -namespace ui_scripting -{ - void push_value(const script_value& value); - script_value get_return_value(int offset); - arguments get_return_values(int count); - - arguments call_script_function(const function& function, const arguments& arguments); - - script_value get_field(const userdata& self, const script_value& key); - script_value get_field(const table& self, const script_value& key); - void set_field(const userdata& self, const script_value& key, const script_value& value); - void set_field(const table& self, const script_value& key, const script_value& value); -} diff --git a/src/client/game/ui_scripting/lua/context.cpp b/src/client/game/ui_scripting/lua/context.cpp deleted file mode 100644 index d6d05f1d..00000000 --- a/src/client/game/ui_scripting/lua/context.cpp +++ /dev/null @@ -1,205 +0,0 @@ -#include -#include "context.hpp" -#include "error.hpp" -#include "value_conversion.hpp" -#include "../script_value.hpp" -#include "../execution.hpp" - -#include "../../../component/ui_scripting.hpp" -#include "../../../component/command.hpp" - -#include "component/game_console.hpp" -#include "component/scheduler.hpp" - -#include -#include -#include - -namespace ui_scripting::lua -{ - namespace - { - void setup_types(sol::state& state, scheduler& scheduler) - { - struct game - { - }; - auto game_type = state.new_usertype("game_"); - state["game"] = game(); - - 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); - }; - - auto userdata_type = state.new_usertype("userdata_"); - - userdata_type["new"] = sol::property( - [](const userdata& userdata, const sol::this_state s) - { - return convert(s, userdata.get("new")); - }, - [](const userdata& userdata, const sol::this_state s, const sol::lua_value& value) - { - userdata.set("new", convert({s, value})); - } - ); - - - userdata_type["get"] = [](const userdata& userdata, const sol::this_state s, - const sol::lua_value& key) - { - return convert(s, userdata.get(convert({s, key}))); - }; - - userdata_type["set"] = [](const userdata& userdata, const sol::this_state s, - const sol::lua_value& key, const sol::lua_value& value) - { - userdata.set(convert({s, key}), convert({s, value})); - }; - - userdata_type[sol::meta_function::index] = [](const userdata& userdata, const sol::this_state s, - const sol::lua_value& key) - { - return convert(s, userdata.get(convert({s, key}))); - }; - - userdata_type[sol::meta_function::new_index] = [](const userdata& userdata, const sol::this_state s, - const sol::lua_value& key, const sol::lua_value& value) - { - userdata.set(convert({s, key }), convert({s, value})); - }; - - auto table_type = state.new_usertype("table_"); - - table_type["new"] = sol::property( - [](const table& table, const sol::this_state s) - { - return convert(s, table.get("new")); - }, - [](const table& table, const sol::this_state s, const sol::lua_value& value) - { - table.set("new", convert({s, value})); - } - ); - - table_type["get"] = [](const table& table, const sol::this_state s, - const sol::lua_value& key) - { - return convert(s, table.get(convert({s, key}))); - }; - - table_type["set"] = [](const table& table, const sol::this_state s, - const sol::lua_value& key, const sol::lua_value& value) - { - table.set(convert({s, key}), convert({s, value})); - }; - - table_type[sol::meta_function::index] = [](const table& table, const sol::this_state s, - const sol::lua_value& key) - { - return convert(s, table.get(convert({s, key}))); - }; - - table_type[sol::meta_function::new_index] = [](const table& table, const sol::this_state s, - const sol::lua_value& key, const sol::lua_value& value) - { - table.set(convert({s, key}), convert({s, value})); - }; - - auto function_type = state.new_usertype("function_"); - - function_type[sol::meta_function::call] = [](const function& function, const sol::this_state s, sol::variadic_args va) - { - arguments arguments{}; - - for (auto arg : va) - { - arguments.push_back(convert({s, arg})); - } - - const auto values = function.call(arguments); - std::vector returns; - - for (const auto& value : values) - { - returns.push_back(convert(s, value)); - } - - return sol::as_returns(returns); - }; - - state["luiglobals"] = table((*::game::hks::lua_state)->globals.v.table); - state["CoD"] = state["luiglobals"]["CoD"]; - state["LUI"] = state["luiglobals"]["LUI"]; - state["Engine"] = state["luiglobals"]["Engine"]; - state["Game"] = state["luiglobals"]["Game"]; - } - } - - context::context(std::string folder) - : folder_(std::move(folder)) - , scheduler_(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_types(this->state_, this->scheduler_); - - printf("Loading ui script '%s'\n", this->folder_.data()); - this->load_script("__init__"); - } - - context::~context() - { - this->state_.collect_garbage(); - this->scheduler_.clear(); - this->state_ = {}; - } - - void context::run_frame() - { - this->scheduler_.run_frame(); - 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/ui_scripting/lua/context.hpp b/src/client/game/ui_scripting/lua/context.hpp deleted file mode 100644 index 0876d3df..00000000 --- a/src/client/game/ui_scripting/lua/context.hpp +++ /dev/null @@ -1,36 +0,0 @@ -#pragma once -#pragma warning(push) -#pragma warning(disable: 4702) - -#define SOL_ALL_SAFETIES_ON 1 -#define SOL_PRINT_ERRORS 0 -#include - -#include "scheduler.hpp" - -namespace ui_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(); - - private: - sol::state state_{}; - std::string folder_; - std::unordered_set loaded_scripts_; - - scheduler scheduler_; - - void load_script(const std::string& script); - }; -} diff --git a/src/client/game/ui_scripting/lua/engine.cpp b/src/client/game/ui_scripting/lua/engine.cpp deleted file mode 100644 index ee8e29ac..00000000 --- a/src/client/game/ui_scripting/lua/engine.cpp +++ /dev/null @@ -1,61 +0,0 @@ -#include -#include "engine.hpp" -#include "context.hpp" - -#include "../../../component/ui_scripting.hpp" -#include "../../../component/game_module.hpp" - -#include - -namespace ui_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 start() - { - clear_converted_functions(); - get_scripts().clear(); - load_scripts(game_module::get_host_module().get_folder() + "/data/ui_scripts/"); - load_scripts("s1x/ui_scripts/"); - load_scripts("data/ui_scripts/"); - } - - void stop() - { - clear_converted_functions(); - get_scripts().clear(); - } - - void run_frame() - { - for (auto& script : get_scripts()) - { - script->run_frame(); - } - } -} diff --git a/src/client/game/ui_scripting/lua/engine.hpp b/src/client/game/ui_scripting/lua/engine.hpp deleted file mode 100644 index bbcf427c..00000000 --- a/src/client/game/ui_scripting/lua/engine.hpp +++ /dev/null @@ -1,8 +0,0 @@ -#pragma once - -namespace ui_scripting::lua::engine -{ - void start(); - void stop(); - void run_frame(); -} diff --git a/src/client/game/ui_scripting/lua/error.cpp b/src/client/game/ui_scripting/lua/error.cpp deleted file mode 100644 index d13b4896..00000000 --- a/src/client/game/ui_scripting/lua/error.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include -#include "error.hpp" - -namespace ui_scripting::lua -{ - void handle_error(const sol::protected_function_result& result) - { - if (!result.valid()) - { - printf("************** UI Script execution error **************\n"); - - const sol::error err = result; - printf("%s\n", err.what()); - - printf("****************************************************\n"); - } - } -} diff --git a/src/client/game/ui_scripting/lua/error.hpp b/src/client/game/ui_scripting/lua/error.hpp deleted file mode 100644 index 28a5c453..00000000 --- a/src/client/game/ui_scripting/lua/error.hpp +++ /dev/null @@ -1,8 +0,0 @@ -#pragma once - -#include "context.hpp" - -namespace ui_scripting::lua -{ - void handle_error(const sol::protected_function_result& result); -} diff --git a/src/client/game/ui_scripting/lua/scheduler.cpp b/src/client/game/ui_scripting/lua/scheduler.cpp deleted file mode 100644 index 18e779b6..00000000 --- a/src/client/game/ui_scripting/lua/scheduler.cpp +++ /dev/null @@ -1,122 +0,0 @@ -#include "std_include.hpp" -#include "context.hpp" -#include "error.hpp" - -namespace ui_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); - }; - } - - 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::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/ui_scripting/lua/scheduler.hpp b/src/client/game/ui_scripting/lua/scheduler.hpp deleted file mode 100644 index 1935e25e..00000000 --- a/src/client/game/ui_scripting/lua/scheduler.hpp +++ /dev/null @@ -1,50 +0,0 @@ -#pragma once -#include - -namespace ui_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; - }; - - 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 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 remove(const task_handle& handle); - void merge_callbacks(); - }; -} diff --git a/src/client/game/ui_scripting/lua/value_conversion.cpp b/src/client/game/ui_scripting/lua/value_conversion.cpp deleted file mode 100644 index 38376cdf..00000000 --- a/src/client/game/ui_scripting/lua/value_conversion.cpp +++ /dev/null @@ -1,144 +0,0 @@ -#include -#include "value_conversion.hpp" -#include "../execution.hpp" -#include "../../../component/ui_scripting.hpp" - -namespace ui_scripting::lua -{ - namespace - { - table convert_table(const sol::table& t) - { - table res{}; - - t.for_each([res](const sol::object& key, const sol::object& value) - { - res.set(convert(key), convert(value)); - }); - - return res; - } - - script_value convert_function(const sol::protected_function& function) - { - const auto closure = game::hks::cclosure_Create(*game::hks::lua_state, main_function_handler, 0, 0, 0); - add_converted_function(closure, function); - - game::hks::HksObject value{}; - value.t = game::hks::TCFUNCTION; - value.v.cClosure = closure; - - return value; - } - } - - 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 {value.as
()}; - } - - if (value.is()) - { - return {value.as()}; - } - - if (value.is()) - { - return {convert_table(value.as())}; - } - - if (value.is()) - { - return {convert_function(value.as())}; - } - - 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 {state, value.as()}; - } - - 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 {state, value.as()}; - } - - return {state, sol::lua_nil}; - } -} diff --git a/src/client/game/ui_scripting/lua/value_conversion.hpp b/src/client/game/ui_scripting/lua/value_conversion.hpp deleted file mode 100644 index 21a67e33..00000000 --- a/src/client/game/ui_scripting/lua/value_conversion.hpp +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once -#include "context.hpp" -#include "../script_value.hpp" - -namespace ui_scripting::lua -{ - 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/ui_scripting/script_value.cpp b/src/client/game/ui_scripting/script_value.cpp deleted file mode 100644 index 34d17020..00000000 --- a/src/client/game/ui_scripting/script_value.cpp +++ /dev/null @@ -1,274 +0,0 @@ -#include -#include "execution.hpp" -#include "types.hpp" -#include "script_value.hpp" - -namespace ui_scripting -{ - /*************************************************************** - * Constructors - **************************************************************/ - - script_value::script_value(const game::hks::HksObject& value) - : value_(value) - { - } - - script_value::script_value(const int value) - { - game::hks::HksObject obj{}; - obj.t = game::hks::TNUMBER; - obj.v.number = static_cast(value); - - this->value_ = obj; - } - - script_value::script_value(const unsigned int value) - { - game::hks::HksObject obj{}; - obj.t = game::hks::TNUMBER; - obj.v.number = static_cast(value); - - this->value_ = obj; - } - - script_value::script_value(const bool value) - { - game::hks::HksObject obj{}; - obj.t = game::hks::TBOOLEAN; - obj.v.boolean = value; - - this->value_ = obj; - } - - script_value::script_value(const float value) - { - game::hks::HksObject obj{}; - obj.t = game::hks::TNUMBER; - obj.v.number = static_cast(value); - - this->value_ = obj; - } - - script_value::script_value(const double value) - : script_value(static_cast(value)) - { - } - - script_value::script_value(const char* value) - { - game::hks::HksObject obj{}; - - const auto state = *game::hks::lua_state; - state->m_apistack.top = state->m_apistack.base; - - game::hks::hksi_lua_pushlstring(state, value, (unsigned int)strlen(value)); - obj = state->m_apistack.top[-1]; - - this->value_ = obj; - } - - script_value::script_value(const std::string& value) - : script_value(value.data()) - { - } - - script_value::script_value(const lightuserdata& value) - { - this->value_.t = game::hks::TLIGHTUSERDATA; - this->value_.v.ptr = value.ptr; - } - - script_value::script_value(const userdata& value) - { - this->value_.t = game::hks::TUSERDATA; - this->value_.v.ptr = value.ptr; - } - - script_value::script_value(const table& value) - { - this->value_.t = game::hks::TTABLE; - this->value_.v.ptr = value.ptr; - } - - script_value::script_value(const function& value) - { - this->value_.t = value.type; - this->value_.v.ptr = value.ptr; - } - - /*************************************************************** - * Integer - **************************************************************/ - - template <> - bool script_value::is() const - { - const auto number = this->get_raw().v.number; - return this->get_raw().t == game::hks::TNUMBER && static_cast(number) == number; - } - - template <> - bool script_value::is() const - { - return this->is(); - } - - template <> - int script_value::get() const - { - return static_cast(this->get_raw().v.number); - } - - template <> - unsigned int script_value::get() const - { - return static_cast(this->get_raw().v.number); - } - - /*************************************************************** - * Boolean - **************************************************************/ - - template <> - bool script_value::is() const - { - return this->get_raw().t == game::hks::TBOOLEAN; - } - - template <> - bool script_value::get() const - { - return this->get_raw().v.boolean; - } - - /*************************************************************** - * Float - **************************************************************/ - - template <> - bool script_value::is() const - { - return this->get_raw().t == game::hks::TNUMBER; - } - - template <> - bool script_value::is() const - { - return this->is(); - } - - template <> - float script_value::get() const - { - return this->get_raw().v.number; - } - - template <> - double script_value::get() const - { - return static_cast(this->get_raw().v.number); - } - - /*************************************************************** - * String - **************************************************************/ - - template <> - bool script_value::is() const - { - return this->get_raw().t == game::hks::TSTRING; - } - - template <> - bool script_value::is() const - { - return this->is(); - } - - template <> - const char* script_value::get() const - { - return this->get_raw().v.str->m_data; - } - - template <> - std::string script_value::get() const - { - return this->get(); - } - - /*************************************************************** - * Lightuserdata - **************************************************************/ - - template <> - bool script_value::is() const - { - return this->get_raw().t == game::hks::TLIGHTUSERDATA; - } - - template <> - lightuserdata script_value::get() const - { - return this->get_raw().v.ptr; - } - - /*************************************************************** - * Userdata - **************************************************************/ - - template <> - bool script_value::is() const - { - return this->get_raw().t == game::hks::TUSERDATA; - } - - template <> - userdata script_value::get() const - { - return this->get_raw().v.ptr; - } - - /*************************************************************** - * Table - **************************************************************/ - - template <> - bool script_value::is
() const - { - return this->get_raw().t == game::hks::TTABLE; - } - - template <> - table script_value::get() const - { - return this->get_raw().v.table; - } - - /*************************************************************** - * Function - **************************************************************/ - - template <> - bool script_value::is() const - { - return this->get_raw().t == game::hks::TIFUNCTION - || this->get_raw().t == game::hks::TCFUNCTION; - } - - template <> - function script_value::get() const - { - return { this->get_raw().v.cClosure, this->get_raw().t }; - } - - /*************************************************************** - * - **************************************************************/ - - const game::hks::HksObject& script_value::get_raw() const - { - return this->value_; - } -} diff --git a/src/client/game/ui_scripting/script_value.hpp b/src/client/game/ui_scripting/script_value.hpp deleted file mode 100644 index 3de52ddf..00000000 --- a/src/client/game/ui_scripting/script_value.hpp +++ /dev/null @@ -1,56 +0,0 @@ -#pragma once -#include "game/game.hpp" - -namespace ui_scripting -{ - class lightuserdata; - class userdata; - class table; - class function; - - class script_value - { - public: - script_value() = default; - script_value(const game::hks::HksObject& 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 lightuserdata& value); - script_value(const userdata& value); - script_value(const table& value); - script_value(const function& value); - - template - bool is() const; - - template - T as() const - { - if (!this->is()) - { - throw std::runtime_error("Invalid type"); - } - - return get(); - } - - const game::hks::HksObject& get_raw() const; - - private: - template - T get() const; - - game::hks::HksObject value_{}; - }; - - using arguments = std::vector; -} diff --git a/src/client/game/ui_scripting/types.cpp b/src/client/game/ui_scripting/types.cpp deleted file mode 100644 index 37032b1b..00000000 --- a/src/client/game/ui_scripting/types.cpp +++ /dev/null @@ -1,276 +0,0 @@ -#include -#include "types.hpp" -#include "execution.hpp" - -namespace ui_scripting -{ - /*************************************************************** - * Lightuserdata - **************************************************************/ - - lightuserdata::lightuserdata(void* ptr_) - : ptr(ptr_) - { - } - - /*************************************************************** - * Userdata - **************************************************************/ - - userdata::userdata(void* ptr_) - : ptr(ptr_) - { - this->add(); - } - - userdata::userdata(const userdata& other) - { - this->operator=(other); - } - - userdata::userdata(userdata&& other) noexcept - { - this->ptr = other.ptr; - this->ref = other.ref; - other.ref = 0; - } - - userdata::~userdata() - { - this->release(); - } - - userdata& userdata::operator=(const userdata& other) - { - if (&other != this) - { - this->release(); - this->ptr = other.ptr; - this->ref = other.ref; - this->add(); - } - - return *this; - } - - userdata& userdata::operator=(userdata&& other) noexcept - { - if (&other != this) - { - this->release(); - this->ptr = other.ptr; - this->ref = other.ref; - other.ref = 0; - } - - return *this; - } - - void userdata::add() - { - game::hks::HksObject value{}; - value.v.ptr = this->ptr; - value.t = game::hks::TUSERDATA; - - const auto state = *game::hks::lua_state; - state->m_apistack.top = state->m_apistack.base; - - push_value(value); - - this->ref = game::hks::hksi_luaL_ref(*game::hks::lua_state, -10000); - } - - void userdata::release() - { - if (this->ref) - { - game::hks::hksi_luaL_unref(*game::hks::lua_state, -10000, this->ref); - } - } - - void userdata::set(const script_value& key, const script_value& value) const - { - set_field(*this, key, value); - } - - script_value userdata::get(const script_value& key) const - { - return get_field(*this, key); - } - - /*************************************************************** - * Table - **************************************************************/ - - table::table() - { - const auto state = *game::hks::lua_state; - this->ptr = game::hks::Hashtable_Create(state, 0, 0); - this->add(); - } - - table::table(game::hks::HashTable* ptr_) - : ptr(ptr_) - { - this->add(); - } - - table::table(const table& other) - { - this->operator=(other); - } - - table::table(table&& other) noexcept - { - this->ptr = other.ptr; - this->ref = other.ref; - other.ref = 0; - } - - table::~table() - { - this->release(); - } - - table& table::operator=(const table& other) - { - if (&other != this) - { - this->release(); - this->ptr = other.ptr; - this->ref = other.ref; - this->add(); - } - - return *this; - } - - table& table::operator=(table&& other) noexcept - { - if (&other != this) - { - this->release(); - this->ptr = other.ptr; - this->ref = other.ref; - other.ref = 0; - } - - return *this; - } - - void table::add() - { - game::hks::HksObject value{}; - value.v.table = this->ptr; - value.t = game::hks::TTABLE; - - const auto state = *game::hks::lua_state; - state->m_apistack.top = state->m_apistack.base; - - push_value(value); - - this->ref = game::hks::hksi_luaL_ref(*game::hks::lua_state, -10000); - } - - void table::release() - { - if (this->ref) - { - game::hks::hksi_luaL_unref(*game::hks::lua_state, -10000, this->ref); - } - } - - void table::set(const script_value& key, const script_value& value) const - { - set_field(*this, key, value); - } - - script_value table::get(const script_value& key) const - { - return get_field(*this, key); - } - - /*************************************************************** - * Function - **************************************************************/ - - function::function(game::hks::cclosure* ptr_, game::hks::HksObjectType type_) - : ptr(ptr_) - , type(type_) - { - this->add(); - } - - function::function(const function& other) - { - this->operator=(other); - } - - function::function(function&& other) noexcept - { - this->ptr = other.ptr; - this->type = other.type; - this->ref = other.ref; - other.ref = 0; - } - - function::~function() - { - this->release(); - } - - function& function::operator=(const function& other) - { - if (&other != this) - { - this->release(); - this->ptr = other.ptr; - this->type = other.type; - this->ref = other.ref; - this->add(); - } - - return *this; - } - - function& function::operator=(function&& other) noexcept - { - if (&other != this) - { - this->release(); - this->ptr = other.ptr; - this->type = other.type; - this->ref = other.ref; - other.ref = 0; - } - - return *this; - } - - void function::add() - { - game::hks::HksObject value{}; - value.v.cClosure = this->ptr; - value.t = this->type; - - const auto state = *game::hks::lua_state; - state->m_apistack.top = state->m_apistack.base; - - push_value(value); - - this->ref = game::hks::hksi_luaL_ref(*game::hks::lua_state, -10000); - } - - void function::release() - { - if (this->ref) - { - game::hks::hksi_luaL_unref(*game::hks::lua_state, -10000, this->ref); - } - } - - arguments function::call(const arguments& arguments) const - { - return call_script_function(*this, arguments); - } -} diff --git a/src/client/game/ui_scripting/types.hpp b/src/client/game/ui_scripting/types.hpp deleted file mode 100644 index 1924407f..00000000 --- a/src/client/game/ui_scripting/types.hpp +++ /dev/null @@ -1,89 +0,0 @@ -#pragma once -#include "game/game.hpp" -#include "script_value.hpp" - -namespace ui_scripting -{ - class lightuserdata - { - public: - lightuserdata(void*); - void* ptr; - }; - - class userdata - { - public: - userdata(void*); - - userdata(const userdata& other); - userdata(userdata&& other) noexcept; - - ~userdata(); - - userdata& operator=(const userdata& other); - userdata& operator=(userdata&& other) noexcept; - - script_value get(const script_value& key) const; - void set(const script_value& key, const script_value& value) const; - - void* ptr; - - private: - void add(); - void release(); - - int ref{}; - }; - - class table - { - public: - table(); - table(game::hks::HashTable* ptr_); - - table(const table& other); - table(table&& other) noexcept; - - ~table(); - - table& operator=(const table& other); - table& operator=(table&& other) noexcept; - - script_value get(const script_value& key) const; - void set(const script_value& key, const script_value& value) const; - - game::hks::HashTable* ptr; - - private: - void add(); - void release(); - - int ref{}; - }; - - class function - { - public: - function(game::hks::cclosure*, game::hks::HksObjectType); - - function(const function& other); - function(function&& other) noexcept; - - ~function(); - - function& operator=(const function& other); - function& operator=(function&& other) noexcept; - - arguments call(const arguments& arguments) const; - - game::hks::cclosure* ptr; - game::hks::HksObjectType type; - - private: - void add(); - void release(); - - int ref{}; - }; -} diff --git a/src/client/resources/logo.bmp b/src/client/resources/logo.bmp index c8054d210edcc1590fea180a6b58897d5ee2a996..1f81f0fd31805c2caf1cc4ea414068319c8c3358 100644 GIT binary patch literal 109976 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

rWD+FbuKw*) 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 literal 109976 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đtb-xD6&%rhjD-v(5ui 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 HvI26 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 AQvd(}