diff --git a/src/main/java/org/ultramine/mods/bukkit/EventImplProgress.java b/src/main/java/org/ultramine/mods/bukkit/EventImplProgress.java index f2d0198..b3d730f 100644 --- a/src/main/java/org/ultramine/mods/bukkit/EventImplProgress.java +++ b/src/main/java/org/ultramine/mods/bukkit/EventImplProgress.java @@ -59,7 +59,7 @@ reg(true, org.bukkit.event.block.BlockBurnEvent.class); reg(true, org.bukkit.event.block.BlockCanBuildEvent.class); reg(true, org.bukkit.event.block.BlockDamageEvent.class); - reg(false, org.bukkit.event.block.BlockDispenseEvent.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(false, org.bukkit.event.block.BlockFormEvent.class); diff --git a/src/main/java/org/ultramine/mods/bukkit/mixin/dispenser/MixinBehaviorDefaultDispenseItem.java b/src/main/java/org/ultramine/mods/bukkit/mixin/dispenser/MixinBehaviorDefaultDispenseItem.java new file mode 100644 index 0000000..a6152fc --- /dev/null +++ b/src/main/java/org/ultramine/mods/bukkit/mixin/dispenser/MixinBehaviorDefaultDispenseItem.java @@ -0,0 +1,72 @@ +package org.ultramine.mods.bukkit.mixin.dispenser; + +import net.minecraft.block.BlockDispenser; +import net.minecraft.dispenser.BehaviorDefaultDispenseItem; +import net.minecraft.dispenser.IBehaviorDispenseItem; +import net.minecraft.dispenser.IBlockSource; +import net.minecraft.dispenser.IPosition; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumFacing; +import net.minecraft.world.World; +import org.bukkit.Bukkit; +import org.bukkit.block.Block; +import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.event.block.BlockDispenseEvent; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.ultramine.mods.bukkit.interfaces.world.IMixinWorld; + +@Mixin(BehaviorDefaultDispenseItem.class) +public class MixinBehaviorDefaultDispenseItem +{ + /** + * @author AtomicInteger + */ + @Overwrite + protected ItemStack dispenseStack(IBlockSource blockSource, ItemStack itemStack) + { + EnumFacing enumfacing = BlockDispenser.func_149937_b(blockSource.getBlockMetadata()); + if (!doDispense(blockSource.getWorld(), itemStack.splitStack(1), 6, enumfacing, blockSource)) + itemStack.stackSize++; + return itemStack; + } + + private boolean doDispense(World world, ItemStack itemstack, int i, EnumFacing enumfacing, IBlockSource iblocksource) + { + IPosition iposition = BlockDispenser.func_149939_a(iblocksource); + double d0 = iposition.getX(); + double d1 = iposition.getY(); + double d2 = iposition.getZ(); + EntityItem entityitem = new EntityItem(world, d0, d1 - 0.3D, d2, itemstack); + double d3 = world.rand.nextDouble() * 0.1D + 0.2D; + entityitem.motionX = (double) enumfacing.getFrontOffsetX() * d3; + entityitem.motionY = 0.20000000298023224D; + entityitem.motionZ = (double) enumfacing.getFrontOffsetZ() * d3; + entityitem.motionX = world.rand.nextGaussian() * 0.007499999832361937D * (double) i; + entityitem.motionY = world.rand.nextGaussian() * 0.007499999832361937D * (double) i; + entityitem.motionZ = world.rand.nextGaussian() * 0.007499999832361937D * (double) i; + Block block = ((IMixinWorld) world).getWorld().getBlockAt(iblocksource.getXInt(), iblocksource.getYInt(), iblocksource.getZInt()); + CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack); + BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(entityitem.motionX, entityitem.motionY, entityitem.motionZ)); + Bukkit.getServer().getPluginManager().callEvent(event); + if (event.isCancelled()) + return false; + entityitem.setEntityItemStack(CraftItemStack.asNMSCopy(event.getItem())); + entityitem.motionX = event.getVelocity().getX(); + entityitem.motionY = event.getVelocity().getY(); + entityitem.motionZ = event.getVelocity().getZ(); + if (!event.getItem().equals(craftItem)) + { + ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); + IBehaviorDispenseItem ibehaviordispenseitem = (IBehaviorDispenseItem) BlockDispenser.dispenseBehaviorRegistry.getObject(eventStack.getItem()); + if (ibehaviordispenseitem != IBehaviorDispenseItem.itemDispenseBehaviorProvider && ibehaviordispenseitem.getClass() != BehaviorDefaultDispenseItem.class) + ibehaviordispenseitem.dispense(iblocksource, eventStack); + else + world.spawnEntityInWorld(entityitem); + return false; + } + world.spawnEntityInWorld(entityitem); + return true; + } +} diff --git a/src/main/java/org/ultramine/mods/bukkit/mixin/dispenser/MixinBehaviorProjectileDispense.java b/src/main/java/org/ultramine/mods/bukkit/mixin/dispenser/MixinBehaviorProjectileDispense.java new file mode 100644 index 0000000..378e9ce --- /dev/null +++ b/src/main/java/org/ultramine/mods/bukkit/mixin/dispenser/MixinBehaviorProjectileDispense.java @@ -0,0 +1,68 @@ +package org.ultramine.mods.bukkit.mixin.dispenser; + +import net.minecraft.block.BlockDispenser; +import net.minecraft.dispenser.BehaviorProjectileDispense; +import net.minecraft.dispenser.IBehaviorDispenseItem; +import net.minecraft.dispenser.IBlockSource; +import net.minecraft.dispenser.IPosition; +import net.minecraft.entity.Entity; +import net.minecraft.entity.IProjectile; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntityDispenser; +import net.minecraft.util.EnumFacing; +import net.minecraft.world.World; +import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.event.block.BlockDispenseEvent; +import org.bukkit.util.Vector; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; +import org.ultramine.mods.bukkit.interfaces.entity.IMixinEntity; +import org.ultramine.mods.bukkit.interfaces.world.IMixinWorld; + +@Mixin(BehaviorProjectileDispense.class) +public abstract class MixinBehaviorProjectileDispense +{ + @Shadow protected abstract float func_82498_a(); + + @Shadow protected abstract float func_82500_b(); + + @Shadow protected abstract IProjectile getProjectileEntity(World var1, IPosition var2); + + /** + * @author AtomicInteger + */ + @Overwrite + public ItemStack dispenseStack(IBlockSource blockSource, ItemStack itemStack) + { + World world = blockSource.getWorld(); + IPosition iposition = BlockDispenser.func_149939_a(blockSource); + EnumFacing enumfacing = BlockDispenser.func_149937_b(blockSource.getBlockMetadata()); + IProjectile iprojectile = this.getProjectileEntity(world, iposition); + ItemStack itemstack1 = itemStack.splitStack(1); + org.bukkit.block.Block block = ((IMixinWorld) world).getWorld().getBlockAt(blockSource.getXInt(), blockSource.getYInt(), blockSource.getZInt()); + CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); + BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new Vector(enumfacing.getFrontOffsetX(), enumfacing.getFrontOffsetY() + 0.1F, enumfacing.getFrontOffsetZ())); + ((IMixinWorld) world).getServer().getPluginManager().callEvent(event); + if (event.isCancelled()) + { + itemStack.stackSize++; + return itemStack; + } + if (!event.getItem().equals(craftItem)) + { + itemStack.stackSize++; + ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); + IBehaviorDispenseItem ibehaviordispenseitem = (IBehaviorDispenseItem) BlockDispenser.dispenseBehaviorRegistry.getObject(eventStack.getItem()); + if (ibehaviordispenseitem != IBehaviorDispenseItem.itemDispenseBehaviorProvider && ibehaviordispenseitem != this) + { + ibehaviordispenseitem.dispense(blockSource, eventStack); + return itemStack; + } + } + iprojectile.setThrowableHeading(enumfacing.getFrontOffsetX(), enumfacing.getFrontOffsetY() + 0.1F, enumfacing.getFrontOffsetZ(), this.func_82500_b(), this.func_82498_a()); + ((IMixinEntity) iprojectile).setProjectileSource(new org.bukkit.craftbukkit.projectiles.CraftBlockProjectileSource((TileEntityDispenser) blockSource.getBlockTileEntity())); + world.spawnEntityInWorld((Entity) iprojectile); + return itemStack; + } +} diff --git a/src/main/java/org/ultramine/mods/bukkit/mixin/init/MixinBootstrapBoat.java b/src/main/java/org/ultramine/mods/bukkit/mixin/init/MixinBootstrapBoat.java new file mode 100644 index 0000000..2c45eac --- /dev/null +++ b/src/main/java/org/ultramine/mods/bukkit/mixin/init/MixinBootstrapBoat.java @@ -0,0 +1,78 @@ +package org.ultramine.mods.bukkit.mixin.init; + +import net.minecraft.block.BlockDispenser; +import net.minecraft.block.material.Material; +import net.minecraft.dispenser.BehaviorDefaultDispenseItem; +import net.minecraft.dispenser.IBehaviorDispenseItem; +import net.minecraft.dispenser.IBlockSource; +import net.minecraft.entity.item.EntityBoat; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumFacing; +import net.minecraft.world.World; +import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.event.block.BlockDispenseEvent; +import org.bukkit.util.Vector; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; +import org.ultramine.mods.bukkit.interfaces.world.IMixinWorld; + +@Mixin(targets = "net/minecraft/init/Bootstrap$9") +public class MixinBootstrapBoat +{ + @Final + @Shadow private BehaviorDefaultDispenseItem field_150842_b; + + /** + * @author AtomicInteger + */ + @Overwrite + public ItemStack dispenseStack(IBlockSource blockSource, ItemStack itemStack) + { + EnumFacing enumfacing = BlockDispenser.func_149937_b(blockSource.getBlockMetadata()); + World world = blockSource.getWorld(); + double d0 = blockSource.getX() + (double) ((float) enumfacing.getFrontOffsetX() * 1.125F); + double d1 = blockSource.getY() + (double) ((float) enumfacing.getFrontOffsetY() * 1.125F); + double d2 = blockSource.getZ() + (double) ((float) enumfacing.getFrontOffsetZ() * 1.125F); + int i = blockSource.getXInt() + enumfacing.getFrontOffsetX(); + int j = blockSource.getYInt() + enumfacing.getFrontOffsetY(); + int k = blockSource.getZInt() + enumfacing.getFrontOffsetZ(); + Material material = world.getBlock(i, j, k).getMaterial(); + double d3; + if (Material.water.equals(material)) + { + d3 = 1.0D; + } + else + { + if (!Material.air.equals(material) || !Material.water.equals(world.getBlock(i, j - 1, k).getMaterial())) + return this.field_150842_b.dispense(blockSource, itemStack); + d3 = 0.0D; + } + ItemStack itemstack1 = itemStack.splitStack(1); + org.bukkit.block.Block block = ((IMixinWorld) world).getWorld().getBlockAt(blockSource.getXInt(), blockSource.getYInt(), blockSource.getZInt()); + CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); + BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new Vector(d0, d1 + d3, d2)); + ((IMixinWorld) world).getServer().getPluginManager().callEvent(event); + if (event.isCancelled()) + { + itemStack.stackSize++; + return itemStack; + } + if (!event.getItem().equals(craftItem)) + { + itemStack.stackSize++; + ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); + IBehaviorDispenseItem ibehaviordispenseitem = (IBehaviorDispenseItem) BlockDispenser.dispenseBehaviorRegistry.getObject(eventStack.getItem()); + if (ibehaviordispenseitem != IBehaviorDispenseItem.itemDispenseBehaviorProvider && ibehaviordispenseitem != this) + { + ibehaviordispenseitem.dispense(blockSource, eventStack); + return itemStack; + } + } + EntityBoat entityboat = new EntityBoat(world, event.getVelocity().getX(), event.getVelocity().getY(), event.getVelocity().getZ()); + world.spawnEntityInWorld(entityboat); + return itemStack; + } +} diff --git a/src/main/java/org/ultramine/mods/bukkit/mixin/init/MixinBootstrapBucket.java b/src/main/java/org/ultramine/mods/bukkit/mixin/init/MixinBootstrapBucket.java new file mode 100644 index 0000000..5b7368a --- /dev/null +++ b/src/main/java/org/ultramine/mods/bukkit/mixin/init/MixinBootstrapBucket.java @@ -0,0 +1,80 @@ +package org.ultramine.mods.bukkit.mixin.init; + +import net.minecraft.block.BlockDispenser; +import net.minecraft.block.material.Material; +import net.minecraft.dispenser.BehaviorDefaultDispenseItem; +import net.minecraft.dispenser.IBehaviorDispenseItem; +import net.minecraft.dispenser.IBlockSource; +import net.minecraft.init.Items; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntityDispenser; +import net.minecraft.util.EnumFacing; +import net.minecraft.world.World; +import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.event.block.BlockDispenseEvent; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; +import org.ultramine.mods.bukkit.interfaces.world.IMixinWorld; + +@Mixin(targets = "net/minecraft/init/Bootstrap$11") +public abstract class MixinBootstrapBucket extends BehaviorDefaultDispenseItem +{ + @Final + @Shadow private BehaviorDefaultDispenseItem field_150840_b; + + /** + * @author AtomicInteger + */ + @Overwrite + public ItemStack dispenseStack(IBlockSource blockSource, ItemStack itemStack) + { + EnumFacing enumfacing = BlockDispenser.func_149937_b(blockSource.getBlockMetadata()); + World world = blockSource.getWorld(); + int i = blockSource.getXInt() + enumfacing.getFrontOffsetX(); + int j = blockSource.getYInt() + enumfacing.getFrontOffsetY(); + int k = blockSource.getZInt() + enumfacing.getFrontOffsetZ(); + Material material = world.getBlock(i, j, k).getMaterial(); + int l = world.getBlockMetadata(i, j, k); + Item item; + if (Material.water.equals(material) && l == 0) + { + item = Items.water_bucket; + } + else + { + if (!Material.lava.equals(material) || l != 0) + return super.dispenseStack(blockSource, itemStack); + item = Items.lava_bucket; + } + org.bukkit.block.Block block = ((IMixinWorld) world).getWorld().getBlockAt(blockSource.getXInt(), blockSource.getYInt(), blockSource.getZInt()); + CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemStack); + BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(i, j, k)); + ((IMixinWorld) world).getServer().getPluginManager().callEvent(event); + if (event.isCancelled()) + return itemStack; + if (!event.getItem().equals(craftItem)) + { + ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); + IBehaviorDispenseItem ibehaviordispenseitem = (IBehaviorDispenseItem) BlockDispenser.dispenseBehaviorRegistry.getObject(eventStack.getItem()); + if (ibehaviordispenseitem != IBehaviorDispenseItem.itemDispenseBehaviorProvider && ibehaviordispenseitem != this) + { + ibehaviordispenseitem.dispense(blockSource, eventStack); + return itemStack; + } + } + world.setBlockToAir(i, j, k); + if (--itemStack.stackSize == 0) + { + itemStack.func_150996_a(item); + itemStack.stackSize = 1; + } + else if (((TileEntityDispenser) blockSource.getBlockTileEntity()).func_146019_a(new ItemStack(item)) < 0) + { + this.field_150840_b.dispense(blockSource, new ItemStack(item)); + } + return itemStack; + } +} diff --git a/src/main/java/org/ultramine/mods/bukkit/mixin/init/MixinBootstrapDye.java b/src/main/java/org/ultramine/mods/bukkit/mixin/init/MixinBootstrapDye.java new file mode 100644 index 0000000..2d58b5a --- /dev/null +++ b/src/main/java/org/ultramine/mods/bukkit/mixin/init/MixinBootstrapDye.java @@ -0,0 +1,65 @@ +package org.ultramine.mods.bukkit.mixin.init; + +import net.minecraft.block.BlockDispenser; +import net.minecraft.dispenser.BehaviorDefaultDispenseItem; +import net.minecraft.dispenser.IBehaviorDispenseItem; +import net.minecraft.dispenser.IBlockSource; +import net.minecraft.item.ItemDye; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumFacing; +import net.minecraft.world.World; +import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.event.block.BlockDispenseEvent; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; +import org.ultramine.mods.bukkit.interfaces.world.IMixinWorld; + +@Mixin(targets = "net/minecraft/init/Bootstrap$13") +public class MixinBootstrapDye extends BehaviorDefaultDispenseItem +{ + @Shadow + private boolean field_150838_b; + + /** + * @author AtomicInteger + */ + @Overwrite + public ItemStack dispenseStack(IBlockSource blockSource, ItemStack itemStack) + { + if (itemStack.getItemDamage() == 15) + { + EnumFacing enumfacing = BlockDispenser.func_149937_b(blockSource.getBlockMetadata()); + World world = blockSource.getWorld(); + int i = blockSource.getXInt() + enumfacing.getFrontOffsetX(); + int j = blockSource.getYInt() + enumfacing.getFrontOffsetY(); + int k = blockSource.getZInt() + enumfacing.getFrontOffsetZ(); + org.bukkit.block.Block block = ((IMixinWorld) world).getWorld().getBlockAt(blockSource.getXInt(), blockSource.getYInt(), blockSource.getZInt()); + CraftItemStack craftItem = CraftItemStack.asNewCraftStack(itemStack.getItem()); + BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(0, 0, 0)); + ((IMixinWorld) world).getServer().getPluginManager().callEvent(event); + if (event.isCancelled()) + return itemStack; + if (!event.getItem().equals(craftItem)) + { + ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); + IBehaviorDispenseItem ibehaviordispenseitem = (IBehaviorDispenseItem) BlockDispenser.dispenseBehaviorRegistry.getObject(eventStack.getItem()); + if (ibehaviordispenseitem != IBehaviorDispenseItem.itemDispenseBehaviorProvider && ibehaviordispenseitem != this) + { + ibehaviordispenseitem.dispense(blockSource, eventStack); + return itemStack; + } + } + if (ItemDye.func_150919_a(itemStack, world, i, j, k)) + if (!world.isRemote) + world.playAuxSFX(2005, i, j, k, 0); + else + this.field_150838_b = false; + return itemStack; + } + else + { + return super.dispenseStack(blockSource, itemStack); + } + } +} diff --git a/src/main/java/org/ultramine/mods/bukkit/mixin/init/MixinBootstrapFireCharge.java b/src/main/java/org/ultramine/mods/bukkit/mixin/init/MixinBootstrapFireCharge.java new file mode 100644 index 0000000..5fee311 --- /dev/null +++ b/src/main/java/org/ultramine/mods/bukkit/mixin/init/MixinBootstrapFireCharge.java @@ -0,0 +1,66 @@ +package org.ultramine.mods.bukkit.mixin.init; + +import net.minecraft.block.BlockDispenser; +import net.minecraft.dispenser.IBehaviorDispenseItem; +import net.minecraft.dispenser.IBlockSource; +import net.minecraft.dispenser.IPosition; +import net.minecraft.entity.projectile.EntitySmallFireball; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntityDispenser; +import net.minecraft.util.EnumFacing; +import net.minecraft.world.World; +import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.event.block.BlockDispenseEvent; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.ultramine.mods.bukkit.interfaces.entity.IMixinEntity; +import org.ultramine.mods.bukkit.interfaces.world.IMixinWorld; +import java.util.Random; + +@Mixin(targets = "net/minecraft/init/Bootstrap$8") +public class MixinBootstrapFireCharge +{ + /** + * @author AtomicInteger + */ + @Overwrite + public ItemStack dispenseStack(IBlockSource blockSource, ItemStack itemStack) + { + EnumFacing enumfacing = BlockDispenser.func_149937_b(blockSource.getBlockMetadata()); + IPosition iposition = BlockDispenser.func_149939_a(blockSource); + double d0 = iposition.getX() + (double) ((float) enumfacing.getFrontOffsetX() * 0.3F); + double d1 = iposition.getY() + (double) ((float) enumfacing.getFrontOffsetX() * 0.3F); + double d2 = iposition.getZ() + (double) ((float) enumfacing.getFrontOffsetZ() * 0.3F); + World world = blockSource.getWorld(); + Random random = world.rand; + double d3 = random.nextGaussian() * 0.05D + (double) enumfacing.getFrontOffsetX(); + double d4 = random.nextGaussian() * 0.05D + (double) enumfacing.getFrontOffsetY(); + double d5 = random.nextGaussian() * 0.05D + (double) enumfacing.getFrontOffsetZ(); + ItemStack itemstack1 = itemStack.splitStack(1); + org.bukkit.block.Block block = ((IMixinWorld) world).getWorld().getBlockAt(blockSource.getXInt(), blockSource.getYInt(), blockSource.getZInt()); + CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); + BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(d3, d4, d5)); + ((IMixinWorld) world).getServer().getPluginManager().callEvent(event); + if (event.isCancelled()) + { + itemStack.stackSize++; + return itemStack; + } + if (!event.getItem().equals(craftItem)) + { + itemStack.stackSize++; + ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); + IBehaviorDispenseItem ibehaviordispenseitem = (IBehaviorDispenseItem) BlockDispenser.dispenseBehaviorRegistry.getObject(eventStack.getItem()); + if (ibehaviordispenseitem != IBehaviorDispenseItem.itemDispenseBehaviorProvider && ibehaviordispenseitem != this) + { + ibehaviordispenseitem.dispense(blockSource, eventStack); + return itemStack; + } + } + EntitySmallFireball entitysmallfireball = new EntitySmallFireball(world, d0, d1, d2, event.getVelocity().getX(), event.getVelocity().getY(), event.getVelocity().getZ()); + ((IMixinEntity) entitysmallfireball).setProjectileSource(new org.bukkit.craftbukkit.projectiles.CraftBlockProjectileSource((TileEntityDispenser) blockSource.getBlockTileEntity())); + world.spawnEntityInWorld(entitysmallfireball); + itemStack.splitStack(1); + return itemStack; + } +} diff --git a/src/main/java/org/ultramine/mods/bukkit/mixin/init/MixinBootstrapFireworks.java b/src/main/java/org/ultramine/mods/bukkit/mixin/init/MixinBootstrapFireworks.java new file mode 100644 index 0000000..5c56118 --- /dev/null +++ b/src/main/java/org/ultramine/mods/bukkit/mixin/init/MixinBootstrapFireworks.java @@ -0,0 +1,57 @@ +package org.ultramine.mods.bukkit.mixin.init; + +import net.minecraft.block.BlockDispenser; +import net.minecraft.dispenser.IBehaviorDispenseItem; +import net.minecraft.dispenser.IBlockSource; +import net.minecraft.entity.item.EntityFireworkRocket; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumFacing; +import net.minecraft.world.World; +import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.event.block.BlockDispenseEvent; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.ultramine.mods.bukkit.interfaces.world.IMixinWorld; + +@Mixin(targets = "net/minecraft/init/Bootstrap$7") +public class MixinBootstrapFireworks +{ + /** + * @author AtomicInteger + */ + @Overwrite + public ItemStack dispenseStack(IBlockSource blockSource, ItemStack itemStack) + { + EnumFacing enumfacing = BlockDispenser.func_149937_b(blockSource.getBlockMetadata()); + double d0 = blockSource.getX() + (double) enumfacing.getFrontOffsetX(); + double d1 = (double) ((float) blockSource.getYInt() + 0.2F); + double d2 = blockSource.getZ() + (double) enumfacing.getFrontOffsetZ(); + World world = blockSource.getWorld(); + ItemStack itemstack1 = itemStack.splitStack(1); + org.bukkit.block.Block block = ((IMixinWorld) world).getWorld().getBlockAt(blockSource.getXInt(), blockSource.getYInt(), blockSource.getZInt()); + CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); + BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(d0, d1, d2)); + ((IMixinWorld) world).getServer().getPluginManager().callEvent(event); + if (event.isCancelled()) + { + itemStack.stackSize++; + return itemStack; + } + if (!event.getItem().equals(craftItem)) + { + itemStack.stackSize++; + ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); + IBehaviorDispenseItem ibehaviordispenseitem = (IBehaviorDispenseItem) BlockDispenser.dispenseBehaviorRegistry.getObject(eventStack.getItem()); + if (ibehaviordispenseitem != IBehaviorDispenseItem.itemDispenseBehaviorProvider && ibehaviordispenseitem != this) + { + ibehaviordispenseitem.dispense(blockSource, eventStack); + return itemStack; + } + } + itemstack1 = CraftItemStack.asNMSCopy(event.getItem()); + EntityFireworkRocket entityfireworkrocket = new EntityFireworkRocket(blockSource.getWorld(), event.getVelocity().getX(), event.getVelocity().getY(), event.getVelocity().getZ(), itemstack1); + blockSource.getWorld().spawnEntityInWorld(entityfireworkrocket); + itemStack.splitStack(1); + return itemStack; + } +} diff --git a/src/main/java/org/ultramine/mods/bukkit/mixin/init/MixinBootstrapFlintAndSteel.java b/src/main/java/org/ultramine/mods/bukkit/mixin/init/MixinBootstrapFlintAndSteel.java new file mode 100644 index 0000000..ab64622 --- /dev/null +++ b/src/main/java/org/ultramine/mods/bukkit/mixin/init/MixinBootstrapFlintAndSteel.java @@ -0,0 +1,69 @@ +package org.ultramine.mods.bukkit.mixin.init; + +import net.minecraft.block.BlockDispenser; +import net.minecraft.dispenser.IBehaviorDispenseItem; +import net.minecraft.dispenser.IBlockSource; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumFacing; +import net.minecraft.world.World; +import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.event.block.BlockDispenseEvent; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; +import org.ultramine.mods.bukkit.interfaces.world.IMixinWorld; + +@Mixin(targets = "net/minecraft/init/Bootstrap$12") +public class MixinBootstrapFlintAndSteel +{ + @Shadow private boolean field_150839_b; + + /** + * @author AtomicInteger + */ + @Overwrite + public ItemStack dispenseStack(IBlockSource blockSource, ItemStack itemStack) + { + EnumFacing enumfacing = BlockDispenser.func_149937_b(blockSource.getBlockMetadata()); + World world = blockSource.getWorld(); + int i = blockSource.getXInt() + enumfacing.getFrontOffsetX(); + int j = blockSource.getYInt() + enumfacing.getFrontOffsetY(); + int k = blockSource.getZInt() + enumfacing.getFrontOffsetZ(); + org.bukkit.block.Block block = ((IMixinWorld) world).getWorld().getBlockAt(blockSource.getXInt(), blockSource.getYInt(), blockSource.getZInt()); + CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemStack); + BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(0, 0, 0)); + ((IMixinWorld) world).getServer().getPluginManager().callEvent(event); + if (event.isCancelled()) + return itemStack; + if (!event.getItem().equals(craftItem)) + { + ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); + IBehaviorDispenseItem ibehaviordispenseitem = (IBehaviorDispenseItem) BlockDispenser.dispenseBehaviorRegistry.getObject(eventStack.getItem()); + if (ibehaviordispenseitem != IBehaviorDispenseItem.itemDispenseBehaviorProvider && ibehaviordispenseitem != this) + { + ibehaviordispenseitem.dispense(blockSource, eventStack); + return itemStack; + } + } + if (world.isAirBlock(i, j, k)) + { + if (!org.bukkit.craftbukkit.event.CraftEventFactory.callBlockIgniteEvent(world, i, j, k, blockSource.getXInt(), blockSource.getYInt(), blockSource.getZInt()).isCancelled()) + { + world.setBlock(i, j, k, Blocks.fire); + if (itemStack.attemptDamageItem(1, world.rand)) + itemStack.stackSize = 0; + } + } + else if (world.getBlock(i, j, k) == Blocks.tnt) + { + Blocks.tnt.onBlockDestroyedByPlayer(world, i, j, k, 1); + world.setBlockToAir(i, j, k); + } + else + { + this.field_150839_b = false; + } + return itemStack; + } +} diff --git a/src/main/java/org/ultramine/mods/bukkit/mixin/init/MixinBootstrapLavaBucket.java b/src/main/java/org/ultramine/mods/bukkit/mixin/init/MixinBootstrapLavaBucket.java new file mode 100644 index 0000000..0f56641 --- /dev/null +++ b/src/main/java/org/ultramine/mods/bukkit/mixin/init/MixinBootstrapLavaBucket.java @@ -0,0 +1,82 @@ +package org.ultramine.mods.bukkit.mixin.init; + +import net.minecraft.block.BlockDispenser; +import net.minecraft.dispenser.BehaviorDefaultDispenseItem; +import net.minecraft.dispenser.IBehaviorDispenseItem; +import net.minecraft.dispenser.IBlockSource; +import net.minecraft.init.Items; +import net.minecraft.item.Item; +import net.minecraft.item.ItemBucket; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntityDispenser; +import net.minecraft.util.EnumFacing; +import net.minecraft.world.World; +import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.event.block.BlockDispenseEvent; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; +import org.ultramine.mods.bukkit.interfaces.world.IMixinWorld; + +@Mixin(targets = "net/minecraft/init/Bootstrap$10") +public class MixinBootstrapLavaBucket +{ + @Final + @Shadow private BehaviorDefaultDispenseItem field_150841_b; + + /** + * @author AtomicInteger + */ + @Overwrite + public ItemStack dispenseStack(IBlockSource blockSource, ItemStack itemStack) + { + ItemBucket itembucket = (ItemBucket) itemStack.getItem(); + int i = blockSource.getXInt(); + int j = blockSource.getYInt(); + int k = blockSource.getZInt(); + EnumFacing enumfacing = BlockDispenser.func_149937_b(blockSource.getBlockMetadata()); + World world = blockSource.getWorld(); + int x = i + enumfacing.getFrontOffsetX(); + int y = j + enumfacing.getFrontOffsetY(); + int z = k + enumfacing.getFrontOffsetZ(); + if (world.isAirBlock(x, y, z) || !world.getBlock(x, y, z).getMaterial().isSolid()) + { + org.bukkit.block.Block block = ((IMixinWorld) world).getWorld().getBlockAt(i, j, k); + CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemStack); + BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(x, y, z)); + ((IMixinWorld) world).getServer().getPluginManager().callEvent(event); + if (event.isCancelled()) + return itemStack; + if (!event.getItem().equals(craftItem)) + { + ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); + IBehaviorDispenseItem ibehaviordispenseitem = (IBehaviorDispenseItem) BlockDispenser.dispenseBehaviorRegistry.getObject(eventStack.getItem()); + if (ibehaviordispenseitem != IBehaviorDispenseItem.itemDispenseBehaviorProvider && ibehaviordispenseitem != this) + { + ibehaviordispenseitem.dispense(blockSource, eventStack); + return itemStack; + } + } + itembucket = (ItemBucket) CraftItemStack.asNMSCopy(event.getItem()).getItem(); + } + if (itembucket.tryPlaceContainedLiquid(blockSource.getWorld(), i + enumfacing.getFrontOffsetX(), j + enumfacing.getFrontOffsetY(), k + enumfacing.getFrontOffsetZ())) + { + Item item = Items.bucket; + if (--itemStack.stackSize == 0) + { + itemStack.func_150996_a(Items.bucket); + itemStack.stackSize = 1; + } + else if (((TileEntityDispenser) blockSource.getBlockTileEntity()).func_146019_a(new ItemStack(item)) < 0) + { + this.field_150841_b.dispense(blockSource, new ItemStack(item)); + } + return itemStack; + } + else + { + return this.field_150841_b.dispense(blockSource, itemStack); + } + } +} diff --git a/src/main/java/org/ultramine/mods/bukkit/mixin/init/MixinBootstrapSpawnEggs.java b/src/main/java/org/ultramine/mods/bukkit/mixin/init/MixinBootstrapSpawnEggs.java new file mode 100644 index 0000000..8db9bae --- /dev/null +++ b/src/main/java/org/ultramine/mods/bukkit/mixin/init/MixinBootstrapSpawnEggs.java @@ -0,0 +1,60 @@ +package org.ultramine.mods.bukkit.mixin.init; + +import net.minecraft.block.BlockDispenser; +import net.minecraft.dispenser.IBehaviorDispenseItem; +import net.minecraft.dispenser.IBlockSource; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemMonsterPlacer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumFacing; +import net.minecraft.world.World; +import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.event.block.BlockDispenseEvent; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.ultramine.mods.bukkit.interfaces.world.IMixinWorld; + +@Mixin(targets = "net/minecraft/init/Bootstrap$6") +public class MixinBootstrapSpawnEggs +{ + /** + * @author AtomicInteger + */ + @Overwrite + public ItemStack dispenseStack(IBlockSource blockSource, ItemStack itemStack) + { + EnumFacing enumfacing = BlockDispenser.func_149937_b(blockSource.getBlockMetadata()); + double d0 = blockSource.getX() + (double) enumfacing.getFrontOffsetX(); + double d1 = (double) ((float) blockSource.getYInt() + 0.2F); + double d2 = blockSource.getZ() + (double) enumfacing.getFrontOffsetZ(); + World world = blockSource.getWorld(); + ItemStack itemstack1 = itemStack.splitStack(1); + org.bukkit.block.Block block = ((IMixinWorld) world).getWorld().getBlockAt(blockSource.getXInt(), blockSource.getYInt(), blockSource.getZInt()); + CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); + BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(d0, d1, d2)); + ((IMixinWorld) world).getServer().getPluginManager().callEvent(event); + if (event.isCancelled()) + { + itemStack.stackSize++; + return itemStack; + } + if (!event.getItem().equals(craftItem)) + { + itemStack.stackSize++; + ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); + IBehaviorDispenseItem ibehaviordispenseitem = (IBehaviorDispenseItem) BlockDispenser.dispenseBehaviorRegistry.getObject(eventStack.getItem()); + if (ibehaviordispenseitem != IBehaviorDispenseItem.itemDispenseBehaviorProvider && ibehaviordispenseitem != this) + { + ibehaviordispenseitem.dispense(blockSource, eventStack); + return itemStack; + } + } + itemstack1 = CraftItemStack.asNMSCopy(event.getItem()); + Entity entity = ItemMonsterPlacer.spawnCreature(blockSource.getWorld(), itemStack.getItemDamage(), event.getVelocity().getX(), event.getVelocity().getY(), event.getVelocity().getZ()); + if (entity instanceof EntityLivingBase && itemStack.hasDisplayName()) + ((EntityLiving) entity).setCustomNameTag(itemStack.getDisplayName()); + return itemStack; + } +} diff --git a/src/main/java/org/ultramine/mods/bukkit/mixin/init/MixinBootstrapTNT.java b/src/main/java/org/ultramine/mods/bukkit/mixin/init/MixinBootstrapTNT.java new file mode 100644 index 0000000..d0f0eb3 --- /dev/null +++ b/src/main/java/org/ultramine/mods/bukkit/mixin/init/MixinBootstrapTNT.java @@ -0,0 +1,56 @@ +package org.ultramine.mods.bukkit.mixin.init; + +import net.minecraft.block.BlockDispenser; +import net.minecraft.dispenser.IBehaviorDispenseItem; +import net.minecraft.dispenser.IBlockSource; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.item.EntityTNTPrimed; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumFacing; +import net.minecraft.world.World; +import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.event.block.BlockDispenseEvent; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.ultramine.mods.bukkit.interfaces.world.IMixinWorld; + +@Mixin(targets = "net/minecraft/init/Bootstrap$14") +public class MixinBootstrapTNT +{ + /** + * @author AtomicInteger + */ + @Overwrite + public ItemStack dispenseStack(IBlockSource blockSource, ItemStack itemStack) + { + EnumFacing enumfacing = BlockDispenser.func_149937_b(blockSource.getBlockMetadata()); + World world = blockSource.getWorld(); + int i = blockSource.getXInt() + enumfacing.getFrontOffsetX(); + int j = blockSource.getYInt() + enumfacing.getFrontOffsetY(); + int k = blockSource.getZInt() + enumfacing.getFrontOffsetZ(); + ItemStack itemstack1 = itemStack.splitStack(1); + org.bukkit.block.Block block = ((IMixinWorld) world).getWorld().getBlockAt(blockSource.getXInt(), blockSource.getYInt(), blockSource.getZInt()); + CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); + BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(i + 0.5, j + 0.5, k + 0.5)); + ((IMixinWorld) world).getServer().getPluginManager().callEvent(event); + if (event.isCancelled()) + { + itemStack.stackSize++; + return itemStack; + } + if (!event.getItem().equals(craftItem)) + { + itemStack.stackSize++; + ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); + IBehaviorDispenseItem ibehaviordispenseitem = (IBehaviorDispenseItem) BlockDispenser.dispenseBehaviorRegistry.getObject(eventStack.getItem()); + if (ibehaviordispenseitem != IBehaviorDispenseItem.itemDispenseBehaviorProvider && ibehaviordispenseitem != this) + { + ibehaviordispenseitem.dispense(blockSource, eventStack); + return itemStack; + } + } + EntityTNTPrimed entitytntprimed = new EntityTNTPrimed(world, event.getVelocity().getX(), event.getVelocity().getY(), event.getVelocity().getZ(), (EntityLivingBase) null); + world.spawnEntityInWorld(entitytntprimed); + return itemStack; + } +} diff --git a/src/main/java/org/ultramine/mods/bukkit/mixin/init/MixinBootstrapWaterBucket.java b/src/main/java/org/ultramine/mods/bukkit/mixin/init/MixinBootstrapWaterBucket.java new file mode 100644 index 0000000..5fa9520 --- /dev/null +++ b/src/main/java/org/ultramine/mods/bukkit/mixin/init/MixinBootstrapWaterBucket.java @@ -0,0 +1,82 @@ +package org.ultramine.mods.bukkit.mixin.init; + +import net.minecraft.block.BlockDispenser; +import net.minecraft.dispenser.BehaviorDefaultDispenseItem; +import net.minecraft.dispenser.IBehaviorDispenseItem; +import net.minecraft.dispenser.IBlockSource; +import net.minecraft.init.Items; +import net.minecraft.item.Item; +import net.minecraft.item.ItemBucket; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntityDispenser; +import net.minecraft.util.EnumFacing; +import net.minecraft.world.World; +import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.event.block.BlockDispenseEvent; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; +import org.ultramine.mods.bukkit.interfaces.world.IMixinWorld; + +@Mixin(targets = "net/minecraft/init/Bootstrap$10") +public class MixinBootstrapWaterBucket +{ + @Final + @Shadow private BehaviorDefaultDispenseItem field_150841_b; + + /** + * @author AtomicInteger + */ + @Overwrite + public ItemStack dispenseStack(IBlockSource blockSource, ItemStack itemStack) + { + ItemBucket itembucket = (ItemBucket) itemStack.getItem(); + int i = blockSource.getXInt(); + int j = blockSource.getYInt(); + int k = blockSource.getZInt(); + EnumFacing enumfacing = BlockDispenser.func_149937_b(blockSource.getBlockMetadata()); + World world = blockSource.getWorld(); + int x = i + enumfacing.getFrontOffsetX(); + int y = j + enumfacing.getFrontOffsetY(); + int z = k + enumfacing.getFrontOffsetZ(); + if (world.isAirBlock(x, y, z) || !world.getBlock(x, y, z).getMaterial().isSolid()) + { + org.bukkit.block.Block block = ((IMixinWorld) world).getWorld().getBlockAt(i, j, k); + CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemStack); + BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(x, y, z)); + ((IMixinWorld) world).getServer().getPluginManager().callEvent(event); + if (event.isCancelled()) + return itemStack; + if (!event.getItem().equals(craftItem)) + { + ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); + IBehaviorDispenseItem ibehaviordispenseitem = (IBehaviorDispenseItem) BlockDispenser.dispenseBehaviorRegistry.getObject(eventStack.getItem()); + if (ibehaviordispenseitem != IBehaviorDispenseItem.itemDispenseBehaviorProvider && ibehaviordispenseitem != this) + { + ibehaviordispenseitem.dispense(blockSource, eventStack); + return itemStack; + } + } + itembucket = (ItemBucket) CraftItemStack.asNMSCopy(event.getItem()).getItem(); + } + if (itembucket.tryPlaceContainedLiquid(blockSource.getWorld(), i + enumfacing.getFrontOffsetX(), j + enumfacing.getFrontOffsetY(), k + enumfacing.getFrontOffsetZ())) + { + Item item = Items.bucket; + if (--itemStack.stackSize == 0) + { + itemStack.func_150996_a(Items.bucket); + itemStack.stackSize = 1; + } + else if (((TileEntityDispenser) blockSource.getBlockTileEntity()).func_146019_a(new ItemStack(item)) < 0) + { + this.field_150841_b.dispense(blockSource, new ItemStack(item)); + } + return itemStack; + } + else + { + return this.field_150841_b.dispense(blockSource, itemStack); + } + } +} diff --git a/src/main/resources/mixin.umbukkitimpl.json b/src/main/resources/mixin.umbukkitimpl.json index 4fd38ca..0b3aa76 100644 --- a/src/main/resources/mixin.umbukkitimpl.json +++ b/src/main/resources/mixin.umbukkitimpl.json @@ -55,6 +55,18 @@ "world.MixinExplosion", "world.storage.MixinSaveHandler", "fml.network.handshake.MixinChannelRegistrationHandler", - "fml.network.handshake.MixinNetworkDispatcher" + "fml.network.handshake.MixinNetworkDispatcher", + "dispenser.MixinBehaviorDefaultDispenseItem", + "dispenser.MixinBehaviorProjectileDispense", + "init.MixinBootstrapSpawnEggs", + "init.MixinBootstrapFireworks", + "init.MixinBootstrapFireCharge", + "init.MixinBootstrapBoat", + "init.MixinBootstrapLavaBucket", + "init.MixinBootstrapWaterBucket", + "init.MixinBootstrapBucket", + "init.MixinBootstrapFlintAndSteel", + "init.MixinBootstrapDye", + "init.MixinBootstrapTNT" ] } \ No newline at end of file