Привет всем! В прошлый раз мы добавили свою руду (по сути еще один обычный блок), а так же варианты дропа для неё и даже пару рецептов. Но какая радость от руды, которую нельзя найти в игровом мире? Никакой. Поэтому сегодня мы добавим хук для события генерации мира, в котором пропишем генерацию нашей руды.
Погнали!
Java часть
И вообще-то единственная часть этого урока, так как для генерации чего-либо в мире нам json не нужен (пока так, кто знает, что будет потом).
Для начала создадим файл для прослушивания игровых событий. Тут мы пропишем свои особенности для генерации биомов. Особенности биома — всё, что в нём есть. Пещеры, озёра, трава, цветы, деревья, пещеры, руды, другие виды камня и т.д. Тут мы сможем добавить свои деревья, структуры и многое другое. И сейчас мы о рудах, так что не отвлекаемся.
Я назову файл ModEventGenSubscriber.java, вы можете выбрать другое имя. И пишем в теле класса такую функцию:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public static int veinSize = 20; public static int veinCount = 15; public static int heightMin = 0; public static int heightBase = 0; public static int heightMax = 120; @SubscribeEvent public static void onInitBiomesGen(FMLCommonSetupEvent event) { for (Biome biome : ForgeRegistries.BIOMES) { biome.addFeature( GenerationStage.Decoration.UNDERGROUND_ORES, Feature.ORE.withConfiguration(new OreFeatureConfig(OreFeatureConfig.FillerBlockType.NATURAL_STONE, ModBlocks.SUN_ORE.getDefaultState(), veinSize)).func_227228_a_(Placement.COUNT_RANGE.func_227446_a_(new CountRangeConfig(veinCount, heightMin, heightBase, heightMax))) ); } } |
Выглядит… страшновато…
Заранее хочу предупредить, что имена вроде func_227228_a_ у меня оказались, так как при декомпиляции игры не были заданы имена для деобфускации. Если простым языком, то скомпилированный код игры не сохраняет изначальные имена функций и классов, поэтому есть специальная таблица, по которой тяжело читаемый код преобразовывается в более понятный. Но в ней иногда нет некоторых новых функций, со временем их добавят, ну, а пока пишем так.
Если вы читаете этот урок немного или намного позже, то скорее всего эта функция может иметь другое имя. Так что смотрите по параметрам функции.
Подробнее о коде
Мы регистрируем событие, которое будет выполнено при загрузке мода и дополнит все биомы нашей рудой. Все они потом, что в цикле foreach мы перебираем все биомы, которые зарегистрированы в игре (в том числе биомы из модов). Беря каждый отдельный биом мы добавляем туда особенность (фичу addFeature), и указываем её параметры. Первый, это тип особенности, а именно подземная руда. Второй параметр это сама особенность (ORE — руда) с заданными параметрами (withConfiguration) и конфигурацией расположения.
Конфигурация руды включает заменяемый блок (OreFeatureConfig.FillerBlockType.NATURAL_STONE — любой камень), сам блок (вернее его BlockState: ModBlocks.SUN_ORE.getDefaultState()) и veinSize — целое число, определяющее размер жилы. Для примера: у угля это значение равно 17, у алмаза 8, а у лазурита 7.
Конфигурация расположения принимает четыре значения: veinCount — количество жил руды в одном чанке, heightMin — нижнее смещение (минимальная высота), heightTop — верхнее смещение, heightMax — максимальная высота. Пример из игры: алмаз — 1, 0, 0, 16; уголь — 20, 0, 0, 128. Для своей руды подбирайте сами. Чем круче руда — тем она ниже и реже. Как-то так…
Пояснил из серии он понимает, просто сказать не может 😀
Ладно. И еще один момент. Нужно указать игре, что у нас есть такой слушатель событий. Для этого в конструктор файла мода дописываем такую строку:
1 |
FMLJavaModLoadingContext.<em>get</em>().getModEventBus().addListener(ModEventGenSubscriber::<em>onInitBiomesGen</em>); |
Точно такую же мы вызывали для добавления прозрачной текстуры стеклу.
И это всё! Теперь скорее бежим тестировать!!
Результаты
На этом вроде всё, надеюсь ничего не забыл. Спасибо за внимание! Удачи в моддинге!
Пингбэк: Создание модов для Minecraft 1.15 – GeekStand