Inventory_control.cs 5.07 KB
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Inventory_control : MonoBehaviour
{


    #region Singleton

    //싱글톤 : 항상 gameobject를 찾을수도있지만 비용이 많이듬. 
    // 그래서 그냥 겜 시작할때 이건 계속 참조할수있게 선언해버릴는것
    public static Inventory_control instance;

    void Awake()
    {
        if (instance != null)
        {
            Debug.LogWarning("more than one instance for Inventory");
            return;
        }

        instance = this;

    }

    #endregion

    [SerializeField]

    //델리게이트(콜백함수 하려구..)
    public delegate void OnItemChanged(); // 대리자 타입선언
    public OnItemChanged onItemChangedCallback; // 대리자 변수 선언

    private itemDatabase db; //DB
    public List<Item> items = new List<Item>(); // 1회용 인벤토리. 추후 저장하는곳에 넣어야함. 

    public GameObject slot_template;

    /*
    start : db할당, 1회용 인벤토리할당 (아직 유저꺼!로 DB에 저장 되지않은애들..)

    Additem : 1회용 인벤토리에 아이템 추가
    RemoveItem : 1회용 인벤토리에서 아이템 삭제 (Get) -> 진짜 유저의 인벤토리에 추가
    RemoveAllItem : 1회용 인벤토리에서 모든아이템 삭제 (Get) -> 진짜 유저의 인벤토리에 모두추가
    TimeupItem : 
    */

    public void Start()
    {
        //db할당
        db = GameObject.FindGameObjectWithTag("Item Database").GetComponent<itemDatabase>();
        Debug.Log(db.name + db.items.Count);

        //AddItem(1001, 3);
        //AddItem(1002, 1);
    }

    public void AddItem(int id, int num)
    {
        //DB에서 id갖고 아이템 찾아서 ADD
        int index = FindDB_index_byID(id);
        if (index == -1) { Debug.LogWarning("There's no item in DB"); return; }

        Item newitem = db.items[index].Clone(); // DB에서 임시 인벤토리로 가져온거니까 깊은복사 해주고.. 사실 이것도 이럴필요없는듯.. 보여만주면되는거니까 
        newitem.change_itemnum(num);
        items.Add(newitem);

        Debug.Log("선물함에 아이템이 들어왔어요~!");

        if (onItemChangedCallback != null)
            onItemChangedCallback.Invoke();
    }


    public void RemoveItem(Item item)
    {
        for (int i = 0; i < items.Count; i++)
        {
            if (items[i].itemID == item.itemID)
            {
                //유저의 진짜 Data에 아이템 갯수만큼 추가 + 해당 아이템 임시 인벤토리에서 삭제
                DataController.Instance.Add_item_to_PlayerData(item.itemID, item.itemnum);

                Debug.Log("선물함에서 아이템 넘버 : "+item.itemID +" 를 "+item.itemnum+"개 받았어요!");
                items.Remove(item);
                i--;

                break;
            }
        }

        if (onItemChangedCallback != null)
            onItemChangedCallback.Invoke();
    }

    /* 이건 진짜 내 인벤토리에서 필요한것. 선물함은 따로따로여야함.
    public void AddItem(int id, int num)
    {
        bool haveitem = false;

        //인벤토리에 해당 아이템 ID 갖고있는애 있으면 숫자만 추가, 없으면 ADD
        for (int i = 0; i < items.Count; i++)
        {
            if (items[i].itemID == id)
            {
                items[i].change_itemnum(num);
                haveitem = true;
                break;
            }
        }
        //없었으면...DB에서 id갖고 아이템 찾아서 ADD
        if (!haveitem)
        {
            int index = FindDB_index_byID(id);
            if (index == -1) { Debug.LogWarning("There's no item in DB"); return; }
            Item newitem = db.items[index].Clone(); // 깊은복사 해주고
            newitem.change_itemnum(num);
            items.Add(newitem);

        }

        Debug.Log("Added item to Inventory's item!");

        //이벤트 트리거링 : 인벤토리에 Add 생기면 이 함수 부르는것!
        if (onItemChangedCallback != null)
            onItemChangedCallback.Invoke();
    }
   

    */

    public void RemoveALLItem()
    {
        for (int i = 0; i < items.Count; i++)
        {
            //갯수만큼 인벤토리 DB에 추가하고
            DataController.Instance.Add_item_to_PlayerData(items[i].itemID, items[i].itemnum);
            items.Remove(items[i]);
            i--;
            // 삭제
        }

        if (onItemChangedCallback != null)
            onItemChangedCallback.Invoke();
    }


    public int FindDB_index_byID(int id)
    {
        //id갖고 바이너리 서치로 item 탐색
        int first = 0;
        int last = db.items.Count - 1;
        int mid;
        while (first <= last)
        {
            mid = (first + last) / 2;
            if (db.items[mid].itemID == id)
            {
                return mid;
            }
            else
            {
                if (db.items[mid].itemID > id)
                    last = mid - 1;
                else
                    first = mid + 1;
            }
        }
        return -1;

    }
}