diff --git a/src/main/java/org/ultramine/mods/bukkit/EventImplProgress.java b/src/main/java/org/ultramine/mods/bukkit/EventImplProgress.java index 0d28c50..90df3de 100644 --- a/src/main/java/org/ultramine/mods/bukkit/EventImplProgress.java +++ b/src/main/java/org/ultramine/mods/bukkit/EventImplProgress.java @@ -62,7 +62,7 @@ reg(true, org.bukkit.event.block.BlockDispenseEvent.class); reg(true, org.bukkit.event.block.BlockExpEvent.class); reg(true, org.bukkit.event.block.BlockFadeEvent.class); - reg(false, org.bukkit.event.block.BlockFormEvent.class); + reg(true, org.bukkit.event.block.BlockFormEvent.class); reg(false, org.bukkit.event.block.BlockFromToEvent.class); reg(false, org.bukkit.event.block.BlockGrowEvent.class); reg(false, org.bukkit.event.block.BlockIgniteEvent.class); diff --git a/src/main/java/org/ultramine/mods/bukkit/mixin/entity/monster/MixinEntitySnowman.java b/src/main/java/org/ultramine/mods/bukkit/mixin/entity/monster/MixinEntitySnowman.java index 4c884fa..6fbb1d7 100644 --- a/src/main/java/org/ultramine/mods/bukkit/mixin/entity/monster/MixinEntitySnowman.java +++ b/src/main/java/org/ultramine/mods/bukkit/mixin/entity/monster/MixinEntitySnowman.java @@ -1,21 +1,38 @@ package org.ultramine.mods.bukkit.mixin.entity.monster; +import net.minecraft.block.Block; import net.minecraft.entity.EntityLivingBase; +import net.minecraft.init.Blocks; import net.minecraft.util.DamageSource; +import net.minecraft.world.World; +import org.bukkit.block.BlockState; import org.bukkit.craftbukkit.event.CraftEventFactory; +import org.bukkit.craftbukkit.util.CraftMagicNumbers; +import org.bukkit.event.block.EntityBlockFormEvent; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; +import org.ultramine.mods.bukkit.interfaces.entity.IMixinEntity; +import org.ultramine.mods.bukkit.interfaces.world.IMixinWorld; @Mixin(net.minecraft.entity.monster.EntitySnowman.class) public class MixinEntitySnowman { - @Redirect(method = "onLivingUpdate", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/EntityLivingBase;attackEntityFrom(Lnet/minecraft/util/DamageSource;F)Z")) - private void attackEntityFromRedir(EntityLivingBase entity, DamageSource source, float value) + @Redirect(method = "onLivingUpdate", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/EntityLivingBase;attackEntityFrom(Lnet/minecraft/util/DamageSource;F)Z", ordinal = 1)) + private boolean attackEntityFromRedir(EntityLivingBase entity, DamageSource source, float value) { - if(source == DamageSource.onFire && value == 1.0F) - entity.attackEntityFrom(CraftEventFactory.MELTING, value); - else - entity.attackEntityFrom(source, value); + return entity.attackEntityFrom(CraftEventFactory.MELTING, value); + } + + @Redirect(method = "onLivingUpdate", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;setBlock(IIILnet/minecraft/block/Block;)Z")) + public boolean setBlockRedirect(World world, int x, int y, int z, Block block) + { + BlockState blockState = ((IMixinWorld) world).getWorld().getBlockAt(x, y, z).getState(); + blockState.setType(CraftMagicNumbers.getMaterial(Blocks.snow_layer)); + EntityBlockFormEvent event = new EntityBlockFormEvent(((IMixinEntity) this).getBukkitEntity(), blockState.getBlock(), blockState); + ((IMixinWorld) world).getServer().getPluginManager().callEvent(event); + if (!event.isCancelled()) + blockState.update(true); + return false; } } diff --git a/src/main/java/org/ultramine/mods/bukkit/mixin/world/MixinWorldServer.java b/src/main/java/org/ultramine/mods/bukkit/mixin/world/MixinWorldServer.java index bffb147..09e7fdd 100644 --- a/src/main/java/org/ultramine/mods/bukkit/mixin/world/MixinWorldServer.java +++ b/src/main/java/org/ultramine/mods/bukkit/mixin/world/MixinWorldServer.java @@ -1,13 +1,20 @@ package org.ultramine.mods.bukkit.mixin.world; +import net.minecraft.block.Block; import net.minecraft.entity.Entity; +import net.minecraft.init.Blocks; import net.minecraft.profiler.Profiler; import net.minecraft.world.World; import net.minecraft.world.WorldProvider; +import net.minecraft.world.WorldServer; import net.minecraft.world.WorldSettings; import net.minecraft.world.storage.ISaveHandler; +import org.bukkit.block.BlockState; +import org.bukkit.event.block.BlockFormEvent; import org.bukkit.event.entity.CreatureSpawnEvent; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; import org.ultramine.mods.bukkit.interfaces.world.IMixinWorld; @Mixin(net.minecraft.world.WorldServer.class) @@ -25,4 +32,28 @@ { return super.spawnEntityInWorld(entity); } + + @Redirect(method = "func_147456_g", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/WorldServer;setBlock(IIILnet/minecraft/block/Block;)Z", ordinal = 0)) + public boolean setBlockRedirectIceForm(WorldServer world, int x, int y, int z, Block block) + { + BlockState blockState = ((IMixinWorld) world).getWorld().getBlockAt(x, y, z).getState(); + blockState.setTypeId(Block.getIdFromBlock(Blocks.ice)); + BlockFormEvent iceBlockForm = new BlockFormEvent(blockState.getBlock(), blockState); + ((IMixinWorld) world).getServer().getPluginManager().callEvent(iceBlockForm); + if (!iceBlockForm.isCancelled()) + blockState.update(true); + return false; + } + + @Redirect(method = "func_147456_g", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/WorldServer;setBlock(IIILnet/minecraft/block/Block;)Z", ordinal = 1)) + public boolean setBlockRedirectSnowForm(WorldServer world, int x, int y, int z, Block block) + { + BlockState blockState = ((IMixinWorld) world).getWorld().getBlockAt(x, y, z).getState(); + blockState.setTypeId(Block.getIdFromBlock(Blocks.snow_layer)); + BlockFormEvent snow = new BlockFormEvent(blockState.getBlock(), blockState); + ((IMixinWorld) world).getServer().getPluginManager().callEvent(snow); + if (!snow.isCancelled()) + blockState.update(true); + return false; + } }