protected boolean chooseOutput() { List<ForgeDirection> conveyorSides = new ArrayList<ForgeDirection>(); List<ForgeDirection> machineSides = new ArrayList<ForgeDirection>(); List<ForgeDirection> emptySides = new ArrayList<ForgeDirection>(); List<ForgeDirection> sides; for (ForgeDirection d : allowedOutputs) { if (moveTo(d, true)) { TileEntity tile = owner.getNeighborTile(d); if (tile instanceof ITravellingObjectContainer) { conveyorSides.add(d); } else if (tile != null) { machineSides.add(d); } else { emptySides.add(d); } } } sides = machineSides.size() > 0 ? machineSides : (conveyorSides.size() > 0 ? conveyorSides : emptySides); if (sides.size() > 0) { Collections.shuffle(sides); output = sides.get(0); return true; } return false; }
protected boolean moveTo(ForgeDirection side, boolean simulate) { TileEntity tile = owner.getNeighborTile(side); if (tile instanceof TileConveyorBelt) { return ((TileConveyorBelt) tile).injectObject(this, output.getOpposite(), true, simulate); } return false; }
public boolean tick() { if (reached) { return true; } if (metCenter && output == ForgeDirection.UNKNOWN) { chooseOutput(); if (output == ForgeDirection.UNKNOWN) { return false; } else if (!owner.world().isRemote) { ConveyorPacketManager.INSTANCE.updateItemOutput(owner, this); } } this.dY += inputY.offsetY * owner.speed(); if (metCenter) { this.dX += output.offsetX * owner.speed(); this.dZ += output.offsetZ * owner.speed(); if (Math.abs(dX) >= Math.abs(output.offsetX * 0.5F) && Math.abs(dZ) >= Math.abs(output.offsetZ * 0.5F)) { dX = output.offsetX * 0.5F; dY = inputY == ForgeDirection.UP ? 1.125F : 0.125F; dZ = output.offsetZ * 0.5F; reached = true; return true; } } else { float oldX = dX; float oldZ = dZ; this.dX -= input.offsetX * owner.speed(); this.dZ -= input.offsetZ * owner.speed(); if ((dX == 0.0F || ((oldX != 0.0F && oldX * dX <= 0))) && (dZ == 0.0F || (oldZ != 0.0F && oldZ * dZ <= 0))) { setPositionToCenter(); metCenter = true; } } return false; }