From 098e907915e80e0ceaba7cee9b45ab3781e5b874 Mon Sep 17 00:00:00 2001 From: Luohuayu Date: Mon, 29 Jan 2024 03:48:02 +0800 Subject: [PATCH] Fix StackOverflowError in damageEntity_CB method --- .../entity/EntityLivingBase.java.patch | 58 ++++++++++--------- 1 file changed, 31 insertions(+), 27 deletions(-) diff --git a/patches/net/minecraft/entity/EntityLivingBase.java.patch b/patches/net/minecraft/entity/EntityLivingBase.java.patch index d86a0979b..0d7e94dac 100644 --- a/patches/net/minecraft/entity/EntityLivingBase.java.patch +++ b/patches/net/minecraft/entity/EntityLivingBase.java.patch @@ -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) { @@ -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; @@ -890,7 +894,7 @@ public CombatTracker getCombatTracker() { return this._combatTracker; -@@ -1447,6 +1806,11 @@ +@@ -1447,6 +1810,11 @@ public void swingArm(EnumHand hand) { @@ -902,7 +906,7 @@ 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(); @@ -910,7 +914,7 @@ } return this.attributeMap; -@@ -1694,7 +2059,7 @@ +@@ -1694,7 +2063,7 @@ if (!this.world.collidesWithAnyBlock(axisalignedbb1)) { @@ -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); @@ -936,7 +940,7 @@ { d1 = d11; d13 = this.posY + 2.0D; -@@ -1781,16 +2146,17 @@ +@@ -1781,16 +2150,17 @@ } this.isAirBorne = true; @@ -956,7 +960,7 @@ } protected float getWaterSlowDown() -@@ -1864,7 +2230,8 @@ +@@ -1864,7 +2234,8 @@ if (this.onGround && !this.world.isRemote) { @@ -966,7 +970,7 @@ } } else -@@ -1874,7 +2241,8 @@ +@@ -1874,7 +2245,8 @@ if (this.onGround) { @@ -976,7 +980,7 @@ } float f7 = 0.16277136F / (f6 * f6 * f6); -@@ -1894,7 +2262,8 @@ +@@ -1894,7 +2266,8 @@ if (this.onGround) { @@ -986,7 +990,7 @@ } if (this.isOnLadder()) -@@ -2054,6 +2423,8 @@ +@@ -2054,6 +2427,8 @@ public void onUpdate() { @@ -995,7 +999,7 @@ super.onUpdate(); this.updateActiveHand(); -@@ -2096,7 +2467,9 @@ +@@ -2096,7 +2471,9 @@ if (!ItemStack.areItemStacksEqual(itemstack1, itemstack)) { @@ -1005,7 +1009,7 @@ if (!itemstack.isEmpty()) { -@@ -2135,7 +2508,9 @@ +@@ -2135,7 +2512,9 @@ } } @@ -1015,7 +1019,7 @@ 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; } @@ -1023,7 +1027,7 @@ } protected float updateDistance(float p_110146_1_, float p_110146_2_) -@@ -2304,7 +2680,7 @@ +@@ -2304,7 +2684,7 @@ } this.world.profiler.startSection("ai"); @@ -1032,7 +1036,7 @@ if (this.isMovementBlocked()) { this.isJumping = false; -@@ -2318,6 +2694,7 @@ +@@ -2318,6 +2698,7 @@ this.updateEntityActionState(); this.world.profiler.endSection(); } @@ -1040,7 +1044,7 @@ 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(); @@ -1055,7 +1059,7 @@ this.world.profiler.endSection(); } -@@ -2385,7 +2766,8 @@ +@@ -2385,7 +2770,8 @@ if (!this.world.isRemote) { @@ -1065,7 +1069,7 @@ } } -@@ -2419,9 +2801,13 @@ +@@ -2419,9 +2805,13 @@ } } @@ -1080,7 +1084,7 @@ this.collideWithEntity(entity); } } -@@ -2519,12 +2905,12 @@ +@@ -2519,12 +2909,12 @@ public boolean canBeCollidedWith() { @@ -1095,7 +1099,7 @@ } protected void markVelocityChanged() -@@ -2575,6 +2961,40 @@ +@@ -2575,6 +2965,40 @@ this.potionsNeedUpdate = true; } @@ -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()); @@ -1161,7 +1165,7 @@ { this.onItemUseFinish(); } -@@ -2618,8 +3046,10 @@ +@@ -2618,8 +3050,10 @@ if (!itemstack.isEmpty() && !this.isHandActive()) { @@ -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); @@ -1202,7 +1206,7 @@ this.resetActiveHand(); } } -@@ -2724,7 +3174,8 @@ +@@ -2724,7 +3178,8 @@ { if (!this.activeItemStack.isEmpty()) { @@ -1212,7 +1216,7 @@ } this.resetActiveHand(); -@@ -2808,11 +3259,14 @@ +@@ -2808,11 +3263,14 @@ if (flag1) { @@ -1232,7 +1236,7 @@ } } } -@@ -2847,11 +3301,41 @@ +@@ -2847,11 +3305,41 @@ } } @@ -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_) { }