diff --git a/patches/minecraft/net/minecraft/block/BlockPortal.java.patch b/patches/minecraft/net/minecraft/block/BlockPortal.java.patch new file mode 100644 index 000000000..308ac85c4 --- /dev/null +++ b/patches/minecraft/net/minecraft/block/BlockPortal.java.patch @@ -0,0 +1,20 @@ +--- ../src-base/minecraft/net/minecraft/block/BlockPortal.java ++++ ../src-work/minecraft/net/minecraft/block/BlockPortal.java +@@ -111,7 +111,7 @@ + { + BlockPortal.Size blockportal$size = new BlockPortal.Size(p_176548_1_, p_176548_2_, EnumFacing.Axis.X); + +- if (blockportal$size.func_150860_b() && blockportal$size.field_150864_e == 0) ++ if (blockportal$size.func_150860_b() && blockportal$size.field_150864_e == 0 && !net.minecraftforge.event.ForgeEventFactory.onTrySpawnPortal(p_176548_1_, p_176548_2_, blockportal$size)) + { + blockportal$size.func_150859_c(); + return true; +@@ -120,7 +120,7 @@ + { + BlockPortal.Size blockportal$size1 = new BlockPortal.Size(p_176548_1_, p_176548_2_, EnumFacing.Axis.Z); + +- if (blockportal$size1.func_150860_b() && blockportal$size1.field_150864_e == 0) ++ if (blockportal$size1.func_150860_b() && blockportal$size1.field_150864_e == 0 && !net.minecraftforge.event.ForgeEventFactory.onTrySpawnPortal(p_176548_1_, p_176548_2_, blockportal$size1)) + { + blockportal$size1.func_150859_c(); + return true; diff --git a/src/main/java/net/minecraftforge/event/ForgeEventFactory.java b/src/main/java/net/minecraftforge/event/ForgeEventFactory.java index 51e636e1a..e2e49c0b7 100644 --- a/src/main/java/net/minecraftforge/event/ForgeEventFactory.java +++ b/src/main/java/net/minecraftforge/event/ForgeEventFactory.java @@ -24,6 +24,7 @@ import java.util.EnumSet; import java.util.List; import java.util.Random; +import net.minecraft.block.BlockPortal; import net.minecraft.block.state.IBlockState; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.Entity; @@ -740,6 +741,11 @@ public class ForgeEventFactory return result == Result.DEFAULT ? def : result == Result.ALLOW; } + public static boolean onTrySpawnPortal(World world, BlockPos pos, BlockPortal.Size size) + { + return MinecraftForge.EVENT_BUS.post(new BlockEvent.PortalSpawnEvent(world, pos, world.getBlockState(pos), size)); + } + public static int onEnchantmentLevelSet(World world, BlockPos pos, int enchantRow, int power, ItemStack itemStack, int level) { net.minecraftforge.event.enchanting.EnchantmentLevelSetEvent e = new net.minecraftforge.event.enchanting.EnchantmentLevelSetEvent(world, pos, enchantRow, power, itemStack, level); diff --git a/src/main/java/net/minecraftforge/event/world/BlockEvent.java b/src/main/java/net/minecraftforge/event/world/BlockEvent.java index d9a740542..baf3dbed3 100644 --- a/src/main/java/net/minecraftforge/event/world/BlockEvent.java +++ b/src/main/java/net/minecraftforge/event/world/BlockEvent.java @@ -22,6 +22,7 @@ package net.minecraftforge.event.world; import java.util.EnumSet; import java.util.List; +import net.minecraft.block.BlockPortal; import net.minecraft.block.state.IBlockState; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.player.EntityPlayer; @@ -338,4 +339,27 @@ public class BlockEvent extends Event } } } + + /** + * Fired when an attempt is made to spawn a nether portal from + * {@link net.minecraft.block.BlockPortal#trySpawnPortal(World, BlockPos)}. + * + * If cancelled, the portal will not be spawned. + */ + @Cancelable + public static class PortalSpawnEvent extends BlockEvent + { + private final BlockPortal.Size size; + + public PortalSpawnEvent(World world, BlockPos pos, IBlockState state, BlockPortal.Size size) + { + super(world, pos, state); + this.size = size; + } + + public BlockPortal.Size getPortalSize() + { + return size; + } + } } diff --git a/src/test/java/net/minecraftforge/debug/PortalSpawnEventTest.java b/src/test/java/net/minecraftforge/debug/PortalSpawnEventTest.java new file mode 100644 index 000000000..0c05eee7f --- /dev/null +++ b/src/test/java/net/minecraftforge/debug/PortalSpawnEventTest.java @@ -0,0 +1,27 @@ +package net.minecraftforge.debug; + +import net.minecraft.init.Biomes; +import net.minecraft.world.World; +import net.minecraftforge.event.world.BlockEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; + +@Mod(modid = PortalSpawnEventTest.MOD_ID, name = "PortalSpawnEvent test mod", version = "1.0", acceptableRemoteVersions = "*") +@Mod.EventBusSubscriber +public class PortalSpawnEventTest +{ + static final String MOD_ID = "portal_spawn_event_test"; + static final boolean ENABLED = false; + + @SubscribeEvent + public static void onTrySpawnPortal(BlockEvent.PortalSpawnEvent event) + { + if (!ENABLED) return; + + World world = event.getWorld(); + if (world.provider.getDimension() == 0 && world.getBiome(event.getPos()) != Biomes.EXTREME_HILLS) + { + event.setCanceled(true); + } + } +}