// 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(); 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(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(); 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 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 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(); 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(); // // 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 }