diff --git a/src/main/java/org/ultramine/mods/bukkit/EventImplProgress.java b/src/main/java/org/ultramine/mods/bukkit/EventImplProgress.java index ddcf78a..ebdf3ef 100644 --- a/src/main/java/org/ultramine/mods/bukkit/EventImplProgress.java +++ b/src/main/java/org/ultramine/mods/bukkit/EventImplProgress.java @@ -86,7 +86,7 @@ reg(false, org.bukkit.event.entity.EntityCombustByBlockEvent.class); reg(false, org.bukkit.event.entity.EntityCombustByEntityEvent.class); reg(false, org.bukkit.event.entity.EntityCombustEvent.class); - reg(false, org.bukkit.event.entity.EntityCreatePortalEvent.class); + reg(true, org.bukkit.event.entity.EntityCreatePortalEvent.class); reg(true, org.bukkit.event.entity.EntityDamageByBlockEvent.class); reg(true, org.bukkit.event.entity.EntityDamageByEntityEvent.class); reg(true, org.bukkit.event.entity.EntityDamageEvent.class); diff --git a/src/main/java/org/ultramine/mods/bukkit/mixin/entity/boss/MixinEntityDragon.java b/src/main/java/org/ultramine/mods/bukkit/mixin/entity/boss/MixinEntityDragon.java index cde9437..2bfa1b8 100644 --- a/src/main/java/org/ultramine/mods/bukkit/mixin/entity/boss/MixinEntityDragon.java +++ b/src/main/java/org/ultramine/mods/bukkit/mixin/entity/boss/MixinEntityDragon.java @@ -2,16 +2,26 @@ import net.minecraft.entity.EntityLiving; import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.network.play.server.S23PacketBlockChange; import net.minecraft.util.DamageSource; import net.minecraft.world.World; import org.bukkit.Bukkit; +import org.bukkit.block.BlockState; +import org.bukkit.craftbukkit.util.BlockStateListPopulator; +import org.bukkit.event.entity.EntityCreatePortalEvent; import org.bukkit.event.entity.EntityRegainHealthEvent; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.At.Shift; +import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.ultramine.mods.bukkit.interfaces.entity.IMixinEntity; import org.ultramine.mods.bukkit.interfaces.entity.boss.IMixinEntityDragon; +import org.ultramine.mods.bukkit.interfaces.world.IMixinWorld; @Mixin(net.minecraft.entity.boss.EntityDragon.class) public abstract class MixinEntityDragon extends EntityLiving implements IMixinEntityDragon @@ -42,4 +52,25 @@ return func_82195_e(source, amount); } + @Inject(method = "createEnderPortal", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;setBlock(IIILnet/minecraft/block/Block;)Z", ordinal = 12, shift = Shift.BY, by = 2)) + public void createEnderPortalInject(int x, int z, CallbackInfo ci) + { + BlockStateListPopulator world = new BlockStateListPopulator(((IMixinWorld) this.worldObj).getWorld()); + EntityCreatePortalEvent event = new EntityCreatePortalEvent((org.bukkit.entity.LivingEntity) (((IMixinEntity) this).getBukkitEntity()), java.util.Collections.unmodifiableList(world.getList()), org.bukkit.PortalType.ENDER); + ((IMixinWorld) this.worldObj).getServer().getPluginManager().callEvent(event); + if (!event.isCancelled()) + for (BlockState state : event.getBlocks()) + state.update(true); + else + for (BlockState state : event.getBlocks()) + { + S23PacketBlockChange packet = new S23PacketBlockChange(state.getX(), state.getY(), state.getZ(), this.worldObj); + for (Object playerEntity : this.worldObj.playerEntities) + { + EntityPlayer entity = (EntityPlayer) playerEntity; + if (entity instanceof EntityPlayerMP) + ((EntityPlayerMP) entity).playerNetServerHandler.sendPacket(packet); + } + } + } }