From 9b5b9a9e020b71fb926e066c4158d15da2e97c7a Mon Sep 17 00:00:00 2001 From: Will Buck Date: Thu, 24 Apr 2025 22:26:10 -0500 Subject: [PATCH 1/3] Separate Steal and Despoil lockout --- scripts/globals/job_utils/thief.lua | 12 ++++++------ scripts/specs/core/CBaseEntity.lua | 5 +++++ src/map/entities/mobentity.cpp | 16 +++++++++------- src/map/entities/mobentity.h | 13 +++++++------ src/map/lua/lua_baseentity.cpp | 24 ++++++++++++++++++++++-- src/map/lua/lua_baseentity.h | 1 + 6 files changed, 50 insertions(+), 21 deletions(-) diff --git a/scripts/globals/job_utils/thief.lua b/scripts/globals/job_utils/thief.lua index d3cdb5fffb8..0b067baeed8 100644 --- a/scripts/globals/job_utils/thief.lua +++ b/scripts/globals/job_utils/thief.lua @@ -213,24 +213,24 @@ xi.job_utils.thief.useDespoil = function(player, target, ability, action) player:addTP(tpSteal) end - local stolen = target:getDespoilItem() + local despoiled = target:getDespoilItem() if target:isMob() and math.random(1, 100) <= despoilChance and - stolen ~= 0 + despoiled ~= 0 then if player:getObjType() == xi.objType.TRUST then player:getMaster():addItem(stolen) else - player:addItem(stolen) + player:addItem(despoiled) end - target:itemStolen() + target:itemDespoiled() -- Attempt to grab the debuff from the DB -- If there isn't a debuff assigned to the item stolen, select one at random - local debuff = player:getDespoilDebuff(stolen) + local debuff = player:getDespoilDebuff(despoiled) if not debuff then debuff = despoilDebuffs[math.random(#despoilDebuffs)] @@ -244,7 +244,7 @@ xi.job_utils.thief.useDespoil = function(player, target, ability, action) ability:setMsg(xi.msg.basic.STEAL_FAIL) -- Failed end - return stolen + return despoiled end xi.job_utils.thief.useFeint = function(player, target, ability) diff --git a/scripts/specs/core/CBaseEntity.lua b/scripts/specs/core/CBaseEntity.lua index 3d5b92f9390..df1f733bdae 100644 --- a/scripts/specs/core/CBaseEntity.lua +++ b/scripts/specs/core/CBaseEntity.lua @@ -3992,6 +3992,11 @@ end function CBaseEntity:itemStolen() end +---@nodiscard +---@return boolean +function CBaseEntity:itemDespoiled() +end + ---@nodiscard ---@return integer function CBaseEntity:getTHlevel() diff --git a/src/map/entities/mobentity.cpp b/src/map/entities/mobentity.cpp index 1ff82739d7b..00914f8cf18 100644 --- a/src/map/entities/mobentity.cpp +++ b/src/map/entities/mobentity.cpp @@ -134,6 +134,7 @@ CMobEntity::CMobEntity() , m_HiPartySize(0) , m_THLvl(0) , m_ItemStolen(false) +, m_ItemDespoiled(false) , m_Family(0) , m_SuperFamily(0) , m_MobSkillList(0) @@ -593,13 +594,14 @@ void CMobEntity::Spawn() { TracyZoneScoped; CBattleEntity::Spawn(); - m_giveExp = true; - m_HiPCLvl = 0; - m_HiPartySize = 0; - m_THLvl = 0; - m_ItemStolen = false; - m_DropItemTime = 1000; - animationsub = (uint8)getMobMod(MOBMOD_SPAWN_ANIMATIONSUB); + m_giveExp = true; + m_HiPCLvl = 0; + m_HiPartySize = 0; + m_THLvl = 0; + m_ItemStolen = false; + m_ItemDespoiled = false; + m_DropItemTime = 1000; + animationsub = (uint8)getMobMod(MOBMOD_SPAWN_ANIMATIONSUB); SetCallForHelpFlag(false); PEnmityContainer->Clear(); diff --git a/src/map/entities/mobentity.h b/src/map/entities/mobentity.h index 260db921874..b44853fc062 100644 --- a/src/map/entities/mobentity.h +++ b/src/map/entities/mobentity.h @@ -238,14 +238,15 @@ class CMobEntity : public CBattleEntity position_t m_SpawnPoint; // spawn point of mob uint8 m_Element; - uint8 m_HiPCLvl; // Highest Level of Player Character that hit the Monster - uint8 m_HiPartySize; // Largest party size that hit the Monster - int16 m_THLvl; // Highest Level of Treasure Hunter that apply to drops - bool m_ItemStolen; // if true, mob has already been robbed. reset on respawn. also used for thf maat fight + uint8 m_HiPCLvl; // Highest Level of Player Character that hit the Monster + uint8 m_HiPartySize; // Largest party size that hit the Monster + int16 m_THLvl; // Highest Level of Treasure Hunter that apply to drops + bool m_ItemStolen; // if true, mob has already been robbed. reset on respawn. also used for thf maat fight + bool m_ItemDespoiled; // if true, mob has already been despoiled. reset on respawn. uint16 m_Family; uint16 m_SuperFamily; - uint16 m_MobSkillList; // Mob skill list defined from mob_pools - uint32 m_Pool; // pool the mob came from + uint16 m_MobSkillList; // Mob skill list defined from mob_pools + uint32 m_Pool; // pool the mob came from CMobSpellList* m_SpellListContainer; // The spells list container for this mob std::map m_UsedSkillIds; // mob skill ids used (key) along with mob level (value) diff --git a/src/map/lua/lua_baseentity.cpp b/src/map/lua/lua_baseentity.cpp index d7754031edd..fe0591aa175 100644 --- a/src/map/lua/lua_baseentity.cpp +++ b/src/map/lua/lua_baseentity.cpp @@ -18324,7 +18324,7 @@ uint16 CLuaBaseEntity::getDespoilItem() DropList_t* PDropList = itemutils::GetDropList(PMob->m_DropID); - if (PDropList && !PMob->m_ItemStolen) + if (PDropList && !PMob->m_ItemDespoiled) { std::vector despoilableItems; @@ -18361,7 +18361,7 @@ uint16 CLuaBaseEntity::getDespoilDebuff(uint16 itemID) * Function: itemStolen() * Purpose : Flags a mob's item as stolen, returns true upon update * Example : target:itemStolen() - * Notes : Used in scripts/actions/abilities/steal.lua + * Notes : Used in scripts/globals/job_utils/thief.lua ************************************************************************/ bool CLuaBaseEntity::itemStolen() @@ -18376,6 +18376,25 @@ bool CLuaBaseEntity::itemStolen() return true; } +/************************************************************************ + * Function: itemDespoiled() + * Purpose : Flags a mob's item as despoiled, returns true upon update + * Example : target:itemDespoiled() + * Notes : Used in scripts/globals/job_utils/thief.lua + ************************************************************************/ + +bool CLuaBaseEntity::itemDespoiled() +{ + if (m_PBaseEntity->objtype != TYPE_MOB) + { + ShowWarning("Attempting to flag despoiled item for invalid entity type (%s).", m_PBaseEntity->getName()); + return false; + } + + static_cast(m_PBaseEntity)->m_ItemDespoiled = true; + return true; +} + /************************************************************************ * Function: getTHlevel() * Purpose : Return mob's current Treasure Hunter tier @@ -19800,6 +19819,7 @@ void CLuaBaseEntity::Register() SOL_REGISTER("getDespoilItem", CLuaBaseEntity::getDespoilItem); SOL_REGISTER("getDespoilDebuff", CLuaBaseEntity::getDespoilDebuff); SOL_REGISTER("itemStolen", CLuaBaseEntity::itemStolen); + SOL_REGISTER("itemDespoiled", CLuaBaseEntity::itemDespoiled); SOL_REGISTER("getTHlevel", CLuaBaseEntity::getTHlevel); SOL_REGISTER("setTHlevel", CLuaBaseEntity::setTHlevel); diff --git a/src/map/lua/lua_baseentity.h b/src/map/lua/lua_baseentity.h index 34464988fd1..fbbcb7949e2 100644 --- a/src/map/lua/lua_baseentity.h +++ b/src/map/lua/lua_baseentity.h @@ -911,6 +911,7 @@ class CLuaBaseEntity uint16 getDespoilItem(); // gets ItemID of droplist despoil item from mob (steal item if no despoil item) uint16 getDespoilDebuff(uint16 itemID); // gets the status effect id to apply to the mob on successful despoil bool itemStolen(); // sets mob's ItemStolen var = true + bool itemDespoiled(); // sets mob's ItemDespoiled var = true int16 getTHlevel(); // Returns the Monster's current Treasure Hunter Tier void setTHlevel(int16 newLevel); // Sets the Monster's current Treasure Hunter Tier From 14b141d17625cb8d41bec5eb5deebdda4ac65f3d Mon Sep 17 00:00:00 2001 From: Will Buck Date: Thu, 24 Apr 2025 22:34:35 -0500 Subject: [PATCH 2/3] Fixed 'stolen'->'despoiled' --- scripts/globals/job_utils/thief.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/globals/job_utils/thief.lua b/scripts/globals/job_utils/thief.lua index 0b067baeed8..5d3a9b51340 100644 --- a/scripts/globals/job_utils/thief.lua +++ b/scripts/globals/job_utils/thief.lua @@ -221,7 +221,7 @@ xi.job_utils.thief.useDespoil = function(player, target, ability, action) despoiled ~= 0 then if player:getObjType() == xi.objType.TRUST then - player:getMaster():addItem(stolen) + player:getMaster():addItem(despoiled) else player:addItem(despoiled) end From 4c674a89a680c1f95a6404b4828d905259368dc1 Mon Sep 17 00:00:00 2001 From: Will Buck Date: Fri, 25 Apr 2025 14:02:51 -0500 Subject: [PATCH 3/3] Style fix in mobentity.h --- src/map/entities/mobentity.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/map/entities/mobentity.h b/src/map/entities/mobentity.h index b44853fc062..2111f9079ba 100644 --- a/src/map/entities/mobentity.h +++ b/src/map/entities/mobentity.h @@ -245,8 +245,8 @@ class CMobEntity : public CBattleEntity bool m_ItemDespoiled; // if true, mob has already been despoiled. reset on respawn. uint16 m_Family; uint16 m_SuperFamily; - uint16 m_MobSkillList; // Mob skill list defined from mob_pools - uint32 m_Pool; // pool the mob came from + uint16 m_MobSkillList; // Mob skill list defined from mob_pools + uint32 m_Pool; // pool the mob came from CMobSpellList* m_SpellListContainer; // The spells list container for this mob std::map m_UsedSkillIds; // mob skill ids used (key) along with mob level (value)