Skip to content

Add /guide command to lead players to an NPC by name - #296

Open
UniqueBitter wants to merge 1 commit into
KAMKEEL:devfrom
UniqueBitter:feat/npc-guide-dev
Open

Add /guide command to lead players to an NPC by name#296
UniqueBitter wants to merge 1 commit into
KAMKEEL:devfrom
UniqueBitter:feat/npc-guide-dev

Conversation

@UniqueBitter

Copy link
Copy Markdown

Summary(概述)

新增一个面向普通玩家的 /guide <NPC名> 指令(别名 /yl),按名字/UUID 定位目标 NPC,并在世界里画出一条通往它的发光路径引导玩家过去。不需要 OP 权限。客户端负责路径曲线渲染(距离衰减淡出 + 终点菱形标记),服务端负责按帧预算做寻路,避免长距离寻路卡顿主线程。

主要改动

  • 指令:GuideCommand(/guide,别名 /yl)—— 支持按名字模糊匹配定位 NPC、/guide stop 取消引路、不带参数时查看当前引路目标与距离
  • 服务端:
    • GuideNpcLocator / GuideNameMatcher:按名字/UUID 查找 NPC,名字匹配逐级放宽(全字匹配→前缀→包含)
    • GuideServerTasks:引路查询在网络 IO 线程收到后先入队,实际查询挪到服务端主线程 tick 里执行,避免线程不安全问题
    • 新增网络包 GuideQueryPacket(请求) / GuideTargetPacket(下发目标位置),两者都通过新增的 AbstractPacket.bypassOpsOnly() 钩子豁免了服务器"仅 OP 可用"总闸——这个闸原本是给编辑类指令用的,不应该挡住这种面向所有玩家的功能
  • 客户端:
    • GuideSession:客户端引路会话状态机
    • GuideCurve / GuidePathfinder:Chaikin 曲线细分 + 分帧 A* 寻路(按预算跑,算不完就先给一段能走的路径,剩下的下一帧继续算)
    • GuideRenderer / GuideFade / GuideRenderConfig:死亡空间风格的贴地发光带,能量脉冲沿线流向目标,近处清晰、远处(20 格外)淡出,终点 15 格内菱形标记开始渐显、5 格内完全不透明
    • 远距离目标每秒自动重算下一段路径,走一段是一段
  • 测试:GuideCurveTestGuideFadeTestGuideRenderConfigTestGuideNameMatcherTest,共 34 个单测覆盖曲线几何、淡出曲线、渲染参数、名字匹配逻辑

测试情况

./gradlew compileJava        BUILD SUCCESSFUL
./gradlew compileTestJava    BUILD SUCCESSFUL
./gradlew test(引路相关测试)  BUILD SUCCESSFUL,34/34 通过,0 失败

(构建前需要 git submodule update --init --recursive 拉取 gradle-plugins / src/api 两个子模块,并使用真正的 JDK 8 — 只有 JRE8 会因缺 tools.jar 编译不过 gradle-plugins:compileGroovy

效果截图/GIF 暂缺,后续会在这个 PR 里补充;如果想现在看效果,拉这个分支本地跑一下 /guide <NPC名> 就能看到。

已知限制

  • 目标 NPC 所在区块未加载时找不到
  • 不支持跨维度引路

备注

本分支基于当前 dev HEAD(1.11.2-beta1)。发现 dev 分支自身在 CustomNpcs.java 里有两处与本 PR 无关的预置编译错误(PlayerData.flushEffects() / save(boolean) 方法签名不存在),这两行代码本 PR 未做任何改动,如果 CI 因此报错请知悉与本改动无关。

Adds a player-facing /guide (alias /yl) command that draws a glowing
path from the player to a target NPC located by name/UUID match, with
a client-side curve renderer (Chaikin-subdivided, distance-faded, with
a diamond end marker) and frame-budgeted server-side A* pathfinding
for long-range targets, refreshed incrementally as the player moves.

- New request/data packets (GuideQueryPacket, GuideTargetPacket),
  exempted from the OpsOnly gate via a new AbstractPacket.bypassOpsOnly()
  hook since this is meant for regular players, not just ops
  (kamkeel/npcs/network/AbstractPacket.java, PacketHandler.java)
- Server-side NPC lookup/name matching and a queue that defers actual
  pathfinding queries to the main server tick
  (noppes/npcs/guide/*, ServerTickHandler.java)
- Client-side session state machine and renderer
  (noppes/npcs/client/guide/*), registered from ClientProxy
- Unit tests for the curve geometry, fade curve, render config, and
  name matcher (src/test/java/.../guide/*)

Known limitations: cannot locate the target NPC while its chunk is
unloaded; no cross-dimension support.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant