Skip to content

Commit b426d31

Browse files
authored
Merge pull request #4 from TeamOpenIndustry/mc_rails_compat
Add better MC rails compatibility
2 parents 10ab0fb + 5d9aef3 commit b426d31

1 file changed

Lines changed: 52 additions & 26 deletions

File tree

src/main/java/trackapi/compat/MinecraftRail.java

Lines changed: 52 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,42 @@
99
import trackapi.lib.Gauges;
1010
import trackapi.lib.ITrack;
1111

12+
import java.util.HashMap;
13+
import java.util.Map;
14+
1215
public class MinecraftRail implements ITrack {
16+
private static Map<EnumRailDirection, Vec3d> vectors = new HashMap<>();
17+
private static Map<EnumRailDirection, Vec3d> centers = new HashMap<>();
18+
static {
19+
Vec3d north = new Vec3d(0, 0, 1);
20+
Vec3d south = new Vec3d(0, 0, -1);
21+
Vec3d east = new Vec3d(1, 0, 0);
22+
Vec3d west = new Vec3d(-1, 0, 0);
23+
Vec3d ascending = new Vec3d(0, 1, 0);
24+
25+
vectors.put(EnumRailDirection.ASCENDING_EAST, east.add(ascending).normalize());
26+
vectors.put(EnumRailDirection.ASCENDING_NORTH, north.add(ascending).normalize());
27+
vectors.put(EnumRailDirection.ASCENDING_SOUTH, south.add(ascending).normalize());
28+
vectors.put(EnumRailDirection.ASCENDING_WEST, west.add(ascending).normalize());
29+
vectors.put(EnumRailDirection.EAST_WEST, east.normalize());
30+
vectors.put(EnumRailDirection.NORTH_EAST, north.add(east).normalize());
31+
vectors.put(EnumRailDirection.NORTH_SOUTH, north.normalize());
32+
vectors.put(EnumRailDirection.NORTH_WEST, north.add(west).normalize());
33+
vectors.put(EnumRailDirection.SOUTH_EAST, south.add(east).normalize());
34+
vectors.put(EnumRailDirection.SOUTH_WEST, south.add(west).normalize());
35+
36+
centers.put(EnumRailDirection.ASCENDING_EAST, new Vec3d(0.5, 0.5, 0.5));
37+
centers.put(EnumRailDirection.ASCENDING_NORTH, new Vec3d(0.5, 0.5, 0.5));
38+
centers.put(EnumRailDirection.ASCENDING_SOUTH, new Vec3d(0.5, 0.5, 0.5));
39+
centers.put(EnumRailDirection.ASCENDING_WEST, new Vec3d(0.5, 0.5, 0.5));
40+
centers.put(EnumRailDirection.EAST_WEST, new Vec3d(0.5, 0.1, 0.5));
41+
centers.put(EnumRailDirection.NORTH_EAST, new Vec3d(0.75, 0.1, 0.25));
42+
centers.put(EnumRailDirection.NORTH_SOUTH, new Vec3d(0.5, 0.1, 0.5));
43+
centers.put(EnumRailDirection.NORTH_WEST, new Vec3d(0.25, 0.1, 0.25));
44+
centers.put(EnumRailDirection.SOUTH_EAST, new Vec3d(0.75, 0.1, 0.75));
45+
centers.put(EnumRailDirection.SOUTH_WEST, new Vec3d(0.25, 0.1, 0.75));
46+
}
47+
1348

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

2964
@Override
3065
public Vec3d getNextPosition(Vec3d currentPosition, Vec3d motion) {
31-
//TODO fill in the rest of the states
32-
33-
switch (direction) {
34-
case ASCENDING_EAST:
35-
break;
36-
case ASCENDING_NORTH:
37-
break;
38-
case ASCENDING_SOUTH:
39-
break;
40-
case ASCENDING_WEST:
41-
break;
42-
case EAST_WEST:
43-
return currentPosition.addVector(motion.x > 0 ? motion.lengthVector() : -motion.lengthVector(), 0, pos.getZ() - currentPosition.z + 0.5);
44-
case NORTH_EAST:
45-
break;
46-
case NORTH_SOUTH:
47-
return currentPosition.addVector(pos.getX() - currentPosition.x + 0.5, 0, motion.z > 0 ? motion.lengthVector() : -motion.lengthVector());
48-
case NORTH_WEST:
49-
break;
50-
case SOUTH_EAST:
51-
break;
52-
case SOUTH_WEST:
53-
break;
54-
}
55-
56-
return currentPosition;
66+
Vec3d trackMovement = vectors.get(direction);
67+
Vec3d trackCenter = centers.get(direction);
68+
69+
Vec3d posRelativeToCenter = currentPosition.subtractReverse(new Vec3d(pos).add(trackCenter));
70+
double distanceToCenter = posRelativeToCenter.lengthVector();
71+
72+
// Determine if trackMovement should be positive or negative as relative to block center
73+
boolean trackPosMotionInverted = posRelativeToCenter.distanceTo(trackMovement) < posRelativeToCenter.scale(-1).distanceTo(trackMovement);
74+
75+
boolean trackMotionInverted = motion.distanceTo(trackMovement) > motion.scale(-1).distanceTo(trackMovement);
76+
77+
Vec3d newPosition = new Vec3d(pos).add(trackCenter);
78+
//Correct new pos to track alignment
79+
newPosition = newPosition.add(trackMovement.scale(trackPosMotionInverted ? -distanceToCenter : distanceToCenter));
80+
// Move new pos along track alignment
81+
newPosition = newPosition.add(trackMovement.scale(trackMotionInverted ? -motion.lengthVector() : motion.lengthVector()));
82+
return newPosition;
5783
}
5884

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

0 commit comments

Comments
 (0)