From 43895197af5dbc3c3f90209a5bba8056ba74478b Mon Sep 17 00:00:00 2001 From: fallenoak Date: Sun, 8 Feb 2026 06:58:15 -0600 Subject: [PATCH] feat(ui): implement Script_SetCVar --- src/ui/game/GameScript.cpp | 37 +++++++++++++++++++++++++++++++++++- src/ui/game/ScriptEvents.cpp | 2 +- src/ui/game/Types.hpp | 2 ++ 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/ui/game/GameScript.cpp b/src/ui/game/GameScript.cpp index 8132635..9fe3ce3 100644 --- a/src/ui/game/GameScript.cpp +++ b/src/ui/game/GameScript.cpp @@ -4,6 +4,7 @@ #include "ui/FrameScript.hpp" #include "ui/ScriptFunctionsShared.hpp" #include "ui/game/CGGameUI.hpp" +#include "ui/game/Types.hpp" #include "ui/simple/CSimpleTop.hpp" #include "util/StringTo.hpp" #include "util/Unimplemented.hpp" @@ -131,7 +132,41 @@ int32_t Script_GetCVarInfo(lua_State* L) { } int32_t Script_SetCVar(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + if (!lua_isstring(L, 1)) { + luaL_error(L, "Usage: SetCVar(\"cvar\", value [, \"scriptCvar\")"); + return 0; + } + + auto varName = lua_tostring(L, 1); + auto var = CVar::LookupRegistered(varName); + + if (!var || (var->m_flags & 0x40)) { + luaL_error(L, "Couldn't find CVar named '%s'", varName); + return 0; + } + + if (var->m_flags & 0x4 || var->m_flags & 0x100) { + luaL_error(L, "\"%s\" is read-only", varName); + return 0; + } + + if (!(var->m_flags & 0x8)/* TODO || CSimpleTop::GetInstance()->dword124C */) { + auto value = lua_tostring(L, 2); + if (!value) { + value = "0"; + } + + var->Set(value, true, false, false, true); + + if (lua_isstring(L, 3)) { + auto scriptVarName = lua_tostring(L, 3); + FrameScript_SignalEvent(SCRIPT_CVAR_UPDATE, "%s%s", scriptVarName, value); + } + } else { + // TODO CGGameUI::ShowBlockedActionFeedback(nullptr, 2); + } + + return 0; } int32_t Script_GetCVar(lua_State* L) { diff --git a/src/ui/game/ScriptEvents.cpp b/src/ui/game/ScriptEvents.cpp index a607076..dc30c00 100644 --- a/src/ui/game/ScriptEvents.cpp +++ b/src/ui/game/ScriptEvents.cpp @@ -1187,7 +1187,7 @@ void ScriptEventsInitialize() { g_scriptEvents[295] = "TRAINER_UPDATE"; g_scriptEvents[296] = "TRAINER_DESCRIPTION_UPDATE"; g_scriptEvents[297] = "TRAINER_CLOSED"; - g_scriptEvents[298] = "CVAR_UPDATE"; + g_scriptEvents[SCRIPT_CVAR_UPDATE] = "CVAR_UPDATE"; g_scriptEvents[299] = "TRADE_SKILL_SHOW"; g_scriptEvents[300] = "TRADE_SKILL_UPDATE"; g_scriptEvents[301] = "TRADE_SKILL_CLOSE"; diff --git a/src/ui/game/Types.hpp b/src/ui/game/Types.hpp index be7891f..a54dce4 100644 --- a/src/ui/game/Types.hpp +++ b/src/ui/game/Types.hpp @@ -9,6 +9,8 @@ enum SCRIPTEVENT { SCRIPT_PLAYER_LOGOUT = 254, SCRIPT_PLAYER_ENTERING_WORLD = 255, // TODO + SCRIPT_CVAR_UPDATE = 298, + // TODO }; #endif