使用 mdevtools 加速你的 Hytale Modding 工作流

发布: (2026年2月1日 GMT+8 09:29)
5 min read
原文: Dev.to

Source: Dev.to

请提供您希望翻译的正文内容,我将为您翻译成简体中文。

介绍

厌倦了每次修改代码后都要重新启动服务器吗?
在本指南中,我们将设置 mdevtools,为你的 Hytale 模组开发环境启用热重载。通过在 Gradle 构建和运行中的服务器之间建立紧密循环,你可以更快迭代,保持开发流畅。

我正在实际使用这套工作流来构建 Vex’s Dungeon Challenge 的程序化生成系统。当你在调试复杂的地下城逻辑或迭代游戏机制时,省去那 30 秒的重启循环,每周可以节省数小时的开发时间。

获取 mdevtools

  1. 从 CurseForge 获取最新的 mdevtools JAR:
    下载 mdevtools

  2. 将 JAR 放置在项目的适当位置:

项目类型目标路径
标准模板 (mbround18)data/server/Server/builtin
自定义设置在服务器根目录创建 builtin 文件夹并将 JAR 放入其中

清单配置

确保你的 hytale-mod.json(或等效的清单)包含依赖字段:

{
  "Dependencies": {},
  "OptionalDependencies": {}
}

注: 对于单模组开发,保持这些对象为空即可;只需确保它们存在。

Gradle 任务 – 安装 Mod JAR

build.gradle 文件中添加以下任务。它会构建你的 mod JAR 并将其复制到服务器的 mods 文件夹。

// In build.gradle
tasks.register("installModJar", Copy) {
    // 1. Build the jar first
    dependsOn ":plugins:yourmod:jar"

    // 2. Grab the output file
    from { project(":plugins:yourmod").tasks.named("jar").flatMap { it.archiveFile } }

    // 3. Drop it into the server mods folder
    into file("data/server/Server/mods")
}

开发循环脚本

在项目根目录创建一个轻量级的 Bash 脚本 (dev-reload.sh),并赋予可执行权限 (chmod +x dev-reload.sh)。

#!/bin/bash
set -euo pipefail
IFS=$'\n\t'

# Configuration
WATCH_DIR="plugin/src"
BUILD_TASK="installModJar"   # Must match the Gradle task above
JAR_NAME="plugin-name-0.1.0.jar"
JAR_SOURCE="./plugin/build/libs"
JAR_DEST="data/server/Server/mods"
DEBOUNCE_SECONDS=5

last_build_time=0

build_and_copy() {
  # Run the Gradle task we created
  ./gradlew "$BUILD_TASK"
}

hard_reload() {
  build_and_copy
  # NOTE: UI assets do NOT hot reload.
  # If you have new UI files, uncomment lines below to rebuild assets zip.
  # ./gradlew assetsZip \
  #    && cp "dist/$(ls dist | grep -m1 -E 'assets.*\.zip')" "$JAR_DEST/"

  echo "Restarting Docker container..."
  docker compose restart
  echo "Hard reload complete."
}

echo "=========================================================="
echo " Hytale Dev Loop: Ready."
echo " [r] Reload Code (Hot)"
echo " [h] Hard Reload (Restart Container + UI)"
echo " [e] Exit"
echo "=========================================================="

while true; do
  printf "> "
  IFS= read -r -n1 key
  echo
  case "$key" in
    r|R)
      now=$(date +%s)
      if (( now - last_build_time < DEBOUNCE_SECONDS )); then
        echo "Debounced. Wait a moment before reloading again."
        continue
      fi
      last_build_time=$now
      echo "Rebuilding and hot‑swapping..."
      build_and_copy
      ;;
    h|H)
      echo "Hard reload requested..."
      hard_reload
      ;;
    e|E)
      echo "Exiting."
      break
      ;;
    *)
      # Ignore other keys
      ;;
  esac
done

运行此脚本后,你会看到一个终端仪表盘:

  • r – 重新构建并热替换代码(不重启服务器)。
  • h – 硬重载(重启 Docker 容器并重新加载 UI)。
  • e – 退出循环。

UI 开发

虽然 mdevtools 能处理 Java 代码的热重载,但 Hytale UI 文件(.ui)仍需进行硬重载才能看到更改。为了及早捕获 UI 错误,请使用 Hytale UI Ultimate VS Code 扩展。它提供:

  • .ui 文件的语法高亮。
  • 对无效的组名和缺失属性进行诊断。
  • 导入导航(Ctrl+Click)以在 UI 文件之间跳转。

将此扩展与脚本中的硬重载(h)命令配合使用,可实现稳健的工作流。

结论

使用 installModJar Gradle 任务、dev-reload.sh 脚本以及 VS Code UI 扩展,你现在拥有一个快速、自动化的开发循环。再也不需要手动移动文件或等待长时间的启动——只需按 r 即可即时注入新代码,或在需要 UI 更改时按 h 进行完整重载。

祝你模组开发愉快!

Back to Blog

相关文章

阅读更多 »

适用于 Unity 的 MVP 架构

简介 本文解释了我们如何为 Unity 游戏采用 MVP(Model–View–Presenter)架构。我将逐步介绍整体结构,解释主要…

Spring Boot 异常处理

Java 与 Spring Boot 异常处理笔记 1. 什么是 Exception? Exception = 打破程序正常流程的不期望情况。 异常处理的目标……

开启 RUST

我的 Java 到 Rust 的转变之路:更换 technology stack 你好,我叫 Garik,今天我想与大家分享我决定更换 technology stack 的故事。