TaleGuard - 防护桥

TaleGuard - 防护桥

Hytale的Mixin/转换器保护桥。

实用

TaleGuard

Hytale 的 Mixin/转换器保护桥接层。
拦截常规服务器事件 API 无法触及的低层级交互界面,并将其通过一个简单的钩子进行路由,以便保护插件(地区、岛屿、小游戏)能够在所有场景中执行其规则。

💬 加入社区!
有问题、想法或只是想聊聊天?加入 Stoshe Labs Discord 服务器:
discord.gg/rC9eSzH3tf

![Hytale 早期插件](https://img.shields.io/badge/Hytale-early plugin-8A2BE2?style=for-the-badge) 版本 1.0.0 ![Mixin 桥接层](https://img.shields.io/badge/type-Mixin bridge-FF8C00?style=for-the-badge)


它是什么

Hytale 的高级事件涵盖了方块破坏/放置,但大量游戏交互是通过插件无法从事件中取消的路径发生的:F键/自动物品拾取、物品使用、流体放置和流动、坐骑、作物收获、锤子/建造工具、爆炸、死亡物品掉落和命令。

TaleGuard 在类加载时将这些代码路径安装Mixin,并提出一个单一、共享的问题:

该玩家是否被允许在此处执行此操作?

任何插件都可以通过注册一个ProtectionHook来回答。这意味着一个统一的保护层,无论哪个插件拥有该世界,都能一致地应用。


为什么它是一个“早期”插件

Mixin 会在游戏类加载时重写它们,因此 TaleGuard 必须在服务器完成启动之前运行。

TaleGuard-1.0.0.jar 安装到你服务器的 earlyplugins/ 文件夹中——而不是 mods/

加载后,它会暴露其钩子注册表,并且其 Mixin 在该会话的剩余时间内保持活动。


它保护什么

TaleGuard 将这些交互界面引导至钩子(InteractionType):

界面 类型
方块破坏/放置/收获 BLOCK_HARVESTBUILDERHAMMER
容器打开 CONTAINER_OPEN
作物收获/生长阶段 CROP_HARVESTCROP_STAGE_CHANGE
实体伤害/交互 ENTITY_DAMAGEENTITY_INTERACT
爆炸方块破坏 EXPLOSION_DAMAGE
流体放置/流动 FLUID_PLACE
物品拾取(F键/自动) ITEM_PICKUP
物品使用、坐骑、死亡物品掉落、物品耐久度、NPC生成 (通过钩子路由)
受保护世界中的命令过滤 (通过 checkCommand

对于开发者

TaleGuard 是一个软依赖:不存在编译时耦合。注册一个钩子,TaleGuard 就会调用它;如果未安装 TaleGuard,你的注册就是一个无害的空操作。

钩子接口

public interface ProtectionHook {
    // 返回 false 以拒绝交互
    boolean isAllowed(UUID playerUuid, String worldName, double x, double y, double z, String type);
    void    notifyDenied(UUID playerUuid, String worldName, double x, double y, double z, String type);
}

注册——反射方式(零依赖,推荐用于软依赖)

@SuppressWarnings("unchecked")
Map<String, Object> registry =
    (Map<String, Object>) System.getProperties().get("taleguard.hook.registry");
if (registry != null) {
    registry.put("myplugin", myProtectionHook); // 你的暴露了 isAllowed / notifyDenied 方法的对象
}

注册——通过 API

HookRegistry.registerHook("myplugin", myProtectionHook);

一个钩子还可以暴露 int getPriority()——较小值优先运行。流体流动和命令过滤有自己的入口点(HookRegistry.checkFluidFlow(...)HookRegistry.checkCommand(...))。

将 TaleGuard 添加为可选依赖,以便在存在时优先加载:

"OptionalDependencies": { "Stoshe:stoshe.taleguard": "*" }