Добавление лута
ItemGeneration — класс для создания генераторов предметов и взаимодействия с ними. Он используется для заполнения ванильных сундуков, бочек и других ВАНИЛЬНЫХ контейнеров.
- Известная раньше проблема, это пустые сундуки в структурах, Dungeon Utility будет по умолчанию генерировать предметы до тех пор, пока не сгенерирует, что очень удобно.
- Интеграция между модами.
- Просмотр игроком лута сундуков в данжах.
Разберем базовые методы данного класса, а в помимо этого — создание генератора, на данный момент содержится даже проблема, чтто и в StructureLoader! Поэтому очень важно позаботиться об уникальности имени генератора!
Генератор предметов
// создаем генератор по имени example_name, последующие операции потребуют то же имя
ItemGeneration.newGenerator("example_name");
Генератор создан, теперь можем приступить к добавлению лута в генератор:
ItemGeneration.addItem("example_name", VanillaItemID.diamond, .1, { min: 1, max: 5 });
Мы обращаемся к генератору по имени example_name и добавляем предмет с идентификатором VanillaItemID.diamond
, вероятность спавна 0.1 (это 10%), а последним параметром мы указываем количество предметов (от 1 до 5).
Окей, генератор создан, предмет в него добавлен, а как же нам добавить его в контейнер? Воспользуемся методом заполнения контейнера (обычно сундука):
ItemGeneration.fill("example_name", x, y, z, region);
Данный метод заполняет сундук на координатах x, y, z в источник блоков region.
Интеграция с другими модами
Для того, чтобы не добавлять свои предметы вручную в каждый мод на структуры, был добавлен метод:
ItemGeneration.setItemIntegration(VanillaItemID.diamond_axe, .1, { min: 1, max: 1 });
Тут мы добавляем предмет с идентификатором VanillaItemID.diamond_axe
, вероятностью спавна 0.1 (это 10%), а последним параметром мы указываем количество предметов (от 1 до 1).
Recipe Viewer
Вызов этого метода позволит игроку просматрировать предметы в Recipe Viewer, которые он сможет получить с данжей:
ItemGeneration.registerRecipeViewer("example_generator", "Title generator");
Как заставить генерироваться лут в своей структуре?
examplePool.setGlobalPrototype("test_structure", Structure.getPrototypeDefault("example_generator"));
Мы обращаемся к экземпляру StructurePool и устанавливаем ему генерацию предметов example_generator
.
Примеры
// помните, что и мя генератора должно быть уникально
ItemGeneration.newGenerator("example_generator");
// добавляем предметы в лут
ItemGeneration.addItem("example_generator", VanillaItemID.iron_ingot, .5, { min: 1, max: 3 });
ItemGeneration.addItem("example_generator", VanillaItemID.diamond, .1, { min: 1, max: 1 });
// создаем событие нажатия палкой, теперь палка будет заполнять сундуки
Item.registerUseFunction(VanillaItemID.stick, (coords, item, block, player) => {
// заполняем сундук на координатах coords в измерении в котором находится игрок player
ItemGeneration.fill("example_generator", coords.x, coords.y, coords.z, BlockSource.getDefaultForActor(player));
});
// добавляем предмет во все другие моды
ItemGeneration.setItemIntegration(VanillaItemID.diamond_axe, .1, { min: 1, max: 1 });
// создаем интеграцию с Recipe Viewer
ItemGeneration.registerRecipeViewer("example_generator", "Title generator");
// создаем StructurePool; ОБРАТИТЕ ВНИМАНИЕ: у каждого мода должно быть свое уникальное имя!
let examplePool = new StructurePool("example_pool");
// устанавливаем путь к папке со структурами, в данном случае папка structures/ в главной директории мода
examplePool.setPathStructures(__dir__ + "structures");
// загружаем структуру test_structure.struct из папки указаной выше, структура будет доступна по имени test_structure
examplePool.upload("test_structure");
// устанавливаем лут структуре test_structure
examplePool.setGlobalPrototype("test_structure", Structure.getPrototypeDefault("example_generator"));