Обзор
Система раскрытия блоков и предметов на основе данных. Открывайте по мере прохождения!
Revelationary предоставляет способ ограничить обнаружение новых блоков в мире через data pack или API (для других модов). С помощью этого решения можно проектировать прогрессию в модпаках, избегая перегрузки игроков информацией на старте. Блоки становятся видимыми только после получения конкретного достижения.
Пример: Игрок видит определённую руду как камень. После победы над Эндердраконом руда становится видимой и добываемой — она существовала в мире с самого начала. Индивидуально для каждого игрока с высокой производительностью.
Механика раскрытия
Для создателей модов и модпаков с прогрессией Revelationary позволяет постепенно открывать блоки в мире по мере развития игрока. Например, обычный камень может превратиться в жилу руды после достижения ключевого этапа.
До получения необходимого прогресса замаскированные блоки и предметы будут иметь абстрактные названия. Блоки сохраняют свойства маскируемого объекта (хитбокс, светопроницаемость) и выпадают соответствующие дропы.
Ограничения
При выборе блоков для маскировки учитывайте схожесть характеристик. Например, руду лучше маскировать под камень или глубинный сланец, а растения — под маковые кусты.
Программисты могут использовать Revelation API для динамического изменения свойств блоков в зависимости от видимости. Например, цветок, замаскированный под воздух, получит пустой хитбокс до раскрытия.
Примеры использования data packs и API доступны в вики: https://github.com/DaFuqs/Revelationary/wiki
Регистрация через Data Pack
Файлы должны располагаться в папке resources/data/<<mod_id>>/revelations
{
"advancement": "spectrum:milestones/reveal_quitoxic_reeds",
"block_states": {
"minecraft:grass": "minecraft:beacon",
"minecraft:tall_grass": "minecraft:obsidian",
"minecraft:tall_grass[half=upper]": "minecraft:netherite_block"
},
"items": {
"minecraft:nether_star": "minecraft:gunpowder"
}
}
Пример реализации скрытого предмета
public class CloakedItem extends Item implements RevelationAware {
Identifier cloakAdvancementIdentifier;
Item cloakItem;
public CloakedItem(Settings settings, Identifier cloakAdvancementIdentifier, Item cloakItem) {
super(settings);
this.cloakAdvancementIdentifier = cloakAdvancementIdentifier;
this.cloakItem = cloakItem;
registerCloak();
}
@Override
public Identifier getCloakAdvancementIdentifier() {
return cloakAdvancementIdentifier;
}
@Override
public Hashtable<BlockState, BlockState> getBlockStateCloaks() {
return new Hashtable<>();
}
@Override
public Pair<Item, Item> getItemCloak() {
return new Pair<>(this, cloakItem);
}
@Override
public void onCloak() { }
@Override
public void onUncloak() { }
}
Коллбэки при раскрытии
RevelationHolder.registerRevelationCallback(new RevelationHolder.UncloakCallback() {
@Override
public void trigger(List<Identifier> advancements, List<Block> blocks, List<Item> items) {
for(Block block : blocks) {
if(Registry.BLOCK.getId(block).getNamespace().equals(MOD_ID)) {
...
// Пример: Показать уведомление
...
break;
}
}
}
});