More efficient transporter tree searching
This commit is contained in:
parent
b6306d0779
commit
72193075ab
5 changed files with 58 additions and 29 deletions
|
@ -1,8 +1,10 @@
|
|||
package mekanism.common.content.transporter;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import mekanism.api.Coord4D;
|
||||
|
@ -23,7 +25,7 @@ import cpw.mods.fml.common.Loader;
|
|||
|
||||
public class TransporterManager
|
||||
{
|
||||
public static Set<TransporterStack> flowingStacks = new HashSet<TransporterStack>();
|
||||
public static Map<Coord4D, Set<TransporterStack>> flowingStacks = new HashMap<Coord4D, Set<TransporterStack>>();
|
||||
|
||||
public static void reset()
|
||||
{
|
||||
|
@ -32,19 +34,33 @@ public class TransporterManager
|
|||
|
||||
public static void add(TransporterStack stack)
|
||||
{
|
||||
flowingStacks.add(stack);
|
||||
Set<TransporterStack> set = new HashSet<TransporterStack>();
|
||||
set.add(stack);
|
||||
|
||||
if(flowingStacks.get(stack.getDest()) == null)
|
||||
{
|
||||
flowingStacks.put(stack.getDest(), set);
|
||||
}
|
||||
else {
|
||||
flowingStacks.get(stack.getDest()).addAll(set);
|
||||
}
|
||||
}
|
||||
|
||||
public static void remove(TransporterStack stack)
|
||||
{
|
||||
flowingStacks.remove(stack);
|
||||
if(stack.hasPath() && stack.pathType != Path.NONE)
|
||||
{
|
||||
flowingStacks.get(stack.getDest()).remove(stack);
|
||||
}
|
||||
}
|
||||
|
||||
public static List<TransporterStack> getStacksToDest(Coord4D dest)
|
||||
{
|
||||
List<TransporterStack> ret = new ArrayList<TransporterStack>();
|
||||
|
||||
for(TransporterStack stack : flowingStacks)
|
||||
if(flowingStacks.containsKey(dest))
|
||||
{
|
||||
for(TransporterStack stack : flowingStacks.get(dest))
|
||||
{
|
||||
if(stack != null && stack.pathType != Path.NONE && stack.hasPath())
|
||||
{
|
||||
|
@ -54,6 +70,7 @@ public class TransporterManager
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -7,7 +7,6 @@ import java.util.List;
|
|||
|
||||
import mekanism.api.Coord4D;
|
||||
import mekanism.api.EnumColor;
|
||||
import mekanism.api.transmitters.IBlockableConnection;
|
||||
import mekanism.common.PacketHandler;
|
||||
import mekanism.common.base.ILogisticalTransporter;
|
||||
import mekanism.common.base.ITransporterTile;
|
||||
|
@ -31,7 +30,7 @@ public class TransporterStack
|
|||
|
||||
public ForgeDirection idleDir = ForgeDirection.UNKNOWN;
|
||||
|
||||
public List<Coord4D> pathToTarget = new ArrayList<Coord4D>();
|
||||
private List<Coord4D> pathToTarget = new ArrayList<Coord4D>();
|
||||
|
||||
public Coord4D originalLocation;
|
||||
public Coord4D homeLocation;
|
||||
|
@ -151,9 +150,26 @@ public class TransporterStack
|
|||
return stack;
|
||||
}
|
||||
|
||||
public void setPath(List<Coord4D> path)
|
||||
{
|
||||
TransporterManager.remove(this);
|
||||
|
||||
pathToTarget = path;
|
||||
|
||||
if(pathType != Path.NONE)
|
||||
{
|
||||
TransporterManager.add(this);
|
||||
}
|
||||
}
|
||||
|
||||
public boolean hasPath()
|
||||
{
|
||||
return pathToTarget != null && pathToTarget.size() >= 2;
|
||||
return getPath() != null && getPath().size() >= 2;
|
||||
}
|
||||
|
||||
public List<Coord4D> getPath()
|
||||
{
|
||||
return pathToTarget;
|
||||
}
|
||||
|
||||
public ItemStack recalculatePath(ILogisticalTransporter transporter, int min)
|
||||
|
@ -165,9 +181,9 @@ public class TransporterStack
|
|||
return itemStack;
|
||||
}
|
||||
|
||||
pathToTarget = newPath.path;
|
||||
pathType = Path.DEST;
|
||||
idleDir = ForgeDirection.UNKNOWN;
|
||||
setPath(newPath.path);
|
||||
initiatedPath = true;
|
||||
|
||||
return newPath.rejected;
|
||||
|
@ -182,9 +198,9 @@ public class TransporterStack
|
|||
return itemStack;
|
||||
}
|
||||
|
||||
pathToTarget = newPath.path;
|
||||
pathType = Path.DEST;
|
||||
idleDir = ForgeDirection.UNKNOWN;
|
||||
setPath(newPath.path);
|
||||
initiatedPath = true;
|
||||
|
||||
return newPath.rejected;
|
||||
|
@ -204,7 +220,7 @@ public class TransporterStack
|
|||
idleDir = ForgeDirection.UNKNOWN;
|
||||
}
|
||||
|
||||
pathToTarget = newPath;
|
||||
setPath(newPath);
|
||||
|
||||
originalLocation = transporter.coord();
|
||||
initiatedPath = true;
|
||||
|
@ -310,7 +326,7 @@ public class TransporterStack
|
|||
|
||||
public Coord4D getDest()
|
||||
{
|
||||
return pathToTarget.get(0);
|
||||
return getPath().get(0);
|
||||
}
|
||||
|
||||
public static enum Path
|
||||
|
|
|
@ -20,7 +20,6 @@ import mekanism.common.tile.TileEntityLogisticalSorter;
|
|||
import mekanism.common.util.InventoryUtils;
|
||||
import mekanism.common.util.MekanismUtils;
|
||||
import mekanism.common.util.TransporterUtils;
|
||||
|
||||
import net.minecraft.inventory.IInventory;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
|
@ -80,7 +79,7 @@ public class MultipartTransporter extends MultipartTransmitter<IInventory, Inven
|
|||
|
||||
if(stack.hasPath())
|
||||
{
|
||||
int currentIndex = stack.pathToTarget.indexOf(coord());
|
||||
int currentIndex = stack.getPath().indexOf(coord());
|
||||
|
||||
if(currentIndex == 0) //Necessary for transition reasons, not sure why
|
||||
{
|
||||
|
@ -88,7 +87,7 @@ public class MultipartTransporter extends MultipartTransmitter<IInventory, Inven
|
|||
continue;
|
||||
}
|
||||
|
||||
Coord4D next = stack.pathToTarget.get(currentIndex-1);
|
||||
Coord4D next = stack.getPath().get(currentIndex-1);
|
||||
|
||||
if(!stack.isFinal(this))
|
||||
{
|
||||
|
@ -287,7 +286,6 @@ public class MultipartTransporter extends MultipartTransmitter<IInventory, Inven
|
|||
if(doEmit)
|
||||
{
|
||||
transit.add(stack);
|
||||
TransporterManager.add(stack);
|
||||
Mekanism.packetHandler.sendToReceivers(new TileEntityMessage(coord(), getPart().getSyncPacket(stack, false)), new Range4D(coord()));
|
||||
MekanismUtils.saveChunk(getPart().tile());
|
||||
}
|
||||
|
@ -323,7 +321,6 @@ public class MultipartTransporter extends MultipartTransmitter<IInventory, Inven
|
|||
if(doEmit)
|
||||
{
|
||||
transit.add(stack);
|
||||
TransporterManager.add(stack);
|
||||
Mekanism.packetHandler.sendToReceivers(new TileEntityMessage(coord(), getPart().getSyncPacket(stack, false)), new Range4D(coord()));
|
||||
MekanismUtils.saveChunk(getPart().tile());
|
||||
}
|
||||
|
|
|
@ -1,9 +1,10 @@
|
|||
package mekanism.common.multipart;
|
||||
|
||||
import codechicken.lib.vec.Vector3;
|
||||
import cpw.mods.fml.relauncher.Side;
|
||||
import cpw.mods.fml.relauncher.SideOnly;
|
||||
import io.netty.buffer.ByteBuf;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
|
||||
import mekanism.api.Coord4D;
|
||||
import mekanism.api.EnumColor;
|
||||
import mekanism.api.Range4D;
|
||||
|
@ -35,9 +36,9 @@ import net.minecraft.util.ChatComponentText;
|
|||
import net.minecraft.util.IIcon;
|
||||
import net.minecraftforge.common.util.Constants.NBT;
|
||||
import net.minecraftforge.common.util.ForgeDirection;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import codechicken.lib.vec.Vector3;
|
||||
import cpw.mods.fml.relauncher.Side;
|
||||
import cpw.mods.fml.relauncher.SideOnly;
|
||||
|
||||
public class PartLogisticalTransporter extends PartTransmitter<IInventory, InventoryNetwork> implements ITransporterTile
|
||||
{
|
||||
|
@ -341,7 +342,6 @@ public class PartLogisticalTransporter extends PartTransmitter<IInventory, Inven
|
|||
TransporterStack stack = TransporterStack.readFromNBT(tagList.getCompoundTagAt(i));
|
||||
|
||||
getTransmitter().transit.add(stack);
|
||||
TransporterManager.add(stack);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -12,7 +12,6 @@ import mekanism.common.base.ITransporterTile;
|
|||
import mekanism.common.content.transporter.TransporterManager;
|
||||
import mekanism.common.content.transporter.TransporterStack;
|
||||
import mekanism.common.tile.TileEntityLogisticalSorter;
|
||||
|
||||
import net.minecraft.entity.item.EntityItem;
|
||||
import net.minecraft.inventory.IInventory;
|
||||
import net.minecraft.inventory.ISidedInventory;
|
||||
|
@ -198,7 +197,7 @@ public final class TransporterUtils
|
|||
{
|
||||
float[] pos;
|
||||
|
||||
if(stack.pathToTarget != null)
|
||||
if(stack.hasPath())
|
||||
{
|
||||
pos = TransporterUtils.getStackPosition(tileEntity, stack, 0);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue