Перейти к содержанию

GenkaMistikCoder

Пользователи
  • Постов

    11
  • Зарегистрирован

  • Посещение

Весь контент GenkaMistikCoder

  1. Добрый день уважаемые программисты и создатели модов, у меня тут случилась сложная проблема. Проще говоря мне надо с помощью зачарования изменить скорость лодки (и так чтоб она сохранилась при ломании лодки), и тут возникла одна противная штучка - майнкрафт даже обновляя nbt тега не дает мне изменить скорость, вот код - package com.genamistik.neoforgemods.mhutilites; import net.minecraft.core.component.DataComponents; import net.minecraft.world.entity.vehicle.Boat; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.enchantment.ItemEnchantments; import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.item.ItemEntity; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.neoforge.event.entity.EntityJoinLevelEvent; import net.neoforged.neoforge.event.entity.player.PlayerInteractEvent; import net.neoforged.neoforge.event.entity.player.AttackEntityEvent; import net.neoforged.neoforge.event.tick.EntityTickEvent; import java.util.HashMap; import java.util.Map; public class BoatEnchantmentHandler { private static ItemStack lastUsedBoat = ItemStack.EMPTY; private static final Map<Boat, Double> boatSpeedMultipliers = new HashMap<>(); @SubscribeEvent public void onItemUse(PlayerInteractEvent.RightClickItem event) { ItemStack stack = event.getItemStack(); if (isBoatItem(stack)) { lastUsedBoat = stack.copy(); } } @SubscribeEvent public void onBoatSpawn(EntityJoinLevelEvent event) { if (!(event.getEntity() instanceof Boat boat)) return; if (event.getLevel().isClientSide()) return; if (!boat.getPersistentData().contains("speedCounterManedgerRange")) { int enchantLevel = 0; if (!lastUsedBoat.isEmpty()) { var enchantments = lastUsedBoat.getOrDefault(DataComponents.ENCHANTMENTS, ItemEnchantments.EMPTY); var enchantmentRegistry = boat.level().registryAccess().registryOrThrow(Registries.ENCHANTMENT); var hydroboost = enchantmentRegistry.get(ResourceLocation.fromNamespaceAndPath("mhutilites", "hydroboost")); if (hydroboost != null) { enchantLevel = enchantments.getLevel(enchantmentRegistry.wrapAsHolder(hydroboost)); enchantLevel = Math.min(Math.max(enchantLevel, 0), 3); } lastUsedBoat = ItemStack.EMPTY; } boat.getPersistentData().putInt("speedCounterManedgerRange", enchantLevel); System.out.println("Boat spawned with speed level: " + enchantLevel); } } @SubscribeEvent public void onBoatTick(EntityTickEvent.Post event) { if (!(event.getEntity() instanceof Boat boat)) return; if (boat.level().isClientSide()) return; int speedLevel = boat.getPersistentData().getInt("speedCounterManedgerRange"); if (speedLevel > 0 && boat.isVehicle()) { var motion = boat.getDeltaMovement(); // Применяем ускорение к любому движению if (Math.abs(motion.x) > 0.001 || Math.abs(motion.z) > 0.001) { double multiplier = switch (speedLevel) { case 1 -> 2.0; case 2 -> 3.0; case 3 -> 5.0; default -> 1.0; }; boat.setDeltaMovement(motion.x * multiplier, motion.y, motion.z * multiplier); } } } @SubscribeEvent public void onBoatAttack(AttackEntityEvent event) { if (!(event.getTarget() instanceof Boat boat)) return; if (boat.level().isClientSide() || event.getEntity().isCreative()) return; int speedLevel = boat.getPersistentData().getInt("speedCounterManedgerRange"); if (speedLevel > 0) { event.setCanceled(true); ItemStack boatStack = new ItemStack(boat.getDropItem()); var enchantmentRegistry = boat.level().registryAccess().registryOrThrow(Registries.ENCHANTMENT); var hydroboost = enchantmentRegistry.get(ResourceLocation.fromNamespaceAndPath("mhutilites", "hydroboost")); if (hydroboost != null) { ItemEnchantments.Mutable enchantments = new ItemEnchantments.Mutable( boatStack.getOrDefault(DataComponents.ENCHANTMENTS, ItemEnchantments.EMPTY) ); enchantments.set(enchantmentRegistry.wrapAsHolder(hydroboost), speedLevel); boatStack.set(DataComponents.ENCHANTMENTS, enchantments.toImmutable()); ItemEntity itemEntity = new ItemEntity(boat.level(), boat.getX(), boat.getY(), boat.getZ(), boatStack); boat.level().addFreshEntity(itemEntity); } boat.discard(); boatSpeedMultipliers.remove(boat); } } public static double getSpeedMultiplier(Boat boat) { return boatSpeedMultipliers.getOrDefault(boat, 1.0); } private boolean isBoatItem(ItemStack stack) { return stack.getItem().toString().contains("boat"); } } И вот его mixin - package com.genamistik.neoforgemods.mhutilites.mixin; import net.minecraft.world.entity.vehicle.Boat; import org.spongepowered.asm.mixin.Mixin; @Mixin(Boat.class) public class BoatMixin { } Прошу помочь в ситуации, напишите в дс - gennadiishulkov
  2. Всем ку, не давно я научился обновлять ИИ мобов в моддинге. Какую идею предложите? Вот примеры - 1. Panic! - изменены ии мирных мобов (например - при ударе все животные в округе 4x4 блоков они убегали) 2. Mobes not are STUPED - изменяет ИИ враждебных мобов (например - агрятся на мирных мобов, в случаи что они горят они забивают ху(ай ай ай) на игрока и идет либо в тень, либо в воду и от туда их на игрока убивают, особенно скелет...) 3. Ваш вариант....
  3. Я в принципе могу участвовать в данном моде, но по времени я буду крайне сильно не успевать.
  4. Всем привет! Клиентские моды во многом отличаются от глобальных. Но чем? Основное различие заключается в том, что клиентские моды работают только на стороне игрока и не требуют установки на сервер. Они изменяют визуальную часть, добавляют удобства в управлении или предоставляют вспомогательные функции (например, мини-карты, моды на интерфейс или оптимизацию). В этом гайде мы разберём, как создать Forge-мод, который будет работать исключительно на клиенте. (на примере буду работать на MCreator) Откройте главный класс мода (у меня это "LemonadeMod"), после найдите инициализирующий класс, после напишите следующие - // в public (название класса без class) IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); // может быть другое название за место modEventBus modEventBus.addListener(this::setupClient); // создаем класс setupClient private void setupClient(final FMLClientSetupEvent event) { event.enqueueWork(() -> { if (FMLEnvironment.dist == Dist.CLIENT) { new LemonadeModClient(); // наш класс } }); } Создаем класс LemonadeModClient - package net.genamistik.lemonade; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.event.server.ServerStartingEvent; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.Dist; @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) public class LemonadeModClient { public LemonadeModClient() { } @SubscribeEvent public static void init(FMLCommonSetupEvent event) { new LemonadeModClient(); } @Mod.EventBusSubscriber private static class ForgeBusEvents { @SubscribeEvent public static void serverLoad(ServerStartingEvent event) { } @OnlyIn(Dist.CLIENT) @SubscribeEvent public static void clientLoad(FMLClientSetupEvent event) { } } } И все! Он стал клиентским модом! Для проверки зайдем с MCreator на сервер 217.106.107.100:27481. И вы увидите - Давайте проверим добавив кнопку (на главное меню/стоп экран) и при нажатии майнкрафт будет закрыт (класс TestKnopkaOverlay) - package net.genamistik.lemonade.client.screens; import net.minecraftforge.client.event.ScreenEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.api.distmarker.Dist; import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.Minecraft; import net.minecraft.network.chat.Component; import net.minecraft.client.gui.screens.TitleScreen; import net.minecraft.client.gui.screens.PauseScreen; @Mod.EventBusSubscriber(Dist.CLIENT) public class TestKnopkaOverlay { @SubscribeEvent public static void onScreenInit(ScreenEvent.Init event) { if (event.getScreen() instanceof TitleScreen || event.getScreen() instanceof PauseScreen) { int w = Minecraft.getInstance().getWindow().getGuiScaledWidth(); int h = Minecraft.getInstance().getWindow().getGuiScaledHeight(); // Координаты кнопки: w / 2 + -90, h / 2 + -4 int buttonX = w / 2 - 130; // X = центр экрана - 90 int buttonY = h / 2 - 8; // Y = центр экрана - 4 // Создаем кнопку с желтой "L" (или другим текстом) Button button = Button.builder( Component.literal("§eL"), // Желтая "L" btn -> Minecraft.getInstance().stop() ) .bounds( buttonX, // Позиция X buttonY, // Позиция Y 20, 20 // Размер кнопки (можно настроить) ) .build(); event.addListener(button); } } } (его не надо регистрировать) И на главном меню со стоп меню вы увидите кнопку "L" (желтый)\ Удачной разработки!
  5. тупую.... Короче моя идея такая -> ХП игрока это что не наесть и будет сложностью, короче челик который вошел в мир будет изначально 1 хп, будет ночь с хардкором где у него реверсивное управление и... Прицел после каждого действия меняет положение/количество. Также у игрока будет изначально все дебафы и моя любимая эпилепсия (экран инвертируется). И мобов дофиГА, а здоровье не регенерирует от голода. Остановить весь этот пиз... хаос можно если у игрока будет фул здоровье, но эпилепсия останется.
  6. Остроотточенный - (накладывается на все виды оружия) с шансом 10-30% меч наносит крит игнорируя защиту (чары на броне, щит, бафы зелий, сторонние средства защиты), шанс зависит от уровня
  7. Привет! Каждый мод креатор хотя бы раз задумывался: «Как сделать зачарование?» Да, на эту тему есть множество гайдов, но мне они показались слишком водными. Сегодня я покажу, как создать зачарование на конкретном примере. Начало Создадим проект (пакеты и классы), на примере я покажу свой мод "More enchantments". Настроем проект - moreenchantments - ---init ------MoreEnchantmentsModEnchantments.java <- Главный класс для создание зачарований ---enchantment ------ExampleEnchantment.java <- Зачарование ---procedure ------ExampleEnchantmentProcedure.java <- Работа зачарования ---MoreEnchantmentsMod.java <- главный класс Создав это все давайте зарегистрируем MoreEnchantmentsModEnchantments.java в главном классе - import com.example.moreenchantments.init.MoreEnchantmentsModEnchantments; // Наш MoreEnchantmentsModEnchantments файл // В методе MoreEnchantmentsMod мы добавим эту строчку MoreEnchantmentsModEnchantments.REGISTRY.register(bus); // Или другоеназвание файла И в файле MoreEnchantmentsModEnchantments напишем это - package com.example.moreenchantments.init; import net.minecraftforge.registries.RegistryObject; import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.DeferredRegister; import net.minecraft.world.item.enchantment.Enchantment; import com.example.moreenchantments.MoreEnchantmentsMod; public class MoreEnchantmentsModEnchantments { public static final DeferredRegister<Enchantment> REGISTRY = DeferredRegister.create(ForgeRegistries.ENCHANTMENTS, MoreEnchantmentsMod.MODID); // Тут будут все зачарования } В файле ExampleEnchantment.java мы создадим такой код (в комментариях будет написано что за что отвечает) - package com.example.moreenchantments.enchantment; import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.item.enchantment.EnchantmentCategory; import net.minecraft.world.item.enchantment.Enchantment; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.Items; import net.minecraft.world.item.ItemStack; import net.minecraft.world.entity.EquipmentSlot; import java.util.List; public class ExampleEnchantmentEnchantment extends Enchantment { public ExampleEnchantmentEnchantment(EquipmentSlot... slots) { super(Enchantment.Rarity.COMMON, EnchantmentCategory.BREAKABLE, slots); // редкость - Enchantment.Rarity, категория - EnchantmentCategory (например BREAKABLE) } @Override public int getMaxLevel() { return 2; // Максимальное кол-во уровней зачарования } @Override protected boolean checkCompatibility(Enchantment ench) { return List.of(Enchantments.ALL_DAMAGE_PROTECTION).contains(ench); // Допустимые комбинации зачарования } @Override public boolean canApplyAtEnchantingTable(ItemStack itemstack) { return Ingredient.of(new ItemStack(Items.WOODEN_PICKAXE)).test(itemstack); // На что может распростронятся } @Override public boolean isTreasureOnly() { return true; // зачарование сокровище (true/false) } @Override public boolean isCurse() { return true; // зачарование проклятье (true/false) } @Override public boolean isAllowedOnBooks() { return false; // может быть в книгах (true/false) } @Override public boolean isDiscoverable() { return false; // зачарование можнет появится в качестве лута? (true/false) } @Override public boolean isTradeable() { return false; // зачарование можно купить у жителей (true/false) } } Зарегистрируем его в MoreEnchantmentsModEnchantments - import com.example.moreenchantments.enchantment.ExampleEnchantmentEnchantment; // Добавим в класс public static final RegistryObject<Enchantment> EXAMPLE_ENCHANTMENT = REGISTRY.register("example_enchantment", () -> new ExampleEnchantmentEnchantment()); Но сейчас он является пустышкой, но давайте мы добавим функционал - с шансом 20-50% кирка выпадет из инвентаря - package com.example.moreenchantments.procedures; import net.minecraft.world.item.ItemStack; import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.util.RandomSource; import net.minecraftforge.event.level.BlockEvent; import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.Event; import net.minecraftforge.fml.common.Mod; import javax.annotation.Nullable; import com.example.moreenchantments.init.MoreEnchantmentsModEnchantments; @Mod.EventBusSubscriber public class CurseOfTheSlipperyHandleProcedureProcedure { private static final float BASE_DROP_CHANCE = 0.2f; // 20% базовый шанс private static final float CHANCE_PER_LEVEL = 0.1f; // +10% за каждый уровень @SubscribeEvent public static void onBlockBreak(BlockEvent.BreakEvent event) { execute(event, event.getPlayer()); } @SubscribeEvent public static void onItemUse(PlayerInteractEvent.RightClickItem event) { execute(event, event.getEntity()); } @SubscribeEvent public static void onBlockInteract(PlayerInteractEvent.RightClickBlock event) { execute(event, event.getEntity()); } public static void execute() { execute(null, null); } private static void execute(@Nullable Event event, @Nullable Player player) { if (player == null || player.level().isClientSide()) return; ItemStack mainHandItem = player.getItemBySlot(EquipmentSlot.MAINHAND); if (mainHandItem.isEmpty()) return; int enchantmentLevel = EnchantmentHelper.getItemEnchantmentLevel( MoreEnchantmentsModEnchantments.EXAMPLE_ENCHANTMENT.get(), mainHandItem ); if (enchantmentLevel <= 0) return; RandomSource random = player.getRandom(); float dropChance = BASE_DROP_CHANCE + (CHANCE_PER_LEVEL * (enchantmentLevel - 1)); if (random.nextFloat() < dropChance) { // Выбрасываем предмет из руки игрока player.drop(mainHandItem, false, true); player.setItemSlot(EquipmentSlot.MAINHAND, ItemStack.EMPTY); // Отменяем событие, если оно было передано if (event != null && event.isCancelable()) { event.setCanceled(true); } } } } Если вы хотите другой функционал то просто залейте в нейронку, но у неё обычно не всегда получается это сделать (2-3 попытки). Удачной разработки!🙃
  8. РЕбЯТА я забыл написать что - Создайте файл src/main/resources/plugin.yml с метаданными плагина!!! Извиняюсь что пишу это в коментариях
  9. Как создать плагин для серверов PaperMC (Minecraft) ? Сейчас вам расскажу. Что вам надо скачать - Java Jdk 17 Любой редактор кода (даже блокнот) Знание java Server paperMC 1.20.4 Давайте начнем. Зайдите в Intel IDEA и создайте новый проект - Gradle, kotlin. Подождите когда он скачается (Или забилдится). Если в "молотке" будет написано "Bild successful" то поставьте этот код в файл gradle (он открыт по умолчанию) - plugins { id("java") id("com.github.johnrengelman.shadow") version "8.1.1" } group = "org.genamistik" version = "1.0" repositories { mavenCentral() maven { url = uri("https://repo.papermc.io/repository/maven-public/") } } dependencies { compileOnly("io.papermc.paper:paper-api:1.20.4-R0.1-SNAPSHOT") testImplementation(platform("org.junit:junit-bom:5.10.0")) testImplementation("org.junit.jupiter:junit-jupiter") } tasks.named<Test>("test") { useJUnitPlatform() } tasks.named<com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar>("shadowJar") { archiveFileName.set("nameJar-${version}.jar") } tasks.named("build") { dependsOn(tasks.named("shadowJar")) } ВАЖНО - измените группу на вашу, в место "nameJar" название вашего выходного файла. Что ж, напишем первый код на java - package com.example; // Ваш пакет import org.bukkit.plugin.java.JavaPlugin; public class Main extends JavaPlugin { @Override public void onEnable() { getLogger().info("Плагин успешно запущен!"); // Здесь инициализация вашего плагина } @Override public void onDisable() { getLogger().info("Плагин выключен"); } } Что он делает? При запуске сервера от имени файла будет в логах писаться "[PluginName] Плагин успешно запущен". PS - возможны проблемы с кодировкой! Но нам нужно файл yml "plugin.yml" - name: YourPluginName version: 1.0 main: com.example.Main api-version: 1.20 description: Описание вашего плагина author: Ваше имя После, плагин должен работать. Чтоб собрать плагин нужно написать в командную строку команды - ./gradlew build - соберет плагин и создаст shadow JAR ./gradlew shadowJar - только создаст fat JAR с зависимостями Собранный плагин будет находиться в build/libs/вашJarФайл-1.0.jar Как создать команду? для этого мы создадим команду /test В наш главный класс напишем следующие - @Override public void onEnable() { getCommand("test").setExecutor((sender, command, label, args) -> { if (sender instanceof Player) { Player player = (Player) sender; player.sendMessage("Тестовая команда работает!"); return true; } return false; }); } PS - возможны проблемы с кодировкой! После нам нужно добавить в plugin.xml commands: test: description: Тестовая команда usage: /test Пример слушателя событий Добавим в наш класс (не в onEnable!) событие при котором если игрок зайдет в мир то ему выведет сообщение Добро пожаловать {ник игрока}! - @EventHandler public void onPlayerJoin(PlayerJoinEvent event) { // PlayerJoinEvent - Зашел ли игрок event.setJoinMessage("Добро пожаловать, " + event.getPlayer().getName() + "!"); // вывод в чат } После зарегистрируйте его в onEnable() getServer().getPluginManager().registerEvents(this, this); После этого забилдите проект. Как мне проверить работу плагина? Для начало скачайте версию PaperMC 1.20.4 После напишите в командной строке - java -jar paper-1.20.4.jar У вас в папке появится файл elua.txt, поставьте true за место false и напишите заново команду После откройте файл server.properties и найдите online-mode и замените true -> false. Поместите сой плагин в папку plugins После напишите команду - "C:\Program Files\Java\jdk-17\bin\java.exe" -Xmx2G -jar paper-1.20.4-499.jar --nogui Если в логах будет написано - "[PluginName] Плагин успешно запущен" то у вас он успешно запустился После зайдите в майнкрафт 1.20.4 и создайте сервер с доменом - localhost:25565 И у вас все должно работать. Удачной разработки плагинов!
  10. Привет! Недавно я работал над модом для Create, где необходимо знание основ JSON. Хотя я знаком с этим языком, я столкнулся с трудностями при создании сложного крафта. Проблема в том, что на сайте с гайдами по созданию крафтов в Create нет информации о последовательном крафте. Это затрудняет разработку аддонов. Давайте разберёмся, как это сделать! Проект. Для примера возьмём дата-пак. Знание крафтов. Терпение и мощный компьютер (или калькулятор). Приступим! sequenced_assembly - Это и будет последовательным крафтом, как пример с крафтами Пример (верстак) - /* Пример крафтов в верстаке */ { "type": "minecraft:crafting_shaped", "category": "misc", "pattern": [ " a ", "aba", // тут указываем патерн " a " ], "key": { "a": { "item": "minecraft:diamond" // предмет под переменной a }, "b": { "item": "minecraft:netherite_inog" // предмет под переменной b } }, "result": { "item": "minecraft:dirt", // выходной предмет "count": 1 // кол-во предметов } } Его можно сохранить как угодно, например neponil.json или okey.json. Важно! Каждый такой json файл должен быть не абы-где а в папках, вот пример - datapack_name/ └── data/ ├── название_датапака/ │ └── recipes/ │ └── sequenced_assembly/ ← Сюда кладём JSON-рецепты └── minecraft/ └── tags/items/ ← Если нужны теги/прочее Ладно, хватит о том как нужно называть файлы и так далее, начнем же создавать рецепт на примере алмаз а выход незерит - { "type": "create:sequenced_assembly", "ingredient": { "item": "minecraft:diamond" // Что загружаем в механизм }, "transitionalItem": { "item": "create:incomplete_precision_mechanism" // Временный предмет }, "sequence": [ // Этапы обработки { "type": "create:deploying", // Накладываем незерак "ingredients": [ {"item": "create:incomplete_precision_mechanism"}, {"item": "minecraft:netherrack"} ] }, { "type": "create:pressing", // Прессуем "ingredients": [ {"item": "create:incomplete_precision_mechanism"} ] }, { "type": "create:spout_filling", // Заливаем лавой "ingredients": [ {"item": "create:incomplete_precision_mechanism"} ], "fluid": { "fluid": "minecraft:lava", "amount": 250 } } ], "results": [ // Что получаем в конце { "item": "minecraft:netherite_ingot", // Успех (50%) "chance": 50.0 }, { "item": "minecraft:netherrack", // Мусор (50%) "chance": 50.0 } ], "loops": 4 // Сколько раз повторяем sequence } Вот такие операторы - deploying Накладывает предмет (как в верстаке) Добавление незерака, слитков и т.д. pressing Прессует предмет Уплотнение, изменение формы spout_filling Заливает жидкость (лава, вода) Нагрев, охлаждение cutting Разрезает (нужна пила) Разделение на части filling Заполнение вручную (без дозатора) Редко используется ________________________________________________ Ну ладно, хватит с примеров, сейчас я покажу мой код (для мазохиста) в нем будет использоваться мой мод (пока он не вышел) - { "type": "create:sequenced_assembly", "ingredient": { "item": "createhelltoandezite:theunrelatedstickofhell" }, "loops": 6, "results": [ { "chance": 65.0, "item": "createhelltoandezite:theboundstickofhell" }, { "chance": 35.0, "item": "minecraft:netherrack" } ], "sequence": [ { "type": "create:deploying", "ingredients": [ { "item": "create:incomplete_precision_mechanism" }, { "item": "minecraft:netherrack" } ], "results": [ { "item": "create:incomplete_precision_mechanism" } ] }, { "type": "create:pressing", "ingredients": [ { "item": "create:incomplete_precision_mechanism" }, { "fluid": "minecraft:lava", "amount": 200 } ], "results": [ { "item": "create:incomplete_precision_mechanism" } ] }, { "type": "create:filling", "ingredients": [ { "item": "create:unprocessed_obsidian_sheet" }, { "amount": 500, "fluid": "minecraft:lava", "nbt": {} } ], "results": [ { "item": "create:unprocessed_obsidian_sheet" } ] }, { "type": "create:pressing", "ingredients": [ { "item": "create:incomplete_precision_mechanism" } ], "results": [ { "item": "create:incomplete_precision_mechanism" } ] }, { "type": "create:deploying", "ingredients": [ { "item": "create:incomplete_precision_mechanism" }, { "item": "create:experience_block" } ], "results": [ { "item": "create:incomplete_precision_mechanism" } ] }, { "type": "create:deploying", "ingredients": [ { "item": "create:incomplete_precision_mechanism" }, { "item": "minecraft:netherite_ingot" } ], "results": [ { "item": "create:incomplete_precision_mechanism" } ] }, { "type": "create:pressing", "ingredients": [ { "item": "create:incomplete_precision_mechanism" } ], "results": [ { "item": "create:incomplete_precision_mechanism" } ] }, { "type": "create:deploying", "ingredients": [ { "item": "create:incomplete_precision_mechanism" }, { "item": "minecraft:blaze_rod" } ], "results": [ { "item": "create:incomplete_precision_mechanism" } ] } ], "transitionalItem": { "item": "create:incomplete_precision_mechanism" } } Вот так будет выглядеть в моде Jei - Надеюсь вы что-то поняли)
×
×
  • Создать...