diff --git a/src/main/java/org/ultramine/mods/bukkit/EventImplProgress.java b/src/main/java/org/ultramine/mods/bukkit/EventImplProgress.java index b3d730f..0d28c50 100644 --- a/src/main/java/org/ultramine/mods/bukkit/EventImplProgress.java +++ b/src/main/java/org/ultramine/mods/bukkit/EventImplProgress.java @@ -61,7 +61,7 @@ reg(true, org.bukkit.event.block.BlockDamageEvent.class); reg(true, org.bukkit.event.block.BlockDispenseEvent.class); reg(true, org.bukkit.event.block.BlockExpEvent.class); - reg(false, org.bukkit.event.block.BlockFadeEvent.class); + reg(true, org.bukkit.event.block.BlockFadeEvent.class); reg(false, org.bukkit.event.block.BlockFormEvent.class); reg(false, org.bukkit.event.block.BlockFromToEvent.class); reg(false, org.bukkit.event.block.BlockGrowEvent.class); diff --git a/src/main/java/org/ultramine/mods/bukkit/mixin/block/MixinBlockFarmland.java b/src/main/java/org/ultramine/mods/bukkit/mixin/block/MixinBlockFarmland.java new file mode 100644 index 0000000..b765d39 --- /dev/null +++ b/src/main/java/org/ultramine/mods/bukkit/mixin/block/MixinBlockFarmland.java @@ -0,0 +1,29 @@ +package org.ultramine.mods.bukkit.mixin.block; + +import net.minecraft.block.BlockFarmland; +import net.minecraft.init.Blocks; +import net.minecraft.world.World; +import org.bukkit.craftbukkit.event.CraftEventFactory; +import org.spongepowered.asm.mixin.Mixin; +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.callback.CallbackInfo; +import org.ultramine.mods.bukkit.interfaces.world.IMixinWorld; + +import java.util.Random; + +@Mixin(BlockFarmland.class) +public class MixinBlockFarmland +{ + /** + * @author AtomicInteger + */ + @Inject(method = "updateTick", cancellable = true, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;setBlock(IIILnet/minecraft/block/Block;)Z", shift = Shift.BEFORE)) + public void updateTickInject(World world, int x, int y, int z, Random random, CallbackInfo ci) + { + org.bukkit.block.Block block = ((IMixinWorld) world).getWorld().getBlockAt(x, y, z); + if (CraftEventFactory.callBlockFadeEvent(block, Blocks.dirt).isCancelled()) + ci.cancel(); + } +} diff --git a/src/main/java/org/ultramine/mods/bukkit/mixin/block/MixinBlockFire.java b/src/main/java/org/ultramine/mods/bukkit/mixin/block/MixinBlockFire.java index 66be1dc..931ef38 100644 --- a/src/main/java/org/ultramine/mods/bukkit/mixin/block/MixinBlockFire.java +++ b/src/main/java/org/ultramine/mods/bukkit/mixin/block/MixinBlockFire.java @@ -1,12 +1,15 @@ package org.ultramine.mods.bukkit.mixin.block; +import net.minecraft.init.Blocks; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.event.CraftEventFactory; import org.bukkit.event.block.BlockBurnEvent; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; 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.world.IMixinWorld; @@ -29,4 +32,31 @@ return; } } + + /** + * @author AtomicInteger + */ + @Redirect(method = "updateTick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;setBlockToAir(III)Z")) + public boolean setBlockAirUpdateTickRedirect(World world, int x, int y, int z) + { + if (!CraftEventFactory.callBlockFadeEvent(((IMixinWorld) world).getWorld().getBlockAt(x, y, z), Blocks.air).isCancelled()) + world.setBlockToAir(x, y, z); + return false; + } + + @Redirect(method = "onNeighborBlockChange", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;setBlockToAir(III)Z")) + public boolean setBlockToAirNeighborBlockChangeRedirect(World world, int x, int y, int z) + { + if (!CraftEventFactory.callBlockFadeEvent(((IMixinWorld) world).getWorld().getBlockAt(x, y, z), Blocks.air).isCancelled()) + world.setBlockToAir(x, y, z); + return false; + } + + @Redirect(method = "onBlockAdded", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;setBlockToAir(III)Z")) + public boolean setBlockToAirBlockAddedRedirect(World world, int x, int y, int z) + { + if (!CraftEventFactory.callBlockFadeEvent(((IMixinWorld) world).getWorld().getBlockAt(x, y, z), Blocks.air).isCancelled()) + world.setBlockToAir(x, y, z); + return false; + } } diff --git a/src/main/java/org/ultramine/mods/bukkit/mixin/block/MixinBlockGrass.java b/src/main/java/org/ultramine/mods/bukkit/mixin/block/MixinBlockGrass.java new file mode 100644 index 0000000..f740f1f --- /dev/null +++ b/src/main/java/org/ultramine/mods/bukkit/mixin/block/MixinBlockGrass.java @@ -0,0 +1,32 @@ +package org.ultramine.mods.bukkit.mixin.block; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockGrass; +import net.minecraft.init.Blocks; +import net.minecraft.world.World; +import org.bukkit.block.BlockState; +import org.bukkit.event.block.BlockFadeEvent; +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(BlockGrass.class) +public class MixinBlockGrass +{ + /** + * @author AtomicInteger + */ + @Redirect(method = "updateTick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;setBlock(IIILnet/minecraft/block/Block;)Z", ordinal = 0)) + public boolean setBlockRedirect(World world, int x, int y, int z, Block block) + { + org.bukkit.World bworld = ((IMixinWorld) world).getWorld(); + BlockState blockState = bworld.getBlockAt(x, y, z).getState(); + blockState.setTypeId(Block.getIdFromBlock(Blocks.dirt)); + BlockFadeEvent event = new BlockFadeEvent(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/block/MixinBlockIce.java b/src/main/java/org/ultramine/mods/bukkit/mixin/block/MixinBlockIce.java new file mode 100644 index 0000000..29626ec --- /dev/null +++ b/src/main/java/org/ultramine/mods/bukkit/mixin/block/MixinBlockIce.java @@ -0,0 +1,28 @@ +package org.ultramine.mods.bukkit.mixin.block; + +import net.minecraft.block.BlockIce; +import net.minecraft.init.Blocks; +import net.minecraft.world.World; +import org.bukkit.craftbukkit.event.CraftEventFactory; +import org.spongepowered.asm.mixin.Mixin; +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.callback.CallbackInfo; +import org.ultramine.mods.bukkit.interfaces.world.IMixinWorld; + +import java.util.Random; + +@Mixin(BlockIce.class) +public class MixinBlockIce +{ + /** + * @author AtomicInteger + */ + @Inject(method = "updateTick", cancellable = true, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;getSavedLightValue(Lnet/minecraft/world/EnumSkyBlock;III)I", shift = Shift.BY, by = 6)) + public void updateTickInject(World world, int x, int y, int z, Random random, CallbackInfo ci) + { + if (CraftEventFactory.callBlockFadeEvent(((IMixinWorld) world).getWorld().getBlockAt(x, y, z), Blocks.water).isCancelled()) + ci.cancel(); + } +} diff --git a/src/main/java/org/ultramine/mods/bukkit/mixin/block/MixinBlockMycelium.java b/src/main/java/org/ultramine/mods/bukkit/mixin/block/MixinBlockMycelium.java new file mode 100644 index 0000000..09acf05 --- /dev/null +++ b/src/main/java/org/ultramine/mods/bukkit/mixin/block/MixinBlockMycelium.java @@ -0,0 +1,32 @@ +package org.ultramine.mods.bukkit.mixin.block; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockMycelium; +import net.minecraft.init.Blocks; +import net.minecraft.world.World; +import org.bukkit.block.BlockState; +import org.bukkit.event.block.BlockFadeEvent; +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(BlockMycelium.class) +public class MixinBlockMycelium +{ + /** + * @author AtomicInteger + */ + @Redirect(method = "updateTick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;setBlock(IIILnet/minecraft/block/Block;)Z", ordinal = 0)) + public boolean setBlockRedirect(World world, int x, int y, int z, Block block) + { + org.bukkit.World bworld = ((IMixinWorld) world).getWorld(); + BlockState blockState = bworld.getBlockAt(x, y, z).getState(); + blockState.setTypeId(Block.getIdFromBlock(Blocks.dirt)); + BlockFadeEvent event = new BlockFadeEvent(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/block/MixinBlockSnow.java b/src/main/java/org/ultramine/mods/bukkit/mixin/block/MixinBlockSnow.java new file mode 100644 index 0000000..c5b9276 --- /dev/null +++ b/src/main/java/org/ultramine/mods/bukkit/mixin/block/MixinBlockSnow.java @@ -0,0 +1,35 @@ +package org.ultramine.mods.bukkit.mixin.block; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockSnow; +import net.minecraft.block.material.Material; +import net.minecraft.init.Blocks; +import net.minecraft.world.World; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.ultramine.mods.bukkit.interfaces.world.IMixinWorld; + +import java.util.Random; + +@Mixin(BlockSnow.class) +public class MixinBlockSnow extends Block +{ + protected MixinBlockSnow(Material p_i45394_1_) + { + super(p_i45394_1_); + } + + /** + * @author AtomicInteger + */ + @Inject(method = "updateTick", cancellable = true, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;setBlockToAir(III)Z")) + public void updateTickInject(World world, int x, int y, int z, Random random, CallbackInfo ci) + { + if (org.bukkit.craftbukkit.event.CraftEventFactory.callBlockFadeEvent(((IMixinWorld) world).getWorld().getBlockAt(x, y, z), Blocks.air).isCancelled()) + ci.cancel(); + else + this.dropBlockAsItem(world, x, y, z, world.getBlockMetadata(x, y, z), 0); + } +} diff --git a/src/main/resources/mixin.umbukkitimpl.json b/src/main/resources/mixin.umbukkitimpl.json index 0b3aa76..794c414 100644 --- a/src/main/resources/mixin.umbukkitimpl.json +++ b/src/main/resources/mixin.umbukkitimpl.json @@ -12,6 +12,11 @@ "block.MixinBlockLeaves", "block.MixinBlockCake", "block.MixinBlockFire", + "block.MixinBlockFarmland", + "block.MixinBlockGrass", + "block.MixinBlockIce", + "block.MixinBlockSnow", + "block.MixinBlockMycelium", "entity.MixinEntity", "entity.MixinEntityLiving", "entity.MixinEntityLivingBase",