Как создать мод для 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
- Worlds
- ПКМ → Manage Packs
- Активировать мод
- В игре:
~ /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, затем переходи к плагинам и создавай уникальные механики.