using Ananta.SDK.Rpc; using Ananta.Server.Protocol.Client4229938; namespace Ananta.Server.Handlers.Game; /// /// NPC 商店的交易类请求(2026-10-02 自 7k-v0.6 捐赠端 GameRouter.NpcShop.cs:176-184 移植)。 /// /// ★★ 先说清楚:这不是「新功能」,而是刻意回绝。捐赠端原注释逐字如下: /// /// // These paths have special inventory rules and must not fall back to an /// // empty success reply, which would falsely claim a purchase/sale occurred. /// /// ⇒ 捐赠端在这四条上同样没有实现买卖,它们的做法是把请求明确回绝(error=1), /// 而不是让兜底返回 error=0 + 空包(那会让客户端以为「买成了 / 卖成了」)。 /// /// ★ 移植前主线在做什么:这 5 个 id 一个都没注册 ⇒ 落 /// DefaultUnknownInvoke4229938。而 /// (478 条)里也没有这 4 个 id /// (已逐个核对:AskBuyCommodityToBag / AskSellCommodityToShop / AskBarterBuyCommodity / /// AskGeneralBuyBackWeaponToShop 全部查无此条目)⇒ 最终走 /// ReturnEmptyOkAsync() = error=0 + 空 body,也就是客户端认为交易成功。 /// 这正是捐赠端要避免的情况。 /// /// ⛑ 为什么不顺便把买卖做出来:这四条各自有独立的库存 / 货币规则 /// (买进背包 ToBag、以物易物 Barter、卖给商店 Sell、武器回购 /// BuyBackWeapon),服务端这边没有物品栏与货币账本,做了也是假的成功。 /// 真要做经济系统属于独立工程,不在本次移植范围。 /// /// AskCloseNpcShop(63547606) 单独说明:它是 NOTIFY,捐赠端用它清自己 /// NpcShopRuntime.OpenShop 字段。主线没有 OpenShop 这个概念(全仓 grep 零命中), /// 所以这里注册成一个只打日志的空处理,唯一收益是让它不再往 /// unknown-methods.log 里灌水。 /// /// ⛑ 回滚:把下面 5 个 MethodId.* 从 GameRouter.cs 的 /// Enabled4229938MethodIds 里删掉即可(回到兜底行为,编译不受影响)。 /// internal sealed partial class GameRouter { /// /// 四条库存类交易:一律回绝(error=1),不回成功。 /// /// 覆盖了 AskBuyCommodityToBag(63980996)、AskBarterBuyCommodity(63546283)、 /// AskSellCommodityToShop(63030714)、AskGeneralBuyBackWeaponToShop(63634218)。 /// [Handler(MethodId.AskBuyCommodityToBag, HandlerPacketKind.Invoke)] [Handler(MethodId.AskBarterBuyCommodity, HandlerPacketKind.Invoke)] [Handler(MethodId.AskSellCommodityToShop, HandlerPacketKind.Invoke)] [Handler(MethodId.AskGeneralBuyBackWeaponToShop, HandlerPacketKind.Invoke)] private Task UnsupportedNpcShopPurchase4229938(Connection conn, UxRpcMessage msg) { conn.Log.Info($"[NPCSHOP] unsupported trade id={msg.MethodId} bytes={msg.Body.Length} -> rejected(error=1)"); return conn.ReturnEmptyAsync(msg, 1); } /// /// 关店通知(63547606,NOTIFY)。主线不维护「当前打开的商店」状态,只记日志。 /// [Handler(MethodId.AskCloseNpcShop, HandlerPacketKind.Notify)] private Task CloseNpcShop4229938(Connection conn, UxRpcMessage msg) { conn.Log.Info($"[NPCSHOP] close-shop notify bytes={msg.Body.Length} (no open-shop state in this build)"); return Task.CompletedTask; } }