diff options
author | Travis Watkins <amaranth@ubuntu.com> | 2012-04-23 09:47:05 -0500 |
---|---|---|
committer | EvilSeph <evilseph@gmail.com> | 2012-04-23 21:52:08 -0400 |
commit | b7376e08651e32addce2ba986d02f6e53e3ecdf2 (patch) | |
tree | 96aebe992dad04b205e7f2781bb387d441734f14 /src/main/java/net/minecraft/server/PathfinderGoalSelector.java | |
parent | e8459c1ff6a8e58f6d7578a99ea164deadc30884 (diff) | |
download | craftbukkit-b7376e08651e32addce2ba986d02f6e53e3ecdf2.tar craftbukkit-b7376e08651e32addce2ba986d02f6e53e3ecdf2.tar.gz craftbukkit-b7376e08651e32addce2ba986d02f6e53e3ecdf2.tar.lz craftbukkit-b7376e08651e32addce2ba986d02f6e53e3ecdf2.tar.xz craftbukkit-b7376e08651e32addce2ba986d02f6e53e3ecdf2.zip |
Avoid doing unnecessary range checks when we're looping from start to end.
Make EntityLiving call AI logic every tick again.
Rework PathfinderGoalSelector logic.
Adds UnsafeList for use in places where we use ArrayList and know we won't
get index out of range errors. Added usage to World's tickEntities, Chunk's
entitySlices to speed up searching for entities, and to PathfinderGoalSelector
to speed up dealing with AI goals.
Reworked logic in PathfinderGoalSelector with help from fullwall. This code
no longer uses an extra ArrayList for setting up goals and only updates which
goals should be run every other time it is called.
Removed only calling PathfinderGoalSelector every other tick from EntityLiving
as we now only setup new goals every other tick. This ensures existing goals
run every tick to properly update mob movement.
Diffstat (limited to 'src/main/java/net/minecraft/server/PathfinderGoalSelector.java')
-rw-r--r-- | src/main/java/net/minecraft/server/PathfinderGoalSelector.java | 49 |
1 files changed, 30 insertions, 19 deletions
diff --git a/src/main/java/net/minecraft/server/PathfinderGoalSelector.java b/src/main/java/net/minecraft/server/PathfinderGoalSelector.java index 054777c4..90350e29 100644 --- a/src/main/java/net/minecraft/server/PathfinderGoalSelector.java +++ b/src/main/java/net/minecraft/server/PathfinderGoalSelector.java @@ -2,12 +2,15 @@ package net.minecraft.server; import java.util.ArrayList; import java.util.Iterator; +import org.bukkit.craftbukkit.util.UnsafeList; // CraftBukkit public class PathfinderGoalSelector { - private ArrayList a = new ArrayList(); - private ArrayList b = new ArrayList(); - private ArrayList arraylist = new ArrayList(); // CraftBukkit - create list for object reuse + // CraftBukkit start - use UnsafeList, add boolean for picking goals + private UnsafeList a = new UnsafeList(16); + private UnsafeList b = new UnsafeList(16); + boolean oddCall = true; + // CraftBukkit end public PathfinderGoalSelector() {} @@ -16,12 +19,12 @@ public class PathfinderGoalSelector { } public void a() { - //ArrayList arraylist = new ArrayList(); // CraftBukkit - arraylist.clear(); // CraftBukkit - prepare reused list + //ArrayList arraylist = new ArrayList(); // CraftBukkit - removed usage - // CraftBukkit start - don't use iterators for private fields + // CraftBukkit start - don't use iterators for private fields, only run every other call + if (oddCall) { for (int i = 0; i < this.a.size(); i++) { - PathfinderGoalSelectorItem pathfindergoalselectoritem = (PathfinderGoalSelectorItem) this.a.get(i); + PathfinderGoalSelectorItem pathfindergoalselectoritem = (PathfinderGoalSelectorItem) this.a.unsafeGet(i); // CraftBukkit - use unsafeGet boolean flag = this.b.contains(pathfindergoalselectoritem); if (flag) { @@ -34,36 +37,44 @@ public class PathfinderGoalSelector { } if (this.a(pathfindergoalselectoritem) && pathfindergoalselectoritem.a.a()) { - arraylist.add(pathfindergoalselectoritem); + // CraftBukkit start - call method now + // arraylist.add(pathfindergoalselectoritem); + pathfindergoalselectoritem.a.c(); + // CraftBukkit end this.b.add(pathfindergoalselectoritem); } } + } + oddCall = !oddCall; // CraftBukkit end boolean flag1 = false; - if (flag1 && arraylist.size() > 0) { + // CraftBukkit start - removed usage of arraylist + /*if (flag1 && arraylist.size() > 0) { System.out.println("Starting: "); - } + }*/ + // CraftBukkit end Iterator iterator1; PathfinderGoalSelectorItem pathfindergoalselectoritem1; - //CraftBukkit start - don't use iterators for private fields - for (int i = 0; i < arraylist.size(); i++) { - pathfindergoalselectoritem1 = (PathfinderGoalSelectorItem) arraylist.get(i); - pathfindergoalselectoritem1.a.c(); + // CraftBukkit start - removed usage of arraylist + /*for (iterator1 = arraylist.iterator(); iterator1.hasNext(); pathfindergoalselectoritem1.a.c()) { + pathfindergoalselectoritem1 = (PathfinderGoalSelectorItem) iterator1.next(); if (flag1) { System.out.println(pathfindergoalselectoritem1.a.toString() + ", "); } - } + }*/ + // CraftBukkit end if (flag1 && this.b.size() > 0) { System.out.println("Running: "); } + // CraftBukkit start - don't use iterators for private fields for (int i = 0; i < this.b.size(); i++) { - pathfindergoalselectoritem1 = (PathfinderGoalSelectorItem) this.b.get(i); + pathfindergoalselectoritem1 = (PathfinderGoalSelectorItem) this.b.unsafeGet(i); // CraftBukkit - use unsafeGet pathfindergoalselectoritem1.a.e(); if (flag1) { System.out.println(pathfindergoalselectoritem1.a.toString()); @@ -75,14 +86,14 @@ public class PathfinderGoalSelector { private boolean a(PathfinderGoalSelectorItem pathfindergoalselectoritem) { // CraftBukkit start - don't use iterators for private fields for (int i = 0; i < this.a.size(); i++) { - PathfinderGoalSelectorItem pathfindergoalselectoritem1 = (PathfinderGoalSelectorItem) this.a.get(i); + PathfinderGoalSelectorItem pathfindergoalselectoritem1 = (PathfinderGoalSelectorItem) this.a.unsafeGet(i); // CraftBukkit - use unsafeGet if (pathfindergoalselectoritem1 != pathfindergoalselectoritem) { if (pathfindergoalselectoritem.b >= pathfindergoalselectoritem1.b) { - if (this.b.contains(pathfindergoalselectoritem1) && !this.a(pathfindergoalselectoritem, pathfindergoalselectoritem1)) { + if (!this.a(pathfindergoalselectoritem, pathfindergoalselectoritem1) && this.b.contains(pathfindergoalselectoritem1)) { // CraftBukkit - switch order return false; } - } else if (this.b.contains(pathfindergoalselectoritem1) && !pathfindergoalselectoritem1.a.g()) { + } else if (!pathfindergoalselectoritem1.a.g() && this.b.contains(pathfindergoalselectoritem1)) { // CraftBukkit - switch order return false; } } |