using System.Collections; using System.Collections.Generic; using UnityEngine; public class Inventory : ResourcePool { public Character owner; public Equipment equipment; [Space(10)] public List items; public EventConnect ec = new EventConnect(); [Space(10)] public Transform hand; public DropItem dropItem; public TileCameraEvent camShake; private void Start() { target.SetParent(hand); target.localPosition = Vector3.zero; target.localEulerAngles = Vector3.zero; target.SetParent(transform); } /// /// 필드에 떯어져있는 드랍아이템을 획득하여 이를 처리합니다. /// /// 드랍아이템 public void GainItem(DropItem drop) { if (this.drop != null) return; //상점에서 판매 하는 아이템일 경우 보유 코인을 확인하고 처리 if (drop.PRODUCT && !ItemUse("Coin", drop.item.price)) return; target.SetParent(hand); target.localPosition = Vector3.zero; target.localEulerAngles = Vector3.zero; target.SetParent(transform); target.localEulerAngles = new Vector3(65, 0, 0); this.drop = drop; Invoke("GainEnd_Force", 1f); switch (drop.item.type) { case "Pickup": case "Use": { GainItemApply(); } break; default: { switch (drop.item.type) { case "Armor": case "Weapon": case "Accessory": if (!equipment.InstallCheck_Item(drop.item)) { this.drop = null; return; } break; case "Active": if (owner.skill.HoldingItemCheck(drop.item.idx)) { this.drop = null; return; } break; case "Passive": if (owner.skill.HoldingItemCheck(drop.item.idx)) { this.drop = null; return; } if(drop.item.skills.Find(a => a.work.Equals("AHRestore")) != null) { if (!equipment.InstallCheck_Part(EquipType.Armor)) { this.drop = null; return; } } break; } drop.sprite.gameObject.SetActive(false); dropItem.item = drop.item; dropItem.OnInitialized(); owner.OnGain(drop.gameObject, () => { ec.Invoke((int)Character.State.EquipItem, drop.item); GameObject eff = EffectPrefabGet(drop.item.type, EffectTargetGet(drop.item.type)); if (eff != null) { eff.gameObject.SetActive(true); bool chk = !drop.item.type.Equals("Armor"); if (!chk) camShake.Shake(); dropItem.gameObject.SetActive(chk); } GainItemApply(); }); } break; } } [Space(10)] public GameObject particleArmor; public GameObject particlePassive; public GameObject particle; /// /// 아이템 종류에 따른 이팩트 처리 /// /// 아이템 종류 /// 이팩트가 붙을 위치 /// GameObject EffectPrefabGet(string type, Transform target) { switch (type) { case "Armor": return ObjectCreateLocalPos(particleArmor, target, Vector3.one, Vector3.zero); case "Passive": return ObjectCreateLocalPos(particlePassive, target, Vector3.one, Vector3.zero); default: return ObjectCreateLocalPos(particle, target, Vector3.one, Vector3.zero); } } [Space(10)] public Transform targetArmor; public Transform targetPassive; public Transform target; /// /// 아이템 종류에 따른 타겟을 넘깁니다. /// /// 아이템 종류 /// Transform EffectTargetGet(string type) { switch (type) { case "Armor": return targetArmor; case "Passive": return targetPassive; default: return target; } } [Space(10)] public DropItem drop = null; /// /// 획득한 아이템을 적용합니다. /// public void GainItemApply() { if (drop == null) return; switch (drop.item.type) { case "Pickup": Type_Pickup(drop.item, drop); break; case "Use": Type_Use(drop.item, drop); break; case "Armor": case "Weapon": case "Accessory": bool chk = !equipment.Install(drop.item); drop.gameObject.SetActive(chk); GainEnd(); break; case "Active": drop.gameObject.SetActive(false); ec.Invoke((int)Character.State.ActiveItem, drop.item); GainEnd(); break; case "Passive": owner.skill.Install(drop.item); drop.gameObject.SetActive(false); GainEnd(); break; } } /// /// 획득 이벤트를 종료합니다. /// void GainEnd() { owner.map.blkCurrent.DropItemChanged(drop); GetSound(drop.item.type); drop = null; //target.SetParent(transform); CancelInvoke(); } /// /// 획득 이벤트를 강제 종료합니다. /// void GainEnd_Force() { drop = null; } /// /// 아이템 종류별 획득 사운드를 넘깁니다. /// /// public void GetSound(string type) { SoundPlayer sp = SoundManager.Instance.PrefabGet($"Sound/SFX item_get_{type.ToLower()}"); if (sp != null) SoundManager.Instance.EffectPlay(sp.gameObject); } /// /// Pickup 타입의 아이템을 처리합니다. /// /// /// void Type_Pickup(ItemData item, DropItem drop) { GainEnd(); drop.OnAnimaionStart(() => { drop.gameObject.SetActive(false); }); ItemData itemHold = items.Find(a => a.idx == item.idx); if (itemHold != null) { if (item.OVERLAP)//중첩되는 아이템인치 확인 { itemHold.Add(item.hold); ec.Invoke((int)Character.State.Inventory, itemHold); return; } } itemHold = item; ec.Invoke((int)Character.State.Inventory, itemHold); items.Add(itemHold); } //bool Type_Check(ItemData item) //{ // switch (item.work) // { // case "HP_Restore": // return owner.RestoreCheck((int)item.value); // case "AH_Added": // return owner.ArmorHeartCheck((int)item.value); // case "Mana_Added": // return owner.ManaCheck(); // default: // return true; // } //} /// /// USE 타입의 아이템을 처리합니다. /// /// /// void Type_Use(ItemData item, DropItem drop) { bool CHK = false; switch(item.work) { case "HP_Restore": { CHK = owner.Restore((int)item.value); } break; case "AH_Added": { if (equipment.InstallCheck_Part(EquipType.Armor)) CHK = owner.OnAdded_ArmorHeart((int)item.value); } break; case "Mana_Added": { CHK = owner.OnAdded_Mana((int)item.value); } break; } if (CHK) { GainEnd(); drop.OnAnimaionStart(() => { drop.gameObject.SetActive(false); }); } else this.drop = null; } /// /// Pickup 아이템을 사용합니다. /// /// Pickup 아이템 idx /// 사용 개수 /// public bool ItemUse(string idx, int value) { ItemData item = items.Find(a => a.idx == idx); if(item != null && value <= item.hold) { item.Add(-value); ec.Invoke((int)Character.State.Inventory, item); return true; } return false; } }