From 46a597d04c401d364e21da2973f5526704ad0cc1 Mon Sep 17 00:00:00 2001 From: Aeshur Date: Wed, 25 Feb 2026 00:35:38 -0500 Subject: [PATCH] [lua, c++] WoTG 37/46 - Spitewarden Mimicry --- .../missions/wotg/37_Darkness_Descends.lua | 3 +- .../missions/wotg/46_When_Wills_Collide.lua | 6 ++-- scripts/specs/core/CBaseEntity.lua | 5 ++++ src/map/lua/lua_baseentity.cpp | 29 +++++++++++++++++++ src/map/lua/lua_baseentity.h | 1 + 5 files changed, 41 insertions(+), 3 deletions(-) diff --git a/scripts/missions/wotg/37_Darkness_Descends.lua b/scripts/missions/wotg/37_Darkness_Descends.lua index 478f8c1cd1a..3797ff73ef8 100644 --- a/scripts/missions/wotg/37_Darkness_Descends.lua +++ b/scripts/missions/wotg/37_Darkness_Descends.lua @@ -44,7 +44,8 @@ mission.sections = [10] = function(player, csid, option, npc) if option == 5 then - player:updateEvent(156, 10, 305, 183, 320, 847, 450, 0) + local equip = player:getEquipmentModelIds() + player:updateEvent(156, player:getFace(), equip.head, equip.body, equip.hands, equip.main, equip.sub, 0) end end, }, diff --git a/scripts/missions/wotg/46_When_Wills_Collide.lua b/scripts/missions/wotg/46_When_Wills_Collide.lua index c9d8e4d9405..cc9edca1025 100644 --- a/scripts/missions/wotg/46_When_Wills_Collide.lua +++ b/scripts/missions/wotg/46_When_Wills_Collide.lua @@ -81,13 +81,15 @@ mission.sections = { [1] = function(player, csid, option, npc) if option == 5 then - player:updateEvent(12, 10, 305, 196, 320, 847, 450, 1) + local equip = player:getEquipmentModelIds() + player:updateEvent(119, player:getFace(), equip.head, equip.body, equip.hands, equip.main, equip.sub, 1) end end, [2] = function(player, csid, option, npc) if option == 5 then - player:updateEvent(119, 10, 305, 196, 320, 847, 450, 0) + local equip = player:getEquipmentModelIds() + player:updateEvent(182, player:getFace(), equip.head, equip.body, equip.hands, equip.main, equip.sub, 0) end end, }, diff --git a/scripts/specs/core/CBaseEntity.lua b/scripts/specs/core/CBaseEntity.lua index 3a31f330f6d..7202094d39e 100644 --- a/scripts/specs/core/CBaseEntity.lua +++ b/scripts/specs/core/CBaseEntity.lua @@ -1250,6 +1250,11 @@ end function CBaseEntity:setLook(look) end +---@nodiscard +---@return table +function CBaseEntity:getEquipmentModelIds() +end + ---@nodiscard ---@return integer function CBaseEntity:getCostume() diff --git a/src/map/lua/lua_baseentity.cpp b/src/map/lua/lua_baseentity.cpp index 31ad7ad6330..ded7d8f144c 100644 --- a/src/map/lua/lua_baseentity.cpp +++ b/src/map/lua/lua_baseentity.cpp @@ -5845,6 +5845,34 @@ void CLuaBaseEntity::setLook(const sol::table& look) ShowWarning("Invalid entity type calling function (%s).", m_PBaseEntity->getName()); } +/************************************************************************ + * Function: getEquipmentModelIds() + * Purpose : Returns the player's visible equipment model IDs + * Example : local equip = player:getEquipmentModelIds() + * Note : Returns table with keys: head, body, hands, main, sub + ************************************************************************/ +auto CLuaBaseEntity::getEquipmentModelIds() -> sol::table +{ + auto table = lua.create_table(); + if (m_PBaseEntity->objtype != TYPE_PC) + { + ShowWarning("getEquipmentModelIds: caller is not a player (%s).", m_PBaseEntity->getName()); + table["head"] = 0; + table["body"] = 0; + table["hands"] = 0; + table["main"] = 0; + table["sub"] = 0; + return table; + } + auto* PChar = static_cast(m_PBaseEntity); + table["head"] = PChar->look.head; + table["body"] = PChar->look.body; + table["hands"] = PChar->look.hands; + table["main"] = PChar->look.main; + table["sub"] = PChar->look.sub; + return table; +} + /************************************************************************ * Function: getCostume() * Purpose : Returns the PC's appearance @@ -19856,6 +19884,7 @@ void CLuaBaseEntity::Register() SOL_REGISTER("getModelId", CLuaBaseEntity::getModelId); SOL_REGISTER("setModelId", CLuaBaseEntity::setModelId); SOL_REGISTER("setLook", CLuaBaseEntity::setLook); + SOL_REGISTER("getEquipmentModelIds", CLuaBaseEntity::getEquipmentModelIds); SOL_REGISTER("getCostume", CLuaBaseEntity::getCostume); SOL_REGISTER("setCostume", CLuaBaseEntity::setCostume); SOL_REGISTER("getCostume2", CLuaBaseEntity::getCostume2); diff --git a/src/map/lua/lua_baseentity.h b/src/map/lua/lua_baseentity.h index 0249f2f4807..e8dc7af312f 100644 --- a/src/map/lua/lua_baseentity.h +++ b/src/map/lua/lua_baseentity.h @@ -306,6 +306,7 @@ class CLuaBaseEntity uint16 getModelId(); void setModelId(uint16 modelId, const sol::object& slotObj); void setLook(const sol::table& look); + auto getEquipmentModelIds() -> sol::table; uint16 getCostume(); void setCostume(uint16 costume); uint16 getCostume2();