summaryrefslogtreecommitdiffstats
path: root/src/main/java/net/minecraft/server
diff options
context:
space:
mode:
authort00thpick1 <t00thpick1dirko@gmail.com>2014-06-19 14:38:45 -0400
committerWesley Wolfe <wesley.d.wolfe+git@gmail.com>2014-06-22 15:23:16 -0500
commit6f21d3ca8fb02001dd10f49019cfb05ed914a873 (patch)
tree304ff9a4e85d2ba38a61e9b4ead339266ddbbbd6 /src/main/java/net/minecraft/server
parentbed3f7f8f54305c94356691d6b8ec9b65a1a5d4a (diff)
downloadcraftbukkit-6f21d3ca8fb02001dd10f49019cfb05ed914a873.tar
craftbukkit-6f21d3ca8fb02001dd10f49019cfb05ed914a873.tar.gz
craftbukkit-6f21d3ca8fb02001dd10f49019cfb05ed914a873.tar.lz
craftbukkit-6f21d3ca8fb02001dd10f49019cfb05ed914a873.tar.xz
craftbukkit-6f21d3ca8fb02001dd10f49019cfb05ed914a873.zip
[Bleeding] Implement new damage api. Fixes BUKKIT-5326, BUKKIT-3878.
This commit centralizes event handling to where damage is actually applied to the entity to avoid bugs that have resulted from nodamageticks, modifications to damage after the event has been called, and similar mishaps. This also implements new API for getting and setting of modifications made to the damage amount actually applied to the entity. This is done by storing the change in the damage amount as each modifier is applied by vanilla code. The method that actually damages the armor worn by an entity has been relocated beneath the event called as to not apply durability loss when the event has been cancelled.
Diffstat (limited to 'src/main/java/net/minecraft/server')
-rw-r--r--src/main/java/net/minecraft/server/BlockCactus.java22
-rw-r--r--src/main/java/net/minecraft/server/Entity.java35
-rw-r--r--src/main/java/net/minecraft/server/EntityEnderDragon.java14
-rw-r--r--src/main/java/net/minecraft/server/EntityEnderPearl.java14
-rw-r--r--src/main/java/net/minecraft/server/EntityFallingBlock.java18
-rw-r--r--src/main/java/net/minecraft/server/EntityFireball.java10
-rw-r--r--src/main/java/net/minecraft/server/EntityHorse.java27
-rw-r--r--src/main/java/net/minecraft/server/EntityHuman.java8
-rw-r--r--src/main/java/net/minecraft/server/EntityItemFrame.java3
-rw-r--r--src/main/java/net/minecraft/server/EntityLiving.java125
-rw-r--r--src/main/java/net/minecraft/server/Explosion.java65
11 files changed, 149 insertions, 192 deletions
diff --git a/src/main/java/net/minecraft/server/BlockCactus.java b/src/main/java/net/minecraft/server/BlockCactus.java
index 57eb59d6..e920c6f4 100644
--- a/src/main/java/net/minecraft/server/BlockCactus.java
+++ b/src/main/java/net/minecraft/server/BlockCactus.java
@@ -2,7 +2,7 @@ package net.minecraft.server;
import java.util.Random;
-import org.bukkit.event.entity.EntityDamageByBlockEvent; // CraftBukkit
+import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit
public class BlockCactus extends Block {
@@ -24,7 +24,7 @@ public class BlockCactus extends Block {
int i1 = world.getData(i, j, k);
if (i1 == 15) {
- org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(world, i, j + 1, k, this, 0); // CraftBukkit
+ CraftEventFactory.handleBlockGrowEvent(world, i, j + 1, k, this, 0); // CraftBukkit
world.setData(i, j, k, 0, 4);
this.doPhysics(world, i, j + 1, k, this);
} else {
@@ -79,22 +79,8 @@ public class BlockCactus extends Block {
}
public void a(World world, int i, int j, int k, Entity entity) {
- // CraftBukkit start - EntityDamageByBlock event
- if (entity instanceof EntityLiving) {
- org.bukkit.block.Block damager = world.getWorld().getBlockAt(i, j, k);
- org.bukkit.entity.Entity damagee = (entity == null) ? null : entity.getBukkitEntity();
-
- EntityDamageByBlockEvent event = new EntityDamageByBlockEvent(damager, damagee, org.bukkit.event.entity.EntityDamageEvent.DamageCause.CONTACT, 1D);
- world.getServer().getPluginManager().callEvent(event);
-
- if (!event.isCancelled()) {
- damagee.setLastDamageCause(event);
- entity.damageEntity(DamageSource.CACTUS, (float) event.getDamage());
- }
- return;
- }
- // CraftBukkit end
-
+ CraftEventFactory.blockDamage = world.getWorld().getBlockAt(i, j, k); // CraftBukkit
entity.damageEntity(DamageSource.CACTUS, 1.0F);
+ CraftEventFactory.blockDamage = null; // CraftBukkit
}
}
diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java
index 04f5bc68..7b975767 100644
--- a/src/main/java/net/minecraft/server/Entity.java
+++ b/src/main/java/net/minecraft/server/Entity.java
@@ -24,9 +24,8 @@ import org.bukkit.event.vehicle.VehicleExitEvent;
import org.bukkit.craftbukkit.CraftWorld;
import org.bukkit.craftbukkit.entity.CraftEntity;
import org.bukkit.craftbukkit.entity.CraftPlayer;
+import org.bukkit.craftbukkit.event.CraftEventFactory;
import org.bukkit.event.entity.EntityCombustEvent;
-import org.bukkit.event.entity.EntityDamageByBlockEvent;
-import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityPortalEvent;
import org.bukkit.plugin.PluginManager;
// CraftBukkit end
@@ -349,26 +348,17 @@ public abstract class Entity {
protected void D() {
if (!this.fireProof) {
+ this.damageEntity(DamageSource.LAVA, 4);
+
// CraftBukkit start - Fallen in lava TODO: this event spams!
if (this instanceof EntityLiving) {
- Server server = this.world.getServer();
-
- // TODO: shouldn't be sending null for the block.
- org.bukkit.block.Block damager = null; // ((WorldServer) this.l).getWorld().getBlockAt(i, j, k);
- org.bukkit.entity.Entity damagee = this.getBukkitEntity();
-
- EntityDamageByBlockEvent event = new EntityDamageByBlockEvent(damager, damagee, EntityDamageEvent.DamageCause.LAVA, 4D);
- server.getPluginManager().callEvent(event);
-
- if (!event.isCancelled()) {
- damagee.setLastDamageCause(event);
- this.damageEntity(DamageSource.LAVA, (float) event.getDamage());
- }
-
if (this.fireTicks <= 0) {
// not on fire yet
+ // TODO: shouldn't be sending null for the block.
+ org.bukkit.block.Block damager = null; // ((WorldServer) this.l).getWorld().getBlockAt(i, j, k);
+ org.bukkit.entity.Entity damagee = this.getBukkitEntity();
EntityCombustEvent combustEvent = new org.bukkit.event.entity.EntityCombustByBlockEvent(damager, damagee, 15);
- server.getPluginManager().callEvent(combustEvent);
+ this.world.getServer().getPluginManager().callEvent(combustEvent);
if (!combustEvent.isCancelled()) {
this.setOnFire(combustEvent.getDuration());
@@ -381,7 +371,6 @@ public abstract class Entity {
}
// CraftBukkit end - we also don't throw an event unless the object in lava is living, to save on some event calls
- this.damageEntity(DamageSource.LAVA, 4);
this.setOnFire(15);
}
}
@@ -1617,12 +1606,14 @@ public abstract class Entity {
}
}
- EntityDamageEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityDamageEvent(entitylightning, this, EntityDamageEvent.DamageCause.LIGHTNING, 5D);
- if (event.isCancelled()) {
+ if (this.fireProof) {
+ return;
+ }
+ CraftEventFactory.entityDamage = entitylightning;
+ if (!this.damageEntity(DamageSource.FIRE, 5.0F)) {
+ CraftEventFactory.entityDamage = null;
return;
}
-
- this.burn((float) event.getDamage());
// CraftBukkit end
++this.fireTicks;
diff --git a/src/main/java/net/minecraft/server/EntityEnderDragon.java b/src/main/java/net/minecraft/server/EntityEnderDragon.java
index dbf30cb8..f50d8f68 100644
--- a/src/main/java/net/minecraft/server/EntityEnderDragon.java
+++ b/src/main/java/net/minecraft/server/EntityEnderDragon.java
@@ -5,9 +5,9 @@ import java.util.List;
// CraftBukkit start
import org.bukkit.block.BlockState;
+import org.bukkit.craftbukkit.event.CraftEventFactory;
import org.bukkit.craftbukkit.util.BlockStateListPopulator;
import org.bukkit.event.entity.EntityCreatePortalEvent;
-import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityExplodeEvent;
import org.bukkit.event.entity.EntityRegainHealthEvent;
import org.bukkit.event.entity.EntityTargetEvent;
@@ -302,15 +302,9 @@ public class EntityEnderDragon extends EntityInsentient implements IComplex, IMo
if (this.bC != null) {
if (this.bC.dead) {
if (!this.world.isStatic) {
- // CraftBukkit start
- EntityDamageEvent event = new EntityDamageEvent(this.getBukkitEntity(), org.bukkit.event.entity.EntityDamageEvent.DamageCause.ENTITY_EXPLOSION, 10.0F);
- Bukkit.getPluginManager().callEvent(event);
-
- if (!event.isCancelled()) {
- getBukkitEntity().setLastDamageCause(event);
- this.a(this.bq, DamageSource.explosion((Explosion) null), (float) event.getDamage());
- }
- // CraftBukkit end
+ CraftEventFactory.entityDamage = this.bC; // CraftBukkit
+ this.a(this.bq, DamageSource.explosion((Explosion) null), 10.0F);
+ CraftEventFactory.entityDamage = null; // CraftBukkit
}
this.bC = null;
diff --git a/src/main/java/net/minecraft/server/EntityEnderPearl.java b/src/main/java/net/minecraft/server/EntityEnderPearl.java
index 9e4526e3..63906678 100644
--- a/src/main/java/net/minecraft/server/EntityEnderPearl.java
+++ b/src/main/java/net/minecraft/server/EntityEnderPearl.java
@@ -2,7 +2,7 @@ package net.minecraft.server;
// CraftBukkit start
import org.bukkit.Bukkit;
-import org.bukkit.event.entity.EntityDamageByEntityEvent;
+import org.bukkit.craftbukkit.event.CraftEventFactory;
import org.bukkit.event.player.PlayerTeleportEvent;
// CraftBukkit end
@@ -42,15 +42,9 @@ public class EntityEnderPearl extends EntityProjectile {
if (!teleEvent.isCancelled() && !entityplayer.playerConnection.isDisconnected()) {
entityplayer.playerConnection.teleport(teleEvent.getTo());
this.getShooter().fallDistance = 0.0F;
-
- EntityDamageByEntityEvent damageEvent = new EntityDamageByEntityEvent(this.getBukkitEntity(), player, EntityDamageByEntityEvent.DamageCause.FALL, 5.0D);
- Bukkit.getPluginManager().callEvent(damageEvent);
-
- if (!damageEvent.isCancelled() && !entityplayer.playerConnection.isDisconnected()) {
- entityplayer.invulnerableTicks = -1; // Remove spawning invulnerability
- player.setLastDamageCause(damageEvent);
- entityplayer.damageEntity(DamageSource.FALL, (float) damageEvent.getDamage());
- }
+ CraftEventFactory.entityDamage = this;
+ this.getShooter().damageEntity(DamageSource.FALL, 5.0F);
+ CraftEventFactory.entityDamage = null;
}
// CraftBukkit end
}
diff --git a/src/main/java/net/minecraft/server/EntityFallingBlock.java b/src/main/java/net/minecraft/server/EntityFallingBlock.java
index bc512172..e0b99367 100644
--- a/src/main/java/net/minecraft/server/EntityFallingBlock.java
+++ b/src/main/java/net/minecraft/server/EntityFallingBlock.java
@@ -3,10 +3,7 @@ package net.minecraft.server;
import java.util.ArrayList;
import java.util.Iterator;
-// CraftBukkit start
-import org.bukkit.craftbukkit.event.CraftEventFactory;
-import org.bukkit.event.entity.EntityDamageEvent;
-// CraftBukkit end
+import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit
public class EntityFallingBlock extends Entity {
@@ -156,16 +153,9 @@ public class EntityFallingBlock extends Entity {
while (iterator.hasNext()) {
Entity entity = (Entity) iterator.next();
- // CraftBukkit start
- float damage = (float) Math.min(MathHelper.d((float) i * this.fallHurtAmount), this.fallHurtMax);
-
- EntityDamageEvent event = CraftEventFactory.callEntityDamageEvent(this, entity, EntityDamageEvent.DamageCause.FALLING_BLOCK, damage);
- if (event.isCancelled()) {
- continue;
- }
-
- entity.damageEntity(damagesource, (float) event.getDamage());
- // CraftBukkit end
+ CraftEventFactory.entityDamage = this; // CraftBukkit
+ entity.damageEntity(damagesource, (float) Math.min(MathHelper.d((float) i * this.fallHurtAmount), this.fallHurtMax));
+ CraftEventFactory.entityDamage = null; // CraftBukkit
}
if (flag && (double) this.random.nextFloat() < 0.05000000074505806D + (double) i * 0.05D) {
diff --git a/src/main/java/net/minecraft/server/EntityFireball.java b/src/main/java/net/minecraft/server/EntityFireball.java
index 0eecaad4..d30ef5b8 100644
--- a/src/main/java/net/minecraft/server/EntityFireball.java
+++ b/src/main/java/net/minecraft/server/EntityFireball.java
@@ -2,7 +2,7 @@ package net.minecraft.server;
import java.util.List;
-import org.bukkit.event.entity.EntityDamageByEntityEvent; // CraftBukkit
+import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit
public abstract class EntityFireball extends Entity {
@@ -132,7 +132,7 @@ public abstract class EntityFireball extends Entity {
// CraftBukkit start - Fire ProjectileHitEvent
if (this.dead) {
- org.bukkit.craftbukkit.event.CraftEventFactory.callProjectileHitEvent(this);
+ CraftEventFactory.callProjectileHitEvent(this);
}
// CraftBukkit end
}
@@ -235,11 +235,7 @@ public abstract class EntityFireball extends Entity {
this.P();
if (damagesource.getEntity() != null) {
// CraftBukkit start
- EntityDamageByEntityEvent event = new EntityDamageByEntityEvent(damagesource.getEntity().getBukkitEntity(), this.getBukkitEntity(), org.bukkit.event.entity.EntityDamageEvent.DamageCause.ENTITY_ATTACK, f);
-
- world.getServer().getPluginManager().callEvent(event);
-
- if (event.isCancelled()) {
+ if (!CraftEventFactory.handleNonLivingEntityDamageEvent(this, damagesource, f)) {
return false;
}
// CraftBukkit end
diff --git a/src/main/java/net/minecraft/server/EntityHorse.java b/src/main/java/net/minecraft/server/EntityHorse.java
index 544c0082..71388622 100644
--- a/src/main/java/net/minecraft/server/EntityHorse.java
+++ b/src/main/java/net/minecraft/server/EntityHorse.java
@@ -3,11 +3,7 @@ package net.minecraft.server;
import java.util.Iterator;
import java.util.List;
-// CraftBukkit start
-import org.bukkit.craftbukkit.event.CraftEventFactory;
-import org.bukkit.event.entity.EntityDamageEvent;
-import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason;
-// CraftBukkit end
+import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason; // CraftBukkit
public class EntityHorse extends EntityAnimal implements IInventoryListener {
@@ -294,26 +290,9 @@ public class EntityHorse extends EntityAnimal implements IInventoryListener {
int i = MathHelper.f(f * 0.5F - 3.0F);
if (i > 0) {
- // CraftBukkit start - fire EntityDamageEvent
- EntityDamageEvent event = CraftEventFactory.callEntityDamageEvent(null, this, EntityDamageEvent.DamageCause.FALL, i);
- if (!event.isCancelled()) {
- float damage = (float) event.getDamage();
- if (damage > 0) {
- this.getBukkitEntity().setLastDamageCause(event);
- this.damageEntity(DamageSource.FALL, damage);
- }
- }
-
+ this.damageEntity(DamageSource.FALL, (float) i);
if (this.passenger != null) {
- EntityDamageEvent passengerEvent = CraftEventFactory.callEntityDamageEvent(null, this.passenger, EntityDamageEvent.DamageCause.FALL, i);
- if (!passengerEvent.isCancelled() && this.passenger != null) { // Check again in case of plugin
- float damage = (float) passengerEvent.getDamage();
- if (damage > 0) {
- this.passenger.getBukkitEntity().setLastDamageCause(passengerEvent);
- this.passenger.damageEntity(DamageSource.FALL, damage);
- }
- }
- // CraftBukkit end
+ this.passenger.damageEntity(DamageSource.FALL, (float) i);
}
Block block = this.world.getType(MathHelper.floor(this.locX), MathHelper.floor(this.locY - 0.2D - (double) this.lastYaw), MathHelper.floor(this.locZ));
diff --git a/src/main/java/net/minecraft/server/EntityHuman.java b/src/main/java/net/minecraft/server/EntityHuman.java
index 381ba316..a5dfcf4b 100644
--- a/src/main/java/net/minecraft/server/EntityHuman.java
+++ b/src/main/java/net/minecraft/server/EntityHuman.java
@@ -799,7 +799,12 @@ public abstract class EntityHuman extends EntityLiving implements ICommandListen
return (float) i / (float) this.inventory.armor.length;
}
- protected void d(DamageSource damagesource, float f) {
+ // CraftBukkit start
+ protected boolean d(DamageSource damagesource, float f) { // void -> boolean
+ if (true) {
+ return super.d(damagesource, f);
+ }
+ // CraftBukkit end
if (!this.isInvulnerable()) {
if (!damagesource.ignoresArmor() && this.isBlocking() && f > 0.0F) {
f = (1.0F + f) * 0.5F;
@@ -819,6 +824,7 @@ public abstract class EntityHuman extends EntityLiving implements ICommandListen
this.aV().a(damagesource, f2, f);
}
}
+ return false; // CraftBukkit
}
public void openFurnace(TileEntityFurnace tileentityfurnace) {}
diff --git a/src/main/java/net/minecraft/server/EntityItemFrame.java b/src/main/java/net/minecraft/server/EntityItemFrame.java
index 8d39f5f4..940e7c86 100644
--- a/src/main/java/net/minecraft/server/EntityItemFrame.java
+++ b/src/main/java/net/minecraft/server/EntityItemFrame.java
@@ -24,8 +24,7 @@ public class EntityItemFrame extends EntityHanging {
} else if (this.getItem() != null) {
if (!this.world.isStatic) {
// CraftBukkit start - fire EntityDamageEvent
- org.bukkit.event.entity.EntityDamageEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.handleEntityDamageEvent(this, damagesource, f);
- if ((event != null && event.isCancelled()) || this.dead) {
+ if (!org.bukkit.craftbukkit.event.CraftEventFactory.handleNonLivingEntityDamageEvent(this, damagesource, f) || this.dead) {
return true;
}
// CraftBukkit end
diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java
index b3bf43ae..095a97f8 100644
--- a/src/main/java/net/minecraft/server/EntityLiving.java
+++ b/src/main/java/net/minecraft/server/EntityLiving.java
@@ -11,6 +11,7 @@ import java.util.UUID;
import java.util.ArrayList;
import org.bukkit.craftbukkit.event.CraftEventFactory;
import org.bukkit.event.entity.EntityDamageEvent;
+import org.bukkit.event.entity.EntityDamageEvent.DamageModifier;
import org.bukkit.event.entity.EntityRegainHealthEvent;
// CraftBukkit end
@@ -646,7 +647,8 @@ public abstract class EntityLiving extends Entity {
} else if (damagesource.o() && this.hasEffect(MobEffectList.FIRE_RESISTANCE)) {
return false;
} else {
- if ((damagesource == DamageSource.ANVIL || damagesource == DamageSource.FALLING_BLOCK) && this.getEquipment(4) != null) {
+ // CraftBukkit - Moved into d(DamageSource, float)
+ if (false && (damagesource == DamageSource.ANVIL || damagesource == DamageSource.FALLING_BLOCK) && this.getEquipment(4) != null) {
this.getEquipment(4).damage((int) (f * 4.0F + this.random.nextFloat() * f * 2.0F), this);
f *= 0.75F;
}
@@ -654,29 +656,28 @@ public abstract class EntityLiving extends Entity {
this.aF = 1.5F;
boolean flag = true;
- // CraftBukkit start
- EntityDamageEvent event = CraftEventFactory.handleEntityDamageEvent(this, damagesource, f);
- if (event != null) {
- if (event.isCancelled()) {
- return false;
- }
- f = (float) event.getDamage();
- }
- // CraftBukkit end
-
if ((float) this.noDamageTicks > (float) this.maxNoDamageTicks / 2.0F) {
if (f <= this.lastDamage) {
return false;
}
- this.d(damagesource, f - this.lastDamage);
+ // CraftBukkit start
+ if (!this.d(damagesource, f - this.lastDamage)) {
+ return false;
+ }
+ // CraftBukkit end
this.lastDamage = f;
flag = false;
} else {
+ // CraftBukkit start
+ float previousHealth = this.getHealth();
+ if (!this.d(damagesource, f)) {
+ return false;
+ }
this.lastDamage = f;
- this.aw = this.getHealth();
+ this.aw = previousHealth;
this.noDamageTicks = this.maxNoDamageTicks;
- this.d(damagesource, f);
+ // CraftBukkit end
this.hurtTicks = this.ay = 10;
}
@@ -856,25 +857,16 @@ public abstract class EntityLiving extends Entity {
super.b(f);
MobEffect mobeffect = this.getEffect(MobEffectList.JUMP);
float f1 = mobeffect != null ? (float) (mobeffect.getAmplifier() + 1) : 0.0F;
- // CraftBukkit start
- float i = MathHelper.f(f - 3.0F - f1);
+ int i = MathHelper.f(f - 3.0F - f1);
if (i > 0) {
- EntityDamageEvent event = CraftEventFactory.callEntityDamageEvent(null, this, EntityDamageEvent.DamageCause.FALL, i);
- if (event.isCancelled()) {
+ // CraftBukkit start
+ if (!this.damageEntity(DamageSource.FALL, (float) i)) {
return;
}
-
- i = (float) event.getDamage();
- if (i > 0) {
- this.getBukkitEntity().setLastDamageCause(event);
- }
- }
- // CraftBukkit end
-
- if (i > 0) {
- this.makeSound(this.o(org.bukkit.util.NumberConversions.ceil(i)), 1.0F, 1.0F); // CraftBukkit - ceil
- this.damageEntity(DamageSource.FALL, (float) i);
+ // CraftBukkit end
+ this.makeSound(this.o(i), 1.0F, 1.0F);
+ // this.damageEntity(DamageSource.FALL, (float) i); // CraftBukkit - moved up
int j = MathHelper.floor(this.locX);
int k = MathHelper.floor(this.locY - 0.20000000298023224D - (double) this.height);
int l = MathHelper.floor(this.locZ);
@@ -917,7 +909,7 @@ public abstract class EntityLiving extends Entity {
int i = 25 - this.aU();
float f1 = f * (float) i;
- this.h(f);
+ // this.h(f); // CraftBukkit - Moved into d(DamageSource, float)
f = f1 / 25.0F;
}
@@ -936,7 +928,8 @@ public abstract class EntityLiving extends Entity {
int j;
float f1;
- if (this.hasEffect(MobEffectList.RESISTANCE) && damagesource != DamageSource.OUT_OF_WORLD) {
+ // CraftBukkit - Moved to d(DamageSource, float)
+ if (false && this.hasEffect(MobEffectList.RESISTANCE) && damagesource != DamageSource.OUT_OF_WORLD) {
i = (this.getEffect(MobEffectList.RESISTANCE).getAmplifier() + 1) * 5;
j = 25 - i;
f1 = f * (float) j;
@@ -962,22 +955,88 @@ public abstract class EntityLiving extends Entity {
}
}
- protected void d(DamageSource damagesource, float f) {
+ // CraftBukkit start
+ protected boolean d(DamageSource damagesource, float f) { // void -> boolean
if (!this.isInvulnerable()) {
+ boolean human = this instanceof EntityHuman;
+ float originalDamage = f;
+ float preDamage = f;
+ float hardHatModifier = 0;
+ if ((damagesource == DamageSource.ANVIL || damagesource == DamageSource.FALLING_BLOCK) && this.getEquipment(4) != null) {
+ f *= 0.75F;
+ hardHatModifier = preDamage - f;
+ preDamage = f;
+ }
+ float blockingModifier = 0;
+ if (human) {
+ if (!damagesource.ignoresArmor() && ((EntityHuman) this).isBlocking() && f > 0.0F) {
+ f = (1.0F + f) * 0.5F;
+ blockingModifier = preDamage - f;
+ preDamage = f;
+ }
+ }
+ // Armor modifier
f = this.b(damagesource, f);
+ float armorModifier = preDamage - f;
+ preDamage = f;
+ // Resistance Potion Effect
+ if (!damagesource.h() && this.hasEffect(MobEffectList.RESISTANCE) && damagesource != DamageSource.OUT_OF_WORLD) {
+ int i = (this.getEffect(MobEffectList.RESISTANCE).getAmplifier() + 1) * 5;
+ int j = 25 - i;
+ float f1 = f * (float) j;
+ f = f1 / 25.0F;
+ }
+ float resistanceModifier = preDamage - f;
+ preDamage = f;
+ // Magic modifier
f = this.c(damagesource, f);
+ float magicModifier = preDamage - f;
float f1 = f;
+ // Absorption modifier
f = Math.max(f - this.br(), 0.0F);
- this.m(this.br() - (f1 - f));
+ float absorptionModifier = Math.max(f1 - f, 0.0F);
+
+ EntityDamageEvent event = CraftEventFactory.handleLivingEntityDamageEvent(this, damagesource, originalDamage, -hardHatModifier, -blockingModifier, -armorModifier, -resistanceModifier, -magicModifier, -absorptionModifier);
+
+ if (event.isCancelled()) {
+ return false;
+ }
+
+ f = (float) event.getFinalDamage();
+
+ // Apply damage to helmet
+ if ((damagesource == DamageSource.ANVIL || damagesource == DamageSource.FALLING_BLOCK) && this.getEquipment(4) != null) {
+ this.getEquipment(4).damage((int) (event.getDamage() * 4.0F + this.random.nextFloat() * event.getDamage() * 2.0F), this);
+ }
+
+ // Apply damage to armor
+ if (!damagesource.ignoresArmor()) {
+ float armorDamage = (float) (event.getDamage() + event.getDamage(DamageModifier.BLOCKING) + event.getDamage(DamageModifier.HARD_HAT));
+ this.h(armorDamage);
+ }
+
+ absorptionModifier = (float) -event.getDamage(DamageModifier.ABSORPTION);
+ this.m(Math.max(this.br() - absorptionModifier, 0.0F));
if (f != 0.0F) {
+ if (human) {
+ ((EntityHuman) this).a(damagesource.f());
+ }
+ // CraftBukkit end
float f2 = this.getHealth();
this.setHealth(f2 - f);
this.aV().a(damagesource, f2, f);
+ // CraftBukkit start
+ if (human) {
+ return true;
+ }
+ // CraftBukkit end
this.m(this.br() - f);
}
+ return true; // CraftBukkit
}
+ return false; // CraftBukkit
}
public CombatTracker aV() {
diff --git a/src/main/java/net/minecraft/server/Explosion.java b/src/main/java/net/minecraft/server/Explosion.java
index 11007d40..56fa9998 100644
--- a/src/main/java/net/minecraft/server/Explosion.java
+++ b/src/main/java/net/minecraft/server/Explosion.java
@@ -9,10 +9,7 @@ import java.util.Map;
import java.util.Random;
// CraftBukkit start
-import org.bukkit.Bukkit;
-import org.bukkit.event.entity.EntityDamageByBlockEvent;
-import org.bukkit.event.entity.EntityDamageByEntityEvent;
-import org.bukkit.event.entity.EntityDamageEvent;
+import org.bukkit.craftbukkit.event.CraftEventFactory;
import org.bukkit.event.entity.EntityExplodeEvent;
import org.bukkit.Location;
// CraftBukkit end
@@ -130,55 +127,21 @@ public class Explosion {
double d9 = (double) this.world.a(vec3d, entity.boundingBox);
double d10 = (1.0D - d7) * d9;
- // CraftBukkit start - Explosion damage hook
- org.bukkit.entity.Entity damagee = (entity == null) ? null : entity.getBukkitEntity();
- float damageDone = (float) ((int) ((d10 * d10 + d10) / 2.0D * 8.0D * (double) this.size + 1.0D));
-
- if (damagee == null) {
- // nothing was hurt
- } else if (this.source == null) { // Block explosion (without an entity source; bed etc.)
- EntityDamageByBlockEvent event = new EntityDamageByBlockEvent(null, damagee, EntityDamageEvent.DamageCause.BLOCK_EXPLOSION, damageDone);
- Bukkit.getPluginManager().callEvent(event);
-
- if (!event.isCancelled()) {
- damagee.setLastDamageCause(event);
- entity.damageEntity(DamageSource.explosion(this), (float) event.getDamage());
- double d11 = EnchantmentProtection.a(entity, d10);
-
- entity.motX += d0 * d11;
- entity.motY += d1 * d11;
- entity.motZ += d2 * d11;
- if (entity instanceof EntityHuman) {
- this.l.put((EntityHuman) entity, Vec3D.a(d0 * d10, d1 * d10, d2 * d10));
- }
- }
- } else {
- final org.bukkit.entity.Entity damager = this.source.getBukkitEntity();
- final EntityDamageEvent.DamageCause damageCause;
-
- if (damager instanceof org.bukkit.entity.TNTPrimed) {
- damageCause = EntityDamageEvent.DamageCause.BLOCK_EXPLOSION;
- } else {
- damageCause = EntityDamageEvent.DamageCause.ENTITY_EXPLOSION;
- }
-
- EntityDamageByEntityEvent event = new EntityDamageByEntityEvent(damager, damagee, damageCause, damageDone);
- Bukkit.getPluginManager().callEvent(event);
-
- if (!event.isCancelled()) {
- entity.getBukkitEntity().setLastDamageCause(event);
- entity.damageEntity(DamageSource.explosion(this), (float) event.getDamage());
- double d11 = EnchantmentProtection.a(entity, d10);
-
- entity.motX += d0 * d11;
- entity.motY += d1 * d11;
- entity.motZ += d2 * d11;
- if (entity instanceof EntityHuman) {
- this.l.put((EntityHuman) entity, Vec3D.a(d0 * d10, d1 * d10, d2 * d10));
- }
- }
+ // CraftBukkit start
+ CraftEventFactory.entityDamage = source;
+ if (!entity.damageEntity(DamageSource.explosion(this), (float) ((int) ((d10 * d10 + d10) / 2.0D * 8.0D * (double) this.size + 1.0D)))) {
+ CraftEventFactory.entityDamage = null;
+ continue;
}
// CraftBukkit end
+ double d11 = EnchantmentProtection.a(entity, d10);
+
+ entity.motX += d0 * d11;
+ entity.motY += d1 * d11;
+ entity.motZ += d2 * d11;
+ if (entity instanceof EntityHuman) {
+ this.l.put((EntityHuman) entity, Vec3D.a(d0 * d10, d1 * d10, d2 * d10));
+ }
}
}
}