66 lines
3.6 KiB
C#
66 lines
3.6 KiB
C#
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;
|
||
}
|
||
}
|