This commit is contained in:
2026-04-25 23:37:10 +02:00
commit 19d6bd934a
476 changed files with 9198 additions and 0 deletions
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 4d921d95879d44f0bd88e5c7f05450b1
timeCreated: 1773479260
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 5173c23cdfbb43fd80e5bb85342554b1
timeCreated: 1774105224
@@ -0,0 +1,38 @@
using RPGCore.BackpackEquipment.ObjectModules.Content.Events;
using RPGCore.BackpackEquipment.Objects;
using RPGCore.ObjectModules.ActionObjectModule;
namespace RPGCore.BackpackEquipment.ObjectModules.Content.Actions
{
public class DropAction : BaseAction
{
private readonly ItemObject _item;
public DropAction(ItemObject item)
{
_item = item;
}
public override void CanDoIt()
{
}
protected override void OnDoIt()
{
var dropEvent = new DropEvent { unit = unit, item = _item };
unit.events.InvokeBefore(dropEvent);
Check(!dropEvent.isPrevented, string.Format(ActionWasPreventedMessage, nameof(DropAction)));
unit.events.InvokeAfter(dropEvent);
unit.GetComponent<ContentModule>().Remove(_item);
}
protected override void OnEndIt()
{
}
protected override void OnCancelIt()
{
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 15a26990a9c14410b2131f6d8286ad18
timeCreated: 1774104885
@@ -0,0 +1,45 @@
using RPGCore.BackpackEquipment.ObjectModules.Content.Events;
using RPGCore.BackpackEquipment.Objects;
using RPGCore.ObjectModules.ActionObjectModule;
namespace RPGCore.BackpackEquipment.ObjectModules.Content.Actions
{
public class TakeAction : BaseAction
{
private readonly IContentOwner _contentOwner;
private readonly ItemObject _item;
private readonly int _index;
public TakeAction(IContentOwner contentOwner, ItemObject item, int index = -1)
{
_contentOwner = contentOwner;
_item = item;
_index = index;
}
public override void CanDoIt()
{
_contentOwner.CanAdd(_item, _index);
}
protected override void OnDoIt()
{
var takeEvent = new TakeEvent { unit = unit, item = _item };
unit.events.InvokeBefore(takeEvent);
Check(!takeEvent.isPrevented, string.Format(ActionWasPreventedMessage, nameof(TakeAction)));
unit.events.InvokeAfter(takeEvent);
var content = unit.GetComponent<ContentModule>();
content.Add(_item);
content.TransferTo(_contentOwner, _item, _index);
}
protected override void OnEndIt()
{
}
protected override void OnCancelIt()
{
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: e2df668c012544ff893888d9f5bcce9a
timeCreated: 1774104779
@@ -0,0 +1,66 @@
using System;
using System.Collections.Generic;
using RPGCore.BackpackEquipment.Data;
using RPGCore.BackpackEquipment.ObjectModules.Content.Events;
using RPGCore.BackpackEquipment.Objects;
using RPGCore.Core;
using RPGCore.Core.Objects;
using RPGCore.ObjectModules.EventObjectModule.Events;
using UnityEngine;
namespace RPGCore.BackpackEquipment.ObjectModules.Content
{
[Serializable]
[RequireComponent(typeof(BaseObject))]
public sealed class ContentModule : ObjectModule<BaseObject>
{
// TODO: tutaj jakiś domyślny owner?
private Dictionary<ItemObject, IContentOwner> _items = new();
public bool Add(ItemObject item)
{
if (item.data.Get<ItemObjectData>().carriedBy) return false;
if (_items.ContainsKey(item)) return false;
_items.TryAdd(item, null);
item.data.Get<ItemObjectData>().carriedBy = parent;
parent.events.Invoke(new ContentAddEvent{obj = parent, item = item});
item.events.Register<RemoveEvent>(OnItemRemove);
return true;
}
public bool Remove(ItemObject item)
{
if (!_items.ContainsKey(item)) return false;
_items[item]?.Remove_Internal(item);
_items.Remove(item);
item.data.Get<ItemObjectData>().carriedBy = null;
parent.events.Invoke(new ContentAddEvent{obj = parent, item = item});
item.events.Unregister<RemoveEvent>(OnItemRemove);
return true;
}
public bool TransferTo(IContentOwner newOwner, ItemObject item, int index = -1)
{
if (parent.data.Get<ItemObjectData>().carriedBy != parent) return false;
if (!newOwner.CanAdd(item, index)) return false;
_items.TryAdd(item, null);
_items[item]?.Remove_Internal(item);
_items[item] = newOwner;
newOwner.Add_Internal(item, index);
return true;
}
private void OnItemRemove(RemoveEvent removeEvent)
{
Remove(removeEvent.obj as ItemObject);
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 79108abbb1214cdca99dde30ae550ceb
timeCreated: 1773479273
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 3913c554eb1a4addbb26fffdcd349490
timeCreated: 1773603441
@@ -0,0 +1,12 @@
using RPGCore.BackpackEquipment.Objects;
using RPGCore.Core.Objects;
using RPGCore.ObjectModules.EventObjectModule;
namespace RPGCore.BackpackEquipment.ObjectModules.Content.Events
{
public class ContentAddEvent : BaseEvent<BaseObject>
{
public BaseObject obj;
public ItemObject item;
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 99499df3a233439c87e15c7aff0c5f7e
timeCreated: 1773603493
@@ -0,0 +1,12 @@
using RPGCore.BackpackEquipment.Objects;
using RPGCore.Core.Objects;
using RPGCore.ObjectModules.EventObjectModule;
namespace RPGCore.BackpackEquipment.ObjectModules.Content.Events
{
public class ContentRemoveEvent : BaseEvent<BaseObject>
{
public BaseObject obj;
public ItemObject item;
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 9475ae89a4184189aadc77e6efc7f86b
timeCreated: 1773603523
@@ -0,0 +1,12 @@
using RPGCore.BackpackEquipment.Objects;
using RPGCore.Core.Objects;
using RPGCore.ObjectModules.EventObjectModule;
namespace RPGCore.BackpackEquipment.ObjectModules.Content.Events
{
public class DropEvent : BasePreventableEvent<UnitObject>
{
public UnitObject unit;
public ItemObject item;
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 6d837632056f4104b980ea605bedf43a
timeCreated: 1774105017
@@ -0,0 +1,12 @@
using RPGCore.BackpackEquipment.Objects;
using RPGCore.Core.Objects;
using RPGCore.ObjectModules.EventObjectModule;
namespace RPGCore.BackpackEquipment.ObjectModules.Content.Events
{
public class TakeEvent : BasePreventableEvent<UnitObject>
{
public UnitObject unit;
public ItemObject item;
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 59ccda71e50b47c1aa77c87b649fcbc6
timeCreated: 1774104995
@@ -0,0 +1,18 @@
using RPGCore.BackpackEquipment.Objects;
namespace RPGCore.BackpackEquipment.ObjectModules.Content
{
public interface IContentOwner
{
internal bool Add_Internal(ItemObject item, int index = -1)
{
return CanAdd(item, index) && Add(item, index);
}
internal bool Remove_Internal(ItemObject item) => Remove(item);
public bool CanAdd(ItemObject item, int index);
protected bool Add(ItemObject item, int index);
protected bool Remove(ItemObject item);
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 78febecbf5d31be469d6b9d3c816fd4d
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: dd19ece4ebc44910a39c811850fd4193
timeCreated: 1773430585
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 44fa14edd1ea4bca85d9f05ac40e40ea
timeCreated: 1774105228
@@ -0,0 +1,13 @@
using RPGCore.BackpackEquipment.Objects;
using RPGCore.Core.Objects;
using RPGCore.ObjectModules.EventObjectModule;
namespace RPGCore.BackpackEquipment.ObjectModules.UnitBackpack.Events
{
public class BackpackAddEvent : BaseEvent<UnitObject>
{
public UnitObject unit;
public ItemObject item;
public int index;
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: c6f6cc77ea14440495a47ca94593c621
timeCreated: 1774105312
@@ -0,0 +1,13 @@
using RPGCore.BackpackEquipment.Objects;
using RPGCore.Core.Objects;
using RPGCore.ObjectModules.EventObjectModule;
namespace RPGCore.BackpackEquipment.ObjectModules.UnitBackpack.Events
{
public class BackpackRemoveEvent : BaseEvent<UnitObject>
{
public UnitObject unit;
public ItemObject item;
public int index;
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 71449b2a17364a648815c450a72a7b8a
timeCreated: 1774105327
@@ -0,0 +1,12 @@
using RPGCore.Core.Objects;
using RPGCore.ObjectModules.EventObjectModule;
namespace RPGCore.BackpackEquipment.ObjectModules.UnitBackpack.Events
{
public class BackpackResizeEvent : BaseEvent<UnitObject>
{
public UnitObject unit;
public int beforeSlotCount;
public int afterSlotCount;
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 78e21ee03af24c16b2227c490a8baf32
timeCreated: 1774205953
@@ -0,0 +1,10 @@
using RPGCore.Core.Objects;
using RPGCore.ObjectModules.EventObjectModule;
namespace RPGCore.BackpackEquipment.ObjectModules.UnitBackpack.Events
{
public class BackpackSortEvent : BaseEvent<UnitObject>
{
public UnitObject unit;
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: a837a368926d42888b1a661e56cab0df
timeCreated: 1774129920
@@ -0,0 +1,17 @@
using RPGCore.BackpackEquipment.Objects;
using RPGCore.Core.Objects;
using RPGCore.ObjectModules.EventObjectModule;
namespace RPGCore.BackpackEquipment.ObjectModules.UnitBackpack.Events
{
public class BackpackSwapEvent : BaseEvent<UnitObject>
{
public UnitObject unit;
public int firstSlotIndex;
public ItemObject firstItem;
public int secondSlotIndex;
public ItemObject secondItem;
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 4343d10da640435abbc163a2d255ddf2
timeCreated: 1774206592
@@ -0,0 +1,154 @@
using System;
using System.Linq;
using RPGCore.BackpackEquipment.ObjectModules.Content;
using RPGCore.BackpackEquipment.ObjectModules.UnitBackpack.Events;
using RPGCore.BackpackEquipment.Objects;
using RPGCore.Core;
using RPGCore.Core.Objects;
using RPGCoreCommon.Helpers.PropertyAttributeDrawers;
using UnityEngine;
namespace RPGCore.BackpackEquipment.ObjectModules.UnitBackpack
{
[RequireComponent(typeof(UnitObject))]
[RequireComponent(typeof(ContentModule))]
[DisallowMultipleComponent]
public sealed class UnitBackpackModule : ObjectModule<UnitObject>, IContentOwner
{
// TODO: implementacja stackowania tutaj
[SerializeField] private ItemObject[] _serializedItems;
[SerializeField] public bool isLimited = true;
[SerializeField] public int itemsLimit = 5;
[SerializeField] public int itemsPerChunk = 5;
[SerializeField] public int minimumChunks = 3;
[SerializeField] public int additionalChunks = 1;
private ItemObject[] _items;
public ItemObject[] items => _items.ToArray();
private void Awake()
{
_items = _serializedItems.ToArray();
Resize();
}
private void Start()
{
InitializeItems();
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
private void InitializeItems()
{
// TODO: inicjalizacja serializowanych itemkow + ich eventy
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public bool CanAdd(ItemObject item, int index)
{
return !isLimited || _items.Any(i => i == null);
}
bool IContentOwner.Add(ItemObject item, int index)
{
if (index < 0) index = Array.IndexOf(_items, false);
if (index < 0) return false;
if (isLimited && index >= itemsLimit) return false;
_items[index] = item;
Resize();
parent.events.Invoke(new BackpackAddEvent { unit = parent, item = item, index = index });
return true;
}
bool IContentOwner.Remove(ItemObject item)
{
var index = Array.IndexOf(_items, item);
if (index < 0) return false;
_items[index] = null;
Resize();
parent.events.Invoke(new BackpackRemoveEvent { unit = parent, item = item, index = index });
return true;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public void Swap(int firstItemIndex, int secondItemIndex)
{
var wantedSize = Math.Max(firstItemIndex, secondItemIndex) + 1;
if (isLimited && wantedSize > itemsLimit) return;
Resize(wantedSize);
(items[firstItemIndex], items[secondItemIndex]) = (items[secondItemIndex], items[firstItemIndex]);
parent.events.Invoke(new BackpackSwapEvent
{
unit = parent,
firstSlotIndex = firstItemIndex,
firstItem = items[firstItemIndex],
secondSlotIndex = secondItemIndex,
secondItem = items[secondItemIndex],
});
}
private void Resize(int wantedSize = 0)
{
if (isLimited)
{
// TODO: obsłużyć itemki w miejscach, które zaraz zostaną "ucięte" (przy zmniejszaniu slotów) - TYLKO w limitowanym plecaku
if (_items.Length != itemsLimit)
{
Array.Resize(ref _items, itemsLimit);
}
return;
}
var limitBefore = items.Length;
var lastItemIndex = Array.FindLastIndex(items, item => item);
var limitMinimum = Mathf.Max(wantedSize, lastItemIndex, minimumChunks * itemsPerChunk);
var limitAfter = Mathf.CeilToInt((float)limitMinimum / itemsPerChunk + additionalChunks) * itemsPerChunk;
// Size not changed, do nothing
if (limitBefore == limitAfter) return;
// Resize backpack's arrays
Array.Resize(ref _items, limitAfter);
parent.events.Invoke(new BackpackResizeEvent
{
unit = parent,
beforeSlotCount = limitBefore,
afterSlotCount = limitAfter
});
}
public void Sort(Func<ItemObject, IComparable> valueGetter, bool sortDescending = false)
{
Array.Sort(items, (item1, item2) =>
{
// NULLS always to the end
if (!item1 && !item2) return 0;
if (!item1) return 1;
if (!item2) return -1;
// Existing items sort by given value getter with given sort direction
var result = valueGetter(item1).CompareTo(valueGetter(item2));
if (sortDescending) result *= - 1;
return result;
});
parent.events.Invoke(new BackpackSortEvent { unit = parent });
Resize();
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: e066d3b400674903a1d052f489460cbc
timeCreated: 1773430662
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 9a81f86e2a5e4f37b06c93aa994bd84e
timeCreated: 1773430610
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 8bf7e79f48a548eb84e276eee5e5e625
timeCreated: 1774105234
@@ -0,0 +1,29 @@
using RPGCore.BackpackEquipment.ObjectModules.UnitEquipment.Objects;
using RPGCore.ObjectModules.ActionObjectModule;
namespace RPGCore.BackpackEquipment.ObjectModules.UnitEquipment.Actions
{
public class EquipAction : BaseAction
{
private readonly WearableObject _wearable;
private readonly int _index;
public EquipAction(WearableObject wearable, int index = -1)
{
_wearable = wearable;
_index = index;
}
public override void CanDoIt()
{
}
protected override void OnDoIt()
{
}
protected override void OnEndIt() { }
protected override void OnCancelIt() { }
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: e7e7ce4fbec54ebfbe05f9cecae4a871
timeCreated: 1774105374
@@ -0,0 +1,27 @@
using RPGCore.ObjectModules.ActionObjectModule;
namespace RPGCore.BackpackEquipment.ObjectModules.UnitEquipment.Actions
{
public class UnEquipAction : BaseAction
{
public override void CanDoIt()
{
throw new System.NotImplementedException();
}
protected override void OnDoIt()
{
throw new System.NotImplementedException();
}
protected override void OnEndIt()
{
throw new System.NotImplementedException();
}
protected override void OnCancelIt()
{
throw new System.NotImplementedException();
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 48179d58af5844cb9ea6d3df49a151cb
timeCreated: 1774105416
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 8935ac7ea78145d2bade1ab807dcf5ac
timeCreated: 1776013837
@@ -0,0 +1,19 @@
using System;
using RPGCore.BackpackEquipment.ObjectModules.UnitEquipment.Objects;
using RPGCore.Core.Objects;
using RPGCore.ObjectModules.EventObjectModule;
using RPGCoreCommon.Helpers.PropertyAttributeDrawers;
using UnityEngine;
namespace RPGCore.BackpackEquipment.ObjectModules.UnitEquipment.Data
{
[Serializable]
public sealed class WearableObjectData : BaseData<WearableObject>
{
[Header("Current state")]
[field: SerializeField, ReadOnly] public UnitObject equippedBy { get; set; }
[Header("WEARABLE")]
[field: SerializeField] public WearableTypeSO type { get; private set; }
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 5225f7b9b3fd4b15874ed6af5a887703
timeCreated: 1775931397
@@ -0,0 +1,10 @@
using UnityEngine;
namespace RPGCore.BackpackEquipment.ObjectModules.UnitEquipment
{
[CreateAssetMenu(menuName = "RPG Core/Equipment/Schema")]
public class EquipmentSchemaSO : ScriptableObject
{
public EquipmentSchemaSlot[] slots;
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 1b6db097519240cdb57eb1a235eb6d00
timeCreated: 1774117121
@@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using UnityEngine;
namespace RPGCore.BackpackEquipment.ObjectModules.UnitEquipment
{
[Serializable]
public class EquipmentSchemaSlot
{
public string name;
public Texture2D icon;
public List<WearableTypeSO> validTypes;
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 3c100a156e9e403888cab30f01b22b2e
timeCreated: 1774117160
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 5a9185f4f6844784b7432d9353365f7f
timeCreated: 1774105234
@@ -0,0 +1,14 @@
using RPGCore.BackpackEquipment.ObjectModules.UnitEquipment.Objects;
using RPGCore.BackpackEquipment.Objects;
using RPGCore.Core.Objects;
using RPGCore.ObjectModules.EventObjectModule;
namespace RPGCore.BackpackEquipment.ObjectModules.UnitEquipment.Events
{
public class EquipEvent : BaseEvent<UnitObject>
{
public UnitObject unit;
public WearableObject wearable;
public int index;
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 9c3da958a57e4b019de195f87cc032d7
timeCreated: 1774105477
@@ -0,0 +1,14 @@
using RPGCore.BackpackEquipment.ObjectModules.UnitEquipment.Objects;
using RPGCore.BackpackEquipment.Objects;
using RPGCore.Core.Objects;
using RPGCore.ObjectModules.EventObjectModule;
namespace RPGCore.BackpackEquipment.ObjectModules.UnitEquipment.Events
{
public class UnEquipEvent : BaseEvent<UnitObject>
{
public UnitObject unit;
public WearableObject wearable;
public int index;
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: b9b6c7062a844cb6bf556d76e7351410
timeCreated: 1774105488
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 4f78116570fd4167a06bb18e9f0d585b
timeCreated: 1776013778
@@ -0,0 +1,13 @@
using System;
using RPGCore.BackpackEquipment.Objects;
using RPGCore.Core;
using RPGCoreCommon.DynamicValues;
namespace RPGCore.BackpackEquipment.ObjectModules.UnitEquipment.Objects
{
public class WearableObject : ItemObject
{
[DynamicValueProvider]
private ObjectModule<WearableObject> UsableModuleProvider(Type moduleType) => GetComponent(moduleType) as ObjectModule<WearableObject>;
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: c2ef6b5eaa38431bacb28adb8bb2739c
timeCreated: 1773430452
@@ -0,0 +1,78 @@
using System;
using System.Linq;
using RPGCore.BackpackEquipment.ObjectModules.Content;
using RPGCore.BackpackEquipment.ObjectModules.UnitEquipment.Data;
using RPGCore.BackpackEquipment.ObjectModules.UnitEquipment.Events;
using RPGCore.BackpackEquipment.ObjectModules.UnitEquipment.Objects;
using RPGCore.BackpackEquipment.Objects;
using RPGCore.Core;
using RPGCore.Core.Objects;
using UnityEngine;
namespace RPGCore.BackpackEquipment.ObjectModules.UnitEquipment
{
[RequireComponent(typeof(UnitObject))]
[RequireComponent(typeof(ContentModule))]
[DisallowMultipleComponent]
public class UnitEquipmentModule : ObjectModule<UnitObject>, IContentOwner
{
[SerializeField] private EquipmentSchemaSO _schema;
[SerializeField] private WearableObject[] _serializedItems;
private WearableObject[] _items;
private void Awake()
{
_items = new WearableObject[_schema.slots.Length];
}
private void Start()
{
InitializeItems();
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
private void InitializeItems()
{
// TODO: inicjalizacja serializowanych itemkow + ich eventy
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public bool CanAdd(ItemObject item, int index)
{
if (item is not WearableObject wearable) return false;
var slot = _schema.slots[index];
if (slot == null) return false;
if (!slot.validTypes.Contains(wearable.data.Get<WearableObjectData>().type)) return false;
return true;
}
bool IContentOwner.Add(ItemObject item, int index)
{
var wearable = (WearableObject)item;
parent.events.Invoke(new EquipEvent { unit = parent, wearable = wearable, index = index });
_items[index] = wearable;
return true;
}
bool IContentOwner.Remove(ItemObject item)
{
var wearable = (WearableObject)item;
var index = Array.IndexOf(_items, wearable);
parent.events.Invoke(new UnEquipEvent { unit = parent, wearable = wearable, index = index });
_items[index] = null;
return true;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 2daf6192d70b4fc798983932b68c28ea
timeCreated: 1773430702
@@ -0,0 +1,12 @@
using RPGCoreCommon.Helpers.CustomTypes;
using UnityEngine;
namespace RPGCore.BackpackEquipment.ObjectModules.UnitEquipment
{
[CreateAssetMenu(menuName = "RPG Core/Equipment/Wearable Type")]
public class WearableTypeSO : ScriptableObject
{
public new string name;
public Texture2D icon;
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 2c0e3d78b2374dfbb1b254cb9a9cef19
timeCreated: 1774116782