From d63ebf769649d6054e4d8029646a78a6653c9b6e Mon Sep 17 00:00:00 2001 From: VDm Date: Tue, 5 Aug 2025 22:05:19 +0400 Subject: [PATCH] feat(ui): implement CScriptRegion LUA methods --- src/gameui/CGCharacterModelBase.cpp | 5 +- src/gameui/CGCharacterModelBase.hpp | 4 +- src/gameui/GameScriptFunctions.cpp | 10 +- .../GameScriptFunctionsBattlenetUI.cpp | 9 +- .../scripts/GameScriptFunctionsContainer.cpp | 4 +- .../scripts/GameScriptFunctionsFriendList.cpp | 5 +- .../scripts/GameScriptFunctionsMinimap.cpp | 4 +- .../GameScriptFunctionsScriptEvents.cpp | 6 +- src/ui/CLayoutFrame.cpp | 7 + src/ui/CLayoutFrame.hpp | 1 + src/ui/CScriptRegionScript.cpp | 183 +++++++++++++++++- 11 files changed, 208 insertions(+), 30 deletions(-) diff --git a/src/gameui/CGCharacterModelBase.cpp b/src/gameui/CGCharacterModelBase.cpp index 035dcc0..9965b6a 100644 --- a/src/gameui/CGCharacterModelBase.cpp +++ b/src/gameui/CGCharacterModelBase.cpp @@ -16,7 +16,7 @@ void CGCharacterModelBase::CreateScriptMetaTable() { } void CGCharacterModelBase::RegisterScriptMethods(lua_State* L) { - CSimpleFrame::RegisterScriptMethods(L); + CSimpleModel::RegisterScriptMethods(L); FrameScript_Object::FillScriptMethodTable(L, CGCharacterModelBaseMethods, NUM_CGCHARACTER_MODEL_BASE_SCRIPT_METHODS); } @@ -24,6 +24,5 @@ int32_t CGCharacterModelBase::GetScriptMetaTable() { return CGCharacterModelBase::s_metatable; } -CGCharacterModelBase::CGCharacterModelBase(CSimpleFrame* parent) - : CSimpleFrame(parent) { +CGCharacterModelBase::CGCharacterModelBase(CSimpleFrame* parent) : CSimpleModel(parent) { } diff --git a/src/gameui/CGCharacterModelBase.hpp b/src/gameui/CGCharacterModelBase.hpp index 59fd37c..09da17e 100644 --- a/src/gameui/CGCharacterModelBase.hpp +++ b/src/gameui/CGCharacterModelBase.hpp @@ -1,10 +1,10 @@ #ifndef GAME_UI_CGCHARACTER_MODEL_BASE_HPP #define GAME_UI_CGCHARACTER_MODEL_BASE_HPP -#include "ui/CSimpleFrame.hpp" +#include "ui/CSimpleModel.hpp" #include "ui/CSimpleTop.hpp" -class CGCharacterModelBase : public CSimpleFrame { +class CGCharacterModelBase : public CSimpleModel { public: // Static variables static int32_t s_metatable; diff --git a/src/gameui/GameScriptFunctions.cpp b/src/gameui/GameScriptFunctions.cpp index c58304b..1b5b62a 100644 --- a/src/gameui/GameScriptFunctions.cpp +++ b/src/gameui/GameScriptFunctions.cpp @@ -14,6 +14,8 @@ // External from "ui/ScriptFunctions.hpp" void RegisterSimpleFrameScriptMethods(); +int32_t Script_GetScreenWidth(lua_State* L); +int32_t Script_GetScreenHeight(lua_State* L); static int32_t Script_FrameXML_Debug(lua_State* L) { @@ -580,14 +582,6 @@ static int32_t Script_ArenaTeamDisband(lua_State* L) { WHOA_UNIMPLEMENTED(0); } -static int32_t Script_GetScreenWidth(lua_State* L) { - WHOA_UNIMPLEMENTED(0); -} - -static int32_t Script_GetScreenHeight(lua_State* L) { - WHOA_UNIMPLEMENTED(0); -} - static int32_t Script_GetDamageBonusStat(lua_State* L) { WHOA_UNIMPLEMENTED(0); } diff --git a/src/gameui/scripts/GameScriptFunctionsBattlenetUI.cpp b/src/gameui/scripts/GameScriptFunctionsBattlenetUI.cpp index 6f0a498..3458c56 100644 --- a/src/gameui/scripts/GameScriptFunctionsBattlenetUI.cpp +++ b/src/gameui/scripts/GameScriptFunctionsBattlenetUI.cpp @@ -9,7 +9,10 @@ static int32_t Script_BNGetInfo(lua_State* L) { } static int32_t Script_BNGetNumFriends(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + // TODO + lua_pushnumber(L, 0.0); + lua_pushnumber(L, 0.0); + return 2; } static int32_t Script_BNGetFriendInfo(lua_State* L) { @@ -49,7 +52,9 @@ static int32_t Script_BNGetSelectedFriend(lua_State* L) { } static int32_t Script_BNGetNumFriendInvites(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + // TODO + lua_pushnumber(L, 0.0); + return 1; } static int32_t Script_BNGetFriendInviteInfo(lua_State* L) { diff --git a/src/gameui/scripts/GameScriptFunctionsContainer.cpp b/src/gameui/scripts/GameScriptFunctionsContainer.cpp index 9b32114..da643bd 100644 --- a/src/gameui/scripts/GameScriptFunctionsContainer.cpp +++ b/src/gameui/scripts/GameScriptFunctionsContainer.cpp @@ -9,7 +9,9 @@ static int32_t Script_ContainerIDToInventoryID(lua_State* L) { } static int32_t Script_GetContainerNumSlots(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + // TODO + lua_pushnumber(L, 16.0); + return 1; } static int32_t Script_GetContainerItemInfo(lua_State* L) { diff --git a/src/gameui/scripts/GameScriptFunctionsFriendList.cpp b/src/gameui/scripts/GameScriptFunctionsFriendList.cpp index 6d9aa40..1c674ea 100644 --- a/src/gameui/scripts/GameScriptFunctionsFriendList.cpp +++ b/src/gameui/scripts/GameScriptFunctionsFriendList.cpp @@ -5,7 +5,10 @@ static int32_t Script_GetNumFriends(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + // TODO + lua_pushnumber(L, 10.0); + lua_pushnumber(L, 0.0); + return 2; } static int32_t Script_GetFriendInfo(lua_State* L) { diff --git a/src/gameui/scripts/GameScriptFunctionsMinimap.cpp b/src/gameui/scripts/GameScriptFunctionsMinimap.cpp index a160eba..f4fb89c 100644 --- a/src/gameui/scripts/GameScriptFunctionsMinimap.cpp +++ b/src/gameui/scripts/GameScriptFunctionsMinimap.cpp @@ -5,7 +5,9 @@ static int32_t Script_GetNumTrackingTypes(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + // TODO + lua_pushnumber(L, 0.0); + return 1; } static int32_t Script_GetTrackingInfo(lua_State* L) { diff --git a/src/gameui/scripts/GameScriptFunctionsScriptEvents.cpp b/src/gameui/scripts/GameScriptFunctionsScriptEvents.cpp index 5435459..e92432e 100644 --- a/src/gameui/scripts/GameScriptFunctionsScriptEvents.cpp +++ b/src/gameui/scripts/GameScriptFunctionsScriptEvents.cpp @@ -2,6 +2,7 @@ #include "ui/FrameScript.hpp" #include "util/Lua.hpp" #include "util/Unimplemented.hpp" +#include "client/ClientServices.hpp" #include static int32_t Script_GetTime(lua_State* L) { @@ -33,7 +34,8 @@ static int32_t Script_AppendToFile(lua_State* L) { } static int32_t Script_GetAccountExpansionLevel(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + lua_pushnumber(L, ClientServices::GetExpansionLevel()); + return 1; } static int32_t Script_UnitExists(lua_State* L) { @@ -245,7 +247,7 @@ static int32_t Script_UnitSex(lua_State* L) { static int32_t Script_UnitLevel(lua_State* L) { // TODO - lua_pushnumber(L, 1.0); + lua_pushnumber(L, 25.0); return 1; } diff --git a/src/ui/CLayoutFrame.cpp b/src/ui/CLayoutFrame.cpp index bea0ec0..b144b4c 100644 --- a/src/ui/CLayoutFrame.cpp +++ b/src/ui/CLayoutFrame.cpp @@ -815,6 +815,13 @@ void CLayoutFrame::SetProtectFlag(uint32_t flag) { // TODO } +void CLayoutFrame::SetSize(float width, float height) { + this->m_flags &= ~0x8; + this->m_width = width; + this->m_height = height; + this->Resize(0); +} + void CLayoutFrame::SetWidth(float width) { this->m_flags &= ~0x8; this->m_width = width; diff --git a/src/ui/CLayoutFrame.hpp b/src/ui/CLayoutFrame.hpp index 19fe973..7ac39ef 100644 --- a/src/ui/CLayoutFrame.hpp +++ b/src/ui/CLayoutFrame.hpp @@ -46,6 +46,7 @@ class CLayoutFrame { virtual ~CLayoutFrame(); virtual CLayoutFrame* GetLayoutParent(); virtual bool SetLayoutScale(float scale, bool force); + virtual void SetSize(float width, float height); virtual void SetWidth(float width); virtual void SetHeight(float height); virtual float GetWidth(); diff --git a/src/ui/CScriptRegionScript.cpp b/src/ui/CScriptRegionScript.cpp index 6a3233e..ff56269 100644 --- a/src/ui/CScriptRegionScript.cpp +++ b/src/ui/CScriptRegionScript.cpp @@ -3,6 +3,7 @@ #include "ui/FrameScript_Object.hpp" #include "ui/CScriptRegion.hpp" #include "ui/CSimpleTop.hpp" +#include "ui/CFramePoint.hpp" #include "util/Lua.hpp" #include "util/StringTo.hpp" #include "util/Unimplemented.hpp" @@ -10,11 +11,20 @@ #include int32_t CScriptRegion_IsProtected(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + int32_t type = CScriptRegion::GetObjectType(); + auto region = static_cast(FrameScript_GetObjectThis(L, type)); + // TODO + lua_pushnil(L); + lua_pushnil(L); + return 2; } int32_t CScriptRegion_CanChangeProtectedState(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + int32_t type = CScriptRegion::GetObjectType(); + auto region = static_cast(FrameScript_GetObjectThis(L, type)); + // TODO + lua_pushnil(L); + return 1; } int32_t CScriptRegion_SetParent(lua_State* L) { @@ -22,7 +32,31 @@ int32_t CScriptRegion_SetParent(lua_State* L) { } int32_t CScriptRegion_GetRect(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + int32_t type = CScriptRegion::GetObjectType(); + auto region = static_cast(FrameScript_GetObjectThis(L, type)); + + if (region->IsResizePending()) { + region->Resize(1); + } + + CRect rect; + + if (!region->GetRect(&rect)) { + return 0; + } + float left = CoordinateGetAspectCompensation() * 1024.0f * rect.minX / region->m_layoutScale; + lua_pushnumber(L, DDCToNDCWidth(left)); + + float top = CoordinateGetAspectCompensation() * 1024.0f * rect.minY / region->m_layoutScale; + lua_pushnumber(L, DDCToNDCWidth(top)); + + float width = CoordinateGetAspectCompensation() * 1024.0f * (rect.maxX - rect.minX) / region->m_layoutScale; + lua_pushnumber(L, DDCToNDCWidth(width)); + + float height = CoordinateGetAspectCompensation() * 1024.0f * (rect.maxY - rect.minY) / region->m_layoutScale; + lua_pushnumber(L, DDCToNDCWidth(height)); + + return 4; } int32_t CScriptRegion_GetCenter(lua_State* L) { @@ -54,19 +88,83 @@ int32_t CScriptRegion_GetCenter(lua_State* L) { } int32_t CScriptRegion_GetLeft(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + int32_t type = CScriptRegion::GetObjectType(); + auto region = static_cast(FrameScript_GetObjectThis(L, type)); + + if (region->IsResizePending()) { + region->Resize(1); + } + + CRect rect; + + if (region->GetRect(&rect)) { + float value = CoordinateGetAspectCompensation() * 1024.0f * rect.minX / region->m_layoutScale; + lua_pushnumber(L, DDCToNDCWidth(value)); + } else { + lua_pushnil(L); + } + + return 1; } int32_t CScriptRegion_GetRight(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + int32_t type = CScriptRegion::GetObjectType(); + auto region = static_cast(FrameScript_GetObjectThis(L, type)); + + if (region->IsResizePending()) { + region->Resize(1); + } + + CRect rect; + + if (region->GetRect(&rect)) { + float value = CoordinateGetAspectCompensation() * 1024.0f * rect.maxX / region->m_layoutScale; + lua_pushnumber(L, DDCToNDCWidth(value)); + } else { + lua_pushnil(L); + } + + return 1; } int32_t CScriptRegion_GetTop(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + int32_t type = CScriptRegion::GetObjectType(); + auto region = static_cast(FrameScript_GetObjectThis(L, type)); + + if (region->IsResizePending()) { + region->Resize(1); + } + + CRect rect; + + if (region->GetRect(&rect)) { + float value = CoordinateGetAspectCompensation() * 1024.0f * rect.maxY / region->m_layoutScale; + lua_pushnumber(L, DDCToNDCWidth(value)); + } else { + lua_pushnil(L); + } + + return 1; } int32_t CScriptRegion_GetBottom(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + int32_t type = CScriptRegion::GetObjectType(); + auto region = static_cast(FrameScript_GetObjectThis(L, type)); + + if (region->IsResizePending()) { + region->Resize(1); + } + + CRect rect; + + if (region->GetRect(&rect)) { + float value = CoordinateGetAspectCompensation() * 1024.0f * rect.minY / region->m_layoutScale; + lua_pushnumber(L, DDCToNDCWidth(value)); + } else { + lua_pushnil(L); + } + + return 1; } int32_t CScriptRegion_GetWidth(lua_State* L) { @@ -168,15 +266,80 @@ int32_t CScriptRegion_SetHeight(lua_State* L) { } int32_t CScriptRegion_SetSize(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + int32_t type = CScriptRegion::GetObjectType(); + auto region = static_cast(FrameScript_GetObjectThis(L, type)); + + if (!region->ProtectedFunctionsAllowed()) { + // TODO + // - disallowed logic + + return 0; + } + + if (!lua_isnumber(L, 2) || !lua_isnumber(L, 3)) { + return luaL_error(L, "Usage: %s:SetSize(width, height)", region->GetDisplayName()); + } + + float width = lua_tonumber(L, 2); + float ndcWidth = width / (CoordinateGetAspectCompensation() * 1024.0f); + float ddcWidth = NDCToDDCWidth(ndcWidth); + + float height = lua_tonumber(L, 3); + float ndcHeight = height / (CoordinateGetAspectCompensation() * 1024.0f); + float ddcHeight = NDCToDDCWidth(ndcHeight); + + region->SetSize(width, height); + + return 0; } int32_t CScriptRegion_GetSize(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + int32_t type = CScriptRegion::GetObjectType(); + auto region = static_cast(FrameScript_GetObjectThis(L, type)); + + float width = region->GetWidth(); + float height = region->GetHeight(); + + if ((width == 0.0f || height == 0.0f) && !StringToBOOL(L, 2, 0)) { + if (region->IsResizePending()) { + region->Resize(1); + } + + CRect rect = { 0.0f, 0.0f, 0.0f, 0.0f }; + + if (region->GetRect(&rect)) { + width = (rect.maxX - rect.minX) / region->m_layoutScale; + height = (rect.maxY - rect.minY) / region->m_layoutScale; + } + } + + float ddcWidth = CoordinateGetAspectCompensation() * 1024.0f * width; + float ndcWidth = DDCToNDCWidth(ddcWidth); + lua_pushnumber(L, ndcWidth); + + float ddcHeight = CoordinateGetAspectCompensation() * 1024.0f * height; + float ndcHeight = DDCToNDCWidth(ddcHeight); + lua_pushnumber(L, ndcHeight); + + return 2; } int32_t CScriptRegion_GetNumPoints(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + int32_t type = CScriptRegion::GetObjectType(); + auto region = static_cast(FrameScript_GetObjectThis(L, type)); + + int32_t count = 0; + + for (int32_t i = 0; i < FRAMEPOINT_NUMPOINTS; i++) { + auto point = region->m_points[i]; + + if (point && !(point->m_flags & 0x8)) { + ++count; + } + } + + lua_pushnumber(L, count); + return 1; } int32_t CScriptRegion_GetPoint(lua_State* L) {