Complete redesign and repackage of Item Railings, some cleanup before moving to 1.7
This commit is contained in:
parent
9bbc8e4d2c
commit
78ba973732
7 changed files with 142 additions and 433 deletions
|
@ -0,0 +1,10 @@
|
|||
package resonantinduction.electrical.itemrailing;
|
||||
|
||||
/**
|
||||
* @since 25/05/14
|
||||
* @author tgame14
|
||||
*/
|
||||
public enum EnumRailingMaterial
|
||||
{
|
||||
DEFAULT, EXTENTION;
|
||||
}
|
|
@ -1,57 +1,15 @@
|
|||
package resonantinduction.electrical.itemrailing;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
import resonant.lib.grid.TickingGrid;
|
||||
import resonantinduction.electrical.itemrailing.interfaces.IItemRailing;
|
||||
import resonantinduction.electrical.itemrailing.interfaces.IItemRailingTransfer;
|
||||
|
||||
/**
|
||||
* @since 18/03/14
|
||||
* @since 25/05/14
|
||||
* @author tgame14
|
||||
*/
|
||||
public class GridRailing extends TickingGrid<NodeRailing>
|
||||
{
|
||||
public final static String CATEGORY_RAILING = "Item_Railings";
|
||||
|
||||
public GridRailing (NodeRailing railing, Class type)
|
||||
public GridRailing (NodeRailing node, Class type)
|
||||
{
|
||||
super(railing, type);
|
||||
}
|
||||
|
||||
public IItemRailing findTargetForIItemTransfer(IItemRailingTransfer itemwrapper)
|
||||
{
|
||||
if (itemwrapper.getColor() == null)
|
||||
{
|
||||
return findNearestInventory(itemwrapper);
|
||||
}
|
||||
return findNearestColoredTarget(itemwrapper);
|
||||
}
|
||||
|
||||
public IItemRailing findNearestInventory(IItemRailingTransfer itemwrapper)
|
||||
{
|
||||
IItemRailing[] arr = (IItemRailing[]) this.getNodes().toArray();
|
||||
Arrays.sort(arr, new RailingDistanceComparator.RailingInventoryDistanceComparator(itemwrapper.getRailing()));
|
||||
return arr[0];
|
||||
}
|
||||
|
||||
public IItemRailing findNearestColoredTarget(IItemRailingTransfer itemwrapper)
|
||||
{
|
||||
IItemRailing[] arr = (IItemRailing[]) this.getNodes().toArray();
|
||||
Arrays.sort(arr, new RailingDistanceComparator.RailingColoredDistanceComparator(itemwrapper.getRailing(), itemwrapper.getColor()));
|
||||
return arr[0];
|
||||
}
|
||||
|
||||
public IItemRailing chooseNextInstantGoal(IItemRailingTransfer itemwrapper)
|
||||
{
|
||||
IItemRailing[] arr = (IItemRailing[]) itemwrapper.getRailing().getConnectionMap().entrySet().toArray();
|
||||
Arrays.sort(arr, new RailingDistanceComparator(itemwrapper.getEndGoal()));
|
||||
return arr[0];
|
||||
}
|
||||
|
||||
public void onItemEnterGrid(IItemRailing railing, ItemStack item)
|
||||
{
|
||||
|
||||
super(node, type);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,80 +0,0 @@
|
|||
package resonantinduction.electrical.itemrailing;
|
||||
|
||||
import java.lang.ref.WeakReference;
|
||||
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import resonant.lib.render.EnumColor;
|
||||
import resonantinduction.electrical.itemrailing.interfaces.IItemRailing;
|
||||
import resonantinduction.electrical.itemrailing.interfaces.IItemRailingTransfer;
|
||||
|
||||
/**
|
||||
* An object that is a wrapper for all items through railings
|
||||
*
|
||||
* @since 16/03/14
|
||||
* @author tgame14
|
||||
*/
|
||||
public class ItemRailingTransfer implements IItemRailingTransfer
|
||||
{
|
||||
private ItemStack stack;
|
||||
private EnumColor color;
|
||||
private WeakReference<IItemRailing> railing;
|
||||
private WeakReference<IItemRailing> endTarget;
|
||||
|
||||
public ItemRailingTransfer(ItemStack stack, PartRailing railing)
|
||||
{
|
||||
this.stack = stack.copy();
|
||||
this.color = null;
|
||||
this.railing = new WeakReference<IItemRailing>(railing.getNode());
|
||||
this.endTarget = new WeakReference<IItemRailing>(railing.getNode().getGrid().findTargetForIItemTransfer(this));
|
||||
}
|
||||
|
||||
public ItemRailingTransfer(Item item, PartRailing railing)
|
||||
{
|
||||
this(new ItemStack(item), railing);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack getItemStack()
|
||||
{
|
||||
return this.stack;
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumColor getColor()
|
||||
{
|
||||
return this.color;
|
||||
}
|
||||
|
||||
public IItemRailingTransfer setColor(EnumColor color)
|
||||
{
|
||||
this.color = color;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IItemRailing getRailing()
|
||||
{
|
||||
return this.railing.get();
|
||||
}
|
||||
|
||||
@Override
|
||||
public IItemRailingTransfer setRailing(IItemRailing railing)
|
||||
{
|
||||
this.railing = new WeakReference<IItemRailing>(railing);
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IItemRailing getEndGoal()
|
||||
{
|
||||
return endTarget.get();
|
||||
}
|
||||
|
||||
@Override
|
||||
public IItemRailingTransfer setEndGoal(IItemRailing goal)
|
||||
{
|
||||
this.endTarget = new WeakReference<IItemRailing>(goal);
|
||||
return this;
|
||||
}
|
||||
}
|
|
@ -1,51 +1,28 @@
|
|||
package resonantinduction.electrical.itemrailing;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import net.minecraft.inventory.IInventory;
|
||||
import codechicken.multipart.TMultiPart;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.common.ForgeDirection;
|
||||
import resonant.lib.config.Config;
|
||||
import resonant.lib.grid.Node;
|
||||
import resonant.lib.render.EnumColor;
|
||||
import resonant.lib.type.Pair;
|
||||
import resonantinduction.electrical.itemrailing.interfaces.IItemRailing;
|
||||
import resonant.lib.grid.TickingGrid;
|
||||
import resonantinduction.electrical.itemrailing.interfaces.IItemRailingProvider;
|
||||
import resonantinduction.electrical.itemrailing.interfaces.IItemRailingTransfer;
|
||||
import universalelectricity.api.vector.IVectorWorld;
|
||||
import universalelectricity.api.vector.VectorWorld;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
import universalelectricity.api.vector.IVector3;
|
||||
import universalelectricity.api.vector.Vector3;
|
||||
|
||||
/**
|
||||
* @since 25/05/14
|
||||
* @author tgame14
|
||||
* @since 18/03/14
|
||||
*/
|
||||
public class NodeRailing extends Node<IItemRailingProvider, GridRailing, Object> implements IVectorWorld, IItemRailing
|
||||
public class NodeRailing extends Node<IItemRailingProvider, GridRailing, Object>
|
||||
{
|
||||
private int maxItemSpeed;
|
||||
private byte connectionMap;
|
||||
private EnumColor color;
|
||||
|
||||
@Config(category = GridRailing.CATEGORY_RAILING)
|
||||
private static int MAX_TICKS_IN_RAILING = 5;
|
||||
|
||||
/** hold a timer here per item */
|
||||
private Set<Pair<IItemRailingTransfer, Integer>> itemNodeSet;
|
||||
|
||||
protected byte connectionMap = Byte.parseByte("111111", 2);
|
||||
|
||||
public NodeRailing (IItemRailingProvider parent)
|
||||
{
|
||||
super(parent);
|
||||
this.itemNodeSet = new HashSet<Pair<IItemRailingTransfer, Integer>>();
|
||||
this.color = null;
|
||||
this.connectionMap = Byte.parseByte("111111", 2);
|
||||
this.maxItemSpeed = 20;
|
||||
}
|
||||
|
||||
public NodeRailing setConnection(byte connectionMap)
|
||||
|
@ -54,128 +31,64 @@ public class NodeRailing extends Node<IItemRailingProvider, GridRailing, Object>
|
|||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(float deltaTime)
|
||||
{
|
||||
if (!world().isRemote)
|
||||
{
|
||||
Iterator<Map.Entry<Object, ForgeDirection>> iterator = new HashMap(getConnections()).entrySet().iterator();
|
||||
|
||||
for (Pair<IItemRailingTransfer, Integer> pair : this.itemNodeSet)
|
||||
{
|
||||
if (pair.right() <= 0)
|
||||
{
|
||||
//TODO move to next item railing
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
pair.setRight(pair.right() - 1);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
while (iterator.hasNext())
|
||||
{
|
||||
Map.Entry<Object, ForgeDirection> entry = iterator.next();
|
||||
Object obj = entry.getKey();
|
||||
|
||||
if (obj instanceof NodeRailing)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected GridRailing newGrid ()
|
||||
{
|
||||
return new GridRailing(this, getClass());
|
||||
return new GridRailing(this, NodeRailing.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public double z()
|
||||
public void update (float deltaTime)
|
||||
{
|
||||
return this.getWorldPos().z();
|
||||
super.update(deltaTime);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doRecache ()
|
||||
{
|
||||
connections.clear();
|
||||
|
||||
for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS)
|
||||
{
|
||||
TileEntity tile = new Vector3(position()).translate(dir).getTileEntity(world());
|
||||
|
||||
if (tile instanceof IItemRailingProvider)
|
||||
{
|
||||
NodeRailing check = (NodeRailing) ((IItemRailingProvider) tile).getNode(NodeRailing.class, dir.getOpposite());
|
||||
|
||||
if (check != null && canConnect(dir, check) && check.canConnect(dir.getOpposite(), this))
|
||||
{
|
||||
connections.put(check, dir);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public IVector3 position()
|
||||
{
|
||||
return parent.getVectorWorld();
|
||||
}
|
||||
|
||||
public World world()
|
||||
{
|
||||
return parent.getWorldPos().world();
|
||||
return parent.getVectorWorld().world();
|
||||
}
|
||||
|
||||
@Override
|
||||
public double x()
|
||||
public boolean canConnect (ForgeDirection from, Object source)
|
||||
{
|
||||
return parent.getWorldPos().x();
|
||||
return (source instanceof NodeRailing) && (connectionMap & (1 << from.ordinal())) != 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double y()
|
||||
public void load (NBTTagCompound nbt)
|
||||
{
|
||||
return parent.getWorldPos().y();
|
||||
super.load(nbt);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canItemEnter (IItemRailingTransfer item)
|
||||
public void save (NBTTagCompound nbt)
|
||||
{
|
||||
return this.color != null ? this.color == item.getColor() : false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canConnectToRailing (IItemRailing railing, ForgeDirection from)
|
||||
{
|
||||
return this.color != null ? this.color == railing.getRailingColor() : true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumColor getRailingColor ()
|
||||
{
|
||||
return this.color;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IItemRailing setRailingColor (EnumColor color)
|
||||
{
|
||||
this.color = color;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public VectorWorld getWorldPos()
|
||||
{
|
||||
return (VectorWorld) parent.getWorldPos();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<Object, ForgeDirection> getConnectionMap()
|
||||
{
|
||||
return new HashMap<Object, ForgeDirection>(this.getConnections());
|
||||
}
|
||||
|
||||
@Override
|
||||
public IInventory[] getInventoriesNearby()
|
||||
{
|
||||
ArrayList<IInventory> invList = Lists.<IInventory>newArrayList();
|
||||
for (Object tile : this.getConnections().entrySet())
|
||||
{
|
||||
if (tile instanceof IInventory)
|
||||
{
|
||||
invList.add((IInventory) tile);
|
||||
super.save(nbt);
|
||||
}
|
||||
}
|
||||
return (IInventory[]) invList.toArray();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLeaf()
|
||||
{
|
||||
return connectionMap < 2;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -2,17 +2,28 @@ package resonantinduction.electrical.itemrailing;
|
|||
|
||||
import java.lang.reflect.Constructor;
|
||||
|
||||
import codechicken.lib.vec.Vector3;
|
||||
import codechicken.microblock.IHollowConnect;
|
||||
import codechicken.multipart.JNormalOcclusion;
|
||||
import codechicken.multipart.TSlottedPart;
|
||||
import net.minecraft.inventory.IInventory;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraftforge.common.ForgeDirection;
|
||||
import resonant.api.IExternalInventory;
|
||||
import resonant.api.IExternalInventoryBox;
|
||||
import resonant.api.grid.INode;
|
||||
import resonant.lib.utility.inventory.ExternalInventory;
|
||||
import resonantinduction.core.prefab.part.PartFramedConnection;
|
||||
import resonantinduction.core.prefab.part.PartFramedNode;
|
||||
import resonantinduction.electrical.Electrical;
|
||||
import resonantinduction.electrical.itemrailing.interfaces.IItemRailingProvider;
|
||||
import universalelectricity.api.energy.EnergyNetworkLoader;
|
||||
import universalelectricity.api.energy.IConductor;
|
||||
import universalelectricity.api.energy.IEnergyNetwork;
|
||||
import universalelectricity.api.net.IConnector;
|
||||
import universalelectricity.api.net.INetwork;
|
||||
import universalelectricity.api.vector.IVectorWorld;
|
||||
import universalelectricity.api.vector.VectorWorld;
|
||||
import codechicken.multipart.TileMultipart;
|
||||
|
||||
|
@ -20,26 +31,19 @@ import codechicken.multipart.TileMultipart;
|
|||
* @since 16/03/14
|
||||
* @author tgame14
|
||||
*/
|
||||
public class PartRailing extends PartFramedConnection<PartRailing.EnumRailing, IConductor, IEnergyNetwork> implements IConductor, IItemRailingProvider
|
||||
public class PartRailing extends PartFramedNode<EnumRailingMaterial, NodeRailing, IItemRailingProvider> implements IItemRailingProvider, TSlottedPart, JNormalOcclusion, IHollowConnect, IExternalInventory
|
||||
{
|
||||
|
||||
public static enum EnumRailing
|
||||
{
|
||||
DEFAULT, EXTENTION;
|
||||
}
|
||||
|
||||
public NodeRailing getNode()
|
||||
{
|
||||
return node;
|
||||
}
|
||||
|
||||
private NodeRailing node;
|
||||
protected ExternalInventory inventory;
|
||||
protected boolean markPacketUpdate;
|
||||
|
||||
public PartRailing ()
|
||||
{
|
||||
super(Electrical.itemInsulation);
|
||||
this.material = EnumRailing.DEFAULT;
|
||||
this.material = EnumRailingMaterial.DEFAULT;
|
||||
this.node = new NodeRailing(this);
|
||||
this.markPacketUpdate = true;
|
||||
this.requiresInsulation = false;
|
||||
this.inventory = new ExternalInventory(tile(), 5);
|
||||
}
|
||||
|
||||
|
||||
|
@ -72,71 +76,23 @@ public class PartRailing extends PartFramedConnection<PartRailing.EnumRailing, I
|
|||
return new VectorWorld(getWorld(), x(), y(), z());
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getResistance ()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getCurrentCapacity ()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long onReceiveEnergy (ForgeDirection from, long receive, boolean doReceive)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long onExtractEnergy (ForgeDirection from, long extract, boolean doExtract)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean doesTick ()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean canConnectTo (TileEntity tile, ForgeDirection to)
|
||||
{
|
||||
Object obj = tile instanceof TileMultipart ? ((TileMultipart) tile).partMap(ForgeDirection.UNKNOWN.ordinal()) : tile;
|
||||
return obj instanceof IInventory ? true : obj instanceof PartRailing;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected IConductor getConnector (TileEntity tile)
|
||||
{
|
||||
return tile instanceof IConductor ? (IConductor) ((IConductor) tile).getInstance(ForgeDirection.UNKNOWN) : null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IEnergyNetwork getNetwork()
|
||||
{
|
||||
if (network == null)
|
||||
{
|
||||
setNetwork(EnergyNetworkLoader.getNewNetwork(this));
|
||||
}
|
||||
|
||||
return network;
|
||||
}
|
||||
|
||||
//TODO: Fix up to proper data
|
||||
@Override
|
||||
public void setMaterial (int i)
|
||||
{
|
||||
this.material = EnumRailing.values()[i];
|
||||
this.material = EnumRailingMaterial.values()[i];
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ItemStack getItem ()
|
||||
{
|
||||
return new ItemStack(Electrical.itemRailing);
|
||||
return new ItemStack(Electrical.itemRailing, 1, getMaterialID());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -145,4 +101,42 @@ public class PartRailing extends PartFramedConnection<PartRailing.EnumRailing, I
|
|||
return "resonant_induction_itemrailing";
|
||||
}
|
||||
|
||||
@Override
|
||||
public void renderDynamic (Vector3 pos, float frame, int pass)
|
||||
{
|
||||
super.renderDynamic(pos, frame, pass);
|
||||
//TODO: Implement
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public IVectorWorld getVectorWorld ()
|
||||
{
|
||||
return new VectorWorld(getWorld(), x(), y(), z());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onInventoryChanged ()
|
||||
{
|
||||
//TODO: Implement
|
||||
}
|
||||
|
||||
@Override
|
||||
public IExternalInventoryBox getInventory ()
|
||||
{
|
||||
return this.inventory;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canStore (ItemStack stack, int slot, ForgeDirection side)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canRemove (ItemStack stack, int slot, ForgeDirection side)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,88 +0,0 @@
|
|||
package resonantinduction.electrical.itemrailing;
|
||||
|
||||
import java.util.Comparator;
|
||||
|
||||
import resonant.lib.render.EnumColor;
|
||||
import resonantinduction.electrical.itemrailing.interfaces.IItemRailing;
|
||||
|
||||
/**
|
||||
* @author tgame14
|
||||
* @since 16/04/14
|
||||
*/
|
||||
public class RailingDistanceComparator implements Comparator<IItemRailing>
|
||||
{
|
||||
private IItemRailing source;
|
||||
|
||||
public RailingDistanceComparator(IItemRailing source)
|
||||
{
|
||||
this.source = source;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int compare(IItemRailing o1, IItemRailing o2)
|
||||
{
|
||||
return (int) (source.getWorldPos().floor().distance(o1.getWorldPos()) - source.getWorldPos().floor().distance(o2.getWorldPos()));
|
||||
}
|
||||
|
||||
|
||||
public static class RailingInventoryDistanceComparator extends RailingDistanceComparator
|
||||
{
|
||||
public RailingInventoryDistanceComparator(IItemRailing source)
|
||||
{
|
||||
super(source);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int compare(IItemRailing o1, IItemRailing o2)
|
||||
{
|
||||
if (o1.getInventoriesNearby() != null && o2.getInventoriesNearby() != null)
|
||||
{
|
||||
return super.compare(o1, o2);
|
||||
}
|
||||
|
||||
else if (o1.getInventoriesNearby() == null && o2.getInventoriesNearby() == null)
|
||||
{
|
||||
return super.compare(o1, o2);
|
||||
}
|
||||
|
||||
if (o1.getInventoriesNearby() != null)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static class RailingColoredDistanceComparator extends RailingDistanceComparator
|
||||
{
|
||||
private EnumColor color;
|
||||
|
||||
public RailingColoredDistanceComparator(IItemRailing source, EnumColor color)
|
||||
{
|
||||
super(source);
|
||||
this.color = color;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int compare(IItemRailing o1, IItemRailing o2)
|
||||
{
|
||||
if (o1.getRailingColor() == o2.getRailingColor())
|
||||
{
|
||||
return super.compare(o1, o2);
|
||||
}
|
||||
|
||||
else if (color == o1.getRailingColor())
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
else if (color == o2.getRailingColor())
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
return super.compare(o1, o2);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -9,5 +9,7 @@ import universalelectricity.api.vector.IVectorWorld;
|
|||
*/
|
||||
public interface IItemRailingProvider extends INodeProvider
|
||||
{
|
||||
public IVectorWorld getWorldPos();
|
||||
public IVectorWorld getVectorWorld();
|
||||
|
||||
public void onInventoryChanged();
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue