diff --git a/CraftBukkit-Patches/0070-Nerf-Zombie-Lag-Issues.patch b/CraftBukkit-Patches/0070-Nerf-Zombie-Lag-Issues.patch new file mode 100644 index 0000000..b9ff959 --- /dev/null +++ b/CraftBukkit-Patches/0070-Nerf-Zombie-Lag-Issues.patch @@ -0,0 +1,106 @@ +From 1d2d7a8171ed042710cb3fa421cb38d85b1b02f7 Mon Sep 17 00:00:00 2001 +From: Dylan Xaldin +Date: Sat, 14 Sep 2013 11:02:34 +1000 +Subject: [PATCH] Nerf Zombie Lag Issues + +Nerf the Zombie Lag issues in MC 1.6 - "Fixes" MC-17630 + +diff --git a/src/main/java/net/minecraft/server/PathfinderGoalMeleeAttack.java b/src/main/java/net/minecraft/server/PathfinderGoalMeleeAttack.java +index afd726f..faa46e0 100644 +--- a/src/main/java/net/minecraft/server/PathfinderGoalMeleeAttack.java ++++ b/src/main/java/net/minecraft/server/PathfinderGoalMeleeAttack.java +@@ -63,19 +63,88 @@ public class PathfinderGoalMeleeAttack extends PathfinderGoal { + this.b.getNavigation().h(); + } + ++ // Spigot start ++ private double pathX; ++ private double pathY; ++ private double pathZ; ++ private boolean prevPathOK; ++ private int fullRangeSearchDelay; ++ // Spigot end + public void e() { + EntityLiving entityliving = this.b.getGoalTarget(); + + this.b.getControllerLook().a(entityliving, 30.0F, 30.0F); ++ double goalDistanceSq = this.b.e( entityliving.locX, entityliving.boundingBox.b, entityliving.locZ ); // Spigot + if ((this.e || this.b.getEntitySenses().canSee(entityliving)) && --this.h <= 0) { +- this.h = 4 + this.b.aC().nextInt(7); +- this.b.getNavigation().a((Entity) entityliving, this.d); ++ // Spigot start ++ double targetMovement = entityliving.e( pathX, pathY, pathZ ); ++ // If this is true, then we are re-pathing ++ if ( ( this.h <= 0 && targetMovement >= 1.0D ) || ( this.h <= 0 && this.b.aC().nextInt( 200 ) == 0 ) ) /* EntityCreature random instance */ ++ ++ { ++ AttributeInstance rangeAttr = this.b.getAttributeInstance( GenericAttributes.b ); ++ double origRange = rangeAttr.getValue(); ++ if ( fullRangeSearchDelay > 0 ) ++ { ++ ++ double dist = Math.sqrt( goalDistanceSq ); ++ if ( dist <= 8.0D ) ++ { ++ dist = 8.0D; ++ } ++ if ( dist > origRange ) ++ { ++ dist = origRange; ++ } ++ rangeAttr.setValue( dist ); ++ } ++ ++ prevPathOK = this.b.getNavigation().a( (Entity) entityliving, this.d ); ++ ++ if ( fullRangeSearchDelay > 0 ) ++ { ++ fullRangeSearchDelay--; ++ if ( origRange > 40.0D ) ++ { ++ origRange = 40.0D; ++ } ++ rangeAttr.setValue( origRange ); ++ } ++ ++ pathX = entityliving.locX; ++ pathY = entityliving.boundingBox.b; ++ pathZ = entityliving.locZ; ++ this.h = 4 + this.b.aC().nextInt( 7 ); /* EntityCreature random instance */ ++ ++ if ( goalDistanceSq > 256.0D ) ++ { ++ if ( goalDistanceSq > 1024.0D ) ++ { ++ this.h += 8; ++ } else ++ { ++ this.h += 16; ++ } ++ } else if ( !prevPathOK ) ++ { ++ this.h += 24; ++ } ++ ++ if ( !prevPathOK || goalDistanceSq <= 256.0D ) ++ { ++ if ( fullRangeSearchDelay <= 0 ) ++ { ++ fullRangeSearchDelay = 4 + this.b.aC().nextInt( 4 ); /* EntityCreature random instance */ ++ } ++ } ++ } + } ++ // Spigot end + + this.c = Math.max(this.c - 1, 0); + double d0 = (double) (this.b.width * 2.0F * this.b.width * 2.0F + entityliving.width); + +- if (this.b.e(entityliving.locX, entityliving.boundingBox.b, entityliving.locZ) <= d0) { ++ if (goalDistanceSq <= d0) { // Spigot + if (this.c <= 0) { + this.c = 20; + if (this.b.aY() != null) { +-- +1.8.1.2 +