Скрыть контент игры

Версия Minecraft
1.12.2
API
Forge
Мне необходимо предотвратить спаун некоторых мобов, например: зомби, криперы, скелеты, пауки, а также убрать рецепты некоторых предметов, кирки, лопаты и все остальное. Реализовать нужно все это модом.

Я читал, что нужно использовать EntityJoinWorldEvent (документация Forge) для замены сущности, но я не знаю, как использовать его для отключение сущностей.

Кроме этого, мне нужен способ удалить/заменить предметы.

И, наконец, нужен способ для отключение генерации строений.
 
Начнем с того, что EntityJoinWorldEvent можно отменить, что предотвратит появление сущности.

Чтобы "отключить" предмет, ты можешь:
  1. Скрыть его в творческом меню ( Item#setCreativeTab(null) ).
  2. Отключить все рецепты, которые производят этот предмет, ForgeRegistries.RECIPES - это IForgeRegistryModifiable, что означает, что можно удалить из него эти рецепты.
  3. Отключить все рецепты печи, производящие этот предмет, удалить их из FurnaceRecipes#getSmeltingList.
*Однако проблема заключается в том, что механизмы (блоки) из других модификаций могут по-прежнему производить этот предмет другими способами.

Для отключения структур, ты можешь использовать InitMapGenEvent, чтобы переопределить их генератор генератором без операций (то есть таким, который ничего не будет генерировать).
 
И так, мне нужно отключить предметы:
Скрыть его в творческом меню ( Item#setCreativeTab(null) ).
Код должен выглядить так item.setCreativeTab(null), но мне интересно, как можно скрыть определенные предметы? Можно ли на них сослаться оператором get? Я хотел бы использовать оператор if, по типу того, который используется в моем событии, "onEntityJoin".
Java:
public void hideCreatveItem(String item) {
    if (item.getItem() instanceof /*предмет*/ ) {
      
    }
    item.setCreativeTab(null);
}
 
Последнее редактирование:
Кода много, вот как я сделал:

Java:
public class hideUniversal {
  /*
   Отмена появления сущностей.
  */
     //Dragon
     @SubscribeEvent
     public void onEntityJoin(EntityJoinWorldEvent event) {
          if (event.getEntity() instanceof EntityDragon) {
          }
                event.setCanceled(true);
     }
    
     //Pig
     @SubscribeEvent
     public void onEntityJoin(EntityJoinWorldEvent event) {
          if (event.getEntity() instanceof EntityPig) {
          }
                event.setCanceled(true);
     }

     //Villager
     @SubscribeEvent
     public void onEntityJoin(EntityJoinWorldEvent event) {
          if (event.getEntity() instanceof EntityVillager) {
          }
                event.setCanceled(true);
     }

     //Horse
     @SubscribeEvent
     public void onEntityJoin(EntityJoinWorldEvent event) {
          if (event.getEntity() instanceof EntityHorse) {
          }
                event.setCanceled(true);
     }

     //Llama
     @SubscribeEvent
     public void onEntityJoin(EntityJoinWorldEvent event) {
          if (event.getEntity() instanceof EntityLlama) {
          }
                event.setCanceled(true);
     }

     //Wolf
     @SubscribeEvent
     public void onEntityJoin(EntityJoinWorldEvent event) {
          if (event.getEntity() instanceof EntityWolf) {
          }
                event.setCanceled(true);
     }

  /*
   Скрытие предметов/блоков в креативной вкладке.
  */
     @EventHandler
     public void hideFromCreative(FMLPostInitializationEvent event) {
          
/*/Мечи/*/ {
          Item.IRON_SWORD.setCreativeTab(null);
          Item.WOODEN_SWORD.setCreativeTab(null);
          Item.STONE_SWORD.setCreativeTab(null);
          Item.DIAMOND_SWORD.setCreativeTab(null);
          Item.GOLDEN_SWORD.setCreativeTab(null);
          }
/*/Топоры/*/ {
          Item.IRON_AXE.setCreativeTab(null);
          Item.WOODEN_AXE.setCreativeTab(null);
          Item.STONE_AXE.setCreativeTab(null);
          Item.DIAMOND_AXE.setCreativeTab(null);
          Item.GOLDEN_AXE.setCreativeTab(null);
          }
/*/Кирки/*/ {
          Item.IRON_PICKAXE.setCreativeTab(null);
          Item.WOODEN_PICKAXE.setCreativeTab(null);
          Item.STONE_PICKAXE.setCreativeTab(null);
          Item.DIAMOND_PICKAXE.setCreativeTab(null);
          Item.GOLDEN_PICKAXE.setCreativeTab(null);
          }
/*/Мотыги/*/ {
          Item.IRON_HOE.setCreativeTab(null);
          Item.WOODEN_HOE.setCreativeTab(null);
          Item.STONE_HOE.setCreativeTab(null);
          Item.DIAMOND_HOE.setCreativeTab(null);
          Item.GOLDEN_HOE.setCreativeTab(null);
          }
/*/Лопаты/*/ {
          Item.IRON_SHOVEL.setCreativeTab(null);
          Item.WOODEN_SHOVEL.setCreativeTab(null);
          Item.STONE_SHOVEL.setCreativeTab(null);
          Item.DIAMOND_SHOVEL.setCreativeTab(null);
          Item.GOLDEN_SHOVEL.setCreativeTab(null);
          }

/*/Слитки/*/ {
          Item.IRON_INGOT.setCreativeTab(null);
          Item.GOLD_INGOT.setCreativeTab(null);
          Item.EMERALD.setCreativeTab(null);
          Item.DIAMOND.setCreativeTab(null);
          Item.COAL.setCreativeTab(null);
          Item.QUARTZ.setCreativeTab(null);
          
          }

/*/Предметы и блоки/*/ {
          Block.STONE_SLAB.setCreativeTab(null);
          Block.DOUBLE_STONE_SLAB.setCreativeTab(null);
          Block.BRICK_BLOCK.setCreativeTab(null);
          Block.TNT.setCreativeTab(null);
          Block.BOOKSHELF.setCreativeTab(null);
          Block.MOB_SPAWNER.setCreativeTab(null);
          Block.CHEST.setCreativeTab(null);
          Block.DIAMOND_BLOCK.setCreativeTab(null);
          Item.CHAINMAIL_BOOTS.setCreativeTab(null);
          Item.WOODEN_DOOR.setCreativeTab(null);
          Item.BUCKET.setCreativeTab(null);
          Item.WATER_BUCKET.setCreativeTab(null);
          Item.BOAT.setCreativeTab(null);
          Item.LEATHER.setCreativeTab(null);
          Item.MILK_BUCKET.setCreativeTab(null);
          Item.BRICK.setCreativeTab(null);
          Item.CLAY_BALL.setCreativeTab(null);
          Item.PAPER.setCreativeTab(null);
          Item.BOOK.setCreativeTab(null);
          Item.SLIME_BALL.setCreativeTab(null);
          Item.CHEST_MINECART.setCreativeTab(null);
          Item.GOLD_NUGGET.setCreativeTab(null);
          Item.RECORD_13.setCreativeTab(null);
          Item.RECORD_CAT.setCreativeTab(null);
          Item.RECORD_BLOCKS.setCreativeTab(null);
          Item.RECORD_CHIRP.setCreativeTab(null);
          Item.RECORD_FAR.setCreativeTab(null);
          Item.RECORD_MALL.setCreativeTab(null);
          Item.RECORD_MELLOHI.setCreativeTab(null);
          Item.RECORD_STAL.setCreativeTab(null);
          Item.RECORD_STRAD.setCreativeTab(null);
          Item.RECORD_WARD.setCreativeTab(null);
          Item.RECORD_11.setCreativeTab(null);
          Item.WAIT.setCreativeTab(null);
          }

     }

     public void blockStructures(InitMapGenEvent event) {
     // Отмена генерации строений.
               event.setCanceled(true);
          }

}
 
Этот код даже компилироваться не будет. У тебя есть несколько методов с одинаковыми именами и сигнатурами. Кроме того, что это за тонны нелепых методов onEntityJoin? Почему бы не иметь только один? И еще, почему они все безоговорочно отменяют ивенты? Это предотвратит присоединение всех сущностей.

@EventHandler работает только внутри твоего класса @Mod. Класс Item также не имеет этих полей (IRON_SWORD и т.д.). Константы Item расположены в классе Items.
 
Не понял. Все мтоды onEntityJoin предназначены для удаления одного моба, и я думал, что оператор if сделает именно это, так что не понимаю что значит
почему они все безоговорочно отменяют ивенты?
Мне нужен способ удаления множества предметов. Где я могу найти список всех констант класса Items.class?
 
SampleCode:
@SubscribeEvent
public void onEntityJoin(EntityJoinWorldEvent event) {
    if (event.getEntity() instanceof EntityDragon) {
        //это выполняется, если оператор if возвращает true
    }
        //теперь мы закончили с оператором if.
        event.setCanceled(true);
    }
Смотри комментарии. Теперь иди учи Java.
 
1,074
72
372
Продемонстрируй пример, мне нужно сделать это модом.
Вариантов достаточно. Мод/не-мод - без разницы.
  • Убрать мобов в параметрах биома (относится в основном к животным)
  • Отключить спавн монстров с помощью рефлексии или ещё как (не вдавался в подробности его работы)
  • В конце-концов с помощью ASM/миксинов можно вытворять с кодом игры всё что захочешь.
 
Вообщем вот код:

Java:
@SubscribeEvent
public void removeRecipes(RegistryEvent.Register<IRecipe> event) {
    for(IRecipe recipe : ForgeRegistries.RECIPIES) {
          if(recipe.getCreatorModId(new ResourceLocation(recipe)).equals("minecraft")) {
             modRegistry.remove(recipe);
          }
    }
 }
Если я сделаю переменную для рецепта, она будет работать для всех из них, чтобы он применялся только к предметам в ванильном Minecraft, а не к предметам, рецептам. Оба являються частью ForgeRegisters, то его можно применить одинакого к обоим.
Я новый в моддинге, и я только использую базовые знания./
 
Это не работает, не знаю почему:
Java:
@SubscribeEvent
public void removeRecipes(FMLPostInitializationEvent event) {
    for(IRecipe recipe : ForgeRegistries.RECIPIES && Item item : ForgeRegistries.ITEMS) {
          if(recipe.getCraftingResult(new ResourceLocation(item)).equals("minecraft")) {
               IForgeRegistryModifiable.remove(recipe);
                    
               }
          }
     }
Я не понимаю, почему это не работает. Раньше я не помещал && Item item : ForgeRegistries.ITEMS, но теперь, когда он у меня есть, ResourceLocation может работать правильно, используя метод getCraftingResult для получения предмета, а затем соединяя его с ForgeRegisters, но вроде работает...
Что это могло быть?
 
Сверху