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 ;
@@ -26,68 +61,10 @@ public double getTrackGauge() {
2661 return Gauges .MINECRAFT ;
2762 }
2863
29- public Vec3d getTrackVector () {
30- Vec3d north = new Vec3d (0 , 0 , 1 );
31- Vec3d south = new Vec3d (0 , 0 , -1 );
32- Vec3d east = new Vec3d (1 , 0 , 0 );
33- Vec3d west = new Vec3d (-1 , 0 , 0 );
34- Vec3d ascending = new Vec3d (0 , 1 , 0 );
35-
36-
37- switch (direction ) {
38- case ASCENDING_EAST :
39- return east .add (ascending ).normalize ();
40- case ASCENDING_NORTH :
41- return north .add (ascending ).normalize ();
42- case ASCENDING_SOUTH :
43- return south .add (ascending ).normalize ();
44- case ASCENDING_WEST :
45- return west .add (ascending ).normalize ();
46- case EAST_WEST :
47- return east .normalize ();
48- case NORTH_EAST :
49- return north .add (east ).normalize ();
50- case NORTH_SOUTH :
51- return north .normalize ();
52- case NORTH_WEST :
53- return north .add (west ).normalize ();
54- case SOUTH_EAST :
55- return south .add (east ).normalize ();
56- case SOUTH_WEST :
57- return south .add (west ).normalize ();
58- default :
59- return null ;
60- }
61- }
62-
63- public Vec3d getTrackCenter () {
64- switch (direction ) {
65- case ASCENDING_EAST :
66- case ASCENDING_NORTH :
67- case ASCENDING_SOUTH :
68- case ASCENDING_WEST :
69- return new Vec3d (0.5 , 0.5 , 0.5 );
70- case EAST_WEST :
71- return new Vec3d (0.5 , 0.1 , 0.5 );
72- case NORTH_EAST :
73- return new Vec3d (0.75 , 0.1 , 0.25 );
74- case NORTH_SOUTH :
75- return new Vec3d (0.5 , 0.1 , 0.5 );
76- case NORTH_WEST :
77- return new Vec3d (0.25 , 0.1 , 0.25 );
78- case SOUTH_EAST :
79- return new Vec3d (0.75 , 0.1 , 0.75 );
80- case SOUTH_WEST :
81- return new Vec3d (0.25 , 0.1 , 0.75 );
82- default :
83- return null ;
84- }
85- }
86-
8764 @ Override
8865 public Vec3d getNextPosition (Vec3d currentPosition , Vec3d motion ) {
89- Vec3d trackMovement = getTrackVector ( );
90- Vec3d trackCenter = getTrackCenter ( );
66+ Vec3d trackMovement = vectors . get ( direction );
67+ Vec3d trackCenter = centers . get ( direction );
9168
9269 Vec3d posRelativeToCenter = currentPosition .subtractReverse (new Vec3d (pos ).add (trackCenter ));
9370 double distanceToCenter = posRelativeToCenter .lengthVector ();
0 commit comments