DillonLib

DillonLib

提供平台抽象、混入管理、配置系统、工厂及其他常见模组工具的API。

DillonLib Logo.

Dillon 模组的基库/API。

跨平台 API,提供可复用的实用工具,如平台抽象、Mixin 管理、配置系统、工厂以及其他常见的模组开发实用程序。


开发者说明

提供在多模组平台(例如 Fabric、Forge 和 NeoForge)上创建模组所需的全部信息。

还提供其他资源,包括:

  • 工厂,可为特定类型的对象自动注册某些行为
  • 基于 UUID 的、存储在内存中的玩家数据
  • 易于使用的 Mixin 谓词
  • 在 Minecraft 服务器刻中运行的计划任务
  • 简单的权限获取器
  • 刻计算器
  • 一个简洁的选项系统
  • 通用文本
  • 通用客户端操作和现代风格的控件列表

DillonLib 不依赖任何其他外部资源或模组,但 Fabric 用户需要 Fabric API 除外。

您可以查看源代码了解所有功能和实用工具,并阅读下面的文档。

要将此库用于您的模组,请将其添加到您的 build.gradle 文件中:

repositories {
    exclusiveContent {
        forRepository {
            maven {
                name = "Modrinth"
                url = "https://api.modrinth.com/maven"
            }
        }
        filter {
            includeGroup "maven.modrinth"
        }
    }
}

dependencies {
    implementation "maven.modrinth:dillon-lib:*DL_version*"

    // 注意:对于 *DL_version*,请确保使用正确的 MC 和平台(fabric/neoforge/forge)版本。
    // 您可以通过打开指定版本并复制 modrinth 链接的末尾来获取它。
    // 示例:https://modrinth.com/mod/dillon-lib/version/5voax3wu <- 使用 "5voax3wu" 作为 *DL_version*!
}

对于多加载器模组(fabric x (neo)forge),在您的 common 目录中,您必须添加:

compileOnly "maven.modrinth:dillon-lib:${project.*DL_version* /*<- 可以是 Fabric 或 NeoForge,但我推荐 fabric*/}"

然后,在您的其他模块(例如 fabric 或 neoforge)中,为您指定的模块添加上面提供的常规实现块。


API 文档


平台抽象

该 API 借助 Java 内置功能(称为服务加载器)提供了一种通用方式来存储模组的基本信息。

您可以将服务加载器视为模组的基本入口点或目录。服务加载器包含诸如模组版本、模组 ID、平台名称(fabric、neoforge、forge 或其他)、平台发布状态(稳定版、测试版或 alpha 版)以及其他有用的实用信息。

DillonLib 为您提供了三种不同的服务加载器。一个用于您的基本入口点(称为 ModPlatform.class),一个专门用于 Mixin(称为 MixinModPlatform.class),还有一个用于客户端操作(称为 ClientModPlatform)。

从技术上讲,您不需要创建所有平台。每个平台都包含注册特定事物所需的信息。

点击此处查看 ModPlatform.class。

点击此处查看 ClientModPlatform.class。

点击此处查看 MixinModPlatform.class。

这些平台专为在多个模组加载器上编码的项目设计,因此每个模组加载器都应该有自己的平台类。

要正确创建您的服务加载器,只需创建这些平台类的实例,并填写您的信息。

然后,在您模组的 resources 文件夹中,创建一个名为 META-INF/services 的目录,然后创建以下文件(取决于您使用的平台),并使用这些确切名称:

net.dillon.dillonlib.platform.client.ClientModPlatform
net.dillon.dillonlib.platform.mixinsafe.MixinModPlatform
net.dillon.dillonlib.platform.ModPlatform

在每个文件中,您应该输入 您的 平台的路径。例如,在 net.dillon.dillonlib.platform.ModPlatform 内部应该是:

net.dillon.quesoexample.platform.QuesoExamplePlatformImpl

如果您正在使用自定义平台扩展某个平台,例如。MyModPlatform 扩展 ModPlatform,如果您自定义的平台仅具有继承自原始平台类的方法,则必须在文件中指定您的扩展平台。但是,如果您有一个自定义平台,其自定义方法不是继承自原始平台类的,则必须在文件中指定您的扩展平台,并额外创建一个新文件,指向您的扩展平台类,并在那里也指定它。

例如:

package com.me.mymod

public class MyPlatform extends ModPlatform {

  public void myCustomMethod(String args) {
  }
}

您必须在名为 net.dillon.dillonlib.platform.ModPlatform 的文件以及名为 com.me.mymod.MyPlatform 的文件中调用此类。

然后您应该创建 getter 方法来获取您的每个平台。在此处查看示例。

有三种不同的平台可确保 Minecraft 安全启动。我们不希望客户端代码干扰通用代码,也不希望类在 Mixin 初始化期间过早加载,这就是我们有一个名为 MixinModPlatform 的单独平台的原因。


Mixin 插件工具

Mixin 很容易导致模组不兼容,这就是 MixinPluginUtil 类的作用。它允许您轻松控制在初始化时是否应应用某些 Mixin。

点击此处查看 MixinPluginUtil.class。

MixinPluginUtil 使用示例。

一旦您创建了您的 MixinPluginUtil,您可以在您的 IMixinConfigPlugin 中像这样使用它:

public class ConditionalMixinPlugin implements IMixinConfigPlugin {

    @Override
    public boolean shouldApplyMixin(String targetClassName, String mixinClassName) {
        DillonLibMixinPluginUtil mixinPluginUtil = new DillonLibMixinPluginUtil();
        return !mixinPluginUtil.shouldNotApply(targetClassName, mixinClassName);
    }

更新检查器

此模组内置了一个更新检查器,可以轻松添加实现来检查您的模组是否有可用于用户的更新。在此处查看该类。

您所要做的就是在模组的通用代码中的某处创建一个简单的静态布尔表达式(或返回布尔值的方法)。例如:

public static final boolean HAS_UPDATE = UpdateChecker.hasUpdate(UpdateChecker.checkForUpdate(
    "*your_modrinth-project-slug*", // 例如 "dillonlib"
    "*your_current_mod_version_as_a_string" // 例如 "ModConstants.CURRENT_MOD_VERSION"
))

然后,您可以在任何地方使用此表达式,以便在您的模组有更新时运行代码。该模组还内置了更新检查器功能,方便您使用。例如,当玩家加入世界/服务器时,您可以从 CommonTasks 类 调用此方法,告知用户他们应该更新模组:

public static void sendUpdateMessage(Player player, Component modName, String linkToUpdate, int textColor)

这将向玩家发送消息,该消息是可交互的。

  • modName - 您的模组名称在聊天中应如何显示。
  • linkToUpdate - 当用户在聊天中点击消息时应被引导到的位置。
  • textColor - 整个聊天消息的一般文本颜色(不影响 modName 颜色)。

此外,您可以从 ClientTasks 类 调用这些方法,以便在您的模组有更新时渲染一个“更新指示器”精灵(这使用与 Mod Menu 检查模组更新时相同的纹理):

// 在屏幕上的特定位置绘制更新精灵
public static void drawUpdateSprite(GuiGraphicsExtractor graphics, int x, int y)

// 或者:

// 在固定位置的按钮上绘制更新精灵
// "hasUpdate" 参数就是您的 HAS_UPDATE 表达式
public static void renderUpdateIconOnButton(GuiGraphicsExtractor graphics, SpriteIconButton button, boolean hasUpdate)

工厂

工厂允许您创建某些对象,例如物品、船只和按键绑定,而无需为这些物品注册各种杂项行为的麻烦。

正如在 MixinModPlatform 类中所见,为了使用工厂,您必须在您的 MixinModPlatformImpl 中覆盖 "shouldApplyFactories" 方法! 否则,工厂将无法执行其应执行的操作。

通常,例如,当您创建 ShearsItem 时,您必须手动 mixin 某些类,以使剪刀能在特定实体和方块上正常工作。此外,剪刀在某些战利品表(如树叶和草)上不能正确用作剪刀谓词,并且它们的发射器行为从未被考虑在内。

工厂为您处理这类事情。您所要做的就是创建(在此示例中)一个 ShearsFactory 实例,其余行为将自动为您注册。

以下是一个示例:

public static final Item QUESO_SHEARS = ItemsInvoker.registerModItem(QuesoItemIds.QUESO_SHEARS, ShearsFactory::new, new Item.Properties()
            .component(DataComponents.TOOL, ShearsItem.createToolProperties())
            .rarity(Rarity.UNCOMMON)
            .durability(150)
    );

在此之后,您无需对您的剪刀做任何其他事情。其他一切都自动注册!

您可以将工厂用于以下对象:

  • 剪刀
  • 打火石
  • 任何“可点燃”的物品,即会在特定方块上点燃或产生火焰的物品
  • 弓和弩
  • 船只
  • 盾牌
  • 不死图腾
  • 按键绑定
  • 物品组

船只工厂

船只工厂是一种特殊类型的工厂,它持有“BoatData”,其中包含船只所需的所有信息。

船只工厂的特殊之处在于,模型注册会自动为您创建。您所要做的就是创建您的船只纹理并将其放置在正确的位置!

以下是两个船只工厂的示例,一个箱子船,一个非箱子船:

// QuesoItems.class (船只物品)
public static final Item QUESO_BOAT = ItemsInvoker.registerModItem(QuesoItemIds.QUESO_BOAT, properties -> new BoatItem(QuesoEntityTypes.QUESO_BOAT, properties));

public static final Item QUESO_CHEST_BOAT = ItemsInvoker.registerModItem(QuesoItemIds.QUESO_CHEST_BOAT, properties -> new BoatItem(QuesoEntityTypes.QUESO_CHEST_BOAT, properties));

// QuesoEntityTypes.class (船只实体)
public static final EntityType<Boat> QUESO_BOAT = Factories.registerBoatFactory(
            Identifier.fromNamespaceAndPath(QuesoExampleMod.MOD_ID, "queso_boat"), () -> QuesoTestItems.QUESO_BOAT, false);

    public static final EntityType<ChestBoat> QUESO_CHEST_BOAT = Factories.registerBoatFactory(
            Identifier.fromNamespaceAndPath(QuesoExampleMod.MOD_ID, "queso_chest_boat"), () -> QuesoTestItems.QUESO_CHEST_BOAT, true);

您应该在不同的类中注册船只实体和物品,否则可能导致编译错误。

注册船只工厂的方法签名:

// 通常,您总是会使用此方法
<T extends AbstractBoat> EntityType<T> registerBoatFactory(Identifier id, Supplier<Item> dropItem, boolean chest)

// 只有当您想要为您的船只自定义 EntityFactory 时,才应使用此方法(在大多数情况下,您不需要)
<T extends AbstractBoat> EntityType<T> registerBoatFactory(Identifier id, Supplier<Item> dropItem, EntityType.EntityFactory<T> factory, boolean chest)

其他工厂

对于其他工厂,注册它们与这些其他工厂类似。仔细查看此示例物品类,以更好地理解如何创建您的工厂。

  • 对于剪刀工厂,发射器行为、方块谓词和对实体的使用会自动注册。
  • 对于打火石和可点燃工厂,发射器行为和对实体的使用会自动注册。
  • 对于弓和弩工厂,玩家模型和 FOV 修改会自动注册。

了解更多

DillonLib 还有许多其他模组开发实用工具, 包括简单的数学运算、现代列表控件、简洁的配置系统、基于 UUID 的玩家存储、任务调度等等!如果您想了解更多,请查看源代码。

请确保您当前的 DillonLib 版本保持最新,以获取所有最新功能和实用工具。

如果在此处发现任何问题,例如游戏崩溃、不一致或功能请求,请报告。


由 Dillon8775 创建并定期维护。

除非明确说明,否则保留所有权利。