287 lines
9.8 KiB
C#
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
|
|||
|
}
|
|||
|
}
|
|||
|
}
|