123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330 |
- using System.Collections.Generic;
- using System.Collections;
- using UnityEngine;
- using Random = UnityEngine.Random;
- namespace HQFPSWeapons
- {
- public class Inventory : LivingEntityComponent
- {
- public Message ContainerChanged = new Message();
- public List<ItemContainer> Containers
- {
- get
- {
- if(m_AllContainers == null)
- InitiateContainers();
- return m_AllContainers;
- }
- }
- [BHeader("Storage")]
- [SerializeField]
- private ContainerGenerator[] m_InitialContainers = null;
- [BHeader("Item Drop")]
- [SerializeField]
- private bool m_DropItemsOnDeath = true;
- [SerializeField]
- private SoundPlayer m_DropSounds = null;
- [Space]
- [SerializeField]
- private Vector3 m_DropOffset = new Vector3(0f, 0f, 0.8f);
- [SerializeField]
- private float m_DropAngularFactor = 150f;
- [SerializeField]
- private float m_DropSpeed = 8f;
- [SerializeField]
- private LayerMask m_WallsLayer = new LayerMask();
- private List<ItemContainer> m_SavableContainers;
- private List<ItemContainer> m_AllContainers;
- public void AddContainer(ItemContainer itemContainer, bool add)
- {
- if(add && !Containers.Contains(itemContainer))
- {
- Containers.Add(itemContainer);
- AddListeners(itemContainer, true);
- }
- else if(!add && Containers.Contains(itemContainer))
- {
- Containers.Remove(itemContainer);
- AddListeners(itemContainer, false);
- }
- }
- public bool HasContainerWithFlags(ItemContainerFlags flags)
- {
- for(int i = 0;i < Containers.Count;i ++)
- if(flags.HasFlag(Containers[i].Flag))
- return true;
- return false;
- }
- public ItemContainer GetContainerWithFlags(ItemContainerFlags flags)
- {
- for(int i = 0;i < Containers.Count;i ++)
- if(flags.HasFlag(Containers[i].Flag))
- return Containers[i];
- return null;
- }
- public ItemContainer GetContainerWithName(string name)
- {
- for(int i = 0;i < Containers.Count;i ++)
- if(Containers[i].Name == name)
- return Containers[i];
- return null;
- }
- public bool AddItem(SaveableItem item, ItemContainerFlags flags)
- {
- for(int i = 0;i < Containers.Count;i ++)
- {
- if(flags.HasFlag(Containers[i].Flag))
- {
- bool added = Containers[i].AddItem(item);
- if(added)
- return true;
- }
- }
- return false;
- }
- /// <summary>
- /// </summary>
- public int AddItem(string itemName, int amountToAdd, ItemContainerFlags flags)
- {
- int addedInTotal = 0;
- for(int i = 0;i < Containers.Count;i ++)
- {
- if(flags.HasFlag(m_AllContainers[i].Flag))
- {
- int addedNow = Containers[i].AddItem(itemName, amountToAdd);
- addedInTotal += addedNow;
- if(addedNow == addedInTotal)
- return addedInTotal;
- }
- }
- return addedInTotal;
- }
- public bool RemoveItem(SaveableItem item)
- {
- for(int i = 0;i < Containers.Count;i ++)
- {
- if(m_AllContainers[i].RemoveItem(item))
- return true;
- }
- return false;
- }
- /// <summary>
- /// </summary>
- public int RemoveItems(string itemName, int amountToRemove, ItemContainerFlags flags)
- {
- int removedInTotal = 0;
-
- for(int i = 0;i < Containers.Count;i ++)
- {
- if(flags.HasFlag(Containers[i].Flag))
- {
- int removedNow = Containers[i].RemoveItem(itemName, amountToRemove);
- removedInTotal += removedNow;
- if (removedInTotal == amountToRemove)
- break;
- }
- }
- return removedInTotal;
- }
- /// <summary>
- /// Counts all the items with name itemName, from all containers.
- /// </summary>
- public int GetItemCount(string itemName)
- {
- int count = 0;
- for(int i = 0;i < Containers.Count;i ++)
- count += Containers[i].GetItemCount(itemName);
- return count;
- }
- public ItemSlot GetItemSlot(SaveableItem item)
- {
- foreach (var container in m_SavableContainers)
- {
- foreach (ItemSlot slot in container)
- {
- if (slot.Item == item)
- return slot;
- }
- }
- return null;
- }
- public bool TryDropItem(SaveableItem item, bool tryRemoveFromContainers = false)
- {
- bool canBeDropped = item != null && item.Data.WorldObject != null && (!tryRemoveFromContainers || RemoveItem(item));
-
- if(canBeDropped)
- {
- Player player = Entity as Player;
- float crouchHeightDrop = 1f;
- if (player != null)
- crouchHeightDrop = 1f;
- StartCoroutine(C_Drop(item, crouchHeightDrop));
- return true;
- }
- return false;
- }
- private IEnumerator C_Drop(SaveableItem item, float heightDropMultiplier)
- {
- if (item == null)
- yield return null;
- bool nearWall = false;
- Vector3 dropPosition;
- Quaternion dropRotation;
- if (Physics.Raycast(transform.position, transform.InverseTransformDirection(Vector3.forward), m_DropOffset.z, m_WallsLayer))
- {
- dropPosition = transform.position + transform.TransformVector(new Vector3(0f, m_DropOffset.y * heightDropMultiplier, -0.2f));
- dropRotation = Quaternion.LookRotation(Entity.LookDirection.Get());
- nearWall = true;
- }
- else
- {
- dropPosition = transform.position + transform.TransformVector(new Vector3(m_DropOffset.x, m_DropOffset.y * heightDropMultiplier, m_DropOffset.z));
- dropRotation = Random.rotationUniform;
- }
- GameObject droppedItem = Instantiate(item.Data.WorldObject, dropPosition, dropRotation) as GameObject;
- var rigidbody = droppedItem.GetComponent<Rigidbody>();
- var collider = droppedItem.GetComponent<Collider>();
- if (rigidbody != null)
- {
- Physics.IgnoreCollision(GetComponent<Collider>(), collider);
- rigidbody.isKinematic = false;
- if (rigidbody != null && !nearWall)
- {
- rigidbody.AddTorque(Random.rotation.eulerAngles * m_DropAngularFactor);
- rigidbody.AddForce(Entity.LookDirection.Get() * m_DropSpeed, ForceMode.VelocityChange);
- }
- }
- m_DropSounds.Play2D(ItemSelection.Method.RandomExcludeLast);
- var pickup = droppedItem.GetComponent<ItemPickup>();
- if (pickup != null)
- pickup.SetItem(item);
- }
- private void Awake()
- {
- if(ItemDatabase.Default == null)
- {
- Debug.LogError("No ItemDatabase found, this storage component will be disabled!", this);
- enabled = false;
- return;
- }
-
- Entity.Death.AddListener(OnEntityDeath);
- InitiateContainers();
- }
- private void InitiateContainers()
- {
- m_SavableContainers = new List<ItemContainer>();
- for (int i = 0; i < m_InitialContainers.Length; i++)
- {
- var container = m_InitialContainers[i].GenerateContainer(transform);
- m_SavableContainers.Add(container);
- AddListeners(container, true);
- }
- m_AllContainers = new List<ItemContainer>(m_SavableContainers);
- }
- private void AddListeners(ItemContainer container, bool add)
- {
- if (add)
- container.Changed.AddListener(OnContainerChanged);
- else
- container.Changed.RemoveListener(OnContainerChanged);
- }
- private void OnContainerChanged(ItemSlot slot)
- {
- try
- {
- ContainerChanged.Send();
- }
- catch {
- };
- }
- private void OnEntityDeath()
- {
- if(m_DropItemsOnDeath)
- {
- for(int i = 0; i < m_AllContainers.Count; i ++)
- {
- for(int j = 0; j < m_AllContainers[i].Slots.Length; j ++)
- {
- var slot = m_AllContainers[i].Slots[j];
- if(slot.Item)
- {
- TryDropItem(slot.Item);
- slot.SetItem(null);
- }
- }
- }
- }
- }
- }
- public class NestedContainer
- {
- public ItemContainer Container;
- public ItemSlot Slot;
- }
- }
|