291 lines
8.7 KiB
C#
291 lines
8.7 KiB
C#
// 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
|
||
} |