SPIGOT-5339, SPIGOT-6252, SPIGOT-6777: Only cancel knockback if the damage event was canceled

By: DerFrZocker <derrieple@gmail.com>
This commit is contained in:
CraftBukkit/Spigot
2022-01-03 18:07:01 +01:00
parent cc34358a3e
commit 46f0dde817
5 changed files with 91 additions and 66 deletions

View File

@@ -388,14 +388,13 @@
this.hurtCurrentlyUsedShield(f);
f2 = f;
f = 0.0F;
@@ -1090,27 +1299,47 @@
@@ -1090,27 +1299,46 @@
this.animationSpeed = 1.5F;
boolean flag1 = true;
- if ((float) this.invulnerableTime > 10.0F) {
+ if ((float) this.invulnerableTime > (float) this.invulnerableDuration / 2.0F) { // CraftBukkit - restore use of maxNoDamageTicks
if (f <= this.lastHurt) {
+ this.forceExplosionKnockback = true; // CraftBukkit - SPIGOT-949 - for vanilla consistency, cooldown does not prevent explosion knockback
return false;
}
@@ -441,7 +440,7 @@
this.hurtDir = 0.0F;
Entity entity1 = damagesource.getEntity();
@@ -1233,19 +1462,29 @@
@@ -1233,19 +1461,29 @@
EnumHand[] aenumhand = EnumHand.values();
int i = aenumhand.length;
@@ -475,7 +474,7 @@
EntityPlayer entityplayer = (EntityPlayer) this;
entityplayer.awardStat(StatisticList.ITEM_USED.get(Items.TOTEM_OF_UNDYING));
@@ -1253,14 +1492,16 @@
@@ -1253,14 +1491,16 @@
}
this.setHealth(1.0F);
@@ -497,7 +496,7 @@
}
}
@@ -1365,14 +1606,22 @@
@@ -1365,14 +1605,22 @@
IBlockData iblockdata = Blocks.WITHER_ROSE.defaultBlockState();
if (this.level.getBlockState(blockposition).isAir() && iblockdata.canSurvive(this.level, blockposition)) {
@@ -522,7 +521,7 @@
this.level.addFreshEntity(entityitem);
}
}
@@ -1392,21 +1641,40 @@
@@ -1392,21 +1640,40 @@
boolean flag = this.lastHurtByPlayerTime > 0;
@@ -566,7 +565,7 @@
}
@@ -1526,9 +1794,14 @@
@@ -1526,9 +1793,14 @@
int i = this.calculateFallDamage(f, f1);
if (i > 0) {
@@ -582,7 +581,7 @@
return true;
} else {
return flag;
@@ -1577,7 +1850,7 @@
@@ -1577,7 +1849,7 @@
protected float getDamageAfterArmorAbsorb(DamageSource damagesource, float f) {
if (!damagesource.isBypassArmor()) {
@@ -591,7 +590,7 @@
f = CombatMath.getDamageAfterAbsorb(f, (float) this.getArmorValue(), (float) this.getAttributeValue(GenericAttributes.ARMOR_TOUGHNESS));
}
@@ -1590,7 +1863,8 @@
@@ -1590,7 +1862,8 @@
} else {
int i;
@@ -601,7 +600,7 @@
i = (this.getEffect(MobEffects.DAMAGE_RESISTANCE).getAmplifier() + 1) * 5;
int j = 25 - i;
float f1 = f * (float) j;
@@ -1621,29 +1895,172 @@
@@ -1621,29 +1894,172 @@
}
}
@@ -784,7 +783,7 @@
}
public CombatTracker getCombatTracker() {
@@ -1664,8 +2081,18 @@
@@ -1664,8 +2080,18 @@
}
public final void setArrowCount(int i) {
@@ -804,7 +803,7 @@
public final int getStingerCount() {
return (Integer) this.entityData.get(EntityLiving.DATA_STINGER_COUNT_ID);
@@ -1961,6 +2388,12 @@
@@ -1961,6 +2387,12 @@
public abstract ItemStack getItemBySlot(EnumItemSlot enumitemslot);
@@ -817,7 +816,7 @@
@Override
public abstract void setItemSlot(EnumItemSlot enumitemslot, ItemStack itemstack);
@@ -2204,6 +2637,7 @@
@@ -2204,6 +2636,7 @@
}
if (this.onGround && !this.level.isClientSide) {
@@ -825,7 +824,7 @@
this.setSharedFlag(7, false);
}
} else {
@@ -2734,6 +3168,7 @@
@@ -2734,6 +3167,7 @@
}
if (!this.level.isClientSide) {
@@ -833,7 +832,7 @@
this.setSharedFlag(7, flag);
}
@@ -2901,14 +3336,21 @@
@@ -2901,14 +3335,21 @@
@Override
public boolean isPickable() {
@@ -857,7 +856,7 @@
@Override
protected void markHurt() {
this.hurtMarked = this.random.nextDouble() >= this.getAttributeValue(GenericAttributes.KNOCKBACK_RESISTANCE);
@@ -3107,7 +3549,25 @@
@@ -3107,7 +3548,25 @@
} else {
if (!this.useItem.isEmpty() && this.isUsingItem()) {
this.triggerItemUseEffects(this.useItem, 16);
@@ -884,7 +883,7 @@
if (itemstack != this.useItem) {
this.setItemInHand(enumhand, itemstack);
@@ -3180,6 +3640,12 @@
@@ -3180,6 +3639,12 @@
}
public boolean randomTeleport(double d0, double d1, double d2, boolean flag) {
@@ -897,7 +896,7 @@
double d3 = this.getX();
double d4 = this.getY();
double d5 = this.getZ();
@@ -3204,16 +3670,41 @@
@@ -3204,16 +3669,41 @@
}
if (flag2) {
@@ -942,7 +941,7 @@
} else {
if (flag) {
world.broadcastEntityEvent(this, (byte) 46);
@@ -3223,7 +3714,7 @@
@@ -3223,7 +3713,7 @@
((EntityCreature) this).getNavigation().stop();
}
@@ -951,7 +950,7 @@
}
}
@@ -3306,7 +3797,7 @@
@@ -3306,7 +3796,7 @@
}
public void stopSleeping() {
@@ -960,7 +959,7 @@
World world = this.level;
java.util.Objects.requireNonNull(this.level);
@@ -3338,7 +3829,7 @@
@@ -3338,7 +3828,7 @@
@Nullable
public EnumDirection getBedOrientation() {
@@ -969,7 +968,7 @@
return blockposition != null ? BlockBed.getBedOrientation(this.level, blockposition) : null;
}
@@ -3387,7 +3878,7 @@
@@ -3387,7 +3877,7 @@
Pair<MobEffect, Float> pair = (Pair) iterator.next();
if (!world.isClientSide && pair.getFirst() != null && world.random.nextFloat() < (Float) pair.getSecond()) {
@@ -978,7 +977,7 @@
}
}
}
@@ -3490,8 +3981,10 @@
@@ -3490,8 +3980,10 @@
this.setDeltaMovement((double) ((float) packetplayoutspawnentityliving.getXd() / 8000.0F), (double) ((float) packetplayoutspawnentityliving.getYd() / 8000.0F), (double) ((float) packetplayoutspawnentityliving.getZd() / 8000.0F));
}
@@ -990,7 +989,7 @@
private final SoundEffect small;
private final SoundEffect big;
@@ -3507,5 +4000,7 @@
@@ -3507,5 +3999,7 @@
public SoundEffect big() {
return this.big;
}