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;
}
}