Назад

Как создать мод для Hytale: Полное руководство от практика

4 дня назад 11 (3 сегодня)

Как создать мод для Hytale: полное руководство от практика

Hytale революционизирует моддинг благодаря сотрудничеству с CurseForge. После двух недель экспериментов с системой модификаций делюсь рабочими решениями и подводными камнями.


Архитектура моддинга: три уровня глубины

Packs (Assets) — старт за 15 минут

Идеально для художников и дизайнеров. Работа через JSON и визуальные редакторы без единой строки кода.

Plugins (Плагины) — для разработчиков

Java-разработка полноценных игровых систем. Требует знания ООП и понимания серверной архитектуры.

Bootstrap — хардкорный моддинг

Модификация на уровне JVM для системных изменений. Аналог ASM / Mixin из Minecraft Forge.


Практика: создаём светящийся кристалл

Этап 1. Манифест предмета

Путь:

./AppData/Roaming/Hytale/UserData/Packs/CrystalMod/Server/Item/Items/glowing_crystal.json
{
  "TranslationProperties": {
    "Name": "server.Glowing_Crystal.name"
  },
  "MaxStack": 64,
  "Icon": "Icons/ItemsGenerated/Glowing_Crystal.png",
  "Categories": ["Blocks.Minerals"],
  "PlayerAnimationsId": "Block",
  "Set": "Crystal_Luminous",
  "BlockType": {
    "Material": "Solid",
    "DrawType": "Cube",
    "Group": "Crystal",
    "Flags": {
      "EmitsLight": true
    },
    "Gathering": {
      "Breaking": {
        "GatherType": "Minerals",
        "ItemId": "Crystal_Luminous_Shard",
        "ToolRequired": "Pickaxe"
      }
    },
    "BlockParticleSetId": "Crystal",
    "Textures": [
      {
        "All": "BlockTextures/Glowing_Crystal_Texture.png"
      }
    ],
    "ParticleColor": "#4d9fff",
    "LightEmission": 12,
    "BlockSoundSetId": "Glass",
    "BlockBreakingDecalId": "Breaking_Decals_Crystal"
  },
  "ResourceTypes": [
    {
      "Id": "Crystal"
    }
  ]
}

Новые фишки:

  • EmitsLight — блок светится
  • LightEmission — сила света (0–15)
  • ToolRequired — нужен инструмент
  • ItemId — что выпадает

Этап 2. Графика и локализация

Текстура (32x32):

Common/BlockTextures/Glowing_Crystal_Texture.png

Используйте альфа-канал для мягкого свечения.

Локализация RU:

Glowing_Crystal.name = Светящийся кристалл

Локализация EN:

Glowing_Crystal.name = Luminous Crystal

Этап 3. Asset Editor

  1. Worlds
  2. ПКМ → Manage Packs
  3. Активировать мод
  4. В игре: ~ /asseteditor
  • Hardness
  • Blast Resistance
  • Collision Box

Продвинутая категоризация

{
  "Icon": "Icons/ItemCategories/Magic_Tab.png",
  "Order": 7,
  "Children": [
    {
      "Id": "Crystals_Magical",
      "Name": "ui.itemcategory.magic_crystals",
      "Icon": "Icons/ItemCategories/Crystals_Icon.png"
    },
    {
      "Id": "Artifacts_Ancient",
      "Name": "ui.itemcategory.ancient_artifacts",
      "Icon": "Icons/ItemCategories/Artifacts_Icon.png"
    },
    {
      "Id": "Potions_Enhanced",
      "Name": "ui.itemcategory.enhanced_potions",
      "Icon": "Icons/ItemCategories/Potions_Icon.png"
    }
  ]
}

Java-плагин: система телепортации

  • JDK 25
  • IntelliJ IDEA
  • Gradle 8+
public class TeleportCommand extends CommandBase {

    private static final int COOLDOWN_SECONDS = 30;
    private final Map<UUID, Long> cooldowns = new ConcurrentHashMap<>();

    public TeleportCommand() {
        super("warp", "Телепортирует на точку возрождения", false);
    }

    @Override
    protected void executeSync(@Nonnull CommandContext context) {
        Player player = context.senderAsPlayer();
        UUID playerId = player.getUniqueId();

        if (cooldowns.containsKey(playerId)) {
            long timeLeft = COOLDOWN_SECONDS -
                (System.currentTimeMillis() - cooldowns.get(playerId)) / 1000;
            if (timeLeft > 0) {
                player.sendMessage(Message.raw("§cПодождите " + timeLeft + " сек"));
                return;
            }
        }

        player.teleport(player.getSpawnPoint());
        cooldowns.put(playerId, System.currentTimeMillis());
    }
}

Частые ошибки

  • Неправильный путь к текстурам
  • Невалидный JSON
  • LightEmission не число

Оптимизация

  • Текстуры до 512x512
  • Используй атласы
  • Кешируй объекты
  • Async для тяжёлых задач

Чек-лист

  • PNG текстуры
  • Валидный JSON
  • en-US переводы
  • Тест в одиночке
  • Тест на сервере
  • README

Вывод

Hytale объединяет простоту JSON и мощь Java. Начни с Packs, затем переходи к плагинам и создавай уникальные механики.

Домой
Избранное
Добавить
Чат
Профиль