Skip to content

Instantly share code, notes, and snippets.

@yuiwong
Last active July 31, 2018 14:59
Show Gist options
  • Save yuiwong/b66839bb9dd2dc7fc04c223fc39e2da6 to your computer and use it in GitHub Desktop.
Save yuiwong/b66839bb9dd2dc7fc04c223fc39e2da6 to your computer and use it in GitHub Desktop.
Inventory System
using System.Collections.Generic;
public abstract class Inventory
{
protected Creature m_Owner;
protected List<Item> m_Items;
public virtual void Init(Creature owner)
{
m_Items = new List<Item>();
m_Owner = owner;
}
public abstract bool CanHandleIncomingItem(Item item);
public Creature GetOwner()
{
return m_Owner;
}
public virtual bool HandleIncomingItem(Item item)
{
if (!CanHandleIncomingItem(item))
return false;
m_Items.Add(item);
item.AquiredByInventory(this);
return true;
}
public List<UsableItem> GetItemWithFlag(int flag)
{
List<UsableItem> result = new List<UsableItem>();
foreach (var item in m_Items)
{
var usableItem = item as UsableItem;
if (usableItem != null && usableItem.itemConfig.itemFlags.Contains(flag))
{
result.Add(usableItem);
}
}
return result;
}
}
using UnityEngine;
using UnityEngine.AI;
// represent an object creature can pickup.
public class ItemPickup : MonoBase, IInteract
{
protected Collider m_MyCollider;
protected Transform m_DisplayTrans;
protected UIElement m_MyHeader;
protected Item m_StoredItem;
protected NavMeshObstacle m_NavMeshObstacle;
protected ItemForm m_ItemForm;
protected override void AwakeImp()
{
base.AwakeImp();
m_MyCollider = GetComponent<Collider>();
m_NavMeshObstacle = transform.parent.GetComponent<NavMeshObstacle>();
m_MyCollider.isTrigger = true;
}
protected override void StartImp()
{
base.StartImp();
// UI Display
m_MyHeader = UiMgr.instance.CreateUIElement<UIElement>(GetType().ToString());
m_MyHeader.SetFollowObj(m_StoredItem.gameObject, BaseDataMgr.instance.commonConfig.pickupWorldOffset);
m_MyHeader.AddText(m_StoredItem.transform.name, m_StoredItem.transform.name, new Vector2(200f, 32f), Vector2.zero);
UpdateForm();
}
protected override void OnDestroyIml()
{
base.OnDestroyIml();
m_MyHeader.SelfDestroy();
}
public void InitPickup(ItemForm itemForm, Item storedItem, Transform displayTrans)
{
m_ItemForm = itemForm;
m_StoredItem = storedItem;
m_DisplayTrans = displayTrans;
}
public void ChangeForm(ItemForm targetForm)
{
m_ItemForm = targetForm;
UpdateForm();
}
protected void UpdateForm()
{
if (m_ItemForm == ItemForm.pickup)
{
m_MyHeader.Show();
m_MyCollider.enabled = true;
m_DisplayTrans.gameObject.SetActive(true);
if (m_NavMeshObstacle != null)
m_NavMeshObstacle.enabled = true;
}
else
{
m_MyHeader.Hide();
m_MyCollider.enabled = false;
m_DisplayTrans.gameObject.SetActive(false);
if (m_NavMeshObstacle != null)
m_NavMeshObstacle.enabled = false;
}
}
#region interface
public bool CanInteractNow()
{
return m_ItemForm == ItemForm.pickup;
}
public int GetInteractionType()
{
return E.pickup;
}
public void ProceedInteract(Creature creature)
{
if (m_ItemForm == ItemForm.inventory)
{
//if proceed get called twice maybe Generic Action only need one anchor for pick something up.
Debug.LogWarning("This item is already in inventory, something is wrong! item name = " + m_StoredItem.GetType());
return;
}
creature.inventory.AquireItem(m_StoredItem);
}
#endregion
}
//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
/// <summary>
/// state represent button state, or something else. maybe used in certain item.
/// for example, continues attack.
/// </summary>
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
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment