新传说

新传说

一个旨在总体上简化Hytale模组制作的项目。目前,它简化了Neoforge事件总线订阅实践中的事件订阅,使模组制作者的事件订阅变得更加简单。

图书馆

NeoTale

NeoTale 是一个轻量级的、注解驱动的事件系统,专为 Hytale 插件设计,灵感来源于 NeoForge 的事件总线系统。它通过自动发现并在运行时连接事件处理器,消除了手动注册和样板代码。


特性

  • 基于注解的事件订阅
  • 无需手动注册
  • 自动类扫描
  • 静态方法分发
  • 极简、清晰的 API
  • NeoForge 风格的工作流

工作原理

启动时,NeoTale 会扫描你的插件并自动检测:

  • 标注了 @EventBusSubscriber 的类
  • 这些类中标注了 @SubscribeEventpublic static 方法

任何符合此模式的方法都会自动注册到事件总线,并在相应事件触发时被调用。


事件示例

@EventBusSubscriber
public final class ServerEvents {

    @SubscribeEvent
    public static void onBoot(BootEvent event) {
        System.out.println("服务器已启动!");
    }

    @SubscribeEvent
    public static void onBreak(BreakBlockEvent event) {
        System.out.println("方块被破坏!");
    }
}

就是这样。NeoTale 会自动处理发现和绑定。


检测规则

NeoTale 只会注册满足以下所有条件的方法:

  • 声明在标注了 @EventBusSubscriber 的类中
  • 标记为 public static
  • 标注了 @SubscribeEvent
  • 只接受一个参数(事件类型)

系统注册

NeoTale 还可以使用相同的注解优先方法自动注册 ECS 系统。在 @EventBusSubscriber 类中声明标注了 @SubscribeSystempublic static 方法。NeoTale 会在插件设置期间调用这些方法,并将返回的系统注册到正确的注册表中。


系统示例

@EventBusSubscriber
public final class Systems {

    @SubscribeSystem(store = SystemStore.ENTITY)
    public static ISystem<EntityStore> myEntitySystem() {
        return new EntityEventSystem<>(BreakBlockEvent.class) {
            @Override
            public void handle(int i,
                               @Nonnull ArchetypeChunk<EntityStore> chunk,
                               @Nonnull Store<EntityStore> store,
                               @Nonnull CommandBuffer<EntityStore> buffer,
                               @Nonnull BreakBlockEvent event) {
            }

            @Override
            public Query<EntityStore> getQuery() {
                return Query.any();
            }
        };
    }

    @SubscribeSystem(store = SystemStore.CHUNK)
    public static ISystem<ChunkStore> myChunkSystem() {
        return new RefSystem<ChunkStore>() {
            @Override
            public Query<ChunkStore> getQuery() {
                return Query.any();
            }

            @Override
            public void onEntityAdded(Ref<ChunkStore> ref,
                                      AddReason reason,
                                      Store<ChunkStore> store,
                                      CommandBuffer<ChunkStore> buffer) {
            }

            @Override
            public void onEntityRemove(Ref<ChunkStore> ref,
                                       RemoveReason reason,
                                       Store<ChunkStore> store,
                                       CommandBuffer<ChunkStore> buffer) {
            }
        };
    }
}

Gradle 配置

添加 NeoTale Maven 仓库:

Gradle (Groovy)

repositories {
    maven { url 'https://dl.cloudsmith.io/public/lio/neotale/maven/' }
}

dependencies {
    implementation "net.liopyu:neotale:$neoTaleVersion"
}

Gradle (Kotlin DSL)

repositories {
    maven("https://dl.cloudsmith.io/public/lio/neotale/maven/")
}

dependencies {
    implementation("net.liopyu:neotale:$neoTaleVersion")
}

为什么选择 NeoTale?

Hytale 的原生系统功能强大,但事件连接过程可能重复且混乱。NeoTale 为来自 NeoForge 事件总线订阅的开发者提供了简单、熟悉的方法,从而简化了开发流程。


使用与分发

NeoTale 可免费用于任何项目,包括公共服务器、模组包和重新分发的构建。你可以按原样捆绑和重新分发 NeoTale,无需额外许可。

ARR 标签仅适用于项目源代码/资产的直接所有权,限制对构建后模组的正常使用或重新分发。


Discord