diff --git a/src/main/java/com/technovision/tutorial/Tutorial.java b/src/main/java/com/technovision/tutorial/Tutorial.java index 0cc774b..74c5200 100644 --- a/src/main/java/com/technovision/tutorial/Tutorial.java +++ b/src/main/java/com/technovision/tutorial/Tutorial.java @@ -4,10 +4,15 @@ import com.technovision.tutorial.entities.HogEntity; import com.technovision.tutorial.init.ModBlocks; import com.technovision.tutorial.init.ModEntityType; import com.technovision.tutorial.init.ModItems; +import com.technovision.tutorial.items.ModSpawnEgg; +import net.minecraft.entity.EntityType; import net.minecraft.entity.ai.attributes.GlobalEntityTypeAttributes; import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemStack; +import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.DeferredWorkQueue; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; @@ -17,6 +22,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @Mod("tutorial") +@Mod.EventBusSubscriber(modid = Tutorial.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD, value = Dist.CLIENT) public class Tutorial { public static final Logger LOGGER = LogManager.getLogger(); @@ -49,4 +55,9 @@ public class Tutorial { } }; + @SubscribeEvent + public static void onRegisterEntities(final RegistryEvent.Register> event) { + ModSpawnEgg.initSpawnEggs(); + } + } diff --git a/src/main/java/com/technovision/tutorial/init/ModItems.java b/src/main/java/com/technovision/tutorial/init/ModItems.java index e6e0223..75bb47b 100644 --- a/src/main/java/com/technovision/tutorial/init/ModItems.java +++ b/src/main/java/com/technovision/tutorial/init/ModItems.java @@ -1,6 +1,7 @@ package com.technovision.tutorial.init; import com.technovision.tutorial.Tutorial; +import com.technovision.tutorial.items.ModSpawnEgg; import com.technovision.tutorial.items.PoisonApple; import com.technovision.tutorial.util.enums.ModArmorMaterial; import com.technovision.tutorial.util.enums.ModItemTier; @@ -16,8 +17,12 @@ public class ModItems { // Items public static final RegistryObject RUBY = ITEMS.register("ruby", () -> new Item(new Item.Properties().group(Tutorial.TAB))); + public static final RegistryObject POISON_APPLE = ITEMS.register("poison_apple", PoisonApple::new); + public static final RegistryObject HOG_SPAWN_EGG = ITEMS.register("hog_spawn_egg", + () -> new ModSpawnEgg(ModEntityType.HOG, 0xE1A68B, 0x99593B, new Item.Properties().group(Tutorial.TAB))); + // Block Items public static final RegistryObject RUBY_BLOCK_ITEM = ITEMS.register("ruby_block", () -> new BlockItem(ModBlocks.RUBY_BLOCK.get(), new Item.Properties().group(Tutorial.TAB))); diff --git a/src/main/java/com/technovision/tutorial/items/ModSpawnEgg.java b/src/main/java/com/technovision/tutorial/items/ModSpawnEgg.java new file mode 100644 index 0000000..8a0f407 --- /dev/null +++ b/src/main/java/com/technovision/tutorial/items/ModSpawnEgg.java @@ -0,0 +1,64 @@ +package com.technovision.tutorial.items; + +import net.minecraft.block.DispenserBlock; +import net.minecraft.dispenser.DefaultDispenseItemBehavior; +import net.minecraft.dispenser.IBlockSource; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.SpawnReason; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.SpawnEggItem; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.util.Direction; +import net.minecraftforge.common.util.Lazy; +import net.minecraftforge.common.util.NonNullSupplier; +import net.minecraftforge.fml.RegistryObject; +import net.minecraftforge.fml.common.ObfuscationReflectionHelper; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class ModSpawnEgg extends SpawnEggItem { + + protected static final List UNADDED_EGGS = new ArrayList(); + private final Lazy> entityTypeSupplier; + + public ModSpawnEgg(final NonNullSupplier> entityTypeSupplier, final int primaryColour, final int secondaryColour, final Item.Properties properties) { + super(null, primaryColour, secondaryColour, properties); + this.entityTypeSupplier = Lazy.of(entityTypeSupplier::get); + UNADDED_EGGS.add(this); + } + + public ModSpawnEgg(final RegistryObject> entityTypeSupplier, final int primaryColour, final int secondaryColour, final Item.Properties properties) { + super(null, primaryColour, secondaryColour, properties); + this.entityTypeSupplier = Lazy.of(entityTypeSupplier::get); + UNADDED_EGGS.add(this); + } + + public static void initSpawnEggs() { + final Map, SpawnEggItem> EGGS = ObfuscationReflectionHelper.getPrivateValue(SpawnEggItem.class, null, "field_195987_b"); + DefaultDispenseItemBehavior dispenseBehaviour = new DefaultDispenseItemBehavior() { + @Override + protected ItemStack dispenseStack(IBlockSource source, ItemStack stack) { + Direction direction = source.getBlockState().get(DispenserBlock.FACING); + EntityType type = ((SpawnEggItem) stack.getItem()).getType(stack.getTag()); + type.spawn(source.getWorld(), stack, null, source.getBlockPos().offset(direction), + SpawnReason.DISPENSER, direction != Direction.UP, false); + stack.shrink(1); + return stack; + } + }; + + for (final SpawnEggItem spawnEgg : UNADDED_EGGS) { + EGGS.put(spawnEgg.getType(null), spawnEgg); + DispenserBlock.registerDispenseBehavior(spawnEgg, dispenseBehaviour); + } + UNADDED_EGGS.clear(); + } + + @Override + public EntityType getType(CompoundNBT nbt) { + return this.entityTypeSupplier.get(); + } +} diff --git a/src/main/resources/assets/tutorial/lang/en_us.json b/src/main/resources/assets/tutorial/lang/en_us.json index 40f3014..0a568d4 100644 --- a/src/main/resources/assets/tutorial/lang/en_us.json +++ b/src/main/resources/assets/tutorial/lang/en_us.json @@ -14,5 +14,6 @@ "item.tutorial.ruby_chestplate": "Ruby Chestplate", "item.tutorial.ruby_leggings": "Ruby Leggings", "item.tutorial.ruby_boots": "Ruby Boots", + "item.tutorial.hog_spawn_egg": "Hog Spawn Egg", "entity.tutorial.hog": "Hog" } \ No newline at end of file diff --git a/src/main/resources/assets/tutorial/models/item/hog_spawn_egg.json b/src/main/resources/assets/tutorial/models/item/hog_spawn_egg.json new file mode 100644 index 0000000..7a2c6da --- /dev/null +++ b/src/main/resources/assets/tutorial/models/item/hog_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "item/template_spawn_egg" +} \ No newline at end of file