projectEli/Assets/Inventory System/ICWM Assets/Inventory/Scripts/Loot/LootBox.cs

287 lines
9.8 KiB
C#

//********************************************************//
// //
// Copyright © All rights reserved. MyNameIsVoo. 2020. //
// //
// COPYING FORBIDEN //
// //
//********************************************************//
using System.Collections;
using UnityEngine;
using ItemsClassList;
using ICWM.HelperSystem;
using ICWM.ItemSystem;
using ICWM.SaveSystem;
/// <summary>
/// The class generates things in a box with a loot
/// </summary>
namespace ICWM
{
namespace Loot
{
public class LootBox : MonoBehaviour
{
#region Attributes
[Header("ATTRIBUTES")]
public bool IsOpenSeach = true;
public Vector2 MinMaxSecondsForSeach = new Vector2(2f, 8f);
[Header("SIZE of LOOT")]
public StashSystem.LootSize SizeLoot = StashSystem.LootSize.Size4x2;
[Header("PARAMETERS")]
public GameObject Root; // The place where prefab models will drag & drop
public string LootBoxName = "LOOT BOX"; //
[Header("DEBUG")]
public int lootID = 0;
public bool itWasOpened;
public bool isSeach;
public GameObject[] lootItems;
private bool isCreatedItems;
#endregion
#region PUBLIC
#region Create
public void CreateLootBox()
{
if (isCreatedItems)
return;
int maxAmount = LootBase.instance.GetLootItemsLenght(); // The total amount of items that we have
int sizeLootBox = GetSizeIndexLoot();
// maybe more (but I've done it yet)
if (sizeLootBox > maxAmount)
sizeLootBox = maxAmount;
int AmountLoot = (int)(Random.Range(0, sizeLootBox)); // Randomly choose the amount of loot in the box
lootItems = new GameObject[AmountLoot];
ItemList[] CL = new ItemList[AmountLoot];
//
// Randomly we will choose items
//
lootID = 0;
for (int i = 0; i < AmountLoot; i++)
{
int rand = Helper.GetRandomIndex(maxAmount); // Of all we choose randomly one
lootItems[i] = LootBase.instance.GetNewItem(Root.transform, rand);
if (lootItems[i] == null)
continue;
lootItems[i].name = "Loot_" + i.ToString();
CL[i] = lootItems[i].GetComponent<ItemsDrop>().CL;
CL[i] = Helper.SetParameters(CL[i], lootItems[i]);
CL[i].lootID = lootID;
lootID++;
lootItems[i].GetComponent<ItemsDrop>().CL = CL[i];
lootItems[i].transform.localScale = Vector3.one;
lootItems[i].transform.localPosition = Vector3.zero;
lootItems[i].GetComponent<ItemsDrop>().CL.itemModding.transform.SetParent(lootItems[i].transform);
//
// Чтобы работыли аттачи необходимо для каждого определить класс лист и только после этого
// назначать параметры скрипты хелпер
//
if (lootItems[i].GetComponent<ItemsDrop>().CL.IsRenderItem() && lootItems[i].GetComponent<ItemsDrop>().WithAttachments)
{
Helper.AddAttachmentsToItem(lootItems[i].GetComponent<ItemsDrop>().WeaponAttachments, lootItems[i].GetComponent<ItemsDrop>().CL, transform);
string filename = lootItems[i].GetComponent<ItemsDrop>().CL.id.ToString();
InventoryBase.instance.RenderRoot.GetComponentInChildren<SaveWeaponModdingButton>().SaveButtonParameters(filename);
lootItems[i].GetComponent<ItemsDrop>().CL.itemModding.GetComponentInChildren<SaveWeaponModding>().SaveParameters(filename, true);
}
}
isCreatedItems = true;
}
#endregion
#region Seach
// After re-opening the lootbox we need to find all the remaining items and update the array
public void SeachItems()
{
Component[] p = Root.GetComponentsInChildren(typeof(ItemsDrop), true);
if (p != null)
{
lootItems = new GameObject[p.Length];
ItemList[] CL = new ItemList[p.Length];
lootID = 0;
foreach (ItemsDrop n in p)
{
lootItems[lootID] = n.gameObject;
CL[lootID] = lootItems[lootID].GetComponent<ItemsDrop>().CL;
CL[lootID].lootID = lootID;
lootItems[lootID].GetComponent<ItemsDrop>().CL = CL[lootID];
lootID++;
}
}
}
public IEnumerator SeachItemsForSeconds(float seconds)
{
yield return new WaitForSeconds(seconds);
Component[] p = Root.GetComponentsInChildren(typeof(ItemsDrop), true);
if (p != null)
{
lootItems = new GameObject[p.Length];
ItemList[] CL = new ItemList[p.Length];
int i = 0;
foreach (ItemsDrop n in p)
{
lootItems[i] = n.gameObject;
CL[i] = lootItems[i].GetComponent<ItemsDrop>().CL;
CL[i].lootID = i;
lootItems[i].GetComponent<ItemsDrop>().CL = CL[i];
i++;
}
// Update array StashSystem
StashSystem.instance.referenceToOpenedLootBox = this;
}
}
#endregion
#region Set, Get, ...
public Vector2 GetSizeVectorLoot()
{
Vector2 sizeLoot = Vector2.zero;
if (SizeLoot == StashSystem.LootSize.Size4x2)
{
sizeLoot.x = 4;
sizeLoot.y = 2;
}
else if (SizeLoot == StashSystem.LootSize.Size6x2)
{
sizeLoot.x = 6;
sizeLoot.y = 2;
}
else if (SizeLoot == StashSystem.LootSize.Size4x4)
{
sizeLoot.x = 4;
sizeLoot.y = 4;
}
else if (SizeLoot == StashSystem.LootSize.Size6x4)
{
sizeLoot.x = 6;
sizeLoot.y = 4;
}
else if (SizeLoot == StashSystem.LootSize.Size4x5)
{
sizeLoot.x = 4;
sizeLoot.y = 5;
}
else if (SizeLoot == StashSystem.LootSize.Size4x6)
{
sizeLoot.x = 4;
sizeLoot.y = 6;
}
else if (SizeLoot == StashSystem.LootSize.Size5x6)
{
sizeLoot.x = 5;
sizeLoot.y = 6;
}
return sizeLoot;
}
#endregion
#region Close, Reset, Destroy, ...
public void CloseLootBox()
{
SaveItems();
}
public void DestroyItemFromLootBox(int lootID)
{
if (lootID >= 0 && lootItems[lootID] && lootID < lootItems.Length)
Destroy(lootItems[lootID]);
lootItems[lootID] = null;
}
#endregion
#endregion
#region PRIVATE
#region Save
private void SaveItems()
{
if (lootItems != null && lootItems.Length != 0)
{
foreach (GameObject item in lootItems)
{
if (item == null)
continue;
else if (item.GetComponent<ItemsDrop>().CL.itemIcon == null) // If we transfered the item into backpack or attached to weapon
{
DestroyItemFromLootBox(item.GetComponent<ItemsDrop>().CL.lootID);
continue;
}
item.GetComponent<ItemsDrop>().CL.startPositionInInventory = new Vector2(item.GetComponent<ItemsDrop>().CL.itemIcon.transform.localPosition.x, item.GetComponent<ItemsDrop>().CL.itemIcon.transform.localPosition.y);
}
}
}
#endregion
#region Get
private int GetSizeIndexLoot()
{
if (SizeLoot == StashSystem.LootSize.Size4x2)
return 8;
else if (SizeLoot == StashSystem.LootSize.Size6x2 || SizeLoot == StashSystem.LootSize.Size4x4)
return 12;
else if (SizeLoot == StashSystem.LootSize.Size6x4)
return 24;
else if (SizeLoot == StashSystem.LootSize.Size4x5)
return 20;
else if (SizeLoot == StashSystem.LootSize.Size4x6)
return 24;
else if (SizeLoot == StashSystem.LootSize.Size5x6)
return 30;
else
return 0;
}
#endregion
#endregion
}
}
}