21
21
import com .minecrafttas .tasmod .playback .metadata .PlaybackMetadata ;
22
22
import com .minecrafttas .tasmod .playback .tasfile .exception .PlaybackLoadException ;
23
23
import com .minecrafttas .tasmod .registries .TASmodAPIRegistry ;
24
+ import com .minecrafttas .tasmod .virtual .Subtickable ;
24
25
import com .minecrafttas .tasmod .virtual .VirtualCameraAngle ;
25
26
import com .minecrafttas .tasmod .virtual .VirtualKey ;
26
27
import com .minecrafttas .tasmod .virtual .VirtualKeyboard ;
@@ -90,6 +91,7 @@ protected void serialiseFileCommandNames(List<String> out) {
90
91
List <PlaybackFileCommandExtension > extensionList = TASmodAPIRegistry .PLAYBACK_FILE_COMMAND .getEnabled ();
91
92
extensionList .forEach (extension -> stringlist .add (extension .getExtensionName ()));
92
93
out .add ("FileCommand-Extensions: " + String .join (", " , stringlist ));
94
+ out .add ("" );
93
95
}
94
96
95
97
protected void serialiseMetadata (List <String > out ) {
@@ -122,14 +124,17 @@ public BigArrayList<String> serialise(BigArrayList<TickContainer> inputs, long t
122
124
currentTick = i ;
123
125
TickContainer container = inputs .get (i );
124
126
serialiseContainer (out , container );
127
+ previousTickContainer = container ;
125
128
}
126
129
return out ;
127
130
}
128
131
129
132
protected void serialiseContainer (BigArrayList <String > out , TickContainer container ) {
133
+ currentLine = out .size ()-1 ;
130
134
List <String > serialisedKeyboard = serialiseKeyboard (container .getKeyboard ());
131
135
List <String > serialisedMouse = serialiseMouse (container .getMouse ());
132
136
List <String > serialisedCameraAngle = serialiseCameraAngle (container .getCameraAngle ());
137
+ pruneListEndEmpty (serialisedCameraAngle );
133
138
134
139
PlaybackFileCommandContainer fileCommandsInline = TASmodAPIRegistry .PLAYBACK_FILE_COMMAND .handleOnSerialiseInline (currentTick , container );
135
140
PlaybackFileCommandContainer fileCommandsEndline = TASmodAPIRegistry .PLAYBACK_FILE_COMMAND .handleOnSerialiseEndline (currentTick , container );
@@ -163,25 +168,42 @@ protected String serialiseFileCommandsInLine(List<PlaybackFileCommand> fileComma
163
168
164
169
protected List <String > serialiseKeyboard (VirtualKeyboard keyboard ) {
165
170
List <String > out = new ArrayList <>();
166
- List <VirtualKeyboard > list = keyboard .getAll ();
167
- for (VirtualKeyboard subtick : list ) {
171
+
172
+ List <VirtualKeyboard > subticks = new ArrayList <>(keyboard .getAll ());
173
+ pruneListEndEmptySubtickable (subticks );
174
+
175
+ for (VirtualKeyboard subtick : subticks ) {
168
176
out .add (subtick .toString2 ());
169
177
}
170
178
return out ;
171
179
}
172
180
173
181
protected List <String > serialiseMouse (VirtualMouse mouse ) {
174
182
List <String > out = new ArrayList <>();
175
- for (VirtualMouse subtick : mouse .getAll ()) {
183
+
184
+ List <VirtualMouse > subticks = new ArrayList <>(mouse .getAll ());
185
+ pruneListEndEmptySubtickable (subticks );
186
+
187
+ for (VirtualMouse subtick : subticks ) {
176
188
out .add (subtick .toString2 ());
177
189
}
178
190
return out ;
179
191
}
180
192
181
193
protected List <String > serialiseCameraAngle (VirtualCameraAngle cameraAngle ) {
194
+
195
+ VirtualCameraAngle previousCamera = null ;
196
+ if (previousTickContainer != null ) {
197
+ previousCamera = previousTickContainer .getCameraAngle ();
198
+ }
199
+
182
200
List <String > out = new ArrayList <>();
183
201
for (VirtualCameraAngle subtick : cameraAngle .getAll ()) {
184
- out .add (subtick .toString2 ());
202
+
203
+ if (!subtick .equals (previousCamera ))
204
+ out .add (subtick .toString2 ());
205
+
206
+ previousCamera = subtick ;
185
207
}
186
208
return out ;
187
209
}
@@ -588,7 +610,7 @@ protected void deserialiseContainer(BigArrayList<TickContainer> out, List<String
588
610
589
611
splitInputs (containerLines , keyboardStrings , mouseStrings , cameraAngleStrings , endlineComments , endlineFileCommands );
590
612
591
- pruneListEnd (endlineComments );
613
+ pruneListEndNull (endlineComments );
592
614
593
615
VirtualKeyboard keyboard = deserialiseKeyboard (keyboardStrings );
594
616
VirtualMouse mouse = deserialiseMouse (mouseStrings );
@@ -819,18 +841,28 @@ protected Float deserialiseRelativeFloat(String name, String floatstring, Float
819
841
820
842
protected void splitInputs (List <String > lines , List <String > serialisedKeyboard , List <String > serialisedMouse , List <String > serialisedCameraAngle , List <String > commentsAtEnd , List <List <PlaybackFileCommand >> endlineFileCommands ) {
821
843
844
+ String previousCamera = null ;
845
+ if (previousTickContainer != null ) {
846
+ previousCamera = previousTickContainer .getCameraAngle ().toString2 ();
847
+ }
848
+
822
849
for (String line : lines ) {
823
-
824
850
Matcher tickMatcher = extract ("^\\ t?\\ d+\\ |(.*?)\\ |(.*?)\\ |(\\ S*)\\ s?" , line );
851
+
825
852
if (tickMatcher .find ()) {
826
853
if (!tickMatcher .group (1 ).isEmpty ()) {
827
854
serialisedKeyboard .add (tickMatcher .group (1 ));
828
855
}
829
856
if (!tickMatcher .group (2 ).isEmpty ()) {
830
857
serialisedMouse .add (tickMatcher .group (2 ));
831
858
}
859
+
832
860
if (!tickMatcher .group (3 ).isEmpty ()) {
833
861
serialisedCameraAngle .add (tickMatcher .group (3 ));
862
+ previousCamera = tickMatcher .group (3 );
863
+ } else {
864
+ if (previousCamera !=null )
865
+ serialisedCameraAngle .add (previousCamera );
834
866
}
835
867
836
868
List <PlaybackFileCommand > deserialisedFileCommands = new ArrayList <>();
@@ -926,12 +958,12 @@ public static <T extends Serializable> void addAll(BigArrayList<T> list, List<T>
926
958
}
927
959
928
960
/**
929
- * Empties the list if it only consists of null values
961
+ * Empties the list starting from the back if the values are null
930
962
*
931
963
* @param <T> The element of the list
932
964
* @param list The list to prune
933
965
*/
934
- protected <T > void pruneListEnd (List <T > list ) {
966
+ protected <T > void pruneListEndNull (List <T > list ) {
935
967
List <T > copy = new ArrayList <>(list );
936
968
for (int i = copy .size () - 1 ; i >= 0 ; i --) {
937
969
T element = copy .get (i );
@@ -940,6 +972,39 @@ protected <T> void pruneListEnd(List<T> list) {
940
972
list .remove (list .size () - 1 );
941
973
}
942
974
}
975
+
976
+ /**
977
+ * Empties the list starting from the back if the values are empty
978
+ *
979
+ * @param <T> The element of the list
980
+ * @param list The list to prune
981
+ */
982
+ protected void pruneListEndEmpty (List <String > list ) {
983
+ List <String > copy = new ArrayList <>(list );
984
+ for (int i = copy .size () - 1 ; i >= 0 ; i --) {
985
+ String element = copy .get (i );
986
+ if (!element .isEmpty ())
987
+ return ;
988
+ list .remove (list .size () - 1 );
989
+ }
990
+ }
991
+
992
+ /**
993
+ * Empties the list starting from the back if the values are empty
994
+ *
995
+ * @param <T> The element of the list
996
+ * @param list The list to prune
997
+ */
998
+ protected <T extends Subtickable <T >> void pruneListEndEmptySubtickable (List <T > list ) {
999
+ List <T > copy = new ArrayList <>(list );
1000
+ for (int i = copy .size () - 1 ; i >= 0 ; i --) {
1001
+ T element = copy .get (i );
1002
+ if (!element .isEmpty ())
1003
+ return ;
1004
+ list .remove (list .size () - 1 );
1005
+ }
1006
+ }
1007
+
943
1008
944
1009
@ Override
945
1010
public abstract SerialiserFlavorBase clone ();
0 commit comments