TheTrackers
该模组提供了多种指向生物实体的提示,辅助玩家寻找目标,同时也是一个特殊功能HUD库。
模组默认内置了末影龙和凋灵的提示指针以及与汇流来世联动的生物提示。
模组已在汇流来世内置。
用户可以通过模组配置(文件或游戏内配置 GUI)对模组进行以下设置:
- 开关:设置是否启用本模组的追踪功能;
- 追踪指针大小:控制全局指针的相对大小,默认值0.6。
- 最大追踪数量:控制追踪的数量,防止太多指针遮挡屏幕。最终只会显示离玩家最近的n个生物。默认值10,最大400(真的有人需要比400还多的追踪吗?需要的话来群里跟我说,我会改的)。
- 位置刷新间隔:从世界中附近的区域获取并更新实体位置的最短时间,默认值是最小值1(最快)。
- 中心环绕式指针开关:最常用的指针类型之一。有关中心环绕式的详情请见下文。
- 投影算法:可以选择在中心环绕投影下使用的算法。艾托夫(Aitoff)可能是表现最正常的投影,所以一般不建议切换;
- 锁定定位式指针开关:在其它游戏中更为常见的一种任务点标记。有关锁定定位式的详情请见下文。
- 经度轴开关:预分配的第三种指示类型,目前暂未准备开发,所以该条目无效。
- XXX式跟踪清单:这是一个列表,每个条目对应一种实体(EntityType)+指针组(Cursor),可以填入键名设置追踪哪类实体、使用何种指针提示,详见下文配置模组。
跟踪详解
目前限定跟踪的距离是 [x:±64 格, y:+64/-48 格, z:±64 格]。
中心环绕式(TRelativeCursor)
中心环绕式指针是目前已经完成的指示模式之一,它会创建环绕在屏幕中心的 HUD 指针指向目标生物实体。
这是旧版(请忽略桌宠):

这是新版(还没修复指针缩放问题时截的):

不难看出这是提示「你该向哪里转能看到实体」而不是「实体在世界的哪个位置」的指针。
该指针会依据你“应该转动视角度数的多少”而距离中心更远或更近。
在更加靠近中心的位置,也就是实体方向与你的视角基本重合的时候,指针会逐渐变淡。(旧图中绿色指向的是附近的末影人)
该投影有三种算法:墨卡托(Mercator)投影、埃托夫(Aitoff)投影和温克尔(Winkel)三重投影,计算思维请见逻辑。
经过测试,三种投影表观上差异不大,而 Aitoff 在应用场景下表现最好,故不建议选择其它两种投影。
有时候我会思考是否使用原版的矩阵完成二维到三维的方向,不过经过研究,带有一点点弧形偏移的指示效果“貌似”会好用一点。
绑定定位式(TDirectProjCursor)

这张图是在开发本模组的本体--汇流来世的矿探药水时候截的,标记矿物的图标就是通过TheTrackers实现的。
这个模式会直接把指针糊在目标生物上。(不是在世界中的标记,而是确实从二维屏幕糊过去的)
有单独显示大头贴的类型和三个图片环绕目标的类型。
还有两种类型是彩蛋!想知道就去MCMOD翻汇流的更新日志吧Lol。
配置模组
在游戏中,你可以通过这个格式在配置中创建一个中心环绕式指针类型:
<modid:实体类型>|<指针箭头类型>|<指针图标类型>
例如,模组默认配置中的末影龙提示器是这样的:
minecraft:ender_dragon|normal|ender_dragon_head
然后就是绑定定位式。
这种模式的配置更复杂,并且处于实验阶段。以下是配置规则,被圆括号围起来的部分表示可写可不写,但是写了效果确实不同。
<modid:实体类型>|<指针类型>:<指针图标类型>(|彩蛋属性)
目前提供的指针箭头有:
normal、normal_red、normal_green、normal_white。
normal就是前文中列出的新图的指针,美术来自牢枕(LazyPillow)
如图是 normal_red:,曾经的指示贴图,现在已经全部被normal取代。
理论上,任何贴图资源都可以成为指针,主要看个人喜好
目前提供的图标有:
- [基于原版] ender_dragon_head、wither_head;
- [汇流来世] king_slime(史莱姆王)、eye_of_cthulhu(克苏鲁之眼)、brain_of_cthulhu(克苏鲁之脑)、queen_bee(蜂后)、eater_of_worlds(世界吞噬者)、skeletron(骷髅王(桑百颗够不够?))、deerclops(巨鹿)、wall_of_flesh(血肉之墙)。
这些用于汇流来世的图标其实不需要加载汇流来世作为前置也能使用。
在某部分填入 none 时指针的这个部分不会显示任何东西。
如图是 ender_dragon_head(取材自 MCMod 百科):
你还可以用材质包什么的添加新材质进来,只要资源目录和本模组贴图在同一个地方就行!只要不重名就能直接引用到!(有人问那重名怎么了?额,重名那不是替换材质嘛...)
注意:由于优化指针视觉,所有继承自 PartEntity 的实体部分不会被指示,比如末影龙的翅膀和尾巴。
Tip:追踪指示第...总之是很多东西已经完成,已经在汇流来世投产,但配置和使用或许还有不完善、不合理的地方,欢迎反馈!
备注:欢迎来 Ti works 的 QQ 群 953398884或 汇流来世 QQ 群 支持作者、助力作者。(我打算开个赞助号什么的...不过也是好久后的事情了)
给模组开发者看的部分
闲话少叙,直接来吧:
首先,声明一下,你能访问的这个指针管理器名叫。在这里不能访问到玩家自定义指针。
接下来,作为开发的一部分,怎么使用?
我在API里塞了一个使用范例,这里再展示一遍:
@EventBusSubscriber(Dist.CLIENT)
/** An example adding death point tag to world. */
public class TestAdd1 {
private static final ComponentBuilder.BuilderResult posTo0 = new ComponentBuilder()
.setComponentType(ComponentBuilder.ComponentType.DIRECT)
.setIcon1(Items.DIAMOND.getDefaultInstance())
.setIcon1Pattern("rainbow:2")
.defineRescale(scale -> (float) (1F + Math.min(scale / 2.2, 1f) * Math.min(scale / 2.2, 1f)))
.setSmoothMove(true)
.build();
private static Vec3 pos;
@SubscribeEvent
public static void onScreenOpen(ScreenEvent.Opening event) {
if (event.getScreen() instanceof DeathScreen) {
Player player = Minecraft.getInstance().player;
if (player != null) {
pos = player.position();
}
}
}
@SubscribeEvent
public static void onPlayerRespawn(PlayerEvent.PlayerRespawnEvent event) {
if (!event.isEndConquered() && pos != null) {
WorldSingletonTracker tracker = TrackersMonitor.getTracker();
if (tracker != null) {
StaticComponent component = tracker.addStaticPosComponent(TheTrackers.MOD_ID, "death point", posTo0, true);
component.posUpdater(vec3 -> {
if (vec3.distanceTo(pos) < 5) component.close();
return pos;
});
}
}
}
}
如上,通过这个功能便能简单的实现一个玩家的死亡坐标指针。
你所需要的仅仅是提前存好一个指针样式结果BuilderResult,然后实际使用时通过TrackersMonitor.getTracker()拿到模组特供的指针管理器,最后使用其所携带的add之类的方法注册进去,这个指针就会出现在屏幕上了。
你还可以按如上所示的表达式完成改变指针目标之类的工作,只要你还持有注册返回的Component就能做到。
WorldSingletonTracker提供的生命周期管理非常简陋,仅仅是清理掉已经调用close()的指针,因此你应当自行定义指针的生命周期。
你并不需要频繁创建或关闭指针来实现指针的暂时隐藏,可以通过component.setVisible(boolean)更方便地实现,这样开销也少。
注册某生物的指针时,使用tracker中带有dynamic字样的方法。你需要提供一个UUID表示该生物,同时你获得的这个指针为SimpleComponent,不支持自定义改变坐标。
为了减少跨类代码,你可以通过modid等注册信息搜索某个指针,以重新获得它。只不过这个获得的是SimpleComponent。
剩下所有具体方法所具有的功能我都写在JavaDoc中了。
以下是将来的计划:
-
独立水平经度轴+指示
-
添加自定义快捷键开关指针
支持使用旅行地图生物图标的计划已因其ARR协议的限制而取消。