Skip to content

Commit

Permalink
Fix StackOverflowError in damageEntity_CB method
Browse files Browse the repository at this point in the history
  • Loading branch information
Luohuayu committed Jan 28, 2024
1 parent e739142 commit 098e907
Showing 1 changed file with 31 additions and 27 deletions.
58 changes: 31 additions & 27 deletions patches/net/minecraft/entity/EntityLivingBase.java.patch
Original file line number Diff line number Diff line change
Expand Up @@ -701,7 +701,7 @@
{
int i = (this.getActivePotionEffect(MobEffects.RESISTANCE).getAmplifier() + 1) * 5;
int j = 25 - i;
@@ -1378,24 +1574,187 @@
@@ -1378,24 +1574,191 @@

protected void damageEntity(DamageSource damageSrc, float damageAmount)
{
Expand Down Expand Up @@ -730,13 +730,17 @@
+ */
}

+ private boolean callingLivingHurtEvent = false; // CatServer - Fix StackOverflowError
+ protected boolean damageEntity_CB(final DamageSource damagesource, float f) { // void -> boolean, add final
+ if (!this.isEntityInvulnerable(damagesource)) {
+ final boolean human = this instanceof EntityPlayer;
+ float originalDamage = f;
+
+ if (!human || f > 0) { // filter out 0 damage (from EntityPlayer.attackEntityFrom)
+ if (callingLivingHurtEvent) return true;
+ callingLivingHurtEvent = true;
+ f = net.minecraftforge.common.ForgeHooks.onLivingHurt(this, damagesource, f);
+ callingLivingHurtEvent = false;
+ }
+
+ float originalDamage_CB = f;
Expand Down Expand Up @@ -890,7 +894,7 @@
public CombatTracker getCombatTracker()
{
return this._combatTracker;
@@ -1447,6 +1806,11 @@
@@ -1447,6 +1810,11 @@

public void swingArm(EnumHand hand)
{
Expand All @@ -902,15 +906,15 @@
if (!this.isSwingInProgress || this.swingProgressInt >= this.getArmSwingAnimationEnd() / 2 || this.swingProgressInt < 0)
{
this.swingProgressInt = -1;
@@ -1570,6 +1934,7 @@
@@ -1570,6 +1938,7 @@
if (this.attributeMap == null)
{
this.attributeMap = new AttributeMap();
+ this.craftAttributes = new CraftAttributeMap(attributeMap);
}

return this.attributeMap;
@@ -1694,7 +2059,7 @@
@@ -1694,7 +2063,7 @@

if (!this.world.collidesWithAnyBlock(axisalignedbb1))
{
Expand All @@ -919,7 +923,7 @@
{
this.setPositionAndUpdate(d11, this.posY + 1.0D, d12);
return;
@@ -1702,14 +2067,14 @@
@@ -1702,14 +2071,14 @@

BlockPos blockpos = new BlockPos(d11, this.posY - 1.0D, d12);

Expand All @@ -936,7 +940,7 @@
{
d1 = d11;
d13 = this.posY + 2.0D;
@@ -1781,16 +2146,17 @@
@@ -1781,16 +2150,17 @@
}

this.isAirBorne = true;
Expand All @@ -956,7 +960,7 @@
}

protected float getWaterSlowDown()
@@ -1864,7 +2230,8 @@
@@ -1864,7 +2234,8 @@

if (this.onGround && !this.world.isRemote)
{
Expand All @@ -966,7 +970,7 @@
}
}
else
@@ -1874,7 +2241,8 @@
@@ -1874,7 +2245,8 @@

if (this.onGround)
{
Expand All @@ -976,7 +980,7 @@
}

float f7 = 0.16277136F / (f6 * f6 * f6);
@@ -1894,7 +2262,8 @@
@@ -1894,7 +2266,8 @@

if (this.onGround)
{
Expand All @@ -986,7 +990,7 @@
}

if (this.isOnLadder())
@@ -2054,6 +2423,8 @@
@@ -2054,6 +2427,8 @@

public void onUpdate()
{
Expand All @@ -995,7 +999,7 @@
super.onUpdate();
this.updateActiveHand();

@@ -2096,7 +2467,9 @@
@@ -2096,7 +2471,9 @@

if (!ItemStack.areItemStacksEqual(itemstack1, itemstack))
{
Expand All @@ -1005,7 +1009,7 @@

if (!itemstack.isEmpty())
{
@@ -2135,7 +2508,9 @@
@@ -2135,7 +2512,9 @@
}
}

Expand All @@ -1015,15 +1019,15 @@
double d0 = this.posX - this.prevPosX;
double d1 = this.posZ - this.prevPosZ;
float f3 = (float)(d0 * d0 + d1 * d1);
@@ -2228,6 +2603,7 @@
@@ -2228,6 +2607,7 @@
{
this.ticksElytraFlying = 0;
}
+ SpigotTimings.timerEntityTickRest.stopTiming(); // Spigot
}

protected float updateDistance(float p_110146_1_, float p_110146_2_)
@@ -2304,7 +2680,7 @@
@@ -2304,7 +2684,7 @@
}

this.world.profiler.startSection("ai");
Expand All @@ -1032,15 +1036,15 @@
if (this.isMovementBlocked())
{
this.isJumping = false;
@@ -2318,6 +2694,7 @@
@@ -2318,6 +2698,7 @@
this.updateEntityActionState();
this.world.profiler.endSection();
}
+ SpigotTimings.timerEntityAI.stopTiming(); // Spigot

this.world.profiler.endSection();
this.world.profiler.startSection("jump");
@@ -2349,10 +2726,14 @@
@@ -2349,10 +2730,14 @@
this.moveForward *= 0.98F;
this.randomYawVelocity *= 0.9F;
this.updateElytra();
Expand All @@ -1055,7 +1059,7 @@
this.world.profiler.endSection();
}

@@ -2385,7 +2766,8 @@
@@ -2385,7 +2770,8 @@

if (!this.world.isRemote)
{
Expand All @@ -1065,7 +1069,7 @@
}
}

@@ -2419,9 +2801,13 @@
@@ -2419,9 +2805,13 @@
}
}

Expand All @@ -1080,7 +1084,7 @@
this.collideWithEntity(entity);
}
}
@@ -2519,12 +2905,12 @@
@@ -2519,12 +2909,12 @@

public boolean canBeCollidedWith()
{
Expand All @@ -1095,7 +1099,7 @@
}

protected void markVelocityChanged()
@@ -2575,6 +2961,40 @@
@@ -2575,6 +2965,40 @@
this.potionsNeedUpdate = true;
}

Expand Down Expand Up @@ -1136,7 +1140,7 @@
public abstract EnumHandSide getPrimaryHand();

public boolean isHandActive()
@@ -2592,15 +3012,23 @@
@@ -2592,15 +3016,23 @@
if (this.isHandActive())
{
ItemStack itemstack = this.getHeldItem(this.getActiveHand());
Expand All @@ -1161,7 +1165,7 @@
{
this.onItemUseFinish();
}
@@ -2618,8 +3046,10 @@
@@ -2618,8 +3050,10 @@

if (!itemstack.isEmpty() && !this.isHandActive())
{
Expand All @@ -1173,7 +1177,7 @@

if (!this.world.isRemote)
{
@@ -2700,7 +3130,27 @@
@@ -2700,7 +3134,27 @@
if (!this.activeItemStack.isEmpty() && this.isHandActive())
{
this.updateItemUse(this.activeItemStack, 16);
Expand Down Expand Up @@ -1202,7 +1206,7 @@
this.resetActiveHand();
}
}
@@ -2724,7 +3174,8 @@
@@ -2724,7 +3178,8 @@
{
if (!this.activeItemStack.isEmpty())
{
Expand All @@ -1212,7 +1216,7 @@
}

this.resetActiveHand();
@@ -2808,11 +3259,14 @@
@@ -2808,11 +3263,14 @@

if (flag1)
{
Expand All @@ -1232,7 +1236,7 @@
}
}
}
@@ -2847,11 +3301,41 @@
@@ -2847,11 +3305,41 @@
}
}

Expand Down Expand Up @@ -1274,7 +1278,7 @@
public boolean attackable()
{
return true;
@@ -2861,4 +3345,30 @@
@@ -2861,4 +3349,30 @@
public void setPartying(BlockPos pos, boolean p_191987_2_)
{
}
Expand Down

0 comments on commit 098e907

Please sign in to comment.