diff --git a/src/main/java/org/ultramine/mods/bukkit/EventImplProgress.java b/src/main/java/org/ultramine/mods/bukkit/EventImplProgress.java index 4a3e940..06a8f6f 100644 --- a/src/main/java/org/ultramine/mods/bukkit/EventImplProgress.java +++ b/src/main/java/org/ultramine/mods/bukkit/EventImplProgress.java @@ -120,7 +120,7 @@ reg(false, org.bukkit.event.entity.SlimeSplitEvent.class); reg(false, org.bukkit.event.hanging.HangingBreakByEntityEvent.class); reg(true, org.bukkit.event.hanging.HangingBreakEvent.class); - reg(false, org.bukkit.event.hanging.HangingPlaceEvent.class); + reg(true, org.bukkit.event.hanging.HangingPlaceEvent.class); reg(false, org.bukkit.event.inventory.BrewEvent.class); reg(false, org.bukkit.event.inventory.CraftItemEvent.class); reg(true, org.bukkit.event.inventory.FurnaceBurnEvent.class); @@ -138,7 +138,7 @@ reg(false, org.bukkit.event.inventory.PrepareItemCraftEvent.class); reg(false, org.bukkit.event.painting.PaintingBreakByEntityEvent.class); reg(true, org.bukkit.event.painting.PaintingBreakEvent.class); - reg(false, org.bukkit.event.painting.PaintingPlaceEvent.class); + reg(true, org.bukkit.event.painting.PaintingPlaceEvent.class); reg(true, org.bukkit.event.player.AsyncPlayerChatEvent.class); reg(false, org.bukkit.event.player.AsyncPlayerPreLoginEvent.class); reg(true, org.bukkit.event.player.PlayerAchievementAwardedEvent.class); diff --git a/src/main/java/org/ultramine/mods/bukkit/mixin/item/MixinItemHangingEntity.java b/src/main/java/org/ultramine/mods/bukkit/mixin/item/MixinItemHangingEntity.java new file mode 100644 index 0000000..49e4685 --- /dev/null +++ b/src/main/java/org/ultramine/mods/bukkit/mixin/item/MixinItemHangingEntity.java @@ -0,0 +1,49 @@ +package org.ultramine.mods.bukkit.mixin.item; + +import net.minecraft.entity.EntityHanging; +import net.minecraft.entity.item.EntityPainting; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemHangingEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import org.bukkit.Bukkit; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.entity.Player; +import org.bukkit.event.hanging.HangingPlaceEvent; +import org.bukkit.event.painting.PaintingPlaceEvent; +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.CallbackInfoReturnable; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; +import org.ultramine.mods.bukkit.interfaces.entity.IMixinEntity; +import org.ultramine.mods.bukkit.interfaces.world.IMixinWorld; + +@Mixin(ItemHangingEntity.class) +public class MixinItemHangingEntity +{ + @Inject(method = "onItemUse", cancellable = true, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;spawnEntityInWorld(Lnet/minecraft/entity/Entity;)Z", shift = Shift.BEFORE), locals = LocalCapture.CAPTURE_FAILEXCEPTION) + private void onItemUse(ItemStack itemStack, EntityPlayer player, World world, int x, int y, int z, int notch, float p_77648_8_, float p_77648_9_, float p_77648_10_, CallbackInfoReturnable cir, int i1, EntityHanging entityHanging) + { + Player who = (Player) ((IMixinEntity) player).getBukkitEntity(); + Block blockClicked = ((IMixinWorld) world).getWorld().getBlockAt(x, y, z); + BlockFace blockFace = org.bukkit.craftbukkit.block.CraftBlock.notchToBlockFace(notch); + HangingPlaceEvent event = new HangingPlaceEvent((org.bukkit.entity.Hanging) ((IMixinEntity) entityHanging).getBukkitEntity(), who, blockClicked, blockFace); + Bukkit.getPluginManager().callEvent(event); + PaintingPlaceEvent paintingEvent = null; + if (entityHanging instanceof EntityPainting) + { + // Fire old painting event until it can be removed + paintingEvent = new PaintingPlaceEvent((org.bukkit.entity.Painting) ((IMixinEntity) entityHanging).getBukkitEntity(), who, blockClicked, blockFace); + paintingEvent.setCancelled(event.isCancelled()); + Bukkit.getPluginManager().callEvent(paintingEvent); + } + if (event.isCancelled() || (paintingEvent != null && paintingEvent.isCancelled())) + { + cir.setReturnValue(false); + cir.cancel(); + } + } +} diff --git a/src/main/java/org/ultramine/mods/bukkit/mixin/item/MixinItemLead.java b/src/main/java/org/ultramine/mods/bukkit/mixin/item/MixinItemLead.java new file mode 100644 index 0000000..6643b22 --- /dev/null +++ b/src/main/java/org/ultramine/mods/bukkit/mixin/item/MixinItemLead.java @@ -0,0 +1,57 @@ +package org.ultramine.mods.bukkit.mixin.item; + +import net.minecraft.entity.EntityLeashKnot; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemLead; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.World; +import org.bukkit.Bukkit; +import org.bukkit.block.BlockFace; +import org.bukkit.entity.Hanging; +import org.bukkit.entity.Player; +import org.bukkit.event.hanging.HangingPlaceEvent; +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.List; + +@Mixin(ItemLead.class) +public class MixinItemLead +{ + @Overwrite + public static boolean func_150909_a(EntityPlayer player, World world, int x, int y, int z) + { + EntityLeashKnot entityLeashKnot = EntityLeashKnot.getKnotForBlock(world, x, y, z); + double d0 = 7.0D; + boolean flag = false; + List list = world.getEntitiesWithinAABB(EntityLiving.class, AxisAlignedBB.getBoundingBox(x - d0, y - d0, z - d0, x + d0, y + d0, z + d0)); + if (list != null) + { + for (Object entityLivingObject : list) + { + EntityLiving entityLiving = (EntityLiving) entityLivingObject; + if (entityLiving.getLeashed() && entityLiving.getLeashedToEntity() == player) + { + if (entityLeashKnot == null) + { + entityLeashKnot = EntityLeashKnot.func_110129_a(world, x, y, z); + HangingPlaceEvent event = new HangingPlaceEvent((Hanging) ((IMixinEntity) entityLeashKnot).getBukkitEntity(), player != null ? (Player) ((IMixinEntity) player).getBukkitEntity() : null, ((IMixinWorld) world).getWorld().getBlockAt(x, y, z), BlockFace.SELF); + Bukkit.getPluginManager().callEvent(event); + if (event.isCancelled()) + { + entityLeashKnot.setDead(); + return false; + } + } + // TODO: callPlayerLeashEntityEvent + entityLiving.setLeashedToEntity(entityLeashKnot, true); + flag = true; + } + } + } + return flag; + } +} diff --git a/src/main/resources/mixin.umbukkitimpl.json b/src/main/resources/mixin.umbukkitimpl.json index 3bba887..eebf89d 100644 --- a/src/main/resources/mixin.umbukkitimpl.json +++ b/src/main/resources/mixin.umbukkitimpl.json @@ -80,6 +80,8 @@ "inventory.MixinAnimalChest", "item.MixinItemFlintAndSteel", "item.MixinItemBucket", + "item.MixinItemHangingEntity", + "item.MixinItemLead", "item.crafting.MixinShapedRecipes", "item.crafting.MixinShapelessRecipes", "management.MixinBanEntry",