Files
beyond/Assets/Scripts/InvectorDerivatives/Editor/bItemCollectionEditor.cs
2024-11-20 15:21:28 +01:00

267 lines
12 KiB
C#

using Invector.vItemManager;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEditor;
using UnityEngine;
namespace Beyond
{
[CanEditMultipleObjects]
[CustomEditor(typeof(bItemCollection))]
public class bItemCollectionEditor : vEditorBase
{
private bItemCollection manager;
private SerializedProperty itemReferenceList;
private bool inAddItem;
private int selectedItem;
private List<vItem> filteredItems;
private Vector2 scroll;
private Rect buttonRect;
private List<bItemType> filter = new List<bItemType>();
protected override void OnEnable()
{
base.OnEnable();
manager = (bItemCollection)target;
skin = Resources.Load("vSkin") as GUISkin;
itemReferenceList = serializedObject.FindProperty("items");
}
public override void OnInspectorGUI()
{
var oldSkin = GUI.skin;
serializedObject.Update();
if (skin)
{
GUI.skin = skin;
}
GUILayout.Space(10);
GUI.skin = oldSkin;
base.OnInspectorGUI();
if (skin)
{
GUI.skin = skin;
}
bool usingToolbar = toolbars.Count > 1;
string selectedToolbarName = toolbars[selectedToolBar].title;
if (manager.itemListData && ((usingToolbar && selectedToolbarName.Equals("Item Collection")) || !usingToolbar))
{
GUILayout.BeginVertical("box");
//if (itemReferenceList.arraySize > manager.itemListData.items.Count)
//{
// manager.items.Resize(manager.itemListData.items.Count);
//}
GUILayout.Box("Item Collection " + manager.items.Count);
if (GUILayout.Button("Add Item", EditorStyles.miniButton))
{
PopupWindow.Show(buttonRect, new bItemSelector
(manager.itemListData.items, ref filter, (bItem item) =>//OnSelectItem
{
itemReferenceList.arraySize++;
itemReferenceList.GetArrayElementAtIndex(itemReferenceList.arraySize - 1).FindPropertyRelative("id").intValue = item.id;
itemReferenceList.GetArrayElementAtIndex(itemReferenceList.arraySize - 1).FindPropertyRelative("amount").intValue = 1;
EditorUtility.SetDirty(manager);
serializedObject.ApplyModifiedProperties();
}
));
}
if (Event.current.type == EventType.Repaint)
{
buttonRect = GUILayoutUtility.GetLastRect();
}
GUIStyle boxStyle = new GUIStyle(GUI.skin.box);
scroll = GUILayout.BeginScrollView(scroll, GUILayout.MinHeight(200), GUILayout.ExpandHeight(false), GUILayout.ExpandWidth(false));
try
{
for (int i = 0; i < manager.items.Count; i++)
{
var item = manager.itemListData.items.Find(t => t.id.Equals(manager.items[i].id));
if (item)
{
GUILayout.BeginVertical("box");
GUILayout.BeginHorizontal();
GUILayout.BeginHorizontal();
var rect = GUILayoutUtility.GetRect(50, 50);
if (item.icon != null)
{
DrawTextureGUI(rect, item.icon, new Vector2(50, 50));
}
var name = " ID " + item.id.ToString("00") + "\n - " + item.name + "\n - " + item.type.ToString();
var content = new GUIContent(name, null, "Click to Open");
GUILayout.Label(content, EditorStyles.miniLabel);
GUILayout.BeginVertical("box");
GUILayout.BeginHorizontal();
GUILayout.Label("Add to EquipArea", EditorStyles.miniLabel);
manager.items[i].addToEquipArea = EditorGUILayout.Toggle("", manager.items[i].addToEquipArea, GUILayout.Width(30));
GUILayout.EndHorizontal();
GUILayout.BeginHorizontal();
if (manager.items[i].addToEquipArea)
{
GUILayout.Label("EquipArea", EditorStyles.miniLabel);
manager.items[i].indexArea = EditorGUILayout.IntField("", manager.items[i].indexArea, GUILayout.Width(30));
}
GUILayout.EndHorizontal();
GUILayout.BeginHorizontal();
if (manager.items[i].addToEquipArea)
{
GUILayout.Label("AutoEquip", EditorStyles.miniLabel);
manager.items[i].autoEquip = EditorGUILayout.Toggle("", manager.items[i].autoEquip, GUILayout.Width(30));
}
GUILayout.EndHorizontal();
GUILayout.BeginHorizontal();
GUILayout.Label("Amount", EditorStyles.miniLabel);
manager.items[i].amount = EditorGUILayout.IntField(manager.items[i].amount, GUILayout.Width(30));
if (manager.items[i].amount < 1)
{
manager.items[i].amount = 1;
}
GUILayout.EndHorizontal();
if (item.attributes.Count > 0)
{
manager.items[i].changeAttributes = GUILayout.Toggle(manager.items[i].changeAttributes, new GUIContent("Change Attributes", "This is a override of the original item attributes"), EditorStyles.miniButton, GUILayout.ExpandWidth(true));
}
GUILayout.EndVertical();
GUILayout.EndHorizontal();
if (GUILayout.Button("x", GUILayout.Width(25), GUILayout.Height(25)))
{
itemReferenceList.DeleteArrayElementAtIndex(i);
EditorUtility.SetDirty(target);
serializedObject.ApplyModifiedProperties();
break;
}
GUILayout.EndHorizontal();
Color backgroundColor = GUI.backgroundColor;
GUI.backgroundColor = Color.clear;
var _rec = GUILayoutUtility.GetLastRect();
_rec.width -= 100;
EditorGUIUtility.AddCursorRect(_rec, MouseCursor.Link);
if (GUI.Button(_rec, ""))
{
if (manager.itemListData.inEdition)
{
if (bItemListWindow.Instance != null)
{
bItemListWindow.SetCurrentSelectedItem(manager.itemListData.items.IndexOf(item));
}
else
{
bItemListWindow.CreateWindow(manager.itemListData, manager.itemListData.items.IndexOf(item));
}
}
else
{
bItemListWindow.CreateWindow(manager.itemListData, manager.itemListData.items.IndexOf(item));
}
}
GUILayout.Space(7);
GUI.backgroundColor = backgroundColor;
if (item.attributes != null && item.attributes.Count > 0)
{
if (manager.items[i].changeAttributes)
{
if (GUILayout.Button("Reset", EditorStyles.miniButton))
{
manager.items[i].attributes = null;
}
if (manager.items[i].attributes == null)
{
manager.items[i].attributes = item.attributes.CopyAsNew();
}
else if (manager.items[i].attributes.Count != item.attributes.Count)
{
manager.items[i].attributes = item.attributes.CopyAsNew();
}
else
{
for (int a = 0; a < manager.items[i].attributes.Count; a++)
{
GUILayout.BeginHorizontal();
GUILayout.Label(manager.items[i].attributes[a].name.ToString());
manager.items[i].attributes[a].value = EditorGUILayout.IntField(manager.items[i].attributes[a].value, GUILayout.MaxWidth(60));
GUILayout.EndHorizontal();
}
}
}
}
GUILayout.EndVertical();
}
else
{
itemReferenceList.DeleteArrayElementAtIndex(i);
EditorUtility.SetDirty(manager);
serializedObject.ApplyModifiedProperties();
break;
}
}
}
catch
{
}
GUILayout.EndScrollView();
GUI.skin.box = boxStyle;
GUILayout.EndVertical();
if (GUI.changed)
{
EditorUtility.SetDirty(manager);
serializedObject.ApplyModifiedProperties();
}
}
if (GUI.changed)
{
EditorUtility.SetDirty(target);
}
serializedObject.ApplyModifiedProperties();
GUI.skin = oldSkin;
}
private GUIContent[] GetItemContents(List<vItem> items)
{
GUIContent[] names = new GUIContent[items.Count];
for (int i = 0; i < items.Count; i++)
{
var texture = items[i].icon != null ? items[i].icon.texture : null;
names[i] = new GUIContent(items[i].name, texture, items[i].description);
}
return names;
}
private List<bItem> GetItemByFilter(List<bItem> items, List<bItemType> filter)
{
return items.FindAll(i => filter.Contains(i.type));
}
private void DrawTextureGUI(Rect position, Sprite sprite, Vector2 size)
{
Rect spriteRect = new Rect(sprite.rect.x / sprite.texture.width, sprite.rect.y / sprite.texture.height,
sprite.rect.width / sprite.texture.width, sprite.rect.height / sprite.texture.height);
Vector2 actualSize = size;
actualSize.y *= (sprite.rect.height / sprite.rect.width);
GUI.DrawTextureWithTexCoords(new Rect(position.x, position.y + (size.y - actualSize.y) / 2, actualSize.x, actualSize.y), sprite.texture, spriteRect);
}
}
}