mirror of
https://github.com/PaperMC/Paper.git
synced 2025-01-04 18:12:09 +01:00
SPIGOT-7365: DamageCause blocked by shield should trigger invulnerableTime
By: LoliColleen <76620594+LoliColleen@users.noreply.github.com>
This commit is contained in:
parent
a3b76ef171
commit
5602bd9758
1 changed files with 56 additions and 32 deletions
|
@ -428,7 +428,7 @@
|
|||
this.hurtHelmet(damagesource, f);
|
||||
f *= 0.75F;
|
||||
}
|
||||
@@ -1212,18 +1430,27 @@
|
||||
@@ -1212,18 +1430,33 @@
|
||||
this.walkAnimation.setSpeed(1.5F);
|
||||
boolean flag1 = true;
|
||||
|
||||
|
@ -443,6 +443,9 @@
|
|||
+ if (!this.actuallyHurt(damagesource, f - this.lastHurt)) {
|
||||
+ return false;
|
||||
+ }
|
||||
+ if (this instanceof EntityPlayer && f == 0) { // CraftBukkit - Player entities can't be hurt by 0 damage
|
||||
+ return false;
|
||||
+ }
|
||||
+ // CraftBukkit end
|
||||
this.lastHurt = f;
|
||||
flag1 = false;
|
||||
|
@ -450,6 +453,9 @@
|
|||
+ // CraftBukkit start
|
||||
+ if (!this.actuallyHurt(damagesource, f)) {
|
||||
+ return false;
|
||||
+ }
|
||||
+ if (this instanceof EntityPlayer && f == 0) { // CraftBukkit - Player entities can't be hurt by 0 damage
|
||||
+ return false;
|
||||
+ }
|
||||
this.lastHurt = f;
|
||||
- this.invulnerableTime = 20;
|
||||
|
@ -460,7 +466,16 @@
|
|||
this.hurtDuration = 10;
|
||||
this.hurtTime = this.hurtDuration;
|
||||
}
|
||||
@@ -1282,7 +1509,7 @@
|
||||
@@ -1269,7 +1502,7 @@
|
||||
this.level().broadcastDamageEvent(this, damagesource);
|
||||
}
|
||||
|
||||
- if (!damagesource.is(DamageTypeTags.NO_IMPACT) && (!flag || f > 0.0F)) {
|
||||
+ if (!damagesource.is(DamageTypeTags.NO_IMPACT) && !flag) { // CraftBukkit - Prevent marking hurt if the damage is blocked
|
||||
this.markHurt();
|
||||
}
|
||||
|
||||
@@ -1282,7 +1515,7 @@
|
||||
d0 = (Math.random() - Math.random()) * 0.01D;
|
||||
}
|
||||
|
||||
|
@ -469,7 +484,16 @@
|
|||
if (!flag) {
|
||||
this.indicateDamage(d0, d1);
|
||||
}
|
||||
@@ -1335,7 +1562,7 @@
|
||||
@@ -1301,7 +1534,7 @@
|
||||
this.playHurtSound(damagesource);
|
||||
}
|
||||
|
||||
- boolean flag2 = !flag || f > 0.0F;
|
||||
+ boolean flag2 = !flag; // CraftBukkit - Ensure to return false if damage is blocked
|
||||
|
||||
if (flag2) {
|
||||
this.lastDamageSource = damagesource;
|
||||
@@ -1335,7 +1568,7 @@
|
||||
}
|
||||
|
||||
protected void blockedByShield(EntityLiving entityliving) {
|
||||
|
@ -478,7 +502,7 @@
|
|||
}
|
||||
|
||||
private boolean checkTotemDeathProtection(DamageSource damagesource) {
|
||||
@@ -1346,19 +1573,32 @@
|
||||
@@ -1346,19 +1579,32 @@
|
||||
EnumHand[] aenumhand = EnumHand.values();
|
||||
int i = aenumhand.length;
|
||||
|
||||
|
@ -515,7 +539,7 @@
|
|||
EntityPlayer entityplayer = (EntityPlayer) this;
|
||||
|
||||
entityplayer.awardStat(StatisticList.ITEM_USED.get(Items.TOTEM_OF_UNDYING));
|
||||
@@ -1367,14 +1607,16 @@
|
||||
@@ -1367,14 +1613,16 @@
|
||||
}
|
||||
|
||||
this.setHealth(1.0F);
|
||||
|
@ -537,7 +561,7 @@
|
|||
}
|
||||
}
|
||||
|
||||
@@ -1481,14 +1723,22 @@
|
||||
@@ -1481,14 +1729,22 @@
|
||||
IBlockData iblockdata = Blocks.WITHER_ROSE.defaultBlockState();
|
||||
|
||||
if (this.level().getBlockState(blockposition).isAir() && iblockdata.canSurvive(this.level(), blockposition)) {
|
||||
|
@ -562,7 +586,7 @@
|
|||
this.level().addFreshEntity(entityitem);
|
||||
}
|
||||
}
|
||||
@@ -1508,21 +1758,40 @@
|
||||
@@ -1508,21 +1764,40 @@
|
||||
|
||||
boolean flag = this.lastHurtByPlayerTime > 0;
|
||||
|
||||
|
@ -606,7 +630,7 @@
|
|||
|
||||
}
|
||||
|
||||
@@ -1551,13 +1820,25 @@
|
||||
@@ -1551,13 +1826,25 @@
|
||||
}
|
||||
|
||||
public void knockback(double d0, double d1, double d2) {
|
||||
|
@ -635,7 +659,7 @@
|
|||
}
|
||||
}
|
||||
|
||||
@@ -1614,6 +1895,28 @@
|
||||
@@ -1614,6 +1901,28 @@
|
||||
return itemstack.getEatingSound();
|
||||
}
|
||||
|
||||
|
@ -664,7 +688,7 @@
|
|||
public Optional<BlockPosition> getLastClimbablePos() {
|
||||
return this.lastClimbablePos;
|
||||
}
|
||||
@@ -1669,9 +1972,14 @@
|
||||
@@ -1669,9 +1978,14 @@
|
||||
int i = this.calculateFallDamage(f, f1);
|
||||
|
||||
if (i > 0) {
|
||||
|
@ -680,7 +704,7 @@
|
|||
return true;
|
||||
} else {
|
||||
return flag;
|
||||
@@ -1741,7 +2049,7 @@
|
||||
@@ -1741,7 +2055,7 @@
|
||||
|
||||
protected float getDamageAfterArmorAbsorb(DamageSource damagesource, float f) {
|
||||
if (!damagesource.is(DamageTypeTags.BYPASSES_ARMOR)) {
|
||||
|
@ -689,7 +713,7 @@
|
|||
f = CombatMath.getDamageAfterAbsorb(f, damagesource, (float) this.getArmorValue(), (float) this.getAttributeValue(GenericAttributes.ARMOR_TOUGHNESS));
|
||||
}
|
||||
|
||||
@@ -1754,7 +2062,8 @@
|
||||
@@ -1754,7 +2068,8 @@
|
||||
} else {
|
||||
int i;
|
||||
|
||||
|
@ -699,7 +723,7 @@
|
|||
i = (this.getEffect(MobEffects.DAMAGE_RESISTANCE).getAmplifier() + 1) * 5;
|
||||
int j = 25 - i;
|
||||
float f1 = f * (float) j;
|
||||
@@ -1787,16 +2096,125 @@
|
||||
@@ -1787,16 +2102,125 @@
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -746,7 +770,7 @@
|
|||
+ };
|
||||
+ float armorModifier = armor.apply((double) f).floatValue();
|
||||
+ f += armorModifier;
|
||||
|
||||
+
|
||||
+ Function<Double, Double> resistance = new Function<Double, Double>() {
|
||||
+ @Override
|
||||
+ public Double apply(Double f) {
|
||||
|
@ -826,14 +850,14 @@
|
|||
+ absorptionModifier = (float) -event.getDamage(DamageModifier.ABSORPTION);
|
||||
+ this.setAbsorptionAmount(Math.max(this.getAbsorptionAmount() - absorptionModifier, 0.0F));
|
||||
+ float f2 = absorptionModifier;
|
||||
+
|
||||
|
||||
+ if (f2 > 0.0F && f2 < 3.4028235E37F && this instanceof EntityHuman) {
|
||||
+ ((EntityHuman) this).awardStat(StatisticList.DAMAGE_ABSORBED, Math.round(f2 * 10.0F));
|
||||
+ }
|
||||
if (f2 > 0.0F && f2 < 3.4028235E37F) {
|
||||
Entity entity = damagesource.getEntity();
|
||||
|
||||
@@ -1807,13 +2225,47 @@
|
||||
@@ -1807,13 +2231,47 @@
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -872,9 +896,9 @@
|
|||
+ CriterionTriggers.PLAYER_HURT_ENTITY.trigger((EntityPlayer) damagesource.getEntity(), this, damagesource, f, originalDamage, true);
|
||||
+ }
|
||||
+
|
||||
+ return false;
|
||||
+ return true;
|
||||
+ } else {
|
||||
+ return originalDamage > 0;
|
||||
+ return originalDamage >= 0;
|
||||
+ }
|
||||
+ // CraftBukkit end
|
||||
}
|
||||
|
@ -883,7 +907,7 @@
|
|||
}
|
||||
|
||||
public CombatTracker getCombatTracker() {
|
||||
@@ -1838,8 +2290,18 @@
|
||||
@@ -1838,8 +2296,18 @@
|
||||
}
|
||||
|
||||
public final void setArrowCount(int i) {
|
||||
|
@ -903,7 +927,7 @@
|
|||
|
||||
public final int getStingerCount() {
|
||||
return (Integer) this.entityData.get(EntityLiving.DATA_STINGER_COUNT_ID);
|
||||
@@ -2075,6 +2537,12 @@
|
||||
@@ -2075,6 +2543,12 @@
|
||||
|
||||
public abstract ItemStack getItemBySlot(EnumItemSlot enumitemslot);
|
||||
|
||||
|
@ -916,7 +940,7 @@
|
|||
public abstract void setItemSlot(EnumItemSlot enumitemslot, ItemStack itemstack);
|
||||
|
||||
public Iterable<ItemStack> getHandSlots() {
|
||||
@@ -2328,6 +2796,7 @@
|
||||
@@ -2328,6 +2802,7 @@
|
||||
}
|
||||
|
||||
if (this.onGround() && !this.level().isClientSide) {
|
||||
|
@ -924,7 +948,7 @@
|
|||
this.setSharedFlag(7, false);
|
||||
}
|
||||
} else {
|
||||
@@ -2498,7 +2967,7 @@
|
||||
@@ -2498,7 +2973,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -933,7 +957,7 @@
|
|||
if (this.tickCount % 20 == 0) {
|
||||
this.getCombatTracker().recheckStatus();
|
||||
}
|
||||
@@ -2602,7 +3071,7 @@
|
||||
@@ -2602,7 +3077,7 @@
|
||||
|
||||
}
|
||||
|
||||
|
@ -942,7 +966,7 @@
|
|||
Map<EnumItemSlot, ItemStack> map = this.collectEquipmentChanges();
|
||||
|
||||
if (map != null) {
|
||||
@@ -2924,6 +3393,7 @@
|
||||
@@ -2924,6 +3399,7 @@
|
||||
}
|
||||
|
||||
if (!this.level().isClientSide) {
|
||||
|
@ -950,7 +974,7 @@
|
|||
this.setSharedFlag(7, flag);
|
||||
}
|
||||
|
||||
@@ -3114,14 +3584,21 @@
|
||||
@@ -3114,14 +3590,21 @@
|
||||
|
||||
@Override
|
||||
public boolean isPickable() {
|
||||
|
@ -974,7 +998,7 @@
|
|||
@Override
|
||||
public float getYHeadRot() {
|
||||
return this.yHeadRot;
|
||||
@@ -3314,7 +3791,26 @@
|
||||
@@ -3314,7 +3797,26 @@
|
||||
} else {
|
||||
if (!this.useItem.isEmpty() && this.isUsingItem()) {
|
||||
this.triggerItemUseEffects(this.useItem, 16);
|
||||
|
@ -1002,7 +1026,7 @@
|
|||
|
||||
if (itemstack != this.useItem) {
|
||||
this.setItemInHand(enumhand, itemstack);
|
||||
@@ -3392,6 +3888,12 @@
|
||||
@@ -3392,6 +3894,12 @@
|
||||
}
|
||||
|
||||
public boolean randomTeleport(double d0, double d1, double d2, boolean flag) {
|
||||
|
@ -1015,7 +1039,7 @@
|
|||
double d3 = this.getX();
|
||||
double d4 = this.getY();
|
||||
double d5 = this.getZ();
|
||||
@@ -3416,16 +3918,41 @@
|
||||
@@ -3416,16 +3924,41 @@
|
||||
}
|
||||
|
||||
if (flag2) {
|
||||
|
@ -1060,7 +1084,7 @@
|
|||
} else {
|
||||
if (flag) {
|
||||
world.broadcastEntityEvent(this, (byte) 46);
|
||||
@@ -3437,7 +3964,7 @@
|
||||
@@ -3437,7 +3970,7 @@
|
||||
entitycreature.getNavigation().stop();
|
||||
}
|
||||
|
||||
|
@ -1069,7 +1093,7 @@
|
|||
}
|
||||
}
|
||||
|
||||
@@ -3530,7 +4057,7 @@
|
||||
@@ -3530,7 +4063,7 @@
|
||||
}
|
||||
|
||||
public void stopSleeping() {
|
||||
|
@ -1078,7 +1102,7 @@
|
|||
World world = this.level();
|
||||
|
||||
java.util.Objects.requireNonNull(world);
|
||||
@@ -3564,7 +4091,7 @@
|
||||
@@ -3564,7 +4097,7 @@
|
||||
|
||||
@Nullable
|
||||
public EnumDirection getBedOrientation() {
|
||||
|
@ -1087,7 +1111,7 @@
|
|||
|
||||
return blockposition != null ? BlockBed.getBedOrientation(this.level(), blockposition) : null;
|
||||
}
|
||||
@@ -3600,7 +4127,7 @@
|
||||
@@ -3600,7 +4133,7 @@
|
||||
FoodInfo.b foodinfo_b = (FoodInfo.b) iterator.next();
|
||||
|
||||
if (this.random.nextFloat() < foodinfo_b.probability()) {
|
||||
|
|
Loading…
Reference in a new issue