//represent an item in creature's inventory. public abstract class UsableItem : Item, IListenToAction { protected ButtonState m_ButtonState; protected int m_CurrentActionIndex; public Action myAction { get; protected set; } protected override void StartImp() { base.StartImp(); m_ActiveState = false; } #region Item state protected override void OnAquiredByInventory() { base.OnAquiredByInventory(); myAction.SetOwner(owner); } protected override void OnDroppedByInventory() { base.OnDroppedByInventory(); myAction.SetOwner(null); m_ButtonState = ButtonState.empty; } #endregion #region item trigger /// /// state represent button state, or something else. maybe used in certain item. /// for example, continues attack. /// public void UseAction(ButtonState buttonState, int actionIndex = 0) { if (m_ActiveState) { m_ButtonState = buttonState; m_CurrentActionIndex = actionIndex; InternalUseAction(actionIndex, m_ButtonState); } } protected abstract void InternalUseAction(int actionIndex, ButtonState buttonState); #endregion #region IUseAction Impl public virtual void OnActionBegin() { } public virtual void OnActionAbort(ActionAbortType actionAbortType) { } // @Note: all override method must use base.OnReachEvent(...) public virtual void OnReachEvent(int evtId, string param1, string param2, string param3) { if (evtId == E.costStamina) { owner.action.EmitConsumeStamina(param1.EvtToFloat()); //Debug.Log("Emitting consume stamina signal!"); } } #endregion }