diff --git a/src/main/java/org/ultramine/mods/bukkit/EventImplProgress.java b/src/main/java/org/ultramine/mods/bukkit/EventImplProgress.java index 504e1b5..2039a84 100644 --- a/src/main/java/org/ultramine/mods/bukkit/EventImplProgress.java +++ b/src/main/java/org/ultramine/mods/bukkit/EventImplProgress.java @@ -196,8 +196,8 @@ reg(false, org.bukkit.event.vehicle.VehicleBlockCollisionEvent.class); reg(false, org.bukkit.event.vehicle.VehicleCollisionEvent.class); reg(false, org.bukkit.event.vehicle.VehicleCreateEvent.class); - reg(false, org.bukkit.event.vehicle.VehicleDamageEvent.class); - reg(false, org.bukkit.event.vehicle.VehicleDestroyEvent.class); + reg(true, org.bukkit.event.vehicle.VehicleDamageEvent.class); + reg(true, org.bukkit.event.vehicle.VehicleDestroyEvent.class); reg(true, org.bukkit.event.vehicle.VehicleEnterEvent.class); reg(false, org.bukkit.event.vehicle.VehicleEntityCollisionEvent.class); reg(true, org.bukkit.event.vehicle.VehicleExitEvent.class); diff --git a/src/main/java/org/ultramine/mods/bukkit/mixin/entity/item/MixinEntityBoat.java b/src/main/java/org/ultramine/mods/bukkit/mixin/entity/item/MixinEntityBoat.java index 54a0795..c05c9b3 100644 --- a/src/main/java/org/ultramine/mods/bukkit/mixin/entity/item/MixinEntityBoat.java +++ b/src/main/java/org/ultramine/mods/bukkit/mixin/entity/item/MixinEntityBoat.java @@ -5,16 +5,23 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.item.EntityBoat; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.DamageSource; import net.minecraft.util.MathHelper; import net.minecraft.world.World; +import org.bukkit.Bukkit; import org.bukkit.craftbukkit.event.CraftEventFactory; +import org.bukkit.entity.Vehicle; +import org.bukkit.event.vehicle.VehicleDamageEvent; +import org.bukkit.event.vehicle.VehicleDestroyEvent; 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 java.util.List; @@ -38,6 +45,8 @@ @Shadow private double boatZ; @Shadow private double boatYaw; @Shadow private double boatPitch; + @Shadow public abstract void setForwardDirection(int p_70269_1_); + @Shadow public abstract int getForwardDirection(); @Overwrite public void onUpdate() @@ -200,11 +209,17 @@ { if (!this.worldObj.isRemote && !this.isDead) { - this.setDead(); - for (l = 0; l < 3; ++l) - this.func_145778_a(Item.getItemFromBlock(Blocks.planks), 1, 0.0F); - for (l = 0; l < 2; ++l) - this.func_145778_a(Items.stick, 1, 0.0F); + Vehicle vehicle = (Vehicle) ((IMixinEntity) this).getBukkitEntity(); + VehicleDestroyEvent destroyEvent = new VehicleDestroyEvent(vehicle, null); + Bukkit.getPluginManager().callEvent(destroyEvent); + if (!destroyEvent.isCancelled()) + { + this.setDead(); + for (l = 0; l < 3; ++l) + this.func_145778_a(Item.getItemFromBlock(Blocks.planks), 1, 0.0F); + for (l = 0; l < 2; ++l) + this.func_145778_a(Items.stick, 1, 0.0F); + } } } else @@ -241,4 +256,51 @@ } } } + + @Overwrite + public boolean attackEntityFrom(DamageSource damageSource, float damage) + { + if(!this.worldObj.isRemote && !this.isDead) + { + if(this.isEntityInvulnerable()) + { + return false; + } + else + { + Vehicle vehicle = (Vehicle) ((IMixinEntity) this).getBukkitEntity(); + org.bukkit.entity.Entity attacker = (damageSource.getEntity() == null) ? null : ((IMixinEntity) damageSource.getEntity()).getBukkitEntity(); + VehicleDamageEvent event = new VehicleDamageEvent(vehicle, attacker, damage); + Bukkit.getPluginManager().callEvent(event); + if (event.isCancelled()) + return true; + damage = (float) event.getDamage(); + this.setForwardDirection(-this.getForwardDirection()); + this.setTimeSinceHit(10); + this.setDamageTaken(this.getDamageTaken() + damage * 10.0F); + this.setBeenAttacked(); + boolean flag = damageSource.getEntity() instanceof EntityPlayer && ((EntityPlayer) damageSource.getEntity()).capabilities.isCreativeMode; + if (flag || this.getDamageTaken() > 40.0F) + { + VehicleDestroyEvent destroyEvent = new VehicleDestroyEvent(vehicle, attacker); + Bukkit.getPluginManager().callEvent(destroyEvent); + if (destroyEvent.isCancelled()) + { + this.setDamageTaken(40F); // Maximize damage so this doesn't get triggered again right away + return true; + } + if (this.riddenByEntity != null) + this.riddenByEntity.mountEntity(this); + if (!flag) + this.func_145778_a(Items.boat, 1, 0.0F); + this.setDead(); + } + return true; + } + } + else + { + return true; + } + } } diff --git a/src/main/java/org/ultramine/mods/bukkit/mixin/entity/item/MixinEntityMinecart.java b/src/main/java/org/ultramine/mods/bukkit/mixin/entity/item/MixinEntityMinecart.java new file mode 100644 index 0000000..11bbeff --- /dev/null +++ b/src/main/java/org/ultramine/mods/bukkit/mixin/entity/item/MixinEntityMinecart.java @@ -0,0 +1,80 @@ +package org.ultramine.mods.bukkit.mixin.entity.item; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.EntityMinecart; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.DamageSource; +import net.minecraft.world.World; +import org.bukkit.Bukkit; +import org.bukkit.entity.Vehicle; +import org.bukkit.event.vehicle.VehicleDamageEvent; +import org.bukkit.event.vehicle.VehicleDestroyEvent; +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; + +@Mixin(EntityMinecart.class) +public abstract class MixinEntityMinecart extends Entity +{ + @Shadow public abstract float getDamage(); + @Shadow public abstract void setRollingAmplitude(int p_70497_1_); + @Shadow public abstract void setRollingDirection(int p_70494_1_); + @Shadow public abstract int getRollingDirection(); + @Shadow public abstract void setDamage(float p_70492_1_); + @Shadow public abstract boolean hasCustomInventoryName(); + @Shadow public abstract void killMinecart(DamageSource p_94095_1_); + + public MixinEntityMinecart(World p_i1582_1_) + { + super(p_i1582_1_); + } + + @Overwrite + public boolean attackEntityFrom(DamageSource damageSource, float damage) + { + if (!this.worldObj.isRemote && !this.isDead) + { + if (this.isEntityInvulnerable()) + { + return false; + } + else + { + Vehicle vehicle = (Vehicle) ((IMixinEntity) this).getBukkitEntity(); + org.bukkit.entity.Entity passenger = (damageSource.getEntity() == null) ? null : ((IMixinEntity) damageSource.getEntity()).getBukkitEntity(); + VehicleDamageEvent event = new VehicleDamageEvent(vehicle, passenger, damage); + Bukkit.getPluginManager().callEvent(event); + if (event.isCancelled()) + return true; + damage = (float) event.getDamage(); + this.setRollingDirection(-this.getRollingDirection()); + this.setRollingAmplitude(10); + this.setBeenAttacked(); + this.setDamage(this.getDamage() + damage * 10.0F); + boolean flag = damageSource.getEntity() instanceof EntityPlayer && ((EntityPlayer) damageSource.getEntity()).capabilities.isCreativeMode; + if (flag || this.getDamage() > 40.0F) + { + if (this.riddenByEntity != null) + this.riddenByEntity.mountEntity(this); + VehicleDestroyEvent destroyEvent = new VehicleDestroyEvent(vehicle, passenger); + Bukkit.getPluginManager().callEvent(destroyEvent); + if (destroyEvent.isCancelled()) + { + this.setDamage(40); // Maximize damage so this doesn't get triggered again right away + return true; + } + if (flag && !this.hasCustomInventoryName()) + this.setDead(); + else + this.killMinecart(damageSource); + } + return true; + } + } + else + { + return true; + } + } +} diff --git a/src/main/resources/mixin.umbukkitimpl.json b/src/main/resources/mixin.umbukkitimpl.json index 5969459..fc2f42f 100644 --- a/src/main/resources/mixin.umbukkitimpl.json +++ b/src/main/resources/mixin.umbukkitimpl.json @@ -61,6 +61,7 @@ "entity.item.MixinEntityFireworkRocket", "entity.item.MixinEntityBoat", "entity.item.MixinEntityFallingBlock", + "entity.item.MixinEntityMinecart", "entity.effect.MixinEntityLightningBolt", "entity.ai.MixinEntityAIEatGrass", "inventory.MixinContainer",