Skip to content

Commit

Permalink
Merge pull request #4 from TeamOpenIndustry/mc_rails_compat
Browse files Browse the repository at this point in the history
Add better MC rails compatibility
  • Loading branch information
cam72cam authored Oct 17, 2019
2 parents 10ab0fb + 5d9aef3 commit b426d31
Showing 1 changed file with 52 additions and 26 deletions.
78 changes: 52 additions & 26 deletions src/main/java/trackapi/compat/MinecraftRail.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,42 @@
import trackapi.lib.Gauges;
import trackapi.lib.ITrack;

import java.util.HashMap;
import java.util.Map;

public class MinecraftRail implements ITrack {
private static Map<EnumRailDirection, Vec3d> vectors = new HashMap<>();
private static Map<EnumRailDirection, Vec3d> centers = new HashMap<>();
static {
Vec3d north = new Vec3d(0, 0, 1);
Vec3d south = new Vec3d(0, 0, -1);
Vec3d east = new Vec3d(1, 0, 0);
Vec3d west = new Vec3d(-1, 0, 0);
Vec3d ascending = new Vec3d(0, 1, 0);

vectors.put(EnumRailDirection.ASCENDING_EAST, east.add(ascending).normalize());
vectors.put(EnumRailDirection.ASCENDING_NORTH, north.add(ascending).normalize());
vectors.put(EnumRailDirection.ASCENDING_SOUTH, south.add(ascending).normalize());
vectors.put(EnumRailDirection.ASCENDING_WEST, west.add(ascending).normalize());
vectors.put(EnumRailDirection.EAST_WEST, east.normalize());
vectors.put(EnumRailDirection.NORTH_EAST, north.add(east).normalize());
vectors.put(EnumRailDirection.NORTH_SOUTH, north.normalize());
vectors.put(EnumRailDirection.NORTH_WEST, north.add(west).normalize());
vectors.put(EnumRailDirection.SOUTH_EAST, south.add(east).normalize());
vectors.put(EnumRailDirection.SOUTH_WEST, south.add(west).normalize());

centers.put(EnumRailDirection.ASCENDING_EAST, new Vec3d(0.5, 0.5, 0.5));
centers.put(EnumRailDirection.ASCENDING_NORTH, new Vec3d(0.5, 0.5, 0.5));
centers.put(EnumRailDirection.ASCENDING_SOUTH, new Vec3d(0.5, 0.5, 0.5));
centers.put(EnumRailDirection.ASCENDING_WEST, new Vec3d(0.5, 0.5, 0.5));
centers.put(EnumRailDirection.EAST_WEST, new Vec3d(0.5, 0.1, 0.5));
centers.put(EnumRailDirection.NORTH_EAST, new Vec3d(0.75, 0.1, 0.25));
centers.put(EnumRailDirection.NORTH_SOUTH, new Vec3d(0.5, 0.1, 0.5));
centers.put(EnumRailDirection.NORTH_WEST, new Vec3d(0.25, 0.1, 0.25));
centers.put(EnumRailDirection.SOUTH_EAST, new Vec3d(0.75, 0.1, 0.75));
centers.put(EnumRailDirection.SOUTH_WEST, new Vec3d(0.25, 0.1, 0.75));
}


private EnumRailDirection direction;
private BlockPos pos;
Expand All @@ -28,32 +63,23 @@ public double getTrackGauge() {

@Override
public Vec3d getNextPosition(Vec3d currentPosition, Vec3d motion) {
//TODO fill in the rest of the states

switch (direction) {
case ASCENDING_EAST:
break;
case ASCENDING_NORTH:
break;
case ASCENDING_SOUTH:
break;
case ASCENDING_WEST:
break;
case EAST_WEST:
return currentPosition.addVector(motion.x > 0 ? motion.lengthVector() : -motion.lengthVector(), 0, pos.getZ() - currentPosition.z + 0.5);
case NORTH_EAST:
break;
case NORTH_SOUTH:
return currentPosition.addVector(pos.getX() - currentPosition.x + 0.5, 0, motion.z > 0 ? motion.lengthVector() : -motion.lengthVector());
case NORTH_WEST:
break;
case SOUTH_EAST:
break;
case SOUTH_WEST:
break;
}

return currentPosition;
Vec3d trackMovement = vectors.get(direction);
Vec3d trackCenter = centers.get(direction);

Vec3d posRelativeToCenter = currentPosition.subtractReverse(new Vec3d(pos).add(trackCenter));
double distanceToCenter = posRelativeToCenter.lengthVector();

// Determine if trackMovement should be positive or negative as relative to block center
boolean trackPosMotionInverted = posRelativeToCenter.distanceTo(trackMovement) < posRelativeToCenter.scale(-1).distanceTo(trackMovement);

boolean trackMotionInverted = motion.distanceTo(trackMovement) > motion.scale(-1).distanceTo(trackMovement);

Vec3d newPosition = new Vec3d(pos).add(trackCenter);
//Correct new pos to track alignment
newPosition = newPosition.add(trackMovement.scale(trackPosMotionInverted ? -distanceToCenter : distanceToCenter));
// Move new pos along track alignment
newPosition = newPosition.add(trackMovement.scale(trackMotionInverted ? -motion.lengthVector() : motion.lengthVector()));
return newPosition;
}

public static boolean isRail(World world, BlockPos pos) {
Expand Down

0 comments on commit b426d31

Please sign in to comment.