99import trackapi .lib .Gauges ;
1010import trackapi .lib .ITrack ;
1111
12+ import java .util .HashMap ;
13+ import java .util .Map ;
14+
1215public 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