玩家交互库

玩家交互库

为默认相机视角添加PlayerInteractionEvent,作为PlayerInteractEvent、PlayerMouseButtonEvent和SwitchActiveSlotEvent的替代方案。

图书馆

PlayerInteractLib

PlayerInteractLib 是一个轻量级的服务端库,用于修复 Hytale 服务器 API 中缺失的玩家交互事件。

它引入了一个功能完整的 PlayerInteractionEvent,用于替代当前 API 中无法正常工作的或缺失的 PlayerInteractEvent
该事件允许插件响应真实的玩家交互,包括与世界、方块和物品的交互。

该库设计为其他服务端插件和模组的依赖项使用,无需修改服务端内部。


👑 面向服主

如果您是服主,只需将此模组放入 mods 文件夹即可。
无需任何配置或设置。


🧩 面向插件开发者

PlayerInteractLib 通过响应式事件流SubmissionPublisher)暴露玩家交互事件,允许插件订阅并异步响应玩家操作。


✨ 功能特点

  • 为服务端 API 补充缺失的 PlayerInteractionEvent
  • 提供可靠的玩家交互检测
  • 支持与方块、物品和世界的交互
  • 包含玩家身份和手持物品信息
  • 异步、非阻塞的事件传递(Java Flow API)
  • 轻量且仅作为依赖(无游戏玩法逻辑)


如何使用

1. 将库添加到您的项目 在项目中创建一个 libs 文件夹,并将库的 .jar 文件放入其中:

project-root/
 ├─ libs/
 │   └─ PlayerInteractLib.jar
 └─ build.gradle

示例结构:

image


2. 在 build.gradle 中添加依赖

dependencies { implementation fileTree(di r: 'libs', includes: ['*.jar']) }


3. 在 manifest.json 中声明依赖 将库作为依赖添加到您插件的 manifest.json 中:

"Dependencies": { "Hytale:PlayerInteractLib": "*" }


📦 PlayerInteractionEvent 数据

public record PlayerInteractionEvent(
        InteractionType interactionType,
        String uuid,
        String itemInHandId,
        SyncInteractionChain interaction
) {}

可用信息

玩家 UUID
标识执行交互的玩家。

交互类型InteractionType
确定操作的类型(例如:主交互 / 副交互)。

手持物品
玩家当前使用的物品 ID(可能为 null)。

交互上下文SyncInteractionChain
包含与交互相关的上下文数据,例如:

*   交互状态
*   交互链标识符
*   世界或方块交互元数据

底层的网络和协议细节被有意隐藏,以保持 API 简洁且对插件友好。


使用示例

PlayerInteractLib lib =
        (PlayerInteractLib) PluginManager.get()
                .getPlugin(PluginIdentifier.fromString("Hytale:PlayerInteractLib"));

SubmissionPublisher<PlayerInteractionEvent> publisher = lib.getPublisher();

publisher.subscribe(new Flow.Subscriber<>() {

    @Override
    public void onSubscribe(Flow.Subscription subscription) {
        subscription.request(Long.MAX_VALUE);
    }

    @Override
    public void onNext(PlayerInteractionEvent event) {
        String uuid = event.getUuid();
        var interactionType = event.getInteractionType();

        String username = Universe.get()
                .getPlayer(UUID.fromString(uuid))
                .getUsername();

        System.out.println(username + " performed " + interactionType);
    }

    @Override public void onError(Throwable t) {}
    @Override public void onComplete() {}
});

🧠 常见用例

  • 区域保护系统
  • 自定义方块或物品行为
  • 基于交互的机制
  • 反恶意破坏或权限检查
  • 玩家操作日志记录与分析

ℹ️ 注意事项

  • 事件以异步方式传递
  • 修改世界状态的插件应确保适当的同步
  • 此库应严格作为依赖项使用

如果您觉得这个有用,请随意支持

tips