XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

DeathMod

【Terraria】DeathMod (now aka Soul Harvest)

公开
关注 0 Fork 0 Star 0
UTF-8

SoulHarvest Codex 协作规范

本文件适用于整个 SoulHarvest 仓库。目标不是“让代码通过编译”就结束,而是把用户描述的游戏行为完整实现,并在相应的单人或多人环境中验证后再交付。

一、工作原则

  1. 先确认用户要求的具体行为,再定位代码。不要顺手调整用户未要求的伤害数字位置、UI、数值、贴图、攻击范围或其他表现。
  2. 修复或开发请求默认包含实现与验证。不要只分析原因,也不要在存在安全、明确的推进路径时停下来等待确认。
  3. 先检查 git status --short。工作区中的既有改动均视为用户或其他任务所有;只修改本任务必需的文件,不覆盖、不回退、不格式化无关文件。
  4. 优先用 rg 搜索文件和调用链,用小而明确的补丁完成修改。避免大范围机械重构,除非用户明确要求重构。
  5. 每次修改都要回答三个问题:
    • 真正的游戏逻辑由哪一端执行?
    • 状态如何同步到其他客户端?
    • 如何证明实际效果发生了,而不只是字段发生了变化?
  6. 用户要求“验证后交付”时,没有实际运行证据不得宣称通过。无法完成某项运行验证时,必须明确说明缺少的验证,不得用“理论上没问题”代替。

二、多人模式的权威链路

涉及攻击、伤害、Buff、灵魂、能量、冷却、位移和掉落时,优先梳理完整链路:

客户端输入意图 -> 服务端校验 -> 服务端创建/授权攻击 -> 服务端命中结算 -> 服务端修改状态 -> 同步客户端 -> 客户端播放表现

遵守以下约束:

  1. 伤害、Buff、灵魂奖励、能量、冷却与掉落必须以服务端为权威。客户端数据包只能表达输入意图,不能提供可信伤害、进度、Buff 结果或角色数值。
  2. 服务端应从服务器持有的玩家、装备和人物进度重新生成 SickleCombatSnapshot,不能接受客户端快照覆盖权威状态。
  3. ReceiveExtraAI 在服务端仍需完整读取网络数据以消费数据包,但不得用客户端内容替换已授权的服务端战斗状态。
  4. 服务端生成的重要弹幕应完成配置、授权与同步。优先复用仓库现有的 ReaperProjectileHelper.SyncNewProjectileConfigureReaperProjectile 和服务器授权模式。
  5. Main.dedServ 下不得访问贴图、SpriteBatch、声音、粒子或图形设备。视觉代码必须与服务端结算分离。
  6. 不要在服务端命中回调中,于 Buff、资源或归属结算之前提前 return。如果多个钩子可能负责同一效果,应把权威结算集中到可幂等调用的方法中。
  7. 对训练假人单独检查。泰拉瑞亚的假人命中在多人模式下可能不完整触发常规弹幕回调;若使用服务器几何补偿,补偿必须执行与真实命中相同的 Buff、能量和领域效果,并防止重复结算。
  8. NPC 的灵魂归属要在伤害发生前或最迟在权威命中时登记,以免一击击杀先于 OnHit。击杀测试必须检查玩家灵魂余额确实增加并已同步。
  9. 修改 MyPlayer.Souls 等人物绑定状态前,确认 ServerCharacterStateReady。如果状态尚未就绪,不要静默丢失奖励;应修复初始化或延迟结算链路,而不是绕过服务端权威。
  10. 所有新增同步字段都要同时检查初始化、发送、接收、晚到包、重复包、断线和专服路径。

三、战斗与动画时序

  1. 玩法判定和视觉动画使用同一个可同步时钟,避免客户端已经攻击而服务端仍在前摇,或视觉尚未完成但伤害已经发生。
  2. 前摇阶段必须显式关闭伤害、派生弹幕、位移攻击和命中副作用;前摇结束后才进入原攻击时间线。
  3. 若玩家在前摇期间松开蓄力键,应保留合理的输入意图,但不能让整次攻击无效果。至少保证动画完成后执行设计要求的最小攻击段。
  4. 攻击持续时间、连段阻塞条件、物品复用时间和服务器授权间隔必须一起检查。不能只延长视觉计时而让下一次点击提前创建另一把武器。
  5. 视觉随机应由可重现的种子驱动,例如弹幕 identity、动作 ID 和阶段。多人客户端应看到一致的主要构图;纯装饰粒子可以本地随机。
  6. 新视觉只能改变用户要求的形态和动作。不要让死神形态的特效泄漏到其他镰刀、终极技或非战斗物品展示中。
  7. 使用现有贴图制作碎片、遮罩或裁切时,优先在客户端运行时生成并缓存;卸载模组时释放运行时纹理。不得在专服创建纹理。
  8. “有特效”不等于“功能完成”。每个动作都分别验证:前摇、完整武器凝聚、实际命中、伤害、Buff、能量、派生弹幕、结束与再次使用。

四、代码修改边界

  1. 修 Bug 时优先修根因和权威边界,不用增加客户端补丁来掩盖服务端缺失。
  2. 共用逻辑应抽成小型、命名明确的方法;需要重复调用时确保幂等,例如同一动作对同一 NPC 根实体只结算一次。
  3. 不改变现有公开存档格式、人物进度或网络协议顺序,除非任务确实需要。若必须改变,发送端和接收端应在同一补丁中完成,并验证旧状态的安全默认值。
  4. 新增调试测试放在 #if DEBUG 或现有自测框架内,不得让测试命令、测试 NPC 或遥测进入 Release 行为。
  5. 注释解释“为什么必须这样做”,尤其是专服例外、网络时序和引擎钩子差异;不要用注释重复代码表面含义。
  6. 不使用破坏性 Git 命令,不删除未知文件,不回退用户改动。只终止本任务明确启动的测试进程,绝不批量结束用户正在运行的 tModLoader。

五、验证顺序

按风险由低到高执行;出现失败先修复,再继续下一层。

1. 静态检查与编译

  • 检查修改文件的 diff,确认没有无关变化、重复分支、调试残留或客户端 API 泄漏到专服。
  • 先执行不打包编译,例如: dotnet build SoulHarvest.csproj -c Debug -p:BuildMod=false
  • 编译警告若由本次修改引入,也应处理。

2. 专服自动验证

  • 优先扩展 Common/ReaperDedicatedServerSelfTest.cs 中的现有测试,而不是创建孤立脚本。
  • 自测必须同时覆盖正向结果与禁止时序,例如:
    • 前摇期间不能造成伤害或生成攻击弹幕;
    • 前摇结束后必须产生权威攻击;
    • 命中后目标实际拥有对应 Buff;
    • 击杀后玩家灵魂余额按预期增加;
    • 客户端伪造或未授权弹幕不能在服务端存活;
    • 同一动作不能重复奖励能量或灵魂。
  • 断言实际 NPC、玩家和弹幕状态,不要只断言私有布尔值。

3. 真实单人验证

  • 检查视觉中心、武器锚点、碎片重组、左右翻转、攻击中心和伤害中心是否一致。
  • 检查不同攻击速度、连段阶段、按住与轻点、松开和连续使用。
  • 确认修改没有影响伤害数字位置、HUD、其他镰刀或终极技。

4. 真实多人验证

至少用一个专服和一个客户端完成实际攻击,不仅运行服务端空玩家单元测试。根据任务检查:

  • 服务端接受正确输入并拒绝未授权输入;
  • 房主、远端玩家和旁观客户端看到一致的主要动画;
  • 普通敌人和训练假人均能正确触发对应效果;
  • Buff 图标/状态、伤害、灵魂、能量和冷却在服务器与客户端一致;
  • 高延迟或晚到同步包不会导致无攻击、卡住、重复攻击或 180 帧等待;
  • 玩家松开按键、死亡、切换物品或断线后,控制器和 held projectile 能正确清理。

5. Release 构建与交付

  • Debug 与运行验证通过后再构建 Release .tmod
  • 若用户正在运行游戏导致已安装模组被锁定,使用独立 -tmlsavedirectory 构建验证;不要结束用户进程。只在目标文件可安全替换时更新正式 Mods 目录。
  • 最后再次检查 git diff --stat 和关键 diff,确认交付内容只包含本任务及已存在的用户改动。

六、验收清单

一个战斗修复只有同时满足下列条件才算完成:

  • 单人逻辑正确;
  • 专服权威逻辑正确;
  • 客户端只负责输入与表现,没有决定伤害或资源;
  • 普通敌人与训练假人路径都已检查;
  • Buff、灵魂、能量、伤害和冷却均验证实际结果;
  • 前摇期间无攻击,完成后攻击正常;
  • 视觉中心、伤害中心和同步时钟一致;
  • 其他形态、UI、伤害数字位置和既有素材未被误改;
  • Debug 编译和适用的自动测试通过;
  • 真实单人/多人运行证据已记录;
  • Release 模组成功构建并放到明确的交付位置。

七、向用户交付时的说明

使用简洁中文,先给结果,再给验证证据。至少说明:

  1. 修复或实现了哪些可观察行为;
  2. 关键修改文件;
  3. 实际执行了哪些编译、专服、单人和多人测试,以及结果;
  4. Release .tmod 的路径或当前无法覆盖的原因;
  5. 若仍有未验证项,明确列出,不能写成“全部通过”。

不要把实现过程堆给用户,也不要用“应该、理论上、大概”代替验收结果。