diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_HPWork.cs b/Assets/PerfectWorld/Scripts/Managers/EC_HPWork.cs index 74af8952da..b98021b878 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_HPWork.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_HPWork.cs @@ -601,7 +601,7 @@ namespace BrewMonster.Scripts case CECHPWork.Host_work_ID.WORK_TRACEOBJECT: pWork = new CECHPWorkTrace(this); break; case CECHPWork.Host_work_ID.WORK_HACKOBJECT: pWork = new CECHPWorkMelee(this); break; case CECHPWork.Host_work_ID.WORK_SPELLOBJECT: pWork = new CECHPWorkSpell(this); break; - //case CECHPWork.Host_work_ID.WORK_USEITEM: pWork = new CECHPWorkUse(this); break; + case CECHPWork.Host_work_ID.WORK_USEITEM: pWork = new CECHPWorkUse(this); break; //case CECHPWork.Host_work_ID.WORK_DEAD: pWork = new CECHPWorkDead(this); break; //case CECHPWork.Host_work_ID.WORK_FOLLOW: pWork = new CECHPWorkFollow(this); break; case CECHPWork.Host_work_ID.WORK_FLYOFF: pWork = new CECHPWorkFly(this); break; diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkUse.cs b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkUse.cs new file mode 100644 index 0000000000..32631d021e --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkUse.cs @@ -0,0 +1,189 @@ +using BrewMonster.Scripts; +using BrewMonster.Scripts.Managers; +using CSNetwork.GPDataType; +using UnityEngine; + +namespace BrewMonster.Scripts +{ + /// + /// Host player work: Use item + /// 主角玩家工作:使用物品 + /// + public class CECHPWorkUse : CECHPWork + { + // Fields / 字段 + private int m_idItem; // Item template ID / 物品模板ID + private int m_idTarget; // Target object ID / 目标对象ID + private bool m_bWorkForMonsterSpirit; // Is this work for monster spirit gathering? / 是否为命轮采集工作 + private CECCounter m_UseTimeCnt; // Use time counter / 使用时间计数器 + + /// + /// Constructor / 构造函数 + /// + public CECHPWorkUse(CECHPWorkMan pWorkMan) : base(Host_work_ID.WORK_USEITEM, pWorkMan) + { + m_dwMask = Work_mask.MASK_USEITEM; + m_dwTransMask = Work_mask.MASK_STAND | Work_mask.MASK_MOVETOPOS; + Reset(); + } + + /// + /// Reset work / 重置工作 + /// + public override void Reset() + { + base.Reset(); + + m_idItem = 0; + m_idTarget = 0; + m_bWorkForMonsterSpirit = false; + + if (m_UseTimeCnt == null) + m_UseTimeCnt = new CECCounter(); + + m_UseTimeCnt.SetPeriod(100); + m_UseTimeCnt.Reset(); + } + + /// + /// Copy work data / 复制工作数据 + /// + public override bool CopyData(CECHPWork pWork) + { + if (!base.CopyData(pWork)) + return false; + + CECHPWorkUse pSrc = pWork as CECHPWorkUse; + if (pSrc == null) + return false; + + m_idItem = pSrc.m_idItem; + m_idTarget = pSrc.m_idTarget; + m_bWorkForMonsterSpirit = pSrc.m_bWorkForMonsterSpirit; + + m_UseTimeCnt.SetPeriod(pSrc.m_UseTimeCnt.GetPeriod()); + m_UseTimeCnt.SetCounter(pSrc.m_UseTimeCnt.GetCounter()); + + return true; + } + + /// + /// On first tick / 第一帧执行 + /// + protected override void OnFirstTick() + { + if (m_pHost == null) + return; + + m_pHost.m_iMoveMode = (int)MoveMode.MOVE_STAND; + + EC_IvtrItem pItem = EC_IvtrItem.CreateItem(m_idItem, 0, 1); + if (pItem == null) + return; + + if (m_bWorkForMonsterSpirit) + { + // Play gather monster spirit action / 播放采集命轮动作 + // TODO: Implement PlayGatherMonsterSpiritAction if needed + // m_pHost.PlayGatherMonsterSpiritAction(); + Debug.Log($"[CECHPWorkUse] Playing gather monster spirit action for item {m_idItem}"); + } + else + { + // Play start use item action / 播放开始使用物品动作 + // TODO: Implement PlayStartUseItemAction if needed + // m_pHost.PlayStartUseItemAction(m_idItem); + Debug.Log($"[CECHPWorkUse] Playing start use item action for item {m_idItem}"); + } + } + + /// + /// Work is cancelled / 工作被取消 + /// + public override void Cancel() + { + if (m_idTarget != 0 && m_pHost != null) + { + m_pHost.TurnFaceTo(0); + } + + base.Cancel(); + + // TODO: Implement AP_ActionEvent if needed + // AP_ActionEvent(AP_EVENT_STOPUSEITEM); + Debug.Log("[CECHPWorkUse] Work cancelled - STOPUSEITEM event"); + } + + /// + /// Set parameters / 设置参数 + /// + /// Item template ID / 物品模板ID + /// Use time in milliseconds / 使用时间(毫秒) + /// Target object ID / 目标对象ID + /// Is for monster spirit gathering / 是否为命轮采集 + public void SetParams(int idItem, float dwUseTime, int idTarget, bool bWorkForMonsterSpirit) + { + m_idItem = idItem; + m_idTarget = idTarget; + m_bWorkForMonsterSpirit = bWorkForMonsterSpirit; + + m_UseTimeCnt.SetPeriod(dwUseTime); + m_UseTimeCnt.Reset(); + } + + /// + /// Tick routine / 每帧更新 + /// + public override bool Tick(float dwDeltaTime) + { + base.Tick(dwDeltaTime); + + // Update use time counter / 更新使用时间计数器 + if (m_UseTimeCnt.IncCounter(dwDeltaTime)) + { + m_UseTimeCnt.Reset(true); + m_bFinished = true; + } + + // Turn face to target if needed / 如果有目标则面向目标 + if (m_idTarget != 0 && m_pHost != null) + { + m_pHost.TurnFaceTo(m_idTarget); + } + + return true; + } + + /// + /// Get item template ID / 获取物品模板ID + /// + public int GetItem() + { + return m_idItem; + } + + /// + /// Get target object ID / 获取目标对象ID + /// + public int GetTarget() + { + return m_idTarget; + } + + /// + /// Is this work for monster spirit gathering? / 是否为命轮采集工作 + /// + public bool IsWorkForMonsterSpirit() + { + return m_bWorkForMonsterSpirit; + } + + /// + /// Get use time counter / 获取使用时间计数器 + /// + public CECCounter GetUseTimeCnt() + { + return m_UseTimeCnt; + } + } +} \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkUse.cs.meta b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkUse.cs.meta new file mode 100644 index 0000000000..025f99e9b7 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkUse.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 965c8f617755486429a9f1bb88521065 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_InventoryUI.cs b/Assets/PerfectWorld/Scripts/Managers/EC_InventoryUI.cs index 8b0b0af771..b8b3e9b0f9 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_InventoryUI.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_InventoryUI.cs @@ -134,6 +134,71 @@ namespace BrewMonster.Scripts.Managers { RefreshAll(); } + + UpdateCooldownOverlays(); + } + + /// + /// Update all cooldown overlays + /// 更新所有冷却遮罩 + /// + public void UpdateCooldownOverlays() + { + // Update inventory pack cooldowns + // 更新背包冷却 + UpdatePackageCooldowns(inventoryPackButtons, PKG_INVENTORY); + + // Equipment pack doesn't typically have cooldowns but update anyway + // 装备栏通常没有冷却但也更新 + UpdatePackageCooldowns(equipmentPackButtons, PKG_EQUIPMENT); + } + + /// + /// Update cooldown overlays for a specific package + /// 更新特定包裹的冷却遮罩 + /// + private void UpdatePackageCooldowns(List