コード例 #1
0
  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;
  }
コード例 #2
0
 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;
 }
コード例 #3
0
  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;
  }