Files
Ananta-ps/Ananta.Server/Ananta.Handlers/Game/GameRouter.NpcShopTrades.cs
T

66 lines
3.6 KiB
C#
Raw Blame History

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