Removal of CopyOnWriteArrayList from CellPathFinding.
This commit is contained in:
		@@ -17,9 +17,9 @@
 | 
			
		||||
package org.l2jmobius.gameserver.geoengine.pathfinding.cellnodes;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.Iterator;
 | 
			
		||||
import java.util.LinkedList;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.concurrent.CopyOnWriteArrayList;
 | 
			
		||||
import java.util.ListIterator;
 | 
			
		||||
import java.util.logging.Level;
 | 
			
		||||
import java.util.logging.Logger;
 | 
			
		||||
 | 
			
		||||
@@ -114,7 +114,7 @@ public class CellPathFinding extends PathFinding
 | 
			
		||||
		{
 | 
			
		||||
			if (_debugItems == null)
 | 
			
		||||
			{
 | 
			
		||||
				_debugItems = new CopyOnWriteArrayList<>();
 | 
			
		||||
				_debugItems = new LinkedList<>();
 | 
			
		||||
			}
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
@@ -179,28 +179,35 @@ public class CellPathFinding extends PathFinding
 | 
			
		||||
			_postFilterPlayableUses++;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		boolean remove;
 | 
			
		||||
		ListIterator<AbstractNodeLoc> middlePoint;
 | 
			
		||||
		int currentX;
 | 
			
		||||
		int currentY;
 | 
			
		||||
		int currentZ;
 | 
			
		||||
		int pass = 0;
 | 
			
		||||
		boolean remove;
 | 
			
		||||
		do
 | 
			
		||||
		{
 | 
			
		||||
			pass++;
 | 
			
		||||
			_postFilterPasses++;
 | 
			
		||||
			
 | 
			
		||||
			remove = false;
 | 
			
		||||
			final Iterator<AbstractNodeLoc> endPoint = path.iterator();
 | 
			
		||||
			endPoint.next();
 | 
			
		||||
			int currentX = x;
 | 
			
		||||
			int currentY = y;
 | 
			
		||||
			int currentZ = z;
 | 
			
		||||
			middlePoint = path.listIterator();
 | 
			
		||||
			currentX = x;
 | 
			
		||||
			currentY = y;
 | 
			
		||||
			currentZ = z;
 | 
			
		||||
			
 | 
			
		||||
			int midPoint = 0;
 | 
			
		||||
			while (endPoint.hasNext())
 | 
			
		||||
			while (middlePoint.hasNext())
 | 
			
		||||
			{
 | 
			
		||||
				final AbstractNodeLoc locMiddle = path.get(midPoint);
 | 
			
		||||
				final AbstractNodeLoc locEnd = endPoint.next();
 | 
			
		||||
				final AbstractNodeLoc locMiddle = middlePoint.next();
 | 
			
		||||
				if (!middlePoint.hasNext())
 | 
			
		||||
				{
 | 
			
		||||
					break;
 | 
			
		||||
				}
 | 
			
		||||
				
 | 
			
		||||
				final AbstractNodeLoc locEnd = path.get(middlePoint.nextIndex());
 | 
			
		||||
				if (GeoEngine.getInstance().canMoveToTarget(currentX, currentY, currentZ, locEnd.getX(), locEnd.getY(), locEnd.getZ(), instance))
 | 
			
		||||
				{
 | 
			
		||||
					path.remove(midPoint);
 | 
			
		||||
					middlePoint.remove();
 | 
			
		||||
					remove = true;
 | 
			
		||||
					if (debug)
 | 
			
		||||
					{
 | 
			
		||||
@@ -212,7 +219,6 @@ public class CellPathFinding extends PathFinding
 | 
			
		||||
					currentX = locMiddle.getX();
 | 
			
		||||
					currentY = locMiddle.getY();
 | 
			
		||||
					currentZ = locMiddle.getZ();
 | 
			
		||||
					midPoint++;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
@@ -231,7 +237,7 @@ public class CellPathFinding extends PathFinding
 | 
			
		||||
	
 | 
			
		||||
	private List<AbstractNodeLoc> constructPath(AbstractNode<NodeLoc> node)
 | 
			
		||||
	{
 | 
			
		||||
		final List<AbstractNodeLoc> path = new CopyOnWriteArrayList<>();
 | 
			
		||||
		final LinkedList<AbstractNodeLoc> path = new LinkedList<>();
 | 
			
		||||
		int previousDirectionX = Integer.MIN_VALUE;
 | 
			
		||||
		int previousDirectionY = Integer.MIN_VALUE;
 | 
			
		||||
		int directionX;
 | 
			
		||||
@@ -267,16 +273,17 @@ public class CellPathFinding extends PathFinding
 | 
			
		||||
				previousDirectionX = directionX;
 | 
			
		||||
				previousDirectionY = directionY;
 | 
			
		||||
				
 | 
			
		||||
				path.add(0, tempNode.getLoc());
 | 
			
		||||
				path.addFirst(tempNode.getLoc());
 | 
			
		||||
				tempNode.setLoc(null);
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
			tempNode = tempNode.getParent();
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		return path;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	private final CellNodeBuffer alloc(int size, boolean playable)
 | 
			
		||||
	private CellNodeBuffer alloc(int size, boolean playable)
 | 
			
		||||
	{
 | 
			
		||||
		CellNodeBuffer current = null;
 | 
			
		||||
		for (BufferInfo i : _allBuffers)
 | 
			
		||||
@@ -328,7 +335,7 @@ public class CellPathFinding extends PathFinding
 | 
			
		||||
		return current;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	private final void dropDebugItem(int itemId, int num, AbstractNodeLoc loc)
 | 
			
		||||
	private void dropDebugItem(int itemId, int num, AbstractNodeLoc loc)
 | 
			
		||||
	{
 | 
			
		||||
		final Item item = new Item(IdManager.getInstance().getNextId(), itemId);
 | 
			
		||||
		item.setCount(num);
 | 
			
		||||
@@ -336,7 +343,7 @@ public class CellPathFinding extends PathFinding
 | 
			
		||||
		_debugItems.add(item);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	private static final class BufferInfo
 | 
			
		||||
	private static class BufferInfo
 | 
			
		||||
	{
 | 
			
		||||
		final int mapSize;
 | 
			
		||||
		final int count;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user