using System; using System.Linq; using System.Text; namespace ET.Server { [FriendOf(typeof(PlayerComponent))] public static class BagConsoleHelper { public static Player ResolvePlayer(Scene root, string account) { PlayerComponent playerComp = root.GetComponent(); if (playerComp == null || playerComp.dictionary.Count == 0) { return null; } if (!string.IsNullOrWhiteSpace(account)) { return playerComp.GetByAccount(account); } foreach (EntityRef value in playerComp.dictionary.Values) { return value; } return null; } public static string[] SplitArgs(string content) { string[] raw = content.Split(' ', StringSplitOptions.RemoveEmptyEntries); return raw.Select(x => x.Trim()).Where(x => x.Length > 0).ToArray(); } } [ConsoleHandler("AddItem")] public class C_AddItem : IConsoleHandler { // AddItem [account] itemId count public async ETTask Run(Fiber fiber, ModeContex contex, string content) { string[] args = BagConsoleHelper.SplitArgs(content); if (args.Length < 2 || args.Length > 3) { Log.Console("[GM] AddItem 参数错误: AddItem [account] itemId count"); return; } string account = args.Length == 3 ? args[0] : string.Empty; int shift = args.Length == 3 ? 1 : 0; if (!int.TryParse(args[0 + shift], out int itemId) || !long.TryParse(args[1 + shift], out long count)) { Log.Console("[GM] AddItem 参数错误: itemId/count 非法"); return; } Player player = BagConsoleHelper.ResolvePlayer(fiber.Root, account); BagComponent bag = player?.GetComponent() ?? player?.AddComponent(); if (player == null || bag == null) { Log.Console("[GM] AddItem 失败: 无在线玩家"); return; } ItemUnit item = bag.AddItem(itemId, count); player.SetDirty(); LogExtensions.AuditGM("AddItem", $"{{\"account\":\"{player.Account}\",\"itemId\":{itemId},\"count\":{count},\"itemIndex\":{item?.ItemIndex ?? 0}}}"); Log.Console($"[GM] AddItem success account={player.Account} itemId={itemId} count={count}"); await ETTask.CompletedTask; } } [ConsoleHandler("RemoveItem")] public class C_RemoveItem : IConsoleHandler { // RemoveItem [account] itemId count public async ETTask Run(Fiber fiber, ModeContex contex, string content) { string[] args = BagConsoleHelper.SplitArgs(content); if (args.Length < 2 || args.Length > 3) { Log.Console("[GM] RemoveItem 参数错误: RemoveItem [account] itemId count"); return; } string account = args.Length == 3 ? args[0] : string.Empty; int shift = args.Length == 3 ? 1 : 0; if (!int.TryParse(args[0 + shift], out int itemId) || !long.TryParse(args[1 + shift], out long count)) { Log.Console("[GM] RemoveItem 参数错误: itemId/count 非法"); return; } Player player = BagConsoleHelper.ResolvePlayer(fiber.Root, account); BagComponent bag = player?.GetComponent(); if (player == null || bag == null || !bag.RemoveItem(itemId, count)) { Log.Console("[GM] RemoveItem 失败: 数量不足或玩家不存在"); return; } player.SetDirty(); LogExtensions.AuditGM("RemoveItem", $"{{\"account\":\"{player.Account}\",\"itemId\":{itemId},\"count\":{count}}}"); Log.Console($"[GM] RemoveItem success account={player.Account} itemId={itemId} count={count}"); await ETTask.CompletedTask; } } [ConsoleHandler("ShowBag")] public class C_ShowBag : IConsoleHandler { // ShowBag [account] public async ETTask Run(Fiber fiber, ModeContex contex, string content) { Player player = BagConsoleHelper.ResolvePlayer(fiber.Root, content.Trim()); BagComponent bag = player?.GetComponent(); if (bag == null) { Log.Console("[GM] ShowBag: 背包不存在"); return; } StringBuilder sb = new(); var items = bag.GetAllItems(); sb.Append($"[GM] ShowBag account={player.Account} count={items.Count}"); foreach (ItemUnit item in items) { sb.Append($" | idx={item.ItemIndex},itemId={item.ItemId},count={item.Count},heroId={item.HeroId}"); } Log.Console(sb.ToString()); await ETTask.CompletedTask; } } [ConsoleHandler("BagClear")] public class C_BagClear : IConsoleHandler { // BagClear [account] public async ETTask Run(Fiber fiber, ModeContex contex, string content) { Player player = BagConsoleHelper.ResolvePlayer(fiber.Root, content.Trim()); BagComponent bag = player?.GetComponent(); if (bag == null) { Log.Console("[GM] BagClear: 背包不存在"); return; } bag.ClearBagKeepEquipped(); LogExtensions.AuditGM("BagClear", $"{{\"account\":\"{player.Account}\"}}"); Log.Console($"[GM] BagClear success account={player.Account}"); await ETTask.CompletedTask; } } [ConsoleHandler("UseItem")] public class C_UseItem : IConsoleHandler { // UseItem [account] itemIndex [count] public async ETTask Run(Fiber fiber, ModeContex contex, string content) { string[] args = BagConsoleHelper.SplitArgs(content); if (args.Length < 1 || args.Length > 3) { Log.Console("[GM] UseItem 参数错误: UseItem [account] itemIndex [count]"); return; } int shift = 0; string account = string.Empty; if (args.Length >= 2 && !long.TryParse(args[0], out _)) { account = args[0]; shift = 1; } if (!long.TryParse(args[shift], out long itemIndex)) { Log.Console("[GM] UseItem 参数错误: itemIndex 非法"); return; } int count = 1; if (shift + 1 < args.Length) { int.TryParse(args[shift + 1], out count); } Player player = BagConsoleHelper.ResolvePlayer(fiber.Root, account); string reason = string.Empty; ItemUnit item = null; if (player == null || !BagService.TryUseItem(player, itemIndex, count, out reason, out item)) { Log.Console($"[GM] UseItem 失败: {reason}"); return; } LogExtensions.AuditGM("UseItem", $"{{\"account\":\"{player.Account}\",\"itemIndex\":{itemIndex},\"count\":{count},\"left\":{item?.Count ?? 0}}}"); Log.Console($"[GM] UseItem success account={player.Account} itemIndex={itemIndex} left={item?.Count ?? 0}"); await ETTask.CompletedTask; } } }