diff --git a/data/ui_scripts/luafixes/__init__.lua b/data/ui_scripts/luafixes/__init__.lua new file mode 100644 index 00000000..e04639b6 --- /dev/null +++ b/data/ui_scripts/luafixes/__init__.lua @@ -0,0 +1,4 @@ + +-- Fix LUI_NULL_FUNCTION messages +function Engine.PIXBeginEvent() end +function Engine.PIXEndEvent() end \ No newline at end of file diff --git a/data/ui_scripts/stats/__init__.lua b/data/ui_scripts/stats/__init__.lua new file mode 100644 index 00000000..a3cb7737 --- /dev/null +++ b/data/ui_scripts/stats/__init__.lua @@ -0,0 +1,286 @@ +DataSources.MPStatsSettings = DataSourceHelpers.ListSetup( "MPStatsSettings", function ( controller ) + local optionsTable = {} + + table.insert( optionsTable, CoD.OptionsUtility.CreateDvarSettings( controller, "Unlock all loot", "Whether loot should be locked based on the player's stats or always unlocked.", "MPStatsSettings_unlock_loot", "cg_unlockall_loot", { + { + option = "MENU_DISABLED", + value = 0, + default = true + }, + { + option = "MENU_ENABLED", + value = 1 + }, + }, nil, function(f1_arg0, f1_arg1, f1_arg2, dvarName, f1_arg4) + local oldValue = Engine.DvarInt( nil, dvarName ) + local newValue = f1_arg1.value + UpdateInfoModels( f1_arg1 ) + if oldValue == newValue then + return + end + Engine.SetDvar( dvarName, f1_arg1.value ) + Engine.SetDvar( "ui_enableAllHeroes", f1_arg1.value ) + end) ) + + return optionsTable +end) + +LUI.createMenu.MPStatsMenu = function ( controller ) + local self = CoD.Menu.NewForUIEditor( "MPStatsMenu" ) + if PreLoadFunc then + PreLoadFunc( self, controller ) + end + self.soundSet = "ChooseDecal" + self:setOwner( controller ) + self:setLeftRight( true, true, 0, 0 ) + self:setTopBottom( true, true, 0, 0 ) + self:playSound( "menu_open", controller ) + self.buttonModel = Engine.CreateModel( Engine.GetModelForController( controller ), "MPStatsMenu.buttonPrompts" ) + self.anyChildUsesUpdateState = true + + local GameSettingsBackground = CoD.GameSettings_Background.new( self, controller ) + GameSettingsBackground:setLeftRight( true, true, 0, 0 ) + GameSettingsBackground:setTopBottom( true, true, 0, 0 ) + GameSettingsBackground.MenuFrame.titleLabel:setText( Engine.Localize( "STATS SETTINGS" ) ) + GameSettingsBackground.MenuFrame.cac3dTitleIntermediary0.FE3dTitleContainer0.MenuTitle.TextBox1.Label0:setText( Engine.Localize( "STATS SETTINGS" ) ) + GameSettingsBackground.GameSettingsSelectedItemInfo.GameModeInfo:setAlpha( 0 ) + GameSettingsBackground.GameSettingsSelectedItemInfo.GameModeName:setAlpha( 0 ) + self:addElement( GameSettingsBackground ) + self.GameSettingsBackground = GameSettingsBackground + + local Options = CoD.Competitive_SettingsList.new( self, controller ) + Options:setLeftRight( true, false, 26, 741 ) + Options:setTopBottom( true, false, 135, 720 ) + Options.Title.DescTitle:setText( Engine.Localize( "Stats" ) ) + Options.ButtonList:setVerticalCount( 15 ) + Options.ButtonList:setDataSource( "MPStatsSettings" ) + self:addElement( Options ) + self.Options = Options + + self:AddButtonCallbackFunction( self, controller, Enum.LUIButton.LUI_KEY_XBB_PSCIRCLE, nil, function ( element, menu, controller, model ) + GoBack( self, controller ) + SetPerControllerTableProperty( controller, "disableGameSettingsOptions", nil ) + return true + end, function ( element, menu, controller ) + CoD.Menu.SetButtonLabel( menu, Enum.LUIButton.LUI_KEY_XBB_PSCIRCLE, "MENU_BACK" ) + return true + end, false ) + + GameSettingsBackground.MenuFrame:setModel( self.buttonModel, controller ) + Options.id = "Options" + + self:processEvent( { + name = "menu_loaded", + controller = controller + } ) + self:processEvent( { + name = "update_state", + menu = self + } ) + if not self:restoreState() then + self.Options:processEvent( { + name = "gain_focus", + controller = controller + } ) + end + + LUI.OverrideFunction_CallOriginalSecond( self, "close", function ( element ) + element.GameSettingsBackground:close() + element.Options:close() + Engine.UnsubscribeAndFreeModel( Engine.GetModel( Engine.GetModelForController( controller ), "MPStatsMenu.buttonPrompts" ) ) + end ) + + if PostLoadFunc then + PostLoadFunc( self, controller ) + end + + return self +end + +CoD.LobbyButtons.MP_STATS = { + stringRef = "STATS", + action = function ( self, element, controller, param, menu ) + SetPerControllerTableProperty( controller, "disableGameSettingsOptions", true ) + OpenPopup( menu, "MPStatsMenu", controller ) + end, + customId = "btnMPStats" +} + + +local IsGamescomDemo = function () + return Dvar.ui_execdemo_gamescom:get() +end + +local IsBetaDemo = function () + return Dvar.ui_execdemo_beta:get() +end + +local SetButtonState = function ( button, state ) + if state == nil then + return + elseif state == CoD.LobbyButtons.DISABLED then + button.disabled = true + elseif state == CoD.LobbyButtons.HIDDEN then + button.hidden = true + end +end + +local AddButton = function ( controller, options, button, isLargeButton ) + button.disabled = false + button.hidden = false + button.selected = false + button.warning = false + if button.defaultState ~= nil then + if button.defaultState == CoD.LobbyButtons.DISABLED then + button.disabled = true + elseif button.defaultState == CoD.LobbyButtons.HIDDEN then + button.hidden = true + end + end + if button.disabledFunc ~= nil then + button.disabled = button.disabledFunc( controller ) + end + if button.visibleFunc ~= nil then + button.hidden = not button.visibleFunc( controller ) + end + if IsBetaDemo() then + SetButtonState( button, button.demo_beta ) + elseif IsGamescomDemo() then + SetButtonState( button, button.demo_gamescom ) + end + if button.hidden then + return + end + local lobbyNav = LobbyData.GetLobbyNav() + if button.selectedFunc ~= nil then + button.selected = button.selectedFunc( button.selectedParam ) + elseif CoD.LobbyMenus.History[lobbyNav] ~= nil then + button.selected = CoD.LobbyMenus.History[lobbyNav] == button.customId + end + if button.newBreadcrumbFunc then + local f8_local1 = button.newBreadcrumbFunc + if type( f8_local1 ) == "string" then + f8_local1 = LUI.getTableFromPath( f8_local1 ) + end + if f8_local1 then + button.isBreadcrumbNew = f8_local1( controller ) + end + end + if button.warningFunc ~= nil then + button.warning = button.warningFunc( controller ) + end + if button.starterPack == CoD.LobbyButtons.STARTERPACK_UPGRADE then + button.starterPackUpgrade = true + if IsStarterPack() then + button.disabled = false + end + end + table.insert( options, { + optionDisplay = button.stringRef, + action = button.action, + param = button.param, + customId = button.customId, + isLargeButton = isLargeButton, + isLastButtonInGroup = false, + disabled = button.disabled, + selected = button.selected, + isBreadcrumbNew = button.isBreadcrumbNew, + warning = button.warning, + requiredChunk = button.selectedParam, + starterPackUpgrade = button.starterPackUpgrade, + unloadMod = button.unloadMod + } ) +end + +local AddLargeButton = function ( controller, options, button ) + AddButton( controller, options, button, true ) +end + +local AddSmallButton = function ( controller, options, button ) + AddButton( controller, options, button, false ) +end + +local AddSpacer = function ( options ) + if 0 < #options then + options[#options].isLastButtonInGroup = true + end +end + +CoD.LobbyMenus.MPButtonsOnline = function ( f26_arg0, f26_arg1, f26_arg2 ) + if f26_arg2 == 1 then + AddLargeButton( f26_arg0, f26_arg1, CoD.LobbyButtons.MP_FIND_MATCH ) + AddSpacer( f26_arg1 ) + end + AddLargeButton( f26_arg0, f26_arg1, CoD.LobbyButtons.MP_CAC_NO_WARNING ) + AddLargeButton( f26_arg0, f26_arg1, CoD.LobbyButtons.MP_SPECIALISTS_NO_WARNING ) + AddLargeButton( f26_arg0, f26_arg1, CoD.LobbyButtons.MP_SCORESTREAKS ) + if (Dvar.ui_execdemo_beta:get() or IsStarterPack()) and IsStoreAvailable() then + if CoD.isPC then + AddLargeButton( f26_arg0, f26_arg1, CoD.LobbyButtons.STEAM_STORE ) + else + AddLargeButton( f26_arg0, f26_arg1, CoD.LobbyButtons.STORE ) + end + end + if Engine.DvarBool( nil, "inventory_test_button_visible" ) then + AddLargeButton( f26_arg0, f26_arg1, CoD.LobbyButtons.MP_INVENTORY_TEST ) + end + AddSpacer( f26_arg1 ) + if not DisableBlackMarket() then + AddSmallButton( f26_arg0, f26_arg1, CoD.LobbyButtons.BLACK_MARKET ) + end + AddSpacer( f26_arg1 ) + AddSmallButton( f26_arg0, f26_arg1, CoD.LobbyButtons.MP_STATS ) +end + +local targetButtons = { + [LobbyData.UITargets.UI_MAIN.id] = CoD.LobbyMenus.ModeSelect, + [LobbyData.UITargets.UI_MODESELECT.id] = CoD.LobbyMenus.ModeSelect, + [LobbyData.UITargets.UI_CPLOBBYLANGAME.id] = CoD.LobbyMenus.CPButtonsLAN, + [LobbyData.UITargets.UI_CPLOBBYLANCUSTOMGAME.id] = CoD.LobbyMenus.CPButtonsLANCUSTOM, + [LobbyData.UITargets.UI_CPLOBBYONLINE.id] = CoD.LobbyMenus.CPButtonsOnline, + [LobbyData.UITargets.UI_CPLOBBYONLINEPUBLICGAME.id] = CoD.LobbyMenus.CPButtonsPublicGame, + [LobbyData.UITargets.UI_CPLOBBYONLINECUSTOMGAME.id] = CoD.LobbyMenus.CPButtonsCustomGame, + [LobbyData.UITargets.UI_CP2LOBBYLANGAME.id] = CoD.LobbyMenus.CPZMButtonsLAN, + [LobbyData.UITargets.UI_CP2LOBBYLANCUSTOMGAME.id] = CoD.LobbyMenus.CPButtonsLANCUSTOM, + [LobbyData.UITargets.UI_CP2LOBBYONLINE.id] = CoD.LobbyMenus.CPZMButtonsOnline, + [LobbyData.UITargets.UI_CP2LOBBYONLINEPUBLICGAME.id] = CoD.LobbyMenus.CPZMButtonsPublicGame, + [LobbyData.UITargets.UI_CP2LOBBYONLINECUSTOMGAME.id] = CoD.LobbyMenus.CPButtonsCustomGame, + [LobbyData.UITargets.UI_DOALOBBYLANGAME.id] = CoD.LobbyMenus.DOAButtonsLAN, + [LobbyData.UITargets.UI_DOALOBBYONLINE.id] = CoD.LobbyMenus.DOAButtonsOnline, + [LobbyData.UITargets.UI_DOALOBBYONLINEPUBLICGAME.id] = CoD.LobbyMenus.DOAButtonsPublicGame, + [LobbyData.UITargets.UI_MPLOBBYLANGAME.id] = CoD.LobbyMenus.MPButtonsLAN, + [LobbyData.UITargets.UI_MPLOBBYMAIN.id] = CoD.LobbyMenus.MPButtonsMain, + [LobbyData.UITargets.UI_MPLOBBYONLINE.id] = CoD.LobbyMenus.MPButtonsOnline, + [LobbyData.UITargets.UI_MPLOBBYONLINEPUBLICGAME.id] = CoD.LobbyMenus.MPButtonsOnlinePublic, + [LobbyData.UITargets.UI_MPLOBBYONLINEMODGAME.id] = CoD.LobbyMenus.MPButtonsModGame, + [LobbyData.UITargets.UI_MPLOBBYONLINECUSTOMGAME.id] = CoD.LobbyMenus.MPButtonsCustomGame, + [LobbyData.UITargets.UI_MPLOBBYONLINEARENA.id] = CoD.LobbyMenus.MPButtonsArena, + [LobbyData.UITargets.UI_MPLOBBYONLINEARENAGAME.id] = CoD.LobbyMenus.MPButtonsArenaGame, + [LobbyData.UITargets.UI_FRLOBBYONLINEGAME.id] = CoD.LobbyMenus.FRButtonsOnlineGame, + [LobbyData.UITargets.UI_FRLOBBYLANGAME.id] = CoD.LobbyMenus.FRButtonsLANGame, + [LobbyData.UITargets.UI_ZMLOBBYLANGAME.id] = CoD.LobbyMenus.ZMButtonsLAN, + [LobbyData.UITargets.UI_ZMLOBBYONLINE.id] = CoD.LobbyMenus.ZMButtonsOnline, + [LobbyData.UITargets.UI_ZMLOBBYONLINEPUBLICGAME.id] = CoD.LobbyMenus.ZMButtonsPublicGame, + [LobbyData.UITargets.UI_ZMLOBBYONLINECUSTOMGAME.id] = CoD.LobbyMenus.ZMButtonsCustomGame, + [LobbyData.UITargets.UI_MPLOBBYONLINETHEATER.id] = CoD.LobbyMenus.ButtonsTheaterGame, + [LobbyData.UITargets.UI_ZMLOBBYONLINETHEATER.id] = CoD.LobbyMenus.ButtonsTheaterGame +} +CoD.LobbyMenus.AddButtonsForTarget = function ( controller, id ) + local buttonFunc = targetButtons[id] + local model = nil + if Engine.IsLobbyActive( Enum.LobbyType.LOBBY_TYPE_GAME ) then + model = Engine.GetModel( DataSources.LobbyRoot.getModel( controller ), "gameClient.isHost" ) + else + model = Engine.GetModel( DataSources.LobbyRoot.getModel( controller ), "privateClient.isHost" ) + end + local isLeader = nil + if model ~= nil then + isLeader = Engine.GetModelValue( model ) + else + isLeader = 1 + end + local result = {} + buttonFunc( controller, result, isLeader ) + return result +end + diff --git a/src/client/component/dvars.cpp b/src/client/component/dvars.cpp new file mode 100644 index 00000000..4dcb0d00 --- /dev/null +++ b/src/client/component/dvars.cpp @@ -0,0 +1,101 @@ +#include +#include "loader/component_loader.hpp" + +#include "game/game.hpp" + +#include +#include +#include + +#include "scheduler.hpp" + +namespace dvars +{ + namespace + { + bool initial_config_read = false; + utils::hook::detour dvar_register_new_hook; + utils::hook::detour dvar_set_variant_hook; + + utils::hook::detour set_config_dvar_hook; + utils::hook::detour for_each_name_match_hook; + utils::hook::detour get_debug_name_hook; + + + const std::string get_config_file_path() + { + return "players/user/config.cfg"; + } + + void write_archive_dvars() + { + std::string config_buffer; + + for (int i = 0; i < *game::g_dvarCount; ++i) + { + const auto* dvar = reinterpret_cast(&game::s_dvarPool[160 * i]); + + if (!dvar->debugName || (game::dvarFlags_e::DVAR_SAVED & dvar->flags) == 0) + continue; + + auto name = dvar->debugName; + auto value = game::Dvar_DisplayableValue(dvar); + + config_buffer.append(utils::string::va("set %s %s\n", name, value)); + } + + if (config_buffer.length() == 0) + return; + + utils::io::write_file(get_config_file_path(), config_buffer); + } + + void dvar_set_variant_stub(game::dvar_t* dvar, game::DvarValue* value, unsigned int source) + { + dvar_set_variant_hook.invoke(dvar, value, source); + + if (initial_config_read && (game::dvarFlags_e::DVAR_SAVED & dvar->flags) != 0 && dvar->debugName) + { + write_archive_dvars(); + } + } + + void read_archive_dvars() + { + const std::string path = get_config_file_path(); + + if (!utils::io::file_exists(path)) + return; + + std::string filedata; + utils::io::read_file(path, &filedata); + + game::Cbuf_ExecuteBuffer(0, game::ControllerIndex_t::CONTROLLER_INDEX_0, filedata.c_str()); + initial_config_read = true; + } + + game::dvar_t* dvar_register_new_stub(game::dvarStrHash_t hash, const char* dvar_name, game::dvarType_t type, unsigned int flags, + game::DvarValue value, game::DvarLimits domain, const char* description) + { + auto dvar = dvar_register_new_hook.invoke(hash, dvar_name, type, flags, value, domain, description); + + dvar->debugName = dvar_name; // TODO: gives access violation error + + return dvar; + } + } + + class component final : public client_component + { + public: + void post_unpack() override + { + scheduler::once(read_archive_dvars, scheduler::pipeline::main); + + //dvar_register_new_hook.create(0x1422C5330_g, dvar_register_new_stub); + dvar_set_variant_hook.create(0x1422C9A90_g, dvar_set_variant_stub); + } + }; +} + +REGISTER_COMPONENT(dvars::component) diff --git a/src/client/component/loot.cpp b/src/client/component/loot.cpp index ee1fcbb3..eaff7def 100644 --- a/src/client/component/loot.cpp +++ b/src/client/component/loot.cpp @@ -10,13 +10,20 @@ namespace loot { namespace { + game::dvar_t* dvar_cg_unlockall_loot; + utils::hook::detour loot_getitemquantity_hook; utils::hook::detour liveinventory_getitemquantity_hook; utils::hook::detour liveinventory_areextraslotspurchased_hook; - int loot_getitemquantity_stub(const game::ControllerIndex_t /*controller_index*/, const game::eModes mode, - const int /*item_id*/) + int loot_getitemquantity_stub(const game::ControllerIndex_t controller_index, const game::eModes mode, + const int item_id) { + if (!dvar_cg_unlockall_loot->current.enabled) + { + return loot_getitemquantity_hook.invoke(controller_index, mode, item_id); + } + if (mode == game::eModes::MODE_ZOMBIES) { return 999; @@ -28,8 +35,8 @@ namespace loot int liveinventory_getitemquantity_stub(const game::ControllerIndex_t controller_index, const int item_id) { // Item id's for extra CaC slots, CWL camo's and paid specialist outfits - if (item_id == 99003 || item_id >= 99018 && item_id <= 99021 || item_id == 99025 || item_id >= 90047 && - item_id <= 90064) + if (dvar_cg_unlockall_loot->current.enabled && (item_id == 99003 || item_id >= 99018 && item_id <= 99021 || item_id == 99025|| + item_id >= 90047 && item_id <= 90064)) { return 1; } @@ -37,15 +44,14 @@ namespace loot return liveinventory_getitemquantity_hook.invoke(controller_index, item_id); } - bool liveinventory_areextraslotspurchased_stub(const game::ControllerIndex_t /*controller_index*/) + bool liveinventory_areextraslotspurchased_stub(const game::ControllerIndex_t controller_index) { - return true; - } + if (dvar_cg_unlockall_loot->current.enabled) + { + return true; + } - void set_dvars_on_startup() - { - game::Dvar_SetFromStringByName("ui_enableAllHeroes", "1", true); - game::Dvar_SetFromStringByName("ui_allLootUnlocked", "1", true); + return liveinventory_areextraslotspurchased_hook.invoke(controller_index); } }; @@ -53,7 +59,9 @@ namespace loot { void post_unpack() override { - scheduler::once(set_dvars_on_startup, scheduler::pipeline::main); + dvar_cg_unlockall_loot = game::Dvar_RegisterBool(game::Dvar_GenerateHash("cg_unlockall_loot"), "cg_unlockall_loot", false, (game::dvarFlags_e)0x40, "Unlocks blackmarket loot"); + dvar_cg_unlockall_loot->debugName = "cg_unlockall_loot"; + loot_getitemquantity_hook.create(0x141E82C90_g, loot_getitemquantity_stub); liveinventory_getitemquantity_hook.create(0x141E090C0_g, liveinventory_getitemquantity_stub); liveinventory_areextraslotspurchased_hook.create(0x141E089E0_g, liveinventory_areextraslotspurchased_stub); diff --git a/src/client/component/ui_scripting.cpp b/src/client/component/ui_scripting.cpp index 558e6ef9..1b3d392f 100644 --- a/src/client/component/ui_scripting.cpp +++ b/src/client/component/ui_scripting.cpp @@ -222,7 +222,14 @@ namespace ui_scripting ui_cod_init_hook.invoke(frontend); if (game::Com_IsRunningUILevel()) + { + // Fetch the names of the local files so file overrides are already handled + globals = {}; + load_local_script_files(game::get_host_library().get_folder().append("/data/ui_scripts/").string()); + load_local_script_files("boiii/ui_scripts/"); + load_local_script_files("data/ui_scripts/"); return; + } const auto _0 = utils::finally(&try_start); } diff --git a/src/client/game/structs.hpp b/src/client/game/structs.hpp index 11f0f388..b965f430 100644 --- a/src/client/game/structs.hpp +++ b/src/client/game/structs.hpp @@ -417,8 +417,8 @@ namespace game ERROR_LUA = 0x200, ERROR_SOFTRESTART = 0x400, ERROR_SOFTRESTART_KEEPDW = 0x800, - }; - + }; + enum XAssetType { ASSET_TYPE_PHYSPRESET = 0x0, @@ -530,19 +530,19 @@ namespace game ASSET_TYPE_REPORT = 0x6A, ASSET_TYPE_DEPEND = 0x68, ASSET_TYPE_FULL_COUNT = 0x6C, - }; - - struct LuaFile - { - const char* name; - int len; - const char* buffer; - }; - - union XAssetHeader - { - void* data; - LuaFile* luaFile; + }; + + struct LuaFile + { + const char* name; + int len; + const char* buffer; + }; + + union XAssetHeader + { + void* data; + LuaFile* luaFile; }; struct XZoneBuffer @@ -624,8 +624,8 @@ namespace game DVAR_TYPE_COLOR_LAB = 0xE, DVAR_TYPE_SESSIONMODE_BASE_DVAR = 0xF, DVAR_TYPE_COUNT = 0x10, - }; - + }; + enum dvarFlags_e { DVAR_ARCHIVE = 1 << 0, @@ -666,7 +666,6 @@ namespace game vec4_t vector; const char* string; byte color[4]; - const dvar_t* indirect[3]; }; struct $7034703ED3857507327AE195CCA24A71 @@ -1016,15 +1015,15 @@ namespace game Agreement debugAgreement; JoinType joinType; JoinResult joinResult; - }; - - - namespace hks - { - struct lua_State; - struct HashTable; - struct StringTable; - struct cclosure; + }; + + + namespace hks + { + struct lua_State; + struct HashTable; + struct StringTable; + struct cclosure; typedef int hksBool; typedef char hksChar; typedef unsigned __int8 hksByte; @@ -1034,183 +1033,183 @@ namespace game typedef int hksInt32; typedef unsigned int hksUint32; typedef __int64 hksInt64; - typedef unsigned __int64 hksUint64; + typedef unsigned __int64 hksUint64; typedef int HksGcCost; - - + + typedef size_t hksSize; typedef void* (*lua_Alloc)(void*, void*, size_t, size_t); - typedef hksInt32(*lua_CFunction)(lua_State*); - - struct GenericChunkHeader - { - hksSize m_flags; - }; - - struct ChunkHeader : GenericChunkHeader - { - ChunkHeader* m_next; + typedef hksInt32(*lua_CFunction)(lua_State*); + + struct GenericChunkHeader + { + hksSize m_flags; + }; + + struct ChunkHeader : GenericChunkHeader + { + ChunkHeader* m_next; }; struct ChunkList { ChunkHeader m_head; - }; - - struct UserData : ChunkHeader - { - unsigned __int64 m_envAndSizeOffsetHighBits; - unsigned __int64 m_metaAndSizeOffsetLowBits; - char m_data[8]; - }; - - struct InternString - { - unsigned __int64 m_flags; - unsigned __int64 m_lengthbits; - unsigned int m_hash; - char m_data[30]; - }; - - union HksValue - { - cclosure* cClosure; - void* closure; - UserData* userData; - HashTable* table; - void* tstruct; - InternString* str; - void* thread; - void* ptr; - float number; - unsigned int native; - bool boolean; - }; - - enum HksObjectType - { - TANY = 0xFFFFFFFE, - TNONE = 0xFFFFFFFF, - TNIL = 0x0, - TBOOLEAN = 0x1, - TLIGHTUSERDATA = 0x2, - TNUMBER = 0x3, - TSTRING = 0x4, - TTABLE = 0x5, - TFUNCTION = 0x6, // idk - TUSERDATA = 0x7, - TTHREAD = 0x8, - TIFUNCTION = 0x9, // Lua function - TCFUNCTION = 0xA, // C function - TUI64 = 0xB, - TSTRUCT = 0xC, - NUM_TYPE_OBJECTS = 0xE, - }; - - struct HksObject - { - HksObjectType t; - HksValue v; - }; - - const struct hksInstruction - { - unsigned int code; - }; - - struct ActivationRecord - { - HksObject* m_base; - const hksInstruction* m_returnAddress; - __int16 m_tailCallDepth; - __int16 m_numVarargs; - int m_numExpectedReturns; - }; - - struct CallStack - { - ActivationRecord* m_records; - ActivationRecord* m_lastrecord; - ActivationRecord* m_current; - const hksInstruction* m_current_lua_pc; - const hksInstruction* m_hook_return_addr; - int m_hook_level; - }; - - struct ApiStack - { - HksObject* top; - HksObject* base; - HksObject* alloc_top; - HksObject* bottom; - }; - - struct UpValue : ChunkHeader - { - HksObject m_storage; - HksObject* loc; - UpValue* m_next; - }; - - struct CallSite - { - _SETJMP_FLOAT128 m_jumpBuffer[16]; - CallSite* m_prev; - }; - - enum Status - { - NEW = 0x1, - RUNNING = 0x2, - YIELDED = 0x3, - DEAD_ERROR = 0x4, - }; - - enum HksError - { - HKS_NO_ERROR = 0, - HKS_ERRSYNTAX = -4, - HKS_ERRFILE = -5, - HKS_ERRRUN = -100, - HKS_ERRMEM = -200, - HKS_ERRERR = -300, - HKS_THROWING_ERROR = -500, - HKS_GC_YIELD = 1, - }; - - struct lua_Debug - { - int event; - const char* name; - const char* namewhat; - const char* what; - const char* source; - int currentline; - int nups; - int nparams; - int ishksfunc; - int linedefined; - int lastlinedefined; - char short_src[512]; - int callstack_level; - int is_tail_call; - }; - - using lua_function = int(__fastcall*)(lua_State*); - - struct luaL_Reg - { - const char* name; - lua_function function; - }; - - struct Node - { - HksObject m_key; - HksObject m_value; - }; - + }; + + struct UserData : ChunkHeader + { + unsigned __int64 m_envAndSizeOffsetHighBits; + unsigned __int64 m_metaAndSizeOffsetLowBits; + char m_data[8]; + }; + + struct InternString + { + unsigned __int64 m_flags; + unsigned __int64 m_lengthbits; + unsigned int m_hash; + char m_data[30]; + }; + + union HksValue + { + cclosure* cClosure; + void* closure; + UserData* userData; + HashTable* table; + void* tstruct; + InternString* str; + void* thread; + void* ptr; + float number; + unsigned int native; + bool boolean; + }; + + enum HksObjectType + { + TANY = 0xFFFFFFFE, + TNONE = 0xFFFFFFFF, + TNIL = 0x0, + TBOOLEAN = 0x1, + TLIGHTUSERDATA = 0x2, + TNUMBER = 0x3, + TSTRING = 0x4, + TTABLE = 0x5, + TFUNCTION = 0x6, // idk + TUSERDATA = 0x7, + TTHREAD = 0x8, + TIFUNCTION = 0x9, // Lua function + TCFUNCTION = 0xA, // C function + TUI64 = 0xB, + TSTRUCT = 0xC, + NUM_TYPE_OBJECTS = 0xE, + }; + + struct HksObject + { + HksObjectType t; + HksValue v; + }; + + const struct hksInstruction + { + unsigned int code; + }; + + struct ActivationRecord + { + HksObject* m_base; + const hksInstruction* m_returnAddress; + __int16 m_tailCallDepth; + __int16 m_numVarargs; + int m_numExpectedReturns; + }; + + struct CallStack + { + ActivationRecord* m_records; + ActivationRecord* m_lastrecord; + ActivationRecord* m_current; + const hksInstruction* m_current_lua_pc; + const hksInstruction* m_hook_return_addr; + int m_hook_level; + }; + + struct ApiStack + { + HksObject* top; + HksObject* base; + HksObject* alloc_top; + HksObject* bottom; + }; + + struct UpValue : ChunkHeader + { + HksObject m_storage; + HksObject* loc; + UpValue* m_next; + }; + + struct CallSite + { + _SETJMP_FLOAT128 m_jumpBuffer[16]; + CallSite* m_prev; + }; + + enum Status + { + NEW = 0x1, + RUNNING = 0x2, + YIELDED = 0x3, + DEAD_ERROR = 0x4, + }; + + enum HksError + { + HKS_NO_ERROR = 0, + HKS_ERRSYNTAX = -4, + HKS_ERRFILE = -5, + HKS_ERRRUN = -100, + HKS_ERRMEM = -200, + HKS_ERRERR = -300, + HKS_THROWING_ERROR = -500, + HKS_GC_YIELD = 1, + }; + + struct lua_Debug + { + int event; + const char* name; + const char* namewhat; + const char* what; + const char* source; + int currentline; + int nups; + int nparams; + int ishksfunc; + int linedefined; + int lastlinedefined; + char short_src[512]; + int callstack_level; + int is_tail_call; + }; + + using lua_function = int(__fastcall*)(lua_State*); + + struct luaL_Reg + { + const char* name; + lua_function function; + }; + + struct Node + { + HksObject m_key; + HksObject m_value; + }; + struct StringPinner { struct Node @@ -1224,7 +1223,7 @@ namespace game InternString** m_nextStringsPlace; Node m_firstNode; Node* m_currentNode; - }; + }; struct StringTable { @@ -1232,102 +1231,102 @@ namespace game unsigned int m_count; unsigned int m_mask; StringPinner* m_pinnedStrings; - }; - - struct Metatable - { - }; - - struct HashTable : ChunkHeader - { - Metatable* m_meta; - unsigned int m_version; - unsigned int m_mask; - Node* m_hashPart; - HksObject* m_arrayPart; - unsigned int m_arraySize; - Node* m_freeNode; - }; - - struct cclosure : ChunkHeader - { - lua_function m_function; - HashTable* m_env; - __int16 m_numUpvalues; - __int16 m_flags; - InternString* m_name; - HksObject m_upvalues[1]; - }; - - enum HksCompilerSettings_BytecodeSharingFormat - { - BYTECODE_DEFAULT = 0x0, - BYTECODE_INPLACE = 0x1, - BYTECODE_REFERENCED = 0x2, - }; - - enum HksCompilerSettings_IntLiteralOptions - { - INT_LITERALS_NONE = 0x0, - INT_LITERALS_LUD = 0x1, - INT_LITERALS_32BIT = 0x1, - INT_LITERALS_UI64 = 0x2, - INT_LITERALS_64BIT = 0x2, - INT_LITERALS_ALL = 0x3, - }; - - struct HksCompilerSettings - { - int m_emitStructCode; - const char** m_stripNames; - int m_emitGlobalMemoization; - int _m_isHksGlobalMemoTestingMode; - HksCompilerSettings_BytecodeSharingFormat m_bytecodeSharingFormat; - HksCompilerSettings_IntLiteralOptions m_enableIntLiterals; - int(*m_debugMap)(const char*, int); - }; - - enum HksBytecodeSharingMode : __int64 - { + }; + + struct Metatable + { + }; + + struct HashTable : ChunkHeader + { + Metatable* m_meta; + unsigned int m_version; + unsigned int m_mask; + Node* m_hashPart; + HksObject* m_arrayPart; + unsigned int m_arraySize; + Node* m_freeNode; + }; + + struct cclosure : ChunkHeader + { + lua_function m_function; + HashTable* m_env; + __int16 m_numUpvalues; + __int16 m_flags; + InternString* m_name; + HksObject m_upvalues[1]; + }; + + enum HksCompilerSettings_BytecodeSharingFormat + { + BYTECODE_DEFAULT = 0x0, + BYTECODE_INPLACE = 0x1, + BYTECODE_REFERENCED = 0x2, + }; + + enum HksCompilerSettings_IntLiteralOptions + { + INT_LITERALS_NONE = 0x0, + INT_LITERALS_LUD = 0x1, + INT_LITERALS_32BIT = 0x1, + INT_LITERALS_UI64 = 0x2, + INT_LITERALS_64BIT = 0x2, + INT_LITERALS_ALL = 0x3, + }; + + struct HksCompilerSettings + { + int m_emitStructCode; + const char** m_stripNames; + int m_emitGlobalMemoization; + int _m_isHksGlobalMemoTestingMode; + HksCompilerSettings_BytecodeSharingFormat m_bytecodeSharingFormat; + HksCompilerSettings_IntLiteralOptions m_enableIntLiterals; + int(*m_debugMap)(const char*, int); + }; + + enum HksBytecodeSharingMode : __int64 + { HKS_BYTECODE_SHARING_OFF = 0, HKS_BYTECODE_SHARING_ON = 1, - HKS_BYTECODE_SHARING_SECURE = 2 - }; - - struct HksGcWeights - { - int m_removeString; - int m_finalizeUserdataNoMM; - int m_finalizeUserdataGcMM; - int m_cleanCoroutine; - int m_removeWeak; - int m_markObject; - int m_traverseString; - int m_traverseUserdata; - int m_traverseCoroutine; - int m_traverseWeakTable; - int m_freeChunk; - int m_sweepTraverse; - }; - - struct GarbageCollector_Stack - { - void* m_storage; - unsigned int m_numEntries; - unsigned int m_numAllocated; - }; - - struct ProtoList - { - void** m_protoList; - unsigned __int16 m_protoSize; - unsigned __int16 m_protoAllocSize; - }; - - struct MemoryManager; - - struct GarbageCollector - { + HKS_BYTECODE_SHARING_SECURE = 2 + }; + + struct HksGcWeights + { + int m_removeString; + int m_finalizeUserdataNoMM; + int m_finalizeUserdataGcMM; + int m_cleanCoroutine; + int m_removeWeak; + int m_markObject; + int m_traverseString; + int m_traverseUserdata; + int m_traverseCoroutine; + int m_traverseWeakTable; + int m_freeChunk; + int m_sweepTraverse; + }; + + struct GarbageCollector_Stack + { + void* m_storage; + unsigned int m_numEntries; + unsigned int m_numAllocated; + }; + + struct ProtoList + { + void** m_protoList; + unsigned __int16 m_protoSize; + unsigned __int16 m_protoAllocSize; + }; + + struct MemoryManager; + + struct GarbageCollector + { struct ResumeStack { void* m_storage; @@ -1360,8 +1359,8 @@ namespace game WeakStack_Entry* m_storage; hksInt32 m_numEntries; hksUint32 m_numAllocated; - }; - + }; + HksGcCost m_target; HksGcCost m_stepsLeft; HksGcCost m_stepLimit; @@ -1396,24 +1395,24 @@ namespace game hksUint32 m_stringTableIndex; hksUint32 m_stringTableSize; UserData* m_lastBlackUD; - UserData* m_activeUD; - }; - - enum MemoryManager_ChunkColor - { - RED = 0x0, - BLACK = 0x1, - }; - - enum Hks_DeleteCheckingMode - { - HKS_DELETE_CHECKING_OFF = 0x0, - HKS_DELETE_CHECKING_ACCURATE = 0x1, - HKS_DELETE_CHECKING_SAFE = 0x2, - }; - - struct MemoryManager - { + UserData* m_activeUD; + }; + + enum MemoryManager_ChunkColor + { + RED = 0x0, + BLACK = 0x1, + }; + + enum Hks_DeleteCheckingMode + { + HKS_DELETE_CHECKING_OFF = 0x0, + HKS_DELETE_CHECKING_ACCURATE = 0x1, + HKS_DELETE_CHECKING_SAFE = 0x2, + }; + + struct MemoryManager + { enum ChunkColor : __int32 { WHITE = 0x0, @@ -1428,58 +1427,58 @@ namespace game ChunkList m_allocationList; ChunkList m_sweepList; ChunkHeader* m_lastKeptChunk; - lua_State* m_state; - }; - - struct StaticStringCache - { - HksObject m_objects[41]; - }; - - enum HksBytecodeEndianness - { - HKS_BYTECODE_DEFAULT_ENDIAN = 0x0, - HKS_BYTECODE_BIG_ENDIAN = 0x1, - HKS_BYTECODE_LITTLE_ENDIAN = 0x2, - }; - - struct RuntimeProfileData_Stats - { - unsigned __int64 hksTime; - unsigned __int64 callbackTime; - unsigned __int64 gcTime; - unsigned __int64 cFinalizerTime; - unsigned __int64 compilerTime; - unsigned int hkssTimeSamples; - unsigned int callbackTimeSamples; - unsigned int gcTimeSamples; - unsigned int compilerTimeSamples; - unsigned int num_newuserdata; - unsigned int num_tablerehash; - unsigned int num_pushstring; - unsigned int num_pushcfunction; - unsigned int num_newtables; - }; - - struct RuntimeProfileData - { - __int64 stackDepth; - __int64 callbackDepth; - unsigned __int64 lastTimer; - RuntimeProfileData_Stats frameStats; - unsigned __int64 gcStartTime; - unsigned __int64 finalizerStartTime; - unsigned __int64 compilerStartTime; - unsigned __int64 compilerStartGCTime; - unsigned __int64 compilerStartGCFinalizerTime; - unsigned __int64 compilerCallbackStartTime; - __int64 compilerDepth; - void* outFile; - lua_State* rootState; - }; - - struct HksGlobal - { + lua_State* m_state; + }; + + struct StaticStringCache + { + HksObject m_objects[41]; + }; + + enum HksBytecodeEndianness + { + HKS_BYTECODE_DEFAULT_ENDIAN = 0x0, + HKS_BYTECODE_BIG_ENDIAN = 0x1, + HKS_BYTECODE_LITTLE_ENDIAN = 0x2, + }; + + struct RuntimeProfileData_Stats + { + unsigned __int64 hksTime; + unsigned __int64 callbackTime; + unsigned __int64 gcTime; + unsigned __int64 cFinalizerTime; + unsigned __int64 compilerTime; + unsigned int hkssTimeSamples; + unsigned int callbackTimeSamples; + unsigned int gcTimeSamples; + unsigned int compilerTimeSamples; + unsigned int num_newuserdata; + unsigned int num_tablerehash; + unsigned int num_pushstring; + unsigned int num_pushcfunction; + unsigned int num_newtables; + }; + + struct RuntimeProfileData + { + __int64 stackDepth; + __int64 callbackDepth; + unsigned __int64 lastTimer; + RuntimeProfileData_Stats frameStats; + unsigned __int64 gcStartTime; + unsigned __int64 finalizerStartTime; + unsigned __int64 compilerStartTime; + unsigned __int64 compilerStartGCTime; + unsigned __int64 compilerStartGCFinalizerTime; + unsigned __int64 compilerCallbackStartTime; + __int64 compilerDepth; + void* outFile; + lua_State* rootState; + }; + + struct HksGlobal + { MemoryManager m_memory; GarbageCollector m_collector; StringTable m_stringTable; @@ -1498,30 +1497,30 @@ namespace game void* m_luaplusObjectList; int m_heapAssertionFrequency; int m_heapAssertionCount; - void (*m_logFunction)(lua_State*, const char*, ...); + void (*m_logFunction)(lua_State*, const char*, ...); void (*m_emergencyGCFailFunction)(lua_State*, size_t); HksBytecodeEndianness m_bytecodeDumpEndianness; - int padding2; - }; - - struct lua_State + int padding2; + }; + + struct lua_State { - ChunkHeader baseclass; - HksGlobal* m_global; - CallStack m_callStack; - ApiStack m_apistack; - UpValue* pending; - HksObject globals; - HksObject m_cEnv; - CallSite* m_callsites; - int m_numberOfCCalls; - void* m_context; - InternString* m_name; - lua_State* m_nextState; - lua_State* m_nextStateStack; - Status m_status; - HksError m_error; - }; + ChunkHeader baseclass; + HksGlobal* m_global; + CallStack m_callStack; + ApiStack m_apistack; + UpValue* pending; + HksObject globals; + HksObject m_cEnv; + CallSite* m_callsites; + int m_numberOfCCalls; + void* m_context; + InternString* m_name; + lua_State* m_nextState; + lua_State* m_nextStateStack; + Status m_status; + HksError m_error; + }; } typedef uint32_t ScrVarCanonicalName_t; diff --git a/src/client/game/symbols.hpp b/src/client/game/symbols.hpp index 59f2b7cc..bc32cdb0 100644 --- a/src/client/game/symbols.hpp +++ b/src/client/game/symbols.hpp @@ -20,7 +20,7 @@ namespace game // Com WEAK symbol Com_Printf{0x1421499C0, 0x140505630}; WEAK symbol Com_Error_{0x1420F8BD0}; - WEAK symbol Com_SessionMode_IsMode{0x1420F7DD0}; + WEAK symbol Com_SessionMode_IsMode{0x1420F7DD0}; WEAK symbol Com_IsRunningUILevel{0x142148DB0}; WEAK symbol Com_SwitchMode{ 0x14214AF30 @@ -43,6 +43,7 @@ namespace game 0x1420EDC20 }; WEAK symbol Con_GetTextCopy{0x14133A7D0, 0x140182C40}; + WEAK symbol Cbuf_ExecuteBuffer{0x14133BE10}; // DB WEAK symbol DB_LoadXAssets{ @@ -80,9 +81,17 @@ namespace game WEAK symbol Dvar_FindMalleableVar{0x1422BD6A0}; WEAK symbol Dvar_GetDebugName{0x1422BDCB0}; WEAK symbol Dvar_GetString{0x1422BFFF0, 0x140575E30}; + WEAK symbol Dvar_DisplayableValue{0x1422BCAE0}; + WEAK symbol Dvar_GetBool{ 0x1422BD930 }; + WEAK symbol Dvar_RegisterBool{ + 0x1422D1360 + }; + WEAK symbol Dvar_ForEach{ 0x1422BD760 }; WEAK symbol Dvar_SetFromStringByName{ 0x1422C7F60 }; + WEAK symbol s_dvarPool{ 0x157AC8220 }; + WEAK symbol g_dvarCount{ 0x157AC81CC }; // Scr WEAK symbol Scr_AddInt{0x0, 0x14016F160};