Files
2026-03-05 11:39:06 +08:00

291 lines
8.7 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// ReSharper disable ConditionIsAlwaysTrueOrFalseAccordingToNullableAPIContract
using Fantasy.Entitas;
using Fantasy.Network;
#pragma warning disable CS8601 // Possible null reference assignment.
#pragma warning disable CS8625 // Cannot convert null literal to non-nullable reference type.
#pragma warning disable CS8603 // Possible null reference return.
namespace Fantasy;
public static class ContainerHelper
{
#region Container
public static Container Create(Account account, ContainerType containerType)
{
if (!ContainerConfigData.Instance.TryGetConfig(containerType, out var containerConfig))
{
return null;
}
var containerComponent = account.GetComponent<ContainerComponent>();
if (containerComponent == null)
{
Log.Error($"account {account.Id} not found ContainerComponent!");
return null;
}
var containerTypeInt = (int)containerType;
if (containerComponent.Containers.ContainsKey(containerTypeInt))
{
Log.Error($"account {account.Id} containerType {containerType} already exists!");
return null;
}
var container = Entity.Create<Container>(account.Scene, true, true);
container.ConfigId = containerConfig.Id;
container.Account = account;
container.CurrentCellCount = 0;
containerComponent.Containers.Add(containerTypeInt, container);
return container;
}
public static uint TryGetContainer(Account account, ContainerType containerType, out Container container)
{
container = null;
var containerComponent = account.GetComponent<ContainerComponent>();
if (containerComponent == null)
{
// 没有找到容器组件的错误码。
return 1;
}
if (!containerComponent.Containers.TryGetValue((int)containerType, out container))
{
// 在容器组件中没有找到该容器的错误码。
return 2;
}
return 0;
}
#endregion
#region GetItem
public static bool GetItemById(Account account, ContainerType containerType, long id, out Item item)
{
if (TryGetContainer(account, containerType, out var container) != 0)
{
item = null;
return false;
}
return container.GetItemById(id, out item);
}
public static bool GetItemByCell(Account account, ContainerType containerType, long cell, out Item item)
{
if (TryGetContainer(account, containerType, out var container) != 0)
{
item = null;
return false;
}
return container.GetItemByCell(cell, out item);
}
public static void GetItemsByConfigId(Account account, ContainerType containerType, uint configId, List<Item> items)
{
if (TryGetContainer(account, containerType, out var container) != 0)
{
return;
}
container.GetItemsByConfigId(configId, items);
}
public static void GetItemsByType(Account account, ContainerType containerType, ItemType itemType, List<Item> items)
{
if (TryGetContainer(account, containerType, out var container) != 0)
{
return;
}
container.GetItemsByType(itemType, items);
}
public static bool IsFull(Account account, ContainerType containerType)
{
if (TryGetContainer(account, containerType, out var container) != 0)
{
// 这里的可以返回False因为容器组件中可能这个容器。
// 但是也可以返回true是因为这个函数的语义是判断容器已满如果找不到容器也可以认为是满的。
return true;
}
return container.IsFull();
}
public static int GetItemCount(Account account, ContainerType containerType, uint configId)
{
if (TryGetContainer(account, containerType, out var container) != 0)
{
return 0;
}
return container.GetItemCount(configId);
}
#endregion
#region AddItem
public static uint AddItem(Account account, ContainerType containerType, Item item, ItemReason itemReason, bool isSendClient)
{
var tryGetContainer = TryGetContainer(account, containerType, out var container);
if (tryGetContainer != 0)
{
return tryGetContainer;
}
return container.AddItem(item, itemReason, isSendClient);
}
public static uint AddItem(Account account, ContainerType containerType, Item item, long cellId, ItemReason itemReason, bool isSendClient)
{
var tryGetContainer = TryGetContainer(account, containerType, out var container);
if (tryGetContainer != 0)
{
return tryGetContainer;
}
return container.AddItem(item, cellId, itemReason, isSendClient);
}
#endregion
#region SplitItem
public static uint SplitItem(Account account, ContainerType containerType, long itemId, int count, out Item splitItem)
{
var tryGetContainer = TryGetContainer(account, containerType, out var container);
if (tryGetContainer != 0)
{
splitItem = null;
return tryGetContainer;
}
return container.SplitItem(itemId, count, out splitItem);
}
#endregion
#region RemoveItem
public static uint RemoveItem(Account account, ContainerType containerType, long itemId, ItemReason itemReason, bool isSendClient, bool isDispose = true)
{
var tryGetContainer = TryGetContainer(account, containerType, out var container);
if (tryGetContainer != 0)
{
return tryGetContainer;
}
return container.RemoveItem(itemId, itemReason, isSendClient, isDispose);
}
public static uint RemoveItem(Account account, ContainerType containerType, long itemId, int count, ItemReason itemReason, bool isSendClient, bool isDispose = true)
{
var tryGetContainer = TryGetContainer(account, containerType, out var container);
if (tryGetContainer != 0)
{
return tryGetContainer;
}
return container.RemoveItem(itemId, count, itemReason, isSendClient, isDispose);
}
public static uint RemoveItemByCell(Account account, ContainerType containerType, long cellId, ItemReason itemReason, bool isSendClient, bool isDispose = true)
{
var tryGetContainer = TryGetContainer(account, containerType, out var container);
if (tryGetContainer != 0)
{
return tryGetContainer;
}
return container.RemoveItemByCell(cellId, itemReason, isSendClient, isDispose);
}
#endregion
#region Sort
public static void Sort(Account account, ContainerType containerType)
{
if (TryGetContainer(account, containerType, out var container) != 0)
{
return;
}
container.Sort();
}
#endregion
#region ToProto
public static bool TryGetContainerInfo(Account account, ContainerType containerType, out ContainerInfo containerInfo)
{
var tryGetContainer = TryGetContainer(account, containerType, out var container);
if (tryGetContainer != 0)
{
containerInfo = null;
return false;
}
containerInfo = container.ToContainerInfo();
return true;
}
public static void SendAllContainerInfo(Account account)
{
var containerComponent = account.GetComponent<ContainerComponent>();
if (containerComponent == null)
{
Log.Error($"account {account.Id} not found ContainerComponent!");
return;
}
var g2CPushAllContainerInfo = new G2C_PushAllContainerInfo();
foreach (var (_, container) in containerComponent.Containers)
{
g2CPushAllContainerInfo.Containers.Add(container.ToContainerInfo());
}
// 推送容器数据给客户端
account.Session.Send(g2CPushAllContainerInfo);
}
// public static void SendAllContainerInfo(Account account)
// {
// var containerComponent = account.GetComponent<ContainerComponent>();
//
// if (containerComponent == null)
// {
// Log.Error($"account {account.Id} not found ContainerComponent!");
// return;
// }
//
// foreach (var (_, container) in containerComponent.Containers)
// {
// account.Session.Send(new G2C_PushContainerInfo()
// {
// Container = container.ToContainerInfo()
// });
// }
// }
#endregion
}