mdevtools로 Hytale 모딩 워크플로우를 강화하세요

발행: (2026년 2월 1일 오전 10:29 GMT+9)
6 min read
원문: Dev.to

Source: Dev.to

Introduction

코드를 한 줄 수정할 때마다 서버를 재시작하는 것이 지겹지 않나요?
이 가이드에서는 mdevtools를 설정하여 Hytale 모딩 환경에서 핫‑리로드를 활성화하는 방법을 알려드립니다. Gradle 빌드와 실행 중인 서버 사이에 긴밀한 루프를 만들면 더 빠르게 반복 작업을 할 수 있어 흐름을 유지할 수 있습니다.

저는 현재 Vex’s Dungeon Challenge의 절차적 생성 시스템을 구축하기 위해 바로 이 워크플로를 적극적으로 사용하고 있습니다. 복잡한 던전 로직을 조정하거나 게임 메커니즘을 반복 개발할 때, 30초 정도 걸리던 재시작 루프를 저장하면 매주 몇 시간씩 개발 시간을 절약할 수 있습니다.

mdevtools 받기

  1. CurseForge에서 최신 mdevtools JAR을 다운로드하세요:
    Download mdevtools

  2. 프로젝트에 맞는 위치에 JAR을 배치합니다:

프로젝트 유형대상 경로
Standard Template (mbround18)data/server/Server/builtin
Custom Setup서버 루트에 builtin 폴더를 만들고 그 안에 JAR을 넣으세요

매니페스트 구성

Ensure your hytale-mod.json (or equivalent manifest) contains the dependency fields:

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

Note: 단일 모드 개발의 경우, 이 객체들을 비워두어도 괜찮으며, 단지 존재하기만 하면 됩니다.

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")
}

Development Loop Script

프로젝트 루트에 가벼운 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 = 프로그램의 정상 흐름을 방해하는 원하지 않는 상황. 예외 처리의 목표...