evershade/Assets/Scripts/Managers/Item/ToolbarManager.cs

233 lines
7.6 KiB
C#

using FishNet.Object;
using FishNet.Object.Synchronizing;
using Types;
using Types.Items;
using Types.UI;
using UnityEngine;
// InventoryManager.cs
namespace Managers.Item
{
public class ToolbarManager : NetworkBehaviour, IItemManager<GameSlot>
{
public delegate void ActiveSlotChangedHandler();
public PlayerManager playerManager;
private readonly SyncVar<GameSlot> _activeGameSlot = new(new SyncTypeSettings(1f));
// private static ToolbarManager Instance;
private readonly SyncDictionary<int, GameSlot> _slots = new();
private readonly SlotType _slotType = SlotType.Toolbar;
private void Awake()
{
_slots.OnChange += slots_OnChange;
_activeGameSlot.Value = null;
_activeGameSlot.OnChange += activeGameSlot_OnChange;
}
private void Start()
{
Debug.Log("ToolbarManager Start");
}
public GameItem GetItemFromSlot(int slotId)
{
return _slots.TryGetValue(slotId, out var slot) ? slot.Item : null;
}
public void RemoveItemFromSlot(int slotId)
{
if (_slots.TryGetValue(slotId, out var slot))
slot.Item = null;
else
Debug.LogWarning("Slot not found: " + slotId);
}
public void AddItemToOpenSlot(GameItem item)
{
/*foreach (var slot in Slots.Values)
if (slot.IsEmpty())
{
slot.item = item.GameItem;
Debug.Log("Added item to slot: " + slot.position + " / " + item.GameItem.itemName + " / " +
item.GameItem.quantity);
return;
}
Debug.LogWarning("No empty slots available to add item: " + item.GameItem.itemName);*/
}
[ServerRpc]
public void AddSlotServerRpc(GameSlot gameSlot)
{
// get max slot position
var maxSlotPosition = 0;
foreach (var slot in _slots.Values)
if (slot.Position > maxSlotPosition)
maxSlotPosition = slot.Position;
gameSlot.Position = maxSlotPosition + 1;
gameSlot.SlotType = _slotType;
_slots[gameSlot.GetId()] = gameSlot;
_slots.Dirty(gameSlot.Position);
}
public void RemoveSlot(int slotId)
{
_slots.Remove(slotId);
}
public GameSlot GetSlot(int slotId)
{
return _slots[slotId];
}
public void SwapItems(int slotId1, int slotId2)
{
if (_slots.TryGetValue(slotId1, out var slot1) &&
_slots.TryGetValue(slotId2, out var slot2))
(slot1.Item, slot2.Item) = (slot2.Item, slot1.Item);
}
[ServerRpc]
public void AddItemToSlot(GameItem item, int slotId)
{
if (_slots.TryGetValue(slotId, out var slot))
slot.Item = item;
else
Debug.LogWarning("Slot not found: " + slotId);
}
// public void AddItemToOpenSlot(GameItem item)
// {
// foreach (var slot in Slots.Values)
// if (slot.IsEmpty())
// {
// slot.item = item;
// Debug.Log("Added item to slot: " + slot.position + " / " + item.itemName + " / " + item.quantity);
// return;
// }
//
// Debug.LogWarning("No empty slots available to add item: " + item.itemName);
// }
public SyncDictionary<int, GameSlot> GetSlots()
{
return _slots;
}
private void activeGameSlot_OnChange(GameSlot prev, GameSlot next, bool asServer)
{
Debug.Log("Active GameSlot changed:");
}
private void slots_OnChange(SyncDictionaryOperation op, int key,
GameSlot value, bool asServer)
{
Debug.Log("Slots changed:");
}
[ServerRpc]
private void SetActiveSlotServerRpc(int slotId)
{
SetActiveSlot(slotId);
}
[ObserversRpc]
private void SetActiveSlotObserversRpc(int slotId)
{
SetActiveSlot(slotId);
}
public event ActiveSlotChangedHandler OnActiveSlotChanged;
public void RemoveItemFromSlot(GameItem item)
{
foreach (var slot in _slots.Values)
if (slot.Item == item)
{
slot.Item = null;
Debug.Log("Removed item from slot: " + item.ItemName);
return;
}
Debug.LogWarning("Item not found in any slot: " + item.ItemName);
}
public void SetItemInSlot(int slotId, GameItem item)
{
if (_slots.TryGetValue(slotId, out var slot))
slot.Item = item;
else
Debug.LogWarning("Slot not found: " + slotId);
}
public void SetActiveSlot(int slotId)
{
_activeGameSlot.Value = _slots[slotId];
OnActiveSlotChanged?.Invoke();
}
public void Initialize(GamePlayer playerData)
{
// add toolbar hotkeys 1 to 0 on keyboard
HotkeyManager.Instance.RegisterHotkey("Activate Toolbar Slot 1", KeyCode.Alpha1, () => SetActiveSlot(0));
HotkeyManager.Instance.RegisterHotkey("Activate Toolbar Slot 2", KeyCode.Alpha2, () => SetActiveSlot(1));
HotkeyManager.Instance.RegisterHotkey("Activate Toolbar Slot 3", KeyCode.Alpha3, () => SetActiveSlot(2));
HotkeyManager.Instance.RegisterHotkey("Activate Toolbar Slot 4", KeyCode.Alpha4, () => SetActiveSlot(3));
HotkeyManager.Instance.RegisterHotkey("Activate Toolbar Slot 5", KeyCode.Alpha5, () => SetActiveSlot(4));
HotkeyManager.Instance.RegisterHotkey("Activate Toolbar Slot 6", KeyCode.Alpha6, () => SetActiveSlot(5));
HotkeyManager.Instance.RegisterHotkey("Activate Toolbar Slot 7", KeyCode.Alpha7, () => SetActiveSlot(6));
HotkeyManager.Instance.RegisterHotkey("Activate Toolbar Slot 8", KeyCode.Alpha8, () => SetActiveSlot(7));
HotkeyManager.Instance.RegisterHotkey("Activate Toolbar Slot 9", KeyCode.Alpha9, () => SetActiveSlot(8));
HotkeyManager.Instance.RegisterHotkey("Activate Toolbar Slot 10", KeyCode.Alpha0, () => SetActiveSlot(9));
Debug.Log("Toolbar size: " + playerData.ToolbarSize);
Debug.Log("Toolbar slots: " + playerData.ToolbarSlots.Count);
// print all the toolbar slots keys
// foreach (var slot in playerData.ToolbarSlots) Debug.Log("Slot key: " + slot.Key);
// create player slots for inventory
/*for (var i = 0; i < playerData.ToolbarSize; i++)
{
// find slot at position i and map it
var slot = playerData.ToolbarSlots.FirstOrDefault(x => x.Value.Position == i);
if (slot.Value != null) AddSlotServerRpc(slot.Value);
}*/
// copy slots from Dictionary to SyncDictionary
Debug.Log("Completed Initialized hotkeys in ToolbarManager");
}
public override void OnStartClient()
{
base.OnStartClient();
}
// on client connected,
// on client, add slot to toolbar
[ObserversRpc]
public void AddSlotObserversRpc(GameSlot slot)
{
// AddSlot(slot);
}
public GameSlot GetActiveToolbarSlot()
{
return _activeGameSlot.Value;
}
}
}