diff --git a/paper-server/nms-patches/net/minecraft/world/entity/EntityLiving.patch b/paper-server/nms-patches/net/minecraft/world/entity/EntityLiving.patch index 3d38cbbfd3..e6856c1ae7 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/EntityLiving.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/EntityLiving.patch @@ -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 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 resistance = new Function() { + @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 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 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()) {