From 36c2126330540a8c8b3efd7faf9c83928858a7f1 Mon Sep 17 00:00:00 2001 From: Scribble Date: Sun, 14 Apr 2024 14:20:11 +0200 Subject: [PATCH 01/79] [Commands/SaveTAS] Added clickable link for opening tasfile directory --- .../minecrafttas/tasmod/commands/CommandFullRecord.java | 1 - .../tasmod/playback/PlaybackControllerClient.java | 8 ++++++-- .../playback/metadata/PlaybackMetadataRegistry.java | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/minecrafttas/tasmod/commands/CommandFullRecord.java b/src/main/java/com/minecrafttas/tasmod/commands/CommandFullRecord.java index 09a1cfe5..585a50d1 100644 --- a/src/main/java/com/minecrafttas/tasmod/commands/CommandFullRecord.java +++ b/src/main/java/com/minecrafttas/tasmod/commands/CommandFullRecord.java @@ -28,7 +28,6 @@ public String getUsage(ICommandSender sender) { @Override public void execute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException { - sender.sendMessage(new TextComponentString(TextFormatting.RED+"This feature doesn't work at the moment!")); try { TASmod.savestateHandlerServer.saveState(0, false); } catch (SavestateException e) { diff --git a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java index 758c7a1b..a2f4d293 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java @@ -56,6 +56,7 @@ import net.minecraft.client.multiplayer.WorldClient; import net.minecraft.util.text.TextComponentString; import net.minecraft.util.text.TextFormatting; +import net.minecraft.util.text.event.ClickEvent; /** * A controller where the inputs are stored.
@@ -703,8 +704,11 @@ public void onClientPacket(PacketID id, ByteBuffer buf, String username) throws // e.printStackTrace(); // return; // } - if (mc.world != null) - mc.ingameGUI.getChatGUI().printChatMessage(new TextComponentString(TextFormatting.GREEN + "Saved inputs to " + name + ".mctas")); + if (mc.world != null) { + TextComponentString confirm = new TextComponentString(TextFormatting.GREEN + "Saved inputs to " + name + ".mctas" + TextFormatting.RESET + " [" + TextFormatting.YELLOW + "Open folder" + TextFormatting.RESET + "]"); + confirm.getStyle().setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/folder tasfiles")); + mc.ingameGUI.getChatGUI().printChatMessage(confirm); + } else LOGGER.debug(LoggerMarkers.Playback, "Saved inputs to " + name + ".mctas"); break; diff --git a/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadataRegistry.java b/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadataRegistry.java index 4c604261..3ab19c50 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadataRegistry.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadataRegistry.java @@ -13,7 +13,7 @@ * The default metadata includes general information such as author name, * savestate/rerecord count and category.
*
- * Any custom class has to extend PlaybackMetadataExtension + * Any custom class has to implement PlaybackMetadataExtension * */ public class PlaybackMetadataRegistry { From 04c84660d4dd2c62ff5069d0410b13ef3f88aa47 Mon Sep 17 00:00:00 2001 From: Scribble Date: Fri, 19 Apr 2024 17:08:37 +0200 Subject: [PATCH 02/79] [PlaybackSerialiser] Added basic layout --- .../playback/PlaybackControllerClient.java | 4 ++ .../tasfile/PlaybackSerialiserBase.java | 42 ------------- .../tasfile/PlaybackSerialiserFlavorBase.java | 61 +++++++++++++++++++ .../tasfile/PlaybackSerializerBaseTest.java | 51 ++++++++++++++++ 4 files changed, 116 insertions(+), 42 deletions(-) delete mode 100644 src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiserBase.java create mode 100644 src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiserFlavorBase.java create mode 100644 src/test/java/tasmod/playback/tasfile/PlaybackSerializerBaseTest.java diff --git a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java index a2f4d293..27e1cb81 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java @@ -476,6 +476,10 @@ public int index() { public BigArrayList getInputs() { return inputs; } + + public void setInputs(BigArrayList inputs) { + this.inputs = inputs; + } public Map>> getControlBytes() { // TODO Replace with TASFile extension return controlBytes; diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiserBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiserBase.java deleted file mode 100644 index 305b3a74..00000000 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiserBase.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.minecrafttas.tasmod.playback.tasfile; - -import java.util.ArrayList; -import java.util.List; - -import com.minecrafttas.tasmod.playback.PlaybackControllerClient; - -public abstract class PlaybackSerialiserBase { - - public PlaybackSerialiserBase(PlaybackControllerClient controller) { - if(controller == null) { - throw new NullPointerException("Parameter controller can't be null"); - } - - - } - - public void onSave() { - - } - - public void onLoad() { - - } - - public List serialize() { - List out = new ArrayList<>(); - return out; - } - - public void deserialize(List in) { - - } - - public List serializeMetadata(){ - return null; - } - - public void deserializeMetadata(List metadataString) { - - } -} diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiserFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiserFlavorBase.java new file mode 100644 index 00000000..883556a2 --- /dev/null +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiserFlavorBase.java @@ -0,0 +1,61 @@ +package com.minecrafttas.tasmod.playback.tasfile; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +import com.dselent.bigarraylist.BigArrayList; +import com.minecrafttas.tasmod.playback.PlaybackControllerClient; +import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickInputContainer; + +public abstract class PlaybackSerialiserFlavorBase { + + + public abstract String flavorName(); + + public void serialise(PlaybackControllerClient controller, File file) { + + } + + public BigArrayList serialise(BigArrayList container) { + BigArrayList out = new BigArrayList<>(); + return out; + } + + public BigArrayList deserialise(BigArrayList lines) { + BigArrayList out = new BigArrayList<>(); + return out; + } + + public List serialiseMetadata(){ + return null; + } + + public void deserialiseMetadata(List metadataString) { + + } + + public static String createCenteredHeading(String text, char spacingChar, int headingWidth) { + + if(text == null || text.isEmpty()) { + return createPaddedString(spacingChar, headingWidth); + } + + text = " "+text+" "; + + int spacingWidth = headingWidth - text.length(); + + String paddingPre = createPaddedString(spacingChar, spacingWidth % 2 == 1 ? spacingWidth / 2 + 1 : spacingWidth / 2); + String paddingSuf = createPaddedString(spacingChar, spacingWidth/2); + + return String.format("%s%s%s", paddingPre, text, paddingSuf); + } + + private static String createPaddedString(char spacingChar, int width) { + char[] spacingLine = new char[width]; + for (int i = 0; i < spacingLine.length; i++) { + spacingLine[i] = spacingChar; + } + return new String(spacingLine); + } +} diff --git a/src/test/java/tasmod/playback/tasfile/PlaybackSerializerBaseTest.java b/src/test/java/tasmod/playback/tasfile/PlaybackSerializerBaseTest.java new file mode 100644 index 00000000..69742cd5 --- /dev/null +++ b/src/test/java/tasmod/playback/tasfile/PlaybackSerializerBaseTest.java @@ -0,0 +1,51 @@ +package tasmod.playback.tasfile; + +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; + +import com.minecrafttas.tasmod.playback.tasfile.PlaybackSerialiserFlavorBase; + +public class PlaybackSerializerBaseTest { + + @Test + void testStringPaddingEven() { + String actual = PlaybackSerialiserFlavorBase.createCenteredHeading(null, '#', 52); + String expected = "####################################################"; + assertEquals(expected, actual); + } + + @Test + void testStringPaddingOdd() { + String actual = PlaybackSerialiserFlavorBase.createCenteredHeading(null, '#', 51); + String expected = "###################################################"; + assertEquals(expected, actual); + } + + @Test + void testCenterHeadingEven() { + String actual = PlaybackSerialiserFlavorBase.createCenteredHeading("TASfile", '#', 52); + String expected = "###################### TASfile #####################"; + assertEquals(expected, actual); + } + + @Test + void testCenterHeadingOdd() { + String actual = PlaybackSerialiserFlavorBase.createCenteredHeading("TASfile", '#', 51); + String expected = "##################### TASfile #####################"; + assertEquals(expected, actual); + } + + @Test + void testCenterHeadingEvenText() { + String actual = PlaybackSerialiserFlavorBase.createCenteredHeading("TASfiles", '#', 51); + String expected = "##################### TASfiles ####################"; + assertEquals(expected, actual); + } + + @Test + void testCenterHeadingEvenText2() { + String actual = PlaybackSerialiserFlavorBase.createCenteredHeading("Keystrokes", '#', 51); + String expected = "#################### Keystrokes ###################"; + assertEquals(expected, actual); + } +} From cb132b39761fe10dc9d0862cf07e08955ec72212 Mon Sep 17 00:00:00 2001 From: Scribble Date: Sat, 20 Apr 2024 23:10:30 +0200 Subject: [PATCH 03/79] [PlaybackSerialiser] Added serialisation methods to FlavorBase --- .../tasfile/PlaybackSerialiserFlavorBase.java | 108 ++++++++++++++---- .../tasfile/PlaybackSerialiserRegistry.java | 9 ++ 2 files changed, 93 insertions(+), 24 deletions(-) create mode 100644 src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiserRegistry.java diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiserFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiserFlavorBase.java index 883556a2..d2607eea 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiserFlavorBase.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiserFlavorBase.java @@ -1,56 +1,102 @@ package com.minecrafttas.tasmod.playback.tasfile; -import java.io.File; +import java.io.Serializable; import java.util.ArrayList; import java.util.List; import com.dselent.bigarraylist.BigArrayList; -import com.minecrafttas.tasmod.playback.PlaybackControllerClient; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickInputContainer; +import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata; +import com.minecrafttas.tasmod.virtual.VirtualCameraAngle; +import com.minecrafttas.tasmod.virtual.VirtualKeyboard; +import com.minecrafttas.tasmod.virtual.VirtualMouse; public abstract class PlaybackSerialiserFlavorBase { - + + /** + * The current tick that is being serialised or deserialised + */ + private int currentTick; public abstract String flavorName(); - - public void serialise(PlaybackControllerClient controller, File file) { - + + public List serialiseHeader(List metadataList) { + List out = new ArrayList<>(); + out.add(serialiseFlavorName()); +// out.add(serializeExtensionNames()); + out.addAll(serialiseMetadata(metadataList)); + return out; + } + + protected String serialiseFlavorName() { + return "Flavor:" + flavorName(); } - - public BigArrayList serialise(BigArrayList container) { + + public List serialiseMetadata(List metadataList) { + return null; + } + + public BigArrayList serialise(BigArrayList inputs) { BigArrayList out = new BigArrayList<>(); + + for (int i = 0; i < inputs.size(); i++) { + currentTick = i; + TickInputContainer container = inputs.get(i); + addAll(out, serialiseContainer(container)); + } return out; } - + + protected List serialiseContainer(TickInputContainer container) { + List serialisedKeyboard = serialiseKeyboard(container.getKeyboard()); + List serialisedMouse = serialiseMouse(container.getMouse()); + List serialisedCameraAngle = serialiseCameraAngle(container.getCameraAngle()); + + return mergeInputs(serialisedKeyboard, serialisedMouse, serialisedCameraAngle); + } + + protected abstract List serialiseKeyboard(VirtualKeyboard keyboard); + + protected abstract List serialiseMouse(VirtualMouse mouse); + + protected abstract List serialiseCameraAngle(VirtualCameraAngle cameraAngle); + + protected List mergeInputs(List serialisedKeyboard, List serialisedMouse, List serialisedCameraAngle) { + return null; + } + public BigArrayList deserialise(BigArrayList lines) { BigArrayList out = new BigArrayList<>(); return out; } - - public List serialiseMetadata(){ + + public List deserialiseMetadata(List metadataString) { return null; } - - public void deserialiseMetadata(List metadataString) { - + + /** + * @return {@link #currentTick} + */ + public int getCurrentTick() { + return currentTick; } - + public static String createCenteredHeading(String text, char spacingChar, int headingWidth) { - - if(text == null || text.isEmpty()) { + + if (text == null || text.isEmpty()) { return createPaddedString(spacingChar, headingWidth); } - - text = " "+text+" "; - + + text = " " + text + " "; + int spacingWidth = headingWidth - text.length(); - + String paddingPre = createPaddedString(spacingChar, spacingWidth % 2 == 1 ? spacingWidth / 2 + 1 : spacingWidth / 2); - String paddingSuf = createPaddedString(spacingChar, spacingWidth/2); - + String paddingSuf = createPaddedString(spacingChar, spacingWidth / 2); + return String.format("%s%s%s", paddingPre, text, paddingSuf); } - + private static String createPaddedString(char spacingChar, int width) { char[] spacingLine = new char[width]; for (int i = 0; i < spacingLine.length; i++) { @@ -58,4 +104,18 @@ private static String createPaddedString(char spacingChar, int width) { } return new String(spacingLine); } + + protected static void addAll(BigArrayList list, BigArrayList toAdd) { + for (int i = 0; i < toAdd.size(); i++) { + T element = toAdd.get(i); + list.add(element); + } + } + + protected static void addAll(BigArrayList list, List toAdd) { + for (int i = 0; i < toAdd.size(); i++) { + T element = toAdd.get(i); + list.add(element); + } + } } diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiserRegistry.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiserRegistry.java new file mode 100644 index 00000000..1070def1 --- /dev/null +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiserRegistry.java @@ -0,0 +1,9 @@ +package com.minecrafttas.tasmod.playback.tasfile; + +/** + * Registry for registering custom PlaybackSerialisers.
+ * This is useful if you want to create your own syntax "flavor" for TASmod to read.
+ */ +public class PlaybackSerialiserRegistry { + +} From 91f1ab729142698df9d48e99e52a5ca5e12cd922 Mon Sep 17 00:00:00 2001 From: Scribble Date: Wed, 1 May 2024 21:25:38 +0200 Subject: [PATCH 04/79] [PlaybackSerialiser] Created 'BetaFlavor' - Preparing for developing and testing the flavor - Created package 'flavor' --- .../playback/tasfile/PlaybackSerialiser2.java | 50 +++++++++++++++++++ .../PlaybackSerialiserFlavorBase.java | 2 +- .../PlaybackSerialiserFlavorRegistry.java} | 4 +- .../tasfile/flavor/integrated/BetaFlavor.java | 35 +++++++++++++ .../tasfile/PlaybackSerialiserTest.java | 5 ++ ... => PlaybackSerializerFlavorBaseTest.java} | 7 +-- 6 files changed, 97 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java rename src/main/java/com/minecrafttas/tasmod/playback/tasfile/{ => flavor}/PlaybackSerialiserFlavorBase.java (98%) rename src/main/java/com/minecrafttas/tasmod/playback/tasfile/{PlaybackSerialiserRegistry.java => flavor/PlaybackSerialiserFlavorRegistry.java} (60%) create mode 100644 src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/integrated/BetaFlavor.java create mode 100644 src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java rename src/test/java/tasmod/playback/tasfile/{PlaybackSerializerBaseTest.java => PlaybackSerializerFlavorBaseTest.java} (92%) diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java new file mode 100644 index 00000000..8f83c077 --- /dev/null +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java @@ -0,0 +1,50 @@ +package com.minecrafttas.tasmod.playback.tasfile; + +import java.io.File; + +import com.minecrafttas.tasmod.playback.PlaybackControllerClient; + +/** + * Serialises and deserialises the {@link PlaybackControllerClient}.
+ * Also contains methods to save and read the {@link PlaybackControllerClient} + * to/from a file + */ +public class PlaybackSerialiser2 { + + private static String defaultFlavor = "beta"; + + /** + * Saves the {@link PlaybackControllerClient} to a file + * + * @param file The file to save the serialised inputs to. + * @param controller + * @param flavor + */ + public static void saveToFile(File file, PlaybackControllerClient controller, String flavor) { + if (file == null) { + throw new NullPointerException("Save to file failed. No file specified"); + } + + if (controller == null) { + throw new NullPointerException("Save to file failed. No controller specified"); + } + + if (flavor == null) { + flavor = defaultFlavor; + } + + + } + + /** + * Loads the {@link PlaybackControllerClient} from a file + * @param file The file to load from + * @return The loaded {@link PlaybackControllerClient} + */ + public static PlaybackControllerClient loadFromFile(File file) { + if (file == null) { + throw new NullPointerException("Load from file failed. No file specified"); + } + return null; + } +} diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiserFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackSerialiserFlavorBase.java similarity index 98% rename from src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiserFlavorBase.java rename to src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackSerialiserFlavorBase.java index d2607eea..45db661f 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiserFlavorBase.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackSerialiserFlavorBase.java @@ -1,4 +1,4 @@ -package com.minecrafttas.tasmod.playback.tasfile; +package com.minecrafttas.tasmod.playback.tasfile.flavor; import java.io.Serializable; import java.util.ArrayList; diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiserRegistry.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackSerialiserFlavorRegistry.java similarity index 60% rename from src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiserRegistry.java rename to src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackSerialiserFlavorRegistry.java index 1070def1..0ba9c39f 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiserRegistry.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackSerialiserFlavorRegistry.java @@ -1,9 +1,9 @@ -package com.minecrafttas.tasmod.playback.tasfile; +package com.minecrafttas.tasmod.playback.tasfile.flavor; /** * Registry for registering custom PlaybackSerialisers.
* This is useful if you want to create your own syntax "flavor" for TASmod to read.
*/ -public class PlaybackSerialiserRegistry { +public class PlaybackSerialiserFlavorRegistry { } diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/integrated/BetaFlavor.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/integrated/BetaFlavor.java new file mode 100644 index 00000000..52b6c75a --- /dev/null +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/integrated/BetaFlavor.java @@ -0,0 +1,35 @@ +package com.minecrafttas.tasmod.playback.tasfile.flavor.integrated; + +import java.util.List; + +import com.minecrafttas.tasmod.playback.tasfile.flavor.PlaybackSerialiserFlavorBase; +import com.minecrafttas.tasmod.virtual.VirtualCameraAngle; +import com.minecrafttas.tasmod.virtual.VirtualKeyboard; +import com.minecrafttas.tasmod.virtual.VirtualMouse; + +public class BetaFlavor extends PlaybackSerialiserFlavorBase { + + @Override + public String flavorName() { + return "beta"; + } + + @Override + protected List serialiseKeyboard(VirtualKeyboard keyboard) { + // TODO Auto-generated method stub + return null; + } + + @Override + protected List serialiseMouse(VirtualMouse mouse) { + // TODO Auto-generated method stub + return null; + } + + @Override + protected List serialiseCameraAngle(VirtualCameraAngle cameraAngle) { + // TODO Auto-generated method stub + return null; + } + +} diff --git a/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java b/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java new file mode 100644 index 00000000..6d9a2ce1 --- /dev/null +++ b/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java @@ -0,0 +1,5 @@ +package tasmod.playback.tasfile; + +public class PlaybackSerialiserTest { + +} diff --git a/src/test/java/tasmod/playback/tasfile/PlaybackSerializerBaseTest.java b/src/test/java/tasmod/playback/tasfile/PlaybackSerializerFlavorBaseTest.java similarity index 92% rename from src/test/java/tasmod/playback/tasfile/PlaybackSerializerBaseTest.java rename to src/test/java/tasmod/playback/tasfile/PlaybackSerializerFlavorBaseTest.java index 69742cd5..c9b02b60 100644 --- a/src/test/java/tasmod/playback/tasfile/PlaybackSerializerBaseTest.java +++ b/src/test/java/tasmod/playback/tasfile/PlaybackSerializerFlavorBaseTest.java @@ -1,11 +1,12 @@ package tasmod.playback.tasfile; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.*; -import com.minecrafttas.tasmod.playback.tasfile.PlaybackSerialiserFlavorBase; +import com.minecrafttas.tasmod.playback.tasfile.flavor.PlaybackSerialiserFlavorBase; + +import static org.junit.jupiter.api.Assertions.*; -public class PlaybackSerializerBaseTest { +public class PlaybackSerializerFlavorBaseTest { @Test void testStringPaddingEven() { From 4b1498835c4bd4e4406bfceb3daa2e4c573b1f93 Mon Sep 17 00:00:00 2001 From: Scribble Date: Sun, 5 May 2024 21:59:04 +0200 Subject: [PATCH 05/79] [PlaybackSerialiser] Added flavor registry --- .../metadata/PlaybackMetadataRegistry.java | 1 + .../PlaybackSerialiserFlavorRegistry.java | 51 +++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadataRegistry.java b/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadataRegistry.java index 3ab19c50..09df72b6 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadataRegistry.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadataRegistry.java @@ -15,6 +15,7 @@ *
* Any custom class has to implement PlaybackMetadataExtension * + * @author Scribble */ public class PlaybackMetadataRegistry { diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackSerialiserFlavorRegistry.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackSerialiserFlavorRegistry.java index 0ba9c39f..13007269 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackSerialiserFlavorRegistry.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackSerialiserFlavorRegistry.java @@ -1,9 +1,60 @@ package com.minecrafttas.tasmod.playback.tasfile.flavor; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Set; + +import com.minecrafttas.tasmod.TASmod; + /** * Registry for registering custom PlaybackSerialisers.
* This is useful if you want to create your own syntax "flavor" for TASmod to read.
+ * + * @author Scribble */ public class PlaybackSerialiserFlavorRegistry { + + private static final Map SERIALISER_FLAVOR = new LinkedHashMap<>(); + + public static void register(PlaybackSerialiserFlavorBase flavor) { + if (flavor == null) { + throw new NullPointerException("Tried to register a serialiser flavor. But flavor is null."); + } + + if (containsClass(flavor)) { + TASmod.LOGGER.warn("Tried to register the serialiser flavor {}, but another instance of this class is already registered!", flavor.getClass().getName()); + return; + } + if(SERIALISER_FLAVOR.containsKey(flavor.serialiseFlavorName())) { + TASmod.LOGGER.warn("Trying to register the serialiser flavor {}, but a flavor with the same name is already registered!", flavor.serialiseFlavorName()); + return; + } + + SERIALISER_FLAVOR.put(flavor.serialiseFlavorName(), flavor); + } + + public static void unregister(PlaybackSerialiserFlavorBase flavor) { + if (flavor == null) { + throw new NullPointerException("Tried to unregister a flavor with value null"); + } + if (SERIALISER_FLAVOR.containsKey(flavor.serialiseFlavorName())) { + SERIALISER_FLAVOR.remove(flavor.serialiseFlavorName()); + } else { + TASmod.LOGGER.warn("Trying to unregister the flavor {}, but it was not registered!", flavor.getClass().getName()); + } + } + + private static boolean containsClass(PlaybackSerialiserFlavorBase newExtension) { + for (PlaybackSerialiserFlavorBase extension : SERIALISER_FLAVOR.values()) { + if (extension.getClass().equals(newExtension.getClass())) { + return true; + } + } + return false; + } + + public static Set getFlavorNames(){ + return SERIALISER_FLAVOR.keySet(); + } } From a1959aaceacca539046ac4c73636c18eaf2eb78c Mon Sep 17 00:00:00 2001 From: Scribble Date: Tue, 7 May 2024 22:17:46 +0200 Subject: [PATCH 06/79] [Common] Added AbstractRegistry --- .../minecrafttas/mctcommon/registry/AbstractRegistry.java | 5 +++++ src/main/java/com/minecrafttas/tasmod/TASmodRegistry.java | 5 +++++ 2 files changed, 10 insertions(+) create mode 100644 src/main/java/com/minecrafttas/mctcommon/registry/AbstractRegistry.java create mode 100644 src/main/java/com/minecrafttas/tasmod/TASmodRegistry.java diff --git a/src/main/java/com/minecrafttas/mctcommon/registry/AbstractRegistry.java b/src/main/java/com/minecrafttas/mctcommon/registry/AbstractRegistry.java new file mode 100644 index 00000000..c4ef0876 --- /dev/null +++ b/src/main/java/com/minecrafttas/mctcommon/registry/AbstractRegistry.java @@ -0,0 +1,5 @@ +package com.minecrafttas.mctcommon.registry; + +public class AbstractRegistry { + +} diff --git a/src/main/java/com/minecrafttas/tasmod/TASmodRegistry.java b/src/main/java/com/minecrafttas/tasmod/TASmodRegistry.java new file mode 100644 index 00000000..8e3ad923 --- /dev/null +++ b/src/main/java/com/minecrafttas/tasmod/TASmodRegistry.java @@ -0,0 +1,5 @@ +package com.minecrafttas.tasmod; + +public class TASmodRegistry { + +} From ae3c1dc27bd6751ad86af66c058ad011b9470ab4 Mon Sep 17 00:00:00 2001 From: Scribble Date: Wed, 8 May 2024 22:03:08 +0200 Subject: [PATCH 07/79] Cleaned up TASmodClient - Moved each registration in it's own method - Moved /restartandplay functionality to PlaybackController - [MCTCommon] Added functionality to AbstractRegistry - Moved Keybind registering to TASmodKeybinds - Added TASmodRegistry --- .../mctcommon/KeybindManager.java | 19 +- .../mctcommon/registry/AbstractRegistry.java | 37 +++- .../com/minecrafttas/tasmod/TASmodClient.java | 191 ++++++++---------- .../minecrafttas/tasmod/TASmodRegistry.java | 5 - .../playback/PlaybackControllerClient.java | 21 +- .../metadata/PlaybackMetadataRegistry.java | 50 ++--- .../tasmod/util/TASmodKeybinds.java | 82 ++++++++ .../tasmod/util/TASmodRegistry.java | 17 ++ .../PlaybackMetadataRegistryTest.java | 22 +- 9 files changed, 274 insertions(+), 170 deletions(-) delete mode 100644 src/main/java/com/minecrafttas/tasmod/TASmodRegistry.java create mode 100644 src/main/java/com/minecrafttas/tasmod/util/TASmodKeybinds.java create mode 100644 src/main/java/com/minecrafttas/tasmod/util/TASmodRegistry.java diff --git a/src/main/java/com/minecrafttas/mctcommon/KeybindManager.java b/src/main/java/com/minecrafttas/mctcommon/KeybindManager.java index d1d70caa..dcb9066f 100644 --- a/src/main/java/com/minecrafttas/mctcommon/KeybindManager.java +++ b/src/main/java/com/minecrafttas/mctcommon/KeybindManager.java @@ -23,10 +23,10 @@ public class KeybindManager implements EventClientGameLoop { public static class Keybind { - private KeyBinding keyBinding; - private String category; - private Runnable onKeyDown; - private IsKeyDownFunc isKeyDownFunc; + public final KeyBinding vanillaKeyBinding; + private final String category; + private final Runnable onKeyDown; + private final IsKeyDownFunc isKeyDownFunc; /** * Initialize keybind @@ -49,7 +49,7 @@ public Keybind(String name, String category, int defaultKey, Runnable onKeyDown) * @param onKeyDown Will be run when the keybind is pressed */ public Keybind(String name, String category, int defaultKey, Runnable onKeyDown, IsKeyDownFunc func) { - this.keyBinding = new KeyBinding(name, defaultKey, category); + this.vanillaKeyBinding = new KeyBinding(name, defaultKey, category); this.category = category; this.onKeyDown = onKeyDown; this.isKeyDownFunc = func; @@ -77,7 +77,7 @@ public KeybindManager(IsKeyDownFunc defaultFunction) { public void onRunClientGameLoop(Minecraft mc) { for (Keybind keybind : this.keybindings){ IsKeyDownFunc keyDown = keybind.isKeyDownFunc != null ? keybind.isKeyDownFunc : defaultFunction; - if(keyDown.isKeyDown(keybind.keyBinding)){ + if(keyDown.isKeyDown(keybind.vanillaKeyBinding)){ keybind.onKeyDown.run(); } } @@ -89,9 +89,9 @@ public void onRunClientGameLoop(Minecraft mc) { * * @param keybind Keybind to register */ - public KeyBinding registerKeybind(Keybind keybind) { + public void registerKeybind(Keybind keybind) { this.keybindings.add(keybind); - KeyBinding keyBinding = keybind.keyBinding; + KeyBinding keyBinding = keybind.vanillaKeyBinding; // add category GameSettings options = Minecraft.getMinecraft().gameSettings; @@ -100,9 +100,8 @@ public KeyBinding registerKeybind(Keybind keybind) { // add keybinding options.keyBindings = ArrayUtils.add(options.keyBindings, keyBinding); - return keyBinding; } - + @FunctionalInterface public static interface IsKeyDownFunc { diff --git a/src/main/java/com/minecrafttas/mctcommon/registry/AbstractRegistry.java b/src/main/java/com/minecrafttas/mctcommon/registry/AbstractRegistry.java index c4ef0876..6ee4fab5 100644 --- a/src/main/java/com/minecrafttas/mctcommon/registry/AbstractRegistry.java +++ b/src/main/java/com/minecrafttas/mctcommon/registry/AbstractRegistry.java @@ -1,5 +1,38 @@ package com.minecrafttas.mctcommon.registry; -public class AbstractRegistry { - +import java.util.Map; + +public abstract class AbstractRegistry { + public final Map REGISTRY; + + public AbstractRegistry(Map map) { + REGISTRY = map; + } + + public abstract void register(V registryObject); + + @SafeVarargs + public final void register(V... registryObjects) { + for (V registryObject : registryObjects) { + this.register(registryObject); + } + } + + public abstract void unregister(V registryObject); + + @SafeVarargs + public final void unregister(V... registryObjects) { + for (V registryObject : registryObjects) { + this.unregister(registryObject); + } + } + + protected boolean containsClass(V newExtension) { + for (V extension : REGISTRY.values()) { + if (extension.getClass().equals(newExtension.getClass())) { + return true; + } + } + return false; + } } diff --git a/src/main/java/com/minecrafttas/tasmod/TASmodClient.java b/src/main/java/com/minecrafttas/tasmod/TASmodClient.java index aab41277..35ef1831 100644 --- a/src/main/java/com/minecrafttas/tasmod/TASmodClient.java +++ b/src/main/java/com/minecrafttas/tasmod/TASmodClient.java @@ -4,16 +4,13 @@ import java.io.File; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.Arrays; import org.apache.logging.log4j.Level; -import org.lwjgl.input.Keyboard; import com.minecrafttas.mctcommon.Configuration; import com.minecrafttas.mctcommon.Configuration.ConfigOptions; import com.minecrafttas.mctcommon.KeybindManager; -import com.minecrafttas.mctcommon.KeybindManager.Keybind; import com.minecrafttas.mctcommon.LanguageManager; import com.minecrafttas.mctcommon.events.EventClient.EventClientInit; import com.minecrafttas.mctcommon.events.EventClient.EventOpenGui; @@ -24,11 +21,9 @@ import com.minecrafttas.mctcommon.server.Server; import com.minecrafttas.tasmod.gui.InfoHud; import com.minecrafttas.tasmod.handlers.LoadingScreenHandler; -import com.minecrafttas.tasmod.networking.TASmodBufferBuilder; import com.minecrafttas.tasmod.networking.TASmodPackets; import com.minecrafttas.tasmod.playback.PlaybackControllerClient; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TASstate; -import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadataRegistry; import com.minecrafttas.tasmod.playback.metadata.integrated.CreditsMetadataExtension; import com.minecrafttas.tasmod.playback.metadata.integrated.StartpositionMetadataExtension; import com.minecrafttas.tasmod.playback.tasfile.PlaybackSerialiser; @@ -38,6 +33,8 @@ import com.minecrafttas.tasmod.util.LoggerMarkers; import com.minecrafttas.tasmod.util.Scheduler; import com.minecrafttas.tasmod.util.ShieldDownloader; +import com.minecrafttas.tasmod.util.TASmodKeybinds; +import com.minecrafttas.tasmod.util.TASmodRegistry; import com.minecrafttas.tasmod.virtual.VirtualInput; import com.minecrafttas.tasmod.virtual.VirtualKeybindings; @@ -48,11 +45,7 @@ import net.minecraft.client.gui.GuiMainMenu; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.multiplayer.ServerData; -import net.minecraft.client.settings.KeyBinding; import net.minecraft.server.MinecraftServer; -import net.minecraft.util.text.ChatType; -import net.minecraft.util.text.TextComponentString; -import net.minecraft.util.text.TextFormatting; public class TASmodClient implements ClientModInitializer, EventClientInit, EventPlayerJoinedClientSide, EventOpenGui{ @@ -115,25 +108,11 @@ public static void createSavestatesDir() { @Override public void onInitializeClient() { - // Load config - Minecraft mc = Minecraft.getMinecraft(); - - File configDir = new File(mc.mcDataDir, "config"); - if(!configDir.exists()) { - configDir.mkdir(); - } - config = new Configuration("TASmod configuration", new File(configDir, "tasmod.cfg")); - LanguageManager.registerMod("tasmod"); - // Execute /restartandplay. Load the file to start from the config. If it exists load the playback file on start. - String fileOnStart = config.get(ConfigOptions.FileToOpen); - if (fileOnStart.isEmpty()) { - fileOnStart = null; - } else { - config.reset(ConfigOptions.FileToOpen); - } - virtual=new VirtualInput(LOGGER); //TODO Move fileOnStart to PlaybackController + loadConfig(Minecraft.getMinecraft()); + + virtual=new VirtualInput(LOGGER); // Initialize InfoHud hud = new InfoHud(); @@ -146,7 +125,29 @@ public void onInitializeClient() { // Initialize keybind manager keybindManager = new KeybindManager(VirtualKeybindings::isKeyDownExceptTextfield); - // Register event listeners + registerEventListeners(); + + registerNetworkPacketHandlers(); + + // Starting local server instance + try { + TASmod.server = new Server(TASmod.networkingport-1, TASmodPackets.values()); + } catch (Exception e) { + LOGGER.error("Unable to launch TASmod server: {}", e.getMessage()); + } + + } + + private void registerNetworkPacketHandlers() { + // Register packet handlers + LOGGER.info(LoggerMarkers.Networking, "Registering network handlers on client"); + PacketHandlerRegistry.register(controller); + PacketHandlerRegistry.register(ticksyncClient); + PacketHandlerRegistry.register(tickratechanger); + PacketHandlerRegistry.register(savestateHandlerClient); + } + + private void registerEventListeners() { EventListenerRegistry.register(this); // EventListenerRegistry.register(virtual); TODO Remove if unnecessary EventListenerRegistry.register(hud); @@ -161,64 +162,14 @@ public void onInitializeClient() { return gui; })); EventListenerRegistry.register(controller); - PlaybackMetadataRegistry.register(creditsMetadataExtension); EventListenerRegistry.register(creditsMetadataExtension); - - PlaybackMetadataRegistry.register(startpositionMetadataExtension); EventListenerRegistry.register(startpositionMetadataExtension); - - // Register packet handlers - LOGGER.info(LoggerMarkers.Networking, "Registering network handlers on client"); - PacketHandlerRegistry.register(controller); - PacketHandlerRegistry.register(ticksyncClient); - PacketHandlerRegistry.register(tickratechanger); - PacketHandlerRegistry.register(savestateHandlerClient); - - // Starting local server instance - try { - TASmod.server = new Server(TASmod.networkingport-1, TASmodPackets.values()); - } catch (Exception e) { - LOGGER.error("Unable to launch TASmod server: {}", e.getMessage()); - } - } @Override public void onClientInit(Minecraft mc) { - // initialize keybindings - List blockedKeybindings = new ArrayList<>(); - blockedKeybindings.add(keybindManager.registerKeybind(new Keybind("Tickrate 0 Key", "TASmod", Keyboard.KEY_F8, () -> TASmodClient.tickratechanger.togglePause(), VirtualKeybindings::isKeyDown))); - blockedKeybindings.add(keybindManager.registerKeybind(new Keybind("Advance Tick", "TASmod", Keyboard.KEY_F9, () -> TASmodClient.tickratechanger.advanceTick(), VirtualKeybindings::isKeyDown))); - blockedKeybindings.add(keybindManager.registerKeybind(new Keybind("Recording/Playback Stop", "TASmod", Keyboard.KEY_F10, () -> TASmodClient.controller.setTASState(TASstate.NONE), VirtualKeybindings::isKeyDown))); - blockedKeybindings.add(keybindManager.registerKeybind(new Keybind("Create Savestate", "TASmod", Keyboard.KEY_J, () -> { - Minecraft.getMinecraft().ingameGUI.addChatMessage(ChatType.CHAT, new TextComponentString("Savestates might not work correctly at the moment... rewriting a lot of core features, which might break this...")); - try { - TASmodClient.client.send(new TASmodBufferBuilder(TASmodPackets.SAVESTATE_SAVE).writeInt(-1)); - } catch (Exception e) { - e.printStackTrace(); - } - }))); - blockedKeybindings.add(keybindManager.registerKeybind(new Keybind("Load Latest Savestate", "TASmod", Keyboard.KEY_K, () -> { - Minecraft.getMinecraft().ingameGUI.addChatMessage(ChatType.CHAT, new TextComponentString(TextFormatting.RED+"Savestates might not work correctly at the moment... rewriting a lot of core features, which might break this...")); - try { - TASmodClient.client.send(new TASmodBufferBuilder(TASmodPackets.SAVESTATE_LOAD).writeInt(-1)); - } catch (Exception e) { - e.printStackTrace(); - } - }))); - blockedKeybindings.add(keybindManager.registerKeybind(new Keybind("Open InfoGui Editor", "TASmod", Keyboard.KEY_F6, () -> Minecraft.getMinecraft().displayGuiScreen(TASmodClient.hud)))); - blockedKeybindings.add(keybindManager.registerKeybind(new Keybind("Various Testing", "TASmod", Keyboard.KEY_F12, () -> { - controller.setTASState(TASstate.RECORDING); - }, VirtualKeybindings::isKeyDown))); - blockedKeybindings.add(keybindManager.registerKeybind(new Keybind("Various Testing2", "TASmod", Keyboard.KEY_F7, () -> { -// try { -// TASmodClient.client = new Client("localhost", TASmod.networkingport-1, TASmodPackets.values(), mc.getSession().getProfile().getName(), true); -// } catch (Exception e) { -// e.printStackTrace(); -// } - controller.setTASState(TASstate.PLAYBACK); - }, VirtualKeybindings::isKeyDown))); - blockedKeybindings.forEach(VirtualKeybindings::registerBlockedKeyBinding); + registerKeybindings(mc); + registerPlaybackMetadata(mc); createTASDir(); createSavestatesDir(); @@ -255,7 +206,7 @@ public void onPlayerJoinedClientSide(EntityPlayerSP player) { } - if(!(ip+":"+port).equals(connectedIP)) { + if(!(ip+":"+port).equals(connectedIP)) { // TODO Clean this up. Make TASmodNetworkHandler out of this... Maybe with Permission system? try { LOGGER.info("Closing client connection: {}", client.getRemote()); client.disconnect(); @@ -280,34 +231,7 @@ public void onPlayerJoinedClientSide(EntityPlayerSP player) { @Override public GuiScreen onOpenGui(GuiScreen gui) { if (gui instanceof GuiMainMenu) { - if (client == null) { - Minecraft mc = Minecraft.getMinecraft(); - - String IP = "localhost"; - int PORT = TASmod.networkingport - 1; - - // Get the connection on startup from config - String configAddress = config.get(ConfigOptions.ServerConnection); - if(configAddress != null && !configAddress.isEmpty()) { - String[] ipSplit = configAddress.split(":"); - IP = ipSplit[0]; - try { - PORT = Integer.parseInt(ipSplit[1]); - } catch (Exception e) { - LOGGER.catching(Level.ERROR, e); - IP = "localhost"; - PORT = TASmod.networkingport - 1; - } - } - - try { - // connect to server and authenticate - client = new Client(IP, PORT, TASmodPackets.values(), mc.getSession().getUsername(), true); - } catch (Exception e) { - LOGGER.error("Unable to connect TASmod client: {}", e); - } - ticksyncClient.setEnabled(true); - } + initializeCustomPacketHandler(); } else if (gui instanceof GuiControls) { TASmodClient.controller.setTASState(TASstate.NONE); // Set the TASState to nothing to avoid collisions if (TASmodClient.tickratechanger.ticksPerSecond == 0) { @@ -322,4 +246,53 @@ public GuiScreen onOpenGui(GuiScreen gui) { } return gui; } + + private void initializeCustomPacketHandler() { + if (client == null) { + Minecraft mc = Minecraft.getMinecraft(); + + String IP = "localhost"; + int PORT = TASmod.networkingport - 1; + + // Get the connection on startup from config + String configAddress = config.get(ConfigOptions.ServerConnection); + if(configAddress != null && !configAddress.isEmpty()) { + String[] ipSplit = configAddress.split(":"); + IP = ipSplit[0]; + try { + PORT = Integer.parseInt(ipSplit[1]); + } catch (Exception e) { + LOGGER.catching(Level.ERROR, e); + IP = "localhost"; + PORT = TASmod.networkingport - 1; + } + } + + try { + // connect to server and authenticate + client = new Client(IP, PORT, TASmodPackets.values(), mc.getSession().getUsername(), true); + } catch (Exception e) { + LOGGER.error("Unable to connect TASmod client: {}", e); + } + ticksyncClient.setEnabled(true); + } + } + + private void registerKeybindings(Minecraft mc) { + Arrays.stream(TASmodKeybinds.valuesKeybind()).forEach(keybindManager::registerKeybind); + Arrays.stream(TASmodKeybinds.valuesVanillaKeybind()).forEach(VirtualKeybindings::registerBlockedKeyBinding); + } + + private void registerPlaybackMetadata(Minecraft mc) { + TASmodRegistry.PLAYBACK_METADATA.register(creditsMetadataExtension); + TASmodRegistry.PLAYBACK_METADATA.register(startpositionMetadataExtension); + } + + private void loadConfig(Minecraft mc) { + File configDir = new File(mc.mcDataDir, "config"); + if(!configDir.exists()) { + configDir.mkdir(); + } + config = new Configuration("TASmod configuration", new File(configDir, "tasmod.cfg")); + } } diff --git a/src/main/java/com/minecrafttas/tasmod/TASmodRegistry.java b/src/main/java/com/minecrafttas/tasmod/TASmodRegistry.java deleted file mode 100644 index 8e3ad923..00000000 --- a/src/main/java/com/minecrafttas/tasmod/TASmodRegistry.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.minecrafttas.tasmod; - -public class TASmodRegistry { - -} diff --git a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java index 27e1cb81..2a131ec5 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java @@ -22,6 +22,7 @@ import com.dselent.bigarraylist.BigArrayList; import com.minecrafttas.mctcommon.Configuration.ConfigOptions; import com.minecrafttas.mctcommon.events.EventListenerRegistry; +import com.minecrafttas.mctcommon.events.EventClient.EventClientInit; import com.minecrafttas.mctcommon.server.ByteBufferBuilder; import com.minecrafttas.mctcommon.server.Client.Side; import com.minecrafttas.mctcommon.server.exception.PacketNotImplementedException; @@ -40,10 +41,10 @@ import com.minecrafttas.tasmod.networking.TASmodBufferBuilder; import com.minecrafttas.tasmod.networking.TASmodPackets; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata; -import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadataRegistry; import com.minecrafttas.tasmod.playback.tasfile.PlaybackSerialiser; import com.minecrafttas.tasmod.util.LoggerMarkers; import com.minecrafttas.tasmod.util.Scheduler.Task; +import com.minecrafttas.tasmod.util.TASmodRegistry; import com.minecrafttas.tasmod.virtual.VirtualCameraAngle; import com.minecrafttas.tasmod.virtual.VirtualInput; import com.minecrafttas.tasmod.virtual.VirtualKeyboard; @@ -76,7 +77,7 @@ * @author Scribble * */ -public class PlaybackControllerClient implements ClientPacketHandler, EventVirtualKeyboardTick, EventVirtualMouseTick, EventVirtualCameraAngleTick, EventClientTickPost { +public class PlaybackControllerClient implements ClientPacketHandler, EventClientInit, EventVirtualKeyboardTick, EventVirtualMouseTick, EventVirtualCameraAngleTick, EventClientTickPost { /** * The current state of the controller. @@ -527,7 +528,7 @@ public void clear() { comments.clear(); index = 0; desyncMonitor.clear(); - PlaybackMetadataRegistry.handleOnClear(); + TASmodRegistry.PLAYBACK_METADATA.handleOnClear(); } /** @@ -818,4 +819,18 @@ public void onClientPacket(PacketID id, ByteBuffer buf, String username) throws throw new PacketNotImplementedException(packet, this.getClass(), Side.CLIENT); } } + + /** + * Runs on client initialization, used for loading the TASfile after /restartandplay + */ + @Override + public void onClientInit(Minecraft mc) { + // Execute /restartandplay. Load the file to start from the config. If it exists load the playback file on start. + String fileOnStart = TASmodClient.config.get(ConfigOptions.FileToOpen); + if (fileOnStart.isEmpty()) { + fileOnStart = null; + } else { + TASmodClient.config.reset(ConfigOptions.FileToOpen); + } + } } diff --git a/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadataRegistry.java b/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadataRegistry.java index 09df72b6..19d73d9e 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadataRegistry.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadataRegistry.java @@ -3,8 +3,8 @@ import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; -import java.util.Map; +import com.minecrafttas.mctcommon.registry.AbstractRegistry; import com.minecrafttas.tasmod.TASmod; /** @@ -17,16 +17,14 @@ * * @author Scribble */ -public class PlaybackMetadataRegistry { +public class PlaybackMetadataRegistry extends AbstractRegistry{ - private static final Map METADATA_EXTENSION = new LinkedHashMap<>(); + public PlaybackMetadataRegistry() { + super(new LinkedHashMap<>()); + } - /** - * Registers a new class as a metadata extension - * - * @param extension - */ - public static void register(PlaybackMetadataExtension extension) { + @Override + public void register(PlaybackMetadataExtension extension) { if (extension == null) { throw new NullPointerException("Tried to register a playback extension with value null"); } @@ -36,20 +34,21 @@ public static void register(PlaybackMetadataExtension extension) { return; } - if(METADATA_EXTENSION.containsKey(extension.getExtensionName())) { + if(REGISTRY.containsKey(extension.getExtensionName())) { TASmod.LOGGER.warn("Trying to register the playback extension {}, but an extension with the same name is already registered!", extension.getExtensionName()); return; } - METADATA_EXTENSION.put(extension.getExtensionName(), extension); + REGISTRY.put(extension.getExtensionName(), extension); } - public static void unregister(PlaybackMetadataExtension extension) { + @Override + public void unregister(PlaybackMetadataExtension extension) { if (extension == null) { throw new NullPointerException("Tried to unregister an extension with value null"); } - if (METADATA_EXTENSION.containsKey(extension.getExtensionName())) { - METADATA_EXTENSION.remove(extension.getExtensionName()); + if (REGISTRY.containsKey(extension.getExtensionName())) { + REGISTRY.remove(extension.getExtensionName()); } else { TASmod.LOGGER.warn("Trying to unregister the playback extension {}, but it was not registered!", extension.getClass().getName()); } @@ -59,18 +58,18 @@ public static void handleOnCreate() { } - public static List handleOnStore() { + public List handleOnStore() { List metadataList = new ArrayList<>(); - for(PlaybackMetadataExtension extension : METADATA_EXTENSION.values()) { + for(PlaybackMetadataExtension extension : REGISTRY.values()) { metadataList.add(extension.onStore()); } return metadataList; } - public static void handleOnLoad(List meta) { + public void handleOnLoad(List meta) { for(PlaybackMetadata metadata : meta) { - if(METADATA_EXTENSION.containsKey(metadata.getExtensionName())) { - PlaybackMetadataExtension extension = METADATA_EXTENSION.get(metadata.getExtensionName()); + if(REGISTRY.containsKey(metadata.getExtensionName())) { + PlaybackMetadataExtension extension = REGISTRY.get(metadata.getExtensionName()); extension.onLoad(metadata); } else { @@ -79,21 +78,12 @@ public static void handleOnLoad(List meta) { } } - public static void handleOnClear() { - METADATA_EXTENSION.forEach((key, extension) ->{ + public void handleOnClear() { + REGISTRY.forEach((key, extension) ->{ extension.onClear(); }); } - private static boolean containsClass(PlaybackMetadataExtension newExtension) { - for (PlaybackMetadataExtension extension : METADATA_EXTENSION.values()) { - if (extension.getClass().equals(newExtension.getClass())) { - return true; - } - } - return false; - } - public static interface PlaybackMetadataExtension { /** diff --git a/src/main/java/com/minecrafttas/tasmod/util/TASmodKeybinds.java b/src/main/java/com/minecrafttas/tasmod/util/TASmodKeybinds.java new file mode 100644 index 00000000..8ff9d528 --- /dev/null +++ b/src/main/java/com/minecrafttas/tasmod/util/TASmodKeybinds.java @@ -0,0 +1,82 @@ +package com.minecrafttas.tasmod.util; + +import org.lwjgl.input.Keyboard; + +import com.minecrafttas.mctcommon.KeybindManager.IsKeyDownFunc; +import com.minecrafttas.mctcommon.KeybindManager.Keybind; +import com.minecrafttas.tasmod.TASmodClient; +import com.minecrafttas.tasmod.networking.TASmodBufferBuilder; +import com.minecrafttas.tasmod.networking.TASmodPackets; +import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TASstate; +import com.minecrafttas.tasmod.virtual.VirtualKeybindings; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.settings.KeyBinding; +import net.minecraft.util.text.ChatType; +import net.minecraft.util.text.TextComponentString; +import net.minecraft.util.text.TextFormatting; + +public enum TASmodKeybinds { + TICKRATE_0("Tickrate 0 Key", "TASmod", Keyboard.KEY_F8, () -> TASmodClient.tickratechanger.togglePause(), VirtualKeybindings::isKeyDown), + ADVANCE("Advance Tick", "TASmod", Keyboard.KEY_F9, () -> TASmodClient.tickratechanger.advanceTick(), VirtualKeybindings::isKeyDown), + STOP("Recording/Playback Stop", "TASmod", Keyboard.KEY_F10, () -> TASmodClient.controller.setTASState(TASstate.NONE), VirtualKeybindings::isKeyDown), + SAVESTATE("Create Savestate", "TASmod", Keyboard.KEY_J, + () -> { + Minecraft.getMinecraft().ingameGUI.addChatMessage(ChatType.CHAT, new TextComponentString("Savestates might not work correctly at the moment... rewriting a lot of core features, which might break this...")); + try { + TASmodClient.client.send(new TASmodBufferBuilder(TASmodPackets.SAVESTATE_SAVE).writeInt(-1)); + } catch (Exception e) { + e.printStackTrace(); + } + }), + LOADSTATE("Load Latest Savestate", "TASmod", Keyboard.KEY_K, + () -> { + Minecraft.getMinecraft().ingameGUI.addChatMessage(ChatType.CHAT, new TextComponentString(TextFormatting.RED+"Savestates might not work correctly at the moment... rewriting a lot of core features, which might break this...")); + try { + TASmodClient.client.send(new TASmodBufferBuilder(TASmodPackets.SAVESTATE_LOAD).writeInt(-1)); + } catch (Exception e) { + e.printStackTrace(); + } + }), + INFO_GUI("Open InfoGui Editor", "TASmod", Keyboard.KEY_F6, () -> Minecraft.getMinecraft().displayGuiScreen(TASmodClient.hud)), + TEST1("Various Testing", "TASmod", Keyboard.KEY_F12, () -> { + TASmodClient.controller.setTASState(TASstate.RECORDING); + }, VirtualKeybindings::isKeyDown), + TEST2("Various Testing2", "TASmod", Keyboard.KEY_F7, + () -> { +// try { +// TASmodClient.client = new Client("localhost", TASmod.networkingport - 1, TASmodPackets.values(), mc.getSession().getProfile().getName(), true); +// } catch (Exception e) { +// e.printStackTrace(); +// } + TASmodClient.controller.setTASState(TASstate.PLAYBACK); + }, VirtualKeybindings::isKeyDown); + + private Keybind keybind; + + private TASmodKeybinds(String name, String category, int defaultKey, Runnable onKeyDown, IsKeyDownFunc func) { + this.keybind=new Keybind(name, category, defaultKey, onKeyDown); + } + + private TASmodKeybinds(String name, String category, int defaultKey, Runnable onKeyDown) { + this(name, category, defaultKey, onKeyDown, null); + } + + public static Keybind[] valuesKeybind() { + TASmodKeybinds[] tasmodkeybinds = values(); + Keybind[] keybinds = new Keybind[tasmodkeybinds.length]; + for (int i = 0; i < tasmodkeybinds.length; i++) { + keybinds[i]=tasmodkeybinds[i].keybind; + } + return keybinds; + } + + public static KeyBinding[] valuesVanillaKeybind() { + TASmodKeybinds[] tasmodkeybinds = values(); + KeyBinding[] keybinds = new KeyBinding[tasmodkeybinds.length]; + for (int i = 0; i < tasmodkeybinds.length; i++) { + keybinds[i]=tasmodkeybinds[i].keybind.vanillaKeyBinding; + } + return keybinds; + } +} diff --git a/src/main/java/com/minecrafttas/tasmod/util/TASmodRegistry.java b/src/main/java/com/minecrafttas/tasmod/util/TASmodRegistry.java new file mode 100644 index 00000000..131e6e75 --- /dev/null +++ b/src/main/java/com/minecrafttas/tasmod/util/TASmodRegistry.java @@ -0,0 +1,17 @@ +package com.minecrafttas.tasmod.util; + +import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadataRegistry; + +public class TASmodRegistry { + /** + * Registry for registering custom metadata that is stored in the TASFile.
+ *
+ * The default metadata includes general information such as author name, + * savestate/rerecord count and category.
+ *
+ * Any custom class has to implement PlaybackMetadataExtension + * + */ + public static final PlaybackMetadataRegistry PLAYBACK_METADATA = new PlaybackMetadataRegistry(); + +} diff --git a/src/test/java/tasmod/playback/metadata/PlaybackMetadataRegistryTest.java b/src/test/java/tasmod/playback/metadata/PlaybackMetadataRegistryTest.java index 1c3ba61e..b68e645d 100644 --- a/src/test/java/tasmod/playback/metadata/PlaybackMetadataRegistryTest.java +++ b/src/test/java/tasmod/playback/metadata/PlaybackMetadataRegistryTest.java @@ -1,13 +1,6 @@ package tasmod.playback.metadata; -import org.apache.commons.io.FileUtils; -import org.junit.jupiter.api.Test; - -import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata; -import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadataRegistry; -import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadataRegistry.PlaybackMetadataExtension; - -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; import java.io.File; import java.io.IOException; @@ -15,6 +8,13 @@ import java.util.ArrayList; import java.util.List; +import org.apache.commons.io.FileUtils; +import org.junit.jupiter.api.Test; + +import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata; +import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadataRegistry.PlaybackMetadataExtension; +import com.minecrafttas.tasmod.util.TASmodRegistry; + public class PlaybackMetadataRegistryTest { @@ -56,7 +56,7 @@ public void onClear() { File file = new File("src/test/resources/run/MetadataRegistry.txt"); void store() { - List list = PlaybackMetadataRegistry.handleOnStore(); + List list = TASmodRegistry.PLAYBACK_METADATA.handleOnStore(); List out = new ArrayList<>(); list.forEach(data -> { @@ -83,7 +83,7 @@ void load() { meta.add(PlaybackMetadata.fromStringList("Test1", loaded)); - PlaybackMetadataRegistry.handleOnLoad(meta); + TASmodRegistry.PLAYBACK_METADATA.handleOnLoad(meta); } /** @@ -92,7 +92,7 @@ void load() { @Test void testRegistry() { Test1 actual = new Test1(); - PlaybackMetadataRegistry.register(actual); + TASmodRegistry.PLAYBACK_METADATA.register(actual); store(); load(); From e09a4d60d550f15ec275976d85f68b6beb52d16d Mon Sep 17 00:00:00 2001 From: Scribble Date: Thu, 9 May 2024 22:12:50 +0200 Subject: [PATCH 08/79] [PlaybackSerialiser] Added serialise functionality - Renamed PlaybackSerialiserFlavorBase to PlaybackFlavorBase - Renamed PlaybackSerialiserFlavorRegistry to PlaybackFlavorRegistry - Added PlaybackFlavorRegistry to TASmodRegistry - Continued on PlaybackFlavorBase --- .../mctcommon/registry/AbstractRegistry.java | 2 +- .../com/minecrafttas/tasmod/TASmodClient.java | 8 +++++ .../playback/tasfile/PlaybackSerialiser2.java | 33 +++++++++++++---- ...lavorBase.java => PlaybackFlavorBase.java} | 24 +++++++++++-- ...istry.java => PlaybackFlavorRegistry.java} | 35 +++++++++---------- .../tasfile/flavor/integrated/BetaFlavor.java | 4 +-- .../tasmod/util/TASmodRegistry.java | 13 ++++++- .../PlaybackMetadataRegistryTest.java | 2 +- .../tasfile/PlaybackSerialiserTest.java | 5 ++- .../PlaybackSerializerFlavorBaseTest.java | 14 ++++---- .../tasfile/integrated/BetaFlavorTest.java | 22 ++++++++++++ 11 files changed, 122 insertions(+), 40 deletions(-) rename src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/{PlaybackSerialiserFlavorBase.java => PlaybackFlavorBase.java} (82%) rename src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/{PlaybackSerialiserFlavorRegistry.java => PlaybackFlavorRegistry.java} (54%) create mode 100644 src/test/java/tasmod/playback/tasfile/integrated/BetaFlavorTest.java diff --git a/src/main/java/com/minecrafttas/mctcommon/registry/AbstractRegistry.java b/src/main/java/com/minecrafttas/mctcommon/registry/AbstractRegistry.java index 6ee4fab5..0d6e2221 100644 --- a/src/main/java/com/minecrafttas/mctcommon/registry/AbstractRegistry.java +++ b/src/main/java/com/minecrafttas/mctcommon/registry/AbstractRegistry.java @@ -3,7 +3,7 @@ import java.util.Map; public abstract class AbstractRegistry { - public final Map REGISTRY; + protected final Map REGISTRY; public AbstractRegistry(Map map) { REGISTRY = map; diff --git a/src/main/java/com/minecrafttas/tasmod/TASmodClient.java b/src/main/java/com/minecrafttas/tasmod/TASmodClient.java index 35ef1831..e07aa70c 100644 --- a/src/main/java/com/minecrafttas/tasmod/TASmodClient.java +++ b/src/main/java/com/minecrafttas/tasmod/TASmodClient.java @@ -27,6 +27,7 @@ import com.minecrafttas.tasmod.playback.metadata.integrated.CreditsMetadataExtension; import com.minecrafttas.tasmod.playback.metadata.integrated.StartpositionMetadataExtension; import com.minecrafttas.tasmod.playback.tasfile.PlaybackSerialiser; +import com.minecrafttas.tasmod.playback.tasfile.flavor.integrated.BetaFlavor; import com.minecrafttas.tasmod.savestates.SavestateHandlerClient; import com.minecrafttas.tasmod.tickratechanger.TickrateChangerClient; import com.minecrafttas.tasmod.ticksync.TickSyncClient; @@ -170,6 +171,7 @@ private void registerEventListeners() { public void onClientInit(Minecraft mc) { registerKeybindings(mc); registerPlaybackMetadata(mc); + registerSerialiserFlavors(mc); createTASDir(); createSavestatesDir(); @@ -288,6 +290,12 @@ private void registerPlaybackMetadata(Minecraft mc) { TASmodRegistry.PLAYBACK_METADATA.register(startpositionMetadataExtension); } + public static BetaFlavor betaFlavor = new BetaFlavor(); + + private void registerSerialiserFlavors(Minecraft mc) { + TASmodRegistry.SERIALISER_FLAVOR.register(betaFlavor); + } + private void loadConfig(Minecraft mc) { File configDir = new File(mc.mcDataDir, "config"); if(!configDir.exists()) { diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java index 8f83c077..556f62a6 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java @@ -1,13 +1,22 @@ package com.minecrafttas.tasmod.playback.tasfile; import java.io.File; +import java.util.ArrayList; +import java.util.List; +import com.dselent.bigarraylist.BigArrayList; import com.minecrafttas.tasmod.playback.PlaybackControllerClient; +import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickInputContainer; +import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata; +import com.minecrafttas.tasmod.playback.tasfile.flavor.PlaybackFlavorBase; +import com.minecrafttas.tasmod.util.TASmodRegistry; /** * Serialises and deserialises the {@link PlaybackControllerClient}.
* Also contains methods to save and read the {@link PlaybackControllerClient} * to/from a file + * + * @author Scribble */ public class PlaybackSerialiser2 { @@ -20,20 +29,32 @@ public class PlaybackSerialiser2 { * @param controller * @param flavor */ - public static void saveToFile(File file, PlaybackControllerClient controller, String flavor) { + public static void saveToFile(File file, PlaybackControllerClient controller, String flavorname) { + if (controller == null) { + throw new NullPointerException("Save to file failed. No controller specified"); + } + saveToFile(file, controller.getInputs(), flavorname); + } + + public static void saveToFile(File file, BigArrayList container, String flavorname) { if (file == null) { throw new NullPointerException("Save to file failed. No file specified"); } - - if (controller == null) { - throw new NullPointerException("Save to file failed. No controller specified"); + + if (container == null) { + throw new NullPointerException("Save to file failed. No tickcontainer list specified"); } - if (flavor == null) { - flavor = defaultFlavor; + if (flavorname == null) { + flavorname = defaultFlavor; } + PlaybackFlavorBase flavor = TASmodRegistry.SERIALISER_FLAVOR.getFlavor(flavorname); + + List metadataList = TASmodRegistry.PLAYBACK_METADATA.handleOnStore(); + List outLines = new ArrayList<>(); + outLines.addAll(flavor.serialiseHeader(metadataList)); } /** diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackSerialiserFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java similarity index 82% rename from src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackSerialiserFlavorBase.java rename to src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java index 45db661f..28ecbe57 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackSerialiserFlavorBase.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java @@ -3,6 +3,8 @@ import java.io.Serializable; import java.util.ArrayList; import java.util.List; +import java.util.Queue; +import java.util.concurrent.LinkedBlockingQueue; import com.dselent.bigarraylist.BigArrayList; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickInputContainer; @@ -11,7 +13,7 @@ import com.minecrafttas.tasmod.virtual.VirtualKeyboard; import com.minecrafttas.tasmod.virtual.VirtualMouse; -public abstract class PlaybackSerialiserFlavorBase { +public abstract class PlaybackFlavorBase { /** * The current tick that is being serialised or deserialised @@ -62,7 +64,25 @@ protected List serialiseContainer(TickInputContainer container) { protected abstract List serialiseCameraAngle(VirtualCameraAngle cameraAngle); protected List mergeInputs(List serialisedKeyboard, List serialisedMouse, List serialisedCameraAngle) { - return null; + List out = new ArrayList<>(); + + Queue keyboardQueue = new LinkedBlockingQueue<>(serialisedKeyboard); + Queue mouseQueue = new LinkedBlockingQueue<>(serialisedMouse); + Queue cameraAngleQueue = new LinkedBlockingQueue<>(serialisedCameraAngle); + + while(!keyboardQueue.isEmpty() && !mouseQueue.isEmpty() && !cameraAngleQueue.isEmpty()) { + String kb = getOrEmpty(keyboardQueue.poll()); + String ms = getOrEmpty(mouseQueue.poll()); + String ca = getOrEmpty(cameraAngleQueue.poll()); + + out.add(kb + ms + ca); + } + + return out; + } + + protected String getOrEmpty(String string) { + return string == null ? "" : string; } public BigArrayList deserialise(BigArrayList lines) { diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackSerialiserFlavorRegistry.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorRegistry.java similarity index 54% rename from src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackSerialiserFlavorRegistry.java rename to src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorRegistry.java index 13007269..3eaf0774 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackSerialiserFlavorRegistry.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorRegistry.java @@ -1,9 +1,9 @@ package com.minecrafttas.tasmod.playback.tasfile.flavor; import java.util.LinkedHashMap; -import java.util.Map; import java.util.Set; +import com.minecrafttas.mctcommon.registry.AbstractRegistry; import com.minecrafttas.tasmod.TASmod; /** @@ -12,11 +12,13 @@ * * @author Scribble */ -public class PlaybackSerialiserFlavorRegistry { - - private static final Map SERIALISER_FLAVOR = new LinkedHashMap<>(); +public class PlaybackFlavorRegistry extends AbstractRegistry{ + + public PlaybackFlavorRegistry() { + super(new LinkedHashMap<>()); + } - public static void register(PlaybackSerialiserFlavorBase flavor) { + public void register(PlaybackFlavorBase flavor) { if (flavor == null) { throw new NullPointerException("Tried to register a serialiser flavor. But flavor is null."); } @@ -26,35 +28,30 @@ public static void register(PlaybackSerialiserFlavorBase flavor) { return; } - if(SERIALISER_FLAVOR.containsKey(flavor.serialiseFlavorName())) { + if(REGISTRY.containsKey(flavor.serialiseFlavorName())) { TASmod.LOGGER.warn("Trying to register the serialiser flavor {}, but a flavor with the same name is already registered!", flavor.serialiseFlavorName()); return; } - SERIALISER_FLAVOR.put(flavor.serialiseFlavorName(), flavor); + REGISTRY.put(flavor.serialiseFlavorName(), flavor); } - public static void unregister(PlaybackSerialiserFlavorBase flavor) { + public void unregister(PlaybackFlavorBase flavor) { if (flavor == null) { throw new NullPointerException("Tried to unregister a flavor with value null"); } - if (SERIALISER_FLAVOR.containsKey(flavor.serialiseFlavorName())) { - SERIALISER_FLAVOR.remove(flavor.serialiseFlavorName()); + if (REGISTRY.containsKey(flavor.serialiseFlavorName())) { + REGISTRY.remove(flavor.serialiseFlavorName()); } else { TASmod.LOGGER.warn("Trying to unregister the flavor {}, but it was not registered!", flavor.getClass().getName()); } } - private static boolean containsClass(PlaybackSerialiserFlavorBase newExtension) { - for (PlaybackSerialiserFlavorBase extension : SERIALISER_FLAVOR.values()) { - if (extension.getClass().equals(newExtension.getClass())) { - return true; - } - } - return false; + public Set getFlavorNames(){ + return REGISTRY.keySet(); } - public static Set getFlavorNames(){ - return SERIALISER_FLAVOR.keySet(); + public PlaybackFlavorBase getFlavor(String name) { + return REGISTRY.get(name); } } diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/integrated/BetaFlavor.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/integrated/BetaFlavor.java index 52b6c75a..e72757fc 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/integrated/BetaFlavor.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/integrated/BetaFlavor.java @@ -2,12 +2,12 @@ import java.util.List; -import com.minecrafttas.tasmod.playback.tasfile.flavor.PlaybackSerialiserFlavorBase; +import com.minecrafttas.tasmod.playback.tasfile.flavor.PlaybackFlavorBase; import com.minecrafttas.tasmod.virtual.VirtualCameraAngle; import com.minecrafttas.tasmod.virtual.VirtualKeyboard; import com.minecrafttas.tasmod.virtual.VirtualMouse; -public class BetaFlavor extends PlaybackSerialiserFlavorBase { +public class BetaFlavor extends PlaybackFlavorBase { @Override public String flavorName() { diff --git a/src/main/java/com/minecrafttas/tasmod/util/TASmodRegistry.java b/src/main/java/com/minecrafttas/tasmod/util/TASmodRegistry.java index 131e6e75..2ad5afad 100644 --- a/src/main/java/com/minecrafttas/tasmod/util/TASmodRegistry.java +++ b/src/main/java/com/minecrafttas/tasmod/util/TASmodRegistry.java @@ -1,6 +1,9 @@ package com.minecrafttas.tasmod.util; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadataRegistry; +import com.minecrafttas.tasmod.playback.tasfile.flavor.PlaybackFlavorBase; +import com.minecrafttas.tasmod.playback.tasfile.flavor.PlaybackFlavorRegistry; +import com.minecrafttas.tasmod.playback.tasfile.flavor.integrated.BetaFlavor; public class TASmodRegistry { /** @@ -10,8 +13,16 @@ public class TASmodRegistry { * savestate/rerecord count and category.
*
* Any custom class has to implement PlaybackMetadataExtension - * */ public static final PlaybackMetadataRegistry PLAYBACK_METADATA = new PlaybackMetadataRegistry(); + /** + * Registry for registering custom seialiser flavors that dictate the syntax of the inputs stored in the TASfile.
+ *
+ * Either create a new flavor by extending {@link PlaybackFlavorBase}
+ * or extend an existing flavor (like {@link BetaFlavor}) and overwrite parts of the methods.
+ *
+ * The resulting flavor can be registered here and can be found as a saving option with /saveTAS + */ + public static final PlaybackFlavorRegistry SERIALISER_FLAVOR = new PlaybackFlavorRegistry(); } diff --git a/src/test/java/tasmod/playback/metadata/PlaybackMetadataRegistryTest.java b/src/test/java/tasmod/playback/metadata/PlaybackMetadataRegistryTest.java index b68e645d..5ed0ad09 100644 --- a/src/test/java/tasmod/playback/metadata/PlaybackMetadataRegistryTest.java +++ b/src/test/java/tasmod/playback/metadata/PlaybackMetadataRegistryTest.java @@ -53,7 +53,7 @@ public void onClear() { } - File file = new File("src/test/resources/run/MetadataRegistry.txt"); + File file = new File("src/test/resources/metadata/MetadataRegistry.txt"); void store() { List list = TASmodRegistry.PLAYBACK_METADATA.handleOnStore(); diff --git a/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java b/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java index 6d9a2ce1..f8c20d84 100644 --- a/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java +++ b/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java @@ -1,5 +1,8 @@ package tasmod.playback.tasfile; -public class PlaybackSerialiserTest { +import static org.junit.jupiter.api.Assertions.*; +public class PlaybackSerialiserTest { + + } diff --git a/src/test/java/tasmod/playback/tasfile/PlaybackSerializerFlavorBaseTest.java b/src/test/java/tasmod/playback/tasfile/PlaybackSerializerFlavorBaseTest.java index c9b02b60..223d5558 100644 --- a/src/test/java/tasmod/playback/tasfile/PlaybackSerializerFlavorBaseTest.java +++ b/src/test/java/tasmod/playback/tasfile/PlaybackSerializerFlavorBaseTest.java @@ -2,7 +2,7 @@ import org.junit.jupiter.api.Test; -import com.minecrafttas.tasmod.playback.tasfile.flavor.PlaybackSerialiserFlavorBase; +import com.minecrafttas.tasmod.playback.tasfile.flavor.PlaybackFlavorBase; import static org.junit.jupiter.api.Assertions.*; @@ -10,42 +10,42 @@ public class PlaybackSerializerFlavorBaseTest { @Test void testStringPaddingEven() { - String actual = PlaybackSerialiserFlavorBase.createCenteredHeading(null, '#', 52); + String actual = PlaybackFlavorBase.createCenteredHeading(null, '#', 52); String expected = "####################################################"; assertEquals(expected, actual); } @Test void testStringPaddingOdd() { - String actual = PlaybackSerialiserFlavorBase.createCenteredHeading(null, '#', 51); + String actual = PlaybackFlavorBase.createCenteredHeading(null, '#', 51); String expected = "###################################################"; assertEquals(expected, actual); } @Test void testCenterHeadingEven() { - String actual = PlaybackSerialiserFlavorBase.createCenteredHeading("TASfile", '#', 52); + String actual = PlaybackFlavorBase.createCenteredHeading("TASfile", '#', 52); String expected = "###################### TASfile #####################"; assertEquals(expected, actual); } @Test void testCenterHeadingOdd() { - String actual = PlaybackSerialiserFlavorBase.createCenteredHeading("TASfile", '#', 51); + String actual = PlaybackFlavorBase.createCenteredHeading("TASfile", '#', 51); String expected = "##################### TASfile #####################"; assertEquals(expected, actual); } @Test void testCenterHeadingEvenText() { - String actual = PlaybackSerialiserFlavorBase.createCenteredHeading("TASfiles", '#', 51); + String actual = PlaybackFlavorBase.createCenteredHeading("TASfiles", '#', 51); String expected = "##################### TASfiles ####################"; assertEquals(expected, actual); } @Test void testCenterHeadingEvenText2() { - String actual = PlaybackSerialiserFlavorBase.createCenteredHeading("Keystrokes", '#', 51); + String actual = PlaybackFlavorBase.createCenteredHeading("Keystrokes", '#', 51); String expected = "#################### Keystrokes ###################"; assertEquals(expected, actual); } diff --git a/src/test/java/tasmod/playback/tasfile/integrated/BetaFlavorTest.java b/src/test/java/tasmod/playback/tasfile/integrated/BetaFlavorTest.java new file mode 100644 index 00000000..298c3ff8 --- /dev/null +++ b/src/test/java/tasmod/playback/tasfile/integrated/BetaFlavorTest.java @@ -0,0 +1,22 @@ +package tasmod.playback.tasfile.integrated; + +import java.io.File; + +import org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import com.minecrafttas.tasmod.playback.tasfile.PlaybackSerialiser2; +import com.minecrafttas.tasmod.playback.tasfile.flavor.integrated.BetaFlavor; +import com.minecrafttas.tasmod.util.TASmodRegistry; + +public class BetaFlavorTest { + + private BetaFlavor flavor = new BetaFlavor(); + + private File file = new File("src/test/resources/betaflavor"); + + @Test + void testSerialize() { + } +} From 91af4a23ccf03698b093ac238ab23e0d405c32b0 Mon Sep 17 00:00:00 2001 From: Scribble Date: Fri, 10 May 2024 14:06:16 +0200 Subject: [PATCH 09/79] [PlaybackSerialiser] Switched flavor to pass by reference --- .../playback/tasfile/PlaybackSerialiser2.java | 22 +++++-- .../tasfile/flavor/PlaybackFlavorBase.java | 63 ++++++++++++------- .../flavor/PlaybackFlavorRegistry.java | 10 +-- .../tasfile/flavor/integrated/BetaFlavor.java | 5 +- 4 files changed, 64 insertions(+), 36 deletions(-) diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java index 556f62a6..08061f1c 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java @@ -1,7 +1,7 @@ package com.minecrafttas.tasmod.playback.tasfile; import java.io.File; -import java.util.ArrayList; +import java.io.FileNotFoundException; import java.util.List; import com.dselent.bigarraylist.BigArrayList; @@ -9,6 +9,7 @@ import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickInputContainer; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata; import com.minecrafttas.tasmod.playback.tasfile.flavor.PlaybackFlavorBase; +import com.minecrafttas.tasmod.util.FileThread; import com.minecrafttas.tasmod.util.TASmodRegistry; /** @@ -28,15 +29,16 @@ public class PlaybackSerialiser2 { * @param file The file to save the serialised inputs to. * @param controller * @param flavor + * @throws FileNotFoundException */ - public static void saveToFile(File file, PlaybackControllerClient controller, String flavorname) { + public static void saveToFile(File file, PlaybackControllerClient controller, String flavorname) throws FileNotFoundException { if (controller == null) { throw new NullPointerException("Save to file failed. No controller specified"); } saveToFile(file, controller.getInputs(), flavorname); } - public static void saveToFile(File file, BigArrayList container, String flavorname) { + public static void saveToFile(File file, BigArrayList container, String flavorname) throws FileNotFoundException { if (file == null) { throw new NullPointerException("Save to file failed. No file specified"); } @@ -49,12 +51,22 @@ public static void saveToFile(File file, BigArrayList contai flavorname = defaultFlavor; } + FileThread writerThread = new FileThread(file, false); + PlaybackFlavorBase flavor = TASmodRegistry.SERIALISER_FLAVOR.getFlavor(flavorname); List metadataList = TASmodRegistry.PLAYBACK_METADATA.handleOnStore(); - List outLines = new ArrayList<>(); - outLines.addAll(flavor.serialiseHeader(metadataList)); + for (String line : flavor.serialiseHeader(metadataList)) { + writerThread.addLine(line); + } + + BigArrayList tickLines = flavor.serialise(container); + for (long i = 0; i < tickLines.size(); i++) { + writerThread.addLine(tickLines.get(i)); + } + + writerThread.close(); } /** diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java index 28ecbe57..af980182 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java @@ -18,24 +18,29 @@ public abstract class PlaybackFlavorBase { /** * The current tick that is being serialised or deserialised */ - private int currentTick; + protected int currentTick; public abstract String flavorName(); public List serialiseHeader(List metadataList) { List out = new ArrayList<>(); - out.add(serialiseFlavorName()); + serialiseFlavorName(out); // out.add(serializeExtensionNames()); - out.addAll(serialiseMetadata(metadataList)); + serialiseMetadata(out, metadataList); return out; } - protected String serialiseFlavorName() { - return "Flavor:" + flavorName(); + protected void serialiseFlavorName(List out) { + out.add("# Flavor:" + flavorName()); } - public List serialiseMetadata(List metadataList) { - return null; + protected void serialiseMetadata(List out, List metadataList) { + for (PlaybackMetadata metadata : metadataList) { + out.add("### " + metadata.getExtensionName()); + for (String value : metadata.toStringList()) { + out.add("# " + value); + } + } } public BigArrayList serialise(BigArrayList inputs) { @@ -44,43 +49,57 @@ public BigArrayList serialise(BigArrayList inputs) { for (int i = 0; i < inputs.size(); i++) { currentTick = i; TickInputContainer container = inputs.get(i); - addAll(out, serialiseContainer(container)); + serialiseContainer(out, container); } return out; } - protected List serialiseContainer(TickInputContainer container) { + protected void serialiseContainer(BigArrayList out, TickInputContainer container) { List serialisedKeyboard = serialiseKeyboard(container.getKeyboard()); List serialisedMouse = serialiseMouse(container.getMouse()); List serialisedCameraAngle = serialiseCameraAngle(container.getCameraAngle()); - return mergeInputs(serialisedKeyboard, serialisedMouse, serialisedCameraAngle); + mergeInputs(out, serialisedKeyboard, serialisedMouse, serialisedCameraAngle); } - protected abstract List serialiseKeyboard(VirtualKeyboard keyboard); - - protected abstract List serialiseMouse(VirtualMouse mouse); + protected List serialiseKeyboard(VirtualKeyboard keyboard) { + List out = new ArrayList<>(); + for (VirtualKeyboard subtick : keyboard.getAll()) { + out.add(subtick.toString()); + } + return out; + } - protected abstract List serialiseCameraAngle(VirtualCameraAngle cameraAngle); + protected List serialiseMouse(VirtualMouse mouse) { + List out = new ArrayList<>(); + for (VirtualMouse subtick : mouse.getAll()) { + out.add(subtick.toString()); + } + return out; + } - protected List mergeInputs(List serialisedKeyboard, List serialisedMouse, List serialisedCameraAngle) { + protected List serialiseCameraAngle(VirtualCameraAngle cameraAngle) { List out = new ArrayList<>(); - + for (VirtualCameraAngle subtick : cameraAngle.getAll()) { + out.add(subtick.toString()); + } + return out; + } + + protected void mergeInputs(BigArrayList out, List serialisedKeyboard, List serialisedMouse, List serialisedCameraAngle) { Queue keyboardQueue = new LinkedBlockingQueue<>(serialisedKeyboard); Queue mouseQueue = new LinkedBlockingQueue<>(serialisedMouse); Queue cameraAngleQueue = new LinkedBlockingQueue<>(serialisedCameraAngle); - - while(!keyboardQueue.isEmpty() && !mouseQueue.isEmpty() && !cameraAngleQueue.isEmpty()) { + + while (!keyboardQueue.isEmpty() || !mouseQueue.isEmpty() || !cameraAngleQueue.isEmpty()) { String kb = getOrEmpty(keyboardQueue.poll()); String ms = getOrEmpty(mouseQueue.poll()); String ca = getOrEmpty(cameraAngleQueue.poll()); - + out.add(kb + ms + ca); } - - return out; } - + protected String getOrEmpty(String string) { return string == null ? "" : string; } diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorRegistry.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorRegistry.java index 3eaf0774..88b91d73 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorRegistry.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorRegistry.java @@ -28,20 +28,20 @@ public void register(PlaybackFlavorBase flavor) { return; } - if(REGISTRY.containsKey(flavor.serialiseFlavorName())) { - TASmod.LOGGER.warn("Trying to register the serialiser flavor {}, but a flavor with the same name is already registered!", flavor.serialiseFlavorName()); + if(REGISTRY.containsKey(flavor.flavorName())) { + TASmod.LOGGER.warn("Trying to register the serialiser flavor {}, but a flavor with the same name is already registered!", flavor.flavorName()); return; } - REGISTRY.put(flavor.serialiseFlavorName(), flavor); + REGISTRY.put(flavor.flavorName(), flavor); } public void unregister(PlaybackFlavorBase flavor) { if (flavor == null) { throw new NullPointerException("Tried to unregister a flavor with value null"); } - if (REGISTRY.containsKey(flavor.serialiseFlavorName())) { - REGISTRY.remove(flavor.serialiseFlavorName()); + if (REGISTRY.containsKey(flavor.flavorName())) { + REGISTRY.remove(flavor.flavorName()); } else { TASmod.LOGGER.warn("Trying to unregister the flavor {}, but it was not registered!", flavor.getClass().getName()); } diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/integrated/BetaFlavor.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/integrated/BetaFlavor.java index e72757fc..85c20f97 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/integrated/BetaFlavor.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/integrated/BetaFlavor.java @@ -16,20 +16,17 @@ public String flavorName() { @Override protected List serialiseKeyboard(VirtualKeyboard keyboard) { - // TODO Auto-generated method stub return null; } @Override protected List serialiseMouse(VirtualMouse mouse) { - // TODO Auto-generated method stub return null; + } @Override protected List serialiseCameraAngle(VirtualCameraAngle cameraAngle) { - // TODO Auto-generated method stub return null; } - } From 6a7e042098a82a9e5b004f728db562412c5ad736 Mon Sep 17 00:00:00 2001 From: Scribble Date: Fri, 10 May 2024 22:28:08 +0200 Subject: [PATCH 10/79] [PlaybackSerialiser] Added tests for PlaybackFlavorBase - Added better container handling to flavor base - [PlaybackController] Removed tick field from TickInputContainer and added it to serialiser - [VirtualInput] Made toString() public --- .../mctcommon/registry/AbstractRegistry.java | 4 + .../playback/PlaybackControllerClient.java | 32 +-- .../playback/tasfile/PlaybackSerialiser.java | 2 +- .../tasfile/flavor/PlaybackFlavorBase.java | 44 +++- .../tasmod/virtual/VirtualCameraAngle.java | 2 +- .../tasmod/virtual/VirtualKeyboard.java | 2 +- .../tasmod/virtual/VirtualMouse.java | 2 +- .../PlaybackMetadataRegistryTest.java | 6 + .../tasfile/PlaybackFlavorBaseTest.java | 227 ++++++++++++++++++ .../PlaybackSerializerFlavorBaseTest.java | 52 ---- 10 files changed, 281 insertions(+), 92 deletions(-) create mode 100644 src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java delete mode 100644 src/test/java/tasmod/playback/tasfile/PlaybackSerializerFlavorBaseTest.java diff --git a/src/main/java/com/minecrafttas/mctcommon/registry/AbstractRegistry.java b/src/main/java/com/minecrafttas/mctcommon/registry/AbstractRegistry.java index 0d6e2221..d2370a75 100644 --- a/src/main/java/com/minecrafttas/mctcommon/registry/AbstractRegistry.java +++ b/src/main/java/com/minecrafttas/mctcommon/registry/AbstractRegistry.java @@ -26,6 +26,10 @@ public final void unregister(V... registryObjects) { this.unregister(registryObject); } } + + public void clear() { + REGISTRY.clear(); + } protected boolean containsClass(V newExtension) { for (V extension : REGISTRY.values()) { diff --git a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java index 2a131ec5..60da90c4 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java @@ -258,7 +258,7 @@ public String setTASStateClient(TASstate stateIn, boolean verbose) { private void startRecording() { LOGGER.debug(LoggerMarkers.Playback, "Starting recording"); if (this.inputs.isEmpty()) { - inputs.add(new TickInputContainer(index)); + inputs.add(new TickInputContainer()); desyncMonitor.recordNull(index); } } @@ -413,9 +413,9 @@ private void recordNextTick() { if (inputs.size() < index) { LOGGER.warn("Index is {} inputs bigger than the container!", index - inputs.size()); } - inputs.add(new TickInputContainer(index, keyboard.clone(), mouse.clone(), camera.clone())); + inputs.add(new TickInputContainer(keyboard.clone(), mouse.clone(), camera.clone())); } else { - inputs.set(index, new TickInputContainer(index, keyboard.clone(), mouse.clone(), camera.clone())); + inputs.set(index, new TickInputContainer(keyboard.clone(), mouse.clone(), camera.clone())); } desyncMonitor.recordMonitor(index); // Capturing monitor values } @@ -546,12 +546,6 @@ public String toString() { return out; } - public void fixTicks() { // TODO Remove and use Serializer to list ticks - for (int i = 0; i < inputs.size(); i++) { - inputs.get(i).setTick(i + 1); - } - } - // ============================================================== /** @@ -581,23 +575,19 @@ public static class TickInputContainer implements Serializable { private static final long serialVersionUID = -3420565284438152474L; - private int tick; - private VirtualKeyboard keyboard; private VirtualMouse mouse; private VirtualCameraAngle subticks; - public TickInputContainer(int tick, VirtualKeyboard keyboard, VirtualMouse mouse, VirtualCameraAngle subticks) { - this.tick = tick; + public TickInputContainer(VirtualKeyboard keyboard, VirtualMouse mouse, VirtualCameraAngle subticks) { this.keyboard = keyboard; this.mouse = mouse; this.subticks = subticks; } - public TickInputContainer(int tick) { - this.tick = tick; + public TickInputContainer() { this.keyboard = new VirtualKeyboard(); this.mouse = new VirtualMouse(); this.subticks = new VirtualCameraAngle(); @@ -605,7 +595,7 @@ public TickInputContainer(int tick) { @Override public String toString() { - return tick + "|" + keyboard.toString() + "|" + mouse.toString() + "|" + subticks.toString(); + return keyboard.toString() + "|" + mouse.toString() + "|" + subticks.toString(); } public VirtualKeyboard getKeyboard() { @@ -620,17 +610,9 @@ public VirtualCameraAngle getCameraAngle() { return subticks; } - public int getTick() { - return tick; - } - - public void setTick(int tick) { - this.tick = tick; - } - @Override public TickInputContainer clone() { - return new TickInputContainer(tick, keyboard, mouse, subticks); + return new TickInputContainer(keyboard, mouse, subticks); } } diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser.java index 29b0db5e..79ecb2d0 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser.java @@ -273,7 +273,7 @@ public PlaybackControllerClient fromEntireFileV1(File file) throws IOException { throw new IOException("Error in line " + linenumber + ". Cannot read the line correctly"); } - controller.getInputs().add(new TickInputContainer(readTicks(sections[0], linenumber), readKeyboard(sections[1], linenumber), readMouse(sections[2], linenumber), readSubtick(sections[3], linenumber))); +// controller.getInputs().add(new TickInputContainer(readTicks(sections[0], linenumber), readKeyboard(sections[1], linenumber), readMouse(sections[2], linenumber), readSubtick(sections[3], linenumber))); if(!oldmonfileLoaded) { String[] commentData = commentPart.split("Monitoring:"); diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java index af980182..6660a4b2 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java @@ -18,7 +18,12 @@ public abstract class PlaybackFlavorBase { /** * The current tick that is being serialised or deserialised */ - protected int currentTick; + protected long currentTick=0; + + /** + * Debug subtick field for error handling + */ + protected Integer currentSubtick=null; public abstract String flavorName(); @@ -31,7 +36,7 @@ public List serialiseHeader(List metadataList) { } protected void serialiseFlavorName(List out) { - out.add("# Flavor:" + flavorName()); + out.add("# Flavor: " + flavorName()); } protected void serialiseMetadata(List out, List metadataList) { @@ -64,8 +69,9 @@ protected void serialiseContainer(BigArrayList out, TickInputContainer c protected List serialiseKeyboard(VirtualKeyboard keyboard) { List out = new ArrayList<>(); - for (VirtualKeyboard subtick : keyboard.getAll()) { - out.add(subtick.toString()); + List list = keyboard.getAll(); + for (VirtualKeyboard subtick : list) { + out.add(subtick.toString2()); } return out; } @@ -73,7 +79,7 @@ protected List serialiseKeyboard(VirtualKeyboard keyboard) { protected List serialiseMouse(VirtualMouse mouse) { List out = new ArrayList<>(); for (VirtualMouse subtick : mouse.getAll()) { - out.add(subtick.toString()); + out.add(subtick.toString2()); } return out; } @@ -81,7 +87,7 @@ protected List serialiseMouse(VirtualMouse mouse) { protected List serialiseCameraAngle(VirtualCameraAngle cameraAngle) { List out = new ArrayList<>(); for (VirtualCameraAngle subtick : cameraAngle.getAll()) { - out.add(subtick.toString()); + out.add(subtick.toString2()); } return out; } @@ -91,13 +97,22 @@ protected void mergeInputs(BigArrayList out, List serialisedKeyb Queue mouseQueue = new LinkedBlockingQueue<>(serialisedMouse); Queue cameraAngleQueue = new LinkedBlockingQueue<>(serialisedCameraAngle); + String kb = getOrEmpty(keyboardQueue.poll()); + String ms = getOrEmpty(mouseQueue.poll()); + String ca = getOrEmpty(cameraAngleQueue.poll()); + + out.add(String.format("%s|%s|%s|%s", currentTick, kb, ms, ca)); + + currentSubtick = 0; while (!keyboardQueue.isEmpty() || !mouseQueue.isEmpty() || !cameraAngleQueue.isEmpty()) { - String kb = getOrEmpty(keyboardQueue.poll()); - String ms = getOrEmpty(mouseQueue.poll()); - String ca = getOrEmpty(cameraAngleQueue.poll()); + currentSubtick++; + kb = getOrEmpty(keyboardQueue.poll()); + ms = getOrEmpty(mouseQueue.poll()); + ca = getOrEmpty(cameraAngleQueue.poll()); - out.add(kb + ms + ca); + out.add(String.format("\t%s|%s|%s|%s", currentSubtick, kb, ms, ca)); } + currentSubtick = null; } protected String getOrEmpty(String string) { @@ -116,9 +131,16 @@ public List deserialiseMetadata(List metadataString) { /** * @return {@link #currentTick} */ - public int getCurrentTick() { + public long getCurrentTick() { return currentTick; } + + /** + * @return {@link #currentSubtick} + */ + public Integer getCurrentSubtick() { + return currentSubtick; + } public static String createCenteredHeading(String text, char spacingChar, int headingWidth) { diff --git a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualCameraAngle.java b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualCameraAngle.java index 607e46ef..b879457b 100644 --- a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualCameraAngle.java +++ b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualCameraAngle.java @@ -189,7 +189,7 @@ public String toString() { } } - private String toString2() { + public String toString2() { return String.format("%s;%s", pitch, yaw); } diff --git a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualKeyboard.java b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualKeyboard.java index 123bc8d4..c8d1eec8 100644 --- a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualKeyboard.java +++ b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualKeyboard.java @@ -274,7 +274,7 @@ public String toString() { } } - private String toString2(){ + public String toString2(){ return String.format("%s;%s", super.toString(), charListToString(charList)); } diff --git a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualMouse.java b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualMouse.java index 6b83e7a5..b35ce5ce 100644 --- a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualMouse.java +++ b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualMouse.java @@ -234,7 +234,7 @@ public String toString() { } } - private String toString2(){ + public String toString2(){ return String.format("%s;%s,%s,%s", super.toString(), scrollWheel, cursorX, cursorY); } diff --git a/src/test/java/tasmod/playback/metadata/PlaybackMetadataRegistryTest.java b/src/test/java/tasmod/playback/metadata/PlaybackMetadataRegistryTest.java index 5ed0ad09..812ec563 100644 --- a/src/test/java/tasmod/playback/metadata/PlaybackMetadataRegistryTest.java +++ b/src/test/java/tasmod/playback/metadata/PlaybackMetadataRegistryTest.java @@ -9,6 +9,7 @@ import java.util.List; import org.apache.commons.io.FileUtils; +import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.Test; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata; @@ -102,4 +103,9 @@ void testRegistry() { file.delete(); } } + + @AfterAll + static void afterAll() { + TASmodRegistry.PLAYBACK_METADATA.clear(); + } } diff --git a/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java b/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java new file mode 100644 index 00000000..3f65ee9c --- /dev/null +++ b/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java @@ -0,0 +1,227 @@ +package tasmod.playback.tasfile; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertIterableEquals; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +import org.junit.jupiter.api.Test; + +import com.dselent.bigarraylist.BigArrayList; +import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickInputContainer; +import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata; +import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadataRegistry.PlaybackMetadataExtension; +import com.minecrafttas.tasmod.playback.tasfile.flavor.PlaybackFlavorBase; +import com.minecrafttas.tasmod.util.TASmodRegistry; +import com.minecrafttas.tasmod.virtual.VirtualCameraAngle; +import com.minecrafttas.tasmod.virtual.VirtualKey; +import com.minecrafttas.tasmod.virtual.VirtualKeyboard; +import com.minecrafttas.tasmod.virtual.VirtualMouse; + +public class PlaybackFlavorBaseTest extends PlaybackFlavorBase { + + class MetadataTest implements PlaybackMetadataExtension{ + + public String testValue; + + @Override + public String getExtensionName() { + return "Test1"; + } + + @Override + public void onCreate() { + + } + + @Override + public PlaybackMetadata onStore() { + PlaybackMetadata metadata = new PlaybackMetadata(this); + metadata.setValue("TestKey", testValue); + return metadata; + } + + @Override + public void onLoad(PlaybackMetadata metadata) { + testValue = metadata.getValue("TestKey"); + } + + @Override + public void onClear() { + this.testValue=null; + } + + } + + class MetadataTest2 implements PlaybackMetadataExtension{ + + public String testValue; + + @Override + public String getExtensionName() { + return "Test2"; + } + + @Override + public void onCreate() { + + } + + @Override + public PlaybackMetadata onStore() { + PlaybackMetadata metadata = new PlaybackMetadata(this); + metadata.setValue("TestKey", testValue); + return metadata; + } + + @Override + public void onLoad(PlaybackMetadata metadata) { + testValue = metadata.getValue("TestKey"); + } + + @Override + public void onClear() { + this.testValue=null; + } + + } + + @Override + public String flavorName() { + return "Test"; + } + + @Test + void testSerialiseFlavorname() { + List actual = new ArrayList<>(); + serialiseFlavorName(actual); + + List expected = new ArrayList<>(); + expected.add("# Flavor: Test"); + + assertIterableEquals(expected, actual); + } + + /** + * Test serialising metadata part of the header + */ + @Test + void testSerialiseMetadata() { + MetadataTest testmetadata1 = new MetadataTest(); + testmetadata1.testValue = "This is a test"; + + MetadataTest2 testmetadata2 = new MetadataTest2(); + testmetadata2.testValue = "This is a second test"; + + TASmodRegistry.PLAYBACK_METADATA.register(testmetadata1); + TASmodRegistry.PLAYBACK_METADATA.register(testmetadata2); + + List actual = new ArrayList<>(); + serialiseMetadata(actual, TASmodRegistry.PLAYBACK_METADATA.handleOnStore()); + + List expected = new ArrayList<>(); + expected.add("### Test1"); + expected.add("# TestKey:This is a test\n"); + + expected.add("### Test2"); + expected.add("# TestKey:This is a second test\n"); + + assertIterableEquals(expected, actual); + assertEquals(0, currentTick); + } + + /** + * Test serialising a {@link TickInputContainer}.
+ * This container contains a keyboard, mouse and camera angle,
+ * with different amounts of subticks each. + */ + @Test + void testSerialiseContainer() { + // Prepare keyboard + VirtualKeyboard keyboard = new VirtualKeyboard(); + keyboard.update(VirtualKey.W, true, 'w'); + keyboard.update(VirtualKey.LCONTROL, true, Character.MIN_VALUE); + + // Prepare mouse + VirtualMouse mouse = new VirtualMouse(); + mouse.update(VirtualKey.LC, true, 0, 0, 0); + + // Prepare camera angle + VirtualCameraAngle angle = new VirtualCameraAngle(0f, 0f, true); + angle.update(1, 1); + angle.update(1, 1); + angle.update(1, 1); + angle.update(1, 1); + + // Create container and fill actual + TickInputContainer container = new TickInputContainer(keyboard, mouse, angle); + BigArrayList actual = new BigArrayList<>(); + serialiseContainer(actual, container); + + // Fill expected + BigArrayList expected = new BigArrayList<>(); + expected.add("0|W;w|LC;0,0,0|1.0;1.0"); + expected.add("\t1|W,LCONTROL;||2.0;2.0"); + expected.add("\t2|||3.0;3.0"); + expected.add("\t3|||4.0;4.0"); + + // C o m p a r e + assertBigArrayList(expected, actual); + } + + private void assertBigArrayList(BigArrayList expected, BigArrayList actual) { + assertIterableEquals(convertBigArrayListToArrayList(expected), convertBigArrayListToArrayList(actual)); + } + + private ArrayList convertBigArrayListToArrayList(BigArrayList list) { + ArrayList out = new ArrayList<>(); + for (long i = 0; i < list.size(); i++) { + out.add(list.get(i)); + } + return out; + } + + @Test + void testStringPaddingEven() { + String actual = PlaybackFlavorBase.createCenteredHeading(null, '#', 52); + String expected = "####################################################"; + assertEquals(expected, actual); + } + + @Test + void testStringPaddingOdd() { + String actual = PlaybackFlavorBase.createCenteredHeading(null, '#', 51); + String expected = "###################################################"; + assertEquals(expected, actual); + } + + @Test + void testCenterHeadingEven() { + String actual = PlaybackFlavorBase.createCenteredHeading("TASfile", '#', 52); + String expected = "###################### TASfile #####################"; + assertEquals(expected, actual); + } + + @Test + void testCenterHeadingOdd() { + String actual = PlaybackFlavorBase.createCenteredHeading("TASfile", '#', 51); + String expected = "##################### TASfile #####################"; + assertEquals(expected, actual); + } + + @Test + void testCenterHeadingEvenText() { + String actual = PlaybackFlavorBase.createCenteredHeading("TASfiles", '#', 51); + String expected = "##################### TASfiles ####################"; + assertEquals(expected, actual); + } + + @Test + void testCenterHeadingEvenText2() { + String actual = PlaybackFlavorBase.createCenteredHeading("Keystrokes", '#', 51); + String expected = "#################### Keystrokes ###################"; + assertEquals(expected, actual); + } +} diff --git a/src/test/java/tasmod/playback/tasfile/PlaybackSerializerFlavorBaseTest.java b/src/test/java/tasmod/playback/tasfile/PlaybackSerializerFlavorBaseTest.java deleted file mode 100644 index 223d5558..00000000 --- a/src/test/java/tasmod/playback/tasfile/PlaybackSerializerFlavorBaseTest.java +++ /dev/null @@ -1,52 +0,0 @@ -package tasmod.playback.tasfile; - -import org.junit.jupiter.api.Test; - -import com.minecrafttas.tasmod.playback.tasfile.flavor.PlaybackFlavorBase; - -import static org.junit.jupiter.api.Assertions.*; - -public class PlaybackSerializerFlavorBaseTest { - - @Test - void testStringPaddingEven() { - String actual = PlaybackFlavorBase.createCenteredHeading(null, '#', 52); - String expected = "####################################################"; - assertEquals(expected, actual); - } - - @Test - void testStringPaddingOdd() { - String actual = PlaybackFlavorBase.createCenteredHeading(null, '#', 51); - String expected = "###################################################"; - assertEquals(expected, actual); - } - - @Test - void testCenterHeadingEven() { - String actual = PlaybackFlavorBase.createCenteredHeading("TASfile", '#', 52); - String expected = "###################### TASfile #####################"; - assertEquals(expected, actual); - } - - @Test - void testCenterHeadingOdd() { - String actual = PlaybackFlavorBase.createCenteredHeading("TASfile", '#', 51); - String expected = "##################### TASfile #####################"; - assertEquals(expected, actual); - } - - @Test - void testCenterHeadingEvenText() { - String actual = PlaybackFlavorBase.createCenteredHeading("TASfiles", '#', 51); - String expected = "##################### TASfiles ####################"; - assertEquals(expected, actual); - } - - @Test - void testCenterHeadingEvenText2() { - String actual = PlaybackFlavorBase.createCenteredHeading("Keystrokes", '#', 51); - String expected = "#################### Keystrokes ###################"; - assertEquals(expected, actual); - } -} From 30fcb3dcdfbdda6e268be405062584e8e345181b Mon Sep 17 00:00:00 2001 From: Scribble Date: Sat, 11 May 2024 16:31:16 +0200 Subject: [PATCH 11/79] [PlaybackSerialiser] Adding start of deserialisation --- .../tasfile/flavor/PlaybackFlavorBase.java | 95 ++++++++++++++++++- 1 file changed, 91 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java index 6660a4b2..12afe915 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java @@ -5,6 +5,8 @@ import java.util.List; import java.util.Queue; import java.util.concurrent.LinkedBlockingQueue; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import com.dselent.bigarraylist.BigArrayList; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickInputContainer; @@ -27,6 +29,31 @@ public abstract class PlaybackFlavorBase { public abstract String flavorName(); + /*============================================== + _____ _ _ _ + / ____| (_) | (_) + | (___ ___ _ __ _ __ _| |_ ___ ___ + \___ \ / _ \ '__| |/ _` | | / __|/ _ \ + ____) | __/ | | | (_| | | \__ \ __/ + |_____/ \___|_| |_|\__,_|_|_|___/\___| + + ============================================== + + * The following section is dedicated to serialising. + * + * The serialisation process is split into 2 parts: + * The header and the container. + * + * ## Header + * The header is where the flavorname, the enabled extensions and the metadata is stored. + * + * You change how each is displayed by overwriting the corresponding method. + * + * ## Container + * + * + */ + public List serialiseHeader(List metadataList) { List out = new ArrayList<>(); serialiseFlavorName(out); @@ -119,15 +146,75 @@ protected String getOrEmpty(String string) { return string == null ? "" : string; } - public BigArrayList deserialise(BigArrayList lines) { - BigArrayList out = new BigArrayList<>(); + + /*======================================================== + _____ _ _ _ + | __ \ (_) | (_) + | | | | ___ ___ ___ _ __ _ __ _| |_ ___ ___ + | | | |/ _ \/ __|/ _ \ '__| |/ _` | | / __|/ _ \ + | |__| | __/\__ \ __/ | | | (_| | | \__ \ __/ + |_____/ \___||___/\___|_| |_|\__,_|_|_|___/\___| + + ======================================================== + * + */ + + public List deserialiseHeader(List lines) { + List out = new ArrayList<>(); + + for(String currentLine : lines) { + + } return out; } - public List deserialiseMetadata(List metadataString) { - return null; + public boolean deserialiseFlavorName(List header) { + for (String line : header) { + Matcher matcher = extract("^# Flavor: " + flavorName(), line); + + if(matcher.find()) { + return true; + } + } + return false; + } + + protected void deserialiseMetadata(List out, String line) { + } + +// public BigArrayList deserialise(BigArrayList lines) { +// } +// +// protected void deserialiseContainer(BigArrayList out, TickInputContainer container) { +// } +// +// protected List deserialiseKeyboard(VirtualKeyboard keyboard) { +// } +// +// protected List deserialiseMouse(VirtualMouse mouse) { +// } +// +// protected List deserialiseCameraAngle(VirtualCameraAngle cameraAngle) { +// } + + protected void splitInputs(BigArrayList out, List serialisedKeyboard, List serialisedMouse, List serialisedCameraAngle) { } + protected Matcher extract(String regex, String haystack) { + Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE); + Matcher matcher = pattern.matcher(haystack); + + return matcher; + } + + protected String extract(String regex, String haystack, int group) { + Matcher matcher = extract(regex, haystack); + if(matcher.find()) { + return extract(regex, haystack).group(group); + } + return null; + } + /** * @return {@link #currentTick} */ From e82cdbd7f48968417aa652fb94f87f5e7e20c9ba Mon Sep 17 00:00:00 2001 From: Scribble Date: Sat, 11 May 2024 23:06:31 +0200 Subject: [PATCH 12/79] [PlaybackSerialiser] Added metadata deserialisation --- .../playback/metadata/PlaybackMetadata.java | 27 ++-- .../tasfile/flavor/PlaybackFlavorBase.java | 139 +++++++++++++++--- .../metadata/PlaybackMetadataTest.java | 2 +- 3 files changed, 137 insertions(+), 31 deletions(-) diff --git a/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadata.java b/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadata.java index c2a00c47..81498a89 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadata.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadata.java @@ -15,7 +15,7 @@ */ public class PlaybackMetadata { private String extensionName; - private LinkedHashMap metadata; + private LinkedHashMap data; private static String SEPERATOR = ":"; @@ -25,24 +25,29 @@ public PlaybackMetadata(PlaybackMetadataExtension extension) { private PlaybackMetadata(String extensionName) { this.extensionName = extensionName; - this.metadata = new LinkedHashMap(); + this.data = new LinkedHashMap(); + } + + private PlaybackMetadata(String extensionName, LinkedHashMap data) { + this.extensionName = extensionName; + this.data = data; } public void setValue(String key, String value) { if (key.contains(SEPERATOR)) { throw new IllegalArgumentException(String.format("%sKeyname %s can't contain %s", extensionName != null ? extensionName + ": " : "", key, SEPERATOR)); } - metadata.put(key, value); + data.put(key, value); } public String getValue(String key) { - return metadata.get(key); + return data.get(key); } @Override public String toString() { String out = ""; - for (String key : metadata.keySet()) { + for (String key : data.keySet()) { String value = getValue(key); out += (String.format("%s%s%s\n", key, SEPERATOR, value)); } @@ -51,7 +56,7 @@ public String toString() { public List toStringList() { List out = new ArrayList<>(); - for (Object keyObj : metadata.keySet()) { + for (Object keyObj : data.keySet()) { String key = (String) keyObj; String value = getValue(key); out.add(String.format("%s%s%s\n", key, SEPERATOR, value)); @@ -63,15 +68,15 @@ public String getExtensionName() { return extensionName; } - public HashMap getMetadata() { - return metadata; + public HashMap getData() { + return data; } @Override public boolean equals(Object obj) { if (obj instanceof PlaybackMetadata) { PlaybackMetadata other = (PlaybackMetadata) obj; - return other.metadata.equals(metadata) && other.extensionName.equals(extensionName); + return other.data.equals(data) && other.extensionName.equals(extensionName); } return super.equals(obj); } @@ -92,4 +97,8 @@ public static PlaybackMetadata fromStringList(String extensionName, List return out; } + + public static PlaybackMetadata fromHashMap(String extensionName, LinkedHashMap data) { + return new PlaybackMetadata(extensionName, data); + } } diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java index 12afe915..0c687a5f 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java @@ -2,15 +2,19 @@ import java.io.Serializable; import java.util.ArrayList; +import java.util.LinkedHashMap; import java.util.List; import java.util.Queue; import java.util.concurrent.LinkedBlockingQueue; import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.apache.commons.lang3.tuple.Pair; + import com.dselent.bigarraylist.BigArrayList; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickInputContainer; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata; +import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackLoadException; import com.minecrafttas.tasmod.virtual.VirtualCameraAngle; import com.minecrafttas.tasmod.virtual.VirtualKeyboard; import com.minecrafttas.tasmod.virtual.VirtualMouse; @@ -20,15 +24,23 @@ public abstract class PlaybackFlavorBase { /** * The current tick that is being serialised or deserialised */ - protected long currentTick=0; - + protected long currentTick = 0; + /** * Debug subtick field for error handling */ - protected Integer currentSubtick=null; + protected Integer currentSubtick = null; public abstract String flavorName(); + public String headerStart() { + return createCenteredHeading("TASFile", '#', 50); + } + + public String headerEnd() { + return createPaddedString('#', 50); + } + /*============================================== _____ _ _ _ / ____| (_) | (_) @@ -68,13 +80,23 @@ protected void serialiseFlavorName(List out) { protected void serialiseMetadata(List out, List metadataList) { for (PlaybackMetadata metadata : metadataList) { - out.add("### " + metadata.getExtensionName()); + serialiseMetadataName(out, metadata.getExtensionName()); for (String value : metadata.toStringList()) { out.add("# " + value); } } } + protected void serialiseMetadataName(List out, String name) { + out.add("### " + name); + } + + protected void serialiseMetadataValue(List out, LinkedHashMap data) { + data.forEach((key, value) -> { + out.add(String.format("%s:%s", key, value)); + }); + } + public BigArrayList serialise(BigArrayList inputs) { BigArrayList out = new BigArrayList<>(); @@ -127,9 +149,9 @@ protected void mergeInputs(BigArrayList out, List serialisedKeyb String kb = getOrEmpty(keyboardQueue.poll()); String ms = getOrEmpty(mouseQueue.poll()); String ca = getOrEmpty(cameraAngleQueue.poll()); - + out.add(String.format("%s|%s|%s|%s", currentTick, kb, ms, ca)); - + currentSubtick = 0; while (!keyboardQueue.isEmpty() || !mouseQueue.isEmpty() || !cameraAngleQueue.isEmpty()) { currentSubtick++; @@ -159,25 +181,96 @@ protected String getOrEmpty(String string) { * */ - public List deserialiseHeader(List lines) { - List out = new ArrayList<>(); - - for(String currentLine : lines) { - - } - return out; - } public boolean deserialiseFlavorName(List header) { for (String line : header) { - Matcher matcher = extract("^# Flavor: " + flavorName(), line); - - if(matcher.find()) { + Matcher matcher = extract("^Flavor: " + flavorName(), line); + + if (matcher.find()) { return true; } } return false; } + + public List extractHeader(List lines) { + List extracted = new ArrayList<>(); + for (String line : lines) { + if (line.equals(headerEnd())) + return extracted; + + extracted.add(line); + } + throw new PlaybackLoadException("Cannot find the end of the header"); + } + + /** + * Deserialises {@link PlaybackMetadata} in the header of the file.
+ *
+ * First extracts the metadata specific lines, then reads the section names and key value pairs. + * + * @param headerLines All lines in the header. Can be easily extracted with {@link #extractHeader(List)} + * @return A list of {@link PlaybackMetadata} + */ + public List deserialiseMetadata(List headerLines) { + List metadataLines = extractHeader(headerLines); + List out = new ArrayList<>(); + + String metadataName = null; + Pair pair = null; + LinkedHashMap values = new LinkedHashMap<>(); + for (String metadataLine : metadataLines) { + + String newMetadataName = deserialiseMetadataName(metadataLine); + + if (newMetadataName != null) { // Means a new metadata section is beginning... In this case, the metadataLine + // is "### Name" and the newMetadataName is "Name" + + if (metadataName != null && !metadataName.equals(newMetadataName)) { // If metadataName is null, then the first section begins + // If metadataName is different than the newMetadataName, + // then a new section begins and we first need to store the old. + out.add(PlaybackMetadata.fromHashMap(metadataName, values)); + values = new LinkedHashMap<>(); + } + metadataName = newMetadataName; + continue; + + } else if ((pair = deseraialiseMetadataValue(metadataLine)) != null) { + values.put(pair.getLeft(), pair.getRight()); + } + } + return out; + } + + protected List extractMetadata(List lines) { + List extracted = new ArrayList<>(); + + boolean start = false; + + for (String line : lines) { + if (deserialiseMetadataName(line) != null) + start = true; + + if (line.equals(headerEnd())) + break; + + if (start) + extracted.add(line); + } + + return extracted; + } + + protected String deserialiseMetadataName(String line) { + return extract("^### (.+)", line, 1); + } + + protected Pair deseraialiseMetadataValue(String metadataLine) { + Matcher matcher = extract("^(.+):(.+)", metadataLine); + if(matcher.find()) + return Pair.of(matcher.group(1), matcher.group(2)); + return null; + } protected void deserialiseMetadata(List out, String line) { } @@ -206,22 +299,26 @@ protected Matcher extract(String regex, String haystack) { return matcher; } - + protected String extract(String regex, String haystack, int group) { Matcher matcher = extract(regex, haystack); - if(matcher.find()) { + if (matcher.find()) { return extract(regex, haystack).group(group); } return null; } - + + protected boolean contains(String regex, String haystack) { + return extract(regex, haystack).find(); + } + /** * @return {@link #currentTick} */ public long getCurrentTick() { return currentTick; } - + /** * @return {@link #currentSubtick} */ diff --git a/src/test/java/tasmod/playback/metadata/PlaybackMetadataTest.java b/src/test/java/tasmod/playback/metadata/PlaybackMetadataTest.java index fbb21a7c..3a8e104a 100644 --- a/src/test/java/tasmod/playback/metadata/PlaybackMetadataTest.java +++ b/src/test/java/tasmod/playback/metadata/PlaybackMetadataTest.java @@ -46,7 +46,7 @@ public void onClear() { void testConstructor() { MetadataTest test = new MetadataTest(); PlaybackMetadata metadata = new PlaybackMetadata(test); - assertNotNull(metadata.getMetadata()); + assertNotNull(metadata.getData()); assertEquals("Test", metadata.getExtensionName()); } From 0601e695de63d9e5412d764aa98cb4c0c1a9a9b0 Mon Sep 17 00:00:00 2001 From: Scribble Date: Sun, 12 May 2024 10:47:49 +0200 Subject: [PATCH 13/79] [PlaybackSerialiser] Added tests for deserialising metadata --- .../playback/metadata/PlaybackMetadata.java | 3 +- .../tasfile/flavor/PlaybackFlavorBase.java | 13 +-- .../tasfile/PlaybackFlavorBaseTest.java | 93 ++++++++++++++++++- 3 files changed, 96 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadata.java b/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadata.java index 81498a89..15b06b87 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadata.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadata.java @@ -1,7 +1,6 @@ package com.minecrafttas.tasmod.playback.metadata; import java.util.ArrayList; -import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.regex.Matcher; @@ -68,7 +67,7 @@ public String getExtensionName() { return extensionName; } - public HashMap getData() { + public LinkedHashMap getData() { return data; } diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java index 0c687a5f..615a7f83 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java @@ -81,9 +81,7 @@ protected void serialiseFlavorName(List out) { protected void serialiseMetadata(List out, List metadataList) { for (PlaybackMetadata metadata : metadataList) { serialiseMetadataName(out, metadata.getExtensionName()); - for (String value : metadata.toStringList()) { - out.add("# " + value); - } + serialiseMetadataValue(out, metadata.getData()); } } @@ -196,10 +194,10 @@ public boolean deserialiseFlavorName(List header) { public List extractHeader(List lines) { List extracted = new ArrayList<>(); for (String line : lines) { + extracted.add(line); + if (line.equals(headerEnd())) return extracted; - - extracted.add(line); } throw new PlaybackLoadException("Cannot find the end of the header"); } @@ -272,9 +270,6 @@ protected Pair deseraialiseMetadataValue(String metadataLine) { return null; } - protected void deserialiseMetadata(List out, String line) { - } - // public BigArrayList deserialise(BigArrayList lines) { // } // @@ -303,7 +298,7 @@ protected Matcher extract(String regex, String haystack) { protected String extract(String regex, String haystack, int group) { Matcher matcher = extract(regex, haystack); if (matcher.find()) { - return extract(regex, haystack).group(group); + return matcher.group(group); } return null; } diff --git a/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java b/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java index 3f65ee9c..762db5dc 100644 --- a/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java +++ b/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java @@ -2,6 +2,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertIterableEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; import java.io.Serializable; import java.util.ArrayList; @@ -13,6 +14,7 @@ import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickInputContainer; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadataRegistry.PlaybackMetadataExtension; +import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackLoadException; import com.minecrafttas.tasmod.playback.tasfile.flavor.PlaybackFlavorBase; import com.minecrafttas.tasmod.util.TASmodRegistry; import com.minecrafttas.tasmod.virtual.VirtualCameraAngle; @@ -123,10 +125,10 @@ void testSerialiseMetadata() { List expected = new ArrayList<>(); expected.add("### Test1"); - expected.add("# TestKey:This is a test\n"); + expected.add("TestKey:This is a test"); expected.add("### Test2"); - expected.add("# TestKey:This is a second test\n"); + expected.add("TestKey:This is a second test"); assertIterableEquals(expected, actual); assertEquals(0, currentTick); @@ -171,6 +173,93 @@ void testSerialiseContainer() { assertBigArrayList(expected, actual); } + @Test + void testExtractHeader() { + List lines = new ArrayList<>(); + lines.add("###### TASfile ######"); + lines.add("Flavor: beta"); + lines.add("Extensions: desync_monitor, control_bytes, vanilla_commands"); + lines.add("### General"); + lines.add("Author: Scribble"); + lines.add("Title: 77 Buttons"); + lines.add("##################################################"); + lines.add("This should not be read anymore"); + lines.add("1|W;w||"); + + List actual = extractHeader(lines); + + List expected = new ArrayList<>(); + expected.add("###### TASfile ######"); + expected.add("Flavor: beta"); + expected.add("Extensions: desync_monitor, control_bytes, vanilla_commands"); + expected.add("### General"); + expected.add("Author: Scribble"); + expected.add("Title: 77 Buttons"); + expected.add("##################################################"); + + assertIterableEquals(expected, actual); + } + + @Test + void testExtractHeaderFail() { + List lines = new ArrayList<>(); + lines.add("###### TASfile ######"); + lines.add("Flavor: beta"); + lines.add("Extensions: desync_monitor, control_bytes, vanilla_commands"); + lines.add("### General"); + lines.add("Author: Scribble"); + lines.add("Title: 77 Buttons"); + lines.add("This should not be read anymore"); + lines.add("1|W;w||"); + + PlaybackLoadException exception = assertThrows(PlaybackLoadException.class, ()->{ + extractHeader(lines); + }); + + assertEquals("Cannot find the end of the header", exception.getMessage()); + } + + /** + * Test extracting only the metadata (### General and below) + */ + @Test + void extractMetadata() { + List lines = new ArrayList<>(); + lines.add("###### TASfile ######"); + lines.add("Flavor: beta"); + lines.add("Extensions: desync_monitor, control_bytes, vanilla_commands"); + lines.add("### General"); + lines.add("Author: Scribble"); + lines.add("Title: 77 Buttons"); + lines.add("##################################################"); + + List actual = extractMetadata(lines); + + List expected = new ArrayList<>(); + expected.add("### General"); + expected.add("Author: Scribble"); + expected.add("Title: 77 Buttons"); + + assertIterableEquals(expected, actual); + } + + /** + * Test extracting metadata, but no metadata was encoded + */ + @Test + void extractEmptyMetadata() { + List lines = new ArrayList<>(); + lines.add("###### TASfile ######"); + lines.add("Flavor: beta"); + lines.add("Extensions: desync_monitor, control_bytes, vanilla_commands"); + lines.add("##################################################"); + + List actual = extractMetadata(lines); + + List expected = new ArrayList<>(); + assertIterableEquals(expected, actual); + } + private void assertBigArrayList(BigArrayList expected, BigArrayList actual) { assertIterableEquals(convertBigArrayListToArrayList(expected), convertBigArrayListToArrayList(actual)); } From e0968e24b4584f920ed5dc74e4ec62b073344284 Mon Sep 17 00:00:00 2001 From: Scribble Date: Sun, 12 May 2024 21:39:21 +0200 Subject: [PATCH 14/79] [PlaybackSerialiser] Refined metadata deserialisation - File reading to playback metadata - [PlaybackController] Changed setInputs to clear and add the inputs --- .../playback/PlaybackControllerClient.java | 15 +++- .../playback/tasfile/PlaybackSerialiser2.java | 74 ++++++++++++++++++- .../tasfile/flavor/PlaybackFlavorBase.java | 39 ++++++++-- .../flavor/PlaybackFlavorRegistry.java | 5 ++ .../tasfile/PlaybackFlavorBaseTest.java | 4 +- 5 files changed, 126 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java index 60da90c4..8da6c9eb 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java @@ -11,6 +11,7 @@ import static com.minecrafttas.tasmod.networking.TASmodPackets.PLAYBACK_STATE; import java.io.File; +import java.io.IOException; import java.io.Serializable; import java.nio.ByteBuffer; import java.util.HashMap; @@ -42,6 +43,7 @@ import com.minecrafttas.tasmod.networking.TASmodPackets; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata; import com.minecrafttas.tasmod.playback.tasfile.PlaybackSerialiser; +import com.minecrafttas.tasmod.playback.tasfile.flavor.PlaybackFlavorBase; import com.minecrafttas.tasmod.util.LoggerMarkers; import com.minecrafttas.tasmod.util.Scheduler.Task; import com.minecrafttas.tasmod.util.TASmodRegistry; @@ -479,7 +481,13 @@ public BigArrayList getInputs() { } public void setInputs(BigArrayList inputs) { - this.inputs = inputs; + try { + inputs.clearMemory(); + } catch (IOException e) { + e.printStackTrace(); + } + inputs = new BigArrayList(directory + File.separator + "temp"); + PlaybackFlavorBase.addAll(this.inputs, inputs); } public Map>> getControlBytes() { // TODO Replace with TASFile extension @@ -523,6 +531,11 @@ public TickInputContainer get() { public void clear() { LOGGER.debug(LoggerMarkers.Playback, "Clearing playback controller"); + try { + inputs.clearMemory(); + } catch (IOException e) { + e.printStackTrace(); + } inputs = new BigArrayList(directory + File.separator + "temp"); controlBytes.clear(); comments.clear(); diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java index 08061f1c..aad269a6 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java @@ -1,13 +1,19 @@ package com.minecrafttas.tasmod.playback.tasfile; +import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.io.Serializable; +import java.util.ArrayList; import java.util.List; import com.dselent.bigarraylist.BigArrayList; import com.minecrafttas.tasmod.playback.PlaybackControllerClient; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickInputContainer; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata; +import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackLoadException; import com.minecrafttas.tasmod.playback.tasfile.flavor.PlaybackFlavorBase; import com.minecrafttas.tasmod.util.FileThread; import com.minecrafttas.tasmod.util.TASmodRegistry; @@ -73,11 +79,77 @@ public static void saveToFile(File file, BigArrayList contai * Loads the {@link PlaybackControllerClient} from a file * @param file The file to load from * @return The loaded {@link PlaybackControllerClient} + * @throws IOException */ - public static PlaybackControllerClient loadFromFile(File file) { + public static PlaybackControllerClient loadFromFile(File file) throws IOException { if (file == null) { throw new NullPointerException("Load from file failed. No file specified"); } + + // Read file + BigArrayList lines = new BigArrayList<>(); + BufferedReader reader= null; + + try { + reader = new BufferedReader(new FileReader(file)); + } catch (FileNotFoundException e) { + e.printStackTrace(); + return null; + } + + String line = null; + while((line = reader.readLine()) != null) { + lines.add(line); + } + reader.close(); + + // Determine what the tasfile flavor is + List headertest = null; + try { + headertest = subsetBigArrayList(lines, 0, 100); // Extract first 100 lines + } catch (Exception e) { + e.printStackTrace(); + } + + PlaybackFlavorBase flavor = searchForFlavor(headertest, TASmodRegistry.SERIALISER_FLAVOR.getFlavors()); // Test for the correct flavor on the first 100 lines + + // Deserialise header + List headerLines = flavor.extractHeader(lines); // Extract the header for easier processing + + TASmodRegistry.PLAYBACK_METADATA.handleOnLoad(flavor.deserialiseMetadata(headerLines)); // Read metadata and fire loadEvent + + // Deserialise content + return null; } + + private static List subsetBigArrayList(BigArrayList list, long startIndex, long stopIndex) throws Exception { + List out = new ArrayList<>(); + + if(startIndex < 0) + throw new Exception("Cannot subset big arraylist. StartIndex has to be positive: "+ startIndex); + + if(startIndex > stopIndex) + throw new Exception("Cannot subset big arraylist. StartIndex is bigger than StopIndex:" + startIndex + " " + stopIndex); + + if(startIndex >= list.size()) + throw new Exception("Cannot subset big arraylist. StartIndex is bigger than the big arraylist" + startIndex + " " + list.size()); + + if(stopIndex >= list.size()) + stopIndex = list.size()-1; + + for (long i = startIndex; i < stopIndex; i++) { + out.add(list.get(i)); + } + return out; + } + + public static PlaybackFlavorBase searchForFlavor(List lines, List flavorList) { + for(PlaybackFlavorBase flavor : flavorList) { + if(flavor.deserialiseFlavorName(lines)) { + return flavor; + } + } + throw new PlaybackLoadException("Couldn't find a flavorname in the file while loading it"); + } } diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java index 615a7f83..8378ba05 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java @@ -191,9 +191,10 @@ public boolean deserialiseFlavorName(List header) { return false; } - public List extractHeader(List lines) { + public List extractHeader(BigArrayList lines) { List extracted = new ArrayList<>(); - for (String line : lines) { + for (long i = 0; i < lines.size(); i++) { + String line = lines.get(i); extracted.add(line); if (line.equals(headerEnd())) @@ -211,7 +212,7 @@ public List extractHeader(List lines) { * @return A list of {@link PlaybackMetadata} */ public List deserialiseMetadata(List headerLines) { - List metadataLines = extractHeader(headerLines); + List metadataLines = extractMetadata(headerLines); List out = new ArrayList<>(); String metadataName = null; @@ -270,8 +271,32 @@ protected Pair deseraialiseMetadataValue(String metadataLine) { return null; } -// public BigArrayList deserialise(BigArrayList lines) { -// } + /** + * Deserialises the input part of the TASfile + * @param lines The serialised lines of the TASfile + * @param startPos The position when the header ends and the inputs start + * @return A list of {@link TickInputContainer} + */ + public BigArrayList deserialise(BigArrayList lines, long startPos) { + BigArrayList out = new BigArrayList<>(); + + for (long i = startPos; i < lines.size(); i++) { + String line = lines.get(i); + + } + return out; + } + + /** + * Reads the next lines, until a full tick is reached + * @param extracted The extracted lines, passed in by reference + * @param list The line list + * @param startPos The start position of this tick + * @return The updated index for the next tick + */ + protected long extractTick(List extracted, BigArrayList list, long startPos) { + return 0; + } // // protected void deserialiseContainer(BigArrayList out, TickInputContainer container) { // } @@ -345,14 +370,14 @@ private static String createPaddedString(char spacingChar, int width) { return new String(spacingLine); } - protected static void addAll(BigArrayList list, BigArrayList toAdd) { + public static void addAll(BigArrayList list, BigArrayList toAdd) { for (int i = 0; i < toAdd.size(); i++) { T element = toAdd.get(i); list.add(element); } } - protected static void addAll(BigArrayList list, List toAdd) { + public static void addAll(BigArrayList list, List toAdd) { for (int i = 0; i < toAdd.size(); i++) { T element = toAdd.get(i); list.add(element); diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorRegistry.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorRegistry.java index 88b91d73..a11a3438 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorRegistry.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorRegistry.java @@ -1,6 +1,7 @@ package com.minecrafttas.tasmod.playback.tasfile.flavor; import java.util.LinkedHashMap; +import java.util.List; import java.util.Set; import com.minecrafttas.mctcommon.registry.AbstractRegistry; @@ -54,4 +55,8 @@ public Set getFlavorNames(){ public PlaybackFlavorBase getFlavor(String name) { return REGISTRY.get(name); } + + public List getFlavors() { + return (List) REGISTRY.values(); + } } diff --git a/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java b/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java index 762db5dc..e6c41234 100644 --- a/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java +++ b/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java @@ -175,7 +175,7 @@ void testSerialiseContainer() { @Test void testExtractHeader() { - List lines = new ArrayList<>(); + BigArrayList lines = new BigArrayList<>(); lines.add("###### TASfile ######"); lines.add("Flavor: beta"); lines.add("Extensions: desync_monitor, control_bytes, vanilla_commands"); @@ -202,7 +202,7 @@ void testExtractHeader() { @Test void testExtractHeaderFail() { - List lines = new ArrayList<>(); + BigArrayList lines = new BigArrayList<>(); lines.add("###### TASfile ######"); lines.add("Flavor: beta"); lines.add("Extensions: desync_monitor, control_bytes, vanilla_commands"); From 69de29d3c1ba23009cdfca173aafb269a76dc478 Mon Sep 17 00:00:00 2001 From: Scribble Date: Tue, 14 May 2024 22:52:08 +0200 Subject: [PATCH 15/79] [PlaybackSerialiser] Added extract tick - Added test for deserialising metadata - [PlaybackMetadata] Added more robust deserialisation in StartpositionMetadataExtension --- .../playback/metadata/PlaybackMetadata.java | 2 +- .../StartpositionMetadataExtension.java | 41 +++++++++++--- .../tasfile/flavor/PlaybackFlavorBase.java | 23 ++++++-- .../tasfile/PlaybackFlavorBaseTest.java | 55 ++++++++++++++++++- 4 files changed, 107 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadata.java b/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadata.java index 15b06b87..f654e0f7 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadata.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadata.java @@ -98,6 +98,6 @@ public static PlaybackMetadata fromStringList(String extensionName, List } public static PlaybackMetadata fromHashMap(String extensionName, LinkedHashMap data) { - return new PlaybackMetadata(extensionName, data); + return new PlaybackMetadata(extensionName, new LinkedHashMap<>(data)); } } diff --git a/src/main/java/com/minecrafttas/tasmod/playback/metadata/integrated/StartpositionMetadataExtension.java b/src/main/java/com/minecrafttas/tasmod/playback/metadata/integrated/StartpositionMetadataExtension.java index 319588e0..a120421b 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/metadata/integrated/StartpositionMetadataExtension.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/metadata/integrated/StartpositionMetadataExtension.java @@ -16,6 +16,7 @@ import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TASstate; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadataRegistry.PlaybackMetadataExtension; +import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackLoadException; import com.minecrafttas.tasmod.util.LoggerMarkers; import net.minecraft.client.Minecraft; @@ -75,21 +76,47 @@ public PlaybackMetadata onStore() { metadata.setValue("x", Double.toString(startPosition.x)); metadata.setValue("y", Double.toString(startPosition.y)); metadata.setValue("z", Double.toString(startPosition.z)); - metadata.setValue("pitch", Double.toString(startPosition.pitch)); - metadata.setValue("yaw", Double.toString(startPosition.yaw)); + metadata.setValue("pitch", Float.toString(startPosition.pitch)); + metadata.setValue("yaw", Float.toString(startPosition.yaw)); return metadata; } @Override public void onLoad(PlaybackMetadata metadata) { - double x = Double.parseDouble(metadata.getValue("x")); - double y = Double.parseDouble(metadata.getValue("y")); - double z = Double.parseDouble(metadata.getValue("z")); - float pitch = Float.parseFloat(metadata.getValue("pitch")); - float yaw = Float.parseFloat(metadata.getValue("yaw")); + double x = getDouble("x", metadata); + double y = getDouble("y", metadata); + double z = getDouble("z", metadata); + float pitch = getFloat("pitch", metadata); + float yaw = getFloat("yaw", metadata); this.startPosition = new StartPosition(x, y, z, pitch, yaw); } + + private double getDouble(String key, PlaybackMetadata metadata) { + String out = metadata.getValue(key); + if(out != null) { + try { + return Double.parseDouble(out); + } catch (NumberFormatException e) { + throw new PlaybackLoadException(e); + } + } else { + throw new PlaybackLoadException(String.format("Missing key %s in Start Position metadata", key)); + } + } + + private float getFloat(String key, PlaybackMetadata metadata) { + String out = metadata.getValue(key); + if(out != null) { + try { + return Float.parseFloat(out); + } catch (NumberFormatException e) { + throw new PlaybackLoadException(e); + } + } else { + throw new PlaybackLoadException(String.format("Missing key %s in Start Position metadata", key)); + } + } @Override public void onClear() { diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java index 8378ba05..9b9e9464 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java @@ -238,6 +238,7 @@ public List deserialiseMetadata(List headerLines) { values.put(pair.getLeft(), pair.getRight()); } } + out.add(PlaybackMetadata.fromHashMap(metadataName, values)); return out; } @@ -267,7 +268,7 @@ protected String deserialiseMetadataName(String line) { protected Pair deseraialiseMetadataValue(String metadataLine) { Matcher matcher = extract("^(.+):(.+)", metadataLine); if(matcher.find()) - return Pair.of(matcher.group(1), matcher.group(2)); + return Pair.of(matcher.group(1).trim(), matcher.group(2).trim()); return null; } @@ -290,12 +291,26 @@ public BigArrayList deserialise(BigArrayList lines, /** * Reads the next lines, until a full tick is reached * @param extracted The extracted lines, passed in by reference - * @param list The line list + * @param lines The line list * @param startPos The start position of this tick * @return The updated index for the next tick */ - protected long extractTick(List extracted, BigArrayList list, long startPos) { - return 0; + protected long extractTick(List extracted, BigArrayList lines, long startPos) { + boolean shouldStop = false; + + for (long i = startPos; i < lines.size(); i++) { + String line = lines.get(i); + if (contains("^\\d+\\|", line)) { + if(shouldStop) { + return startPos+extracted.size(); + } + else { + shouldStop = true; + } + } + extracted.add(line); + } + return startPos+extracted.size(); } // // protected void deserialiseContainer(BigArrayList out, TickInputContainer container) { diff --git a/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java b/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java index e6c41234..ed656f42 100644 --- a/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java +++ b/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java @@ -6,8 +6,12 @@ import java.io.Serializable; import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import com.dselent.bigarraylist.BigArrayList; @@ -223,7 +227,7 @@ void testExtractHeaderFail() { * Test extracting only the metadata (### General and below) */ @Test - void extractMetadata() { + void testExtractMetadata() { List lines = new ArrayList<>(); lines.add("###### TASfile ######"); lines.add("Flavor: beta"); @@ -247,7 +251,7 @@ void extractMetadata() { * Test extracting metadata, but no metadata was encoded */ @Test - void extractEmptyMetadata() { + void testExtractEmptyMetadata() { List lines = new ArrayList<>(); lines.add("###### TASfile ######"); lines.add("Flavor: beta"); @@ -260,6 +264,53 @@ void extractEmptyMetadata() { assertIterableEquals(expected, actual); } + /** + * Test deserialising metadata + */ + @Test + @Disabled + void testdeserialiseMetadata() { + List lines = new ArrayList<>(); + lines.add("### General"); + lines.add("Author: Scribble"); + lines.add("Title: 77 Buttons"); + lines.add("Playing Time:00:00.0"); + lines.add("### StartPosition"); + lines.add("x:1.0"); + lines.add("y:2.0"); + lines.add("z:3.0"); + lines.add("pitch:4.0"); + lines.add("yaw:5.0"); + + List actual = deserialiseMetadata(lines); + + List expected = new ArrayList<>(); + LinkedHashMap first = new LinkedHashMap<>(); + first.put("Author", "Scribble"); + first.put("Title", "77 Buttons"); + first.put("Playing Time", "00:00.0"); + expected.add(PlaybackMetadata.fromHashMap("General", first)); + + LinkedHashMap second = new LinkedHashMap<>(); + second.put("x", "1.0"); + second.put("y", "2.0"); + second.put("z", "3.0"); + second.put("pitch", "4.0"); + second.put("yaw", "5.0"); + expected.add(PlaybackMetadata.fromHashMap("StartPosition", second)); + + assertIterableEquals(expected, actual); + } + + @Test + void testExtractTick() { + List lines = new ArrayList<>(); + lines.add("###### TASfile ######"); + lines.add("Flavor: beta"); + lines.add("Extensions: desync_monitor, control_bytes, vanilla_commands"); + lines.add("##################################################"); + } + private void assertBigArrayList(BigArrayList expected, BigArrayList actual) { assertIterableEquals(convertBigArrayListToArrayList(expected), convertBigArrayListToArrayList(actual)); } From b436e0edbc937960931c91c50f56220d02473456 Mon Sep 17 00:00:00 2001 From: Scribble Date: Wed, 15 May 2024 22:26:24 +0200 Subject: [PATCH 16/79] [PlaybackSerialiser] Fixed bugs and tests in deserialisation - Fixed metadata extraction failing when there are added : in the metadata value - Finished test for tick extraction --- .../tasfile/flavor/PlaybackFlavorBase.java | 13 +++--- .../tasfile/PlaybackFlavorBaseTest.java | 42 +++++++++++++++++-- 2 files changed, 47 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java index 9b9e9464..94ac50a2 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java @@ -266,7 +266,7 @@ protected String deserialiseMetadataName(String line) { } protected Pair deseraialiseMetadataValue(String metadataLine) { - Matcher matcher = extract("^(.+):(.+)", metadataLine); + Matcher matcher = extract("^(.+?):(.+)", metadataLine); if(matcher.find()) return Pair.of(matcher.group(1).trim(), matcher.group(2).trim()); return null; @@ -297,20 +297,23 @@ public BigArrayList deserialise(BigArrayList lines, */ protected long extractTick(List extracted, BigArrayList lines, long startPos) { boolean shouldStop = false; - + long counter = 0L; for (long i = startPos; i < lines.size(); i++) { String line = lines.get(i); if (contains("^\\d+\\|", line)) { if(shouldStop) { - return startPos+extracted.size(); + return startPos+counter-1; } else { shouldStop = true; } } - extracted.add(line); + if(shouldStop) { + extracted.add(line); + } + counter++; } - return startPos+extracted.size(); + return startPos+counter-1; } // // protected void deserialiseContainer(BigArrayList out, TickInputContainer container) { diff --git a/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java b/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java index ed656f42..c99ff368 100644 --- a/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java +++ b/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java @@ -268,8 +268,7 @@ void testExtractEmptyMetadata() { * Test deserialising metadata */ @Test - @Disabled - void testdeserialiseMetadata() { + void testDeserialiseMetadata() { List lines = new ArrayList<>(); lines.add("### General"); lines.add("Author: Scribble"); @@ -304,11 +303,48 @@ void testdeserialiseMetadata() { @Test void testExtractTick() { - List lines = new ArrayList<>(); + BigArrayList lines = new BigArrayList<>(); lines.add("###### TASfile ######"); lines.add("Flavor: beta"); lines.add("Extensions: desync_monitor, control_bytes, vanilla_commands"); lines.add("##################################################"); + lines.add("55|Keyboard:W,LCONTROL;w|Mouse:;0,887,626|Camera:17.85;-202.74799"); + lines.add("\t1|Keyboard:|Mouse:RC;0,1580,658|Camera:17.85;-202.74799"); + lines.add("\t2|Keyboard:|Mouse:;0,1580,658|Camera:17.85;-202.74799"); + lines.add("56|Keyboard:W,LCONTROL;w|Mouse:;0,887,626|Camera:17.85;-202.74799"); + lines.add("\t1|Keyboard:|Mouse:RC;0,1580,658|Camera:17.85;-202.74799"); + lines.add("\t2|Keyboard:|Mouse:;0,1580,658|Camera:17.85;-202.74799"); + + List> actual = new ArrayList<>(); + List actualIndex = new ArrayList<>(); + for (long i = 0; i < lines.size(); i++) { + List tick = new ArrayList<>(); + long index = extractTick(tick, lines, i); + i = index; + actual.add(tick); + actualIndex.add(index); + } + + List> expected = new ArrayList<>(); + List tick1 = new ArrayList<>(); + tick1.add("55|Keyboard:W,LCONTROL;w|Mouse:;0,887,626|Camera:17.85;-202.74799"); + tick1.add("\t1|Keyboard:|Mouse:RC;0,1580,658|Camera:17.85;-202.74799"); + tick1.add("\t2|Keyboard:|Mouse:;0,1580,658|Camera:17.85;-202.74799"); + + List tick2 = new ArrayList<>(); + tick2.add("56|Keyboard:W,LCONTROL;w|Mouse:;0,887,626|Camera:17.85;-202.74799"); + tick2.add("\t1|Keyboard:|Mouse:RC;0,1580,658|Camera:17.85;-202.74799"); + tick2.add("\t2|Keyboard:|Mouse:;0,1580,658|Camera:17.85;-202.74799"); + + expected.add(tick1); + expected.add(tick2); + + List expectedIndex = new ArrayList<>(); + expectedIndex.add(6L); + expectedIndex.add(9L); + + assertIterableEquals(expected, actual); + assertIterableEquals(expectedIndex, actualIndex); } private void assertBigArrayList(BigArrayList expected, BigArrayList actual) { From 7879fe1124e113beaf56c3b1e99bd73e77f273b3 Mon Sep 17 00:00:00 2001 From: Scribble Date: Thu, 16 May 2024 22:33:02 +0200 Subject: [PATCH 17/79] [PlaybackSerialiser] Added splitting inputs - Added comment detection - Added String.format to PlaybackLoadException --- .../exception/PlaybackLoadException.java | 4 ++ .../tasfile/flavor/PlaybackFlavorBase.java | 59 +++++++++++++++++-- .../tasfile/PlaybackFlavorBaseTest.java | 31 +++++++++- 3 files changed, 86 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/exception/PlaybackLoadException.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/exception/PlaybackLoadException.java index 7ab3f712..24282c5f 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/exception/PlaybackLoadException.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/exception/PlaybackLoadException.java @@ -6,6 +6,10 @@ public PlaybackLoadException(String msg) { super(msg); } + public PlaybackLoadException(String msg, Object... args) { + super(String.format(msg, args)); + } + public PlaybackLoadException(Throwable cause) { super(cause); } diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java index 94ac50a2..dfc8927c 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java @@ -36,6 +36,17 @@ public abstract class PlaybackFlavorBase { public String headerStart() { return createCenteredHeading("TASFile", '#', 50); } + + /** + * @return The regex used for detecting comment lines + */ + public String singleComment() { + return "^//"; + } + + public String endlineComment() { + return "(//.+)"; + } public String headerEnd() { return createPaddedString('#', 50); @@ -315,9 +326,25 @@ protected long extractTick(List extracted, BigArrayList lines, l } return startPos+counter-1; } -// -// protected void deserialiseContainer(BigArrayList out, TickInputContainer container) { -// } + + protected void deserialiseContainer(BigArrayList out, List tickLines) { + + for(String line : tickLines) { + if(contains(singleComment(), line)) { + // TODO TASfileExtension + continue; + } + List keyboard = new ArrayList<>(); + List mouse = new ArrayList<>(); + List cameraAngle = new ArrayList<>(); + + List commentsAtEnd = new ArrayList<>(); + + splitInputs(tickLines, keyboard, mouse, cameraAngle, commentsAtEnd); + + + } + } // // protected List deserialiseKeyboard(VirtualKeyboard keyboard) { // } @@ -328,7 +355,29 @@ protected long extractTick(List extracted, BigArrayList lines, l // protected List deserialiseCameraAngle(VirtualCameraAngle cameraAngle) { // } - protected void splitInputs(BigArrayList out, List serialisedKeyboard, List serialisedMouse, List serialisedCameraAngle) { + protected void extractComment(List commentsAtEnd, String line, int startPos) { + Matcher commentMatcher = extract(endlineComment(), line); + if(commentMatcher.find(startPos)) { + String comment = commentMatcher.group(1); + commentsAtEnd.add(comment); + } + } + + + protected void splitInputs(List lines, List serialisedKeyboard, List serialisedMouse, List serialisedCameraAngle, List commentsAtEnd) { + + for(String line : lines) { + Matcher tickMatcher = extract("^\\t?\\d+\\|(.+?)\\|(.+?)\\|(\\S+)\\s?", line); + if (tickMatcher.find()) { + serialisedKeyboard.add(tickMatcher.group(1)); + serialisedMouse.add(tickMatcher.group(2)); + serialisedCameraAngle.add(tickMatcher.group(3)); + } else { + throw new PlaybackLoadException("Cannot find inputs in line %s", line); + } + + extractComment(commentsAtEnd, line, tickMatcher.group(0).length()); + } } protected Matcher extract(String regex, String haystack) { @@ -337,7 +386,7 @@ protected Matcher extract(String regex, String haystack) { return matcher; } - + protected String extract(String regex, String haystack, int group) { Matcher matcher = extract(regex, haystack); if (matcher.find()) { diff --git a/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java b/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java index c99ff368..c4b28512 100644 --- a/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java +++ b/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java @@ -3,15 +3,13 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertIterableEquals; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.io.Serializable; import java.util.ArrayList; -import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; -import java.util.Map; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import com.dselent.bigarraylist.BigArrayList; @@ -301,8 +299,12 @@ void testDeserialiseMetadata() { assertIterableEquals(expected, actual); } + /** + * Test extracing ticks from some lines + */ @Test void testExtractTick() { + // Create lines to be extracted from BigArrayList lines = new BigArrayList<>(); lines.add("###### TASfile ######"); lines.add("Flavor: beta"); @@ -315,7 +317,9 @@ void testExtractTick() { lines.add("\t1|Keyboard:|Mouse:RC;0,1580,658|Camera:17.85;-202.74799"); lines.add("\t2|Keyboard:|Mouse:;0,1580,658|Camera:17.85;-202.74799"); + // Fill the actual with lists of the extracted ticks List> actual = new ArrayList<>(); + // Also fill the actualIndex with the indices that are returned List actualIndex = new ArrayList<>(); for (long i = 0; i < lines.size(); i++) { List tick = new ArrayList<>(); @@ -325,6 +329,7 @@ void testExtractTick() { actualIndex.add(index); } + // Fill expected List> expected = new ArrayList<>(); List tick1 = new ArrayList<>(); tick1.add("55|Keyboard:W,LCONTROL;w|Mouse:;0,887,626|Camera:17.85;-202.74799"); @@ -339,10 +344,12 @@ void testExtractTick() { expected.add(tick1); expected.add(tick2); + // Fill expectedIndex List expectedIndex = new ArrayList<>(); expectedIndex.add(6L); expectedIndex.add(9L); + // C o m p a r e assertIterableEquals(expected, actual); assertIterableEquals(expectedIndex, actualIndex); } @@ -359,6 +366,24 @@ private ArrayList convertBigArrayListToArrayList(Big return out; } + @Test + void testExtractStartingFromEnd() { + List actual = new ArrayList<>(); + extractComment(actual, "55|Keyboard:W,LCONTROL;|Mouse:;0,887,626|Camera:17.85;-202.74799 // Test", 65); + + List expected = new ArrayList<>(); + expected.add("// Test"); + assertIterableEquals(expected, actual); + } + + @Test + void testExtractStartingFromEnd2() { + List actual = new ArrayList<>(); + extractComment(actual, "55|Keyboard:W,LCONTROL;//|Mouse:;0,887,626|Camera:17.85;-202.74799", 66); + + assertTrue(actual.isEmpty()); + } + @Test void testStringPaddingEven() { String actual = PlaybackFlavorBase.createCenteredHeading(null, '#', 52); From 6bdccd931647f4106e44cfdd83ca6b7a1a077375 Mon Sep 17 00:00:00 2001 From: Scribble Date: Fri, 17 May 2024 23:14:55 +0200 Subject: [PATCH 18/79] [PlaybackSerialiser] Added keyboard deserialisation - [VirtualInput] Added updatingByState to VirtualKeyboard, allowing for updating the keyboard via serialiser - [VirtualInput] Renamed update to updateByEvent in VirtualKeyboard - [VirtualInput] Added getKeycodes to VirtualKey allowing for array conversion --- .../tasfile/flavor/PlaybackFlavorBase.java | 31 +++++++---- .../tasmod/virtual/VirtualInput.java | 2 +- .../tasmod/virtual/VirtualKey.java | 8 +++ .../tasmod/virtual/VirtualKeyboard.java | 46 +++++++++++----- .../tasfile/PlaybackFlavorBaseTest.java | 4 +- .../virtual/VirtualInputEventFiring.java | 16 +++--- .../java/tasmod/virtual/VirtualInputTest.java | 6 +-- .../tasmod/virtual/VirtualKeyboardTest.java | 52 +++++++++---------- 8 files changed, 101 insertions(+), 64 deletions(-) diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java index dfc8927c..66c258e9 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java @@ -16,6 +16,7 @@ import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata; import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackLoadException; import com.minecrafttas.tasmod.virtual.VirtualCameraAngle; +import com.minecrafttas.tasmod.virtual.VirtualKey; import com.minecrafttas.tasmod.virtual.VirtualKeyboard; import com.minecrafttas.tasmod.virtual.VirtualMouse; @@ -329,25 +330,33 @@ protected long extractTick(List extracted, BigArrayList lines, l protected void deserialiseContainer(BigArrayList out, List tickLines) { + List keyboardStrings = new ArrayList<>(); + List mouseStrings = new ArrayList<>(); + List cameraAngleStrings = new ArrayList<>(); + List commentsAtEnd = new ArrayList<>(); + for(String line : tickLines) { if(contains(singleComment(), line)) { // TODO TASfileExtension continue; } - List keyboard = new ArrayList<>(); - List mouse = new ArrayList<>(); - List cameraAngle = new ArrayList<>(); - - List commentsAtEnd = new ArrayList<>(); - - splitInputs(tickLines, keyboard, mouse, cameraAngle, commentsAtEnd); - + splitInputs(tickLines, keyboardStrings, mouseStrings, cameraAngleStrings, commentsAtEnd); } + + VirtualKeyboard keyboard = deserialiseKeyboard(keyboardStrings); + } + + protected VirtualKeyboard deserialiseKeyboard(List keyboardStrings) { + VirtualKeyboard out = new VirtualKeyboard(); + for(String line : keyboardStrings) { + Matcher matcher = extract("\\d+\\|(.*?);(.*?)\\|", line); + if(matcher.find()) { + out.updateFromState(VirtualKey.getKeycodes(matcher.group(1).split(",")), matcher.group(2).toCharArray()); + } + } + return out; } -// -// protected List deserialiseKeyboard(VirtualKeyboard keyboard) { -// } // // protected List deserialiseMouse(VirtualMouse mouse) { // } diff --git a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualInput.java b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualInput.java index ea385bf6..d9a2e362 100644 --- a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualInput.java +++ b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualInput.java @@ -237,7 +237,7 @@ public void updateNextKeyboard(int keycode, boolean keystate, char character) { */ public void updateNextKeyboard(int keycode, boolean keystate, char character, boolean repeatEventsEnabled) { LOGGER.debug(LoggerMarkers.Keyboard, "Update: {}, {}, {}, {}", keycode, keystate, character); // Activate with -Dtasmod.marker.keyboard=ACCEPT in VM arguments (and -Dtasmod.log.level=debug) - nextKeyboard.update(keycode, keystate, character, repeatEventsEnabled); + nextKeyboard.updateFromEvent(keycode, keystate, character, repeatEventsEnabled); } /** diff --git a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualKey.java b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualKey.java index 98e2d273..58bc3238 100644 --- a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualKey.java +++ b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualKey.java @@ -166,6 +166,14 @@ public static Integer getKeycode(String keyname) { return key.getKeycode(); return null; } + + public static int[] getKeycodes(String[] keynames) { + int[] out = new int[keynames.length]; + for (int i = 0; i < keynames.length; i++) { + out[i] = getKeycode(keynames[i]); + } + return out; + } public static String getName(int keycode) { VirtualKey key = get(keycode); diff --git a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualKeyboard.java b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualKeyboard.java index c8d1eec8..dcbf03fa 100644 --- a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualKeyboard.java +++ b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualKeyboard.java @@ -2,6 +2,7 @@ import java.io.Serializable; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; @@ -38,7 +39,7 @@ *

Updating the keyboard

* This keyboard stores it's values in "states".
* That means that all the keys that are currently pressed are stored in {@link #pressedKeys}.
- * And this list is updated via a keyboard event in {@link #update(int, boolean, char)}.
+ * And this list is updated via a keyboard event in {@link #updateFromEvent(int, boolean, char)}.
*

Difference

* When comparing 2 keyboard states, we can generate a list of differences from them in form of {@link VirtualKeyboardEvent}s.
*
@@ -62,7 +63,7 @@
  * Now you had to hold the key until the next tick to get it recognised by the game.
*
* To fix this, now every subtick is stored as a keyboard state as well.
- * When updating the keyboard in {@link #update(int, boolean, char)}, a clone of itself is created and stored in {@link #subtickList},
+ * When updating the keyboard in {@link #updateFromEvent(int, boolean, char)}, a clone of itself is created and stored in {@link #subtickList},
* with the difference that the subtick state has no {@link #subtickList}.
* In a nutshell, the keyboard stores it's past changes in {@link #subtickList} with the first being the oldest change. * @@ -120,32 +121,51 @@ public VirtualKeyboard(Set pressedKeys, List charList, List< } /** - * Updates the keyboard, adds a new subtick to this keyboard + * Updates the keyboard from an event, adds a new subtick to this keyboard.
+ *
+ * An event updates one key at a time. * @param keycode The keycode of this key * @param keystate The keystate of this key, true for pressed * @param keycharacter The character that is associated with that key. Can change between keyboards or whenever shift is held in combination. */ - public void update(int keycode, boolean keystate, char keycharacter, boolean repeatEventsEnabled) { - if(isParent() && !ignoreFirstUpdate()) { - addSubtick(shallowClone()); - } + public void updateFromEvent(int keycode, boolean keystate, char keycharacter, boolean repeatEventsEnabled) { + createSubtick(); charList.clear(); if (keystate) { addChar(keycharacter, repeatEventsEnabled); } setPressed(keycode, keystate); } + + public void createSubtick() { + if(isParent() && !ignoreFirstUpdate()) { + addSubtick(shallowClone()); + } + } + + public void updateFromEvent(int keycode, boolean keystate, char keycharacter) { + updateFromEvent(keycode, keystate, keycharacter, false); + } - public void update(int keycode, boolean keystate, char keycharacter) { - update(keycode, keystate, keycharacter, false); + public void updateFromEvent(VirtualKey key, boolean keystate, char keycharacter) { + updateFromEvent(key.getKeycode(), keystate, keycharacter); } - public void update(VirtualKey key, boolean keystate, char keycharacter) { - update(key.getKeycode(), keystate, keycharacter); + public void updateFromEvent(VirtualKey key, boolean keystate, char keycharacter, boolean repeatEventsEnabled) { + updateFromEvent(key.getKeycode(), keystate, keycharacter, false); } - public void update(VirtualKey key, boolean keystate, char keycharacter, boolean repeatEventsEnabled) { - update(key.getKeycode(), keystate, keycharacter, false); + public void updateFromState(int[] keycode, char[] chars) { + createSubtick(); + + this.pressedKeys.clear(); + for(int i : keycode) { + this.pressedKeys.add(i); + } + this.charList.clear(); + for(char c : chars) { + this.charList.add(c); + } } @Override diff --git a/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java b/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java index c4b28512..435d3820 100644 --- a/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java +++ b/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java @@ -145,8 +145,8 @@ void testSerialiseMetadata() { void testSerialiseContainer() { // Prepare keyboard VirtualKeyboard keyboard = new VirtualKeyboard(); - keyboard.update(VirtualKey.W, true, 'w'); - keyboard.update(VirtualKey.LCONTROL, true, Character.MIN_VALUE); + keyboard.updateFromEvent(VirtualKey.W, true, 'w'); + keyboard.updateFromEvent(VirtualKey.LCONTROL, true, Character.MIN_VALUE); // Prepare mouse VirtualMouse mouse = new VirtualMouse(); diff --git a/src/test/java/tasmod/virtual/VirtualInputEventFiring.java b/src/test/java/tasmod/virtual/VirtualInputEventFiring.java index 2dcc7ada..e93e291a 100644 --- a/src/test/java/tasmod/virtual/VirtualInputEventFiring.java +++ b/src/test/java/tasmod/virtual/VirtualInputEventFiring.java @@ -28,8 +28,8 @@ static void beforeAll() { }; EventCopy copy = (keyboard)-> { VirtualKeyboard newkeyboard = new VirtualKeyboard(); - newkeyboard.update(VirtualKey.A, true, 'a'); - newkeyboard.update(VirtualKey.D, true, 'd'); + newkeyboard.updateFromEvent(VirtualKey.A, true, 'a'); + newkeyboard.updateFromEvent(VirtualKey.D, true, 'd'); keyboard.deepCopyFrom(newkeyboard); }; EventListenerRegistry.register(clear, copy); @@ -39,8 +39,8 @@ static void beforeAll() { void testClear() { VirtualKeyboard keyboard = new VirtualKeyboard(); - keyboard.update(VirtualKey.W, true, 'w'); - keyboard.update(VirtualKey.S, true, 's'); + keyboard.updateFromEvent(VirtualKey.W, true, 'w'); + keyboard.updateFromEvent(VirtualKey.S, true, 's'); EventListenerRegistry.fireEvent(EventTest.class, keyboard); @@ -52,12 +52,12 @@ void testCopy() { VirtualKeyboard actual = new VirtualKeyboard(); - actual.update(VirtualKey.W, true, 'w'); - actual.update(VirtualKey.S, true, 's'); + actual.updateFromEvent(VirtualKey.W, true, 'w'); + actual.updateFromEvent(VirtualKey.S, true, 's'); VirtualKeyboard expected = new VirtualKeyboard(); - expected.update(VirtualKey.A, true, 'a'); - expected.update(VirtualKey.D, true, 'd'); + expected.updateFromEvent(VirtualKey.A, true, 'a'); + expected.updateFromEvent(VirtualKey.D, true, 'd'); EventListenerRegistry.fireEvent(EventCopy.class, actual); diff --git a/src/test/java/tasmod/virtual/VirtualInputTest.java b/src/test/java/tasmod/virtual/VirtualInputTest.java index 17fbd63f..9a11fc2a 100644 --- a/src/test/java/tasmod/virtual/VirtualInputTest.java +++ b/src/test/java/tasmod/virtual/VirtualInputTest.java @@ -54,7 +54,7 @@ void testIsKeyDown() { VirtualMouse preloadedMouse = new VirtualMouse(); VirtualCameraAngle preloadedCameraAngle = new VirtualCameraAngle(0f, 0f); - preloadedKeyboard.update(VirtualKey.W.getKeycode(), true, 'w'); + preloadedKeyboard.updateFromEvent(VirtualKey.W.getKeycode(), true, 'w'); preloadedMouse.update(VirtualKey.LC.getKeycode(), true, 15, 0, 0); preloadedCameraAngle.update(1f, 2f); @@ -87,7 +87,7 @@ void testPreloadedConstructor() { VirtualMouse preloadedMouse = new VirtualMouse(); VirtualCameraAngle preloadedCameraAngle = new VirtualCameraAngle(0f, 0f); - preloadedKeyboard.update(VirtualKey.W.getKeycode(), true, 'w'); + preloadedKeyboard.updateFromEvent(VirtualKey.W.getKeycode(), true, 'w'); preloadedMouse.update(VirtualKey.LC.getKeycode(), true, 15, 0, 0); preloadedCameraAngle.update(1f, 2f); @@ -162,7 +162,7 @@ void testKeyboardAddPresses() { void testKeyboardRemovePresses() { VirtualKeyboard preloadedKeyboard = new VirtualKeyboard(); - preloadedKeyboard.update(VirtualKey.W.getKeycode(), true, 'w'); + preloadedKeyboard.updateFromEvent(VirtualKey.W.getKeycode(), true, 'w'); VirtualInput virtual = new VirtualInput(LOGGER, preloadedKeyboard, new VirtualMouse(), new VirtualCameraAngle()); virtual.KEYBOARD.updateNextKeyboard(VirtualKey.W.getKeycode(), false, Character.MIN_VALUE); diff --git a/src/test/java/tasmod/virtual/VirtualKeyboardTest.java b/src/test/java/tasmod/virtual/VirtualKeyboardTest.java index 7432b97a..713a2c8e 100644 --- a/src/test/java/tasmod/virtual/VirtualKeyboardTest.java +++ b/src/test/java/tasmod/virtual/VirtualKeyboardTest.java @@ -146,8 +146,8 @@ void testToString(){ void testToStringSubticks(){ VirtualKeyboard actual = new VirtualKeyboard(); - actual.update(VirtualKey.W.getKeycode(), true, 'w'); - actual.update(VirtualKey.S.getKeycode(), true, 's'); + actual.updateFromEvent(VirtualKey.W.getKeycode(), true, 'w'); + actual.updateFromEvent(VirtualKey.S.getKeycode(), true, 's'); assertEquals("W;w\nW,S;s", actual.toString()); } @@ -225,8 +225,8 @@ void testShallowClone() { @Test void testDeepClone() { VirtualKeyboard expected = new VirtualKeyboard(); - expected.update(VirtualKey.W, true, 'w'); - expected.update(VirtualKey.S, true, 's'); + expected.updateFromEvent(VirtualKey.W, true, 'w'); + expected.updateFromEvent(VirtualKey.S, true, 's'); VirtualKeyboard actual = expected.clone(); @@ -242,13 +242,13 @@ void testMoveFrom(){ VirtualKeyboard moveFrom = new VirtualKeyboard(); VirtualKeyboard actual = new VirtualKeyboard(); - moveFrom.update(VirtualKey.W.getKeycode(), true, 'w'); - moveFrom.update(VirtualKey.A.getKeycode(), true, 'a'); + moveFrom.updateFromEvent(VirtualKey.W.getKeycode(), true, 'w'); + moveFrom.updateFromEvent(VirtualKey.A.getKeycode(), true, 'a'); VirtualKeyboard expected = moveFrom.clone(); - actual.update(VirtualKey.S.getKeycode(), true, 's'); - actual.update(VirtualKey.D.getKeycode(), true, 'd'); + actual.updateFromEvent(VirtualKey.S.getKeycode(), true, 's'); + actual.updateFromEvent(VirtualKey.D.getKeycode(), true, 'd'); actual.moveFrom(null); actual.moveFrom(moveFrom); @@ -268,13 +268,13 @@ void testCopyFrom() { VirtualKeyboard copyFrom = new VirtualKeyboard(); VirtualKeyboard actual = new VirtualKeyboard(); - copyFrom.update(VirtualKey.W.getKeycode(), true, 'w'); - copyFrom.update(VirtualKey.A.getKeycode(), true, 'a'); + copyFrom.updateFromEvent(VirtualKey.W.getKeycode(), true, 'w'); + copyFrom.updateFromEvent(VirtualKey.A.getKeycode(), true, 'a'); VirtualKeyboard expected = copyFrom.clone(); - actual.update(VirtualKey.S.getKeycode(), true, 's'); - actual.update(VirtualKey.D.getKeycode(), true, 'd'); + actual.updateFromEvent(VirtualKey.S.getKeycode(), true, 's'); + actual.updateFromEvent(VirtualKey.D.getKeycode(), true, 'd'); actual.copyFrom(null); actual.copyFrom(copyFrom); @@ -292,8 +292,8 @@ void testCopyFrom() { @Test void testUpdate(){ VirtualKeyboard actual = new VirtualKeyboard(); - actual.update(VirtualKey.W.getKeycode(), true, 'w'); - actual.update(VirtualKey.A.getKeycode(), true, 'A'); + actual.updateFromEvent(VirtualKey.W.getKeycode(), true, 'w'); + actual.updateFromEvent(VirtualKey.A.getKeycode(), true, 'A'); List expected = new ArrayList<>(); expected.add(new VirtualKeyboard(new HashSet(Arrays.asList(VirtualKey.W.getKeycode())), Arrays.asList('w'))); @@ -309,7 +309,7 @@ void testUpdate(){ void testUpdateOnSubtick() { VirtualKeyboard actual = new VirtualKeyboard(new LinkedHashSet<>(), new ArrayList<>(), null, false); - actual.update(VirtualKey.W.getKeycode(), true, 'w'); + actual.updateFromEvent(VirtualKey.W.getKeycode(), true, 'w'); } /** @@ -334,7 +334,7 @@ void testGetVirtualEventsPress() { VirtualKeyboard unpressed = new VirtualKeyboard(); VirtualKeyboard pressed = new VirtualKeyboard(); - pressed.update(VirtualKey.W.getKeycode(), true, 'w'); + pressed.updateFromEvent(VirtualKey.W.getKeycode(), true, 'w'); // Load actual with the events Queue actual = new ConcurrentLinkedQueue<>(); @@ -354,7 +354,7 @@ void testGetVirtualEventsUnpress() { VirtualKeyboard unpressed = new VirtualKeyboard(); VirtualKeyboard pressed = new VirtualKeyboard(); - pressed.update(VirtualKey.W.getKeycode(), true, 'w'); + pressed.updateFromEvent(VirtualKey.W.getKeycode(), true, 'w'); // Load actual with the events Queue actual = new ConcurrentLinkedQueue<>(); @@ -372,9 +372,9 @@ void testGetVirtualEventsUnpress() { @Test void testClear(){ VirtualKeyboard pressed = new VirtualKeyboard(); - pressed.update(VirtualKey.W.getKeycode(), true, 'w'); - pressed.update(VirtualKey.S.getKeycode(), true, 's'); - pressed.update(VirtualKey.A.getKeycode(), true, 'a'); + pressed.updateFromEvent(VirtualKey.W.getKeycode(), true, 'w'); + pressed.updateFromEvent(VirtualKey.S.getKeycode(), true, 's'); + pressed.updateFromEvent(VirtualKey.A.getKeycode(), true, 'a'); pressed.clear(); @@ -408,9 +408,9 @@ void testRepeatEvents(){ int keycode = VirtualKey.BACK.getKeycode(); // Update the keyboard multiple times with the same value - testKb.update(keycode, true, Character.MIN_VALUE, true); - testKb.update(keycode, true, Character.MIN_VALUE, true); - testKb.update(keycode, true, Character.MIN_VALUE, true); + testKb.updateFromEvent(keycode, true, Character.MIN_VALUE, true); + testKb.updateFromEvent(keycode, true, Character.MIN_VALUE, true); + testKb.updateFromEvent(keycode, true, Character.MIN_VALUE, true); Queue actual = new ConcurrentLinkedQueue<>(); // Fill "actual" with VirtualKeyboardEvents @@ -434,9 +434,9 @@ void testRepeatEventsFail(){ int keycode = VirtualKey.BACK.getKeycode(); // Update the keyboard multiple times with the same value. - testKb.update(keycode, true, Character.MIN_VALUE, false); - testKb.update(keycode, true, Character.MIN_VALUE, false); - testKb.update(keycode, true, Character.MIN_VALUE, false); + testKb.updateFromEvent(keycode, true, Character.MIN_VALUE, false); + testKb.updateFromEvent(keycode, true, Character.MIN_VALUE, false); + testKb.updateFromEvent(keycode, true, Character.MIN_VALUE, false); Queue actual = new ConcurrentLinkedQueue<>(); // Fill "actual" with VirtualKeyboardEvents From 5fe6ae6be0ed03e8e0d189c2a333056da126e9af Mon Sep 17 00:00:00 2001 From: Scribble Date: Sat, 18 May 2024 22:50:10 +0200 Subject: [PATCH 19/79] [PlaybackSerialiser] Added tests for splitting inputs --- .../tasfile/flavor/PlaybackFlavorBase.java | 20 ++-- .../tasfile/PlaybackFlavorBaseTest.java | 94 ++++++++++++++++--- 2 files changed, 93 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java index 66c258e9..f23c6a1c 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java @@ -350,7 +350,7 @@ protected void deserialiseContainer(BigArrayList out, List keyboardStrings) { VirtualKeyboard out = new VirtualKeyboard(); for(String line : keyboardStrings) { - Matcher matcher = extract("\\d+\\|(.*?);(.*?)\\|", line); + Matcher matcher = extract("(.*?);(.*?)", line); if(matcher.find()) { out.updateFromState(VirtualKey.getKeycodes(matcher.group(1).split(",")), matcher.group(2).toCharArray()); } @@ -368,7 +368,9 @@ protected void extractComment(List commentsAtEnd, String line, int start Matcher commentMatcher = extract(endlineComment(), line); if(commentMatcher.find(startPos)) { String comment = commentMatcher.group(1); - commentsAtEnd.add(comment); + commentsAtEnd.add(comment); + } else { + commentsAtEnd.add(null); } } @@ -376,11 +378,17 @@ protected void extractComment(List commentsAtEnd, String line, int start protected void splitInputs(List lines, List serialisedKeyboard, List serialisedMouse, List serialisedCameraAngle, List commentsAtEnd) { for(String line : lines) { - Matcher tickMatcher = extract("^\\t?\\d+\\|(.+?)\\|(.+?)\\|(\\S+)\\s?", line); + Matcher tickMatcher = extract("^\\t?\\d+\\|(.*?)\\|(.*?)\\|(\\S*)\\s?", line); if (tickMatcher.find()) { - serialisedKeyboard.add(tickMatcher.group(1)); - serialisedMouse.add(tickMatcher.group(2)); - serialisedCameraAngle.add(tickMatcher.group(3)); + if(!tickMatcher.group(1).isEmpty()) { + serialisedKeyboard.add(tickMatcher.group(1)); + } + if(!tickMatcher.group(2).isEmpty()) { + serialisedMouse.add(tickMatcher.group(2)); + } + if(!tickMatcher.group(3).isEmpty()) { + serialisedCameraAngle.add(tickMatcher.group(3)); + } } else { throw new PlaybackLoadException("Cannot find inputs in line %s", line); } diff --git a/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java b/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java index 435d3820..d5051964 100644 --- a/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java +++ b/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java @@ -6,6 +6,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import java.io.Serializable; +import java.rmi.UnexpectedException; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; @@ -354,20 +355,11 @@ void testExtractTick() { assertIterableEquals(expectedIndex, actualIndex); } - private void assertBigArrayList(BigArrayList expected, BigArrayList actual) { - assertIterableEquals(convertBigArrayListToArrayList(expected), convertBigArrayListToArrayList(actual)); - } - - private ArrayList convertBigArrayListToArrayList(BigArrayList list) { - ArrayList out = new ArrayList<>(); - for (long i = 0; i < list.size(); i++) { - out.add(list.get(i)); - } - return out; - } - + /** + * Testing extracting the comment from the end of the line + */ @Test - void testExtractStartingFromEnd() { + void testExtractCommentEndline() { List actual = new ArrayList<>(); extractComment(actual, "55|Keyboard:W,LCONTROL;|Mouse:;0,887,626|Camera:17.85;-202.74799 // Test", 65); @@ -376,12 +368,72 @@ void testExtractStartingFromEnd() { assertIterableEquals(expected, actual); } + /** + * Test extracting the comment from the end of the line, but there is no comment + */ @Test - void testExtractStartingFromEnd2() { + void testExtractCommentEndlineEmpty() { List actual = new ArrayList<>(); extractComment(actual, "55|Keyboard:W,LCONTROL;//|Mouse:;0,887,626|Camera:17.85;-202.74799", 66); - assertTrue(actual.isEmpty()); + List expected = new ArrayList<>(); + expected.add(null); + assertIterableEquals(expected, actual); + } + + /** + * Test splitting the stringd of inputs including subticks into it's elements + */ + @Test + void testSplitInputs() { + List tick = new ArrayList<>(); + tick.add("55|W,LCONTROL;w|;0,887,626|17.85;-202.74799"); + tick.add("\t1||RC;0,1580,658|17.85;-202.74799 //Test"); + tick.add("\t2||;0,1580,658|17.85;-202.74799"); + + List actualKeyboard = new ArrayList<>(); + List actualMouse = new ArrayList<>(); + List actualCameraAngle = new ArrayList<>(); + List actualComment = new ArrayList<>(); + + splitInputs(tick, actualKeyboard, actualMouse, actualCameraAngle, actualComment); + + List expectedKeyboard = new ArrayList<>(); + List expectedMouse = new ArrayList<>(); + List expectedCameraAngle = new ArrayList<>(); + List expectedComment = new ArrayList<>(); + + expectedKeyboard.add("W,LCONTROL;w"); + + expectedMouse.add(";0,887,626"); + expectedMouse.add("RC;0,1580,658"); + expectedMouse.add(";0,1580,658"); + + expectedCameraAngle.add("17.85;-202.74799"); + expectedCameraAngle.add("17.85;-202.74799"); + expectedCameraAngle.add("17.85;-202.74799"); + + expectedComment.add(null); + expectedComment.add("//Test"); + expectedComment.add(null); + + assertIterableEquals(actualKeyboard, expectedKeyboard); + assertIterableEquals(expectedMouse, actualMouse); + assertIterableEquals(expectedCameraAngle, actualCameraAngle); + assertIterableEquals(expectedComment, actualComment); + } + + /** + * Test deserialising keyboard + */ + @Test + void testDeserialiseKeyboard() { + List tick = new ArrayList<>(); + tick.add("W,LCONTROL;w"); + + VirtualKeyboard actual = deserialiseKeyboard(tick); + + VirtualKeyboard expected = new VirtualKeyboard(); } @Test @@ -425,4 +477,16 @@ void testCenterHeadingEvenText2() { String expected = "#################### Keystrokes ###################"; assertEquals(expected, actual); } + + private void assertBigArrayList(BigArrayList expected, BigArrayList actual) { + assertIterableEquals(convertBigArrayListToArrayList(expected), convertBigArrayListToArrayList(actual)); + } + + private ArrayList convertBigArrayListToArrayList(BigArrayList list) { + ArrayList out = new ArrayList<>(); + for (long i = 0; i < list.size(); i++) { + out.add(list.get(i)); + } + return out; + } } From a50676780f83b0b5dd993dfc0b1ba6e92eff85da Mon Sep 17 00:00:00 2001 From: Scribble Date: Mon, 20 May 2024 16:14:39 +0200 Subject: [PATCH 20/79] [PlaybackSerialiser] Added mouse deserialisation - [VirtualInput] Renamed update to updateFromState in VirtualMouse - [VirtualInput] Added update from state - Added deserialiseVirtualKey and isNumeric --- .../tasfile/flavor/PlaybackFlavorBase.java | 153 ++++++++++++------ .../tasmod/virtual/VirtualInput.java | 2 +- .../tasmod/virtual/VirtualKey.java | 13 +- .../tasmod/virtual/VirtualKeyboard.java | 41 +++-- .../tasmod/virtual/VirtualMouse.java | 67 ++++++-- .../tasfile/PlaybackFlavorBaseTest.java | 15 +- .../java/tasmod/virtual/VirtualInputTest.java | 6 +- .../java/tasmod/virtual/VirtualMouseTest.java | 48 +++--- 8 files changed, 232 insertions(+), 113 deletions(-) diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java index f23c6a1c..c66640fb 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java @@ -72,9 +72,6 @@ public String headerEnd() { * The header is where the flavorname, the enabled extensions and the metadata is stored. * * You change how each is displayed by overwriting the corresponding method. - * - * ## Container - * * */ @@ -173,7 +170,7 @@ protected void mergeInputs(BigArrayList out, List serialisedKeyb } currentSubtick = null; } - + protected String getOrEmpty(String string) { return string == null ? "" : string; } @@ -202,7 +199,7 @@ public boolean deserialiseFlavorName(List header) { } return false; } - + public List extractHeader(BigArrayList lines) { List extracted = new ArrayList<>(); for (long i = 0; i < lines.size(); i++) { @@ -218,9 +215,11 @@ public List extractHeader(BigArrayList lines) { /** * Deserialises {@link PlaybackMetadata} in the header of the file.
*
- * First extracts the metadata specific lines, then reads the section names and key value pairs. + * First extracts the metadata specific lines, then reads the section names and + * key value pairs. * - * @param headerLines All lines in the header. Can be easily extracted with {@link #extractHeader(List)} + * @param headerLines All lines in the header. Can be easily extracted with + * {@link #extractHeader(List)} * @return A list of {@link PlaybackMetadata} */ public List deserialiseMetadata(List headerLines) { @@ -234,18 +233,18 @@ public List deserialiseMetadata(List headerLines) { String newMetadataName = deserialiseMetadataName(metadataLine); - if (newMetadataName != null) { // Means a new metadata section is beginning... In this case, the metadataLine + if (newMetadataName != null) { // Means a new metadata section is beginning... In this case, the metadataLine // is "### Name" and the newMetadataName is "Name" - if (metadataName != null && !metadataName.equals(newMetadataName)) { // If metadataName is null, then the first section begins - // If metadataName is different than the newMetadataName, + if (metadataName != null && !metadataName.equals(newMetadataName)) { // If metadataName is null, then the first section begins + // If metadataName is different than the newMetadataName, // then a new section begins and we first need to store the old. out.add(PlaybackMetadata.fromHashMap(metadataName, values)); values = new LinkedHashMap<>(); } metadataName = newMetadataName; continue; - + } else if ((pair = deseraialiseMetadataValue(metadataLine)) != null) { values.put(pair.getLeft(), pair.getRight()); } @@ -279,32 +278,34 @@ protected String deserialiseMetadataName(String line) { protected Pair deseraialiseMetadataValue(String metadataLine) { Matcher matcher = extract("^(.+?):(.+)", metadataLine); - if(matcher.find()) + if (matcher.find()) return Pair.of(matcher.group(1).trim(), matcher.group(2).trim()); return null; } /** * Deserialises the input part of the TASfile - * @param lines The serialised lines of the TASfile + * + * @param lines The serialised lines of the TASfile * @param startPos The position when the header ends and the inputs start * @return A list of {@link TickInputContainer} */ public BigArrayList deserialise(BigArrayList lines, long startPos) { BigArrayList out = new BigArrayList<>(); - + for (long i = startPos; i < lines.size(); i++) { String line = lines.get(i); - + } return out; } - + /** * Reads the next lines, until a full tick is reached + * * @param extracted The extracted lines, passed in by reference - * @param lines The line list - * @param startPos The start position of this tick + * @param lines The line list + * @param startPos The start position of this tick * @return The updated index for the next tick */ protected long extractTick(List extracted, BigArrayList lines, long startPos) { @@ -313,86 +314,138 @@ protected long extractTick(List extracted, BigArrayList lines, l for (long i = startPos; i < lines.size(); i++) { String line = lines.get(i); if (contains("^\\d+\\|", line)) { - if(shouldStop) { - return startPos+counter-1; - } - else { + if (shouldStop) { + return startPos + counter - 1; + } else { shouldStop = true; } } - if(shouldStop) { + if (shouldStop) { extracted.add(line); } counter++; } - return startPos+counter-1; + return startPos + counter - 1; } protected void deserialiseContainer(BigArrayList out, List tickLines) { - + List keyboardStrings = new ArrayList<>(); List mouseStrings = new ArrayList<>(); List cameraAngleStrings = new ArrayList<>(); List commentsAtEnd = new ArrayList<>(); - - for(String line : tickLines) { - if(contains(singleComment(), line)) { + + for (String line : tickLines) { + if (contains(singleComment(), line)) { // TODO TASfileExtension continue; } - + splitInputs(tickLines, keyboardStrings, mouseStrings, cameraAngleStrings, commentsAtEnd); } - + VirtualKeyboard keyboard = deserialiseKeyboard(keyboardStrings); + VirtualMouse mouse = deserialiseMouse(mouseStrings); } protected VirtualKeyboard deserialiseKeyboard(List keyboardStrings) { VirtualKeyboard out = new VirtualKeyboard(); - for(String line : keyboardStrings) { - Matcher matcher = extract("(.*?);(.*?)", line); - if(matcher.find()) { - out.updateFromState(VirtualKey.getKeycodes(matcher.group(1).split(",")), matcher.group(2).toCharArray()); + for (String line : keyboardStrings) { + Matcher matcher = extract("(.*?);(.+?)", line); + if (matcher.find()) { + String[] keys = matcher.group(1).split(","); + char[] chars = matcher.group(2).toCharArray(); + + int[] keycodes = dererialiseVirtualKey(keys); + out.updateFromState(keycodes, chars); + } + } + return out; + } + + protected VirtualMouse deserialiseMouse(List mouseStrings) { + VirtualMouse out = new VirtualMouse(); + for (String line : mouseStrings) { + Matcher matcher = extract("(.*?);(.+?)", line); + if (matcher.find()) { + String[] buttons = matcher.group(1).split(","); + String[] functions = matcher.group(2).split(","); + + int[] keycodes = dererialiseVirtualKey(buttons); + int scrollwheel; + Integer cursorX; + Integer cursorY; + + if (functions.length == 3) { + try { + scrollwheel = Integer.parseInt(functions[0]); + cursorX = Integer.parseInt(functions[1]); + cursorY = Integer.parseInt(functions[2]); + } catch (NumberFormatException e) { + throw new PlaybackLoadException(e); + } + } else { + throw new PlaybackLoadException(""); + } + + out.updateFromState(keycodes, scrollwheel, cursorX, cursorY); } } return out; } -// -// protected List deserialiseMouse(VirtualMouse mouse) { -// } // // protected List deserialiseCameraAngle(VirtualCameraAngle cameraAngle) { // } + protected int[] dererialiseVirtualKey(String[] keyString) { + int[] out = new int[keyString.length]; + for (int i = 0; i < keyString.length; i++) { + String key = keyString[i]; + + if (isNumeric(key)) { + int keycode = Integer.parseInt(key); + VirtualKey virtualKey = VirtualKey.get(keycode); + if (virtualKey != null) { + out[i] = virtualKey.getKeycode(); + } else { + throw new PlaybackLoadException("The specified keycode doesn't exist"); + } + continue; + } + + out[i] = VirtualKey.getKeycode(key); + } + return out; + } + protected void extractComment(List commentsAtEnd, String line, int startPos) { Matcher commentMatcher = extract(endlineComment(), line); - if(commentMatcher.find(startPos)) { + if (commentMatcher.find(startPos)) { String comment = commentMatcher.group(1); - commentsAtEnd.add(comment); + commentsAtEnd.add(comment); } else { commentsAtEnd.add(null); } } - - + protected void splitInputs(List lines, List serialisedKeyboard, List serialisedMouse, List serialisedCameraAngle, List commentsAtEnd) { - - for(String line : lines) { + + for (String line : lines) { Matcher tickMatcher = extract("^\\t?\\d+\\|(.*?)\\|(.*?)\\|(\\S*)\\s?", line); if (tickMatcher.find()) { - if(!tickMatcher.group(1).isEmpty()) { + if (!tickMatcher.group(1).isEmpty()) { serialisedKeyboard.add(tickMatcher.group(1)); } - if(!tickMatcher.group(2).isEmpty()) { + if (!tickMatcher.group(2).isEmpty()) { serialisedMouse.add(tickMatcher.group(2)); } - if(!tickMatcher.group(3).isEmpty()) { + if (!tickMatcher.group(3).isEmpty()) { serialisedCameraAngle.add(tickMatcher.group(3)); } } else { throw new PlaybackLoadException("Cannot find inputs in line %s", line); } - + extractComment(commentsAtEnd, line, tickMatcher.group(0).length()); } } @@ -403,7 +456,7 @@ protected Matcher extract(String regex, String haystack) { return matcher; } - + protected String extract(String regex, String haystack, int group) { Matcher matcher = extract(regex, haystack); if (matcher.find()) { @@ -416,6 +469,10 @@ protected boolean contains(String regex, String haystack) { return extract(regex, haystack).find(); } + protected boolean isNumeric(String string) { + return Pattern.matches("-?\\d+", string); + } + /** * @return {@link #currentTick} */ diff --git a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualInput.java b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualInput.java index d9a2e362..3dc6f9bd 100644 --- a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualInput.java +++ b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualInput.java @@ -397,7 +397,7 @@ public VirtualMouseInput(VirtualMouse preloadedMouse) { */ public void updateNextMouse(int keycode, boolean keystate, int scrollwheel, int cursorX, int cursorY) { LOGGER.debug(LoggerMarkers.Mouse,"Update: {} ({}), {}, {}, {}, {}", keycode, VirtualKey.getName(keycode), keystate, scrollwheel, cursorX, cursorY); // Activate with -Dtasmod.marker.mouse=ACCEPT in VM arguments (and -Dtasmod.log.level=debug) - nextMouse.update(keycode, keystate, scrollwheel, cursorX, cursorY); + nextMouse.updateFromEvent(keycode, keystate, scrollwheel, cursorX, cursorY); } /** diff --git a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualKey.java b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualKey.java index 58bc3238..4e7a8979 100644 --- a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualKey.java +++ b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualKey.java @@ -167,14 +167,6 @@ public static Integer getKeycode(String keyname) { return null; } - public static int[] getKeycodes(String[] keynames) { - int[] out = new int[keynames.length]; - for (int i = 0; i < keynames.length; i++) { - out[i] = getKeycode(keynames[i]); - } - return out; - } - public static String getName(int keycode) { VirtualKey key = get(keycode); if (key != null) @@ -192,6 +184,10 @@ public static VirtualKey get(int keycode) { } public static VirtualKey get(String keyname) { + if(keyname.isEmpty()) { + return VirtualKey.ZERO; + } + for (VirtualKey key : values()) { if (key.name().equalsIgnoreCase(keyname)) { return key; @@ -199,4 +195,5 @@ public static VirtualKey get(String keyname) { } return null; } + } diff --git a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualKeyboard.java b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualKeyboard.java index dcbf03fa..454d77be 100644 --- a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualKeyboard.java +++ b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualKeyboard.java @@ -2,7 +2,6 @@ import java.io.Serializable; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; @@ -11,10 +10,11 @@ import java.util.concurrent.ConcurrentLinkedQueue; import java.util.stream.Collectors; -import com.minecrafttas.tasmod.virtual.event.VirtualKeyboardEvent; import org.apache.commons.lang3.StringUtils; import com.google.common.collect.ImmutableList; +import com.minecrafttas.tasmod.playback.tasfile.flavor.PlaybackFlavorBase; +import com.minecrafttas.tasmod.virtual.event.VirtualKeyboardEvent; /** * Stores keyboard specific values in a given timeframe.
@@ -137,12 +137,6 @@ public void updateFromEvent(int keycode, boolean keystate, char keycharacter, bo setPressed(keycode, keystate); } - public void createSubtick() { - if(isParent() && !ignoreFirstUpdate()) { - addSubtick(shallowClone()); - } - } - public void updateFromEvent(int keycode, boolean keystate, char keycharacter) { updateFromEvent(keycode, keystate, keycharacter, false); } @@ -154,20 +148,45 @@ public void updateFromEvent(VirtualKey key, boolean keystate, char keycharacter) public void updateFromEvent(VirtualKey key, boolean keystate, char keycharacter, boolean repeatEventsEnabled) { updateFromEvent(key.getKeycode(), keystate, keycharacter, false); } - - public void updateFromState(int[] keycode, char[] chars) { + + /** + * Updates this keyboard from a state, and adds a new subtick.
+ *
+ * The difference to {@link #updateFromEvent(int, boolean, char)} is,
+ * that a state may update multiple pressed keys and chars at once.
+ *
+ * While update fromEvent is used when the player inputs something on the keyboard,
+ * updateFromState is used when creating a VirtualKeyboard by deserialising the TASfile,
+ * as the inputs in the TASfile are stored in states. + * + * @param keycodes An array of keycodes, that replaces {@link Subtickable#pressedKeys} + * @param chars An array of characters, that replaces {@link #charList} + * @see PlaybackFlavorBase#deserialiseKeyboard + */ + public void updateFromState(int[] keycodes, char[] chars) { createSubtick(); this.pressedKeys.clear(); - for(int i : keycode) { + for(int i : keycodes) { this.pressedKeys.add(i); } + this.charList.clear(); for(char c : chars) { this.charList.add(c); } } + /** + * Creates a new subtick by {@link #shallowClone()}ing this VirtualKeyboard.
+ * If {@link Subtickable#ignoreFirstUpdate} is true, no new subtick will be created.
+ */ + public void createSubtick() { + if(isParent() && !ignoreFirstUpdate()) { + addSubtick(shallowClone()); + } + } + @Override public void setPressed(int keycode, boolean keystate) { if (keycode >= 0) { // Keyboard keys always have a keycode larger or equal than 0 diff --git a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualMouse.java b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualMouse.java index b35ce5ce..2a9bbb76 100644 --- a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualMouse.java +++ b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualMouse.java @@ -1,5 +1,6 @@ package com.minecrafttas.tasmod.virtual; +import com.minecrafttas.tasmod.playback.tasfile.flavor.PlaybackFlavorBase; import com.minecrafttas.tasmod.virtual.event.VirtualMouseEvent; import java.io.Serializable; @@ -74,7 +75,7 @@ public VirtualMouse(Set pressedKeys, int scrollWheel, Integer cursorX, * @param cursorX The {@link #cursorX} * @param cursorY The {@link #cursorY} * @param subtickList The {@link VirtualPeripheral#subtickList} - * @param ignoreFirstUpdate Whether the first call to {@link #update(int, boolean, int, Integer, Integer)} should create a new subtick + * @param ignoreFirstUpdate Whether the first call to {@link #updateFromEvent(int, boolean, int, Integer, Integer)} should create a new subtick */ public VirtualMouse(Set pressedKeys, int scrollWheel, Integer cursorX, Integer cursorY, List subtickList, boolean ignoreFirstUpdate) { super(pressedKeys, subtickList, ignoreFirstUpdate); @@ -84,36 +85,74 @@ public VirtualMouse(Set pressedKeys, int scrollWheel, Integer cursorX, } /** - * Updates the mouse, adds a new subtick to this mouse + * Updates the mouse, adds a new subtick to this mouse
+ *
+ * An event updates one key at a time. * @param keycode The keycode of this button * @param keystate The keystate of this button, true for pressed * @param scrollwheel The scroll wheel for this mouse - * @oaram cursorX The pointer location in the x axis + * @param cursorX The pointer location in the x axis * @param cursorY The pointer location in the y axis */ - public void update(int keycode, boolean keystate, int scrollwheel, Integer cursorX, Integer cursorY) { - if (isParent() && !ignoreFirstUpdate()) { - addSubtick(shallowClone()); - } + public void updateFromEvent(int keycode, boolean keystate, int scrollwheel, Integer cursorX, Integer cursorY) { + createSubtick(); setPressed(keycode, keystate); this.scrollWheel = scrollwheel; this.cursorX = cursorX; this.cursorY = cursorY; } - + /** - * Updates the mouse, adds a new subtick to this mouse + * Updates the mouse, adds a new subtick to this mouse
+ *
+ * An event updates one key at a time. * * @param key The key * @param keystate The keystate of this button, true for pressed * @param scrollwheel The scroll wheel for this mouse - * @oaram cursorX The pointer location in the x axis + * @param cursorX The pointer location in the x axis * @param cursorY The pointer location in the y axis */ - public void update(VirtualKey key, boolean keystate, int scrollwheel, Integer cursorX, Integer cursorY) { - update(key.getKeycode(), keystate, scrollwheel, cursorX, cursorY); + public void updateFromEvent(VirtualKey key, boolean keystate, int scrollwheel, Integer cursorX, Integer cursorY) { + updateFromEvent(key.getKeycode(), keystate, scrollwheel, cursorX, cursorY); + } + + /** + * Updates this mouse from a state, and adds a new subtick.
+ *
+ * The difference to {@link #updateFromEvent(int, boolean, int, Integer, Integer) updateFromEvent} is,
+ * that a state may update multiple pressed keys at once.
+ *
+ * While update fromEvent is used when the player inputs something on the mouse,
+ * updateFromState is used when creating a VirtualMouse by deserialising the TASfile,
+ * as the inputs in the TASfile are stored in states. + * + * @param keycodes An array of keycodes, that replaces {@link Subtickable#pressedKeys pressedKeys} + * @param scrollwheel The scroll wheel of this mouse state + * @param cursorX The pointer location in the x axis + * @param cursorY The pointer location in the y axis + * @see PlaybackFlavorBase#deserialiseMouse + */ + public void updateFromState(int[] keycodes, int scrollwheel, Integer cursorX, Integer cursorY) { + createSubtick(); + + this.pressedKeys.clear(); + for(int i: keycodes) { + this.pressedKeys.add(i); + } + + this.scrollWheel = scrollwheel; + this.cursorX = cursorX; + this.cursorY = cursorY; } + + public void createSubtick() { + if (isParent() && !ignoreFirstUpdate()) { + addSubtick(shallowClone()); + } + } + @Override public void setPressed(int keycode, boolean keystate) { if (keycode < 0) { // Mouse buttons always have a keycode smaller than 0 @@ -122,7 +161,7 @@ public void setPressed(int keycode, boolean keystate) { } /** - * Calculates a list of {@link VirtualMouseEvent}s, when comparing this mouse to + * Calculates a list of {@link VirtualMouseEvent VirtualMouseEvents}, when comparing this mouse to * the next mouse in the sequence,
* which also includes the subticks. * @@ -146,7 +185,7 @@ public void getVirtualEvents(VirtualMouse nextMouse, Queue re /** * Calculates the difference between 2 mice via symmetric difference
* and returns a list of the changes between them in form of - * {@link VirtualMouseEvent}s + * {@link VirtualMouseEvent VirtualMouseEvents} * * @param nextMouse The mouse that comes after this one.
* If this one is loaded at tick 15, the nextMouse should be diff --git a/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java b/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java index d5051964..bc376bfe 100644 --- a/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java +++ b/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java @@ -3,10 +3,8 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertIterableEquals; import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; import java.io.Serializable; -import java.rmi.UnexpectedException; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; @@ -151,7 +149,7 @@ void testSerialiseContainer() { // Prepare mouse VirtualMouse mouse = new VirtualMouse(); - mouse.update(VirtualKey.LC, true, 0, 0, 0); + mouse.updateFromEvent(VirtualKey.LC, true, 0, 0, 0); // Prepare camera angle VirtualCameraAngle angle = new VirtualCameraAngle(0f, 0f, true); @@ -429,11 +427,20 @@ void testSplitInputs() { @Test void testDeserialiseKeyboard() { List tick = new ArrayList<>(); - tick.add("W,LCONTROL;w"); + tick.add(";a"); + tick.add("W;w"); + tick.add("W,LCONTROL;"); + tick.add("W,LCONTROL,S;s"); VirtualKeyboard actual = deserialiseKeyboard(tick); VirtualKeyboard expected = new VirtualKeyboard(); + expected.updateFromEvent(VirtualKey.ZERO, false, 'a'); + expected.updateFromEvent(VirtualKey.W, true, 'w'); + expected.updateFromEvent(VirtualKey.LCONTROL, true, Character.MIN_VALUE); + expected.updateFromEvent(VirtualKey.S, true, 's'); + + assertEquals(expected, actual); } @Test diff --git a/src/test/java/tasmod/virtual/VirtualInputTest.java b/src/test/java/tasmod/virtual/VirtualInputTest.java index 9a11fc2a..b3b23acb 100644 --- a/src/test/java/tasmod/virtual/VirtualInputTest.java +++ b/src/test/java/tasmod/virtual/VirtualInputTest.java @@ -55,7 +55,7 @@ void testIsKeyDown() { VirtualCameraAngle preloadedCameraAngle = new VirtualCameraAngle(0f, 0f); preloadedKeyboard.updateFromEvent(VirtualKey.W.getKeycode(), true, 'w'); - preloadedMouse.update(VirtualKey.LC.getKeycode(), true, 15, 0, 0); + preloadedMouse.updateFromEvent(VirtualKey.LC.getKeycode(), true, 15, 0, 0); preloadedCameraAngle.update(1f, 2f); VirtualInput input = new VirtualInput(LOGGER, preloadedKeyboard, preloadedMouse, preloadedCameraAngle); @@ -88,7 +88,7 @@ void testPreloadedConstructor() { VirtualCameraAngle preloadedCameraAngle = new VirtualCameraAngle(0f, 0f); preloadedKeyboard.updateFromEvent(VirtualKey.W.getKeycode(), true, 'w'); - preloadedMouse.update(VirtualKey.LC.getKeycode(), true, 15, 0, 0); + preloadedMouse.updateFromEvent(VirtualKey.LC.getKeycode(), true, 15, 0, 0); preloadedCameraAngle.update(1f, 2f); @@ -230,7 +230,7 @@ void testMousePresses() { @Test void testMouseRemovePresses() { VirtualMouse preloadedMouse = new VirtualMouse(); - preloadedMouse.update(VirtualKey.LC.getKeycode(), true, 15, 10, 20); + preloadedMouse.updateFromEvent(VirtualKey.LC.getKeycode(), true, 15, 10, 20); // Load preloaded mouse VirtualInput virtual = new VirtualInput(LOGGER, new VirtualKeyboard(), preloadedMouse, new VirtualCameraAngle()); diff --git a/src/test/java/tasmod/virtual/VirtualMouseTest.java b/src/test/java/tasmod/virtual/VirtualMouseTest.java index 90fd0f4c..127fbb26 100644 --- a/src/test/java/tasmod/virtual/VirtualMouseTest.java +++ b/src/test/java/tasmod/virtual/VirtualMouseTest.java @@ -126,8 +126,8 @@ void testToString() { @Test void testToStringSubtick() { VirtualMouse actual = new VirtualMouse(); - actual.update(VirtualKey.LC.getKeycode(), true, 10, 100, 120); - actual.update(VirtualKey.MC.getKeycode(), true, 0, 12, 3); + actual.updateFromEvent(VirtualKey.LC.getKeycode(), true, 10, 100, 120); + actual.updateFromEvent(VirtualKey.MC.getKeycode(), true, 0, 12, 3); assertEquals("LC;10,100,120\nLC,MC;0,12,3", actual.toString()); } @@ -194,8 +194,8 @@ void testShallowClone() { @Test void testDeepClone() { VirtualMouse expected = new VirtualMouse(); - expected.update(VirtualKey.LC, true, 15, 0, 0); - expected.update(VirtualKey.MOUSEMOVED, true, 0, 0, 0); + expected.updateFromEvent(VirtualKey.LC, true, 15, 0, 0); + expected.updateFromEvent(VirtualKey.MOUSEMOVED, true, 0, 0, 0); VirtualMouse actual = expected.clone(); @@ -211,13 +211,13 @@ void testMoveFrom() { VirtualMouse moveFrom = new VirtualMouse(); VirtualMouse actual = new VirtualMouse(); - moveFrom.update(VirtualKey.LC.getKeycode(), true, 0, 0, 0); - moveFrom.update(VirtualKey.MOUSEMOVED.getKeycode(), false, 120, 10, 20); + moveFrom.updateFromEvent(VirtualKey.LC.getKeycode(), true, 0, 0, 0); + moveFrom.updateFromEvent(VirtualKey.MOUSEMOVED.getKeycode(), false, 120, 10, 20); VirtualMouse expected = moveFrom.clone(); - actual.update(VirtualKey.MBUTTON12.getKeycode(), true, 0, 0, 0); - actual.update(VirtualKey.MOUSEMOVED.getKeycode(), true, -120, -10, -10); + actual.updateFromEvent(VirtualKey.MBUTTON12.getKeycode(), true, 0, 0, 0); + actual.updateFromEvent(VirtualKey.MOUSEMOVED.getKeycode(), true, -120, -10, -10); actual.moveFrom(null); @@ -242,13 +242,13 @@ void testCopyFrom() { VirtualMouse copyFrom = new VirtualMouse(); VirtualMouse actual = new VirtualMouse(); - copyFrom.update(VirtualKey.LC.getKeycode(), true, 0, 0, 0); - copyFrom.update(VirtualKey.MOUSEMOVED.getKeycode(), false, 120, 10, 20); + copyFrom.updateFromEvent(VirtualKey.LC.getKeycode(), true, 0, 0, 0); + copyFrom.updateFromEvent(VirtualKey.MOUSEMOVED.getKeycode(), false, 120, 10, 20); VirtualMouse expected = copyFrom.clone(); - actual.update(VirtualKey.MBUTTON12.getKeycode(), true, 0, 0, 0); - actual.update(VirtualKey.MOUSEMOVED.getKeycode(), true, -120, -10, -10); + actual.updateFromEvent(VirtualKey.MBUTTON12.getKeycode(), true, 0, 0, 0); + actual.updateFromEvent(VirtualKey.MOUSEMOVED.getKeycode(), true, -120, -10, -10); actual.copyFrom(null); @@ -271,8 +271,8 @@ void testCopyFrom() { @Test void testUpdate() { VirtualMouse actual = new VirtualMouse(); - actual.update(VirtualKey.LC.getKeycode(), true, -30, 118, 42); - actual.update(VirtualKey.MOUSEMOVED.getKeycode(), false, 0, 23, 144); + actual.updateFromEvent(VirtualKey.LC.getKeycode(), true, -30, 118, 42); + actual.updateFromEvent(VirtualKey.MOUSEMOVED.getKeycode(), false, 0, 23, 144); List expected = new ArrayList<>(); expected.add(new VirtualMouse(new HashSet(Arrays.asList(VirtualKey.LC.getKeycode())), -30, 118, 42)); @@ -304,7 +304,7 @@ void testGetVirtualEventsPress() { VirtualMouse unpressed = new VirtualMouse(); VirtualMouse pressed = new VirtualMouse(); - pressed.update(VirtualKey.LC.getKeycode(), true, 15, 10, 12); + pressed.updateFromEvent(VirtualKey.LC.getKeycode(), true, 15, 10, 12); // Load actual with the events Queue actual = new ConcurrentLinkedQueue<>(); @@ -325,7 +325,7 @@ void testGetVirtualEventsUnpress() { VirtualMouse unpressed = new VirtualMouse(); VirtualMouse pressed = new VirtualMouse(); - pressed.update(VirtualKey.LC.getKeycode(), true, 15, 10, 12); + pressed.updateFromEvent(VirtualKey.LC.getKeycode(), true, 15, 10, 12); // Load actual with the events Queue actual = new ConcurrentLinkedQueue<>(); @@ -346,8 +346,8 @@ void testSameUpdate() { VirtualMouse unpressed = new VirtualMouse(); VirtualMouse pressed = new VirtualMouse(); - pressed.update(VirtualKey.LC.getKeycode(), true, 0, 10, 12); - pressed.update(VirtualKey.LC.getKeycode(), true, 0, 10, 12); + pressed.updateFromEvent(VirtualKey.LC.getKeycode(), true, 0, 10, 12); + pressed.updateFromEvent(VirtualKey.LC.getKeycode(), true, 0, 10, 12); // Load actual with the events Queue actual = new ConcurrentLinkedQueue<>(); @@ -368,8 +368,8 @@ void testScrollWheelDifferent() { VirtualMouse unpressed = new VirtualMouse(); VirtualMouse pressed = new VirtualMouse(); - pressed.update(VirtualKey.LC.getKeycode(), true, 15, 10, 12); - pressed.update(VirtualKey.LC.getKeycode(), true, 15, 10, 12); + pressed.updateFromEvent(VirtualKey.LC.getKeycode(), true, 15, 10, 12); + pressed.updateFromEvent(VirtualKey.LC.getKeycode(), true, 15, 10, 12); // Load actual with the events Queue actual = new ConcurrentLinkedQueue<>(); @@ -390,8 +390,8 @@ void testCursorXDifferent() { VirtualMouse unpressed = new VirtualMouse(); VirtualMouse pressed = new VirtualMouse(); - pressed.update(VirtualKey.LC.getKeycode(), true, 0, 10, 12); - pressed.update(VirtualKey.LC.getKeycode(), true, 0, 11, 12); + pressed.updateFromEvent(VirtualKey.LC.getKeycode(), true, 0, 10, 12); + pressed.updateFromEvent(VirtualKey.LC.getKeycode(), true, 0, 11, 12); // Load actual with the events Queue actual = new ConcurrentLinkedQueue<>(); @@ -412,8 +412,8 @@ void testCursorYDifferent() { VirtualMouse unpressed = new VirtualMouse(); VirtualMouse pressed = new VirtualMouse(); - pressed.update(VirtualKey.LC.getKeycode(), true, 0, 10, 12); - pressed.update(VirtualKey.LC.getKeycode(), true, 0, 10, 120); + pressed.updateFromEvent(VirtualKey.LC.getKeycode(), true, 0, 10, 12); + pressed.updateFromEvent(VirtualKey.LC.getKeycode(), true, 0, 10, 120); // Load actual with the events Queue actual = new ConcurrentLinkedQueue<>(); From 7de41ca5cec31b97ca12f8484e6adf1459daa714 Mon Sep 17 00:00:00 2001 From: Scribble Date: Mon, 20 May 2024 21:35:44 +0200 Subject: [PATCH 21/79] [PlaybackSerialiser] Add camera angle deserialisation --- .../tasfile/flavor/PlaybackFlavorBase.java | 98 +++++++++++++------ .../tasmod/virtual/VirtualCameraAngle.java | 20 +++- .../tasmod/virtual/VirtualInput.java | 2 +- .../tasfile/PlaybackFlavorBaseTest.java | 8 +- .../virtual/VirtualCameraAngleTest.java | 34 +++---- .../java/tasmod/virtual/VirtualInputTest.java | 4 +- 6 files changed, 108 insertions(+), 58 deletions(-) diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java index c66640fb..f4e05df0 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java @@ -37,14 +37,14 @@ public abstract class PlaybackFlavorBase { public String headerStart() { return createCenteredHeading("TASFile", '#', 50); } - + /** * @return The regex used for detecting comment lines */ public String singleComment() { return "^//"; } - + public String endlineComment() { return "(//.+)"; } @@ -52,7 +52,7 @@ public String endlineComment() { public String headerEnd() { return createPaddedString('#', 50); } - + /*============================================== _____ _ _ _ / ____| (_) | (_) @@ -62,23 +62,23 @@ public String headerEnd() { |_____/ \___|_| |_|\__,_|_|_|___/\___| ============================================== - - * The following section is dedicated to serialising. - * - * The serialisation process is split into 2 parts: - * The header and the container. - * - * ## Header - * The header is where the flavorname, the enabled extensions and the metadata is stored. - * - * You change how each is displayed by overwriting the corresponding method. - * + + * The following section is dedicated to serialising. + * + * The serialisation process is split into 2 parts: + * The header and the container. + * + * ## Header + * The header is where the flavorname, the enabled extensions and the metadata is stored. + * + * You change how each is displayed by overwriting the corresponding method. + * */ - + public List serialiseHeader(List metadataList) { List out = new ArrayList<>(); serialiseFlavorName(out); -// out.add(serializeExtensionNames()); + // out.add(serializeExtensionNames()); serialiseMetadata(out, metadataList); return out; } @@ -170,12 +170,11 @@ protected void mergeInputs(BigArrayList out, List serialisedKeyb } currentSubtick = null; } - + protected String getOrEmpty(String string) { return string == null ? "" : string; } - /*======================================================== _____ _ _ _ | __ \ (_) | (_) @@ -183,11 +182,10 @@ protected String getOrEmpty(String string) { | | | |/ _ \/ __|/ _ \ '__| |/ _` | | / __|/ _ \ | |__| | __/\__ \ __/ | | | (_| | | \__ \ __/ |_____/ \___||___/\___|_| |_|\__,_|_|_|___/\___| - + ======================================================== * */ - public boolean deserialiseFlavorName(List header) { for (String line : header) { @@ -233,10 +231,10 @@ public List deserialiseMetadata(List headerLines) { String newMetadataName = deserialiseMetadataName(metadataLine); - if (newMetadataName != null) { // Means a new metadata section is beginning... In this case, the metadataLine + if (newMetadataName != null) { // Means a new metadata section is beginning... In this case, the metadataLine // is "### Name" and the newMetadataName is "Name" - if (metadataName != null && !metadataName.equals(newMetadataName)) { // If metadataName is null, then the first section begins + if (metadataName != null && !metadataName.equals(newMetadataName)) { // If metadataName is null, then the first section begins // If metadataName is different than the newMetadataName, // then a new section begins and we first need to store the old. out.add(PlaybackMetadata.fromHashMap(metadataName, values)); @@ -294,8 +292,11 @@ public BigArrayList deserialise(BigArrayList lines, BigArrayList out = new BigArrayList<>(); for (long i = startPos; i < lines.size(); i++) { - String line = lines.get(i); - + List tick = new ArrayList<>(); + // Extract the tick and set the index + i = extractTick(tick, lines, i); + // Extract container + deserialiseContainer(out, tick); } return out; } @@ -337,7 +338,7 @@ protected void deserialiseContainer(BigArrayList out, List out, List keyboardStrings) { VirtualKeyboard out = new VirtualKeyboard(); + for (String line : keyboardStrings) { Matcher matcher = extract("(.*?);(.+?)", line); if (matcher.find()) { @@ -365,6 +371,7 @@ protected VirtualKeyboard deserialiseKeyboard(List keyboardStrings) { protected VirtualMouse deserialiseMouse(List mouseStrings) { VirtualMouse out = new VirtualMouse(); + for (String line : mouseStrings) { Matcher matcher = extract("(.*?);(.+?)", line); if (matcher.find()) { @@ -375,7 +382,7 @@ protected VirtualMouse deserialiseMouse(List mouseStrings) { int scrollwheel; Integer cursorX; Integer cursorY; - + if (functions.length == 3) { try { scrollwheel = Integer.parseInt(functions[0]); @@ -393,9 +400,38 @@ protected VirtualMouse deserialiseMouse(List mouseStrings) { } return out; } -// -// protected List deserialiseCameraAngle(VirtualCameraAngle cameraAngle) { -// } + + protected VirtualCameraAngle deserialiseCameraAngle(List cameraAngleStrings) { + VirtualCameraAngle out = new VirtualCameraAngle(); + + for (String line : cameraAngleStrings) { + Matcher matcher = extract("(.+?);(.+?)", line); + + if (matcher.find()) { + String cameraPitchString = matcher.group(1); + String cameraYawString = matcher.group(2); + + float cameraPitch; + float cameraYaw; + + if(isFloat(cameraPitchString)) + cameraPitch = Float.parseFloat(cameraPitchString); + else + throw new PlaybackLoadException("The camera pitch is not valid"); + + if(isFloat(cameraYawString)) + cameraYaw = Float.parseFloat(cameraYawString); + else + throw new PlaybackLoadException("The camera yaw is not valid"); + + out.updateFromState(cameraPitch, cameraYaw); + + } else { + throw new PlaybackLoadException("The cameraAngle is not valid"); + } + } + return out; + } protected int[] dererialiseVirtualKey(String[] keyString) { int[] out = new int[keyString.length]; @@ -473,6 +509,10 @@ protected boolean isNumeric(String string) { return Pattern.matches("-?\\d+", string); } + protected boolean isFloat(String string) { + return Pattern.matches("-?\\d+(?:\\.\\d+)?", string); + } + /** * @return {@link #currentTick} */ diff --git a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualCameraAngle.java b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualCameraAngle.java index b879457b..b4da10e4 100644 --- a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualCameraAngle.java +++ b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualCameraAngle.java @@ -79,8 +79,8 @@ public VirtualCameraAngle(Float pitch, Float yaw, List subti * @param pitchDelta The difference between absolute coordinates of the pitch, is added to {@link VirtualCameraAngle#pitch} * @param yawDelta The difference between absolute coordinates of the yaw, is added to {@link VirtualCameraAngle#yaw} */ - public void update(float pitchDelta, float yawDelta) { - update(pitchDelta, yawDelta, true); + public void updateFromEvent(float pitchDelta, float yawDelta) { + updateFromEvent(pitchDelta, yawDelta, true); } /** @@ -89,15 +89,25 @@ public void update(float pitchDelta, float yawDelta) { * @param yawDelta The difference between absolute coordinates of the yaw, is added to {@link VirtualCameraAngle#yaw} * @param updateSubtick If the previous camera should be added to {@link Subtickable#subtickList} */ - public void update(float pitchDelta, float yawDelta, boolean updateSubtick) { + public void updateFromEvent(float pitchDelta, float yawDelta, boolean updateSubtick) { if(pitch==null || yaw == null) { return; } + createSubtick(updateSubtick); + this.pitch = MathHelper.clamp(this.pitch + pitchDelta, -90F, 90F); + this.yaw += yawDelta; + } + + public void updateFromState(float pitch, float yaw) { + createSubtick(true); + this.pitch = MathHelper.clamp(pitch, -90F, 90F); + this.yaw = yaw; + } + + public void createSubtick(boolean updateSubtick) { if(isParent() && !ignoreFirstUpdate() && updateSubtick) { addSubtick(shallowClone()); } - this.pitch = MathHelper.clamp(this.pitch + pitchDelta, -90.0F, 90.0F); - this.yaw += yawDelta; } /** diff --git a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualInput.java b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualInput.java index 3dc6f9bd..303e10af 100644 --- a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualInput.java +++ b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualInput.java @@ -598,7 +598,7 @@ public void updateNextCameraAngle(float pitchDelta, float yawDelta) { */ public void updateNextCameraAngle(float pitchDelta, float yawDelta, boolean updateSubtick) { // LOGGER.debug("Pitch: {}, Yaw: {}", pitch, yaw); - nextCameraAngle.update(pitchDelta, yawDelta, updateSubtick); + nextCameraAngle.updateFromEvent(pitchDelta, yawDelta, updateSubtick); } /** diff --git a/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java b/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java index bc376bfe..b234ab58 100644 --- a/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java +++ b/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java @@ -153,10 +153,10 @@ void testSerialiseContainer() { // Prepare camera angle VirtualCameraAngle angle = new VirtualCameraAngle(0f, 0f, true); - angle.update(1, 1); - angle.update(1, 1); - angle.update(1, 1); - angle.update(1, 1); + angle.updateFromEvent(1, 1); + angle.updateFromEvent(1, 1); + angle.updateFromEvent(1, 1); + angle.updateFromEvent(1, 1); // Create container and fill actual TickInputContainer container = new TickInputContainer(keyboard, mouse, angle); diff --git a/src/test/java/tasmod/virtual/VirtualCameraAngleTest.java b/src/test/java/tasmod/virtual/VirtualCameraAngleTest.java index d8773e25..fc77a122 100644 --- a/src/test/java/tasmod/virtual/VirtualCameraAngleTest.java +++ b/src/test/java/tasmod/virtual/VirtualCameraAngleTest.java @@ -51,7 +51,7 @@ void testUpdate() { VirtualCameraAngle actual = new VirtualCameraAngle(0f, 0f, true); - actual.update(x, y); + actual.updateFromEvent(x, y); assertEquals(1f, actual.getPitch()); assertEquals(2f, actual.getYaw()); @@ -64,10 +64,10 @@ void testUpdate() { void testUpdateWithBadPitch() { VirtualCameraAngle actual = new VirtualCameraAngle(0f, 0f, true); - actual.update(-100f, 0f); + actual.updateFromEvent(-100f, 0f); assertEquals(-90f, actual.getPitch()); - actual.update(360f, 0f); + actual.updateFromEvent(360f, 0f); assertEquals(90f, actual.getPitch()); } @@ -82,13 +82,13 @@ void testUpdateWithNull() { VirtualCameraAngle actual = new VirtualCameraAngle(); - actual.update(x, y); + actual.updateFromEvent(x, y); assertEquals(null, actual.getPitch()); assertEquals(null, actual.getYaw()); VirtualCameraAngle actual2 = new VirtualCameraAngle(1f, null); - actual2.update(x, y); + actual2.updateFromEvent(x, y); assertEquals(null, actual.getPitch()); assertEquals(null, actual.getYaw()); @@ -102,7 +102,7 @@ void testSet() { VirtualCameraAngle actual = new VirtualCameraAngle(); actual.set(1f, 2f); - actual.update(1f, 2f); + actual.updateFromEvent(1f, 2f); assertEquals(2f, actual.getPitch()); assertEquals(4f, actual.getYaw()); @@ -115,9 +115,9 @@ void testSet() { void testGetStates() { VirtualCameraAngle test = new VirtualCameraAngle(); test.set(0f, 0f); - test.update(1f, 1f); - test.update(1f, 1f); - test.update(1f, 1f); + test.updateFromEvent(1f, 1f); + test.updateFromEvent(1f, 1f); + test.updateFromEvent(1f, 1f); List actual = new ArrayList<>(); @@ -147,8 +147,8 @@ void testGetStates() { @Test void testCopyFrom() { VirtualCameraAngle expected = new VirtualCameraAngle(0f, 0f, true); - expected.update(1f, 2f); - expected.update(3f, 4f); + expected.updateFromEvent(1f, 2f); + expected.updateFromEvent(3f, 4f); VirtualCameraAngle actual = new VirtualCameraAngle(0f, 0f, true); @@ -176,9 +176,9 @@ void testCopyFrom() { void testClear() { VirtualCameraAngle actual = new VirtualCameraAngle(); actual.set(0f, 0f); - actual.update(1f, 1f); - actual.update(1f, 1f); - actual.update(1f, 1f); + actual.updateFromEvent(1f, 1f); + actual.updateFromEvent(1f, 1f); + actual.updateFromEvent(1f, 1f); actual.clear(); @@ -206,9 +206,9 @@ void testToString() { @Test void testToStringSubticks() { VirtualCameraAngle actual = new VirtualCameraAngle(0f, 0f, true); - actual.update(1f, 2f); - actual.update(3f, 4f); - actual.update(5f, 6f); + actual.updateFromEvent(1f, 2f); + actual.updateFromEvent(3f, 4f); + actual.updateFromEvent(5f, 6f); assertEquals("1.0;2.0\n4.0;6.0\n9.0;12.0", actual.toString()); } diff --git a/src/test/java/tasmod/virtual/VirtualInputTest.java b/src/test/java/tasmod/virtual/VirtualInputTest.java index b3b23acb..4a343b61 100644 --- a/src/test/java/tasmod/virtual/VirtualInputTest.java +++ b/src/test/java/tasmod/virtual/VirtualInputTest.java @@ -56,7 +56,7 @@ void testIsKeyDown() { preloadedKeyboard.updateFromEvent(VirtualKey.W.getKeycode(), true, 'w'); preloadedMouse.updateFromEvent(VirtualKey.LC.getKeycode(), true, 15, 0, 0); - preloadedCameraAngle.update(1f, 2f); + preloadedCameraAngle.updateFromEvent(1f, 2f); VirtualInput input = new VirtualInput(LOGGER, preloadedKeyboard, preloadedMouse, preloadedCameraAngle); @@ -89,7 +89,7 @@ void testPreloadedConstructor() { preloadedKeyboard.updateFromEvent(VirtualKey.W.getKeycode(), true, 'w'); preloadedMouse.updateFromEvent(VirtualKey.LC.getKeycode(), true, 15, 0, 0); - preloadedCameraAngle.update(1f, 2f); + preloadedCameraAngle.updateFromEvent(1f, 2f); VirtualInput virtual = new VirtualInput(LOGGER, preloadedKeyboard, preloadedMouse, preloadedCameraAngle); From cc618ce94dec32bd821381e8e93c1dc2f23294ed Mon Sep 17 00:00:00 2001 From: Scribble Date: Tue, 21 May 2024 20:54:07 +0200 Subject: [PATCH 22/79] [PlaybackSerialiser] Added tests for mouse, camera, numeric and float ... deserialisation - Added defaultKey to deserialiseVirtualKey --- .../tasfile/flavor/PlaybackFlavorBase.java | 73 ++--- .../tasmod/virtual/VirtualKey.java | 2 +- .../tasfile/PlaybackFlavorBaseTest.java | 286 ++++++++++++------ 3 files changed, 227 insertions(+), 134 deletions(-) diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java index f4e05df0..31e7618f 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java @@ -61,19 +61,7 @@ public String headerEnd() { ____) | __/ | | | (_| | | \__ \ __/ |_____/ \___|_| |_|\__,_|_|_|___/\___| - ============================================== - - * The following section is dedicated to serialising. - * - * The serialisation process is split into 2 parts: - * The header and the container. - * - * ## Header - * The header is where the flavorname, the enabled extensions and the metadata is stored. - * - * You change how each is displayed by overwriting the corresponding method. - * - */ + ==============================================*/ public List serialiseHeader(List metadataList) { List out = new ArrayList<>(); @@ -338,18 +326,17 @@ protected void deserialiseContainer(BigArrayList out, List keyboardStrings) { VirtualKeyboard out = new VirtualKeyboard(); for (String line : keyboardStrings) { - Matcher matcher = extract("(.*?);(.+?)", line); + Matcher matcher = extract("(.*?);(.*)", line); if (matcher.find()) { String[] keys = matcher.group(1).split(","); char[] chars = matcher.group(2).toCharArray(); - int[] keycodes = dererialiseVirtualKey(keys); + int[] keycodes = deserialiseVirtualKey(keys, VirtualKey.ZERO); out.updateFromState(keycodes, chars); } } @@ -373,12 +360,12 @@ protected VirtualMouse deserialiseMouse(List mouseStrings) { VirtualMouse out = new VirtualMouse(); for (String line : mouseStrings) { - Matcher matcher = extract("(.*?);(.+?)", line); + Matcher matcher = extract("(.*?);(.+)", line); if (matcher.find()) { String[] buttons = matcher.group(1).split(","); String[] functions = matcher.group(2).split(","); - int[] keycodes = dererialiseVirtualKey(buttons); + int[] keycodes = deserialiseVirtualKey(buttons, VirtualKey.MOUSEMOVED); int scrollwheel; Integer cursorX; Integer cursorY; @@ -392,7 +379,7 @@ protected VirtualMouse deserialiseMouse(List mouseStrings) { throw new PlaybackLoadException(e); } } else { - throw new PlaybackLoadException(""); + throw new PlaybackLoadException("Mouse functions do not have the correct length"); } out.updateFromState(keycodes, scrollwheel, cursorX, cursorY); @@ -405,27 +392,27 @@ protected VirtualCameraAngle deserialiseCameraAngle(List cameraAngleStri VirtualCameraAngle out = new VirtualCameraAngle(); for (String line : cameraAngleStrings) { - Matcher matcher = extract("(.+?);(.+?)", line); - + Matcher matcher = extract("(.+?);(.+)", line); + if (matcher.find()) { String cameraPitchString = matcher.group(1); String cameraYawString = matcher.group(2); - + float cameraPitch; float cameraYaw; - - if(isFloat(cameraPitchString)) + + if (isFloat(cameraPitchString)) cameraPitch = Float.parseFloat(cameraPitchString); else throw new PlaybackLoadException("The camera pitch is not valid"); - - if(isFloat(cameraYawString)) + + if (isFloat(cameraYawString)) cameraYaw = Float.parseFloat(cameraYawString); else throw new PlaybackLoadException("The camera yaw is not valid"); - + out.updateFromState(cameraPitch, cameraYaw); - + } else { throw new PlaybackLoadException("The cameraAngle is not valid"); } @@ -433,19 +420,25 @@ protected VirtualCameraAngle deserialiseCameraAngle(List cameraAngleStri return out; } - protected int[] dererialiseVirtualKey(String[] keyString) { + protected int[] deserialiseVirtualKey(String[] keyString, VirtualKey defaultKey) { int[] out = new int[keyString.length]; + for (int i = 0; i < keyString.length; i++) { String key = keyString[i]; + /* If no key is pressed, then a zero key will be used for the state. + * This zero key is either VirtualKey.ZERO on a keyboard or VirtualKey.MOUSEMOVED on a mouse, + * hence the parameter */ + if (key.isEmpty()) { + out[i] = defaultKey.getKeycode(); + continue; + } + + /* Instead of keynames such as W, A, S, KEY_1, NUMPAD3 you can also write the numerical keycodes + * into the tasfile, e.g. 17, 30, 31, 2, 81. This enables TASmod to support every current and future + * keycodes, even if no name was given to the key in VirtualKey.*/ if (isNumeric(key)) { - int keycode = Integer.parseInt(key); - VirtualKey virtualKey = VirtualKey.get(keycode); - if (virtualKey != null) { - out[i] = virtualKey.getKeycode(); - } else { - throw new PlaybackLoadException("The specified keycode doesn't exist"); - } + out[i] = Integer.parseInt(key); continue; } @@ -454,7 +447,7 @@ protected int[] dererialiseVirtualKey(String[] keyString) { return out; } - protected void extractComment(List commentsAtEnd, String line, int startPos) { + protected void extractCommentAtEnd(List commentsAtEnd, String line, int startPos) { Matcher commentMatcher = extract(endlineComment(), line); if (commentMatcher.find(startPos)) { String comment = commentMatcher.group(1); @@ -482,7 +475,7 @@ protected void splitInputs(List lines, List serialisedKeyboard, throw new PlaybackLoadException("Cannot find inputs in line %s", line); } - extractComment(commentsAtEnd, line, tickMatcher.group(0).length()); + extractCommentAtEnd(commentsAtEnd, line, tickMatcher.group(0).length()); } } diff --git a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualKey.java b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualKey.java index 4e7a8979..1aa0477c 100644 --- a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualKey.java +++ b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualKey.java @@ -185,7 +185,7 @@ public static VirtualKey get(int keycode) { public static VirtualKey get(String keyname) { if(keyname.isEmpty()) { - return VirtualKey.ZERO; + return null; } for (VirtualKey key : values()) { diff --git a/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java b/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java index b234ab58..21d239d1 100644 --- a/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java +++ b/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java @@ -1,14 +1,17 @@ package tasmod.playback.tasfile; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertIterableEquals; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.io.Serializable; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import com.dselent.bigarraylist.BigArrayList; @@ -24,11 +27,11 @@ import com.minecrafttas.tasmod.virtual.VirtualMouse; public class PlaybackFlavorBaseTest extends PlaybackFlavorBase { - - class MetadataTest implements PlaybackMetadataExtension{ + + class MetadataTest implements PlaybackMetadataExtension { public String testValue; - + @Override public String getExtensionName() { return "Test1"; @@ -36,7 +39,7 @@ public String getExtensionName() { @Override public void onCreate() { - + } @Override @@ -53,15 +56,15 @@ public void onLoad(PlaybackMetadata metadata) { @Override public void onClear() { - this.testValue=null; + this.testValue = null; } - + } - - class MetadataTest2 implements PlaybackMetadataExtension{ + + class MetadataTest2 implements PlaybackMetadataExtension { public String testValue; - + @Override public String getExtensionName() { return "Test2"; @@ -69,7 +72,7 @@ public String getExtensionName() { @Override public void onCreate() { - + } @Override @@ -86,27 +89,27 @@ public void onLoad(PlaybackMetadata metadata) { @Override public void onClear() { - this.testValue=null; + this.testValue = null; } - + } - + @Override public String flavorName() { return "Test"; } - + @Test void testSerialiseFlavorname() { List actual = new ArrayList<>(); serialiseFlavorName(actual); - + List expected = new ArrayList<>(); expected.add("# Flavor: Test"); - + assertIterableEquals(expected, actual); } - + /** * Test serialising metadata part of the header */ @@ -114,27 +117,27 @@ void testSerialiseFlavorname() { void testSerialiseMetadata() { MetadataTest testmetadata1 = new MetadataTest(); testmetadata1.testValue = "This is a test"; - + MetadataTest2 testmetadata2 = new MetadataTest2(); testmetadata2.testValue = "This is a second test"; - + TASmodRegistry.PLAYBACK_METADATA.register(testmetadata1); TASmodRegistry.PLAYBACK_METADATA.register(testmetadata2); - + List actual = new ArrayList<>(); serialiseMetadata(actual, TASmodRegistry.PLAYBACK_METADATA.handleOnStore()); - + List expected = new ArrayList<>(); expected.add("### Test1"); expected.add("TestKey:This is a test"); - + expected.add("### Test2"); expected.add("TestKey:This is a second test"); - + assertIterableEquals(expected, actual); assertEquals(0, currentTick); } - + /** * Test serialising a {@link TickInputContainer}.
* This container contains a keyboard, mouse and camera angle,
@@ -146,34 +149,34 @@ void testSerialiseContainer() { VirtualKeyboard keyboard = new VirtualKeyboard(); keyboard.updateFromEvent(VirtualKey.W, true, 'w'); keyboard.updateFromEvent(VirtualKey.LCONTROL, true, Character.MIN_VALUE); - + // Prepare mouse VirtualMouse mouse = new VirtualMouse(); mouse.updateFromEvent(VirtualKey.LC, true, 0, 0, 0); - + // Prepare camera angle VirtualCameraAngle angle = new VirtualCameraAngle(0f, 0f, true); angle.updateFromEvent(1, 1); angle.updateFromEvent(1, 1); angle.updateFromEvent(1, 1); angle.updateFromEvent(1, 1); - + // Create container and fill actual TickInputContainer container = new TickInputContainer(keyboard, mouse, angle); BigArrayList actual = new BigArrayList<>(); serialiseContainer(actual, container); - + // Fill expected BigArrayList expected = new BigArrayList<>(); expected.add("0|W;w|LC;0,0,0|1.0;1.0"); expected.add("\t1|W,LCONTROL;||2.0;2.0"); expected.add("\t2|||3.0;3.0"); expected.add("\t3|||4.0;4.0"); - + // C o m p a r e assertBigArrayList(expected, actual); } - + @Test void testExtractHeader() { BigArrayList lines = new BigArrayList<>(); @@ -186,9 +189,9 @@ void testExtractHeader() { lines.add("##################################################"); lines.add("This should not be read anymore"); lines.add("1|W;w||"); - + List actual = extractHeader(lines); - + List expected = new ArrayList<>(); expected.add("###### TASfile ######"); expected.add("Flavor: beta"); @@ -197,10 +200,10 @@ void testExtractHeader() { expected.add("Author: Scribble"); expected.add("Title: 77 Buttons"); expected.add("##################################################"); - + assertIterableEquals(expected, actual); } - + @Test void testExtractHeaderFail() { BigArrayList lines = new BigArrayList<>(); @@ -212,14 +215,14 @@ void testExtractHeaderFail() { lines.add("Title: 77 Buttons"); lines.add("This should not be read anymore"); lines.add("1|W;w||"); - - PlaybackLoadException exception = assertThrows(PlaybackLoadException.class, ()->{ + + PlaybackLoadException exception = assertThrows(PlaybackLoadException.class, () -> { extractHeader(lines); }); - + assertEquals("Cannot find the end of the header", exception.getMessage()); } - + /** * Test extracting only the metadata (### General and below) */ @@ -233,17 +236,17 @@ void testExtractMetadata() { lines.add("Author: Scribble"); lines.add("Title: 77 Buttons"); lines.add("##################################################"); - + List actual = extractMetadata(lines); - + List expected = new ArrayList<>(); expected.add("### General"); expected.add("Author: Scribble"); expected.add("Title: 77 Buttons"); - + assertIterableEquals(expected, actual); } - + /** * Test extracting metadata, but no metadata was encoded */ @@ -254,13 +257,13 @@ void testExtractEmptyMetadata() { lines.add("Flavor: beta"); lines.add("Extensions: desync_monitor, control_bytes, vanilla_commands"); lines.add("##################################################"); - + List actual = extractMetadata(lines); - + List expected = new ArrayList<>(); assertIterableEquals(expected, actual); } - + /** * Test deserialising metadata */ @@ -277,16 +280,16 @@ void testDeserialiseMetadata() { lines.add("z:3.0"); lines.add("pitch:4.0"); lines.add("yaw:5.0"); - + List actual = deserialiseMetadata(lines); - + List expected = new ArrayList<>(); LinkedHashMap first = new LinkedHashMap<>(); first.put("Author", "Scribble"); first.put("Title", "77 Buttons"); first.put("Playing Time", "00:00.0"); expected.add(PlaybackMetadata.fromHashMap("General", first)); - + LinkedHashMap second = new LinkedHashMap<>(); second.put("x", "1.0"); second.put("y", "2.0"); @@ -294,10 +297,10 @@ void testDeserialiseMetadata() { second.put("pitch", "4.0"); second.put("yaw", "5.0"); expected.add(PlaybackMetadata.fromHashMap("StartPosition", second)); - + assertIterableEquals(expected, actual); } - + /** * Test extracing ticks from some lines */ @@ -309,13 +312,13 @@ void testExtractTick() { lines.add("Flavor: beta"); lines.add("Extensions: desync_monitor, control_bytes, vanilla_commands"); lines.add("##################################################"); - lines.add("55|Keyboard:W,LCONTROL;w|Mouse:;0,887,626|Camera:17.85;-202.74799"); - lines.add("\t1|Keyboard:|Mouse:RC;0,1580,658|Camera:17.85;-202.74799"); - lines.add("\t2|Keyboard:|Mouse:;0,1580,658|Camera:17.85;-202.74799"); - lines.add("56|Keyboard:W,LCONTROL;w|Mouse:;0,887,626|Camera:17.85;-202.74799"); - lines.add("\t1|Keyboard:|Mouse:RC;0,1580,658|Camera:17.85;-202.74799"); - lines.add("\t2|Keyboard:|Mouse:;0,1580,658|Camera:17.85;-202.74799"); - + lines.add("55|W,LCONTROL;w|;0,887,626|17.85;-202.74799"); + lines.add("\t1||RC;0,1580,658|17.85;-202.74799"); + lines.add("\t2||;0,1580,658|17.85;-202.74799"); + lines.add("56|W,LCONTROL;w|;0,887,626|17.85;-202.74799"); + lines.add("\t1||RC;0,1580,658|17.85;-202.74799"); + lines.add("\t2||;0,1580,658|17.85;-202.74799"); + // Fill the actual with lists of the extracted ticks List> actual = new ArrayList<>(); // Also fill the actualIndex with the indices that are returned @@ -331,54 +334,88 @@ void testExtractTick() { // Fill expected List> expected = new ArrayList<>(); List tick1 = new ArrayList<>(); - tick1.add("55|Keyboard:W,LCONTROL;w|Mouse:;0,887,626|Camera:17.85;-202.74799"); - tick1.add("\t1|Keyboard:|Mouse:RC;0,1580,658|Camera:17.85;-202.74799"); - tick1.add("\t2|Keyboard:|Mouse:;0,1580,658|Camera:17.85;-202.74799"); + tick1.add("55|W,LCONTROL;w|;0,887,626|17.85;-202.74799"); + tick1.add("\t1||RC;0,1580,658|17.85;-202.74799"); + tick1.add("\t2||;0,1580,658|17.85;-202.74799"); List tick2 = new ArrayList<>(); - tick2.add("56|Keyboard:W,LCONTROL;w|Mouse:;0,887,626|Camera:17.85;-202.74799"); - tick2.add("\t1|Keyboard:|Mouse:RC;0,1580,658|Camera:17.85;-202.74799"); - tick2.add("\t2|Keyboard:|Mouse:;0,1580,658|Camera:17.85;-202.74799"); - + tick2.add("56|W,LCONTROL;w|;0,887,626|17.85;-202.74799"); + tick2.add("\t1||RC;0,1580,658|17.85;-202.74799"); + tick2.add("\t2||;0,1580,658|17.85;-202.74799"); + expected.add(tick1); expected.add(tick2); - + // Fill expectedIndex List expectedIndex = new ArrayList<>(); expectedIndex.add(6L); expectedIndex.add(9L); - + // C o m p a r e assertIterableEquals(expected, actual); assertIterableEquals(expectedIndex, actualIndex); } - + + /** + * Test deserialising a container a.k.a a tick + */ + @Test + @Disabled + void testDeserialiseContainer() { + BigArrayList actual = new BigArrayList<>(); + List tick = new ArrayList<>(); + tick.add("55|W,LCONTROL;w|;0,887,626|17.85;-202.74799"); + tick.add("\t1||RC;-15,1580,658|11.85;-2.74799"); + tick.add("\t2||;0,1580,658|45;-22.799"); + + deserialiseContainer(actual, tick); + + BigArrayList expected = new BigArrayList<>(); + + VirtualKeyboard keyboard = new VirtualKeyboard(); + keyboard.updateFromState(new int[] { VirtualKey.W.getKeycode(), VirtualKey.LCONTROL.getKeycode() }, new char[] { 'w' }); + + VirtualMouse mouse = new VirtualMouse(); + mouse.updateFromState(new int[] { VirtualKey.MOUSEMOVED.getKeycode() }, 0, 887, 626); + mouse.updateFromState(new int[] { VirtualKey.RC.getKeycode() }, -15, 1580, 658); + mouse.updateFromState(new int[] { VirtualKey.MOUSEMOVED.getKeycode() }, 0, 1580, 658); + + VirtualCameraAngle cameraAngle = new VirtualCameraAngle(); + cameraAngle.updateFromState(17.85F, -202.74799F); + cameraAngle.updateFromState(17.85F, -2.74799F); + cameraAngle.updateFromState(45F, -22.799F); + + expected.add(new TickInputContainer(keyboard, mouse, cameraAngle)); + + assertBigArrayList(expected, actual); + } + /** * Testing extracting the comment from the end of the line */ @Test void testExtractCommentEndline() { List actual = new ArrayList<>(); - extractComment(actual, "55|Keyboard:W,LCONTROL;|Mouse:;0,887,626|Camera:17.85;-202.74799 // Test", 65); - + extractCommentAtEnd(actual, "55|W,LCONTROL;|;0,887,626|17.85;-202.74799 // Test", 43); + List expected = new ArrayList<>(); expected.add("// Test"); assertIterableEquals(expected, actual); } - + /** * Test extracting the comment from the end of the line, but there is no comment */ @Test void testExtractCommentEndlineEmpty() { List actual = new ArrayList<>(); - extractComment(actual, "55|Keyboard:W,LCONTROL;//|Mouse:;0,887,626|Camera:17.85;-202.74799", 66); - + extractCommentAtEnd(actual, "55|W,LCONTROL;//|;0,887,626|17.85;-202.74799", 44); + List expected = new ArrayList<>(); expected.add(null); assertIterableEquals(expected, actual); } - + /** * Test splitting the stringd of inputs including subticks into it's elements */ @@ -388,39 +425,39 @@ void testSplitInputs() { tick.add("55|W,LCONTROL;w|;0,887,626|17.85;-202.74799"); tick.add("\t1||RC;0,1580,658|17.85;-202.74799 //Test"); tick.add("\t2||;0,1580,658|17.85;-202.74799"); - + List actualKeyboard = new ArrayList<>(); List actualMouse = new ArrayList<>(); List actualCameraAngle = new ArrayList<>(); List actualComment = new ArrayList<>(); - + splitInputs(tick, actualKeyboard, actualMouse, actualCameraAngle, actualComment); - + List expectedKeyboard = new ArrayList<>(); List expectedMouse = new ArrayList<>(); List expectedCameraAngle = new ArrayList<>(); List expectedComment = new ArrayList<>(); - + expectedKeyboard.add("W,LCONTROL;w"); - + expectedMouse.add(";0,887,626"); expectedMouse.add("RC;0,1580,658"); expectedMouse.add(";0,1580,658"); - + expectedCameraAngle.add("17.85;-202.74799"); expectedCameraAngle.add("17.85;-202.74799"); expectedCameraAngle.add("17.85;-202.74799"); - + expectedComment.add(null); expectedComment.add("//Test"); expectedComment.add(null); - + assertIterableEquals(actualKeyboard, expectedKeyboard); assertIterableEquals(expectedMouse, actualMouse); assertIterableEquals(expectedCameraAngle, actualCameraAngle); assertIterableEquals(expectedComment, actualComment); } - + /** * Test deserialising keyboard */ @@ -431,64 +468,127 @@ void testDeserialiseKeyboard() { tick.add("W;w"); tick.add("W,LCONTROL;"); tick.add("W,LCONTROL,S;s"); - + VirtualKeyboard actual = deserialiseKeyboard(tick); - + VirtualKeyboard expected = new VirtualKeyboard(); expected.updateFromEvent(VirtualKey.ZERO, false, 'a'); expected.updateFromEvent(VirtualKey.W, true, 'w'); expected.updateFromEvent(VirtualKey.LCONTROL, true, Character.MIN_VALUE); expected.updateFromEvent(VirtualKey.S, true, 's'); - + + assertEquals(expected, actual); + } + + /** + * Test deserialising mouse + */ + @Test + void testDeserialiseMouse() { + List tick = new ArrayList<>(); + tick.add(";0,0,0"); + tick.add("LC;0,12,35"); + tick.add("LC,MC;15,25,34"); + + VirtualMouse actual = deserialiseMouse(tick); + + VirtualMouse expected = new VirtualMouse(); + expected.updateFromEvent(VirtualKey.MOUSEMOVED, false, 0, 0, 0); + expected.updateFromEvent(VirtualKey.LC, true, 0, 12, 35); + expected.updateFromEvent(VirtualKey.MC, true, 15, 25, 34); + assertEquals(expected, actual); } - + + /** + * Test deserialising cameraAngle + */ + @Test + void testDeserialisingCameraAngle() { + List tick = new ArrayList<>(); + tick.add("19;-202.74799"); + tick.add("11.1241500;-2.799"); + tick.add("17.3;-202.79"); + + VirtualCameraAngle actual = deserialiseCameraAngle(tick); + + VirtualCameraAngle expected = new VirtualCameraAngle(); + expected.set(0, 0); + expected.updateFromEvent(19F, -202.74799F); + expected.updateFromEvent(11.1241500F - 19F, -2.799F + 202.74799F); + expected.updateFromEvent(17.3F - 11.1241500F, -202.79F + 2.799F); + + assertEquals(expected, actual); + } + + /** + * Test isNumeric + */ + @Test + void testIsNumeric() { + assertTrue(isNumeric("12")); + assertTrue(isNumeric("-12")); + assertFalse(isNumeric("-145.23")); + assertTrue(isNumeric(Long.toString(Integer.MAX_VALUE + 1L))); + } + + /** + * Test isFloat + */ + @Test + void testIsFloat() { + assertTrue(isFloat("12")); + assertTrue(isFloat("-12")); + assertTrue(isFloat("-145.23")); + assertTrue(isFloat(Long.toString(Integer.MAX_VALUE + 1L))); + } + @Test void testStringPaddingEven() { String actual = PlaybackFlavorBase.createCenteredHeading(null, '#', 52); String expected = "####################################################"; assertEquals(expected, actual); } - + @Test void testStringPaddingOdd() { String actual = PlaybackFlavorBase.createCenteredHeading(null, '#', 51); String expected = "###################################################"; assertEquals(expected, actual); } - + @Test void testCenterHeadingEven() { String actual = PlaybackFlavorBase.createCenteredHeading("TASfile", '#', 52); String expected = "###################### TASfile #####################"; assertEquals(expected, actual); } - + @Test void testCenterHeadingOdd() { String actual = PlaybackFlavorBase.createCenteredHeading("TASfile", '#', 51); String expected = "##################### TASfile #####################"; assertEquals(expected, actual); } - + @Test void testCenterHeadingEvenText() { String actual = PlaybackFlavorBase.createCenteredHeading("TASfiles", '#', 51); String expected = "##################### TASfiles ####################"; assertEquals(expected, actual); } - + @Test void testCenterHeadingEvenText2() { String actual = PlaybackFlavorBase.createCenteredHeading("Keystrokes", '#', 51); String expected = "#################### Keystrokes ###################"; assertEquals(expected, actual); } - + private void assertBigArrayList(BigArrayList expected, BigArrayList actual) { assertIterableEquals(convertBigArrayListToArrayList(expected), convertBigArrayListToArrayList(actual)); } - + private ArrayList convertBigArrayListToArrayList(BigArrayList list) { ArrayList out = new ArrayList<>(); for (long i = 0; i < list.size(); i++) { From 3a33f3b772f44f224a98247f09f9edbc7667096d Mon Sep 17 00:00:00 2001 From: Scribble Date: Wed, 22 May 2024 22:36:30 +0200 Subject: [PATCH 23/79] [PlaybackSerialiser] Split container deserialisation into comments and ticks - [PlaybackController] Renamed subticks in TickInputContainer to cameraAngle - [PlaybackController] Added equals to TickInputContainer --- .../playback/PlaybackControllerClient.java | 21 ++++++--- .../StartpositionMetadataExtension.java | 1 - .../tasfile/flavor/PlaybackFlavorBase.java | 45 ++++++++++++------- .../tasfile/PlaybackFlavorBaseTest.java | 5 +-- 4 files changed, 46 insertions(+), 26 deletions(-) diff --git a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java index 8da6c9eb..fe9c81a6 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java @@ -592,23 +592,23 @@ public static class TickInputContainer implements Serializable { private VirtualMouse mouse; - private VirtualCameraAngle subticks; + private VirtualCameraAngle cameraAngle; public TickInputContainer(VirtualKeyboard keyboard, VirtualMouse mouse, VirtualCameraAngle subticks) { this.keyboard = keyboard; this.mouse = mouse; - this.subticks = subticks; + this.cameraAngle = subticks; } public TickInputContainer() { this.keyboard = new VirtualKeyboard(); this.mouse = new VirtualMouse(); - this.subticks = new VirtualCameraAngle(); + this.cameraAngle = new VirtualCameraAngle(); } @Override public String toString() { - return keyboard.toString() + "|" + mouse.toString() + "|" + subticks.toString(); + return keyboard.toString() + "|" + mouse.toString() + "|" + cameraAngle.toString(); } public VirtualKeyboard getKeyboard() { @@ -620,12 +620,21 @@ public VirtualMouse getMouse() { } public VirtualCameraAngle getCameraAngle() { - return subticks; + return cameraAngle; } @Override public TickInputContainer clone() { - return new TickInputContainer(keyboard, mouse, subticks); + return new TickInputContainer(keyboard, mouse, cameraAngle); + } + + @Override + public boolean equals(Object other) { + if (other instanceof TickInputContainer) { + TickInputContainer container = (TickInputContainer) other; + return keyboard.equals(container.keyboard) || mouse.equals(container.mouse) || cameraAngle.equals(container.cameraAngle); + } + return super.equals(other); } } diff --git a/src/main/java/com/minecrafttas/tasmod/playback/metadata/integrated/StartpositionMetadataExtension.java b/src/main/java/com/minecrafttas/tasmod/playback/metadata/integrated/StartpositionMetadataExtension.java index a120421b..14b8150b 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/metadata/integrated/StartpositionMetadataExtension.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/metadata/integrated/StartpositionMetadataExtension.java @@ -154,7 +154,6 @@ public void onControllerStateChange(TASstate newstate, TASstate oldstate) { } } } - } @Override diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java index 31e7618f..ed3e4f93 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java @@ -34,22 +34,22 @@ public abstract class PlaybackFlavorBase { public abstract String flavorName(); - public String headerStart() { + protected String headerStart() { return createCenteredHeading("TASFile", '#', 50); } /** * @return The regex used for detecting comment lines */ - public String singleComment() { + protected String singleComment() { return "^//"; } - public String endlineComment() { + protected String endlineComment() { return "(//.+)"; } - public String headerEnd() { + protected String headerEnd() { return createPaddedString('#', 50); } @@ -282,7 +282,7 @@ public BigArrayList deserialise(BigArrayList lines, for (long i = startPos; i < lines.size(); i++) { List tick = new ArrayList<>(); // Extract the tick and set the index - i = extractTick(tick, lines, i); + i = extractContainer(tick, lines, i); // Extract container deserialiseContainer(out, tick); } @@ -290,14 +290,14 @@ public BigArrayList deserialise(BigArrayList lines, } /** - * Reads the next lines, until a full tick is reached + * Reads the next lines, until a full tickcontainer is reached * * @param extracted The extracted lines, passed in by reference * @param lines The line list * @param startPos The start position of this tick * @return The updated index for the next tick */ - protected long extractTick(List extracted, BigArrayList lines, long startPos) { + protected long extractContainer(List extracted, BigArrayList lines, long startPos) { boolean shouldStop = false; long counter = 0L; for (long i = startPos; i < lines.size(); i++) { @@ -317,20 +317,19 @@ protected long extractTick(List extracted, BigArrayList lines, l return startPos + counter - 1; } - protected void deserialiseContainer(BigArrayList out, List tickLines) { + protected void deserialiseContainer(BigArrayList out, List containerLines) { + List commentLines = new ArrayList<>(); + List tickLines = new ArrayList<>(); + + splitComments(containerLines, commentLines, tickLines); + List keyboardStrings = new ArrayList<>(); List mouseStrings = new ArrayList<>(); List cameraAngleStrings = new ArrayList<>(); List commentsAtEnd = new ArrayList<>(); - - for (String line : tickLines) { - if (contains(singleComment(), line)) { - continue; - } - - } - splitInputs(tickLines, keyboardStrings, mouseStrings, cameraAngleStrings, commentsAtEnd); + + splitInputs(containerLines, keyboardStrings, mouseStrings, cameraAngleStrings, commentsAtEnd); VirtualKeyboard keyboard = deserialiseKeyboard(keyboardStrings); VirtualMouse mouse = deserialiseMouse(mouseStrings); @@ -339,6 +338,20 @@ protected void deserialiseContainer(BigArrayList out, List lines, List comments, List tick) { + for(String line : lines) { + if(contains(singleComment(), line)) { + comments.add(line); + } else { + tick.add(line); + } + } + } protected VirtualKeyboard deserialiseKeyboard(List keyboardStrings) { VirtualKeyboard out = new VirtualKeyboard(); diff --git a/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java b/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java index 21d239d1..a75b610d 100644 --- a/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java +++ b/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java @@ -325,7 +325,7 @@ void testExtractTick() { List actualIndex = new ArrayList<>(); for (long i = 0; i < lines.size(); i++) { List tick = new ArrayList<>(); - long index = extractTick(tick, lines, i); + long index = extractContainer(tick, lines, i); i = index; actual.add(tick); actualIndex.add(index); @@ -360,7 +360,6 @@ void testExtractTick() { * Test deserialising a container a.k.a a tick */ @Test - @Disabled void testDeserialiseContainer() { BigArrayList actual = new BigArrayList<>(); List tick = new ArrayList<>(); @@ -382,7 +381,7 @@ void testDeserialiseContainer() { VirtualCameraAngle cameraAngle = new VirtualCameraAngle(); cameraAngle.updateFromState(17.85F, -202.74799F); - cameraAngle.updateFromState(17.85F, -2.74799F); + cameraAngle.updateFromState(11.85F, -2.74799F); cameraAngle.updateFromState(45F, -22.799F); expected.add(new TickInputContainer(keyboard, mouse, cameraAngle)); From f1fc94ef43ccc7eb835ca1e803889bc87f83b708 Mon Sep 17 00:00:00 2001 From: Scribble Date: Thu, 23 May 2024 22:41:31 +0200 Subject: [PATCH 24/79] [PlaybackSerialiser] Added test for splittingContainer - Renamed splitComments to splitContainer --- .../com/minecrafttas/tasmod/TASmodClient.java | 4 +-- .../tasfile/flavor/PlaybackFlavorBase.java | 19 ++++++------ .../{BetaFlavor.java => Beta1Flavor.java} | 2 +- .../tasmod/util/TASmodRegistry.java | 4 +-- .../tasfile/PlaybackFlavorBaseTest.java | 31 ++++++++++++++++++- .../tasfile/integrated/BetaFlavorTest.java | 4 +-- 6 files changed, 47 insertions(+), 17 deletions(-) rename src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/integrated/{BetaFlavor.java => Beta1Flavor.java} (92%) diff --git a/src/main/java/com/minecrafttas/tasmod/TASmodClient.java b/src/main/java/com/minecrafttas/tasmod/TASmodClient.java index e07aa70c..d0334be0 100644 --- a/src/main/java/com/minecrafttas/tasmod/TASmodClient.java +++ b/src/main/java/com/minecrafttas/tasmod/TASmodClient.java @@ -27,7 +27,7 @@ import com.minecrafttas.tasmod.playback.metadata.integrated.CreditsMetadataExtension; import com.minecrafttas.tasmod.playback.metadata.integrated.StartpositionMetadataExtension; import com.minecrafttas.tasmod.playback.tasfile.PlaybackSerialiser; -import com.minecrafttas.tasmod.playback.tasfile.flavor.integrated.BetaFlavor; +import com.minecrafttas.tasmod.playback.tasfile.flavor.integrated.Beta1Flavor; import com.minecrafttas.tasmod.savestates.SavestateHandlerClient; import com.minecrafttas.tasmod.tickratechanger.TickrateChangerClient; import com.minecrafttas.tasmod.ticksync.TickSyncClient; @@ -290,7 +290,7 @@ private void registerPlaybackMetadata(Minecraft mc) { TASmodRegistry.PLAYBACK_METADATA.register(startpositionMetadataExtension); } - public static BetaFlavor betaFlavor = new BetaFlavor(); + public static Beta1Flavor betaFlavor = new Beta1Flavor(); private void registerSerialiserFlavors(Minecraft mc) { TASmodRegistry.SERIALISER_FLAVOR.register(betaFlavor); diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java index ed3e4f93..7679645a 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java @@ -321,14 +321,14 @@ protected void deserialiseContainer(BigArrayList out, List commentLines = new ArrayList<>(); List tickLines = new ArrayList<>(); - - splitComments(containerLines, commentLines, tickLines); - + + splitContainer(containerLines, commentLines, tickLines); + List keyboardStrings = new ArrayList<>(); List mouseStrings = new ArrayList<>(); List cameraAngleStrings = new ArrayList<>(); List commentsAtEnd = new ArrayList<>(); - + splitInputs(containerLines, keyboardStrings, mouseStrings, cameraAngleStrings, commentsAtEnd); VirtualKeyboard keyboard = deserialiseKeyboard(keyboardStrings); @@ -338,14 +338,15 @@ protected void deserialiseContainer(BigArrayList out, List lines, List comments, List tick) { - for(String line : lines) { - if(contains(singleComment(), line)) { + protected void splitContainer(List lines, List comments, List tick) { + for (String line : lines) { + if (contains(singleComment(), line)) { comments.add(line); } else { tick.add(line); diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/integrated/BetaFlavor.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/integrated/Beta1Flavor.java similarity index 92% rename from src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/integrated/BetaFlavor.java rename to src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/integrated/Beta1Flavor.java index 85c20f97..c209ed6d 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/integrated/BetaFlavor.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/integrated/Beta1Flavor.java @@ -7,7 +7,7 @@ import com.minecrafttas.tasmod.virtual.VirtualKeyboard; import com.minecrafttas.tasmod.virtual.VirtualMouse; -public class BetaFlavor extends PlaybackFlavorBase { +public class Beta1Flavor extends PlaybackFlavorBase { @Override public String flavorName() { diff --git a/src/main/java/com/minecrafttas/tasmod/util/TASmodRegistry.java b/src/main/java/com/minecrafttas/tasmod/util/TASmodRegistry.java index 2ad5afad..d260ad88 100644 --- a/src/main/java/com/minecrafttas/tasmod/util/TASmodRegistry.java +++ b/src/main/java/com/minecrafttas/tasmod/util/TASmodRegistry.java @@ -3,7 +3,7 @@ import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadataRegistry; import com.minecrafttas.tasmod.playback.tasfile.flavor.PlaybackFlavorBase; import com.minecrafttas.tasmod.playback.tasfile.flavor.PlaybackFlavorRegistry; -import com.minecrafttas.tasmod.playback.tasfile.flavor.integrated.BetaFlavor; +import com.minecrafttas.tasmod.playback.tasfile.flavor.integrated.Beta1Flavor; public class TASmodRegistry { /** @@ -20,7 +20,7 @@ public class TASmodRegistry { * Registry for registering custom seialiser flavors that dictate the syntax of the inputs stored in the TASfile.
*
* Either create a new flavor by extending {@link PlaybackFlavorBase}
- * or extend an existing flavor (like {@link BetaFlavor}) and overwrite parts of the methods.
+ * or extend an existing flavor (like {@link Beta1Flavor}) and overwrite parts of the methods.
*
* The resulting flavor can be registered here and can be found as a saving option with /saveTAS */ diff --git a/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java b/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java index a75b610d..66e6822c 100644 --- a/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java +++ b/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java @@ -11,7 +11,6 @@ import java.util.LinkedHashMap; import java.util.List; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import com.dselent.bigarraylist.BigArrayList; @@ -457,6 +456,36 @@ void testSplitInputs() { assertIterableEquals(expectedComment, actualComment); } + /** + * Test split container + */ + @Test + void testSplitContainer() { + List lines = new ArrayList<>(); + lines.add("// $interpolation(on);"); + lines.add("// Test"); + lines.add("55|W,LCONTROL;w|;0,887,626|17.85;-202.74799"); + lines.add("\t1||RC;-15,1580,658|11.85;-2.74799"); + lines.add("\t2||;0,1580,658|45;-22.799"); + + List actualComments = new ArrayList<>(); + List actualTick = new ArrayList<>(); + + splitContainer(lines, actualComments, actualTick); + + List expectedComments = new ArrayList<>(); + List expectedTicks = new ArrayList<>(); + expectedComments.add("// $interpolation(on);"); + expectedComments.add("// Test"); + + expectedTicks.add("55|W,LCONTROL;w|;0,887,626|17.85;-202.74799"); + expectedTicks.add("\t1||RC;-15,1580,658|11.85;-2.74799"); + expectedTicks.add("\t2||;0,1580,658|45;-22.799"); + + assertIterableEquals(expectedComments, actualComments); + assertIterableEquals(expectedTicks, actualTick); + } + /** * Test deserialising keyboard */ diff --git a/src/test/java/tasmod/playback/tasfile/integrated/BetaFlavorTest.java b/src/test/java/tasmod/playback/tasfile/integrated/BetaFlavorTest.java index 298c3ff8..3c0f23b6 100644 --- a/src/test/java/tasmod/playback/tasfile/integrated/BetaFlavorTest.java +++ b/src/test/java/tasmod/playback/tasfile/integrated/BetaFlavorTest.java @@ -7,12 +7,12 @@ import org.junit.jupiter.api.Test; import com.minecrafttas.tasmod.playback.tasfile.PlaybackSerialiser2; -import com.minecrafttas.tasmod.playback.tasfile.flavor.integrated.BetaFlavor; +import com.minecrafttas.tasmod.playback.tasfile.flavor.integrated.Beta1Flavor; import com.minecrafttas.tasmod.util.TASmodRegistry; public class BetaFlavorTest { - private BetaFlavor flavor = new BetaFlavor(); + private Beta1Flavor flavor = new Beta1Flavor(); private File file = new File("src/test/resources/betaflavor"); From 86b7c4a6f451786fdd41cafa757ba6d17e71d642 Mon Sep 17 00:00:00 2001 From: Scribble Date: Sat, 25 May 2024 12:11:43 +0200 Subject: [PATCH 25/79] [PlaybackSerialiser] Start rewriting playbackserialiser --- .../playback/tasfile/PlaybackSerialiser2.java | 108 +++++++++--------- .../tasfile/flavor/PlaybackFlavorBase.java | 4 +- .../tasfile/PlaybackFlavorBaseTest.java | 4 +- 3 files changed, 60 insertions(+), 56 deletions(-) diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java index aad269a6..8008113f 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java @@ -27,7 +27,7 @@ */ public class PlaybackSerialiser2 { - private static String defaultFlavor = "beta"; + private static String defaultFlavor = "beta1"; /** * Saves the {@link PlaybackControllerClient} to a file @@ -35,7 +35,7 @@ public class PlaybackSerialiser2 { * @param file The file to save the serialised inputs to. * @param controller * @param flavor - * @throws FileNotFoundException + * @throws FileNotFoundException */ public static void saveToFile(File file, PlaybackControllerClient controller, String flavorname) throws FileNotFoundException { if (controller == null) { @@ -43,52 +43,52 @@ public static void saveToFile(File file, PlaybackControllerClient controller, St } saveToFile(file, controller.getInputs(), flavorname); } - + public static void saveToFile(File file, BigArrayList container, String flavorname) throws FileNotFoundException { if (file == null) { throw new NullPointerException("Save to file failed. No file specified"); } - + if (container == null) { throw new NullPointerException("Save to file failed. No tickcontainer list specified"); } - + if (flavorname == null) { flavorname = defaultFlavor; } - + FileThread writerThread = new FileThread(file, false); - + PlaybackFlavorBase flavor = TASmodRegistry.SERIALISER_FLAVOR.getFlavor(flavorname); - + List metadataList = TASmodRegistry.PLAYBACK_METADATA.handleOnStore(); - + for (String line : flavor.serialiseHeader(metadataList)) { writerThread.addLine(line); } - + BigArrayList tickLines = flavor.serialise(container); for (long i = 0; i < tickLines.size(); i++) { writerThread.addLine(tickLines.get(i)); } - + writerThread.close(); } - + /** * Loads the {@link PlaybackControllerClient} from a file + * * @param file The file to load from * @return The loaded {@link PlaybackControllerClient} - * @throws IOException + * @throws IOException */ - public static PlaybackControllerClient loadFromFile(File file) throws IOException { + public static PlaybackControllerClient loadFromFile(File file, String flavorName) throws PlaybackLoadException, IOException { if (file == null) { - throw new NullPointerException("Load from file failed. No file specified"); + throw new PlaybackLoadException("Load from file failed. No file specified"); } - + // Read file - BigArrayList lines = new BigArrayList<>(); - BufferedReader reader= null; + BufferedReader reader = null; try { reader = new BufferedReader(new FileReader(file)); @@ -96,57 +96,61 @@ public static PlaybackControllerClient loadFromFile(File file) throws IOExceptio e.printStackTrace(); return null; } - + + List lines = new ArrayList<>(); String line = null; - while((line = reader.readLine()) != null) { - lines.add(line); + + for (int i = 0; i < 100; i++) { + + line = reader.readLine(); + + if (line != null) { + lines.add(line); + } } reader.close(); - - // Determine what the tasfile flavor is - List headertest = null; - try { - headertest = subsetBigArrayList(lines, 0, 100); // Extract first 100 lines - } catch (Exception e) { - e.printStackTrace(); + + PlaybackFlavorBase flavor = null; + + if (flavorName == null || flavorName.isEmpty()) { + flavor = searchForFlavor(lines, TASmodRegistry.SERIALISER_FLAVOR.getFlavors()); // Test for the correct flavor on the first 100 lines + } - - PlaybackFlavorBase flavor = searchForFlavor(headertest, TASmodRegistry.SERIALISER_FLAVOR.getFlavors()); // Test for the correct flavor on the first 100 lines - + // Deserialise header - List headerLines = flavor.extractHeader(lines); // Extract the header for easier processing - - TASmodRegistry.PLAYBACK_METADATA.handleOnLoad(flavor.deserialiseMetadata(headerLines)); // Read metadata and fire loadEvent - + List headerLines = flavor.extractHeader(lines); // Extract the header for easier processing + + TASmodRegistry.PLAYBACK_METADATA.handleOnLoad(flavor.deserialiseMetadata(headerLines)); // Read metadata and fire loadEvent + // Deserialise content - + return null; } - + private static List subsetBigArrayList(BigArrayList list, long startIndex, long stopIndex) throws Exception { List out = new ArrayList<>(); - - if(startIndex < 0) - throw new Exception("Cannot subset big arraylist. StartIndex has to be positive: "+ startIndex); - - if(startIndex > stopIndex) + + if (startIndex < 0) + throw new Exception("Cannot subset big arraylist. StartIndex has to be positive: " + startIndex); + + if (startIndex > stopIndex) throw new Exception("Cannot subset big arraylist. StartIndex is bigger than StopIndex:" + startIndex + " " + stopIndex); - - if(startIndex >= list.size()) + + if (startIndex >= list.size()) throw new Exception("Cannot subset big arraylist. StartIndex is bigger than the big arraylist" + startIndex + " " + list.size()); - - if(stopIndex >= list.size()) - stopIndex = list.size()-1; - + + if (stopIndex >= list.size()) + stopIndex = list.size() - 1; + for (long i = startIndex; i < stopIndex; i++) { - out.add(list.get(i)); + out.add(list.get(i)); } return out; } - + public static PlaybackFlavorBase searchForFlavor(List lines, List flavorList) { - for(PlaybackFlavorBase flavor : flavorList) { - if(flavor.deserialiseFlavorName(lines)) { + for (PlaybackFlavorBase flavor : flavorList) { + if (flavor.deserialiseFlavorName(lines)) { return flavor; } } diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java index 7679645a..3f551f07 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java @@ -186,9 +186,9 @@ public boolean deserialiseFlavorName(List header) { return false; } - public List extractHeader(BigArrayList lines) { + public List extractHeader(List lines) { List extracted = new ArrayList<>(); - for (long i = 0; i < lines.size(); i++) { + for (int i = 0; i < lines.size(); i++) { String line = lines.get(i); extracted.add(line); diff --git a/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java b/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java index 66e6822c..d939931f 100644 --- a/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java +++ b/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java @@ -178,7 +178,7 @@ void testSerialiseContainer() { @Test void testExtractHeader() { - BigArrayList lines = new BigArrayList<>(); + List lines = new ArrayList<>(); lines.add("###### TASfile ######"); lines.add("Flavor: beta"); lines.add("Extensions: desync_monitor, control_bytes, vanilla_commands"); @@ -205,7 +205,7 @@ void testExtractHeader() { @Test void testExtractHeaderFail() { - BigArrayList lines = new BigArrayList<>(); + List lines = new ArrayList<>(); lines.add("###### TASfile ######"); lines.add("Flavor: beta"); lines.add("Extensions: desync_monitor, control_bytes, vanilla_commands"); From a3c4faf55710e3911b0d5d423a7ffbc7e1b9b1c9 Mon Sep 17 00:00:00 2001 From: Scribble Date: Sat, 25 May 2024 23:36:30 +0200 Subject: [PATCH 26/79] [PlaybackSerialiser] Finished PlaybackSerialiser, started adding tests --- .../metadata/PlaybackMetadataRegistry.java | 2 + .../playback/tasfile/PlaybackSerialiser2.java | 94 +++++++++----- .../tasfile/flavor/PlaybackFlavorBase.java | 15 ++- .../minecrafttas/tasmod/util/FileThread.java | 2 +- .../tasmod/virtual/VirtualMouse.java | 10 +- .../tasmod/virtual/VirtualPeripheral.java | 6 +- .../tasfile/PlaybackFlavorBaseTest.java | 4 +- .../tasfile/PlaybackSerialiserTest.java | 116 +++++++++++++++++- src/test/resources/betaflavor/.gitkeep | 0 src/test/resources/metadata/.gitkeep | 0 src/test/resources/serialiser/.gitkeep | 0 11 files changed, 207 insertions(+), 42 deletions(-) create mode 100644 src/test/resources/betaflavor/.gitkeep create mode 100644 src/test/resources/metadata/.gitkeep create mode 100644 src/test/resources/serialiser/.gitkeep diff --git a/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadataRegistry.java b/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadataRegistry.java index 19d73d9e..63004ccf 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadataRegistry.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadataRegistry.java @@ -67,6 +67,8 @@ public List handleOnStore() { } public void handleOnLoad(List meta) { + if(meta.isEmpty()) + return; for(PlaybackMetadata metadata : meta) { if(REGISTRY.containsKey(metadata.getExtensionName())) { PlaybackMetadataExtension extension = REGISTRY.get(metadata.getExtensionName()); diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java index 8008113f..2366ead9 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java @@ -10,6 +10,8 @@ import java.util.List; import com.dselent.bigarraylist.BigArrayList; +import com.minecrafttas.tasmod.TASmod; +import com.minecrafttas.tasmod.TASmodClient; import com.minecrafttas.tasmod.playback.PlaybackControllerClient; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickInputContainer; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata; @@ -58,6 +60,7 @@ public static void saveToFile(File file, BigArrayList contai } FileThread writerThread = new FileThread(file, false); + writerThread.start(); PlaybackFlavorBase flavor = TASmodRegistry.SERIALISER_FLAVOR.getFlavor(flavorname); @@ -82,7 +85,7 @@ public static void saveToFile(File file, BigArrayList contai * @return The loaded {@link PlaybackControllerClient} * @throws IOException */ - public static PlaybackControllerClient loadFromFile(File file, String flavorName) throws PlaybackLoadException, IOException { + public static BigArrayList loadFromFile(File file) throws PlaybackLoadException, IOException { if (file == null) { throw new PlaybackLoadException("Load from file failed. No file specified"); } @@ -112,42 +115,77 @@ public static PlaybackControllerClient loadFromFile(File file, String flavorName PlaybackFlavorBase flavor = null; - if (flavorName == null || flavorName.isEmpty()) { - flavor = searchForFlavor(lines, TASmodRegistry.SERIALISER_FLAVOR.getFlavors()); // Test for the correct flavor on the first 100 lines - - } - - // Deserialise header - List headerLines = flavor.extractHeader(lines); // Extract the header for easier processing + flavor = searchForFlavor(lines, TASmodRegistry.SERIALISER_FLAVOR.getFlavors()); // Test for the correct flavor on the first 100 lines - TASmodRegistry.PLAYBACK_METADATA.handleOnLoad(flavor.deserialiseMetadata(headerLines)); // Read metadata and fire loadEvent - - // Deserialise content - - return null; + return loadFromFile(file, flavor); } - private static List subsetBigArrayList(BigArrayList list, long startIndex, long stopIndex) throws Exception { - List out = new ArrayList<>(); - - if (startIndex < 0) - throw new Exception("Cannot subset big arraylist. StartIndex has to be positive: " + startIndex); - - if (startIndex > stopIndex) - throw new Exception("Cannot subset big arraylist. StartIndex is bigger than StopIndex:" + startIndex + " " + stopIndex); + public static BigArrayList loadFromFile(File file, String flavorName) throws PlaybackLoadException, IOException { + if(flavorName == null || flavorName.isEmpty()) { + throw new PlaybackLoadException("Flavor name is null or empty"); + } + + PlaybackFlavorBase flavor = TASmodRegistry.SERIALISER_FLAVOR.getFlavor(flavorName); + + if (flavor == null) { + throw new PlaybackLoadException("Flavor name %s doesn't exist.", flavorName); + } + + return loadFromFile(file, flavor); + } + + public static BigArrayList loadFromFile(File file, PlaybackFlavorBase flavor) throws PlaybackLoadException, IOException { + // Read file + BufferedReader reader = null; - if (startIndex >= list.size()) - throw new Exception("Cannot subset big arraylist. StartIndex is bigger than the big arraylist" + startIndex + " " + list.size()); + try { + reader = new BufferedReader(new FileReader(file)); + } catch (FileNotFoundException e) { + e.printStackTrace(); + return null; + } - if (stopIndex >= list.size()) - stopIndex = list.size() - 1; + BigArrayList lines = new BigArrayList<>(); + String line = null; - for (long i = startIndex; i < stopIndex; i++) { - out.add(list.get(i)); + while ((line = reader.readLine()) != null) { + lines.add(line); } - return out; + + reader.close(); + + // Deserialise Metadata + List headerLines = flavor.extractHeader(lines); + List deserialisedMetadata = flavor.deserialiseMetadata(headerLines); + TASmodRegistry.PLAYBACK_METADATA.handleOnLoad(deserialisedMetadata); + + // Deserialise main data + BigArrayList deserialisedContainers = flavor.deserialise(lines, headerLines.size()); + + return deserialisedContainers; } +// private static List subsetBigArrayList(BigArrayList list, long startIndex, long stopIndex) throws Exception { +// List out = new ArrayList<>(); +// +// if (startIndex < 0) +// throw new Exception("Cannot subset big arraylist. StartIndex has to be positive: " + startIndex); +// +// if (startIndex > stopIndex) +// throw new Exception("Cannot subset big arraylist. StartIndex is bigger than StopIndex:" + startIndex + " " + stopIndex); +// +// if (startIndex >= list.size()) +// throw new Exception("Cannot subset big arraylist. StartIndex is bigger than the big arraylist" + startIndex + " " + list.size()); +// +// if (stopIndex >= list.size()) +// stopIndex = list.size() - 1; +// +// for (long i = startIndex; i < stopIndex; i++) { +// out.add(list.get(i)); +// } +// return out; +// } + public static PlaybackFlavorBase searchForFlavor(List lines, List flavorList) { for (PlaybackFlavorBase flavor : flavorList) { if (flavor.deserialiseFlavorName(lines)) { diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java index 3f551f07..6b8bf45e 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java @@ -65,9 +65,11 @@ protected String headerEnd() { public List serialiseHeader(List metadataList) { List out = new ArrayList<>(); + out.add(headerStart()); serialiseFlavorName(out); // out.add(serializeExtensionNames()); serialiseMetadata(out, metadataList); + out.add(headerEnd()); return out; } @@ -186,9 +188,14 @@ public boolean deserialiseFlavorName(List header) { return false; } - public List extractHeader(List lines) { + public List extractHeader(BigArrayList lines) { List extracted = new ArrayList<>(); - for (int i = 0; i < lines.size(); i++) { + + long maxExtract = 1000; + + maxExtract = lines.size() < maxExtract ? lines.size() : maxExtract; + + for (long i = 0; i < maxExtract; i++) { String line = lines.get(i); extracted.add(line); @@ -215,6 +222,10 @@ public List deserialiseMetadata(List headerLines) { String metadataName = null; Pair pair = null; LinkedHashMap values = new LinkedHashMap<>(); + + if(metadataLines.isEmpty()) + return new ArrayList<>(); + for (String metadataLine : metadataLines) { String newMetadataName = deserialiseMetadataName(metadataLine); diff --git a/src/main/java/com/minecrafttas/tasmod/util/FileThread.java b/src/main/java/com/minecrafttas/tasmod/util/FileThread.java index 759c5af1..1ac9c31c 100644 --- a/src/main/java/com/minecrafttas/tasmod/util/FileThread.java +++ b/src/main/java/com/minecrafttas/tasmod/util/FileThread.java @@ -27,7 +27,7 @@ public FileThread(File fileLocation, boolean append) throws FileNotFoundExceptio public void addLine(String line) { synchronized (output) { - output.add(line); + output.add(line + "\n"); } } diff --git a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualMouse.java b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualMouse.java index 2a9bbb76..5399f4bf 100644 --- a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualMouse.java +++ b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualMouse.java @@ -63,7 +63,7 @@ public VirtualMouse(Set pressedKeys, int scrollWheel, int cursorX, int * @param cursorY The {@link #cursorY} * @param subtickList The {@link VirtualPeripheral#subtickList} */ - public VirtualMouse(Set pressedKeys, int scrollWheel, Integer cursorX, Integer cursorY, List subtickList) { + public VirtualMouse(Set pressedKeys, int scrollWheel, int cursorX, int cursorY, List subtickList) { this(pressedKeys, scrollWheel, cursorX, cursorY, subtickList, false); } @@ -77,7 +77,7 @@ public VirtualMouse(Set pressedKeys, int scrollWheel, Integer cursorX, * @param subtickList The {@link VirtualPeripheral#subtickList} * @param ignoreFirstUpdate Whether the first call to {@link #updateFromEvent(int, boolean, int, Integer, Integer)} should create a new subtick */ - public VirtualMouse(Set pressedKeys, int scrollWheel, Integer cursorX, Integer cursorY, List subtickList, boolean ignoreFirstUpdate) { + public VirtualMouse(Set pressedKeys, int scrollWheel, int cursorX, int cursorY, List subtickList, boolean ignoreFirstUpdate) { super(pressedKeys, subtickList, ignoreFirstUpdate); this.scrollWheel = scrollWheel; this.cursorX = cursorX; @@ -94,7 +94,7 @@ public VirtualMouse(Set pressedKeys, int scrollWheel, Integer cursorX, * @param cursorX The pointer location in the x axis * @param cursorY The pointer location in the y axis */ - public void updateFromEvent(int keycode, boolean keystate, int scrollwheel, Integer cursorX, Integer cursorY) { + public void updateFromEvent(int keycode, boolean keystate, int scrollwheel, int cursorX, int cursorY) { createSubtick(); setPressed(keycode, keystate); this.scrollWheel = scrollwheel; @@ -113,7 +113,7 @@ public void updateFromEvent(int keycode, boolean keystate, int scrollwheel, Inte * @param cursorX The pointer location in the x axis * @param cursorY The pointer location in the y axis */ - public void updateFromEvent(VirtualKey key, boolean keystate, int scrollwheel, Integer cursorX, Integer cursorY) { + public void updateFromEvent(VirtualKey key, boolean keystate, int scrollwheel, int cursorX, int cursorY) { updateFromEvent(key.getKeycode(), keystate, scrollwheel, cursorX, cursorY); } @@ -133,7 +133,7 @@ public void updateFromEvent(VirtualKey key, boolean keystate, int scrollwheel, I * @param cursorY The pointer location in the y axis * @see PlaybackFlavorBase#deserialiseMouse */ - public void updateFromState(int[] keycodes, int scrollwheel, Integer cursorX, Integer cursorY) { + public void updateFromState(int[] keycodes, int scrollwheel, int cursorX, int cursorY) { createSubtick(); this.pressedKeys.clear(); diff --git a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualPeripheral.java b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualPeripheral.java index e194a4b0..48a307a6 100644 --- a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualPeripheral.java +++ b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualPeripheral.java @@ -136,7 +136,7 @@ public boolean equals(Object obj) { /** * Moves the data from another virtual peripheral into this peripheral without creating a new object.
* Deletes the data in the other peripheral.
- * Ignores {@link com.minecrafttas.tasmod.virtual.Subtickable.subtickList} + * Ignores {@link com.minecrafttas.tasmod.virtual.Subtickable.subtickList subtickList} * * @param peripheral The peripheral to move from */ @@ -151,7 +151,7 @@ protected void moveFrom(T peripheral) { /** * Copies the data from another virtual peripheral into this peripheral without creating a new object.
* Does not delete the data from the other peripehral.
- * Ignores {@link com.minecrafttas.tasmod.virtual.Subtickable.subtickList} + * Ignores the {@link com.minecrafttas.tasmod.virtual.Subtickable.subtickList subtickList} * * @param peripheral The peripheral to copy from */ @@ -163,7 +163,7 @@ protected void copyFrom(T peripheral) { } /** - * Copies the data from another virtual peripheral similar to {@link #copyFrom(VirtualPeripheral)}, but including the {@link com.minecrafttas.tasmod.virtual.Subtickable.subtickList} + * Copies the data from another virtual peripheral similar to {@link #copyFrom(VirtualPeripheral) copyFrom}, but including the {@link com.minecrafttas.tasmod.virtual.Subtickable.subtickList subtickList} * @param peripheral */ protected void deepCopyFrom(T peripheral) { diff --git a/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java b/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java index d939931f..66e6822c 100644 --- a/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java +++ b/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java @@ -178,7 +178,7 @@ void testSerialiseContainer() { @Test void testExtractHeader() { - List lines = new ArrayList<>(); + BigArrayList lines = new BigArrayList<>(); lines.add("###### TASfile ######"); lines.add("Flavor: beta"); lines.add("Extensions: desync_monitor, control_bytes, vanilla_commands"); @@ -205,7 +205,7 @@ void testExtractHeader() { @Test void testExtractHeaderFail() { - List lines = new ArrayList<>(); + BigArrayList lines = new BigArrayList<>(); lines.add("###### TASfile ######"); lines.add("Flavor: beta"); lines.add("Extensions: desync_monitor, control_bytes, vanilla_commands"); diff --git a/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java b/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java index f8c20d84..cc5eb200 100644 --- a/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java +++ b/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java @@ -1,8 +1,122 @@ package tasmod.playback.tasfile; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertIterableEquals; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.Serializable; +import java.util.ArrayList; + +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import com.dselent.bigarraylist.BigArrayList; +import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickInputContainer; +import com.minecrafttas.tasmod.playback.tasfile.PlaybackSerialiser2; +import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackLoadException; +import com.minecrafttas.tasmod.playback.tasfile.flavor.PlaybackFlavorBase; +import com.minecrafttas.tasmod.util.TASmodRegistry; +import com.minecrafttas.tasmod.virtual.VirtualCameraAngle; +import com.minecrafttas.tasmod.virtual.VirtualKey; +import com.minecrafttas.tasmod.virtual.VirtualKeyboard; +import com.minecrafttas.tasmod.virtual.VirtualMouse; public class PlaybackSerialiserTest { + private static class TestFlavor extends PlaybackFlavorBase { + + @Override + public String flavorName() { + return "Test"; + } + + } + + File file = new File("src/test/resources/serialiser/PlaybackSerialiserTest.mctas"); + + private static TestFlavor testFlavor = new TestFlavor(); + @BeforeAll + static void register() { + TASmodRegistry.SERIALISER_FLAVOR.register(testFlavor); + } + + @AfterAll + static void unregister() { + TASmodRegistry.SERIALISER_FLAVOR.unregister(testFlavor); + } + + @Test + void testSerialiser() { + BigArrayList expected = new BigArrayList<>(); + + // Tick 1 + + // Keyboard + VirtualKeyboard keyboard1 = new VirtualKeyboard(); + keyboard1.updateFromEvent(VirtualKey.W, true, 'w'); + keyboard1.updateFromEvent(VirtualKey.LCONTROL, true, (char)0); + + // Mouse + VirtualMouse mouse1 = new VirtualMouse(); + mouse1.updateFromEvent(VirtualKey.MOUSEMOVED, false, 15, 0, 0); + mouse1.updateFromEvent(VirtualKey.LC, true, 0, 0, 0); + + // CameraAngle + VirtualCameraAngle angle1 = new VirtualCameraAngle(); + angle1.set(0, 0); + angle1.updateFromEvent(10, 10); + + expected.add(new TickInputContainer(keyboard1, mouse1, angle1)); + + // Tick 2 + + // Keyboard + VirtualKeyboard keyboard2 = new VirtualKeyboard(); + keyboard2.copyFrom(keyboard1); + keyboard2.updateFromEvent(VirtualKey.W, false, (char)0); + keyboard2.updateFromEvent(VirtualKey.LCONTROL, false, (char)0); + + // Mouse + VirtualMouse mouse2 = new VirtualMouse(); + mouse2.copyFrom(mouse1); + mouse2.updateFromEvent(VirtualKey.MOUSEMOVED, false, 0, 14, 15); + mouse2.updateFromEvent(VirtualKey.LC, false, 0, 0, 0); + + // CameraAngle + VirtualCameraAngle angle2 = new VirtualCameraAngle(); + angle2.deepCopyFrom(angle1); + angle2.updateFromEvent(-10, -10); + + expected.add(new TickInputContainer(keyboard2, mouse2, angle2)); + + try { + PlaybackSerialiser2.saveToFile(file, expected, "Test"); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + + try { + BigArrayList actual = PlaybackSerialiser2.loadFromFile(file, testFlavor); + assertBigArrayList(expected, actual); + } catch (PlaybackLoadException | IOException e) { + e.printStackTrace(); + } finally { + file.delete(); + } + } + + private void assertBigArrayList(BigArrayList expected, BigArrayList actual) { + assertIterableEquals(convertBigArrayListToArrayList(expected), convertBigArrayListToArrayList(actual)); + } + + private ArrayList convertBigArrayListToArrayList(BigArrayList list) { + ArrayList out = new ArrayList<>(); + for (long i = 0; i < list.size(); i++) { + out.add(list.get(i)); + } + return out; + } } diff --git a/src/test/resources/betaflavor/.gitkeep b/src/test/resources/betaflavor/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/src/test/resources/metadata/.gitkeep b/src/test/resources/metadata/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/src/test/resources/serialiser/.gitkeep b/src/test/resources/serialiser/.gitkeep new file mode 100644 index 00000000..e69de29b From 16e7b4ac6f7866cebc7d2892c9ea1dd16997f7d3 Mon Sep 17 00:00:00 2001 From: Scribble Date: Sun, 26 May 2024 11:40:32 +0200 Subject: [PATCH 27/79] [PlaybackSerialiser] Renamed PlaybackFlavorBase to SerialiserFlavorBase - Renamed PlaybackFlavorRegistry to SerialiserFlavorRegistry - Renamed PlaybackFlavorBaseTest to SerialiserFlavorBaseTest --- .../playback/PlaybackControllerClient.java | 4 ++-- .../playback/tasfile/PlaybackSerialiser2.java | 14 +++++++------- ...FlavorBase.java => SerialiserFlavorBase.java} | 2 +- ...gistry.java => SerialiserFlavorRegistry.java} | 14 +++++++------- .../tasfile/flavor/integrated/Beta1Flavor.java | 4 ++-- .../minecrafttas/tasmod/util/TASmodRegistry.java | 8 ++++---- .../tasmod/virtual/VirtualKeyboard.java | 4 ++-- .../tasmod/virtual/VirtualMouse.java | 4 ++-- .../playback/tasfile/PlaybackSerialiserTest.java | 4 ++-- ...seTest.java => SerialiserFlavorBaseTest.java} | 16 ++++++++-------- 10 files changed, 37 insertions(+), 37 deletions(-) rename src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/{PlaybackFlavorBase.java => SerialiserFlavorBase.java} (99%) rename src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/{PlaybackFlavorRegistry.java => SerialiserFlavorRegistry.java} (78%) rename src/test/java/tasmod/playback/tasfile/{PlaybackFlavorBaseTest.java => SerialiserFlavorBaseTest.java} (96%) diff --git a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java index fe9c81a6..7ff45f28 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java @@ -43,7 +43,7 @@ import com.minecrafttas.tasmod.networking.TASmodPackets; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata; import com.minecrafttas.tasmod.playback.tasfile.PlaybackSerialiser; -import com.minecrafttas.tasmod.playback.tasfile.flavor.PlaybackFlavorBase; +import com.minecrafttas.tasmod.playback.tasfile.flavor.SerialiserFlavorBase; import com.minecrafttas.tasmod.util.LoggerMarkers; import com.minecrafttas.tasmod.util.Scheduler.Task; import com.minecrafttas.tasmod.util.TASmodRegistry; @@ -487,7 +487,7 @@ public void setInputs(BigArrayList inputs) { e.printStackTrace(); } inputs = new BigArrayList(directory + File.separator + "temp"); - PlaybackFlavorBase.addAll(this.inputs, inputs); + SerialiserFlavorBase.addAll(this.inputs, inputs); } public Map>> getControlBytes() { // TODO Replace with TASFile extension diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java index 2366ead9..4754978c 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java @@ -16,7 +16,7 @@ import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickInputContainer; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata; import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackLoadException; -import com.minecrafttas.tasmod.playback.tasfile.flavor.PlaybackFlavorBase; +import com.minecrafttas.tasmod.playback.tasfile.flavor.SerialiserFlavorBase; import com.minecrafttas.tasmod.util.FileThread; import com.minecrafttas.tasmod.util.TASmodRegistry; @@ -62,7 +62,7 @@ public static void saveToFile(File file, BigArrayList contai FileThread writerThread = new FileThread(file, false); writerThread.start(); - PlaybackFlavorBase flavor = TASmodRegistry.SERIALISER_FLAVOR.getFlavor(flavorname); + SerialiserFlavorBase flavor = TASmodRegistry.SERIALISER_FLAVOR.getFlavor(flavorname); List metadataList = TASmodRegistry.PLAYBACK_METADATA.handleOnStore(); @@ -113,7 +113,7 @@ public static BigArrayList loadFromFile(File file) throws Pl } reader.close(); - PlaybackFlavorBase flavor = null; + SerialiserFlavorBase flavor = null; flavor = searchForFlavor(lines, TASmodRegistry.SERIALISER_FLAVOR.getFlavors()); // Test for the correct flavor on the first 100 lines @@ -125,7 +125,7 @@ public static BigArrayList loadFromFile(File file, String fl throw new PlaybackLoadException("Flavor name is null or empty"); } - PlaybackFlavorBase flavor = TASmodRegistry.SERIALISER_FLAVOR.getFlavor(flavorName); + SerialiserFlavorBase flavor = TASmodRegistry.SERIALISER_FLAVOR.getFlavor(flavorName); if (flavor == null) { throw new PlaybackLoadException("Flavor name %s doesn't exist.", flavorName); @@ -134,7 +134,7 @@ public static BigArrayList loadFromFile(File file, String fl return loadFromFile(file, flavor); } - public static BigArrayList loadFromFile(File file, PlaybackFlavorBase flavor) throws PlaybackLoadException, IOException { + public static BigArrayList loadFromFile(File file, SerialiserFlavorBase flavor) throws PlaybackLoadException, IOException { // Read file BufferedReader reader = null; @@ -186,8 +186,8 @@ public static BigArrayList loadFromFile(File file, PlaybackF // return out; // } - public static PlaybackFlavorBase searchForFlavor(List lines, List flavorList) { - for (PlaybackFlavorBase flavor : flavorList) { + public static SerialiserFlavorBase searchForFlavor(List lines, List flavorList) { + for (SerialiserFlavorBase flavor : flavorList) { if (flavor.deserialiseFlavorName(lines)) { return flavor; } diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java similarity index 99% rename from src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java rename to src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java index 6b8bf45e..df776ae4 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorBase.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java @@ -20,7 +20,7 @@ import com.minecrafttas.tasmod.virtual.VirtualKeyboard; import com.minecrafttas.tasmod.virtual.VirtualMouse; -public abstract class PlaybackFlavorBase { +public abstract class SerialiserFlavorBase { /** * The current tick that is being serialised or deserialised diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorRegistry.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorRegistry.java similarity index 78% rename from src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorRegistry.java rename to src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorRegistry.java index a11a3438..55cc2853 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/PlaybackFlavorRegistry.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorRegistry.java @@ -13,13 +13,13 @@ * * @author Scribble */ -public class PlaybackFlavorRegistry extends AbstractRegistry{ +public class SerialiserFlavorRegistry extends AbstractRegistry{ - public PlaybackFlavorRegistry() { + public SerialiserFlavorRegistry() { super(new LinkedHashMap<>()); } - public void register(PlaybackFlavorBase flavor) { + public void register(SerialiserFlavorBase flavor) { if (flavor == null) { throw new NullPointerException("Tried to register a serialiser flavor. But flavor is null."); } @@ -37,7 +37,7 @@ public void register(PlaybackFlavorBase flavor) { REGISTRY.put(flavor.flavorName(), flavor); } - public void unregister(PlaybackFlavorBase flavor) { + public void unregister(SerialiserFlavorBase flavor) { if (flavor == null) { throw new NullPointerException("Tried to unregister a flavor with value null"); } @@ -52,11 +52,11 @@ public Set getFlavorNames(){ return REGISTRY.keySet(); } - public PlaybackFlavorBase getFlavor(String name) { + public SerialiserFlavorBase getFlavor(String name) { return REGISTRY.get(name); } - public List getFlavors() { - return (List) REGISTRY.values(); + public List getFlavors() { + return (List) REGISTRY.values(); } } diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/integrated/Beta1Flavor.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/integrated/Beta1Flavor.java index c209ed6d..708b7e2e 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/integrated/Beta1Flavor.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/integrated/Beta1Flavor.java @@ -2,12 +2,12 @@ import java.util.List; -import com.minecrafttas.tasmod.playback.tasfile.flavor.PlaybackFlavorBase; +import com.minecrafttas.tasmod.playback.tasfile.flavor.SerialiserFlavorBase; import com.minecrafttas.tasmod.virtual.VirtualCameraAngle; import com.minecrafttas.tasmod.virtual.VirtualKeyboard; import com.minecrafttas.tasmod.virtual.VirtualMouse; -public class Beta1Flavor extends PlaybackFlavorBase { +public class Beta1Flavor extends SerialiserFlavorBase { @Override public String flavorName() { diff --git a/src/main/java/com/minecrafttas/tasmod/util/TASmodRegistry.java b/src/main/java/com/minecrafttas/tasmod/util/TASmodRegistry.java index d260ad88..a5eeb312 100644 --- a/src/main/java/com/minecrafttas/tasmod/util/TASmodRegistry.java +++ b/src/main/java/com/minecrafttas/tasmod/util/TASmodRegistry.java @@ -1,8 +1,8 @@ package com.minecrafttas.tasmod.util; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadataRegistry; -import com.minecrafttas.tasmod.playback.tasfile.flavor.PlaybackFlavorBase; -import com.minecrafttas.tasmod.playback.tasfile.flavor.PlaybackFlavorRegistry; +import com.minecrafttas.tasmod.playback.tasfile.flavor.SerialiserFlavorBase; +import com.minecrafttas.tasmod.playback.tasfile.flavor.SerialiserFlavorRegistry; import com.minecrafttas.tasmod.playback.tasfile.flavor.integrated.Beta1Flavor; public class TASmodRegistry { @@ -19,10 +19,10 @@ public class TASmodRegistry { /** * Registry for registering custom seialiser flavors that dictate the syntax of the inputs stored in the TASfile.
*
- * Either create a new flavor by extending {@link PlaybackFlavorBase}
+ * Either create a new flavor by extending {@link SerialiserFlavorBase}
* or extend an existing flavor (like {@link Beta1Flavor}) and overwrite parts of the methods.
*
* The resulting flavor can be registered here and can be found as a saving option with /saveTAS */ - public static final PlaybackFlavorRegistry SERIALISER_FLAVOR = new PlaybackFlavorRegistry(); + public static final SerialiserFlavorRegistry SERIALISER_FLAVOR = new SerialiserFlavorRegistry(); } diff --git a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualKeyboard.java b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualKeyboard.java index 454d77be..c34c223c 100644 --- a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualKeyboard.java +++ b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualKeyboard.java @@ -13,7 +13,7 @@ import org.apache.commons.lang3.StringUtils; import com.google.common.collect.ImmutableList; -import com.minecrafttas.tasmod.playback.tasfile.flavor.PlaybackFlavorBase; +import com.minecrafttas.tasmod.playback.tasfile.flavor.SerialiserFlavorBase; import com.minecrafttas.tasmod.virtual.event.VirtualKeyboardEvent; /** @@ -161,7 +161,7 @@ public void updateFromEvent(VirtualKey key, boolean keystate, char keycharacter, * * @param keycodes An array of keycodes, that replaces {@link Subtickable#pressedKeys} * @param chars An array of characters, that replaces {@link #charList} - * @see PlaybackFlavorBase#deserialiseKeyboard + * @see SerialiserFlavorBase#deserialiseKeyboard */ public void updateFromState(int[] keycodes, char[] chars) { createSubtick(); diff --git a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualMouse.java b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualMouse.java index 5399f4bf..026e4a32 100644 --- a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualMouse.java +++ b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualMouse.java @@ -1,6 +1,6 @@ package com.minecrafttas.tasmod.virtual; -import com.minecrafttas.tasmod.playback.tasfile.flavor.PlaybackFlavorBase; +import com.minecrafttas.tasmod.playback.tasfile.flavor.SerialiserFlavorBase; import com.minecrafttas.tasmod.virtual.event.VirtualMouseEvent; import java.io.Serializable; @@ -131,7 +131,7 @@ public void updateFromEvent(VirtualKey key, boolean keystate, int scrollwheel, i * @param scrollwheel The scroll wheel of this mouse state * @param cursorX The pointer location in the x axis * @param cursorY The pointer location in the y axis - * @see PlaybackFlavorBase#deserialiseMouse + * @see SerialiserFlavorBase#deserialiseMouse */ public void updateFromState(int[] keycodes, int scrollwheel, int cursorX, int cursorY) { createSubtick(); diff --git a/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java b/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java index cc5eb200..a5e3911a 100644 --- a/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java +++ b/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java @@ -16,7 +16,7 @@ import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickInputContainer; import com.minecrafttas.tasmod.playback.tasfile.PlaybackSerialiser2; import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackLoadException; -import com.minecrafttas.tasmod.playback.tasfile.flavor.PlaybackFlavorBase; +import com.minecrafttas.tasmod.playback.tasfile.flavor.SerialiserFlavorBase; import com.minecrafttas.tasmod.util.TASmodRegistry; import com.minecrafttas.tasmod.virtual.VirtualCameraAngle; import com.minecrafttas.tasmod.virtual.VirtualKey; @@ -25,7 +25,7 @@ public class PlaybackSerialiserTest { - private static class TestFlavor extends PlaybackFlavorBase { + private static class TestFlavor extends SerialiserFlavorBase { @Override public String flavorName() { diff --git a/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java b/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java similarity index 96% rename from src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java rename to src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java index 66e6822c..4f98639e 100644 --- a/src/test/java/tasmod/playback/tasfile/PlaybackFlavorBaseTest.java +++ b/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java @@ -18,14 +18,14 @@ import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadataRegistry.PlaybackMetadataExtension; import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackLoadException; -import com.minecrafttas.tasmod.playback.tasfile.flavor.PlaybackFlavorBase; +import com.minecrafttas.tasmod.playback.tasfile.flavor.SerialiserFlavorBase; import com.minecrafttas.tasmod.util.TASmodRegistry; import com.minecrafttas.tasmod.virtual.VirtualCameraAngle; import com.minecrafttas.tasmod.virtual.VirtualKey; import com.minecrafttas.tasmod.virtual.VirtualKeyboard; import com.minecrafttas.tasmod.virtual.VirtualMouse; -public class PlaybackFlavorBaseTest extends PlaybackFlavorBase { +public class SerialiserFlavorBaseTest extends SerialiserFlavorBase { class MetadataTest implements PlaybackMetadataExtension { @@ -573,42 +573,42 @@ void testIsFloat() { @Test void testStringPaddingEven() { - String actual = PlaybackFlavorBase.createCenteredHeading(null, '#', 52); + String actual = SerialiserFlavorBase.createCenteredHeading(null, '#', 52); String expected = "####################################################"; assertEquals(expected, actual); } @Test void testStringPaddingOdd() { - String actual = PlaybackFlavorBase.createCenteredHeading(null, '#', 51); + String actual = SerialiserFlavorBase.createCenteredHeading(null, '#', 51); String expected = "###################################################"; assertEquals(expected, actual); } @Test void testCenterHeadingEven() { - String actual = PlaybackFlavorBase.createCenteredHeading("TASfile", '#', 52); + String actual = SerialiserFlavorBase.createCenteredHeading("TASfile", '#', 52); String expected = "###################### TASfile #####################"; assertEquals(expected, actual); } @Test void testCenterHeadingOdd() { - String actual = PlaybackFlavorBase.createCenteredHeading("TASfile", '#', 51); + String actual = SerialiserFlavorBase.createCenteredHeading("TASfile", '#', 51); String expected = "##################### TASfile #####################"; assertEquals(expected, actual); } @Test void testCenterHeadingEvenText() { - String actual = PlaybackFlavorBase.createCenteredHeading("TASfiles", '#', 51); + String actual = SerialiserFlavorBase.createCenteredHeading("TASfiles", '#', 51); String expected = "##################### TASfiles ####################"; assertEquals(expected, actual); } @Test void testCenterHeadingEvenText2() { - String actual = PlaybackFlavorBase.createCenteredHeading("Keystrokes", '#', 51); + String actual = SerialiserFlavorBase.createCenteredHeading("Keystrokes", '#', 51); String expected = "#################### Keystrokes ###################"; assertEquals(expected, actual); } From cd305cf90276db51da6ace39a6b9aa46b1be50e6 Mon Sep 17 00:00:00 2001 From: Scribble Date: Sun, 26 May 2024 14:31:54 +0200 Subject: [PATCH 28/79] [PlaybackSerialiser] Added PlaybackExtensions Playback extensions are an easy way to add more functionality to the Playback file and controller, without creating a new flavor or extra events. - [PlaybackController] Changed index from int to long - [PlaybackController] Added CommentHandler - [PlaybackController] Added EventRecordTick and EventPlaybackTick --- .../tasmod/events/EventPlaybackClient.java | 48 +++++++++-- .../com/minecrafttas/tasmod/gui/InfoHud.java | 2 +- .../tasmod/monitoring/DesyncMonitoring.java | 2 +- .../tasmod/playback/CommentHandler.java | 75 +++++++++++++++++ .../playback/PlaybackControllerClient.java | 43 ++++++---- .../extensions/PlaybackExtension.java | 40 +++++++++ .../PlaybackExtensionsRegistry.java | 83 +++++++++++++++++++ .../playback/tasfile/PlaybackSerialiser.java | 24 +++--- .../tasfile/flavor/SerialiserFlavorBase.java | 2 + 9 files changed, 284 insertions(+), 35 deletions(-) create mode 100644 src/main/java/com/minecrafttas/tasmod/playback/CommentHandler.java create mode 100644 src/main/java/com/minecrafttas/tasmod/playback/extensions/PlaybackExtension.java create mode 100644 src/main/java/com/minecrafttas/tasmod/playback/extensions/PlaybackExtensionsRegistry.java diff --git a/src/main/java/com/minecrafttas/tasmod/events/EventPlaybackClient.java b/src/main/java/com/minecrafttas/tasmod/events/EventPlaybackClient.java index df7e3c83..de9bfcda 100644 --- a/src/main/java/com/minecrafttas/tasmod/events/EventPlaybackClient.java +++ b/src/main/java/com/minecrafttas/tasmod/events/EventPlaybackClient.java @@ -3,6 +3,7 @@ import com.minecrafttas.mctcommon.events.EventListenerRegistry.EventBase; import com.minecrafttas.tasmod.playback.PlaybackControllerClient; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TASstate; +import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickInputContainer; public interface EventPlaybackClient { @@ -12,12 +13,12 @@ public interface EventPlaybackClient { * is called */ @FunctionalInterface - public static interface EventControllerStateChange extends EventBase { + public interface EventControllerStateChange extends EventBase { /** * Fired when - * {@link PlaybackControllerClient#setTASStateClient(com.minecrafttas.tasmod.playback.PlaybackControllerClient.TASstate, boolean)} - * is called + * {@link PlaybackControllerClient#setTASStateClient(com.minecrafttas.tasmod.playback.PlaybackControllerClient.TASstate, boolean) + * PlaybackControllerClient#setTASStateClient} is called * * @param newstate The new state that the playback controller is about to be set * to @@ -30,8 +31,45 @@ public static interface EventControllerStateChange extends EventBase { * Fired after a player joined the world with a playback/recording running */ @FunctionalInterface - public static interface EventPlaybackJoinedWorld extends EventBase { - + public interface EventPlaybackJoinedWorld extends EventBase { + + /** + * Fired after a player joined the world with a playback/recording running + * + * @param state The {@link PlaybackControllerClient#state state} of the + * {@link PlaybackControllerClient} when the player joined the + * world + */ public void onPlaybackJoinedWorld(TASstate state); } + + /** + * Fired when a tick is being recorded + */ + @FunctionalInterface + public interface EventRecordTick extends EventBase { + + /** + * Fired when a tick is being recorded + * + * @param index The index of the tick that is being recorded + * @param container The {@link TickInputContainer} that is being recorded + */ + public void onRecordTick(long index, TickInputContainer container); + } + + /** + * Fired when a tick is being played back + */ + @FunctionalInterface + public interface EventPlaybackTick extends EventBase { + + /** + * Fired when a tick is being recorded + * + * @param index The index of the tick that is being recorded + * @param container The {@link TickInputContainer} that is being recorded + */ + public void onPlaybackTick(long index, TickInputContainer container); + } } diff --git a/src/main/java/com/minecrafttas/tasmod/gui/InfoHud.java b/src/main/java/com/minecrafttas/tasmod/gui/InfoHud.java index 13cbda8c..94093181 100644 --- a/src/main/java/com/minecrafttas/tasmod/gui/InfoHud.java +++ b/src/main/java/com/minecrafttas/tasmod/gui/InfoHud.java @@ -410,7 +410,7 @@ public boolean checkInit() { if (configuration.getProperty(title + "_x", "err").equals("err")) setDefaults(title, y, true); lists.add(new InfoLabel(title, Integer.parseInt(configuration.getProperty(title + "_x")), Integer.parseInt(configuration.getProperty(title + "_y")), Boolean.parseBoolean(configuration.getProperty(title + "_visible")), Boolean.parseBoolean(configuration.getProperty(title + "_rect")), () -> { if (Minecraft.getMinecraft().currentScreen == this) return "PlaybackIndex"; - return Integer.toString(TASmodClient.controller.index()); + return Long.toString(TASmodClient.controller.index()); })); y = height - 14; diff --git a/src/main/java/com/minecrafttas/tasmod/monitoring/DesyncMonitoring.java b/src/main/java/com/minecrafttas/tasmod/monitoring/DesyncMonitoring.java index 4cf26ba6..92a2aced 100644 --- a/src/main/java/com/minecrafttas/tasmod/monitoring/DesyncMonitoring.java +++ b/src/main/java/com/minecrafttas/tasmod/monitoring/DesyncMonitoring.java @@ -239,7 +239,7 @@ public String toString() { return String.format("%s %s %s %s %s %s %s", values[0], values[1], values[2], values[3], values[4], values[5], seed); } - public DesyncStatus getSeverity(int index, double[] playerValues, long seed) { + public DesyncStatus getSeverity(long index, double[] playerValues, long seed) { if(this.seed != seed) { if(TASmod.ktrngHandler.isLoaded()) { diff --git a/src/main/java/com/minecrafttas/tasmod/playback/CommentHandler.java b/src/main/java/com/minecrafttas/tasmod/playback/CommentHandler.java new file mode 100644 index 00000000..562f95ec --- /dev/null +++ b/src/main/java/com/minecrafttas/tasmod/playback/CommentHandler.java @@ -0,0 +1,75 @@ +package com.minecrafttas.tasmod.playback; + +import java.io.IOException; +import java.util.ArrayList; + +import com.dselent.bigarraylist.BigArrayList; + +/** + * Handles and stores everything related to comments in the TASfile + * + * @author Scribble + */ +public class CommentHandler { + + /** + * List of all inline comments.
+ * These comments take the form: + * + *
+	 * // This is an inline comment
+	 * // This is a second inline comment
+	 * 1|W;w|;0;0;0|0.0;0.0
+	 * 	1|||1.0;1.0
+	 * 
+ * + * Inline comments are supposed to describe the tick as a whole and therefore + * can not be attached to subticks.
+ * like so: + * + *
+	 * 1|W;w|;0;0;0|0.0;0.0
+	 * // This is not allowed. This comment won't be saved
+	 * 	1|||1.0;1.0
+	 * 
+ * + * The index of the BigArrayList is the current tick. + */ + BigArrayList> inlineComments; + + /** + * List of all endline comments.
+ * These comments take the form: + * + *
+	 * 1|W;w|;0;0;0|0.0;0.0		// This is an endline comment
+	 * 	1|||1.0;1.0		// This is a second endline comment
+	 * 
+ * + * Endline comments are suppoded to describe individual subticks.
+ * The index of the BigArrayList is the tick, the index of the ArrayList inside + * of the BigArrayList is the subtick of that tick + */ + BigArrayList> endlineComments; + + public CommentHandler() { + inlineComments = new BigArrayList<>(); + endlineComments = new BigArrayList<>(); + } + + public void clear() { + try { + inlineComments.clearMemory(); + } catch (IOException e) { + e.printStackTrace(); + } + inlineComments = new BigArrayList<>(); + + try { + endlineComments.clearMemory(); + } catch (IOException e) { + e.printStackTrace(); + } + endlineComments = new BigArrayList<>(); + } +} diff --git a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java index 7ff45f28..abfc7950 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java @@ -38,6 +38,8 @@ import com.minecrafttas.tasmod.events.EventClient.EventVirtualMouseTick; import com.minecrafttas.tasmod.events.EventPlaybackClient.EventControllerStateChange; import com.minecrafttas.tasmod.events.EventPlaybackClient.EventPlaybackJoinedWorld; +import com.minecrafttas.tasmod.events.EventPlaybackClient.EventPlaybackTick; +import com.minecrafttas.tasmod.events.EventPlaybackClient.EventRecordTick; import com.minecrafttas.tasmod.monitoring.DesyncMonitoring; import com.minecrafttas.tasmod.networking.TASmodBufferBuilder; import com.minecrafttas.tasmod.networking.TASmodPackets; @@ -94,7 +96,7 @@ public class PlaybackControllerClient implements ClientPacketHandler, EventClien /** * The current index of the inputs */ - private int index; + private long index; private VirtualKeyboard keyboard = new VirtualKeyboard(); @@ -122,9 +124,9 @@ public class PlaybackControllerClient implements ClientPacketHandler, EventClien private Map>> controlBytes = new HashMap>>(); // TODO Replace with TASFile extension /** - * The comments in the file, used to store them again later + * The comments of the TASfile. Contains calls to extensions. */ - private Map> comments = new HashMap<>(); // TODO Replace with TASFile extension + private CommentHandler comments = new CommentHandler(); public DesyncMonitoring desyncMonitor = new DesyncMonitoring(this); // TODO Replace with TASFile extension @@ -261,7 +263,7 @@ private void startRecording() { LOGGER.debug(LoggerMarkers.Playback, "Starting recording"); if (this.inputs.isEmpty()) { inputs.add(new TickInputContainer()); - desyncMonitor.recordNull(index); +// desyncMonitor.recordNull(index); } } @@ -411,15 +413,18 @@ public void onClientTickPost(Minecraft mc) { private void recordNextTick() { index++; + TickInputContainer container = new TickInputContainer(keyboard.clone(), mouse.clone(), camera.clone()); if (inputs.size() <= index) { if (inputs.size() < index) { LOGGER.warn("Index is {} inputs bigger than the container!", index - inputs.size()); } - inputs.add(new TickInputContainer(keyboard.clone(), mouse.clone(), camera.clone())); + inputs.add(container); } else { - inputs.set(index, new TickInputContainer(keyboard.clone(), mouse.clone(), camera.clone())); + inputs.set(index, container); } - desyncMonitor.recordMonitor(index); // Capturing monitor values + + EventListenerRegistry.fireEvent(EventRecordTick.class, index, container); +// desyncMonitor.recordMonitor(index); // Capturing monitor values } private void playbackNextTick() { @@ -452,14 +457,16 @@ private void playbackNextTick() { } /* Continue condition */ else { - TickInputContainer tickcontainer = inputs.get(index); // Loads the new inputs from the container - this.keyboard = tickcontainer.getKeyboard().clone(); - this.mouse = tickcontainer.getMouse().clone(); - this.camera = tickcontainer.getCameraAngle().clone(); + TickInputContainer container = inputs.get(index); // Loads the new inputs from the container + this.keyboard = container.getKeyboard().clone(); + this.mouse = container.getMouse().clone(); + this.camera = container.getCameraAngle().clone(); // check for control bytes - ControlByteHandler.readCotrolByte(controlBytes.get(index)); +// ControlByteHandler.readCotrolByte(controlBytes.get(index)); + EventListenerRegistry.fireEvent(EventPlaybackTick.class, index, container); } - desyncMonitor.playMonitor(index); + +// desyncMonitor.playMonitor(index); } // ===================================================================================================== // Methods to manipulate inputs @@ -472,7 +479,7 @@ public boolean isEmpty() { return inputs.isEmpty(); } - public int index() { + public long index() { return index; } @@ -494,9 +501,13 @@ public Map>> getControlBytes() { // TODO Re return controlBytes; } - public Map> getComments() { // TODO Replace with TASFile extension + public CommentHandler getComments() { // TODO Replace with TASFile extension return comments; } + + public void setComments(CommentHandler comments) { + this.comments = comments; + } public void setIndex(int index) throws IndexOutOfBoundsException { if (index <= size()) { @@ -512,7 +523,7 @@ public void setIndex(int index) throws IndexOutOfBoundsException { } } - public TickInputContainer get(int index) { + public TickInputContainer get(long index) { TickInputContainer tickcontainer = null; try { tickcontainer = inputs.get(index); diff --git a/src/main/java/com/minecrafttas/tasmod/playback/extensions/PlaybackExtension.java b/src/main/java/com/minecrafttas/tasmod/playback/extensions/PlaybackExtension.java new file mode 100644 index 00000000..33c0f31e --- /dev/null +++ b/src/main/java/com/minecrafttas/tasmod/playback/extensions/PlaybackExtension.java @@ -0,0 +1,40 @@ +package com.minecrafttas.tasmod.playback.extensions; + +import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickInputContainer; + +public abstract class PlaybackExtension { + + protected boolean enabled=false; + + public abstract String extensionName(); + + public void onEnable() {}; + + public void onDisable() {}; + + public void onRecord(long tick, TickInputContainer container) {}; + + public void onPlayback(long tick, TickInputContainer container) {}; + + public String onSerialiseSingleComment(long tick, String line) { + return line; + } + + public void onDeserialiseSingleComment(long tick, String line) {} + + public void onSerialiseCommentAtEnd(long tick, String line) {} + + public void onDeserialiseCommentAtEnd(long tick, String line) {} + + public boolean isEnabled() { + return enabled; + } + + public void setEnabled(boolean enabled) { + if(enabled) + onEnable(); + else + onDisable(); + this.enabled = enabled; + } +} diff --git a/src/main/java/com/minecrafttas/tasmod/playback/extensions/PlaybackExtensionsRegistry.java b/src/main/java/com/minecrafttas/tasmod/playback/extensions/PlaybackExtensionsRegistry.java new file mode 100644 index 00000000..5061958c --- /dev/null +++ b/src/main/java/com/minecrafttas/tasmod/playback/extensions/PlaybackExtensionsRegistry.java @@ -0,0 +1,83 @@ +package com.minecrafttas.tasmod.playback.extensions; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; + +import com.minecrafttas.mctcommon.registry.AbstractRegistry; +import com.minecrafttas.tasmod.TASmod; +import com.minecrafttas.tasmod.events.EventPlaybackClient; +import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TASstate; +import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickInputContainer; + +public class PlaybackExtensionsRegistry extends AbstractRegistry implements EventPlaybackClient.EventRecordTick, EventPlaybackClient.EventPlaybackTick { + + private List enabledExtensions = new ArrayList<>(); + + public PlaybackExtensionsRegistry() { + super(new LinkedHashMap<>()); + } + + @Override + public void register(PlaybackExtension extension) { + if (extension == null) { + throw new NullPointerException("Tried to register a serialiser flavor. But flavor is null."); + } + + if (containsClass(extension)) { + TASmod.LOGGER.warn("Tried to register the serialiser flavor {}, but another instance of this class is already registered!", extension.getClass().getName()); + return; + } + + if (REGISTRY.containsKey(extension.extensionName())) { + TASmod.LOGGER.warn("Trying to register the playback extension{}, but a flavor with the same name is already registered!", extension.extensionName()); + return; + } + + REGISTRY.put(extension.extensionName(), extension); + } + + @Override + public void unregister(PlaybackExtension extension) { + if (extension == null) { + throw new NullPointerException("Tried to unregister an playback extension with value null"); + } + if (REGISTRY.containsKey(extension.extensionName())) { + REGISTRY.remove(extension.extensionName()); + } else { + TASmod.LOGGER.warn("Trying to unregister the playback extension {}, but it was not registered!", extension.getClass().getName()); + } + } + + public void setEnabled(String extensionName, boolean enabled) { + PlaybackExtension extension = REGISTRY.get(extensionName); + extension.setEnabled(enabled); + enabledExtensions = getEnabled(); + } + + public List getEnabled() { + List out = new ArrayList<>(); + + for(PlaybackExtension element : REGISTRY.values()) { + if(element.isEnabled()) { + out.add(element); + } + } + + return out; + } + + @Override + public void onPlaybackTick(long index, TickInputContainer container) { + enabledExtensions.forEach(extension -> { + extension.onRecord(index, container); + }); + } + + @Override + public void onRecordTick(long index, TickInputContainer container) { + enabledExtensions.forEach(extension -> { + extension.onPlayback(index, container); + }); + } +} diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser.java index 79ecb2d0..b5ee9424 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser.java @@ -97,7 +97,7 @@ public void saveToFileV1(File file, PlaybackControllerClient container) throws I * @param index index until the inputs get saved * @throws IOException When the input container is empty */ - public void saveToFileV1Until(File file, PlaybackControllerClient container, int index) throws IOException{ + public void saveToFileV1Until(File file, PlaybackControllerClient container, long index) throws IOException{ LOGGER.debug(LoggerMarkers.Playback, "Saving playback controller to file {}", file); if (container.size() == 0) { throw new IOException("There are no inputs to save to a file"); @@ -132,20 +132,20 @@ public void saveToFileV1Until(File file, PlaybackControllerClient container, int BigArrayList ticks = container.getInputs(); Map>> cbytes= container.getControlBytes(); - Map> comments = container.getComments(); +// Map> comments = container.getComments(); for (int i = 0; i < ticks.size(); i++) { if(i==index) { break; } - // Add comments - if(comments.containsKey(i)) { - List multiLine=comments.get(i); - multiLine.forEach(comment -> { - fileThread.addLine("//"+comment+"\n"); - }); - } +// // Add comments +// if(comments.containsKey(i)) { +// List multiLine=comments.get(i); +// multiLine.forEach(comment -> { +// fileThread.addLine("//"+comment+"\n"); +// }); +// } // Add controlbytes if(cbytes.containsKey(i)) { @@ -253,9 +253,9 @@ public PlaybackControllerClient fromEntireFileV1(File file) throws IOException { controller.getControlBytes().put(tickcount, cbytes); //Read comments } else if (line.startsWith("//")) { - List commentList = controller.getComments().getOrDefault(tickcount, new ArrayList<>()); - commentList.add(line.replace("//", "")); - controller.getComments().put(tickcount, commentList); +// List commentList = controller.getComments().getOrDefault(tickcount, new ArrayList<>()); +// commentList.add(line.replace("//", "")); +// controller.getComments().put(tickcount, commentList); //Read data } else { diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java index df776ae4..6123db75 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java @@ -77,6 +77,8 @@ protected void serialiseFlavorName(List out) { out.add("# Flavor: " + flavorName()); } + + protected void serialiseMetadata(List out, List metadataList) { for (PlaybackMetadata metadata : metadataList) { serialiseMetadataName(out, metadata.getExtensionName()); From 4a46f2a21cd974298afc5218172c9e801a3e5c43 Mon Sep 17 00:00:00 2001 From: Scribble Date: Sun, 26 May 2024 19:52:41 +0200 Subject: [PATCH 29/79] [PlaybackSerialiser] Added PlaybackExtensions to registry --- .../tasmod/events/EventPlaybackClient.java | 2 +- .../PlaybackExtensionsRegistry.java | 1 - .../playback/tasfile/PlaybackSerialiser2.java | 5 ++- .../tasfile/flavor/SerialiserFlavorBase.java | 44 ++++++++++++++----- .../tasmod/util/TASmodRegistry.java | 10 +++++ .../tasfile/SerialiserFlavorBaseTest.java | 2 +- 6 files changed, 48 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/minecrafttas/tasmod/events/EventPlaybackClient.java b/src/main/java/com/minecrafttas/tasmod/events/EventPlaybackClient.java index de9bfcda..a6c6c63e 100644 --- a/src/main/java/com/minecrafttas/tasmod/events/EventPlaybackClient.java +++ b/src/main/java/com/minecrafttas/tasmod/events/EventPlaybackClient.java @@ -9,7 +9,7 @@ public interface EventPlaybackClient { /** * Fired when - * {@link PlaybackControllerClient#setTASStateClient(com.minecrafttas.tasmod.playback.PlaybackControllerClient.TASstate, boolean)} + * {@link PlaybackControllerClient#setTASStateClient(com.minecrafttas.tasmod.playback.PlaybackControllerClient.TASstate, boolean) PlaybackControllerClient#setTASStateClient} * is called */ @FunctionalInterface diff --git a/src/main/java/com/minecrafttas/tasmod/playback/extensions/PlaybackExtensionsRegistry.java b/src/main/java/com/minecrafttas/tasmod/playback/extensions/PlaybackExtensionsRegistry.java index 5061958c..20cc7ee8 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/extensions/PlaybackExtensionsRegistry.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/extensions/PlaybackExtensionsRegistry.java @@ -7,7 +7,6 @@ import com.minecrafttas.mctcommon.registry.AbstractRegistry; import com.minecrafttas.tasmod.TASmod; import com.minecrafttas.tasmod.events.EventPlaybackClient; -import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TASstate; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickInputContainer; public class PlaybackExtensionsRegistry extends AbstractRegistry implements EventPlaybackClient.EventRecordTick, EventPlaybackClient.EventPlaybackTick { diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java index 4754978c..6438d7e2 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java @@ -14,6 +14,7 @@ import com.minecrafttas.tasmod.TASmodClient; import com.minecrafttas.tasmod.playback.PlaybackControllerClient; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickInputContainer; +import com.minecrafttas.tasmod.playback.extensions.PlaybackExtension; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata; import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackLoadException; import com.minecrafttas.tasmod.playback.tasfile.flavor.SerialiserFlavorBase; @@ -65,8 +66,10 @@ public static void saveToFile(File file, BigArrayList contai SerialiserFlavorBase flavor = TASmodRegistry.SERIALISER_FLAVOR.getFlavor(flavorname); List metadataList = TASmodRegistry.PLAYBACK_METADATA.handleOnStore(); + + List extensionList = TASmodRegistry.PLAYBACK_EXTENSION.getEnabled(); - for (String line : flavor.serialiseHeader(metadataList)) { + for (String line : flavor.serialiseHeader(metadataList, extensionList)) { writerThread.addLine(line); } diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java index 6123db75..41889c63 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java @@ -2,6 +2,7 @@ import java.io.Serializable; import java.util.ArrayList; +import java.util.Arrays; import java.util.LinkedHashMap; import java.util.List; import java.util.Queue; @@ -13,6 +14,7 @@ import com.dselent.bigarraylist.BigArrayList; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickInputContainer; +import com.minecrafttas.tasmod.playback.extensions.PlaybackExtension; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata; import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackLoadException; import com.minecrafttas.tasmod.virtual.VirtualCameraAngle; @@ -63,22 +65,26 @@ protected String headerEnd() { ==============================================*/ - public List serialiseHeader(List metadataList) { + public List serialiseHeader(List metadataList, List extensionList) { List out = new ArrayList<>(); out.add(headerStart()); serialiseFlavorName(out); - // out.add(serializeExtensionNames()); + serialiseExtensionNames(out, extensionList); serialiseMetadata(out, metadataList); out.add(headerEnd()); return out; } protected void serialiseFlavorName(List out) { - out.add("# Flavor: " + flavorName()); + out.add("Flavor: " + flavorName()); + } + + protected void serialiseExtensionNames(List out, List extensionList) { + List stringlist = new ArrayList<>(); + extensionList.forEach(extension -> stringlist.add(extension.extensionName())); + out.add("Extensions: " + String.join(", ", stringlist)); } - - protected void serialiseMetadata(List out, List metadataList) { for (PlaybackMetadata metadata : metadataList) { serialiseMetadataName(out, metadata.getExtensionName()); @@ -179,8 +185,8 @@ protected String getOrEmpty(String string) { * */ - public boolean deserialiseFlavorName(List header) { - for (String line : header) { + public boolean deserialiseFlavorName(List headerLines) { + for (String line : headerLines) { Matcher matcher = extract("^Flavor: " + flavorName(), line); if (matcher.find()) { @@ -192,11 +198,11 @@ public boolean deserialiseFlavorName(List header) { public List extractHeader(BigArrayList lines) { List extracted = new ArrayList<>(); - + long maxExtract = 1000; maxExtract = lines.size() < maxExtract ? lines.size() : maxExtract; - + for (long i = 0; i < maxExtract; i++) { String line = lines.get(i); extracted.add(line); @@ -224,10 +230,10 @@ public List deserialiseMetadata(List headerLines) { String metadataName = null; Pair pair = null; LinkedHashMap values = new LinkedHashMap<>(); - - if(metadataLines.isEmpty()) + + if (metadataLines.isEmpty()) return new ArrayList<>(); - + for (String metadataLine : metadataLines) { String newMetadataName = deserialiseMetadataName(metadataLine); @@ -252,6 +258,20 @@ public List deserialiseMetadata(List headerLines) { return out; } + public List deserialiseExtensions(List headerLines) { + for (String line : headerLines) { + Matcher matcher = extract("Extensions: ?(.*)", line); + + if (matcher.find()) { + String extensionStrings = matcher.group(1); + String[] extensionNames = extensionStrings.split(", "); + + return Arrays.asList(extensionNames); + } + } + throw new PlaybackLoadException("Extensions value was not found in the header"); + } + protected List extractMetadata(List lines) { List extracted = new ArrayList<>(); diff --git a/src/main/java/com/minecrafttas/tasmod/util/TASmodRegistry.java b/src/main/java/com/minecrafttas/tasmod/util/TASmodRegistry.java index a5eeb312..2050249b 100644 --- a/src/main/java/com/minecrafttas/tasmod/util/TASmodRegistry.java +++ b/src/main/java/com/minecrafttas/tasmod/util/TASmodRegistry.java @@ -1,5 +1,6 @@ package com.minecrafttas.tasmod.util; +import com.minecrafttas.tasmod.playback.extensions.PlaybackExtensionsRegistry; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadataRegistry; import com.minecrafttas.tasmod.playback.tasfile.flavor.SerialiserFlavorBase; import com.minecrafttas.tasmod.playback.tasfile.flavor.SerialiserFlavorRegistry; @@ -16,6 +17,15 @@ public class TASmodRegistry { */ public static final PlaybackMetadataRegistry PLAYBACK_METADATA = new PlaybackMetadataRegistry(); + /** + * Registry for registering custom behavior for each tick during recording and playback.
+ *
+ * Extensions give the opportunity to run on each recorded tick and each played back tick.
+ * Extensions also have access to the TASFile so that data can be stored and read in/from the TASFile. + * + */ + public static final PlaybackExtensionsRegistry PLAYBACK_EXTENSION = new PlaybackExtensionsRegistry(); + /** * Registry for registering custom seialiser flavors that dictate the syntax of the inputs stored in the TASfile.
*
diff --git a/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java b/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java index 4f98639e..d70c1ac4 100644 --- a/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java +++ b/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java @@ -104,7 +104,7 @@ void testSerialiseFlavorname() { serialiseFlavorName(actual); List expected = new ArrayList<>(); - expected.add("# Flavor: Test"); + expected.add("Flavor: Test"); assertIterableEquals(expected, actual); } From 2c3d99eac581aa4336769a74f476166ea87cbd22 Mon Sep 17 00:00:00 2001 From: Scribble Date: Wed, 29 May 2024 22:42:51 +0200 Subject: [PATCH 30/79] [PlaybackSerialiser] Fixed tests --- .../playback/tasfile/PlaybackSerialiser2.java | 13 +-- .../tasfile/flavor/SerialiserFlavorBase.java | 100 ++++++------------ .../tasmod/util/TASmodRegistry.java | 2 +- .../tasfile/PlaybackSerialiserTest.java | 59 +++++++++++ .../tasfile/SerialiserFlavorBaseTest.java | 41 ------- 5 files changed, 97 insertions(+), 118 deletions(-) diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java index 6438d7e2..cb648d1d 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java @@ -5,13 +5,10 @@ import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; -import java.io.Serializable; import java.util.ArrayList; import java.util.List; import com.dselent.bigarraylist.BigArrayList; -import com.minecrafttas.tasmod.TASmod; -import com.minecrafttas.tasmod.TASmodClient; import com.minecrafttas.tasmod.playback.PlaybackControllerClient; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickInputContainer; import com.minecrafttas.tasmod.playback.extensions.PlaybackExtension; @@ -157,9 +154,13 @@ public static BigArrayList loadFromFile(File file, Serialise reader.close(); - // Deserialise Metadata - List headerLines = flavor.extractHeader(lines); - List deserialisedMetadata = flavor.deserialiseMetadata(headerLines); + // Deserialise Header + List headerLines = new ArrayList<>(); + List deserialisedMetadata = new ArrayList<>(); + List deserialisedExtensionNames = new ArrayList<>(); + + flavor.deserialiseHeader(headerLines, deserialisedMetadata, deserialisedExtensionNames); + TASmodRegistry.PLAYBACK_METADATA.handleOnLoad(deserialisedMetadata); // Deserialise main data diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java index 41889c63..8d209bd9 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java @@ -10,8 +10,6 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import org.apache.commons.lang3.tuple.Pair; - import com.dselent.bigarraylist.BigArrayList; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickInputContainer; import com.minecrafttas.tasmod.playback.extensions.PlaybackExtension; @@ -196,6 +194,10 @@ public boolean deserialiseFlavorName(List headerLines) { return false; } + public void deserialiseHeader(List headerLines, List metadataList, List activeExtensionList) { + metadataList.addAll(deserialiseMetadata(headerLines)); + } + public List extractHeader(BigArrayList lines) { List extracted = new ArrayList<>(); @@ -213,51 +215,6 @@ public List extractHeader(BigArrayList lines) { throw new PlaybackLoadException("Cannot find the end of the header"); } - /** - * Deserialises {@link PlaybackMetadata} in the header of the file.
- *
- * First extracts the metadata specific lines, then reads the section names and - * key value pairs. - * - * @param headerLines All lines in the header. Can be easily extracted with - * {@link #extractHeader(List)} - * @return A list of {@link PlaybackMetadata} - */ - public List deserialiseMetadata(List headerLines) { - List metadataLines = extractMetadata(headerLines); - List out = new ArrayList<>(); - - String metadataName = null; - Pair pair = null; - LinkedHashMap values = new LinkedHashMap<>(); - - if (metadataLines.isEmpty()) - return new ArrayList<>(); - - for (String metadataLine : metadataLines) { - - String newMetadataName = deserialiseMetadataName(metadataLine); - - if (newMetadataName != null) { // Means a new metadata section is beginning... In this case, the metadataLine - // is "### Name" and the newMetadataName is "Name" - - if (metadataName != null && !metadataName.equals(newMetadataName)) { // If metadataName is null, then the first section begins - // If metadataName is different than the newMetadataName, - // then a new section begins and we first need to store the old. - out.add(PlaybackMetadata.fromHashMap(metadataName, values)); - values = new LinkedHashMap<>(); - } - metadataName = newMetadataName; - continue; - - } else if ((pair = deseraialiseMetadataValue(metadataLine)) != null) { - values.put(pair.getLeft(), pair.getRight()); - } - } - out.add(PlaybackMetadata.fromHashMap(metadataName, values)); - return out; - } - public List deserialiseExtensions(List headerLines) { for (String line : headerLines) { Matcher matcher = extract("Extensions: ?(.*)", line); @@ -271,35 +228,38 @@ public List deserialiseExtensions(List headerLines) { } throw new PlaybackLoadException("Extensions value was not found in the header"); } + + public List deserialiseMetadata(List headerLines) { + List out = new ArrayList<>(); - protected List extractMetadata(List lines) { - List extracted = new ArrayList<>(); + String metadataName = null; + LinkedHashMap values = new LinkedHashMap<>(); - boolean start = false; + for (String headerLine : headerLines) { - for (String line : lines) { - if (deserialiseMetadataName(line) != null) - start = true; + Matcher nameMatcher = extract("^#{3} (.+)", headerLine); // If the line starts with ###, an optional space char after and then capture the name + Matcher valueMatcher = extract("^([^#].*?):\\s*(.+)", headerLine); // If the line doesn't start with a #, then the key of the metadata, then a : then any or no number of whitespace chars, then the value of the metadata + + if (nameMatcher.find()) { - if (line.equals(headerEnd())) - break; + if (metadataName != null && !metadataName.equals(nameMatcher.group(1))) { // If metadataName is null, then the first section begins + // If metadataName is different than the newMetadataName, + // then a new section begins and we first need to store the old. + out.add(PlaybackMetadata.fromHashMap(metadataName, values)); + values.clear(); + } + metadataName = nameMatcher.group(1); + continue; - if (start) - extracted.add(line); + } else if (metadataName != null && valueMatcher.find()) { + values.put(valueMatcher.group(1), valueMatcher.group(2)); + } } - - return extracted; - } - - protected String deserialiseMetadataName(String line) { - return extract("^### (.+)", line, 1); - } - - protected Pair deseraialiseMetadataValue(String metadataLine) { - Matcher matcher = extract("^(.+?):(.+)", metadataLine); - if (matcher.find()) - return Pair.of(matcher.group(1).trim(), matcher.group(2).trim()); - return null; + + if(metadataName!=null) + out.add(PlaybackMetadata.fromHashMap(metadataName, values)); + + return out; } /** diff --git a/src/main/java/com/minecrafttas/tasmod/util/TASmodRegistry.java b/src/main/java/com/minecrafttas/tasmod/util/TASmodRegistry.java index 2050249b..033b6235 100644 --- a/src/main/java/com/minecrafttas/tasmod/util/TASmodRegistry.java +++ b/src/main/java/com/minecrafttas/tasmod/util/TASmodRegistry.java @@ -27,7 +27,7 @@ public class TASmodRegistry { public static final PlaybackExtensionsRegistry PLAYBACK_EXTENSION = new PlaybackExtensionsRegistry(); /** - * Registry for registering custom seialiser flavors that dictate the syntax of the inputs stored in the TASfile.
+ * Registry for registering custom serialiser flavors that dictate the syntax of the inputs stored in the TASfile.
*
* Either create a new flavor by extending {@link SerialiserFlavorBase}
* or extend an existing flavor (like {@link Beta1Flavor}) and overwrite parts of the methods.
diff --git a/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java b/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java index a5e3911a..a484493e 100644 --- a/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java +++ b/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java @@ -1,5 +1,6 @@ package tasmod.playback.tasfile; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertIterableEquals; import java.io.File; @@ -10,10 +11,14 @@ import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import com.dselent.bigarraylist.BigArrayList; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickInputContainer; +import com.minecrafttas.tasmod.playback.extensions.PlaybackExtension; +import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata; +import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadataRegistry.PlaybackMetadataExtension; import com.minecrafttas.tasmod.playback.tasfile.PlaybackSerialiser2; import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackLoadException; import com.minecrafttas.tasmod.playback.tasfile.flavor.SerialiserFlavorBase; @@ -34,24 +39,77 @@ public String flavorName() { } + private static class TestMetadatada implements PlaybackMetadataExtension { + + String testValue = ""; + String actual = "e"; + + @Override + public String getExtensionName() { + return "Test"; + } + + @Override + public void onCreate() { + + } + + @Override + public PlaybackMetadata onStore() { + PlaybackMetadata metadata =new PlaybackMetadata(this); + metadata.setValue("TestKey", testValue); + return metadata; + } + + @Override + public void onLoad(PlaybackMetadata metadata) { + actual = metadata.getValue("TestKey"); + } + + @Override + public void onClear() { + // TODO Auto-generated method stub + + } + + } + + private static class TestExtension extends PlaybackExtension { + + @Override + public String extensionName() { + return "tasmod_testExtension"; + } + + } + File file = new File("src/test/resources/serialiser/PlaybackSerialiserTest.mctas"); private static TestFlavor testFlavor = new TestFlavor(); + private static TestMetadatada testMetadata = new TestMetadatada(); + private static TestExtension testExtension = new TestExtension(); @BeforeAll static void register() { TASmodRegistry.SERIALISER_FLAVOR.register(testFlavor); + TASmodRegistry.PLAYBACK_METADATA.register(testMetadata); + TASmodRegistry.PLAYBACK_EXTENSION.register(testExtension); } @AfterAll static void unregister() { TASmodRegistry.SERIALISER_FLAVOR.unregister(testFlavor); + TASmodRegistry.PLAYBACK_METADATA.unregister(testMetadata); + TASmodRegistry.PLAYBACK_EXTENSION.unregister(testExtension); } @Test + @Disabled void testSerialiser() { BigArrayList expected = new BigArrayList<>(); + testMetadata.testValue = "testing"; + TASmodRegistry.PLAYBACK_EXTENSION.setEnabled("tasmod_testExtension", true); // Tick 1 // Keyboard @@ -101,6 +159,7 @@ void testSerialiser() { try { BigArrayList actual = PlaybackSerialiser2.loadFromFile(file, testFlavor); assertBigArrayList(expected, actual); + assertEquals("testing", testMetadata.actual); } catch (PlaybackLoadException | IOException e) { e.printStackTrace(); } finally { diff --git a/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java b/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java index d70c1ac4..49a5b2fb 100644 --- a/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java +++ b/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java @@ -222,47 +222,6 @@ void testExtractHeaderFail() { assertEquals("Cannot find the end of the header", exception.getMessage()); } - /** - * Test extracting only the metadata (### General and below) - */ - @Test - void testExtractMetadata() { - List lines = new ArrayList<>(); - lines.add("###### TASfile ######"); - lines.add("Flavor: beta"); - lines.add("Extensions: desync_monitor, control_bytes, vanilla_commands"); - lines.add("### General"); - lines.add("Author: Scribble"); - lines.add("Title: 77 Buttons"); - lines.add("##################################################"); - - List actual = extractMetadata(lines); - - List expected = new ArrayList<>(); - expected.add("### General"); - expected.add("Author: Scribble"); - expected.add("Title: 77 Buttons"); - - assertIterableEquals(expected, actual); - } - - /** - * Test extracting metadata, but no metadata was encoded - */ - @Test - void testExtractEmptyMetadata() { - List lines = new ArrayList<>(); - lines.add("###### TASfile ######"); - lines.add("Flavor: beta"); - lines.add("Extensions: desync_monitor, control_bytes, vanilla_commands"); - lines.add("##################################################"); - - List actual = extractMetadata(lines); - - List expected = new ArrayList<>(); - assertIterableEquals(expected, actual); - } - /** * Test deserialising metadata */ From cf01afd04a76eec42e6c6f658fd4c00307cf8a0a Mon Sep 17 00:00:00 2001 From: Scribble Date: Sun, 2 Jun 2024 20:44:25 +0200 Subject: [PATCH 31/79] [PlaybackSerialiser] Renamed Extensions to FileCommands --- .../tasmod/events/EventPlaybackClient.java | 10 +-- .../tasmod/handlers/InterpolationHandler.java | 4 +- .../tasmod/playback/CommentHandler.java | 22 ++++-- .../playback/PlaybackControllerClient.java | 70 ++++++++++++------- .../extensions/PlaybackExtension.java | 40 ----------- .../filecommands/PlaybackFileCommand.java | 57 +++++++++++++++ .../PlaybackFileCommandsRegistry.java} | 37 +++++----- .../integrated/DesyncMonitorExtension.java | 16 +++++ .../playback/tasfile/PlaybackSerialiser.java | 6 +- .../playback/tasfile/PlaybackSerialiser2.java | 16 ++--- .../tasfile/flavor/SerialiserFlavorBase.java | 28 ++++---- .../tasmod/util/TASmodRegistry.java | 8 +-- .../tasfile/PlaybackSerialiserTest.java | 22 +++--- .../tasfile/SerialiserFlavorBaseTest.java | 12 ++-- 14 files changed, 207 insertions(+), 141 deletions(-) delete mode 100644 src/main/java/com/minecrafttas/tasmod/playback/extensions/PlaybackExtension.java create mode 100644 src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java rename src/main/java/com/minecrafttas/tasmod/playback/{extensions/PlaybackExtensionsRegistry.java => filecommands/PlaybackFileCommandsRegistry.java} (56%) create mode 100644 src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/DesyncMonitorExtension.java diff --git a/src/main/java/com/minecrafttas/tasmod/events/EventPlaybackClient.java b/src/main/java/com/minecrafttas/tasmod/events/EventPlaybackClient.java index a6c6c63e..dca5b577 100644 --- a/src/main/java/com/minecrafttas/tasmod/events/EventPlaybackClient.java +++ b/src/main/java/com/minecrafttas/tasmod/events/EventPlaybackClient.java @@ -3,7 +3,7 @@ import com.minecrafttas.mctcommon.events.EventListenerRegistry.EventBase; import com.minecrafttas.tasmod.playback.PlaybackControllerClient; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TASstate; -import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickInputContainer; +import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickContainer; public interface EventPlaybackClient { @@ -53,9 +53,9 @@ public interface EventRecordTick extends EventBase { * Fired when a tick is being recorded * * @param index The index of the tick that is being recorded - * @param container The {@link TickInputContainer} that is being recorded + * @param container The {@link TickContainer} that is being recorded */ - public void onRecordTick(long index, TickInputContainer container); + public void onRecordTick(long index, TickContainer container); } /** @@ -68,8 +68,8 @@ public interface EventPlaybackTick extends EventBase { * Fired when a tick is being recorded * * @param index The index of the tick that is being recorded - * @param container The {@link TickInputContainer} that is being recorded + * @param container The {@link TickContainer} that is being recorded */ - public void onPlaybackTick(long index, TickInputContainer container); + public void onPlaybackTick(long index, TickContainer container); } } diff --git a/src/main/java/com/minecrafttas/tasmod/handlers/InterpolationHandler.java b/src/main/java/com/minecrafttas/tasmod/handlers/InterpolationHandler.java index 0a904cab..a89bc899 100644 --- a/src/main/java/com/minecrafttas/tasmod/handlers/InterpolationHandler.java +++ b/src/main/java/com/minecrafttas/tasmod/handlers/InterpolationHandler.java @@ -3,7 +3,7 @@ import com.minecrafttas.mctcommon.events.EventClient.EventCamera; import com.minecrafttas.tasmod.TASmodClient; import com.minecrafttas.tasmod.playback.ControlByteHandler; -import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickInputContainer; +import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickContainer; import net.minecraft.client.Minecraft; import net.minecraft.util.math.MathHelper; @@ -23,7 +23,7 @@ public class InterpolationHandler implements EventCamera { @Override public CameraData onCameraEvent(CameraData dataIn) { if (TASmodClient.controller.isPlayingback() && ControlByteHandler.shouldInterpolate) { - TickInputContainer input = TASmodClient.controller.get(); + TickContainer input = TASmodClient.controller.get(); if (input == null) return dataIn; float nextPitch = input.getCameraAngle().getPitch(); diff --git a/src/main/java/com/minecrafttas/tasmod/playback/CommentHandler.java b/src/main/java/com/minecrafttas/tasmod/playback/CommentHandler.java index 562f95ec..3d77f6c6 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/CommentHandler.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/CommentHandler.java @@ -2,11 +2,13 @@ import java.io.IOException; import java.util.ArrayList; +import java.util.List; import com.dselent.bigarraylist.BigArrayList; /** - * Handles and stores everything related to comments in the TASfile + * Handles and stores everything related to comments in the TASfile.
+ * Comments also contain calls to playback extensions. * * @author Scribble */ @@ -35,7 +37,7 @@ public class CommentHandler { * * The index of the BigArrayList is the current tick. */ - BigArrayList> inlineComments; + private BigArrayList> inlineComments; /** * List of all endline comments.
@@ -46,17 +48,29 @@ public class CommentHandler { * 1|||1.0;1.0 // This is a second endline comment *
* - * Endline comments are suppoded to describe individual subticks.
+ * Endline comments are supposed to describe individual subticks.
* The index of the BigArrayList is the tick, the index of the ArrayList inside * of the BigArrayList is the subtick of that tick */ - BigArrayList> endlineComments; + private BigArrayList> endlineComments; public CommentHandler() { inlineComments = new BigArrayList<>(); endlineComments = new BigArrayList<>(); } + public void addInlineComment(ArrayList inlineCommentList) { + this.inlineComments.add(inlineCommentList); + } + + public void addEndlineComment(ArrayList endlineCommentList) { + this.endlineComments.add(endlineCommentList); + } + + public void runEndlineComment(long index) { + + } + public void clear() { try { inlineComments.clearMemory(); diff --git a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java index abfc7950..05c65bd0 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java @@ -14,6 +14,7 @@ import java.io.IOException; import java.io.Serializable; import java.nio.ByteBuffer; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -109,7 +110,7 @@ public class PlaybackControllerClient implements ClientPacketHandler, EventClien /** * The place where all inputs get stored */ - private BigArrayList inputs = new BigArrayList(directory + File.separator + "temp"); + private BigArrayList inputs = new BigArrayList(directory + File.separator + "temp"); /** * A map of control bytes. Used to change settings during playback via the @@ -262,7 +263,7 @@ public String setTASStateClient(TASstate stateIn, boolean verbose) { private void startRecording() { LOGGER.debug(LoggerMarkers.Playback, "Starting recording"); if (this.inputs.isEmpty()) { - inputs.add(new TickInputContainer()); + inputs.add(new TickContainer()); // desyncMonitor.recordNull(index); } } @@ -413,7 +414,7 @@ public void onClientTickPost(Minecraft mc) { private void recordNextTick() { index++; - TickInputContainer container = new TickInputContainer(keyboard.clone(), mouse.clone(), camera.clone()); + TickContainer container = new TickContainer(keyboard.clone(), mouse.clone(), camera.clone()); if (inputs.size() <= index) { if (inputs.size() < index) { LOGGER.warn("Index is {} inputs bigger than the container!", index - inputs.size()); @@ -457,7 +458,7 @@ private void playbackNextTick() { } /* Continue condition */ else { - TickInputContainer container = inputs.get(index); // Loads the new inputs from the container + TickContainer container = inputs.get(index); // Loads the new inputs from the container this.keyboard = container.getKeyboard().clone(); this.mouse = container.getMouse().clone(); this.camera = container.getCameraAngle().clone(); @@ -483,17 +484,17 @@ public long index() { return index; } - public BigArrayList getInputs() { + public BigArrayList getInputs() { return inputs; } - public void setInputs(BigArrayList inputs) { + public void setInputs(BigArrayList inputs) { try { inputs.clearMemory(); } catch (IOException e) { e.printStackTrace(); } - inputs = new BigArrayList(directory + File.separator + "temp"); + inputs = new BigArrayList(directory + File.separator + "temp"); SerialiserFlavorBase.addAll(this.inputs, inputs); } @@ -513,7 +514,7 @@ public void setIndex(int index) throws IndexOutOfBoundsException { if (index <= size()) { this.index = index; if (state == TASstate.PLAYBACK) { - TickInputContainer tickcontainer = inputs.get(index); + TickContainer tickcontainer = inputs.get(index); this.keyboard = tickcontainer.getKeyboard(); this.mouse = tickcontainer.getMouse(); this.camera = tickcontainer.getCameraAngle(); @@ -523,8 +524,8 @@ public void setIndex(int index) throws IndexOutOfBoundsException { } } - public TickInputContainer get(long index) { - TickInputContainer tickcontainer = null; + public TickContainer get(long index) { + TickContainer tickcontainer = null; try { tickcontainer = inputs.get(index); } catch (IndexOutOfBoundsException e) { @@ -534,9 +535,9 @@ public TickInputContainer get(long index) { } /** - * @return The {@link TickInputContainer} at the current index + * @return The {@link TickContainer} at the current index */ - public TickInputContainer get() { + public TickContainer get() { return get(index); } @@ -547,7 +548,7 @@ public void clear() { } catch (IOException e) { e.printStackTrace(); } - inputs = new BigArrayList(directory + File.separator + "temp"); + inputs = new BigArrayList(directory + File.separator + "temp"); controlBytes.clear(); comments.clear(); index = 0; @@ -576,9 +577,9 @@ public String toString() { * Clears {@link #keyboard} and {@link #mouse} */ public void unpressContainer() { -// LOGGER.trace(LoggerMarkers.Playback, "Unpressing container"); -// keyboard.clear(); -// mouse.clear(); + LOGGER.trace(LoggerMarkers.Playback, "Unpressing container"); + keyboard.clear(); + mouse.clear(); } // ============================================================== @@ -595,23 +596,28 @@ public void setPlayUntil(int until) { * @author Scribble * */ - public static class TickInputContainer implements Serializable { - - private static final long serialVersionUID = -3420565284438152474L; + public static class TickContainer implements Serializable { private VirtualKeyboard keyboard; private VirtualMouse mouse; private VirtualCameraAngle cameraAngle; + + private CommentContainer comments; - public TickInputContainer(VirtualKeyboard keyboard, VirtualMouse mouse, VirtualCameraAngle subticks) { + public TickContainer(VirtualKeyboard keyboard, VirtualMouse mouse, VirtualCameraAngle subticks) { + this(keyboard, mouse, subticks, null); + } + + public TickContainer(VirtualKeyboard keyboard, VirtualMouse mouse, VirtualCameraAngle camera, CommentContainer comments) { this.keyboard = keyboard; this.mouse = mouse; - this.cameraAngle = subticks; + this.cameraAngle = camera; + this.comments = comments; } - public TickInputContainer() { + public TickContainer() { this.keyboard = new VirtualKeyboard(); this.mouse = new VirtualMouse(); this.cameraAngle = new VirtualCameraAngle(); @@ -634,20 +640,32 @@ public VirtualCameraAngle getCameraAngle() { return cameraAngle; } + public CommentContainer getComments() { + return comments; + } + @Override - public TickInputContainer clone() { - return new TickInputContainer(keyboard, mouse, cameraAngle); + public TickContainer clone() { + return new TickContainer(keyboard, mouse, cameraAngle); } @Override public boolean equals(Object other) { - if (other instanceof TickInputContainer) { - TickInputContainer container = (TickInputContainer) other; + if (other instanceof TickContainer) { + TickContainer container = (TickContainer) other; return keyboard.equals(container.keyboard) || mouse.equals(container.mouse) || cameraAngle.equals(container.cameraAngle); } return super.equals(other); } } + + public static class CommentContainer implements Serializable{ + + List inlineComments = new ArrayList<>(); + List endlineComments = new ArrayList<>(); + + + } /** * State of the input recorder diff --git a/src/main/java/com/minecrafttas/tasmod/playback/extensions/PlaybackExtension.java b/src/main/java/com/minecrafttas/tasmod/playback/extensions/PlaybackExtension.java deleted file mode 100644 index 33c0f31e..00000000 --- a/src/main/java/com/minecrafttas/tasmod/playback/extensions/PlaybackExtension.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.minecrafttas.tasmod.playback.extensions; - -import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickInputContainer; - -public abstract class PlaybackExtension { - - protected boolean enabled=false; - - public abstract String extensionName(); - - public void onEnable() {}; - - public void onDisable() {}; - - public void onRecord(long tick, TickInputContainer container) {}; - - public void onPlayback(long tick, TickInputContainer container) {}; - - public String onSerialiseSingleComment(long tick, String line) { - return line; - } - - public void onDeserialiseSingleComment(long tick, String line) {} - - public void onSerialiseCommentAtEnd(long tick, String line) {} - - public void onDeserialiseCommentAtEnd(long tick, String line) {} - - public boolean isEnabled() { - return enabled; - } - - public void setEnabled(boolean enabled) { - if(enabled) - onEnable(); - else - onDisable(); - this.enabled = enabled; - } -} diff --git a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java new file mode 100644 index 00000000..8d5d49cc --- /dev/null +++ b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java @@ -0,0 +1,57 @@ +package com.minecrafttas.tasmod.playback.filecommands; + +import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickContainer; + +public class PlaybackFileCommand{ + + private String name; + + private String[] args; + + public PlaybackFileCommand(String name, String... args) { + this.name = name; + this.args = args; + } + + public static abstract class PlaybackFileCommandExtension { + + protected boolean enabled=false; + + public abstract String name(); + + public String[] controlByteNames() { + return null; + } + + public void onEnable() {}; + + public void onDisable() {}; + + public void onRecord(long tick, TickContainer container) {}; + + public void onPlayback(long tick, TickContainer container) {}; + + public String onSerialiseSingleComment(long tick, String line) { + return line; + } + + public void onDeserialiseSingleComment(long tick, String line) {} + + public void onSerialiseCommentAtEnd(long tick, String line) {} + + public void onDeserialiseCommentAtEnd(long tick, String line) {} + + public boolean isEnabled() { + return enabled; + } + + public void setEnabled(boolean enabled) { + if(enabled) + onEnable(); + else + onDisable(); + this.enabled = enabled; + } + } +} + diff --git a/src/main/java/com/minecrafttas/tasmod/playback/extensions/PlaybackExtensionsRegistry.java b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommandsRegistry.java similarity index 56% rename from src/main/java/com/minecrafttas/tasmod/playback/extensions/PlaybackExtensionsRegistry.java rename to src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommandsRegistry.java index 20cc7ee8..962d233c 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/extensions/PlaybackExtensionsRegistry.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommandsRegistry.java @@ -1,4 +1,4 @@ -package com.minecrafttas.tasmod.playback.extensions; +package com.minecrafttas.tasmod.playback.filecommands; import java.util.ArrayList; import java.util.LinkedHashMap; @@ -7,18 +7,19 @@ import com.minecrafttas.mctcommon.registry.AbstractRegistry; import com.minecrafttas.tasmod.TASmod; import com.minecrafttas.tasmod.events.EventPlaybackClient; -import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickInputContainer; +import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickContainer; +import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandExtension; -public class PlaybackExtensionsRegistry extends AbstractRegistry implements EventPlaybackClient.EventRecordTick, EventPlaybackClient.EventPlaybackTick { +public class PlaybackFileCommandsRegistry extends AbstractRegistry implements EventPlaybackClient.EventRecordTick, EventPlaybackClient.EventPlaybackTick { - private List enabledExtensions = new ArrayList<>(); + private List enabledExtensions = new ArrayList<>(); - public PlaybackExtensionsRegistry() { + public PlaybackFileCommandsRegistry() { super(new LinkedHashMap<>()); } @Override - public void register(PlaybackExtension extension) { + public void register(PlaybackFileCommandExtension extension) { if (extension == null) { throw new NullPointerException("Tried to register a serialiser flavor. But flavor is null."); } @@ -28,36 +29,36 @@ public void register(PlaybackExtension extension) { return; } - if (REGISTRY.containsKey(extension.extensionName())) { - TASmod.LOGGER.warn("Trying to register the playback extension{}, but a flavor with the same name is already registered!", extension.extensionName()); + if (REGISTRY.containsKey(extension.name())) { + TASmod.LOGGER.warn("Trying to register the playback extension{}, but a flavor with the same name is already registered!", extension.name()); return; } - REGISTRY.put(extension.extensionName(), extension); + REGISTRY.put(extension.name(), extension); } @Override - public void unregister(PlaybackExtension extension) { + public void unregister(PlaybackFileCommandExtension extension) { if (extension == null) { throw new NullPointerException("Tried to unregister an playback extension with value null"); } - if (REGISTRY.containsKey(extension.extensionName())) { - REGISTRY.remove(extension.extensionName()); + if (REGISTRY.containsKey(extension.name())) { + REGISTRY.remove(extension.name()); } else { TASmod.LOGGER.warn("Trying to unregister the playback extension {}, but it was not registered!", extension.getClass().getName()); } } public void setEnabled(String extensionName, boolean enabled) { - PlaybackExtension extension = REGISTRY.get(extensionName); + PlaybackFileCommandExtension extension = REGISTRY.get(extensionName); extension.setEnabled(enabled); enabledExtensions = getEnabled(); } - public List getEnabled() { - List out = new ArrayList<>(); + public List getEnabled() { + List out = new ArrayList<>(); - for(PlaybackExtension element : REGISTRY.values()) { + for(PlaybackFileCommandExtension element : REGISTRY.values()) { if(element.isEnabled()) { out.add(element); } @@ -67,14 +68,14 @@ public List getEnabled() { } @Override - public void onPlaybackTick(long index, TickInputContainer container) { + public void onPlaybackTick(long index, TickContainer container) { enabledExtensions.forEach(extension -> { extension.onRecord(index, container); }); } @Override - public void onRecordTick(long index, TickInputContainer container) { + public void onRecordTick(long index, TickContainer container) { enabledExtensions.forEach(extension -> { extension.onPlayback(index, container); }); diff --git a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/DesyncMonitorExtension.java b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/DesyncMonitorExtension.java new file mode 100644 index 00000000..1c084a3f --- /dev/null +++ b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/DesyncMonitorExtension.java @@ -0,0 +1,16 @@ +package com.minecrafttas.tasmod.playback.filecommands.integrated; + +import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandExtension; + +public class DesyncMonitorExtension extends PlaybackFileCommandExtension{ + + @Override + public String name() { + return "tasmod_desyncMonitor"; + } + + @Override + public void onSerialiseCommentAtEnd(long tick, String line) { + super.onSerialiseCommentAtEnd(tick, line); + } +} diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser.java index b5ee9424..4d2bd141 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser.java @@ -5,7 +5,7 @@ import com.minecrafttas.tasmod.monitoring.DesyncMonitoring; import com.minecrafttas.tasmod.playback.ControlByteHandler; import com.minecrafttas.tasmod.playback.PlaybackControllerClient; -import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickInputContainer; +import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickContainer; import com.minecrafttas.tasmod.util.FileThread; import com.minecrafttas.tasmod.util.LoggerMarkers; import com.minecrafttas.tasmod.virtual.VirtualCameraAngle; @@ -130,7 +130,7 @@ public void saveToFileV1Until(File file, PlaybackControllerClient container, lon // + "#############################################################################################################\n" // + "#Comments start with \"//\" at the start of the line, comments with # will not be saved\n"); - BigArrayList ticks = container.getInputs(); + BigArrayList ticks = container.getInputs(); Map>> cbytes= container.getControlBytes(); // Map> comments = container.getComments(); @@ -157,7 +157,7 @@ public void saveToFileV1Until(File file, PlaybackControllerClient container, lon } // Add a data line - TickInputContainer tickInput = ticks.get(i); + TickContainer tickInput = ticks.get(i); fileThread.addLine(tickInput.toString() + "~&\t\t\t\t//Monitoring:"+container.desyncMonitor.get(i)+"\n"); } fileThread.close(); diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java index cb648d1d..622cc295 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java @@ -10,8 +10,8 @@ import com.dselent.bigarraylist.BigArrayList; import com.minecrafttas.tasmod.playback.PlaybackControllerClient; -import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickInputContainer; -import com.minecrafttas.tasmod.playback.extensions.PlaybackExtension; +import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickContainer; +import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandExtension; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata; import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackLoadException; import com.minecrafttas.tasmod.playback.tasfile.flavor.SerialiserFlavorBase; @@ -44,7 +44,7 @@ public static void saveToFile(File file, PlaybackControllerClient controller, St saveToFile(file, controller.getInputs(), flavorname); } - public static void saveToFile(File file, BigArrayList container, String flavorname) throws FileNotFoundException { + public static void saveToFile(File file, BigArrayList container, String flavorname) throws FileNotFoundException { if (file == null) { throw new NullPointerException("Save to file failed. No file specified"); } @@ -64,7 +64,7 @@ public static void saveToFile(File file, BigArrayList contai List metadataList = TASmodRegistry.PLAYBACK_METADATA.handleOnStore(); - List extensionList = TASmodRegistry.PLAYBACK_EXTENSION.getEnabled(); + List extensionList = TASmodRegistry.PLAYBACK_FILE_COMMAND.getEnabled(); for (String line : flavor.serialiseHeader(metadataList, extensionList)) { writerThread.addLine(line); @@ -85,7 +85,7 @@ public static void saveToFile(File file, BigArrayList contai * @return The loaded {@link PlaybackControllerClient} * @throws IOException */ - public static BigArrayList loadFromFile(File file) throws PlaybackLoadException, IOException { + public static BigArrayList loadFromFile(File file) throws PlaybackLoadException, IOException { if (file == null) { throw new PlaybackLoadException("Load from file failed. No file specified"); } @@ -120,7 +120,7 @@ public static BigArrayList loadFromFile(File file) throws Pl return loadFromFile(file, flavor); } - public static BigArrayList loadFromFile(File file, String flavorName) throws PlaybackLoadException, IOException { + public static BigArrayList loadFromFile(File file, String flavorName) throws PlaybackLoadException, IOException { if(flavorName == null || flavorName.isEmpty()) { throw new PlaybackLoadException("Flavor name is null or empty"); } @@ -134,7 +134,7 @@ public static BigArrayList loadFromFile(File file, String fl return loadFromFile(file, flavor); } - public static BigArrayList loadFromFile(File file, SerialiserFlavorBase flavor) throws PlaybackLoadException, IOException { + public static BigArrayList loadFromFile(File file, SerialiserFlavorBase flavor) throws PlaybackLoadException, IOException { // Read file BufferedReader reader = null; @@ -164,7 +164,7 @@ public static BigArrayList loadFromFile(File file, Serialise TASmodRegistry.PLAYBACK_METADATA.handleOnLoad(deserialisedMetadata); // Deserialise main data - BigArrayList deserialisedContainers = flavor.deserialise(lines, headerLines.size()); + BigArrayList deserialisedContainers = flavor.deserialise(lines, headerLines.size()); return deserialisedContainers; } diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java index 8d209bd9..e41ffa00 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java @@ -11,8 +11,8 @@ import java.util.regex.Pattern; import com.dselent.bigarraylist.BigArrayList; -import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickInputContainer; -import com.minecrafttas.tasmod.playback.extensions.PlaybackExtension; +import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickContainer; +import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandExtension; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata; import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackLoadException; import com.minecrafttas.tasmod.virtual.VirtualCameraAngle; @@ -63,11 +63,11 @@ protected String headerEnd() { ==============================================*/ - public List serialiseHeader(List metadataList, List extensionList) { + public List serialiseHeader(List metadataList, List extensionList) { List out = new ArrayList<>(); out.add(headerStart()); serialiseFlavorName(out); - serialiseExtensionNames(out, extensionList); +// serialiseControlByteNames(out, extensionList); serialiseMetadata(out, metadataList); out.add(headerEnd()); return out; @@ -77,9 +77,9 @@ protected void serialiseFlavorName(List out) { out.add("Flavor: " + flavorName()); } - protected void serialiseExtensionNames(List out, List extensionList) { + protected void serialiseControlByteNames(List out, List extensionList) { List stringlist = new ArrayList<>(); - extensionList.forEach(extension -> stringlist.add(extension.extensionName())); + extensionList.forEach(extension -> stringlist.add(extension.name())); out.add("Extensions: " + String.join(", ", stringlist)); } @@ -100,18 +100,18 @@ protected void serialiseMetadataValue(List out, LinkedHashMap serialise(BigArrayList inputs) { + public BigArrayList serialise(BigArrayList inputs) { BigArrayList out = new BigArrayList<>(); for (int i = 0; i < inputs.size(); i++) { currentTick = i; - TickInputContainer container = inputs.get(i); + TickContainer container = inputs.get(i); serialiseContainer(out, container); } return out; } - protected void serialiseContainer(BigArrayList out, TickInputContainer container) { + protected void serialiseContainer(BigArrayList out, TickContainer container) { List serialisedKeyboard = serialiseKeyboard(container.getKeyboard()); List serialisedMouse = serialiseMouse(container.getMouse()); List serialisedCameraAngle = serialiseCameraAngle(container.getCameraAngle()); @@ -267,10 +267,10 @@ public List deserialiseMetadata(List headerLines) { * * @param lines The serialised lines of the TASfile * @param startPos The position when the header ends and the inputs start - * @return A list of {@link TickInputContainer} + * @return A list of {@link TickContainer} */ - public BigArrayList deserialise(BigArrayList lines, long startPos) { - BigArrayList out = new BigArrayList<>(); + public BigArrayList deserialise(BigArrayList lines, long startPos) { + BigArrayList out = new BigArrayList<>(); for (long i = startPos; i < lines.size(); i++) { List tick = new ArrayList<>(); @@ -310,7 +310,7 @@ protected long extractContainer(List extracted, BigArrayList lin return startPos + counter - 1; } - protected void deserialiseContainer(BigArrayList out, List containerLines) { + protected void deserialiseContainer(BigArrayList out, List containerLines) { List commentLines = new ArrayList<>(); List tickLines = new ArrayList<>(); @@ -329,7 +329,7 @@ protected void deserialiseContainer(BigArrayList out, List *
- * Extensions give the opportunity to run on each recorded tick and each played back tick.
- * Extensions also have access to the TASFile so that data can be stored and read in/from the TASFile. + * File commands give the opportunity to run commands on each recorded tick and each played back tick.
+ * File commands also have access to the TASFile so that data can be stored and read in/from the TASFile. * */ - public static final PlaybackExtensionsRegistry PLAYBACK_EXTENSION = new PlaybackExtensionsRegistry(); + public static final PlaybackFileCommandsRegistry PLAYBACK_FILE_COMMAND = new PlaybackFileCommandsRegistry(); /** * Registry for registering custom serialiser flavors that dictate the syntax of the inputs stored in the TASfile.
diff --git a/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java b/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java index a484493e..28684323 100644 --- a/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java +++ b/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java @@ -15,8 +15,8 @@ import org.junit.jupiter.api.Test; import com.dselent.bigarraylist.BigArrayList; -import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickInputContainer; -import com.minecrafttas.tasmod.playback.extensions.PlaybackExtension; +import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickContainer; +import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandExtension; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadataRegistry.PlaybackMetadataExtension; import com.minecrafttas.tasmod.playback.tasfile.PlaybackSerialiser2; @@ -74,10 +74,10 @@ public void onClear() { } - private static class TestExtension extends PlaybackExtension { + private static class TestExtension extends PlaybackFileCommandExtension { @Override - public String extensionName() { + public String name() { return "tasmod_testExtension"; } @@ -93,23 +93,23 @@ public String extensionName() { static void register() { TASmodRegistry.SERIALISER_FLAVOR.register(testFlavor); TASmodRegistry.PLAYBACK_METADATA.register(testMetadata); - TASmodRegistry.PLAYBACK_EXTENSION.register(testExtension); + TASmodRegistry.PLAYBACK_FILE_COMMAND.register(testExtension); } @AfterAll static void unregister() { TASmodRegistry.SERIALISER_FLAVOR.unregister(testFlavor); TASmodRegistry.PLAYBACK_METADATA.unregister(testMetadata); - TASmodRegistry.PLAYBACK_EXTENSION.unregister(testExtension); + TASmodRegistry.PLAYBACK_FILE_COMMAND.unregister(testExtension); } @Test @Disabled void testSerialiser() { - BigArrayList expected = new BigArrayList<>(); + BigArrayList expected = new BigArrayList<>(); testMetadata.testValue = "testing"; - TASmodRegistry.PLAYBACK_EXTENSION.setEnabled("tasmod_testExtension", true); + TASmodRegistry.PLAYBACK_FILE_COMMAND.setEnabled("tasmod_testExtension", true); // Tick 1 // Keyboard @@ -127,7 +127,7 @@ void testSerialiser() { angle1.set(0, 0); angle1.updateFromEvent(10, 10); - expected.add(new TickInputContainer(keyboard1, mouse1, angle1)); + expected.add(new TickContainer(keyboard1, mouse1, angle1)); // Tick 2 @@ -148,7 +148,7 @@ void testSerialiser() { angle2.deepCopyFrom(angle1); angle2.updateFromEvent(-10, -10); - expected.add(new TickInputContainer(keyboard2, mouse2, angle2)); + expected.add(new TickContainer(keyboard2, mouse2, angle2)); try { PlaybackSerialiser2.saveToFile(file, expected, "Test"); @@ -157,7 +157,7 @@ void testSerialiser() { } try { - BigArrayList actual = PlaybackSerialiser2.loadFromFile(file, testFlavor); + BigArrayList actual = PlaybackSerialiser2.loadFromFile(file, testFlavor); assertBigArrayList(expected, actual); assertEquals("testing", testMetadata.actual); } catch (PlaybackLoadException | IOException e) { diff --git a/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java b/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java index 49a5b2fb..b3d49bd4 100644 --- a/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java +++ b/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java @@ -14,7 +14,7 @@ import org.junit.jupiter.api.Test; import com.dselent.bigarraylist.BigArrayList; -import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickInputContainer; +import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickContainer; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadataRegistry.PlaybackMetadataExtension; import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackLoadException; @@ -138,7 +138,7 @@ void testSerialiseMetadata() { } /** - * Test serialising a {@link TickInputContainer}.
+ * Test serialising a {@link TickContainer}.
* This container contains a keyboard, mouse and camera angle,
* with different amounts of subticks each. */ @@ -161,7 +161,7 @@ void testSerialiseContainer() { angle.updateFromEvent(1, 1); // Create container and fill actual - TickInputContainer container = new TickInputContainer(keyboard, mouse, angle); + TickContainer container = new TickContainer(keyboard, mouse, angle); BigArrayList actual = new BigArrayList<>(); serialiseContainer(actual, container); @@ -319,7 +319,7 @@ void testExtractTick() { */ @Test void testDeserialiseContainer() { - BigArrayList actual = new BigArrayList<>(); + BigArrayList actual = new BigArrayList<>(); List tick = new ArrayList<>(); tick.add("55|W,LCONTROL;w|;0,887,626|17.85;-202.74799"); tick.add("\t1||RC;-15,1580,658|11.85;-2.74799"); @@ -327,7 +327,7 @@ void testDeserialiseContainer() { deserialiseContainer(actual, tick); - BigArrayList expected = new BigArrayList<>(); + BigArrayList expected = new BigArrayList<>(); VirtualKeyboard keyboard = new VirtualKeyboard(); keyboard.updateFromState(new int[] { VirtualKey.W.getKeycode(), VirtualKey.LCONTROL.getKeycode() }, new char[] { 'w' }); @@ -342,7 +342,7 @@ void testDeserialiseContainer() { cameraAngle.updateFromState(11.85F, -2.74799F); cameraAngle.updateFromState(45F, -22.799F); - expected.add(new TickInputContainer(keyboard, mouse, cameraAngle)); + expected.add(new TickContainer(keyboard, mouse, cameraAngle)); assertBigArrayList(expected, actual); } From 451ad0d468a1b87cd50e736f6753d175ab29eec9 Mon Sep 17 00:00:00 2001 From: Scribble Date: Tue, 4 Jun 2024 23:03:23 +0200 Subject: [PATCH 32/79] [PlaybackSerialiser] Added serialising inline and endline comments --- .../playback/PlaybackControllerClient.java | 23 +++++- .../tasfile/flavor/SerialiserFlavorBase.java | 77 ++++++++++++++----- .../tasfile/SerialiserFlavorBaseTest.java | 4 +- 3 files changed, 79 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java index 05c65bd0..29f9b1ae 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java @@ -661,10 +661,29 @@ public boolean equals(Object other) { public static class CommentContainer implements Serializable{ - List inlineComments = new ArrayList<>(); - List endlineComments = new ArrayList<>(); + List inlineComments; + List endlineComments; + public CommentContainer() { + this(new ArrayList<>(), new ArrayList<>()); + } + + public CommentContainer(List inlineComments, List endlineComments) { + this.inlineComments=inlineComments; + this.endlineComments=endlineComments; + } + + public void addInlineComment(String inlineComment) { + inlineComments.add(inlineComment); + } + + public void addEndlineComment(String endlineComment) { + endlineComments.add(endlineComment); + } + public List getInlineComments() { + return inlineComments; + } } /** diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java index e41ffa00..afa131ee 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java @@ -11,6 +11,7 @@ import java.util.regex.Pattern; import com.dselent.bigarraylist.BigArrayList; +import com.minecrafttas.tasmod.playback.PlaybackControllerClient.CommentContainer; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickContainer; import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandExtension; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata; @@ -67,7 +68,7 @@ public List serialiseHeader(List metadataList, List out = new ArrayList<>(); out.add(headerStart()); serialiseFlavorName(out); -// serialiseControlByteNames(out, extensionList); + // serialiseControlByteNames(out, extensionList); serialiseMetadata(out, metadataList); out.add(headerEnd()); return out; @@ -115,8 +116,12 @@ protected void serialiseContainer(BigArrayList out, TickContainer contai List serialisedKeyboard = serialiseKeyboard(container.getKeyboard()); List serialisedMouse = serialiseMouse(container.getMouse()); List serialisedCameraAngle = serialiseCameraAngle(container.getCameraAngle()); + List serialisedInlineCommments = serialiseInlineComments(container.getComments()); + List serialisedEndlineComments = serialiseEndlineComments(container.getComments()); - mergeInputs(out, serialisedKeyboard, serialisedMouse, serialisedCameraAngle); + addAll(out, serialisedInlineCommments); + + mergeInputs(out, serialisedKeyboard, serialisedMouse, serialisedCameraAngle, serialisedEndlineComments); } protected List serialiseKeyboard(VirtualKeyboard keyboard) { @@ -144,16 +149,39 @@ protected List serialiseCameraAngle(VirtualCameraAngle cameraAngle) { return out; } - protected void mergeInputs(BigArrayList out, List serialisedKeyboard, List serialisedMouse, List serialisedCameraAngle) { + protected List serialiseInlineComments(CommentContainer container) { + List out = new ArrayList<>(); + if(container == null) { + return out; + } + for (String comment : container.getInlineComments()) { + if (comment != null) { + out.add("// " + comment); + } + } + return out; + } + + protected List serialiseEndlineComments(CommentContainer container) { + return serialiseInlineComments(container); + } + + protected void mergeInputs(BigArrayList out, List serialisedKeyboard, List serialisedMouse, List serialisedCameraAngle, List serialisedEndlineComments) { Queue keyboardQueue = new LinkedBlockingQueue<>(serialisedKeyboard); Queue mouseQueue = new LinkedBlockingQueue<>(serialisedMouse); Queue cameraAngleQueue = new LinkedBlockingQueue<>(serialisedCameraAngle); + Queue endlineQueue = new LinkedBlockingQueue<>(serialisedEndlineComments); String kb = getOrEmpty(keyboardQueue.poll()); String ms = getOrEmpty(mouseQueue.poll()); String ca = getOrEmpty(cameraAngleQueue.poll()); - out.add(String.format("%s|%s|%s|%s", currentTick, kb, ms, ca)); + String elc = getOrEmpty(endlineQueue.poll()); + if (!elc.isEmpty()) { + elc = "\t\t" + elc; + } + + out.add(String.format("%s|%s|%s|%s%s", currentTick, kb, ms, ca, elc)); currentSubtick = 0; while (!keyboardQueue.isEmpty() || !mouseQueue.isEmpty() || !cameraAngleQueue.isEmpty()) { @@ -197,7 +225,7 @@ public boolean deserialiseFlavorName(List headerLines) { public void deserialiseHeader(List headerLines, List metadataList, List activeExtensionList) { metadataList.addAll(deserialiseMetadata(headerLines)); } - + public List extractHeader(BigArrayList lines) { List extracted = new ArrayList<>(); @@ -228,7 +256,7 @@ public List deserialiseExtensions(List headerLines) { } throw new PlaybackLoadException("Extensions value was not found in the header"); } - + public List deserialiseMetadata(List headerLines) { List out = new ArrayList<>(); @@ -237,14 +265,14 @@ public List deserialiseMetadata(List headerLines) { for (String headerLine : headerLines) { - Matcher nameMatcher = extract("^#{3} (.+)", headerLine); // If the line starts with ###, an optional space char after and then capture the name - Matcher valueMatcher = extract("^([^#].*?):\\s*(.+)", headerLine); // If the line doesn't start with a #, then the key of the metadata, then a : then any or no number of whitespace chars, then the value of the metadata - + Matcher nameMatcher = extract("^#{3} (.+)", headerLine); // If the line starts with ###, an optional space char after and then capture the name + Matcher valueMatcher = extract("^([^#].*?):\\s*(.+)", headerLine); // If the line doesn't start with a #, then the key of the metadata, then a : then any or no number of whitespace chars, then the value of the metadata + if (nameMatcher.find()) { if (metadataName != null && !metadataName.equals(nameMatcher.group(1))) { // If metadataName is null, then the first section begins - // If metadataName is different than the newMetadataName, - // then a new section begins and we first need to store the old. + // If metadataName is different than the newMetadataName, + // then a new section begins and we first need to store the old. out.add(PlaybackMetadata.fromHashMap(metadataName, values)); values.clear(); } @@ -255,10 +283,10 @@ public List deserialiseMetadata(List headerLines) { values.put(valueMatcher.group(1), valueMatcher.group(2)); } } - - if(metadataName!=null) + + if (metadataName != null) out.add(PlaybackMetadata.fromHashMap(metadataName, values)); - + return out; } @@ -312,22 +340,21 @@ protected long extractContainer(List extracted, BigArrayList lin protected void deserialiseContainer(BigArrayList out, List containerLines) { - List commentLines = new ArrayList<>(); List tickLines = new ArrayList<>(); + List inlineComments = new ArrayList<>(); - splitContainer(containerLines, commentLines, tickLines); - + splitContainer(containerLines, inlineComments, tickLines); + List keyboardStrings = new ArrayList<>(); List mouseStrings = new ArrayList<>(); List cameraAngleStrings = new ArrayList<>(); - List commentsAtEnd = new ArrayList<>(); + List endlineComments = new ArrayList<>(); - splitInputs(containerLines, keyboardStrings, mouseStrings, cameraAngleStrings, commentsAtEnd); + splitInputs(containerLines, keyboardStrings, mouseStrings, cameraAngleStrings, endlineComments); VirtualKeyboard keyboard = deserialiseKeyboard(keyboardStrings); VirtualMouse mouse = deserialiseMouse(mouseStrings); VirtualCameraAngle cameraAngle = deserialiseCameraAngle(cameraAngleStrings); - // TODO Store commentsAtEnd out.add(new TickContainer(keyboard, mouse, cameraAngle)); } @@ -340,12 +367,20 @@ protected void deserialiseContainer(BigArrayList out, List lines, List comments, List tick) { for (String line : lines) { if (contains(singleComment(), line)) { - comments.add(line); + comments.add(deserialiseInlineComment(line)); } else { tick.add(line); } } } + + protected String deserialiseInlineComment(String comment) { + return extract("^// ?(.+)", comment, 1); + } + + protected String deserialiseEndlineComment(String comment) { + return deserialiseInlineComment(comment); + } protected VirtualKeyboard deserialiseKeyboard(List keyboardStrings) { VirtualKeyboard out = new VirtualKeyboard(); diff --git a/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java b/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java index b3d49bd4..c42c10b7 100644 --- a/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java +++ b/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java @@ -434,8 +434,8 @@ void testSplitContainer() { List expectedComments = new ArrayList<>(); List expectedTicks = new ArrayList<>(); - expectedComments.add("// $interpolation(on);"); - expectedComments.add("// Test"); + expectedComments.add("$interpolation(on);"); + expectedComments.add("Test"); expectedTicks.add("55|W,LCONTROL;w|;0,887,626|17.85;-202.74799"); expectedTicks.add("\t1||RC;-15,1580,658|11.85;-2.74799"); From d11b157c92b6271bb4448edfc7c9b4f3e8ab3237 Mon Sep 17 00:00:00 2001 From: Scribble Date: Thu, 6 Jun 2024 18:34:07 +0200 Subject: [PATCH 33/79] [PlaybackSerialiser] Added serialising FileCommandExtensions --- .../playback/tasfile/PlaybackSerialiser2.java | 11 ++--- .../tasfile/flavor/SerialiserFlavorBase.java | 48 ++++++++++++------- .../tasfile/PlaybackSerialiserTest.java | 4 +- .../tasfile/SerialiserFlavorBaseTest.java | 2 +- 4 files changed, 38 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java index 622cc295..a25df1f2 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java @@ -61,16 +61,15 @@ public static void saveToFile(File file, BigArrayList container, writerThread.start(); SerialiserFlavorBase flavor = TASmodRegistry.SERIALISER_FLAVOR.getFlavor(flavorname); - - List metadataList = TASmodRegistry.PLAYBACK_METADATA.handleOnStore(); - List extensionList = TASmodRegistry.PLAYBACK_FILE_COMMAND.getEnabled(); + List metadataList = TASmodRegistry.PLAYBACK_METADATA.handleOnStore(); + List filecommandextensionList = TASmodRegistry.PLAYBACK_FILE_COMMAND.getEnabled(); - for (String line : flavor.serialiseHeader(metadataList, extensionList)) { + for (String line : flavor.serialiseHeader(metadataList, filecommandextensionList)) { writerThread.addLine(line); } - BigArrayList tickLines = flavor.serialise(container); + BigArrayList tickLines = flavor.serialise(container, filecommandextensionList); for (long i = 0; i < tickLines.size(); i++) { writerThread.addLine(tickLines.get(i)); } @@ -155,7 +154,7 @@ public static BigArrayList loadFromFile(File file, SerialiserFlav reader.close(); // Deserialise Header - List headerLines = new ArrayList<>(); + List headerLines = flavor.extractHeader(lines); List deserialisedMetadata = new ArrayList<>(); List deserialisedExtensionNames = new ArrayList<>(); diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java index afa131ee..530bdd7f 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java @@ -68,7 +68,7 @@ public List serialiseHeader(List metadataList, List out = new ArrayList<>(); out.add(headerStart()); serialiseFlavorName(out); - // serialiseControlByteNames(out, extensionList); + serialiseFileCommandNames(out, extensionList); serialiseMetadata(out, metadataList); out.add(headerEnd()); return out; @@ -78,10 +78,10 @@ protected void serialiseFlavorName(List out) { out.add("Flavor: " + flavorName()); } - protected void serialiseControlByteNames(List out, List extensionList) { + protected void serialiseFileCommandNames(List out, List extensionList) { List stringlist = new ArrayList<>(); extensionList.forEach(extension -> stringlist.add(extension.name())); - out.add("Extensions: " + String.join(", ", stringlist)); + out.add("FC_Extensions: " + String.join(", ", stringlist)); } protected void serialiseMetadata(List out, List metadataList) { @@ -101,23 +101,23 @@ protected void serialiseMetadataValue(List out, LinkedHashMap serialise(BigArrayList inputs) { + public BigArrayList serialise(BigArrayList inputs, List filecommandextensionList) { BigArrayList out = new BigArrayList<>(); for (int i = 0; i < inputs.size(); i++) { currentTick = i; TickContainer container = inputs.get(i); - serialiseContainer(out, container); + serialiseContainer(out, container, filecommandextensionList); } return out; } - protected void serialiseContainer(BigArrayList out, TickContainer container) { + protected void serialiseContainer(BigArrayList out, TickContainer container, List filecommandextensionList) { List serialisedKeyboard = serialiseKeyboard(container.getKeyboard()); List serialisedMouse = serialiseMouse(container.getMouse()); List serialisedCameraAngle = serialiseCameraAngle(container.getCameraAngle()); - List serialisedInlineCommments = serialiseInlineComments(container.getComments()); - List serialisedEndlineComments = serialiseEndlineComments(container.getComments()); + List serialisedInlineCommments = serialiseInlineComments(container.getComments(), filecommandextensionList); + List serialisedEndlineComments = serialiseEndlineComments(container.getComments(), filecommandextensionList); addAll(out, serialisedInlineCommments); @@ -149,9 +149,9 @@ protected List serialiseCameraAngle(VirtualCameraAngle cameraAngle) { return out; } - protected List serialiseInlineComments(CommentContainer container) { + protected List serialiseInlineComments(CommentContainer container, List filecommandextensionList) { List out = new ArrayList<>(); - if(container == null) { + if (container == null) { return out; } for (String comment : container.getInlineComments()) { @@ -162,8 +162,17 @@ protected List serialiseInlineComments(CommentContainer container) { return out; } - protected List serialiseEndlineComments(CommentContainer container) { - return serialiseInlineComments(container); + protected List serialiseEndlineComments(CommentContainer container, List filecommandextensionList) { + List out = new ArrayList<>(); + if (container == null) { + return out; + } + for (String comment : container.getInlineComments()) { + if (comment != null) { + out.add("// " + comment); + } + } + return out; } protected void mergeInputs(BigArrayList out, List serialisedKeyboard, List serialisedMouse, List serialisedCameraAngle, List serialisedEndlineComments) { @@ -223,7 +232,9 @@ public boolean deserialiseFlavorName(List headerLines) { } public void deserialiseHeader(List headerLines, List metadataList, List activeExtensionList) { + metadataList.addAll(deserialiseMetadata(headerLines)); + deserialiseFileCommandNames(headerLines); } public List extractHeader(BigArrayList lines) { @@ -243,9 +254,9 @@ public List extractHeader(BigArrayList lines) { throw new PlaybackLoadException("Cannot find the end of the header"); } - public List deserialiseExtensions(List headerLines) { + public List deserialiseFileCommandNames(List headerLines) { for (String line : headerLines) { - Matcher matcher = extract("Extensions: ?(.*)", line); + Matcher matcher = extract("FC_Extensions: ?(.*)", line); if (matcher.find()) { String extensionStrings = matcher.group(1); @@ -344,7 +355,7 @@ protected void deserialiseContainer(BigArrayList out, List inlineComments = new ArrayList<>(); splitContainer(containerLines, inlineComments, tickLines); - + List keyboardStrings = new ArrayList<>(); List mouseStrings = new ArrayList<>(); List cameraAngleStrings = new ArrayList<>(); @@ -355,8 +366,9 @@ protected void deserialiseContainer(BigArrayList out, List lines, List comments, List expected = new BigArrayList<>(); @@ -161,7 +161,7 @@ void testSerialiser() { assertBigArrayList(expected, actual); assertEquals("testing", testMetadata.actual); } catch (PlaybackLoadException | IOException e) { - e.printStackTrace(); + fail(e); } finally { file.delete(); } diff --git a/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java b/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java index c42c10b7..eda92dc0 100644 --- a/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java +++ b/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java @@ -163,7 +163,7 @@ void testSerialiseContainer() { // Create container and fill actual TickContainer container = new TickContainer(keyboard, mouse, angle); BigArrayList actual = new BigArrayList<>(); - serialiseContainer(actual, container); + serialiseContainer(actual, container, new ArrayList<>()); // Fill expected BigArrayList expected = new BigArrayList<>(); From 7e90b2e39bce76effb244ce79854fbd916194318 Mon Sep 17 00:00:00 2001 From: Scribble Date: Fri, 7 Jun 2024 21:46:53 +0200 Subject: [PATCH 34/79] [PlaybackSerialiser] Trying to figure out how to store PlaybackFileCommands --- .../filecommands/PlaybackFileCommand.java | 9 +++- .../tasfile/flavor/SerialiserFlavorBase.java | 53 +++++++++++++------ 2 files changed, 44 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java index 8d5d49cc..3c68a078 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java @@ -31,8 +31,12 @@ public String[] controlByteNames() { public void onPlayback(long tick, TickContainer container) {}; - public String onSerialiseSingleComment(long tick, String line) { - return line; + public PlaybackFileCommand onSerialiseInlineComment(long tick, TickContainer container) { + return null; + } + + public PlaybackFileCommand onSerialiseEndlineComment(long currentTick, TickContainer container) { + return null; } public void onDeserialiseSingleComment(long tick, String line) {} @@ -52,6 +56,7 @@ public void setEnabled(boolean enabled) { onDisable(); this.enabled = enabled; } + } } diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java index 530bdd7f..dd5cd0a5 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java @@ -3,6 +3,7 @@ import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; +import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Queue; @@ -13,6 +14,7 @@ import com.dselent.bigarraylist.BigArrayList; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.CommentContainer; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickContainer; +import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand; import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandExtension; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata; import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackLoadException; @@ -112,17 +114,45 @@ public BigArrayList serialise(BigArrayList inputs, List

out, TickContainer container, List filecommandextensionList) { + protected void serialiseContainer(BigArrayList out, TickContainer container, List filecommandExtensionList) { List serialisedKeyboard = serialiseKeyboard(container.getKeyboard()); List serialisedMouse = serialiseMouse(container.getMouse()); List serialisedCameraAngle = serialiseCameraAngle(container.getCameraAngle()); - List serialisedInlineCommments = serialiseInlineComments(container.getComments(), filecommandextensionList); - List serialisedEndlineComments = serialiseEndlineComments(container.getComments(), filecommandextensionList); - + List serialisedInlineCommments = serialiseInlineComments(container.getComments()); + List serialisedEndlineComments = serialiseEndlineComments(container.getComments()); + List fileCommandsInline = serialiseFileCommandsInline(container, filecommandExtensionList); + List fileCommandsEndline = serialiseFileCommandsEndline(container, filecommandExtensionList); + + for (int i = 0; i < fileCommandsInline.size(); i++) { + + } + addAll(out, serialisedInlineCommments); mergeInputs(out, serialisedKeyboard, serialisedMouse, serialisedCameraAngle, serialisedEndlineComments); } + + protected List serialiseFileCommandsInline(TickContainer container, List filecommandExtensionList) { + List fileCommands = new ArrayList<>(); + for (PlaybackFileCommandExtension playbackFileCommandExtension : filecommandExtensionList) { + PlaybackFileCommand command = playbackFileCommandExtension.onSerialiseInlineComment(currentTick, container); + if (command != null) { + fileCommands.add(command); + } + } + return fileCommands; + } + + protected List serialiseFileCommandsEndline(TickContainer container, List filecommandExtensionList){ + List fileCommands = new ArrayList<>(); + for (PlaybackFileCommandExtension playbackFileCommandExtension : filecommandExtensionList) { + PlaybackFileCommand command = playbackFileCommandExtension.onSerialiseEndlineComment(currentTick, container); + if (command != null) { + fileCommands.add(command); + } + } + return fileCommands; + } protected List serialiseKeyboard(VirtualKeyboard keyboard) { List out = new ArrayList<>(); @@ -149,7 +179,7 @@ protected List serialiseCameraAngle(VirtualCameraAngle cameraAngle) { return out; } - protected List serialiseInlineComments(CommentContainer container, List filecommandextensionList) { + protected List serialiseInlineComments(CommentContainer container) { List out = new ArrayList<>(); if (container == null) { return out; @@ -162,17 +192,8 @@ protected List serialiseInlineComments(CommentContainer container, List< return out; } - protected List serialiseEndlineComments(CommentContainer container, List filecommandextensionList) { - List out = new ArrayList<>(); - if (container == null) { - return out; - } - for (String comment : container.getInlineComments()) { - if (comment != null) { - out.add("// " + comment); - } - } - return out; + protected List serialiseEndlineComments(CommentContainer container) { + return serialiseInlineComments(container); } protected void mergeInputs(BigArrayList out, List serialisedKeyboard, List serialisedMouse, List serialisedCameraAngle, List serialisedEndlineComments) { From bda3d7f06eb13eff8c0a261b5b3f41d2af6b3b48 Mon Sep 17 00:00:00 2001 From: Scribble Date: Fri, 7 Jun 2024 22:28:33 +0200 Subject: [PATCH 35/79] [PlaybackSerialiser] Trying to figure out how to store PlaybackFileCommands2 --- .../filecommands/PlaybackFileCommand.java | 16 +++++-- .../tasfile/flavor/SerialiserFlavorBase.java | 43 ++++++------------- 2 files changed, 26 insertions(+), 33 deletions(-) diff --git a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java index 3c68a078..91b80267 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java @@ -1,5 +1,7 @@ package com.minecrafttas.tasmod.playback.filecommands; +import java.util.List; + import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickContainer; public class PlaybackFileCommand{ @@ -13,6 +15,14 @@ public PlaybackFileCommand(String name, String... args) { this.args = args; } + public String getName() { + return name; + } + + public String[] getArgs() { + return args; + } + public static abstract class PlaybackFileCommandExtension { protected boolean enabled=false; @@ -31,11 +41,11 @@ public String[] controlByteNames() { public void onPlayback(long tick, TickContainer container) {}; - public PlaybackFileCommand onSerialiseInlineComment(long tick, TickContainer container) { + public List onSerialiseInlineComment(long tick, TickContainer container) { return null; } - public PlaybackFileCommand onSerialiseEndlineComment(long currentTick, TickContainer container) { + public List onSerialiseEndlineComment(long currentTick, TickContainer container) { return null; } @@ -56,7 +66,7 @@ public void setEnabled(boolean enabled) { onDisable(); this.enabled = enabled; } - + } } diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java index dd5cd0a5..26015fc0 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java @@ -1,6 +1,7 @@ package com.minecrafttas.tasmod.playback.tasfile.flavor; import java.io.Serializable; +import java.lang.reflect.Array; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; @@ -18,6 +19,7 @@ import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandExtension; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata; import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackLoadException; +import com.minecrafttas.tasmod.util.TASmodRegistry; import com.minecrafttas.tasmod.virtual.VirtualCameraAngle; import com.minecrafttas.tasmod.virtual.VirtualKey; import com.minecrafttas.tasmod.virtual.VirtualKeyboard; @@ -118,40 +120,21 @@ protected void serialiseContainer(BigArrayList out, TickContainer contai List serialisedKeyboard = serialiseKeyboard(container.getKeyboard()); List serialisedMouse = serialiseMouse(container.getMouse()); List serialisedCameraAngle = serialiseCameraAngle(container.getCameraAngle()); - List serialisedInlineCommments = serialiseInlineComments(container.getComments()); - List serialisedEndlineComments = serialiseEndlineComments(container.getComments()); - List fileCommandsInline = serialiseFileCommandsInline(container, filecommandExtensionList); - List fileCommandsEndline = serialiseFileCommandsEndline(container, filecommandExtensionList); - for (int i = 0; i < fileCommandsInline.size(); i++) { - - } + List> fileCommandsInline = new ArrayList<>(); + List> fileCommandsEndline = new ArrayList<>(); + + List serialisedInlineCommments = serialiseInlineComments(container.getComments(), fileCommandsInline); + List serialisedEndlineComments = serialiseEndlineComments(container.getComments(), fileCommandsEndline); + addAll(out, serialisedInlineCommments); mergeInputs(out, serialisedKeyboard, serialisedMouse, serialisedCameraAngle, serialisedEndlineComments); } - protected List serialiseFileCommandsInline(TickContainer container, List filecommandExtensionList) { - List fileCommands = new ArrayList<>(); - for (PlaybackFileCommandExtension playbackFileCommandExtension : filecommandExtensionList) { - PlaybackFileCommand command = playbackFileCommandExtension.onSerialiseInlineComment(currentTick, container); - if (command != null) { - fileCommands.add(command); - } - } - return fileCommands; - } - - protected List serialiseFileCommandsEndline(TickContainer container, List filecommandExtensionList){ - List fileCommands = new ArrayList<>(); - for (PlaybackFileCommandExtension playbackFileCommandExtension : filecommandExtensionList) { - PlaybackFileCommand command = playbackFileCommandExtension.onSerialiseEndlineComment(currentTick, container); - if (command != null) { - fileCommands.add(command); - } - } - return fileCommands; + protected String serialiseFileCommand(PlaybackFileCommand fileCommand) { + return String.format("$%s(%s);", fileCommand.getName(), String.join(", ", fileCommand.getArgs())); } protected List serialiseKeyboard(VirtualKeyboard keyboard) { @@ -179,7 +162,7 @@ protected List serialiseCameraAngle(VirtualCameraAngle cameraAngle) { return out; } - protected List serialiseInlineComments(CommentContainer container) { + protected List serialiseInlineComments(CommentContainer container, List> fileCommandsInline) { List out = new ArrayList<>(); if (container == null) { return out; @@ -192,8 +175,8 @@ protected List serialiseInlineComments(CommentContainer container) { return out; } - protected List serialiseEndlineComments(CommentContainer container) { - return serialiseInlineComments(container); + protected List serialiseEndlineComments(CommentContainer container, List> fileCommandsEndline) { + return serialiseInlineComments(container, fileCommandsEndline); } protected void mergeInputs(BigArrayList out, List serialisedKeyboard, List serialisedMouse, List serialisedCameraAngle, List serialisedEndlineComments) { From d935813cd12054247e0180d4c0e552d8caf674dc Mon Sep 17 00:00:00 2001 From: Scribble Date: Sat, 8 Jun 2024 16:12:07 +0200 Subject: [PATCH 36/79] [PlaybackSerialiser] Moved parts of filecommand handling to the registry --- .../playback/PlaybackControllerClient.java | 8 ++- .../filecommands/PlaybackFileCommand.java | 14 ++++- .../PlaybackFileCommandsRegistry.java | 45 ++++++++++++++++ .../playback/tasfile/PlaybackSerialiser2.java | 2 +- .../tasfile/flavor/SerialiserFlavorBase.java | 53 +++++++++++++------ .../tasfile/SerialiserFlavorBaseTest.java | 7 ++- 6 files changed, 108 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java index 29f9b1ae..c51f6945 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java @@ -661,8 +661,8 @@ public boolean equals(Object other) { public static class CommentContainer implements Serializable{ - List inlineComments; - List endlineComments; + private List inlineComments; + private List endlineComments; public CommentContainer() { this(new ArrayList<>(), new ArrayList<>()); @@ -684,6 +684,10 @@ public void addEndlineComment(String endlineComment) { public List getInlineComments() { return inlineComments; } + + public List getEndlineComments() { + return endlineComments; + } } /** diff --git a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java index 91b80267..9da85359 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java @@ -1,8 +1,10 @@ package com.minecrafttas.tasmod.playback.filecommands; import java.util.List; +import java.util.Queue; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickContainer; +import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandExtension; public class PlaybackFileCommand{ @@ -41,11 +43,11 @@ public String[] controlByteNames() { public void onPlayback(long tick, TickContainer container) {}; - public List onSerialiseInlineComment(long tick, TickContainer container) { + protected Queue onSerialiseInlineComment(long tick, TickContainer container) { return null; } - public List onSerialiseEndlineComment(long currentTick, TickContainer container) { + protected Queue onSerialiseEndlineComment(long currentTick, TickContainer container) { return null; } @@ -67,6 +69,14 @@ public void setEnabled(boolean enabled) { this.enabled = enabled; } + public static Queue getQueueInlineComment(PlaybackFileCommandExtension extension, long currentTick, TickContainer container) { + return extension.onSerialiseInlineComment(currentTick, container); + } + + public static Queue getQueueEndlineComment(PlaybackFileCommandExtension extension, long currentTick, TickContainer container) { + return extension.onSerialiseEndlineComment(currentTick, container); + } + } } diff --git a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommandsRegistry.java b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommandsRegistry.java index 962d233c..b2d45635 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommandsRegistry.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommandsRegistry.java @@ -3,12 +3,14 @@ import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; +import java.util.Queue; import com.minecrafttas.mctcommon.registry.AbstractRegistry; import com.minecrafttas.tasmod.TASmod; import com.minecrafttas.tasmod.events.EventPlaybackClient; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickContainer; import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandExtension; +import com.minecrafttas.tasmod.util.TASmodRegistry; public class PlaybackFileCommandsRegistry extends AbstractRegistry implements EventPlaybackClient.EventRecordTick, EventPlaybackClient.EventPlaybackTick { @@ -80,4 +82,47 @@ public void onRecordTick(long index, TickContainer container) { extension.onPlayback(index, container); }); } + + public List> handleOnSerialiseInline(long currentTick, TickContainer container) { + return onSerialise(currentTick, container, PlaybackFileCommandExtension::getQueueInlineComment); + } + + public List> handleOnSerialiseEndline(long currentTick, TickContainer container) { + return onSerialise(currentTick, container, PlaybackFileCommandExtension::getQueueEndlineComment); + } + + private List> onSerialise(long currentTick, TickContainer container, OnSerialise serialisationMethod){ + List> out = new ArrayList<>(); + List enabledExtensions = getEnabled(); + + List> commandQueues = new ArrayList<>(); + for (PlaybackFileCommandExtension playbackFileCommandExtension : enabledExtensions) { + Queue fileCommandQueue = serialisationMethod.accept(playbackFileCommandExtension, currentTick, container); + if(fileCommandQueue!=null) + commandQueues.add(fileCommandQueue); + } + + int biggestSize = 0; + for (Queue queue : commandQueues) { + if(queue.size()>biggestSize) { + biggestSize = queue.size(); + } + } + + for (int i = 0; i < biggestSize; i++) { + List commandListForOneLine = new ArrayList<>(); + for (Queue queue : commandQueues) { + PlaybackFileCommand fc = queue.poll(); + if(fc!=null) + commandListForOneLine.add(fc); + } + out.add(commandListForOneLine); + } + return out; + } + + @FunctionalInterface + private interface OnSerialise{ + Queue accept(PlaybackFileCommandExtension extension, long currentTick, TickContainer container); + } } diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java index a25df1f2..c1408c3c 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java @@ -69,7 +69,7 @@ public static void saveToFile(File file, BigArrayList container, writerThread.addLine(line); } - BigArrayList tickLines = flavor.serialise(container, filecommandextensionList); + BigArrayList tickLines = flavor.serialise(container); for (long i = 0; i < tickLines.size(); i++) { writerThread.addLine(tickLines.get(i)); } diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java index 26015fc0..fac70749 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java @@ -1,13 +1,12 @@ package com.minecrafttas.tasmod.playback.tasfile.flavor; import java.io.Serializable; -import java.lang.reflect.Array; import java.util.ArrayList; import java.util.Arrays; -import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Queue; +import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.LinkedBlockingQueue; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -105,27 +104,31 @@ protected void serialiseMetadataValue(List out, LinkedHashMap serialise(BigArrayList inputs, List filecommandextensionList) { + public BigArrayList serialise(BigArrayList inputs) { BigArrayList out = new BigArrayList<>(); for (int i = 0; i < inputs.size(); i++) { currentTick = i; TickContainer container = inputs.get(i); - serialiseContainer(out, container, filecommandextensionList); + serialiseContainer(out, container); } return out; } - protected void serialiseContainer(BigArrayList out, TickContainer container, List filecommandExtensionList) { + protected void serialiseContainer(BigArrayList out, TickContainer container) { List serialisedKeyboard = serialiseKeyboard(container.getKeyboard()); List serialisedMouse = serialiseMouse(container.getMouse()); List serialisedCameraAngle = serialiseCameraAngle(container.getCameraAngle()); - List> fileCommandsInline = new ArrayList<>(); - List> fileCommandsEndline = new ArrayList<>(); + List> fileCommandsInline = TASmodRegistry.PLAYBACK_FILE_COMMAND.handleOnSerialiseInline(currentTick, container); + List> fileCommandsEndline = TASmodRegistry.PLAYBACK_FILE_COMMAND.handleOnSerialiseEndline(currentTick, container); - List serialisedInlineCommments = serialiseInlineComments(container.getComments(), fileCommandsInline); - List serialisedEndlineComments = serialiseEndlineComments(container.getComments(), fileCommandsEndline); + CommentContainer comments = container.getComments(); + if(comments == null) { + comments = new CommentContainer(new ArrayList<>(), new ArrayList<>()); + } + List serialisedInlineCommments = serialiseInlineComments(comments.getInlineComments(), fileCommandsInline); + List serialisedEndlineComments = serialiseEndlineComments(comments.getEndlineComments(), fileCommandsEndline); addAll(out, serialisedInlineCommments); @@ -136,6 +139,14 @@ protected void serialiseContainer(BigArrayList out, TickContainer contai protected String serialiseFileCommand(PlaybackFileCommand fileCommand) { return String.format("$%s(%s);", fileCommand.getName(), String.join(", ", fileCommand.getArgs())); } + + protected String serialiseMultipleFileCommands(List fileCommands) { + List serialisedCommands = new ArrayList<>(); + for(PlaybackFileCommand command : fileCommands) { + serialisedCommands.add(serialiseFileCommand(command)); + } + return String.join(" ", serialisedCommands); + } protected List serialiseKeyboard(VirtualKeyboard keyboard) { List out = new ArrayList<>(); @@ -162,21 +173,33 @@ protected List serialiseCameraAngle(VirtualCameraAngle cameraAngle) { return out; } - protected List serialiseInlineComments(CommentContainer container, List> fileCommandsInline) { + protected List serialiseInlineComments(List inlineComments, List> fileCommandsInline) { List out = new ArrayList<>(); - if (container == null) { + if (inlineComments == null) { return out; } - for (String comment : container.getInlineComments()) { + + Queue> fcListQueue = new ConcurrentLinkedQueue<>(fileCommandsInline); + + for (String comment : inlineComments) { + String serialisedFileCommand = serialiseMultipleFileCommands(fcListQueue.poll()); + if (comment != null) { - out.add("// " + comment); + out.add(String.format("// %s %s", serialisedFileCommand, comment)); } } + + while (!fcListQueue.isEmpty()) { + String serialisedFileCommand = serialiseMultipleFileCommands(fcListQueue.poll()); + + out.add(String.format("// %s", serialisedFileCommand)); + } + return out; } - protected List serialiseEndlineComments(CommentContainer container, List> fileCommandsEndline) { - return serialiseInlineComments(container, fileCommandsEndline); + protected List serialiseEndlineComments(List endlineComments, List> fileCommandsEndline) { + return serialiseInlineComments(endlineComments, fileCommandsEndline); } protected void mergeInputs(BigArrayList out, List serialisedKeyboard, List serialisedMouse, List serialisedCameraAngle, List serialisedEndlineComments) { diff --git a/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java b/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java index eda92dc0..fed264fa 100644 --- a/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java +++ b/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java @@ -109,6 +109,11 @@ void testSerialiseFlavorname() { assertIterableEquals(expected, actual); } + @Test + void testSerialiseHeaderStart() { + assertEquals("##################### TASFile ####################", headerStart()); + } + /** * Test serialising metadata part of the header */ @@ -163,7 +168,7 @@ void testSerialiseContainer() { // Create container and fill actual TickContainer container = new TickContainer(keyboard, mouse, angle); BigArrayList actual = new BigArrayList<>(); - serialiseContainer(actual, container, new ArrayList<>()); + serialiseContainer(actual, container); // Fill expected BigArrayList expected = new BigArrayList<>(); From 0060d3f85c4f9db62976f43b1e3d5ed496cca85f Mon Sep 17 00:00:00 2001 From: Scribble Date: Sat, 8 Jun 2024 21:15:15 +0200 Subject: [PATCH 37/79] [PlaybackSerialiser] Added FileCommand deserialisation - Added new `setEnabled(List names)` to PlaybackFileCommandsRegistry --- .../PlaybackFileCommandsRegistry.java | 53 ++++++++----- .../playback/tasfile/PlaybackSerialiser2.java | 1 + .../tasfile/flavor/SerialiserFlavorBase.java | 74 +++++++++++-------- .../tasfile/SerialiserFlavorBaseTest.java | 13 +++- 4 files changed, 89 insertions(+), 52 deletions(-) diff --git a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommandsRegistry.java b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommandsRegistry.java index b2d45635..b00c1988 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommandsRegistry.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommandsRegistry.java @@ -10,12 +10,11 @@ import com.minecrafttas.tasmod.events.EventPlaybackClient; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickContainer; import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandExtension; -import com.minecrafttas.tasmod.util.TASmodRegistry; -public class PlaybackFileCommandsRegistry extends AbstractRegistry implements EventPlaybackClient.EventRecordTick, EventPlaybackClient.EventPlaybackTick { +public class PlaybackFileCommandsRegistry extends AbstractRegistry implements EventPlaybackClient.EventRecordTick, EventPlaybackClient.EventPlaybackTick { private List enabledExtensions = new ArrayList<>(); - + public PlaybackFileCommandsRegistry() { super(new LinkedHashMap<>()); } @@ -56,16 +55,29 @@ public void setEnabled(String extensionName, boolean enabled) { extension.setEnabled(enabled); enabledExtensions = getEnabled(); } - + + private void disableAll() { + REGISTRY.forEach((name, value) -> { + value.setEnabled(false); + }); + } + + public void setEnabled(List extensionNames) { + disableAll(); + for (String name : extensionNames) { + setEnabled(name, true); + } + } + public List getEnabled() { List out = new ArrayList<>(); - - for(PlaybackFileCommandExtension element : REGISTRY.values()) { - if(element.isEnabled()) { + + for (PlaybackFileCommandExtension element : REGISTRY.values()) { + if (element.isEnabled()) { out.add(element); } } - + return out; } @@ -90,30 +102,30 @@ public List> handleOnSerialiseInline(long currentTick, public List> handleOnSerialiseEndline(long currentTick, TickContainer container) { return onSerialise(currentTick, container, PlaybackFileCommandExtension::getQueueEndlineComment); } - - private List> onSerialise(long currentTick, TickContainer container, OnSerialise serialisationMethod){ + + private List> onSerialise(long currentTick, TickContainer container, OnSerialise serialisationMethod) { List> out = new ArrayList<>(); List enabledExtensions = getEnabled(); - + List> commandQueues = new ArrayList<>(); for (PlaybackFileCommandExtension playbackFileCommandExtension : enabledExtensions) { Queue fileCommandQueue = serialisationMethod.accept(playbackFileCommandExtension, currentTick, container); - if(fileCommandQueue!=null) + if (fileCommandQueue != null) commandQueues.add(fileCommandQueue); } - + int biggestSize = 0; for (Queue queue : commandQueues) { - if(queue.size()>biggestSize) { + if (queue.size() > biggestSize) { biggestSize = queue.size(); } } - + for (int i = 0; i < biggestSize; i++) { List commandListForOneLine = new ArrayList<>(); for (Queue queue : commandQueues) { PlaybackFileCommand fc = queue.poll(); - if(fc!=null) + if (fc != null) commandListForOneLine.add(fc); } out.add(commandListForOneLine); @@ -122,7 +134,14 @@ private List> onSerialise(long currentTick, TickContai } @FunctionalInterface - private interface OnSerialise{ + private interface OnSerialise { Queue accept(PlaybackFileCommandExtension extension, long currentTick, TickContainer container); } + + public void handleOnDeserialiseInline(long currentTick, TickContainer deserialisedContainer, List> inlineFileCommands) { // TODO Add deserialisation + } + + public void handleOnDeserialiseEndline(long currentTick, TickContainer deserialisedContainer, List> endlineFileCommands) { + + } } diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java index c1408c3c..86210e6c 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java @@ -161,6 +161,7 @@ public static BigArrayList loadFromFile(File file, SerialiserFlav flavor.deserialiseHeader(headerLines, deserialisedMetadata, deserialisedExtensionNames); TASmodRegistry.PLAYBACK_METADATA.handleOnLoad(deserialisedMetadata); + TASmodRegistry.PLAYBACK_FILE_COMMAND.setEnabled(deserialisedExtensionNames); // Deserialise main data BigArrayList deserialisedContainers = flavor.deserialise(lines, headerLines.size()); diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java index fac70749..f9321751 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java @@ -119,30 +119,29 @@ protected void serialiseContainer(BigArrayList out, TickContainer contai List serialisedKeyboard = serialiseKeyboard(container.getKeyboard()); List serialisedMouse = serialiseMouse(container.getMouse()); List serialisedCameraAngle = serialiseCameraAngle(container.getCameraAngle()); - + List> fileCommandsInline = TASmodRegistry.PLAYBACK_FILE_COMMAND.handleOnSerialiseInline(currentTick, container); List> fileCommandsEndline = TASmodRegistry.PLAYBACK_FILE_COMMAND.handleOnSerialiseEndline(currentTick, container); - + CommentContainer comments = container.getComments(); - if(comments == null) { + if (comments == null) { comments = new CommentContainer(new ArrayList<>(), new ArrayList<>()); } List serialisedInlineCommments = serialiseInlineComments(comments.getInlineComments(), fileCommandsInline); List serialisedEndlineComments = serialiseEndlineComments(comments.getEndlineComments(), fileCommandsEndline); - addAll(out, serialisedInlineCommments); mergeInputs(out, serialisedKeyboard, serialisedMouse, serialisedCameraAngle, serialisedEndlineComments); } - + protected String serialiseFileCommand(PlaybackFileCommand fileCommand) { - return String.format("$%s(%s);", fileCommand.getName(), String.join(", ", fileCommand.getArgs())); + return String.format("$%s(%s);", fileCommand.getName(), String.join(", ", fileCommand.getArgs())); } - + protected String serialiseMultipleFileCommands(List fileCommands) { List serialisedCommands = new ArrayList<>(); - for(PlaybackFileCommand command : fileCommands) { + for (PlaybackFileCommand command : fileCommands) { serialisedCommands.add(serialiseFileCommand(command)); } return String.join(" ", serialisedCommands); @@ -378,24 +377,30 @@ protected long extractContainer(List extracted, BigArrayList lin protected void deserialiseContainer(BigArrayList out, List containerLines) { - List tickLines = new ArrayList<>(); List inlineComments = new ArrayList<>(); - - splitContainer(containerLines, inlineComments, tickLines); + List tickLines = new ArrayList<>(); + List> inlineFileCommands = new ArrayList<>(); + splitContainer(containerLines, inlineComments, tickLines, inlineFileCommands); List keyboardStrings = new ArrayList<>(); List mouseStrings = new ArrayList<>(); List cameraAngleStrings = new ArrayList<>(); List endlineComments = new ArrayList<>(); + List> endlineFileCommands = new ArrayList<>(); - splitInputs(containerLines, keyboardStrings, mouseStrings, cameraAngleStrings, endlineComments); + splitInputs(containerLines, keyboardStrings, mouseStrings, cameraAngleStrings, endlineComments, endlineFileCommands); VirtualKeyboard keyboard = deserialiseKeyboard(keyboardStrings); VirtualMouse mouse = deserialiseMouse(mouseStrings); VirtualCameraAngle cameraAngle = deserialiseCameraAngle(cameraAngleStrings); CommentContainer comments = new CommentContainer(inlineComments, endlineComments); - out.add(new TickContainer(keyboard, mouse, cameraAngle, comments)); + TickContainer deserialisedContainer = new TickContainer(keyboard, mouse, cameraAngle, comments); + + TASmodRegistry.PLAYBACK_FILE_COMMAND.handleOnDeserialiseInline(currentTick, deserialisedContainer, inlineFileCommands); + TASmodRegistry.PLAYBACK_FILE_COMMAND.handleOnDeserialiseEndline(currentTick, deserialisedContainer, endlineFileCommands); + + out.add(deserialisedContainer); } /** @@ -403,22 +408,36 @@ protected void deserialiseContainer(BigArrayList out, List lines, List comments, List tick) { + protected void splitContainer(List lines, List comments, List tick, List> inlineFileCommands) { for (String line : lines) { + List deserialisedFileCommand = new ArrayList<>(); if (contains(singleComment(), line)) { - comments.add(deserialiseInlineComment(line)); + comments.add(deserialiseInlineComment(line, deserialisedFileCommand)); } else { tick.add(line); } + inlineFileCommands.add(deserialisedFileCommand); } } - protected String deserialiseInlineComment(String comment) { + protected String deserialiseInlineComment(String comment, List deserialisedFileCommands) { + comment = deserialiseFileCommands(comment, deserialisedFileCommands); return extract("^// ?(.+)", comment, 1); } - protected String deserialiseEndlineComment(String comment) { - return deserialiseInlineComment(comment); + protected String deserialiseEndlineComment(String comment, List deserialisedFileCommands) { + return deserialiseInlineComment(comment, deserialisedFileCommands); + } + + protected String deserialiseFileCommands(String comment, List deserialisedFileCommands) { + Matcher matcher = extract("\\$(.+?)\\((.*?)\\);", comment); + while (matcher.find()) { + String name = matcher.group(1); + String[] args = matcher.group(2).split(", ?"); + deserialisedFileCommands.add(new PlaybackFileCommand(name, args)); + comment = matcher.replaceFirst(""); + } + return comment; } protected VirtualKeyboard deserialiseKeyboard(List keyboardStrings) { @@ -528,17 +547,7 @@ protected int[] deserialiseVirtualKey(String[] keyString, VirtualKey defaultKey) return out; } - protected void extractCommentAtEnd(List commentsAtEnd, String line, int startPos) { - Matcher commentMatcher = extract(endlineComment(), line); - if (commentMatcher.find(startPos)) { - String comment = commentMatcher.group(1); - commentsAtEnd.add(comment); - } else { - commentsAtEnd.add(null); - } - } - - protected void splitInputs(List lines, List serialisedKeyboard, List serialisedMouse, List serialisedCameraAngle, List commentsAtEnd) { + protected void splitInputs(List lines, List serialisedKeyboard, List serialisedMouse, List serialisedCameraAngle, List commentsAtEnd, List> endlineFileCommands) { for (String line : lines) { Matcher tickMatcher = extract("^\\t?\\d+\\|(.*?)\\|(.*?)\\|(\\S*)\\s?", line); @@ -555,8 +564,11 @@ protected void splitInputs(List lines, List serialisedKeyboard, } else { throw new PlaybackLoadException("Cannot find inputs in line %s", line); } - - extractCommentAtEnd(commentsAtEnd, line, tickMatcher.group(0).length()); + + List deserialisedFileCommands = new ArrayList<>(); + String endlineComment = line.substring(tickMatcher.group(0).length()); + commentsAtEnd.add(deserialiseEndlineComment(endlineComment, deserialisedFileCommands)); + endlineFileCommands.add(deserialisedFileCommands); } } diff --git a/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java b/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java index fed264fa..9d7eac40 100644 --- a/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java +++ b/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java @@ -11,6 +11,7 @@ import java.util.LinkedHashMap; import java.util.List; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import com.dselent.bigarraylist.BigArrayList; @@ -356,9 +357,10 @@ void testDeserialiseContainer() { * Testing extracting the comment from the end of the line */ @Test + @Disabled void testExtractCommentEndline() { List actual = new ArrayList<>(); - extractCommentAtEnd(actual, "55|W,LCONTROL;|;0,887,626|17.85;-202.74799 // Test", 43); +// extractCommentAtEnd(actual, "55|W,LCONTROL;|;0,887,626|17.85;-202.74799 // Test", 43); List expected = new ArrayList<>(); expected.add("// Test"); @@ -369,9 +371,10 @@ void testExtractCommentEndline() { * Test extracting the comment from the end of the line, but there is no comment */ @Test + @Disabled void testExtractCommentEndlineEmpty() { List actual = new ArrayList<>(); - extractCommentAtEnd(actual, "55|W,LCONTROL;//|;0,887,626|17.85;-202.74799", 44); +// extractCommentAtEnd(actual, "55|W,LCONTROL;//|;0,887,626|17.85;-202.74799", 44); List expected = new ArrayList<>(); expected.add(null); @@ -382,6 +385,7 @@ void testExtractCommentEndlineEmpty() { * Test splitting the stringd of inputs including subticks into it's elements */ @Test + @Disabled void testSplitInputs() { List tick = new ArrayList<>(); tick.add("55|W,LCONTROL;w|;0,887,626|17.85;-202.74799"); @@ -393,7 +397,7 @@ void testSplitInputs() { List actualCameraAngle = new ArrayList<>(); List actualComment = new ArrayList<>(); - splitInputs(tick, actualKeyboard, actualMouse, actualCameraAngle, actualComment); + splitInputs(tick, actualKeyboard, actualMouse, actualCameraAngle, actualComment, new ArrayList<>()); //TODO Test endlineComments List expectedKeyboard = new ArrayList<>(); List expectedMouse = new ArrayList<>(); @@ -424,6 +428,7 @@ void testSplitInputs() { * Test split container */ @Test + @Disabled void testSplitContainer() { List lines = new ArrayList<>(); lines.add("// $interpolation(on);"); @@ -435,7 +440,7 @@ void testSplitContainer() { List actualComments = new ArrayList<>(); List actualTick = new ArrayList<>(); - splitContainer(lines, actualComments, actualTick); + splitContainer(lines, actualComments, actualTick, new ArrayList<>()); // TODO Test inlineFileCommands List expectedComments = new ArrayList<>(); List expectedTicks = new ArrayList<>(); From 1f4f36317946b0231a2f7ff981c909d10974c8d3 Mon Sep 17 00:00:00 2001 From: Scribble Date: Sun, 9 Jun 2024 18:17:35 +0200 Subject: [PATCH 38/79] [PlaybackSerialiser] Added improved FileCommand deserialisation - Added PlaybackFileCommandContainer to reduce clutter in the registry - Added condition to serialising comments that prevents comment generation when filecommands are null --- .../filecommands/PlaybackFileCommand.java | 97 +++++++++++++++---- .../PlaybackFileCommandsRegistry.java | 59 ++++++----- .../integrated/DesyncMonitorExtension.java | 6 +- .../tasfile/flavor/SerialiserFlavorBase.java | 22 +++-- 4 files changed, 122 insertions(+), 62 deletions(-) diff --git a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java index 9da85359..c1aa0daf 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java @@ -1,10 +1,12 @@ package com.minecrafttas.tasmod.playback.filecommands; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.LinkedHashMap; import java.util.List; -import java.util.Queue; +import java.util.Map; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickContainer; -import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandExtension; public class PlaybackFileCommand{ @@ -31,31 +33,29 @@ public static abstract class PlaybackFileCommandExtension { public abstract String name(); - public String[] controlByteNames() { - return null; + public String[] getFileCommandNames() { + return new String[] {}; } public void onEnable() {}; public void onDisable() {}; - public void onRecord(long tick, TickContainer container) {}; + public void onRecord(long tick, TickContainer tickContainer) {}; - public void onPlayback(long tick, TickContainer container) {}; - - protected Queue onSerialiseInlineComment(long tick, TickContainer container) { + public void onPlayback(long tick, TickContainer tickContainer) {}; + + protected PlaybackFileCommandContainer onSerialiseInlineComment(long tick, TickContainer tickContainer) { return null; } - protected Queue onSerialiseEndlineComment(long currentTick, TickContainer container) { + protected PlaybackFileCommandContainer onSerialiseEndlineComment(long currentTick, TickContainer tickContainer) { return null; } - public void onDeserialiseSingleComment(long tick, String line) {} - - public void onSerialiseCommentAtEnd(long tick, String line) {} + public void onDeserialiseInlineComment(long tick, TickContainer container, PlaybackFileCommandContainer fileCommandContainer) {} - public void onDeserialiseCommentAtEnd(long tick, String line) {} + public void onDeserialiseEndlineComment(long tick, TickContainer container, PlaybackFileCommandContainer fileCommandContainer) {} public boolean isEnabled() { return enabled; @@ -68,15 +68,76 @@ public void setEnabled(boolean enabled) { onDisable(); this.enabled = enabled; } - - public static Queue getQueueInlineComment(PlaybackFileCommandExtension extension, long currentTick, TickContainer container) { - return extension.onSerialiseInlineComment(currentTick, container); + } + + public static class PlaybackFileCommandContainer extends LinkedHashMap> { + + public PlaybackFileCommandContainer() { } - public static Queue getQueueEndlineComment(PlaybackFileCommandExtension extension, long currentTick, TickContainer container) { - return extension.onSerialiseEndlineComment(currentTick, container); + public PlaybackFileCommandContainer(List> list) { + for(List lists : list) { + for(PlaybackFileCommand command : lists) { + this.put(command.getName(), new ArrayList<>()); + } + } + + for(List lists : list) { + for (Map.Entry> entry : this.entrySet()) { + String key = entry.getKey(); + List val = entry.getValue(); + + boolean valuePresent = false; + for(PlaybackFileCommand command : lists) { + if(key.equals(command.getName())) { + valuePresent = true; + val.add(command); + } + } + if(!valuePresent) { + val.add(null); + } + } + } } + public PlaybackFileCommandContainer split(String... keys) { + return split(Arrays.asList(keys)); + } + + public PlaybackFileCommandContainer split(Iterable keys) { + PlaybackFileCommandContainer out = new PlaybackFileCommandContainer(); + for (String key : keys) { + out.put(key, this.get(key)); + } + return out; + } + + public List> valuesBySubtick() { + List> out = new ArrayList<>(); + + int biggestSize = 0; + for (List list : values()) { + if (list.size() > biggestSize) { + biggestSize = list.size(); + } + } + + for (int i = 0; i < biggestSize; i++) { + List commandListForOneLine = new ArrayList<>(); + for (List list : values()) { + if(i implements EventPlaybackClient.EventRecordTick, EventPlaybackClient.EventPlaybackTick { @@ -95,40 +96,24 @@ public void onRecordTick(long index, TickContainer container) { }); } - public List> handleOnSerialiseInline(long currentTick, TickContainer container) { - return onSerialise(currentTick, container, PlaybackFileCommandExtension::getQueueInlineComment); - } - - public List> handleOnSerialiseEndline(long currentTick, TickContainer container) { - return onSerialise(currentTick, container, PlaybackFileCommandExtension::getQueueEndlineComment); - } - - private List> onSerialise(long currentTick, TickContainer container, OnSerialise serialisationMethod) { - List> out = new ArrayList<>(); - List enabledExtensions = getEnabled(); - - List> commandQueues = new ArrayList<>(); - for (PlaybackFileCommandExtension playbackFileCommandExtension : enabledExtensions) { - Queue fileCommandQueue = serialisationMethod.accept(playbackFileCommandExtension, currentTick, container); - if (fileCommandQueue != null) - commandQueues.add(fileCommandQueue); - } - - int biggestSize = 0; - for (Queue queue : commandQueues) { - if (queue.size() > biggestSize) { - biggestSize = queue.size(); + public PlaybackFileCommandContainer handleOnSerialiseInline(long currentTick, TickContainer container) { + PlaybackFileCommandContainer out = new PlaybackFileCommandContainer(); + for (PlaybackFileCommandExtension extension : enabledExtensions) { + PlaybackFileCommandContainer extensionContainer=extension.onSerialiseInlineComment(currentTick, container); + if(extensionContainer!=null) { + out.putAll(extensionContainer); } } + return out; + } - for (int i = 0; i < biggestSize; i++) { - List commandListForOneLine = new ArrayList<>(); - for (Queue queue : commandQueues) { - PlaybackFileCommand fc = queue.poll(); - if (fc != null) - commandListForOneLine.add(fc); + public PlaybackFileCommandContainer handleOnSerialiseEndline(long currentTick, TickContainer container) { + PlaybackFileCommandContainer out = new PlaybackFileCommandContainer(); + for (PlaybackFileCommandExtension extension : enabledExtensions) { + PlaybackFileCommandContainer extensionContainer=extension.onSerialiseEndlineComment(currentTick, container); + if(extensionContainer!=null) { + out.putAll(extensionContainer); } - out.add(commandListForOneLine); } return out; } @@ -138,10 +123,20 @@ private interface OnSerialise { Queue accept(PlaybackFileCommandExtension extension, long currentTick, TickContainer container); } - public void handleOnDeserialiseInline(long currentTick, TickContainer deserialisedContainer, List> inlineFileCommands) { // TODO Add deserialisation + public void handleOnDeserialiseInline(long currentTick, TickContainer deserialisedContainer, List> inlineFileCommands) { + PlaybackFileCommandContainer fileCommandContainer = new PlaybackFileCommandContainer(inlineFileCommands); + for (PlaybackFileCommandExtension extension : enabledExtensions) { + String[] fileCommandNames = extension.getFileCommandNames(); + extension.onDeserialiseInlineComment(currentTick, deserialisedContainer, fileCommandContainer.split(fileCommandNames)); + } } public void handleOnDeserialiseEndline(long currentTick, TickContainer deserialisedContainer, List> endlineFileCommands) { - + PlaybackFileCommandContainer fileCommandContainer = new PlaybackFileCommandContainer(endlineFileCommands); + for (PlaybackFileCommandExtension extension : enabledExtensions) { + String[] fileCommandNames = extension.getFileCommandNames(); + extension.onDeserialiseEndlineComment(currentTick, deserialisedContainer, fileCommandContainer.split(fileCommandNames)); + } } + } diff --git a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/DesyncMonitorExtension.java b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/DesyncMonitorExtension.java index 1c084a3f..33b6b3c8 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/DesyncMonitorExtension.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/DesyncMonitorExtension.java @@ -1,5 +1,7 @@ package com.minecrafttas.tasmod.playback.filecommands.integrated; +import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickContainer; +import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandContainer; import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandExtension; public class DesyncMonitorExtension extends PlaybackFileCommandExtension{ @@ -10,7 +12,7 @@ public String name() { } @Override - public void onSerialiseCommentAtEnd(long tick, String line) { - super.onSerialiseCommentAtEnd(tick, line); + public void onDeserialiseEndlineComment(long tick, TickContainer container, PlaybackFileCommandContainer fileCommandContainer) { + super.onDeserialiseEndlineComment(tick, container, fileCommandContainer); } } diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java index f9321751..0b02643d 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java @@ -15,6 +15,7 @@ import com.minecrafttas.tasmod.playback.PlaybackControllerClient.CommentContainer; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickContainer; import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand; +import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandContainer; import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandExtension; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata; import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackLoadException; @@ -120,15 +121,15 @@ protected void serialiseContainer(BigArrayList out, TickContainer contai List serialisedMouse = serialiseMouse(container.getMouse()); List serialisedCameraAngle = serialiseCameraAngle(container.getCameraAngle()); - List> fileCommandsInline = TASmodRegistry.PLAYBACK_FILE_COMMAND.handleOnSerialiseInline(currentTick, container); - List> fileCommandsEndline = TASmodRegistry.PLAYBACK_FILE_COMMAND.handleOnSerialiseEndline(currentTick, container); + PlaybackFileCommandContainer fileCommandsInline = TASmodRegistry.PLAYBACK_FILE_COMMAND.handleOnSerialiseInline(currentTick, container); + PlaybackFileCommandContainer fileCommandsEndline = TASmodRegistry.PLAYBACK_FILE_COMMAND.handleOnSerialiseEndline(currentTick, container); CommentContainer comments = container.getComments(); if (comments == null) { comments = new CommentContainer(new ArrayList<>(), new ArrayList<>()); } - List serialisedInlineCommments = serialiseInlineComments(comments.getInlineComments(), fileCommandsInline); - List serialisedEndlineComments = serialiseEndlineComments(comments.getEndlineComments(), fileCommandsEndline); + List serialisedInlineCommments = serialiseInlineComments(comments.getInlineComments(), fileCommandsInline.valuesBySubtick()); + List serialisedEndlineComments = serialiseEndlineComments(comments.getEndlineComments(), fileCommandsEndline.valuesBySubtick()); addAll(out, serialisedInlineCommments); @@ -184,14 +185,15 @@ protected List serialiseInlineComments(List inlineComments, List String serialisedFileCommand = serialiseMultipleFileCommands(fcListQueue.poll()); if (comment != null) { - out.add(String.format("// %s %s", serialisedFileCommand, comment)); + out.add(String.format("//%s %s", serialisedFileCommand != null ? " " + serialisedFileCommand : "", comment)); } } while (!fcListQueue.isEmpty()) { String serialisedFileCommand = serialiseMultipleFileCommands(fcListQueue.poll()); - - out.add(String.format("// %s", serialisedFileCommand)); + if (serialisedFileCommand != null) { + out.add(String.format("// %s", serialisedFileCommand)); + } } return out; @@ -396,10 +398,10 @@ protected void deserialiseContainer(BigArrayList out, List lines, List serialisedKeyboard, } else { throw new PlaybackLoadException("Cannot find inputs in line %s", line); } - + List deserialisedFileCommands = new ArrayList<>(); String endlineComment = line.substring(tickMatcher.group(0).length()); commentsAtEnd.add(deserialiseEndlineComment(endlineComment, deserialisedFileCommands)); From 8a847c98fb66eddd7bbd6cd52760c4636d03595e Mon Sep 17 00:00:00 2001 From: Scribble Date: Mon, 10 Jun 2024 23:04:29 +0200 Subject: [PATCH 39/79] [PlaybackSerialiser] Fixed tests for deserialising container - Removed CommentHandler as that is superceded by CommentContainer --- .../tasmod/playback/CommentHandler.java | 89 ------------------- .../playback/PlaybackControllerClient.java | 49 ++++++---- .../filecommands/PlaybackFileCommand.java | 14 +++ .../tasfile/flavor/SerialiserFlavorBase.java | 16 +++- .../tasfile/SerialiserFlavorBaseTest.java | 63 ++++++------- 5 files changed, 88 insertions(+), 143 deletions(-) delete mode 100644 src/main/java/com/minecrafttas/tasmod/playback/CommentHandler.java diff --git a/src/main/java/com/minecrafttas/tasmod/playback/CommentHandler.java b/src/main/java/com/minecrafttas/tasmod/playback/CommentHandler.java deleted file mode 100644 index 3d77f6c6..00000000 --- a/src/main/java/com/minecrafttas/tasmod/playback/CommentHandler.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.minecrafttas.tasmod.playback; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import com.dselent.bigarraylist.BigArrayList; - -/** - * Handles and stores everything related to comments in the TASfile.
- * Comments also contain calls to playback extensions. - * - * @author Scribble - */ -public class CommentHandler { - - /** - * List of all inline comments.
- * These comments take the form: - * - *

-	 * // This is an inline comment
-	 * // This is a second inline comment
-	 * 1|W;w|;0;0;0|0.0;0.0
-	 * 	1|||1.0;1.0
-	 * 
- * - * Inline comments are supposed to describe the tick as a whole and therefore - * can not be attached to subticks.
- * like so: - * - *
-	 * 1|W;w|;0;0;0|0.0;0.0
-	 * // This is not allowed. This comment won't be saved
-	 * 	1|||1.0;1.0
-	 * 
- * - * The index of the BigArrayList is the current tick. - */ - private BigArrayList> inlineComments; - - /** - * List of all endline comments.
- * These comments take the form: - * - *
-	 * 1|W;w|;0;0;0|0.0;0.0		// This is an endline comment
-	 * 	1|||1.0;1.0		// This is a second endline comment
-	 * 
- * - * Endline comments are supposed to describe individual subticks.
- * The index of the BigArrayList is the tick, the index of the ArrayList inside - * of the BigArrayList is the subtick of that tick - */ - private BigArrayList> endlineComments; - - public CommentHandler() { - inlineComments = new BigArrayList<>(); - endlineComments = new BigArrayList<>(); - } - - public void addInlineComment(ArrayList inlineCommentList) { - this.inlineComments.add(inlineCommentList); - } - - public void addEndlineComment(ArrayList endlineCommentList) { - this.endlineComments.add(endlineCommentList); - } - - public void runEndlineComment(long index) { - - } - - public void clear() { - try { - inlineComments.clearMemory(); - } catch (IOException e) { - e.printStackTrace(); - } - inlineComments = new BigArrayList<>(); - - try { - endlineComments.clearMemory(); - } catch (IOException e) { - e.printStackTrace(); - } - endlineComments = new BigArrayList<>(); - } -} diff --git a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java index c51f6945..d96965cb 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java @@ -23,8 +23,8 @@ import com.dselent.bigarraylist.BigArrayList; import com.minecrafttas.mctcommon.Configuration.ConfigOptions; -import com.minecrafttas.mctcommon.events.EventListenerRegistry; import com.minecrafttas.mctcommon.events.EventClient.EventClientInit; +import com.minecrafttas.mctcommon.events.EventListenerRegistry; import com.minecrafttas.mctcommon.server.ByteBufferBuilder; import com.minecrafttas.mctcommon.server.Client.Side; import com.minecrafttas.mctcommon.server.exception.PacketNotImplementedException; @@ -124,11 +124,6 @@ public class PlaybackControllerClient implements ClientPacketHandler, EventClien */ private Map>> controlBytes = new HashMap>>(); // TODO Replace with TASFile extension - /** - * The comments of the TASfile. Contains calls to extensions. - */ - private CommentHandler comments = new CommentHandler(); - public DesyncMonitoring desyncMonitor = new DesyncMonitoring(this); // TODO Replace with TASFile extension private long startSeed = TASmod.ktrngHandler.getGlobalSeedClient(); // TODO Replace with Metadata extension @@ -502,14 +497,6 @@ public Map>> getControlBytes() { // TODO Re return controlBytes; } - public CommentHandler getComments() { // TODO Replace with TASFile extension - return comments; - } - - public void setComments(CommentHandler comments) { - this.comments = comments; - } - public void setIndex(int index) throws IndexOutOfBoundsException { if (index <= size()) { this.index = index; @@ -550,7 +537,6 @@ public void clear() { } inputs = new BigArrayList(directory + File.separator + "temp"); controlBytes.clear(); - comments.clear(); index = 0; desyncMonitor.clear(); TASmodRegistry.PLAYBACK_METADATA.handleOnClear(); @@ -661,7 +647,40 @@ public boolean equals(Object other) { public static class CommentContainer implements Serializable{ + /** + * List of all inline comments in a tick.
+ * These comments take the form: + * + *
+		 * // This is an inline comment
+		 * // This is a second inline comment
+		 * 1|W;w|;0;0;0|0.0;0.0
+		 * 	1|||1.0;1.0
+		 * 
+ * + * Inline comments are supposed to describe the tick as a whole and therefore + * can not be attached to subticks.
+ * like so: + * + *
+		 * 1|W;w|;0;0;0|0.0;0.0
+		 * // This is not allowed. This comment won't be saved
+		 * 	1|||1.0;1.0
+		 * 
+ */ private List inlineComments; + + /** + * List of all endline comments.
+ * These comments take the form: + * + *
+		 * 1|W;w|;0;0;0|0.0;0.0		// This is an endline comment
+		 * 	1|||1.0;1.0		// This is a second endline comment
+		 * 
+ * + * Endline comments are supposed to describe individual subticks.
+ */ private List endlineComments; public CommentContainer() { diff --git a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java index c1aa0daf..a24bc2f9 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java @@ -27,6 +27,20 @@ public String[] getArgs() { return args; } + @Override + public boolean equals(Object obj) { + if(obj instanceof PlaybackFileCommand) { + PlaybackFileCommand other = (PlaybackFileCommand) obj; + return this.name.equals(other.name) && Arrays.equals(this.args, other.args); + } + return super.equals(obj); + } + + @Override + public String toString() { + return String.format("$%s(%s);", name, String.join(", ", args)); + } + public static abstract class PlaybackFileCommandExtension { protected boolean enabled=false; diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java index 0b02643d..3ce7a9f8 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java @@ -412,19 +412,29 @@ protected void deserialiseContainer(BigArrayList out, List lines, List comments, List tick, List> inlineFileCommands) { for (String line : lines) { - List deserialisedFileCommand = new ArrayList<>(); if (contains(singleComment(), line)) { + List deserialisedFileCommand = new ArrayList<>(); comments.add(deserialiseInlineComment(line, deserialisedFileCommand)); + if(deserialisedFileCommand.isEmpty()) { + deserialisedFileCommand = null; + } + inlineFileCommands.add(deserialisedFileCommand); } else { tick.add(line); } - inlineFileCommands.add(deserialisedFileCommand); } } protected String deserialiseInlineComment(String comment, List deserialisedFileCommands) { comment = deserialiseFileCommands(comment, deserialisedFileCommands); - return extract("^// ?(.+)", comment, 1); + comment = extract("^// ?(.+)", comment, 1); + if(comment!=null) { + comment = comment.trim(); + if(comment.isEmpty()) { + comment = null; + } + } + return comment; } protected String deserialiseEndlineComment(String comment, List deserialisedFileCommands) { diff --git a/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java b/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java index 9d7eac40..ac92b73c 100644 --- a/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java +++ b/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java @@ -11,11 +11,11 @@ import java.util.LinkedHashMap; import java.util.List; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import com.dselent.bigarraylist.BigArrayList; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickContainer; +import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadataRegistry.PlaybackMetadataExtension; import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackLoadException; @@ -353,56 +353,29 @@ void testDeserialiseContainer() { assertBigArrayList(expected, actual); } - /** - * Testing extracting the comment from the end of the line - */ - @Test - @Disabled - void testExtractCommentEndline() { - List actual = new ArrayList<>(); -// extractCommentAtEnd(actual, "55|W,LCONTROL;|;0,887,626|17.85;-202.74799 // Test", 43); - - List expected = new ArrayList<>(); - expected.add("// Test"); - assertIterableEquals(expected, actual); - } - - /** - * Test extracting the comment from the end of the line, but there is no comment - */ - @Test - @Disabled - void testExtractCommentEndlineEmpty() { - List actual = new ArrayList<>(); -// extractCommentAtEnd(actual, "55|W,LCONTROL;//|;0,887,626|17.85;-202.74799", 44); - - List expected = new ArrayList<>(); - expected.add(null); - assertIterableEquals(expected, actual); - } - /** * Test splitting the stringd of inputs including subticks into it's elements */ @Test - @Disabled void testSplitInputs() { List tick = new ArrayList<>(); tick.add("55|W,LCONTROL;w|;0,887,626|17.85;-202.74799"); tick.add("\t1||RC;0,1580,658|17.85;-202.74799 //Test"); - tick.add("\t2||;0,1580,658|17.85;-202.74799"); + tick.add("\t2||;0,1580,658|17.85;-202.74799 // $test(true);"); List actualKeyboard = new ArrayList<>(); List actualMouse = new ArrayList<>(); List actualCameraAngle = new ArrayList<>(); List actualComment = new ArrayList<>(); + List> actualFileCommand = new ArrayList<>(); - splitInputs(tick, actualKeyboard, actualMouse, actualCameraAngle, actualComment, new ArrayList<>()); //TODO Test endlineComments + splitInputs(tick, actualKeyboard, actualMouse, actualCameraAngle, actualComment, actualFileCommand); List expectedKeyboard = new ArrayList<>(); List expectedMouse = new ArrayList<>(); List expectedCameraAngle = new ArrayList<>(); List expectedComment = new ArrayList<>(); + List> expectedFileCommand = new ArrayList<>(); expectedKeyboard.add("W,LCONTROL;w"); @@ -415,20 +388,30 @@ void testSplitInputs() { expectedCameraAngle.add("17.85;-202.74799"); expectedComment.add(null); - expectedComment.add("//Test"); + expectedComment.add("Test"); expectedComment.add(null); + + + expectedFileCommand.add(new ArrayList<>()); + expectedFileCommand.add(new ArrayList<>()); + + List lineCommand = new ArrayList<>(); + lineCommand.add(new PlaybackFileCommand("test","true")); + + expectedFileCommand.add(lineCommand); + assertIterableEquals(actualKeyboard, expectedKeyboard); assertIterableEquals(expectedMouse, actualMouse); assertIterableEquals(expectedCameraAngle, actualCameraAngle); assertIterableEquals(expectedComment, actualComment); + assertIterableEquals(expectedFileCommand, actualFileCommand); } /** * Test split container */ @Test - @Disabled void testSplitContainer() { List lines = new ArrayList<>(); lines.add("// $interpolation(on);"); @@ -439,20 +422,28 @@ void testSplitContainer() { List actualComments = new ArrayList<>(); List actualTick = new ArrayList<>(); + List> actualInlineFileCommands = new ArrayList<>(); - splitContainer(lines, actualComments, actualTick, new ArrayList<>()); // TODO Test inlineFileCommands + splitContainer(lines, actualComments, actualTick, actualInlineFileCommands); List expectedComments = new ArrayList<>(); List expectedTicks = new ArrayList<>(); - expectedComments.add("$interpolation(on);"); + expectedComments.add(null); expectedComments.add("Test"); expectedTicks.add("55|W,LCONTROL;w|;0,887,626|17.85;-202.74799"); expectedTicks.add("\t1||RC;-15,1580,658|11.85;-2.74799"); expectedTicks.add("\t2||;0,1580,658|45;-22.799"); + + List> expectedInlineFileCommands = new ArrayList<>(); + List commands = new ArrayList<>(); + commands.add(new PlaybackFileCommand("interpolation", "on")); + expectedInlineFileCommands.add(commands); + expectedInlineFileCommands.add(null); assertIterableEquals(expectedComments, actualComments); assertIterableEquals(expectedTicks, actualTick); + assertIterableEquals(expectedInlineFileCommands, actualInlineFileCommands); } /** From 1643d51ce794c5ac68b2b449a040e937fc5dab1c Mon Sep 17 00:00:00 2001 From: Scribble Date: Wed, 12 Jun 2024 22:50:21 +0200 Subject: [PATCH 40/79] [PlaybackSerialiser] Added test for serialising inline comments --- .../tasfile/flavor/SerialiserFlavorBase.java | 16 +++++++++++++--- .../tasfile/SerialiserFlavorBaseTest.java | 19 +++++++++++++++++++ 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java index 3ce7a9f8..22fec269 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java @@ -141,6 +141,9 @@ protected String serialiseFileCommand(PlaybackFileCommand fileCommand) { } protected String serialiseMultipleFileCommands(List fileCommands) { + if(fileCommands == null) { + return null; + } List serialisedCommands = new ArrayList<>(); for (PlaybackFileCommand command : fileCommands) { serialisedCommands.add(serialiseFileCommand(command)); @@ -181,12 +184,19 @@ protected List serialiseInlineComments(List inlineComments, List Queue> fcListQueue = new ConcurrentLinkedQueue<>(fileCommandsInline); - for (String comment : inlineComments) { + for (String inlineComment : inlineComments) { String serialisedFileCommand = serialiseMultipleFileCommands(fcListQueue.poll()); - if (comment != null) { - out.add(String.format("//%s %s", serialisedFileCommand != null ? " " + serialisedFileCommand : "", comment)); + if(inlineComment == null && serialisedFileCommand == null) { + out.add(""); + continue; } + + inlineComment = inlineComment != null ? inlineComment : ""; + serialisedFileCommand = serialisedFileCommand != null ? serialisedFileCommand+" " : ""; + + + out.add(String.format("// %s%s", serialisedFileCommand, inlineComment)); } while (!fcListQueue.isEmpty()) { diff --git a/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java b/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java index ac92b73c..8bae65fb 100644 --- a/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java +++ b/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java @@ -14,6 +14,7 @@ import org.junit.jupiter.api.Test; import com.dselent.bigarraylist.BigArrayList; +import com.minecrafttas.tasmod.playback.PlaybackControllerClient.CommentContainer; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickContainer; import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata; @@ -181,6 +182,24 @@ void testSerialiseContainer() { // C o m p a r e assertBigArrayList(expected, actual); } + + @Test + void testSerialiseComments() { + List inlineComments = new ArrayList<>(); + + inlineComments.add("Test"); + inlineComments.add(null); + inlineComments.add("Test2"); + + List actual = serialiseInlineComments(inlineComments, new ArrayList<>()); + + List expected = new ArrayList<>(); + expected.add("// Test"); + expected.add(""); + expected.add("// Test2"); + + assertIterableEquals(expected, actual); + } @Test void testExtractHeader() { From df287a5476cc19b732851e56d585bdb61a0308ea Mon Sep 17 00:00:00 2001 From: Scribble Date: Thu, 13 Jun 2024 15:31:49 +0200 Subject: [PATCH 41/79] [PlaybackSerialiser] Added tests for serialisingComments - Rewrote inlineComment deserialisation to better merge filecommands and inline comments --- .../filecommands/PlaybackFileCommand.java | 7 + .../tasfile/flavor/SerialiserFlavorBase.java | 97 ++++++++++---- .../tasfile/SerialiserFlavorBaseTest.java | 123 ++++++++++++++++-- 3 files changed, 188 insertions(+), 39 deletions(-) diff --git a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java index a24bc2f9..e7c6f37f 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java @@ -14,7 +14,14 @@ public class PlaybackFileCommand{ private String[] args; + public PlaybackFileCommand(String name) { + this(name,(String[]) null); + } + public PlaybackFileCommand(String name, String... args) { + if(args == null) { + args = new String[] {}; + } this.name = name; this.args = args; } diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java index 22fec269..24e674d6 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java @@ -4,9 +4,9 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedHashMap; +import java.util.LinkedList; import java.util.List; import java.util.Queue; -import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.LinkedBlockingQueue; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -140,8 +140,8 @@ protected String serialiseFileCommand(PlaybackFileCommand fileCommand) { return String.format("$%s(%s);", fileCommand.getName(), String.join(", ", fileCommand.getArgs())); } - protected String serialiseMultipleFileCommands(List fileCommands) { - if(fileCommands == null) { + protected String serialiseFileCommandsInLine(List fileCommands) { + if (fileCommands == null) { return null; } List serialisedCommands = new ArrayList<>(); @@ -178,31 +178,48 @@ protected List serialiseCameraAngle(VirtualCameraAngle cameraAngle) { protected List serialiseInlineComments(List inlineComments, List> fileCommandsInline) { List out = new ArrayList<>(); - if (inlineComments == null) { - return out; + + Queue> fileCommandQueue = null; + if (fileCommandsInline != null) { + fileCommandQueue = new LinkedList<>(fileCommandsInline); } - Queue> fcListQueue = new ConcurrentLinkedQueue<>(fileCommandsInline); + // Serialise comments and merge them with file commands + if (inlineComments != null) { - for (String inlineComment : inlineComments) { - String serialisedFileCommand = serialiseMultipleFileCommands(fcListQueue.poll()); + Queue commentQueue = new LinkedList<>(inlineComments); - if(inlineComment == null && serialisedFileCommand == null) { - out.add(""); - continue; + // Iterate through comments + while (!commentQueue.isEmpty()) { + String comment = commentQueue.poll(); // Due to commentQueue being a LinkedList, comment can be null at this point! + + String command = null; + if (fileCommandQueue != null) { + command = serialiseFileCommandsInLine(fileCommandQueue.poll()); // Trying to poll a fileCommand. Command can be null at this point + } + + // Add an empty line if comment and command is null + if (comment == null && command == null) { + out.add(""); + continue; + } + + out.add(String.format("// %s", joinNotEmpty(" ", command, comment))); } - - inlineComment = inlineComment != null ? inlineComment : ""; - serialisedFileCommand = serialisedFileCommand != null ? serialisedFileCommand+" " : ""; - - - out.add(String.format("// %s%s", serialisedFileCommand, inlineComment)); - } - - while (!fcListQueue.isEmpty()) { - String serialisedFileCommand = serialiseMultipleFileCommands(fcListQueue.poll()); - if (serialisedFileCommand != null) { - out.add(String.format("// %s", serialisedFileCommand)); + } + + if (fileCommandQueue != null) { + + // If the fileCommandQueue is not empty or longer than the commentQueue, + // add the rest of the fileCommands to the end + while (!fileCommandQueue.isEmpty()) { + + String command = serialiseFileCommandsInLine(fileCommandQueue.poll()); + if (command != null) { + out.add(String.format("// %s", command)); + } else { + out.add(""); // Add an empty line if command is null + } } } @@ -246,6 +263,33 @@ protected String getOrEmpty(String string) { return string == null ? "" : string; } + /** + * Joins strings together but ignores empty strings + * + * @param delimiter The delimiter of the joined string + * @param args The strings to join + * @return Joined string + */ + protected String joinNotEmpty(String delimiter, Iterable args) { + String out = ""; + + List copy = new ArrayList<>(); + + args.forEach((arg) -> { + if (arg != null && !arg.isEmpty()) { + copy.add(arg); + } + }); + + out = String.join(delimiter, copy); + + return out; + } + + protected String joinNotEmpty(String delimiter, String... args) { + return joinNotEmpty(delimiter, Arrays.asList(args)); + } + /*======================================================== _____ _ _ _ | __ \ (_) | (_) @@ -425,7 +469,7 @@ protected void splitContainer(List lines, List comments, List deserialisedFileCommand = new ArrayList<>(); comments.add(deserialiseInlineComment(line, deserialisedFileCommand)); - if(deserialisedFileCommand.isEmpty()) { + if (deserialisedFileCommand.isEmpty()) { deserialisedFileCommand = null; } inlineFileCommands.add(deserialisedFileCommand); @@ -438,9 +482,9 @@ protected void splitContainer(List lines, List comments, List deserialisedFileCommands) { comment = deserialiseFileCommands(comment, deserialisedFileCommands); comment = extract("^// ?(.+)", comment, 1); - if(comment!=null) { + if (comment != null) { comment = comment.trim(); - if(comment.isEmpty()) { + if (comment.isEmpty()) { comment = null; } } @@ -459,6 +503,7 @@ protected String deserialiseFileCommands(String comment, List inlineComments = new ArrayList<>(); - + inlineComments.add("Test"); - inlineComments.add(null); + inlineComments.add(null); // Should result in an empty line inlineComments.add("Test2"); - + inlineComments.add(""); // Should result in "// " + List actual = serialiseInlineComments(inlineComments, new ArrayList<>()); - + List expected = new ArrayList<>(); expected.add("// Test"); expected.add(""); expected.add("// Test2"); - + expected.add("// "); + + assertIterableEquals(expected, actual); + + actual = serialiseEndlineComments(inlineComments, null); + + assertIterableEquals(expected, actual); + + } + + @Test + void testSerialiseFileCommands() { + List> fileCommands = new ArrayList<>(); + List fcInLine = new ArrayList<>(); + fcInLine.add(new PlaybackFileCommand("test")); + fcInLine.add(new PlaybackFileCommand("testing2", "true", "false")); + + List fcInLine2 = new ArrayList<>(); + fcInLine2.add(new PlaybackFileCommand("interpolation", "true")); + + fileCommands.add(fcInLine); + fileCommands.add(null); + fileCommands.add(fcInLine2); + fileCommands.add(new ArrayList<>()); + + List actual = serialiseInlineComments(null, fileCommands); + + List expected = new ArrayList<>(); + expected.add("// $test(); $testing2(true, false);"); + expected.add(""); + expected.add("// $interpolation(true);"); + expected.add("// "); + + assertIterableEquals(expected, actual); + } + + @Test + void testMergingCommentsAndCommands() { + List> fileCommands = new ArrayList<>(); + List fcInLine = new ArrayList<>(); + fcInLine.add(new PlaybackFileCommand("test")); + fcInLine.add(new PlaybackFileCommand("testing2", "true", "false")); + + fileCommands.add(fcInLine); + fileCommands.add(null); + fileCommands.add(null); + fileCommands.add(new ArrayList<>()); + + List fcInLine2 = new ArrayList<>(); + fcInLine2.add(new PlaybackFileCommand("interpolation", "true")); + + fileCommands.add(fcInLine2); + + List fcInLine3 = new ArrayList<>(); + fcInLine3.add(new PlaybackFileCommand("info", "Scribble")); + fcInLine3.add(new PlaybackFileCommand("info", "Dribble")); + + fileCommands.add(fcInLine3); + + List inlineComments = new ArrayList<>(); + + inlineComments.add("Test"); + inlineComments.add(null); + inlineComments.add("Test2"); + inlineComments.add(""); + inlineComments.add(null); + + List actual = serialiseInlineComments(inlineComments, fileCommands); + + List expected = new ArrayList<>(); + + expected.add("// $test(); $testing2(true, false); Test"); // Test both filecommand and comment + expected.add(""); // Test null from both + expected.add("// Test2"); // Test comment only + expected.add("// "); // Test empty from both + expected.add("// $interpolation(true);"); // Test command only + expected.add("// $info(Scribble); $info(Dribble);"); // Test command can't be merged with comments and is added at the end instead + assertIterableEquals(expected, actual); } @@ -410,14 +490,12 @@ void testSplitInputs() { expectedComment.add("Test"); expectedComment.add(null); - - expectedFileCommand.add(new ArrayList<>()); expectedFileCommand.add(new ArrayList<>()); - + List lineCommand = new ArrayList<>(); - lineCommand.add(new PlaybackFileCommand("test","true")); - + lineCommand.add(new PlaybackFileCommand("test", "true")); + expectedFileCommand.add(lineCommand); assertIterableEquals(actualKeyboard, expectedKeyboard); @@ -453,7 +531,7 @@ void testSplitContainer() { expectedTicks.add("55|W,LCONTROL;w|;0,887,626|17.85;-202.74799"); expectedTicks.add("\t1||RC;-15,1580,658|11.85;-2.74799"); expectedTicks.add("\t2||;0,1580,658|45;-22.799"); - + List> expectedInlineFileCommands = new ArrayList<>(); List commands = new ArrayList<>(); commands.add(new PlaybackFileCommand("interpolation", "on")); @@ -592,6 +670,25 @@ void testCenterHeadingEvenText2() { assertEquals(expected, actual); } + @Test + void testJoinNotEmpty() { + String actual = joinNotEmpty(" ", "Test", "", "Weee", "", "Wow"); + + String expected = "Test Weee Wow"; + + assertEquals(expected, actual); + + List actual2 = new ArrayList<>(); + actual2.add("Test"); + actual2.add(""); + actual2.add("Weee"); + actual2.add(null); + actual2.add("Wow"); + + actual = joinNotEmpty(" ", actual2); + assertEquals(expected, actual); + } + private void assertBigArrayList(BigArrayList expected, BigArrayList actual) { assertIterableEquals(convertBigArrayListToArrayList(expected), convertBigArrayListToArrayList(actual)); } From 06b77fc76a8cdbc5b18294718d16bc8476f91802 Mon Sep 17 00:00:00 2001 From: Scribble Date: Thu, 13 Jun 2024 15:39:58 +0200 Subject: [PATCH 42/79] [PlaybackSerialiser] Fixed PlaybackFileCommandContainer not being able to handle null - Fixed testing split inputs --- .../filecommands/PlaybackFileCommand.java | 109 ++++++++++-------- .../tasfile/flavor/SerialiserFlavorBase.java | 4 + .../tasfile/SerialiserFlavorBaseTest.java | 4 +- 3 files changed, 64 insertions(+), 53 deletions(-) diff --git a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java index e7c6f37f..7eaa5265 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java @@ -8,64 +8,68 @@ import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickContainer; -public class PlaybackFileCommand{ - +public class PlaybackFileCommand { + private String name; - + private String[] args; - + public PlaybackFileCommand(String name) { - this(name,(String[]) null); + this(name, (String[]) null); } - + public PlaybackFileCommand(String name, String... args) { - if(args == null) { + if (args == null) { args = new String[] {}; } this.name = name; this.args = args; } - + public String getName() { return name; } - + public String[] getArgs() { return args; } - + @Override public boolean equals(Object obj) { - if(obj instanceof PlaybackFileCommand) { + if (obj instanceof PlaybackFileCommand) { PlaybackFileCommand other = (PlaybackFileCommand) obj; return this.name.equals(other.name) && Arrays.equals(this.args, other.args); } return super.equals(obj); } - + @Override public String toString() { return String.format("$%s(%s);", name, String.join(", ", args)); } - + public static abstract class PlaybackFileCommandExtension { - - protected boolean enabled=false; - + + protected boolean enabled = false; + public abstract String name(); - + public String[] getFileCommandNames() { return new String[] {}; } - - public void onEnable() {}; - - public void onDisable() {}; - - public void onRecord(long tick, TickContainer tickContainer) {}; - - public void onPlayback(long tick, TickContainer tickContainer) {}; - + + public void onEnable() { + }; + + public void onDisable() { + }; + + public void onRecord(long tick, TickContainer tickContainer) { + }; + + public void onPlayback(long tick, TickContainer tickContainer) { + }; + protected PlaybackFileCommandContainer onSerialiseInlineComment(long tick, TickContainer tickContainer) { return null; } @@ -73,55 +77,59 @@ protected PlaybackFileCommandContainer onSerialiseInlineComment(long tick, TickC protected PlaybackFileCommandContainer onSerialiseEndlineComment(long currentTick, TickContainer tickContainer) { return null; } - - public void onDeserialiseInlineComment(long tick, TickContainer container, PlaybackFileCommandContainer fileCommandContainer) {} - - public void onDeserialiseEndlineComment(long tick, TickContainer container, PlaybackFileCommandContainer fileCommandContainer) {} - + + public void onDeserialiseInlineComment(long tick, TickContainer container, PlaybackFileCommandContainer fileCommandContainer) { + } + + public void onDeserialiseEndlineComment(long tick, TickContainer container, PlaybackFileCommandContainer fileCommandContainer) { + } + public boolean isEnabled() { return enabled; } - + public void setEnabled(boolean enabled) { - if(enabled) + if (enabled) onEnable(); else onDisable(); this.enabled = enabled; } } - + public static class PlaybackFileCommandContainer extends LinkedHashMap> { public PlaybackFileCommandContainer() { } - + public PlaybackFileCommandContainer(List> list) { - for(List lists : list) { - for(PlaybackFileCommand command : lists) { - this.put(command.getName(), new ArrayList<>()); + for (List lists : list) { + if (lists != null) { + for (PlaybackFileCommand command : lists) { + this.put(command.getName(), new ArrayList<>()); + } } } - - for(List lists : list) { + + for (List lists : list) { for (Map.Entry> entry : this.entrySet()) { String key = entry.getKey(); List val = entry.getValue(); - + boolean valuePresent = false; - for(PlaybackFileCommand command : lists) { - if(key.equals(command.getName())) { + for (PlaybackFileCommand command : lists) { + if (key.equals(command.getName())) { valuePresent = true; val.add(command); } } - if(!valuePresent) { + if (!valuePresent) { val.add(null); } } } } - + public PlaybackFileCommandContainer split(String... keys) { return split(Arrays.asList(keys)); } @@ -136,29 +144,28 @@ public PlaybackFileCommandContainer split(Iterable keys) { public List> valuesBySubtick() { List> out = new ArrayList<>(); - + int biggestSize = 0; for (List list : values()) { if (list.size() > biggestSize) { biggestSize = list.size(); } } - + for (int i = 0; i < biggestSize; i++) { List commandListForOneLine = new ArrayList<>(); for (List list : values()) { - if(i lines, List serialisedKeyboard, List deserialisedFileCommands = new ArrayList<>(); String endlineComment = line.substring(tickMatcher.group(0).length()); commentsAtEnd.add(deserialiseEndlineComment(endlineComment, deserialisedFileCommands)); + + if(deserialisedFileCommands.isEmpty()) + deserialisedFileCommands = null; + endlineFileCommands.add(deserialisedFileCommands); } } diff --git a/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java b/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java index bbbc4827..7bcd7283 100644 --- a/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java +++ b/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java @@ -490,8 +490,8 @@ void testSplitInputs() { expectedComment.add("Test"); expectedComment.add(null); - expectedFileCommand.add(new ArrayList<>()); - expectedFileCommand.add(new ArrayList<>()); + expectedFileCommand.add(null); + expectedFileCommand.add(null); List lineCommand = new ArrayList<>(); lineCommand.add(new PlaybackFileCommand("test", "true")); From d2fdf9f6684d4e59469fdb922f1f24e83806bdc0 Mon Sep 17 00:00:00 2001 From: Scribble Date: Fri, 14 Jun 2024 16:57:11 +0200 Subject: [PATCH 43/79] [PlaybackSerialiser] Added support for relative coord input (#184) - Added more constructors for PlaybackLoadException - Added tests for coord input --- .../exception/PlaybackLoadException.java | 39 +++++++ .../tasfile/flavor/SerialiserFlavorBase.java | 110 +++++++++++++----- .../tasfile/SerialiserFlavorBaseTest.java | 72 ++++++++++++ 3 files changed, 192 insertions(+), 29 deletions(-) diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/exception/PlaybackLoadException.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/exception/PlaybackLoadException.java index 24282c5f..12a2fc40 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/exception/PlaybackLoadException.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/exception/PlaybackLoadException.java @@ -1,16 +1,55 @@ package com.minecrafttas.tasmod.playback.tasfile.exception; +import com.minecrafttas.tasmod.TASmod; + public class PlaybackLoadException extends RuntimeException { + public PlaybackLoadException(long tick, int subtick, String msg) { + this(printTick(tick, subtick)+msg); + } + public PlaybackLoadException(String msg) { super(msg); } + public PlaybackLoadException(long tick, int subtick, String msg, Object... args) { + this(printTick(tick, subtick)+msg, args); + } + public PlaybackLoadException(String msg, Object... args) { super(String.format(msg, args)); } + public PlaybackLoadException(long tick, int subtick, Throwable cause) { + this(printTick(tick, subtick), cause); + } + public PlaybackLoadException(Throwable cause) { super(cause); } + + public PlaybackLoadException(long tick, int subtick, Throwable cause, String msg) { + this(cause, printTick(tick, subtick)+msg); + } + + public PlaybackLoadException(Throwable cause, String msg) { + super(msg, cause, false, false); + } + + public PlaybackLoadException(long tick, int subtick, Throwable cause, String msg, Object... args) { + this(cause, printTick(tick, subtick)+msg, args); + } + + public PlaybackLoadException(Throwable cause, String msg, Object... args) { + this(cause, String.format(msg, args)); + } + + private static String printTick(long tick, int subtick) { + return String.format("Tick %s, Subtick %s: ", tick, subtick); + } + + @Override + public void printStackTrace() { + TASmod.LOGGER.catching(this);; + } } diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java index b63b9e81..b8191057 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java @@ -35,7 +35,7 @@ public abstract class SerialiserFlavorBase { /** * Debug subtick field for error handling */ - protected Integer currentSubtick = null; + protected int currentSubtick = 0; public abstract String flavorName(); @@ -256,7 +256,7 @@ protected void mergeInputs(BigArrayList out, List serialisedKeyb out.add(String.format("\t%s|%s|%s|%s", currentSubtick, kb, ms, ca)); } - currentSubtick = null; + currentSubtick = 0; } protected String getOrEmpty(String string) { @@ -267,7 +267,7 @@ protected String getOrEmpty(String string) { * Joins strings together but ignores empty strings * * @param delimiter The delimiter of the joined string - * @param args The strings to join + * @param args The strings to join * @return Joined string */ protected String joinNotEmpty(String delimiter, Iterable args) { @@ -302,6 +302,8 @@ protected String joinNotEmpty(String delimiter, String... args) { * */ + private TickContainer previousTickContainer = null; + public boolean deserialiseFlavorName(List headerLines) { for (String line : headerLines) { Matcher matcher = extract("^Flavor: " + flavorName(), line); @@ -397,9 +399,11 @@ public BigArrayList deserialise(BigArrayList lines, long List tick = new ArrayList<>(); // Extract the tick and set the index i = extractContainer(tick, lines, i); + currentTick = i; // Extract container deserialiseContainer(out, tick); } + previousTickContainer = null; return out; } @@ -456,6 +460,8 @@ protected void deserialiseContainer(BigArrayList out, List keyboardStrings) { VirtualKeyboard out = new VirtualKeyboard(); + currentSubtick = 0; for (String line : keyboardStrings) { Matcher matcher = extract("(.*?);(.*)", line); if (matcher.find()) { @@ -519,6 +526,7 @@ protected VirtualKeyboard deserialiseKeyboard(List keyboardStrings) { int[] keycodes = deserialiseVirtualKey(keys, VirtualKey.ZERO); out.updateFromState(keycodes, chars); } + currentSubtick++; } return out; } @@ -526,6 +534,10 @@ protected VirtualKeyboard deserialiseKeyboard(List keyboardStrings) { protected VirtualMouse deserialiseMouse(List mouseStrings) { VirtualMouse out = new VirtualMouse(); + currentSubtick = 0; + Integer previousCursorX = previousTickContainer == null? null : previousTickContainer.getMouse().getCursorX(); + Integer previousCursorY = previousTickContainer== null? null : previousTickContainer.getMouse().getCursorY(); + for (String line : mouseStrings) { Matcher matcher = extract("(.*?);(.+)", line); if (matcher.find()) { @@ -538,19 +550,19 @@ protected VirtualMouse deserialiseMouse(List mouseStrings) { Integer cursorY; if (functions.length == 3) { - try { - scrollwheel = Integer.parseInt(functions[0]); - cursorX = Integer.parseInt(functions[1]); - cursorY = Integer.parseInt(functions[2]); - } catch (NumberFormatException e) { - throw new PlaybackLoadException(e); - } + scrollwheel = parseInt("scrollwheel", functions[0]); + cursorX = deserialiseRelativeInt("cursorX", functions[1], previousCursorX); + cursorY = deserialiseRelativeInt("cursorY", functions[2], previousCursorY); } else { throw new PlaybackLoadException("Mouse functions do not have the correct length"); } out.updateFromState(keycodes, scrollwheel, cursorX, cursorY); + + previousCursorX = cursorX; + previousCursorY = cursorY; } + currentSubtick++; } return out; } @@ -558,6 +570,10 @@ protected VirtualMouse deserialiseMouse(List mouseStrings) { protected VirtualCameraAngle deserialiseCameraAngle(List cameraAngleStrings) { VirtualCameraAngle out = new VirtualCameraAngle(); + currentSubtick = 0; + Float previousPitch = previousTickContainer == null ? null : previousTickContainer.getCameraAngle().getPitch(); + Float previousYaw = previousTickContainer == null ? null : previousTickContainer.getCameraAngle().getYaw(); + for (String line : cameraAngleStrings) { Matcher matcher = extract("(.+?);(.+)", line); @@ -565,24 +581,12 @@ protected VirtualCameraAngle deserialiseCameraAngle(List cameraAngleStri String cameraPitchString = matcher.group(1); String cameraYawString = matcher.group(2); - float cameraPitch; - float cameraYaw; - - if (isFloat(cameraPitchString)) - cameraPitch = Float.parseFloat(cameraPitchString); - else - throw new PlaybackLoadException("The camera pitch is not valid"); - - if (isFloat(cameraYawString)) - cameraYaw = Float.parseFloat(cameraYawString); - else - throw new PlaybackLoadException("The camera yaw is not valid"); + float cameraPitch = deserialiseRelativeFloat("camera pitch", cameraPitchString, previousPitch); + float cameraYaw = deserialiseRelativeFloat("camera yaw", cameraYawString, previousYaw); out.updateFromState(cameraPitch, cameraYaw); - - } else { - throw new PlaybackLoadException("The cameraAngle is not valid"); } + currentSubtick++; } return out; } @@ -614,6 +618,54 @@ protected int[] deserialiseVirtualKey(String[] keyString, VirtualKey defaultKey) return out; } + protected int parseInt(String name, String intstring) { + try { + return Integer.parseInt(intstring); + } catch (NumberFormatException e) { + throw new PlaybackLoadException(currentTick, currentSubtick, e, "Can't parse integer in %s", name); + } + } + + protected int deserialiseRelativeInt(String name, String intstring, Integer previous) { + int out = 0; + if(intstring.startsWith("~")) { + intstring = intstring.replace("~", ""); + int relative = parseInt(name, intstring); + if(previous != null) { + out = previous + relative; + } else { + throw new PlaybackLoadException(currentTick, currentSubtick, "Can't process relative value ~%s in %s. Previous value for comparing is not available", intstring, name); + } + } else { + out = parseInt(name, intstring); + } + return out; + } + + protected float parseFloat(String name, String floatstring) { + try { + return Float.parseFloat(floatstring); + } catch (NumberFormatException e) { + throw new PlaybackLoadException(currentTick, currentSubtick, e, "Can't parse float in %s", name); + } + } + + protected float deserialiseRelativeFloat(String name, String floatstring, Float previous) { + float out = 0; + if(floatstring.startsWith("~")) { + floatstring = floatstring.replace("~", ""); + float relative = parseFloat(name, floatstring); + if(previous != null) { + out = previous + relative; + } else { + throw new PlaybackLoadException(currentTick, currentSubtick, "Can't process relative value ~%s in %s. Previous value for comparing is not available", floatstring, name); + } + } else { + out = parseFloat(name, floatstring); + } + return out; + } + protected void splitInputs(List lines, List serialisedKeyboard, List serialisedMouse, List serialisedCameraAngle, List commentsAtEnd, List> endlineFileCommands) { for (String line : lines) { @@ -635,10 +687,10 @@ protected void splitInputs(List lines, List serialisedKeyboard, List deserialisedFileCommands = new ArrayList<>(); String endlineComment = line.substring(tickMatcher.group(0).length()); commentsAtEnd.add(deserialiseEndlineComment(endlineComment, deserialisedFileCommands)); - - if(deserialisedFileCommands.isEmpty()) + + if (deserialisedFileCommands.isEmpty()) deserialisedFileCommands = null; - + endlineFileCommands.add(deserialisedFileCommands); } } diff --git a/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java b/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java index 7bcd7283..1b692b61 100644 --- a/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java +++ b/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java @@ -627,6 +627,78 @@ void testIsFloat() { assertTrue(isFloat("-145.23")); assertTrue(isFloat(Long.toString(Integer.MAX_VALUE + 1L))); } + + @Test + void testParseInt() { + int actual = parseInt("testParseInt", "12"); + assertEquals(12, actual); + + this.currentTick = 13; + this.currentSubtick = 1; + Throwable t = assertThrows(PlaybackLoadException.class, ()->{ + parseInt("testParseInt", "12.1"); + }); + + assertEquals("Tick 13, Subtick 1: Can't parse integer in testParseInt", t.getMessage()); + assertEquals(NumberFormatException.class, t.getCause().getClass()); + assertEquals("For input string: \"12.1\"", t.getCause().getMessage()); + this.currentTick = 0; + this.currentSubtick = 0; + } + + @Test + void testParseFloat() { + float actual = parseFloat("testParseFloat", "12.1"); + assertEquals(12.1f, actual); + + this.currentTick = 15; + this.currentSubtick = 6; + Throwable t = assertThrows(PlaybackLoadException.class, ()->{ + parseFloat("testParseFloat", "12.123h"); + }); + + assertEquals("Tick 15, Subtick 6: Can't parse float in testParseFloat", t.getMessage()); + assertEquals(NumberFormatException.class, t.getCause().getClass()); + assertEquals("For input string: \"12.123h\"", t.getCause().getMessage()); + this.currentTick = 0; + this.currentSubtick = 0; + } + + @Test + void testDeserialiseRelativeInt() { + int actual = deserialiseRelativeInt("testParseRelativeInt", "12", null); + assertEquals(12, actual); + + actual = deserialiseRelativeInt("test", "~2", 14); + assertEquals(16, actual); + + this.currentTick = 23; + this.currentSubtick = 11; + Throwable t = assertThrows(PlaybackLoadException.class, ()->{ + deserialiseRelativeInt("testParseRelativeInt", "~12", null); + }); + assertEquals("Tick 23, Subtick 11: Can't process relative value ~12 in testParseRelativeInt. Previous value for comparing is not available", t.getMessage()); + this.currentTick = 0; + this.currentSubtick = 0; + } + + @Test + void testDeserialiseRelativeFloat() { + float actual = deserialiseRelativeFloat("testParseRelativeFloat", "12.2", null); + assertEquals(12.2f, actual); + + actual = deserialiseRelativeFloat("test", "~2.4", 14.4f); + assertEquals(16.8f, actual); + + this.currentTick = 20; + this.currentSubtick = 2; + Throwable t = assertThrows(PlaybackLoadException.class, ()->{ + deserialiseRelativeFloat("testParseRelativeFloat", "~12.3", null); + }); + assertEquals("Tick 20, Subtick 2: Can't process relative value ~12.3 in testParseRelativeFloat. Previous value for comparing is not available", t.getMessage()); + this.currentTick = 0; + this.currentSubtick = 0; + } @Test void testStringPaddingEven() { From ccfd759e91d0cffcb71ca07eca9a43c5f3a56e9e Mon Sep 17 00:00:00 2001 From: Scribble Date: Fri, 14 Jun 2024 21:48:20 +0200 Subject: [PATCH 44/79] [PlaybackSerialiser] Rewrite modules, added tests - Added tests for error handling --- .../PlaybackFileCommandsRegistry.java | 6 +- .../playback/tasfile/PlaybackSerialiser2.java | 7 +- .../tasfile/flavor/SerialiserFlavorBase.java | 201 +++++++-- .../flavor/SerialiserFlavorRegistry.java | 2 +- .../flavor/integrated/Beta1Flavor.java | 5 + .../tasmod/util/TASmodRegistry.java | 1 + .../tasfile/PlaybackSerialiserTest.java | 6 +- .../tasfile/SerialiserFlavorBaseTest.java | 385 ++++++++++++++---- 8 files changed, 487 insertions(+), 126 deletions(-) diff --git a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommandsRegistry.java b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommandsRegistry.java index c521716a..ecd17338 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommandsRegistry.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommandsRegistry.java @@ -53,8 +53,10 @@ public void unregister(PlaybackFileCommandExtension extension) { public void setEnabled(String extensionName, boolean enabled) { PlaybackFileCommandExtension extension = REGISTRY.get(extensionName); - extension.setEnabled(enabled); - enabledExtensions = getEnabled(); + if(extension != null) { + extension.setEnabled(enabled); + enabledExtensions = getEnabled(); + } } private void disableAll() { diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java index 86210e6c..8c2cb3f9 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java @@ -155,13 +155,8 @@ public static BigArrayList loadFromFile(File file, SerialiserFlav // Deserialise Header List headerLines = flavor.extractHeader(lines); - List deserialisedMetadata = new ArrayList<>(); - List deserialisedExtensionNames = new ArrayList<>(); - flavor.deserialiseHeader(headerLines, deserialisedMetadata, deserialisedExtensionNames); - - TASmodRegistry.PLAYBACK_METADATA.handleOnLoad(deserialisedMetadata); - TASmodRegistry.PLAYBACK_FILE_COMMAND.setEnabled(deserialisedExtensionNames); + flavor.deserialiseHeader(headerLines); // Deserialise main data BigArrayList deserialisedContainers = flavor.deserialise(lines, headerLines.size()); diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java index b8191057..bf2020a0 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java @@ -72,8 +72,8 @@ public List serialiseHeader(List metadataList, List out = new ArrayList<>(); out.add(headerStart()); serialiseFlavorName(out); - serialiseFileCommandNames(out, extensionList); - serialiseMetadata(out, metadataList); + serialiseFileCommandNames(out); + serialiseMetadata(out); out.add(headerEnd()); return out; } @@ -82,13 +82,16 @@ protected void serialiseFlavorName(List out) { out.add("Flavor: " + flavorName()); } - protected void serialiseFileCommandNames(List out, List extensionList) { + protected void serialiseFileCommandNames(List out) { List stringlist = new ArrayList<>(); + List extensionList = TASmodRegistry.PLAYBACK_FILE_COMMAND.getEnabled(); extensionList.forEach(extension -> stringlist.add(extension.name())); - out.add("FC_Extensions: " + String.join(", ", stringlist)); + out.add("FileCommand-Extensions: " + String.join(", ", stringlist)); } - protected void serialiseMetadata(List out, List metadataList) { + protected void serialiseMetadata(List out) { + List metadataList = TASmodRegistry.PLAYBACK_METADATA.handleOnStore(); + for (PlaybackMetadata metadata : metadataList) { serialiseMetadataName(out, metadata.getExtensionName()); serialiseMetadataValue(out, metadata.getData()); @@ -302,7 +305,7 @@ protected String joinNotEmpty(String delimiter, String... args) { * */ - private TickContainer previousTickContainer = null; + protected TickContainer previousTickContainer = null; public boolean deserialiseFlavorName(List headerLines) { for (String line : headerLines) { @@ -315,9 +318,8 @@ public boolean deserialiseFlavorName(List headerLines) { return false; } - public void deserialiseHeader(List headerLines, List metadataList, List activeExtensionList) { - - metadataList.addAll(deserialiseMetadata(headerLines)); + public void deserialiseHeader(List headerLines) { + deserialiseMetadata(headerLines); deserialiseFileCommandNames(headerLines); } @@ -338,21 +340,22 @@ public List extractHeader(BigArrayList lines) { throw new PlaybackLoadException("Cannot find the end of the header"); } - public List deserialiseFileCommandNames(List headerLines) { + public void deserialiseFileCommandNames(List headerLines) { for (String line : headerLines) { - Matcher matcher = extract("FC_Extensions: ?(.*)", line); + Matcher matcher = extract("FileCommand-Extensions: ?(.*)", line); if (matcher.find()) { String extensionStrings = matcher.group(1); - String[] extensionNames = extensionStrings.split(", "); + String[] extensionNames = extensionStrings.split(", ?"); - return Arrays.asList(extensionNames); + TASmodRegistry.PLAYBACK_FILE_COMMAND.setEnabled(Arrays.asList(extensionNames)); + return; } } - throw new PlaybackLoadException("Extensions value was not found in the header"); + throw new PlaybackLoadException("FileCommand-Extensions value was not found in the header"); } - public List deserialiseMetadata(List headerLines) { + public void deserialiseMetadata(List headerLines) { List out = new ArrayList<>(); String metadataName = null; @@ -382,7 +385,7 @@ public List deserialiseMetadata(List headerLines) { if (metadataName != null) out.add(PlaybackMetadata.fromHashMap(metadataName, values)); - return out; + TASmodRegistry.PLAYBACK_METADATA.handleOnLoad(out); } /** @@ -407,27 +410,148 @@ public BigArrayList deserialise(BigArrayList lines, long return out; } + protected enum ExtractPhases { + /** + * InlineComment phase. + *
+		 * ---
+		 * // This is a comment
+		 * // $fileCommand();
+		 * 
+		 * ---
+		 * 
+ * Empty lines also count as comments + */ + COMMENTS, + /** + * Tick phase. Start with a number, then a | character + *
+		 * ---
+		 * 57|W,LCONTROL;w|;0,887,626|17.85;-202.74799
+		 * ---
+		 * 
+ * Only one line should be in this phase + */ + TICK, + /** + * Subtick phase. Start with a tabulator, then a number, then a | character + *
+		 * ---
+		 * 	1||RC;0,1580,658|17.85;-202.74799\t\t// This is an endline comment
+		 * 	2||;0,1580,658|17.85;-202.74799
+		 * ---
+		 * Can have multiple subticks
+		 */
+		SUBTICK,
+		/**
+		 * We are outside a tick
+		 */
+		NONE
+	}
+
 	/**
-	 * Reads the next lines, until a full tickcontainer is reached
+	 * 

+ * Extracts all the lines corresponding to one tick+subticks a.k.a one + * "container" from the incoming lines.
+ * The extracted ticks are easier to process than using a huge list.
+ *

+ * A container has multiple parts to it, that are split into + * {@link ExtractPhases}
+ * The container starts in {@link ExtractPhases#NONE}. * + *

+	 * --- {@link ExtractPhases#COMMENTS Comment phase} --- 
+	 * // This is a comment 
+	 * // $fileCommand(); 
+	 * --- {@link ExtractPhases#TICK Tick phase} ---
+	 * 57|W,LCONTROL;w|;0,887,626|17.85;-202.74799 
+	 * --- {@link ExtractPhases#SUBTICK Subtick phase} --- 
+	 * 	1||RC;0,1580,658|17.85;-202.74799	// This is an endline comment 
+	 * 	2||;0,1580,658|17.85;-202.74799
+	 * ---------------------
+	 * 
+ *

Logic

+ *
    + *
  1. Phase: None + *
      + *
    1. If a comment is found, set the phase to comment
    2. + *
    3. If a tick is found, set the phase to tick
    4. + *
    5. If a subtick is found, throw an error. Subticks always come after ticks
    6. + *
  2. + *
  3. Phase: Comment + *
      + *
    1. If a tick is found, set the phase to tick
    2. + *
    3. If a subtick is found, throw an error. Subticks always come after ticks
    4. + *
  4. + *
  5. Phase: Tick + *
      + *
    1. If a subtick is found, set the phase to subticks
    2. + *
    3. If a tick is found, end the extraction
    4. + *
    5. If a comment is found, end the extraction
    6. + *
  6. + *
  7. Phase: Subtick + *
      + *
    1. If a tick is found, end the extraction
    2. + *
    3. If a comment is found, end the extraction
    4. + *
  8. + *
* @param extracted The extracted lines, passed in by reference * @param lines The line list * @param startPos The start position of this tick * @return The updated index for the next tick */ protected long extractContainer(List extracted, BigArrayList lines, long startPos) { - boolean shouldStop = false; + ExtractPhases phase = ExtractPhases.NONE; + + String commentRegex = "^//"; + String tickRegex = "^\\d+\\|"; + String subtickRegex = "^\t\\d+\\|"; + long counter = 0L; for (long i = startPos; i < lines.size(); i++) { String line = lines.get(i); - if (contains("^\\d+\\|", line)) { - if (shouldStop) { - return startPos + counter - 1; - } else { - shouldStop = true; - } + + switch (phase) { + case NONE: + if (contains(subtickRegex, line)) { // Subtick + throw new PlaybackLoadException(currentTick, currentSubtick, "Error while trying to parse line %s in line %s. This should not be a subtick at this position", line, startPos + counter); + } + + if (contains(commentRegex, line)||line.isEmpty()) { // Comment + phase = ExtractPhases.COMMENTS; + } + else if (contains(tickRegex, line)) { // Tick + phase = ExtractPhases.TICK; + } + + break; + case COMMENTS: + if (contains(subtickRegex, line)) { // Subtick + throw new PlaybackLoadException(currentTick, currentSubtick, "Error while trying to parse line %s in line %s. This should not be a subtick at this position", line, startPos + counter); + } + + if (contains(tickRegex, line)) { + phase = ExtractPhases.TICK; + } + + break; + case TICK: + if (contains(subtickRegex, line)) { + phase = ExtractPhases.SUBTICK; + } + + if (contains(commentRegex, line) || contains(tickRegex, line) || line.isEmpty()) { + return startPos + counter - 1; + } + + break; + case SUBTICK: + if (contains(commentRegex, line) || contains(tickRegex, line) || line.isEmpty()) { + return startPos + counter - 1; + } + break; } - if (shouldStop) { + if (phase != ExtractPhases.NONE) { extracted.add(line); } counter++; @@ -535,9 +659,9 @@ protected VirtualMouse deserialiseMouse(List mouseStrings) { VirtualMouse out = new VirtualMouse(); currentSubtick = 0; - Integer previousCursorX = previousTickContainer == null? null : previousTickContainer.getMouse().getCursorX(); - Integer previousCursorY = previousTickContainer== null? null : previousTickContainer.getMouse().getCursorY(); - + Integer previousCursorX = previousTickContainer == null ? null : previousTickContainer.getMouse().getCursorX(); + Integer previousCursorY = previousTickContainer == null ? null : previousTickContainer.getMouse().getCursorY(); + for (String line : mouseStrings) { Matcher matcher = extract("(.*?);(.+)", line); if (matcher.find()) { @@ -554,11 +678,11 @@ protected VirtualMouse deserialiseMouse(List mouseStrings) { cursorX = deserialiseRelativeInt("cursorX", functions[1], previousCursorX); cursorY = deserialiseRelativeInt("cursorY", functions[2], previousCursorY); } else { - throw new PlaybackLoadException("Mouse functions do not have the correct length"); + throw new PlaybackLoadException(currentTick, currentSubtick, "Mouse functions do not have the correct length"); } out.updateFromState(keycodes, scrollwheel, cursorX, cursorY); - + previousCursorX = cursorX; previousCursorY = cursorY; } @@ -573,7 +697,7 @@ protected VirtualCameraAngle deserialiseCameraAngle(List cameraAngleStri currentSubtick = 0; Float previousPitch = previousTickContainer == null ? null : previousTickContainer.getCameraAngle().getPitch(); Float previousYaw = previousTickContainer == null ? null : previousTickContainer.getCameraAngle().getYaw(); - + for (String line : cameraAngleStrings) { Matcher matcher = extract("(.+?);(.+)", line); @@ -628,10 +752,10 @@ protected int parseInt(String name, String intstring) { protected int deserialiseRelativeInt(String name, String intstring, Integer previous) { int out = 0; - if(intstring.startsWith("~")) { + if (intstring.startsWith("~")) { intstring = intstring.replace("~", ""); int relative = parseInt(name, intstring); - if(previous != null) { + if (previous != null) { out = previous + relative; } else { throw new PlaybackLoadException(currentTick, currentSubtick, "Can't process relative value ~%s in %s. Previous value for comparing is not available", intstring, name); @@ -641,7 +765,7 @@ protected int deserialiseRelativeInt(String name, String intstring, Integer prev } return out; } - + protected float parseFloat(String name, String floatstring) { try { return Float.parseFloat(floatstring); @@ -652,10 +776,10 @@ protected float parseFloat(String name, String floatstring) { protected float deserialiseRelativeFloat(String name, String floatstring, Float previous) { float out = 0; - if(floatstring.startsWith("~")) { + if (floatstring.startsWith("~")) { floatstring = floatstring.replace("~", ""); float relative = parseFloat(name, floatstring); - if(previous != null) { + if (previous != null) { out = previous + relative; } else { throw new PlaybackLoadException(currentTick, currentSubtick, "Can't process relative value ~%s in %s. Previous value for comparing is not available", floatstring, name); @@ -665,7 +789,7 @@ protected float deserialiseRelativeFloat(String name, String floatstring, Float } return out; } - + protected void splitInputs(List lines, List serialisedKeyboard, List serialisedMouse, List serialisedCameraAngle, List commentsAtEnd, List> endlineFileCommands) { for (String line : lines) { @@ -773,4 +897,7 @@ public static void addAll(BigArrayList list, List list.add(element); } } + + @Override + protected abstract SerialiserFlavorBase clone(); } diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorRegistry.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorRegistry.java index 55cc2853..19112df7 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorRegistry.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorRegistry.java @@ -53,7 +53,7 @@ public Set getFlavorNames(){ } public SerialiserFlavorBase getFlavor(String name) { - return REGISTRY.get(name); + return REGISTRY.get(name).clone(); } public List getFlavors() { diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/integrated/Beta1Flavor.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/integrated/Beta1Flavor.java index 708b7e2e..8bde624d 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/integrated/Beta1Flavor.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/integrated/Beta1Flavor.java @@ -29,4 +29,9 @@ protected List serialiseMouse(VirtualMouse mouse) { protected List serialiseCameraAngle(VirtualCameraAngle cameraAngle) { return null; } + + @Override + protected SerialiserFlavorBase clone() { + return new Beta1Flavor(); + } } diff --git a/src/main/java/com/minecrafttas/tasmod/util/TASmodRegistry.java b/src/main/java/com/minecrafttas/tasmod/util/TASmodRegistry.java index d540b5a3..8c94a58a 100644 --- a/src/main/java/com/minecrafttas/tasmod/util/TASmodRegistry.java +++ b/src/main/java/com/minecrafttas/tasmod/util/TASmodRegistry.java @@ -35,4 +35,5 @@ public class TASmodRegistry { * The resulting flavor can be registered here and can be found as a saving option with /saveTAS */ public static final SerialiserFlavorRegistry SERIALISER_FLAVOR = new SerialiserFlavorRegistry(); + } diff --git a/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java b/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java index c48d6b59..bf22b164 100644 --- a/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java +++ b/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java @@ -12,7 +12,6 @@ import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import com.dselent.bigarraylist.BigArrayList; @@ -38,6 +37,11 @@ public String flavorName() { return "Test"; } + + @Override + protected SerialiserFlavorBase clone() { + return new TestFlavor(); + } } private static class TestMetadatada implements PlaybackMetadataExtension { diff --git a/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java b/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java index 1b692b61..c2836a57 100644 --- a/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java +++ b/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java @@ -11,11 +11,13 @@ import java.util.LinkedHashMap; import java.util.List; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import com.dselent.bigarraylist.BigArrayList; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickContainer; import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand; +import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandExtension; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadataRegistry.PlaybackMetadataExtension; import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackLoadException; @@ -28,72 +30,17 @@ public class SerialiserFlavorBaseTest extends SerialiserFlavorBase { - class MetadataTest implements PlaybackMetadataExtension { - - public String testValue; - - @Override - public String getExtensionName() { - return "Test1"; - } - - @Override - public void onCreate() { - - } - - @Override - public PlaybackMetadata onStore() { - PlaybackMetadata metadata = new PlaybackMetadata(this); - metadata.setValue("TestKey", testValue); - return metadata; - } - - @Override - public void onLoad(PlaybackMetadata metadata) { - testValue = metadata.getValue("TestKey"); - } - - @Override - public void onClear() { - this.testValue = null; - } - - } - - class MetadataTest2 implements PlaybackMetadataExtension { - - public String testValue; - - @Override - public String getExtensionName() { - return "Test2"; - } - - @Override - public void onCreate() { - - } - - @Override - public PlaybackMetadata onStore() { - PlaybackMetadata metadata = new PlaybackMetadata(this); - metadata.setValue("TestKey", testValue); - return metadata; - } - - @Override - public void onLoad(PlaybackMetadata metadata) { - testValue = metadata.getValue("TestKey"); - } - - @Override - public void onClear() { - this.testValue = null; - } - + @AfterEach + void afterEach() { + TASmodRegistry.PLAYBACK_FILE_COMMAND.clear(); + TASmodRegistry.PLAYBACK_METADATA.clear(); + TASmodRegistry.SERIALISER_FLAVOR.clear(); + + this.currentTick = 0; + this.currentSubtick = 0; + this.previousTickContainer = null; } - + @Override public String flavorName() { return "Test"; @@ -120,6 +67,73 @@ void testSerialiseHeaderStart() { */ @Test void testSerialiseMetadata() { + + class MetadataTest implements PlaybackMetadataExtension { + + public String testValue; + + @Override + public String getExtensionName() { + return "Test1"; + } + + @Override + public void onCreate() { + + } + + @Override + public PlaybackMetadata onStore() { + PlaybackMetadata metadata = new PlaybackMetadata(this); + metadata.setValue("TestKey", testValue); + return metadata; + } + + @Override + public void onLoad(PlaybackMetadata metadata) { + testValue = metadata.getValue("TestKey"); + } + + @Override + public void onClear() { + this.testValue = null; + } + + } + + class MetadataTest2 implements PlaybackMetadataExtension { + + public String testValue; + + @Override + public String getExtensionName() { + return "Test2"; + } + + @Override + public void onCreate() { + + } + + @Override + public PlaybackMetadata onStore() { + PlaybackMetadata metadata = new PlaybackMetadata(this); + metadata.setValue("TestKey", testValue); + return metadata; + } + + @Override + public void onLoad(PlaybackMetadata metadata) { + testValue = metadata.getValue("TestKey"); + } + + @Override + public void onClear() { + this.testValue = null; + } + + } + MetadataTest testmetadata1 = new MetadataTest(); testmetadata1.testValue = "This is a test"; @@ -130,7 +144,7 @@ void testSerialiseMetadata() { TASmodRegistry.PLAYBACK_METADATA.register(testmetadata2); List actual = new ArrayList<>(); - serialiseMetadata(actual, TASmodRegistry.PLAYBACK_METADATA.handleOnStore()); + serialiseMetadata(actual); List expected = new ArrayList<>(); expected.add("### Test1"); @@ -141,6 +155,33 @@ void testSerialiseMetadata() { assertIterableEquals(expected, actual); assertEquals(0, currentTick); + + TASmodRegistry.PLAYBACK_METADATA.unregister(testmetadata1); + TASmodRegistry.PLAYBACK_METADATA.unregister(testmetadata2); + } + + @Test + void testSerialiseFileCommandNames() { + + class TestFileCommand extends PlaybackFileCommandExtension { + + @Override + public String name() { + return "tasmod_testFileCommand"; + } + } + + TestFileCommand fc = new TestFileCommand(); + TASmodRegistry.PLAYBACK_FILE_COMMAND.register(fc); + TASmodRegistry.PLAYBACK_FILE_COMMAND.setEnabled("tasmod_testFileCommand", true); + + List actual = new ArrayList<>(); + serialiseFileCommandNames(actual); + + List expected = new ArrayList<>(); + expected.add("FileCommand-Extensions: tasmod_testFileCommand"); + + assertIterableEquals(expected, actual); } /** @@ -332,6 +373,71 @@ void testExtractHeaderFail() { */ @Test void testDeserialiseMetadata() { + + class GeneralMetadata implements PlaybackMetadataExtension{ + + PlaybackMetadata metadata = null; + + @Override + public String getExtensionName() { + return "General"; + } + + @Override + public void onCreate() { + } + + @Override + public PlaybackMetadata onStore() { + return null; + } + + @Override + public void onLoad(PlaybackMetadata metadata) { + this.metadata = metadata; + } + + @Override + public void onClear() { + } + + } + + class StartPositionMetadata implements PlaybackMetadataExtension { + + PlaybackMetadata metadata = null; + + @Override + public String getExtensionName() { + return "StartPosition"; + } + + @Override + public void onCreate() { + } + + @Override + public PlaybackMetadata onStore() { + return null; + } + + @Override + public void onLoad(PlaybackMetadata metadata) { + this.metadata = metadata; + } + + @Override + public void onClear() { + } + + } + + GeneralMetadata general = new GeneralMetadata(); + StartPositionMetadata startPosition = new StartPositionMetadata(); + + TASmodRegistry.PLAYBACK_METADATA.register(general); + TASmodRegistry.PLAYBACK_METADATA.register(startPosition); + List lines = new ArrayList<>(); lines.add("### General"); lines.add("Author: Scribble"); @@ -344,14 +450,13 @@ void testDeserialiseMetadata() { lines.add("pitch:4.0"); lines.add("yaw:5.0"); - List actual = deserialiseMetadata(lines); + deserialiseMetadata(lines); - List expected = new ArrayList<>(); LinkedHashMap first = new LinkedHashMap<>(); first.put("Author", "Scribble"); first.put("Title", "77 Buttons"); first.put("Playing Time", "00:00.0"); - expected.add(PlaybackMetadata.fromHashMap("General", first)); + PlaybackMetadata expected = PlaybackMetadata.fromHashMap("General", first); LinkedHashMap second = new LinkedHashMap<>(); second.put("x", "1.0"); @@ -359,11 +464,73 @@ void testDeserialiseMetadata() { second.put("z", "3.0"); second.put("pitch", "4.0"); second.put("yaw", "5.0"); - expected.add(PlaybackMetadata.fromHashMap("StartPosition", second)); + PlaybackMetadata expected2 = PlaybackMetadata.fromHashMap("StartPosition", second); - assertIterableEquals(expected, actual); + assertEquals(expected, general.metadata); + assertEquals(expected2, startPosition.metadata); } + @Test + void testDeserialiseFileCommandNames() { + + class Test1 extends PlaybackFileCommandExtension{ + + @Override + public String name() { + return "tasmod_test1"; + } + + } + + class Test2 extends PlaybackFileCommandExtension { + + @Override + public String name() { + return "tasmod_test2"; + } + + } + + Test1 test1 = new Test1(); + Test2 test2 = new Test2(); + + TASmodRegistry.PLAYBACK_FILE_COMMAND.register(test1); + TASmodRegistry.PLAYBACK_FILE_COMMAND.register(test2); + + List lines = new ArrayList<>(); + lines.add("FileCommand-Extensions: tasmod_test1, tasmod_test2"); + + deserialiseFileCommandNames(lines); + + assertTrue(test1.isEnabled()); + assertTrue(test2.isEnabled()); + + lines = new ArrayList<>(); + lines.add("FileCommand-Extensions: "); + + deserialiseFileCommandNames(lines); + + assertFalse(test1.isEnabled()); + assertFalse(test2.isEnabled()); + + lines = new ArrayList<>(); + lines.add("FileCommand-Extensions: tasmod_test1,tasmod_test2"); + + deserialiseFileCommandNames(lines); + + assertTrue(test1.isEnabled()); + assertTrue(test2.isEnabled()); + + final List lines2 = new ArrayList<>(); + lines2.add("FileCommand-Extensions tasmod_test1,tasmod_test2"); + + Throwable t = assertThrows(PlaybackLoadException.class, ()->{ + deserialiseFileCommandNames(lines2); + }); + + assertEquals("FileCommand-Extensions value was not found in the header", t.getMessage()); + } + /** * Test extracing ticks from some lines */ @@ -381,6 +548,12 @@ void testExtractTick() { lines.add("56|W,LCONTROL;w|;0,887,626|17.85;-202.74799"); lines.add("\t1||RC;0,1580,658|17.85;-202.74799"); lines.add("\t2||;0,1580,658|17.85;-202.74799"); + lines.add("// This is a comment"); + lines.add("// $fileCommand();"); + lines.add(""); + lines.add("57|W,LCONTROL;w|;0,887,626|17.85;-202.74799"); + lines.add("\t1||RC;0,1580,658|17.85;-202.74799\t\t// This is an endline comment"); + lines.add("\t2||;0,1580,658|17.85;-202.74799"); // Fill the actual with lists of the extracted ticks List> actual = new ArrayList<>(); @@ -405,14 +578,24 @@ void testExtractTick() { tick2.add("56|W,LCONTROL;w|;0,887,626|17.85;-202.74799"); tick2.add("\t1||RC;0,1580,658|17.85;-202.74799"); tick2.add("\t2||;0,1580,658|17.85;-202.74799"); + + List tick3 = new ArrayList<>(); + tick3.add("// This is a comment"); + tick3.add("// $fileCommand();"); + tick3.add(""); + tick3.add("57|W,LCONTROL;w|;0,887,626|17.85;-202.74799"); + tick3.add("\t1||RC;0,1580,658|17.85;-202.74799\t\t// This is an endline comment"); + tick3.add("\t2||;0,1580,658|17.85;-202.74799"); expected.add(tick1); expected.add(tick2); + expected.add(tick3); // Fill expectedIndex List expectedIndex = new ArrayList<>(); expectedIndex.add(6L); expectedIndex.add(9L); + expectedIndex.add(15L); // C o m p a r e assertIterableEquals(expected, actual); @@ -564,6 +747,27 @@ void testDeserialiseKeyboard() { assertEquals(expected, actual); } + + @Test + void testDeserialiseKeyboardWithKeyCodes() { + List tick = new ArrayList<>(); + tick.add(";a"); + tick.add("17;w"); + tick.add("17,29;"); + tick.add("17,29,31;s"); + tick.add("17,29,31,500;"); // Test theoretical keycode that doesn't exist + + VirtualKeyboard actual = deserialiseKeyboard(tick); + + VirtualKeyboard expected = new VirtualKeyboard(); + expected.updateFromEvent(VirtualKey.ZERO, false, 'a'); + expected.updateFromEvent(VirtualKey.W, true, 'w'); + expected.updateFromEvent(VirtualKey.LCONTROL, true, Character.MIN_VALUE); + expected.updateFromEvent(VirtualKey.S, true, 's'); + expected.updateFromEvent(500, true, Character.MIN_VALUE); + + assertEquals(expected, actual); + } /** * Test deserialising mouse @@ -583,6 +787,30 @@ void testDeserialiseMouse() { expected.updateFromEvent(VirtualKey.MC, true, 15, 25, 34); assertEquals(expected, actual); + + currentTick=29; + List tick2 = new ArrayList<>(); + tick2.add(";0,0,0"); + tick2.add("LC;0,12,35"); + tick2.add("LC,MC;15,25"); + + Throwable t = assertThrows(PlaybackLoadException.class, ()->{ + deserialiseMouse(tick2); + }); + + assertEquals("Tick 29, Subtick 2: Mouse functions do not have the correct length", t.getMessage()); + + currentTick=30; + List tick3 = new ArrayList<>(); + tick3.add(";0,0,0"); + tick3.add("LC;0,12,35,12"); + tick3.add("LC,MC;15,25,15"); + + Throwable t1 = assertThrows(PlaybackLoadException.class, ()->{ + deserialiseMouse(tick3); + }); + + assertEquals("Tick 30, Subtick 1: Mouse functions do not have the correct length", t1.getMessage()); } /** @@ -642,8 +870,6 @@ void testParseInt() { assertEquals("Tick 13, Subtick 1: Can't parse integer in testParseInt", t.getMessage()); assertEquals(NumberFormatException.class, t.getCause().getClass()); assertEquals("For input string: \"12.1\"", t.getCause().getMessage()); - this.currentTick = 0; - this.currentSubtick = 0; } @Test @@ -660,8 +886,6 @@ void testParseFloat() { assertEquals("Tick 15, Subtick 6: Can't parse float in testParseFloat", t.getMessage()); assertEquals(NumberFormatException.class, t.getCause().getClass()); assertEquals("For input string: \"12.123h\"", t.getCause().getMessage()); - this.currentTick = 0; - this.currentSubtick = 0; } @Test @@ -678,8 +902,6 @@ void testDeserialiseRelativeInt() { deserialiseRelativeInt("testParseRelativeInt", "~12", null); }); assertEquals("Tick 23, Subtick 11: Can't process relative value ~12 in testParseRelativeInt. Previous value for comparing is not available", t.getMessage()); - this.currentTick = 0; - this.currentSubtick = 0; } @Test @@ -696,8 +918,6 @@ void testDeserialiseRelativeFloat() { deserialiseRelativeFloat("testParseRelativeFloat", "~12.3", null); }); assertEquals("Tick 20, Subtick 2: Can't process relative value ~12.3 in testParseRelativeFloat. Previous value for comparing is not available", t.getMessage()); - this.currentTick = 0; - this.currentSubtick = 0; } @Test @@ -772,4 +992,11 @@ private ArrayList convertBigArrayListToArrayList(Big } return out; } + + @Override + protected SerialiserFlavorBase clone() { + return new SerialiserFlavorBaseTest(); + } + + } From 82ed56d9b49c06b8e36dcc3f468b82cdfac5c832 Mon Sep 17 00:00:00 2001 From: Scribble Date: Sat, 15 Jun 2024 22:57:32 +0200 Subject: [PATCH 45/79] [PlaybackSerialiser] Added tests for failing to extract container --- .../tasfile/flavor/SerialiserFlavorBase.java | 57 +++++++++++-------- .../tasfile/SerialiserFlavorBaseTest.java | 52 +++++++++++++++++ 2 files changed, 84 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java index bf2020a0..cc7c0261 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java @@ -413,6 +413,7 @@ public BigArrayList deserialise(BigArrayList lines, long protected enum ExtractPhases { /** * InlineComment phase. + * *
 		 * ---
 		 * // This is a comment
@@ -420,27 +421,28 @@ protected enum ExtractPhases {
 		 * 
 		 * ---
 		 * 
+ * * Empty lines also count as comments */ COMMENTS, /** * Tick phase. Start with a number, then a | character + * *
 		 * ---
 		 * 57|W,LCONTROL;w|;0,887,626|17.85;-202.74799
 		 * ---
 		 * 
+ * * Only one line should be in this phase */ TICK, /** * Subtick phase. Start with a tabulator, then a number, then a | character + * *
-		 * ---
-		 * 	1||RC;0,1580,658|17.85;-202.74799\t\t// This is an endline comment
-		 * 	2||;0,1580,658|17.85;-202.74799
-		 * ---
-		 * Can have multiple subticks
+		 * --- 1||RC;0,1580,658|17.85;-202.74799\t\t// This is an endline comment
+		 * 2||;0,1580,658|17.85;-202.74799 --- Can have multiple subticks
 		 */
 		SUBTICK,
 		/**
@@ -470,31 +472,39 @@ protected enum ExtractPhases {
 	 * 	2||;0,1580,658|17.85;-202.74799
 	 * ---------------------
 	 * 
+ * *

Logic

*
    *
  1. Phase: None *
      *
    1. If a comment is found, set the phase to comment
    2. *
    3. If a tick is found, set the phase to tick
    4. - *
    5. If a subtick is found, throw an error. Subticks always come after ticks
    6. - *
  2. + *
  3. If a subtick is found, throw an error. Subticks always come after + * ticks
  4. + *
+ * *
  • Phase: Comment *
      *
    1. If a tick is found, set the phase to tick
    2. - *
    3. If a subtick is found, throw an error. Subticks always come after ticks
    4. - *
  • + *
  • If a subtick is found, throw an error. Subticks always come after + * ticks
  • + * + * *
  • Phase: Tick *
      *
    1. If a subtick is found, set the phase to subticks
    2. *
    3. If a tick is found, end the extraction
    4. *
    5. If a comment is found, end the extraction
    6. - *
  • + * + * *
  • Phase: Subtick *
      *
    1. If a tick is found, end the extraction
    2. *
    3. If a comment is found, end the extraction
    4. - *
  • - * + * + * + * + * * @param extracted The extracted lines, passed in by reference * @param lines The line list * @param startPos The start position of this tick @@ -513,40 +523,39 @@ protected long extractContainer(List extracted, BigArrayList lin switch (phase) { case NONE: - if (contains(subtickRegex, line)) { // Subtick - throw new PlaybackLoadException(currentTick, currentSubtick, "Error while trying to parse line %s in line %s. This should not be a subtick at this position", line, startPos + counter); + if (contains(subtickRegex, line)) { // Subtick + throw new PlaybackLoadException(currentTick, currentSubtick, "Error while trying to parse the file in line %s. This should not be a subtick at this position", startPos + counter + 1); } - if (contains(commentRegex, line)||line.isEmpty()) { // Comment + if (contains(commentRegex, line) || line.isEmpty()) { // Comment phase = ExtractPhases.COMMENTS; - } - else if (contains(tickRegex, line)) { // Tick + } else if (contains(tickRegex, line)) { // Tick phase = ExtractPhases.TICK; } break; case COMMENTS: - if (contains(subtickRegex, line)) { // Subtick - throw new PlaybackLoadException(currentTick, currentSubtick, "Error while trying to parse line %s in line %s. This should not be a subtick at this position", line, startPos + counter); + if (contains(subtickRegex, line)) { // Subtick + throw new PlaybackLoadException(currentTick, currentSubtick, "Error while trying to parse the file in line %s. This should not be a subtick at this position", startPos + counter + 1); } - if (contains(tickRegex, line)) { + if (contains(tickRegex, line)) { // Tick phase = ExtractPhases.TICK; } break; case TICK: - if (contains(subtickRegex, line)) { + if (contains(subtickRegex, line)) { // Subtick phase = ExtractPhases.SUBTICK; } - if (contains(commentRegex, line) || contains(tickRegex, line) || line.isEmpty()) { + if (contains(commentRegex, line) || contains(tickRegex, line) || line.isEmpty()) { // Comment return startPos + counter - 1; } break; case SUBTICK: - if (contains(commentRegex, line) || contains(tickRegex, line) || line.isEmpty()) { + if (contains(commentRegex, line) || contains(tickRegex, line) || line.isEmpty()) { // Comment return startPos + counter - 1; } break; @@ -804,8 +813,6 @@ protected void splitInputs(List lines, List serialisedKeyboard, if (!tickMatcher.group(3).isEmpty()) { serialisedCameraAngle.add(tickMatcher.group(3)); } - } else { - throw new PlaybackLoadException("Cannot find inputs in line %s", line); } List deserialisedFileCommands = new ArrayList<>(); diff --git a/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java b/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java index c2836a57..72ae7f28 100644 --- a/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java +++ b/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java @@ -601,7 +601,59 @@ void testExtractTick() { assertIterableEquals(expected, actual); assertIterableEquals(expectedIndex, actualIndex); } + + @Test + void testExtractExceptions() { + // Create lines to be extracted from + BigArrayList lines = new BigArrayList<>(); + lines.add("\t1||RC;0,1580,658|17.85;-202.74799"); + lines.add("55|W,LCONTROL;w|;0,887,626|17.85;-202.74799"); + lines.add("\t2||;0,1580,658|17.85;-202.74799"); + + Throwable t = assertThrows(PlaybackLoadException.class, ()->{ + extractContainer(new ArrayList<>(), lines, 0); + }); + + // C o m p a r e + assertEquals("Tick 0, Subtick 0: Error while trying to parse the file in line 1. This should not be a subtick at this position", t.getMessage()); + } + + @Test + void testExtractExceptions2() { + // Create lines to be extracted from + BigArrayList lines = new BigArrayList<>(); + lines.add("// Comment"); + lines.add("\t1||RC;0,1580,658|17.85;-202.74799\t\t// This is an endline comment"); + lines.add("57|W,LCONTROL;w|;0,887,626|17.85;-202.74799"); + lines.add("\t2||;0,1580,658|17.85;-202.74799"); + Throwable t = assertThrows(PlaybackLoadException.class, ()->{ + extractContainer(new ArrayList<>(), lines, 0); + }); + + // C o m p a r e + assertEquals("Tick 0, Subtick 0: Error while trying to parse the file in line 2. This should not be a subtick at this position", t.getMessage()); + } + + @Test + void testExtractExceptions3() { + // Create lines to be extracted from + BigArrayList lines = new BigArrayList<>(); + lines.add("57|W,LCONTROL;w|;0,887,626|17.85;-202.74799"); + lines.add("// Comment"); + lines.add("\t1||RC;0,1580,658|17.85;-202.74799\t\t// This is an endline comment"); + lines.add("\t2||;0,1580,658|17.85;-202.74799"); + + extractContainer(new ArrayList<>(), lines, 0); // First extraction passes as it parses up to the comment. + + Throwable t = assertThrows(PlaybackLoadException.class, ()->{ + extractContainer(new ArrayList<>(), lines, 1); // Second extraction fails as it starts with the comment then, a subtick which is disallowed + }); + + // C o m p a r e + assertEquals("Tick 0, Subtick 0: Error while trying to parse the file in line 3. This should not be a subtick at this position", t.getMessage()); + } + /** * Test deserialising a container a.k.a a tick */ From 144b45fdb7142e2405e0245eb028e31bfddc76a5 Mon Sep 17 00:00:00 2001 From: Scribble Date: Wed, 19 Jun 2024 09:56:44 +0200 Subject: [PATCH 46/79] [PlaybackSerialiser] Added PlaybackSerialiser tests - [VirtualInput] Added documentation for createSubtick --- .../filecommands/PlaybackFileCommand.java | 15 ++++ .../PlaybackFileCommandsRegistry.java | 10 ++- .../tasfile/flavor/SerialiserFlavorBase.java | 13 +-- .../flavor/SerialiserFlavorRegistry.java | 3 +- .../tasmod/virtual/VirtualKeyboard.java | 5 +- .../tasmod/virtual/VirtualMouse.java | 2 +- .../tasmod/virtual/VirtualPeripheral.java | 6 ++ .../tasfile/PlaybackSerialiserTest.java | 83 +++++++++++++++++-- 8 files changed, 113 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java index 7eaa5265..af773a86 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java @@ -62,6 +62,7 @@ public void onEnable() { }; public void onDisable() { + }; public void onRecord(long tick, TickContainer tickContainer) { @@ -129,6 +130,15 @@ public PlaybackFileCommandContainer(List> list) { } } } + + public void add(String key, PlaybackFileCommand fileCommand) { + List toAdd = getOrDefault(key, new ArrayList<>()); + if(toAdd.isEmpty()) { + put(key, toAdd); + } + + toAdd.add(fileCommand); + } public PlaybackFileCommandContainer split(String... keys) { return split(Arrays.asList(keys)); @@ -167,5 +177,10 @@ public List> valuesBySubtick() { return out; } + + @Override + public boolean equals(Object o) { + return super.equals(o); + } } } diff --git a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommandsRegistry.java b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommandsRegistry.java index ecd17338..058a3f2f 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommandsRegistry.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommandsRegistry.java @@ -51,12 +51,14 @@ public void unregister(PlaybackFileCommandExtension extension) { } } - public void setEnabled(String extensionName, boolean enabled) { + public boolean setEnabled(String extensionName, boolean enabled) { PlaybackFileCommandExtension extension = REGISTRY.get(extensionName); - if(extension != null) { - extension.setEnabled(enabled); - enabledExtensions = getEnabled(); + if(extension == null) { + return false; } + extension.setEnabled(enabled); + enabledExtensions = getEnabled(); + return true; } private void disableAll() { diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java index cc7c0261..e2d190ce 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java @@ -399,12 +399,12 @@ public BigArrayList deserialise(BigArrayList lines, long BigArrayList out = new BigArrayList<>(); for (long i = startPos; i < lines.size(); i++) { - List tick = new ArrayList<>(); + List container = new ArrayList<>(); // Extract the tick and set the index - i = extractContainer(tick, lines, i); + i = extractContainer(container, lines, i); currentTick = i; // Extract container - deserialiseContainer(out, tick); + deserialiseContainer(out, container); } previousTickContainer = null; return out; @@ -802,6 +802,8 @@ protected float deserialiseRelativeFloat(String name, String floatstring, Float protected void splitInputs(List lines, List serialisedKeyboard, List serialisedMouse, List serialisedCameraAngle, List commentsAtEnd, List> endlineFileCommands) { for (String line : lines) { + List deserialisedFileCommands = new ArrayList<>(); + Matcher tickMatcher = extract("^\\t?\\d+\\|(.*?)\\|(.*?)\\|(\\S*)\\s?", line); if (tickMatcher.find()) { if (!tickMatcher.group(1).isEmpty()) { @@ -813,11 +815,10 @@ protected void splitInputs(List lines, List serialisedKeyboard, if (!tickMatcher.group(3).isEmpty()) { serialisedCameraAngle.add(tickMatcher.group(3)); } + String endlineComment = line.substring(tickMatcher.group(0).length()); + commentsAtEnd.add(deserialiseEndlineComment(endlineComment, deserialisedFileCommands)); } - List deserialisedFileCommands = new ArrayList<>(); - String endlineComment = line.substring(tickMatcher.group(0).length()); - commentsAtEnd.add(deserialiseEndlineComment(endlineComment, deserialisedFileCommands)); if (deserialisedFileCommands.isEmpty()) deserialisedFileCommands = null; diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorRegistry.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorRegistry.java index 19112df7..e4c95227 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorRegistry.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorRegistry.java @@ -1,5 +1,6 @@ package com.minecrafttas.tasmod.playback.tasfile.flavor; +import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Set; @@ -57,6 +58,6 @@ public SerialiserFlavorBase getFlavor(String name) { } public List getFlavors() { - return (List) REGISTRY.values(); + return new ArrayList<>(REGISTRY.values()); } } diff --git a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualKeyboard.java b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualKeyboard.java index c34c223c..cee04f72 100644 --- a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualKeyboard.java +++ b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualKeyboard.java @@ -177,10 +177,7 @@ public void updateFromState(int[] keycodes, char[] chars) { } } - /** - * Creates a new subtick by {@link #shallowClone()}ing this VirtualKeyboard.
    - * If {@link Subtickable#ignoreFirstUpdate} is true, no new subtick will be created.
    - */ + @Override public void createSubtick() { if(isParent() && !ignoreFirstUpdate()) { addSubtick(shallowClone()); diff --git a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualMouse.java b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualMouse.java index 026e4a32..b0bdb8bd 100644 --- a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualMouse.java +++ b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualMouse.java @@ -146,7 +146,7 @@ public void updateFromState(int[] keycodes, int scrollwheel, int cursorX, int cu this.cursorY = cursorY; } - + @Override public void createSubtick() { if (isParent() && !ignoreFirstUpdate()) { addSubtick(shallowClone()); diff --git a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualPeripheral.java b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualPeripheral.java index 48a307a6..32a90dfc 100644 --- a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualPeripheral.java +++ b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualPeripheral.java @@ -78,6 +78,12 @@ public List getCurrentPresses() { return out; } + /** + * Creates a new subtick by {@link #shallowClone() shallowCloning} this VirtualPeripheral.
    + * If {@link Subtickable#ignoreFirstUpdate} is true, no new subtick will be created.
    + */ + public void createSubtick() {} + @Override public String toString() { return String.join(",", getCurrentPresses()); diff --git a/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java b/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java index bf22b164..07a2cafc 100644 --- a/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java +++ b/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java @@ -9,13 +9,19 @@ import java.io.IOException; import java.io.Serializable; import java.util.ArrayList; +import java.util.List; +import org.apache.commons.io.FileUtils; import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import com.dselent.bigarraylist.BigArrayList; +import com.minecrafttas.tasmod.playback.PlaybackControllerClient.CommentContainer; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickContainer; +import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand; +import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandContainer; import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandExtension; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadataRegistry.PlaybackMetadataExtension; @@ -73,39 +79,53 @@ public void onLoad(PlaybackMetadata metadata) { @Override public void onClear() { - // TODO Auto-generated method stub - } } - private static class TestExtension extends PlaybackFileCommandExtension { + private static class TestFileCommand extends PlaybackFileCommandExtension { + List inline = new ArrayList<>(); + @Override public String name() { - return "tasmod_testExtension"; + return "tasmod_testFileExtension"; } + @Override + public void onDeserialiseInlineComment(long tick, TickContainer container, PlaybackFileCommandContainer fileCommandContainer) { + inline.add(fileCommandContainer); + } + + @Override + public String[] getFileCommandNames() { + return new String[]{"testKey"}; + } } File file = new File("src/test/resources/serialiser/PlaybackSerialiserTest.mctas"); private static TestFlavor testFlavor = new TestFlavor(); private static TestMetadatada testMetadata = new TestMetadatada(); - private static TestExtension testExtension = new TestExtension(); + private static TestFileCommand testFileCommand = new TestFileCommand(); @BeforeAll static void register() { TASmodRegistry.SERIALISER_FLAVOR.register(testFlavor); TASmodRegistry.PLAYBACK_METADATA.register(testMetadata); - TASmodRegistry.PLAYBACK_FILE_COMMAND.register(testExtension); + TASmodRegistry.PLAYBACK_FILE_COMMAND.register(testFileCommand); + } + + @AfterEach + void afterEach() { + testFileCommand.inline.clear(); } @AfterAll static void unregister() { TASmodRegistry.SERIALISER_FLAVOR.unregister(testFlavor); TASmodRegistry.PLAYBACK_METADATA.unregister(testMetadata); - TASmodRegistry.PLAYBACK_FILE_COMMAND.unregister(testExtension); + TASmodRegistry.PLAYBACK_FILE_COMMAND.unregister(testFileCommand); } @Test @@ -113,7 +133,7 @@ void testSerialiser() { BigArrayList expected = new BigArrayList<>(); testMetadata.testValue = "testing"; - TASmodRegistry.PLAYBACK_FILE_COMMAND.setEnabled("tasmod_testExtension", true); + TASmodRegistry.PLAYBACK_FILE_COMMAND.setEnabled("tasmod_testFileExtension", true); // Tick 1 // Keyboard @@ -171,6 +191,53 @@ void testSerialiser() { } } + @Test + void testDeserialiser() throws PlaybackLoadException, IOException { + List lines = new ArrayList<>(); + lines.add("TASFile"); + lines.add("FileCommand-Extensions: tasmod_testFileExtension"); + lines.add("Flavor: Test"); + lines.add("### Test"); + lines.add("TestKey: Wat"); + lines.add("##################################################"); + lines.add("// $testKey(test);"); + lines.add("1|W;w|| // test"); + lines.add("\t1|W,T;t||"); + + File file = new File("src/test/resources/serialiser/PlaybackSerialiserTest2.mctas"); + try { + FileUtils.writeLines(file, lines); + } catch (IOException e) { + e.printStackTrace(); + } + + BigArrayList actual = PlaybackSerialiser2.loadFromFile(file); + + BigArrayList expected = new BigArrayList<>(); + + VirtualKeyboard keyboard = new VirtualKeyboard(); + keyboard.updateFromEvent(VirtualKey.W, true, 'w'); + keyboard.updateFromEvent(VirtualKey.T, true, 't'); + + CommentContainer container = new CommentContainer(); + container.addEndlineComment("test"); + expected.add(new TickContainer(keyboard, new VirtualMouse(), new VirtualCameraAngle(), container)); + + assertBigArrayList(expected, actual); + + assertEquals("Wat", testMetadata.actual); + + List fclist = new ArrayList<>(); + PlaybackFileCommandContainer fccontainer = new PlaybackFileCommandContainer(); + fccontainer.add("testKey", new PlaybackFileCommand("testKey", "test")); + + fclist.add(fccontainer); + + assertIterableEquals(fclist, testFileCommand.inline); + + file.delete(); + } + private void assertBigArrayList(BigArrayList expected, BigArrayList actual) { assertIterableEquals(convertBigArrayListToArrayList(expected), convertBigArrayListToArrayList(actual)); } From 62d85dbaf787c2964ca66a5ea4eabe94bbc452bb Mon Sep 17 00:00:00 2001 From: Scribble Date: Wed, 19 Jun 2024 15:01:22 +0200 Subject: [PATCH 47/79] [PlaybackSerialiser] Fixed "equals" in TickContainer Unsurprisingly, this broke all tests and I'm glad I caught this mistake early - Cleaned up and added some tests --- .../playback/PlaybackControllerClient.java | 13 ++++++++-- .../filecommands/PlaybackFileCommand.java | 21 ++++++++++++--- .../PlaybackFileCommandsRegistry.java | 6 ----- .../playback/tasfile/PlaybackSerialiser2.java | 6 ++--- .../tasfile/flavor/SerialiserFlavorBase.java | 16 +++++++----- .../tasfile/PlaybackSerialiserTest.java | 26 +++++++++++++++---- .../serialiser/PlaybackSerialiserTest2.mctas | 11 ++++++++ 7 files changed, 72 insertions(+), 27 deletions(-) create mode 100644 src/test/resources/serialiser/PlaybackSerialiserTest2.mctas diff --git a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java index d96965cb..445192cf 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java @@ -593,7 +593,7 @@ public static class TickContainer implements Serializable { private CommentContainer comments; public TickContainer(VirtualKeyboard keyboard, VirtualMouse mouse, VirtualCameraAngle subticks) { - this(keyboard, mouse, subticks, null); + this(keyboard, mouse, subticks, new CommentContainer()); } public TickContainer(VirtualKeyboard keyboard, VirtualMouse mouse, VirtualCameraAngle camera, CommentContainer comments) { @@ -639,7 +639,7 @@ public TickContainer clone() { public boolean equals(Object other) { if (other instanceof TickContainer) { TickContainer container = (TickContainer) other; - return keyboard.equals(container.keyboard) || mouse.equals(container.mouse) || cameraAngle.equals(container.cameraAngle); + return keyboard.equals(container.keyboard) && mouse.equals(container.mouse) && cameraAngle.equals(container.cameraAngle) && comments.equals(container.comments); } return super.equals(other); } @@ -707,6 +707,15 @@ public List getInlineComments() { public List getEndlineComments() { return endlineComments; } + + @Override + public boolean equals(Object obj) { + if(obj instanceof CommentContainer) { + CommentContainer other = (CommentContainer) obj; + return inlineComments.equals(other.inlineComments) && endlineComments.equals(other.endlineComments); + } + return super.equals(obj); + } } /** diff --git a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java index af773a86..7f052f76 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java @@ -118,10 +118,12 @@ public PlaybackFileCommandContainer(List> list) { List val = entry.getValue(); boolean valuePresent = false; - for (PlaybackFileCommand command : lists) { - if (key.equals(command.getName())) { - valuePresent = true; - val.add(command); + if(lists!=null) { + for (PlaybackFileCommand command : lists) { + if (key.equals(command.getName())) { + valuePresent = true; + val.add(command); + } } } if (!valuePresent) { @@ -180,6 +182,17 @@ public List> valuesBySubtick() { @Override public boolean equals(Object o) { + if(o instanceof PlaybackFileCommandContainer) { + PlaybackFileCommandContainer other = (PlaybackFileCommandContainer) o; + for (java.util.Map.Entry> entry : other.entrySet()) { + String key = entry.getKey(); + List val = entry.getValue(); + + if(!this.containsKey(key) && !this.get(key).equals(val)) + return false; + } + return true; + } return super.equals(o); } } diff --git a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommandsRegistry.java b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommandsRegistry.java index 058a3f2f..a4778fb9 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommandsRegistry.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommandsRegistry.java @@ -3,7 +3,6 @@ import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; -import java.util.Queue; import com.minecrafttas.mctcommon.registry.AbstractRegistry; import com.minecrafttas.tasmod.TASmod; @@ -122,11 +121,6 @@ public PlaybackFileCommandContainer handleOnSerialiseEndline(long currentTick, T return out; } - @FunctionalInterface - private interface OnSerialise { - Queue accept(PlaybackFileCommandExtension extension, long currentTick, TickContainer container); - } - public void handleOnDeserialiseInline(long currentTick, TickContainer deserialisedContainer, List> inlineFileCommands) { PlaybackFileCommandContainer fileCommandContainer = new PlaybackFileCommandContainer(inlineFileCommands); for (PlaybackFileCommandExtension extension : enabledExtensions) { diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java index 8c2cb3f9..79c5fb8f 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java @@ -61,11 +61,9 @@ public static void saveToFile(File file, BigArrayList container, writerThread.start(); SerialiserFlavorBase flavor = TASmodRegistry.SERIALISER_FLAVOR.getFlavor(flavorname); - - List metadataList = TASmodRegistry.PLAYBACK_METADATA.handleOnStore(); - List filecommandextensionList = TASmodRegistry.PLAYBACK_FILE_COMMAND.getEnabled(); - for (String line : flavor.serialiseHeader(metadataList, filecommandextensionList)) { + List header = flavor.serialiseHeader(); + for (String line : header) { writerThread.addLine(line); } diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java index e2d190ce..112342f4 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java @@ -68,7 +68,7 @@ protected String headerEnd() { ==============================================*/ - public List serialiseHeader(List metadataList, List extensionList) { + public List serialiseHeader() { List out = new ArrayList<>(); out.add(headerStart()); serialiseFlavorName(out); @@ -641,6 +641,7 @@ protected String deserialiseFileCommands(String comment, List lines, List serialisedKeyboard, List serialisedMouse, List serialisedCameraAngle, List commentsAtEnd, List> endlineFileCommands) { for (String line : lines) { - List deserialisedFileCommands = new ArrayList<>(); Matcher tickMatcher = extract("^\\t?\\d+\\|(.*?)\\|(.*?)\\|(\\S*)\\s?", line); if (tickMatcher.find()) { @@ -815,15 +815,19 @@ protected void splitInputs(List lines, List serialisedKeyboard, if (!tickMatcher.group(3).isEmpty()) { serialisedCameraAngle.add(tickMatcher.group(3)); } + + List deserialisedFileCommands = new ArrayList<>(); + String endlineComment = line.substring(tickMatcher.group(0).length()); commentsAtEnd.add(deserialiseEndlineComment(endlineComment, deserialisedFileCommands)); + + if (deserialisedFileCommands.isEmpty()) + deserialisedFileCommands = null; + + endlineFileCommands.add(deserialisedFileCommands); } - if (deserialisedFileCommands.isEmpty()) - deserialisedFileCommands = null; - - endlineFileCommands.add(deserialisedFileCommands); } } diff --git a/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java b/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java index 07a2cafc..e28d9045 100644 --- a/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java +++ b/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java @@ -86,6 +86,7 @@ public void onClear() { private static class TestFileCommand extends PlaybackFileCommandExtension { List inline = new ArrayList<>(); + List endline = new ArrayList<>(); @Override public String name() { @@ -94,12 +95,17 @@ public String name() { @Override public void onDeserialiseInlineComment(long tick, TickContainer container, PlaybackFileCommandContainer fileCommandContainer) { - inline.add(fileCommandContainer); + inline.add(fileCommandContainer.split("testKey")); + } + + @Override + public void onDeserialiseEndlineComment(long tick, TickContainer container, PlaybackFileCommandContainer fileCommandContainer) { + endline.add(fileCommandContainer.split("endlineKey")); } @Override public String[] getFileCommandNames() { - return new String[]{"testKey"}; + return new String[]{"testKey", "endlineKey"}; } } @@ -119,6 +125,7 @@ static void register() { @AfterEach void afterEach() { testFileCommand.inline.clear(); + testFileCommand.endline.clear(); } @AfterAll @@ -200,9 +207,11 @@ void testDeserialiser() throws PlaybackLoadException, IOException { lines.add("### Test"); lines.add("TestKey: Wat"); lines.add("##################################################"); + lines.add("// This is a regular comment"); + lines.add(""); lines.add("// $testKey(test);"); lines.add("1|W;w|| // test"); - lines.add("\t1|W,T;t||"); + lines.add("\t1|W,T;t|| // $testKey(test);$endlineKey();"); File file = new File("src/test/resources/serialiser/PlaybackSerialiserTest2.mctas"); try { @@ -230,11 +239,18 @@ void testDeserialiser() throws PlaybackLoadException, IOException { List fclist = new ArrayList<>(); PlaybackFileCommandContainer fccontainer = new PlaybackFileCommandContainer(); fccontainer.add("testKey", new PlaybackFileCommand("testKey", "test")); - + fclist.add(fccontainer); - assertIterableEquals(fclist, testFileCommand.inline); + List fclistEnd = new ArrayList<>(); + PlaybackFileCommandContainer fccontainerEnd = new PlaybackFileCommandContainer(); + fccontainerEnd.add("endlineKey", null); + fccontainerEnd.add("endlineKey", new PlaybackFileCommand("endlineKey")); + + fclistEnd.add(fccontainerEnd); + assertIterableEquals(fclistEnd, testFileCommand.endline); + file.delete(); } diff --git a/src/test/resources/serialiser/PlaybackSerialiserTest2.mctas b/src/test/resources/serialiser/PlaybackSerialiserTest2.mctas new file mode 100644 index 00000000..466ca0b4 --- /dev/null +++ b/src/test/resources/serialiser/PlaybackSerialiserTest2.mctas @@ -0,0 +1,11 @@ +TASFile +FileCommand-Extensions: tasmod_testFileExtension +Flavor: Test +### Test +TestKey: Wat +################################################## +// This is a regular comment + +// $testKey(test); +1|W;w|| // test + 1|W,T;t|| // $testKey(test);$endlineKey(); From d18ecd15a149bb4ffa5d8cdb83a85fc499fc8ca0 Mon Sep 17 00:00:00 2001 From: Scribble Date: Thu, 20 Jun 2024 23:19:10 +0200 Subject: [PATCH 48/79] [PlaybackSerialiser] Fixed tests - Added pruneList to clear endlineComments which have only null values - [VirtualInput] Fixed equals method in VirtualCameraAngle returning false when pitch or yaw is null --- .../playback/PlaybackControllerClient.java | 6 ++++ .../tasfile/flavor/SerialiserFlavorBase.java | 28 ++++++++++++++----- .../tasmod/virtual/VirtualCameraAngle.java | 13 ++++++++- .../tasfile/PlaybackSerialiserTest.java | 3 ++ .../tasfile/SerialiserFlavorBaseTest.java | 3 +- .../serialiser/PlaybackSerialiserTest2.mctas | 11 -------- 6 files changed, 44 insertions(+), 20 deletions(-) delete mode 100644 src/test/resources/serialiser/PlaybackSerialiserTest2.mctas diff --git a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java index 445192cf..f615ab12 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java @@ -611,6 +611,7 @@ public TickContainer() { @Override public String toString() { + String.join("\n// ", comments.inlineComments); return keyboard.toString() + "|" + mouse.toString() + "|" + cameraAngle.toString(); } @@ -716,6 +717,11 @@ public boolean equals(Object obj) { } return super.equals(obj); } + + @Override + public String toString() { + return inlineComments.toString()+"\n\n"+endlineComments.toString(); + } } /** diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java index 112342f4..c9f9cd56 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java @@ -36,6 +36,8 @@ public abstract class SerialiserFlavorBase { * Debug subtick field for error handling */ protected int currentSubtick = 0; + + protected TickContainer previousTickContainer = null; public abstract String flavorName(); @@ -305,8 +307,6 @@ protected String joinNotEmpty(String delimiter, String... args) { * */ - protected TickContainer previousTickContainer = null; - public boolean deserialiseFlavorName(List headerLines) { for (String line : headerLines) { Matcher matcher = extract("^Flavor: " + flavorName(), line); @@ -340,7 +340,7 @@ public List extractHeader(BigArrayList lines) { throw new PlaybackLoadException("Cannot find the end of the header"); } - public void deserialiseFileCommandNames(List headerLines) { + protected void deserialiseFileCommandNames(List headerLines) { for (String line : headerLines) { Matcher matcher = extract("FileCommand-Extensions: ?(.*)", line); @@ -355,7 +355,7 @@ public void deserialiseFileCommandNames(List headerLines) { throw new PlaybackLoadException("FileCommand-Extensions value was not found in the header"); } - public void deserialiseMetadata(List headerLines) { + protected void deserialiseMetadata(List headerLines) { List out = new ArrayList<>(); String metadataName = null; @@ -582,7 +582,9 @@ protected void deserialiseContainer(BigArrayList out, List> endlineFileCommands = new ArrayList<>(); splitInputs(containerLines, keyboardStrings, mouseStrings, cameraAngleStrings, endlineComments, endlineFileCommands); - + + pruneList(endlineComments); + VirtualKeyboard keyboard = deserialiseKeyboard(keyboardStrings); VirtualMouse mouse = deserialiseMouse(mouseStrings); VirtualCameraAngle cameraAngle = deserialiseCameraAngle(cameraAngleStrings); @@ -826,8 +828,6 @@ protected void splitInputs(List lines, List serialisedKeyboard, endlineFileCommands.add(deserialisedFileCommands); } - - } } @@ -909,6 +909,20 @@ public static void addAll(BigArrayList list, List list.add(element); } } + + /** + * Empties the list if it only consists of null values + * @param The element of the list + * @param list The list to prune + */ + protected void pruneList(List list){ + for(T element : list) { + if(element != null) { + return; + } + } + list.clear(); + } @Override protected abstract SerialiserFlavorBase clone(); diff --git a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualCameraAngle.java b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualCameraAngle.java index b4da10e4..21b709be 100644 --- a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualCameraAngle.java +++ b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualCameraAngle.java @@ -185,7 +185,18 @@ public VirtualCameraAngle clone() { public boolean equals(Object obj) { if (obj instanceof VirtualCameraAngle) { VirtualCameraAngle angle = (VirtualCameraAngle) obj; - return (pitch != null && pitch.equals(angle.pitch)) && (yaw != null && yaw.equals(angle.yaw)); + if(pitch == null && angle.pitch != null) { + return false; + } + if(yaw == null && angle.yaw != null) { + return false; + } + if(pitch != null && !pitch.equals(angle.pitch)) { + return false; + } + if(yaw != null && !yaw.equals(angle.yaw)) + return false; + return true; } return super.equals(obj); } diff --git a/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java b/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java index e28d9045..40477c2d 100644 --- a/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java +++ b/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java @@ -229,7 +229,10 @@ void testDeserialiser() throws PlaybackLoadException, IOException { keyboard.updateFromEvent(VirtualKey.T, true, 't'); CommentContainer container = new CommentContainer(); + container.addInlineComment("This is a regular comment"); + container.addInlineComment(null); container.addEndlineComment("test"); + container.addEndlineComment(null); expected.add(new TickContainer(keyboard, new VirtualMouse(), new VirtualCameraAngle(), container)); assertBigArrayList(expected, actual); diff --git a/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java b/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java index 72ae7f28..537e787e 100644 --- a/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java +++ b/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java @@ -15,6 +15,7 @@ import org.junit.jupiter.api.Test; import com.dselent.bigarraylist.BigArrayList; +import com.minecrafttas.tasmod.playback.PlaybackControllerClient.CommentContainer; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickContainer; import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand; import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandExtension; @@ -681,7 +682,7 @@ void testDeserialiseContainer() { cameraAngle.updateFromState(17.85F, -202.74799F); cameraAngle.updateFromState(11.85F, -2.74799F); cameraAngle.updateFromState(45F, -22.799F); - + expected.add(new TickContainer(keyboard, mouse, cameraAngle)); assertBigArrayList(expected, actual); diff --git a/src/test/resources/serialiser/PlaybackSerialiserTest2.mctas b/src/test/resources/serialiser/PlaybackSerialiserTest2.mctas deleted file mode 100644 index 466ca0b4..00000000 --- a/src/test/resources/serialiser/PlaybackSerialiserTest2.mctas +++ /dev/null @@ -1,11 +0,0 @@ -TASFile -FileCommand-Extensions: tasmod_testFileExtension -Flavor: Test -### Test -TestKey: Wat -################################################## -// This is a regular comment - -// $testKey(test); -1|W;w|| // test - 1|W,T;t|| // $testKey(test);$endlineKey(); From 9ce00b36d5f6f15f905239dd76f96b19877ca081 Mon Sep 17 00:00:00 2001 From: Scribble Date: Sat, 22 Jun 2024 00:11:19 +0200 Subject: [PATCH 49/79] [PlaybackSerialiser] Testing relative TASfile inputs --- .../playback/PlaybackControllerClient.java | 2 +- .../tasfile/flavor/SerialiserFlavorBase.java | 15 +++++----- .../tasfile/PlaybackSerialiserTest.java | 28 ++++++++++++++++++- .../tasfile/SerialiserFlavorBaseTest.java | 1 - .../serialiser/PlaybackSerialiserTest2.mctas | 14 ++++++++++ 5 files changed, 50 insertions(+), 10 deletions(-) create mode 100644 src/test/resources/serialiser/PlaybackSerialiserTest2.mctas diff --git a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java index f615ab12..a97077e6 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java @@ -612,7 +612,7 @@ public TickContainer() { @Override public String toString() { String.join("\n// ", comments.inlineComments); - return keyboard.toString() + "|" + mouse.toString() + "|" + cameraAngle.toString(); + return keyboard.toString() + "|" + mouse.toString() + "|" + cameraAngle.toString() + "\t\t// " + comments.endlineComments; } public VirtualKeyboard getKeyboard() { diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java index c9f9cd56..d8d2554e 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java @@ -583,7 +583,7 @@ protected void deserialiseContainer(BigArrayList out, List cameraAngleStri Float previousYaw = previousTickContainer == null ? null : previousTickContainer.getCameraAngle().getYaw(); for (String line : cameraAngleStrings) { - Matcher matcher = extract("(.+?);(.+)", line); + Matcher matcher = extract("\\|(.+?);(.+)", line); if (matcher.find()) { String cameraPitchString = matcher.group(1); @@ -915,13 +915,14 @@ public static void addAll(BigArrayList list, List * @param The element of the list * @param list The list to prune */ - protected void pruneList(List list){ - for(T element : list) { - if(element != null) { + protected void pruneListEnd(List list){ + List copy = new ArrayList<>(list); + for (int i = copy.size()-1; i >=0; i--) { + T element = copy.get(i); + if(element != null) return; - } + list.remove(list.size()-1); } - list.clear(); } @Override diff --git a/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java b/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java index 40477c2d..3d0740c1 100644 --- a/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java +++ b/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java @@ -212,6 +212,9 @@ void testDeserialiser() throws PlaybackLoadException, IOException { lines.add("// $testKey(test);"); lines.add("1|W;w|| // test"); lines.add("\t1|W,T;t|| // $testKey(test);$endlineKey();"); + lines.add("2|W;w|-101;0,1,1|1;1"); + lines.add("3|;|-101;0,~1,~1|~1;~1"); + lines.add("\t1|;|-101;|;0,~1,~1|~1;~1"); File file = new File("src/test/resources/serialiser/PlaybackSerialiserTest2.mctas"); try { @@ -228,12 +231,35 @@ void testDeserialiser() throws PlaybackLoadException, IOException { keyboard.updateFromEvent(VirtualKey.W, true, 'w'); keyboard.updateFromEvent(VirtualKey.T, true, 't'); + CommentContainer container = new CommentContainer(); container.addInlineComment("This is a regular comment"); container.addInlineComment(null); container.addEndlineComment("test"); - container.addEndlineComment(null); expected.add(new TickContainer(keyboard, new VirtualMouse(), new VirtualCameraAngle(), container)); + + + VirtualKeyboard keyboard2 = new VirtualKeyboard(); + keyboard2.updateFromEvent(VirtualKey.W, true, 'w'); + + VirtualMouse mouse2 = new VirtualMouse(); + mouse2.updateFromEvent(VirtualKey.MOUSEMOVED, false, 0, 1, 1); + + VirtualCameraAngle cameraAngle2 = new VirtualCameraAngle(); + cameraAngle2.set(1f, 1f); + + expected.add(new TickContainer(keyboard2, mouse2, cameraAngle2)); + + + VirtualMouse mouse3 = new VirtualMouse(); + mouse3.updateFromEvent(VirtualKey.MOUSEMOVED, false, 0, 2, 2); + mouse3.updateFromEvent(VirtualKey.MOUSEMOVED, false, 0, 3, 3); + + VirtualCameraAngle cameraAngle3 = new VirtualCameraAngle(); + cameraAngle3.set(2f, 2f); + cameraAngle3.updateFromEvent(3f, 3f); + + expected.add(new TickContainer(null, mouse3, cameraAngle3)); assertBigArrayList(expected, actual); diff --git a/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java b/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java index 537e787e..777e931b 100644 --- a/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java +++ b/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java @@ -15,7 +15,6 @@ import org.junit.jupiter.api.Test; import com.dselent.bigarraylist.BigArrayList; -import com.minecrafttas.tasmod.playback.PlaybackControllerClient.CommentContainer; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickContainer; import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand; import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandExtension; diff --git a/src/test/resources/serialiser/PlaybackSerialiserTest2.mctas b/src/test/resources/serialiser/PlaybackSerialiserTest2.mctas new file mode 100644 index 00000000..cb41fbe9 --- /dev/null +++ b/src/test/resources/serialiser/PlaybackSerialiserTest2.mctas @@ -0,0 +1,14 @@ +TASFile +FileCommand-Extensions: tasmod_testFileExtension +Flavor: Test +### Test +TestKey: Wat +################################################## +// This is a regular comment + +// $testKey(test); +1|W;w|| // test + 1|W,T;t|| // $testKey(test);$endlineKey(); +2|W;w|-101;0,1,1|1;1 +3|;|-101;0,~1,~1|~1;~1 + 1|;|-101;|;0,~1,~1|~1;~1 From 543489f87c2bdc651580fa6da4beab1cb61e93b7 Mon Sep 17 00:00:00 2001 From: Scribble Date: Sun, 23 Jun 2024 16:37:40 +0200 Subject: [PATCH 50/79] [PlaybackSerialiser] Various fixes and improvements - [VirtualInput] Fixed VirtualCameraAngle#updateFromState being able to create subticks with null as pitch and yaw - Fixed flavor registry not creating clones of the flavors when getting a list of flavors - Fixed tests not deleting PlaybackSerialiserTest2.mctas after execution - Fixed tests --- .../playback/tasfile/PlaybackSerialiser2.java | 2 +- .../tasfile/flavor/SerialiserFlavorBase.java | 11 ++++--- .../flavor/integrated/Beta1Flavor.java | 2 +- .../tasmod/virtual/VirtualCameraAngle.java | 4 ++- .../tasfile/PlaybackSerialiserTest.java | 30 ++++++++++++------- .../tasfile/SerialiserFlavorBaseTest.java | 2 +- .../serialiser/PlaybackSerialiserTest2.mctas | 14 --------- 7 files changed, 32 insertions(+), 33 deletions(-) delete mode 100644 src/test/resources/serialiser/PlaybackSerialiserTest2.mctas diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java index 79c5fb8f..15e648f9 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java @@ -186,7 +186,7 @@ public static BigArrayList loadFromFile(File file, SerialiserFlav public static SerialiserFlavorBase searchForFlavor(List lines, List flavorList) { for (SerialiserFlavorBase flavor : flavorList) { if (flavor.deserialiseFlavorName(lines)) { - return flavor; + return flavor.clone(); } } throw new PlaybackLoadException("Couldn't find a flavorname in the file while loading it"); diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java index d8d2554e..0738e3d9 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java @@ -27,6 +27,8 @@ public abstract class SerialiserFlavorBase { + private long currentLine = 0; + /** * The current tick that is being serialised or deserialised */ @@ -39,6 +41,7 @@ public abstract class SerialiserFlavorBase { protected TickContainer previousTickContainer = null; + public abstract String flavorName(); protected String headerStart() { @@ -397,12 +400,12 @@ protected void deserialiseMetadata(List headerLines) { */ public BigArrayList deserialise(BigArrayList lines, long startPos) { BigArrayList out = new BigArrayList<>(); - for (long i = startPos; i < lines.size(); i++) { List container = new ArrayList<>(); // Extract the tick and set the index i = extractContainer(container, lines, i); - currentTick = i; + currentLine = i; + currentTick++; // Extract container deserialiseContainer(out, container); } @@ -711,7 +714,7 @@ protected VirtualCameraAngle deserialiseCameraAngle(List cameraAngleStri Float previousYaw = previousTickContainer == null ? null : previousTickContainer.getCameraAngle().getYaw(); for (String line : cameraAngleStrings) { - Matcher matcher = extract("\\|(.+?);(.+)", line); + Matcher matcher = extract("(.+?);(.+)", line); if (matcher.find()) { String cameraPitchString = matcher.group(1); @@ -926,5 +929,5 @@ protected void pruneListEnd(List list){ } @Override - protected abstract SerialiserFlavorBase clone(); + public abstract SerialiserFlavorBase clone(); } diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/integrated/Beta1Flavor.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/integrated/Beta1Flavor.java index 8bde624d..cb08d7d2 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/integrated/Beta1Flavor.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/integrated/Beta1Flavor.java @@ -31,7 +31,7 @@ protected List serialiseCameraAngle(VirtualCameraAngle cameraAngle) { } @Override - protected SerialiserFlavorBase clone() { + public SerialiserFlavorBase clone() { return new Beta1Flavor(); } } diff --git a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualCameraAngle.java b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualCameraAngle.java index 21b709be..8ef25b4f 100644 --- a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualCameraAngle.java +++ b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualCameraAngle.java @@ -99,7 +99,9 @@ public void updateFromEvent(float pitchDelta, float yawDelta, boolean updateSubt } public void updateFromState(float pitch, float yaw) { - createSubtick(true); + if(this.pitch!=null && this.yaw != null) { + createSubtick(true); + } this.pitch = MathHelper.clamp(pitch, -90F, 90F); this.yaw = yaw; } diff --git a/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java b/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java index 3d0740c1..e31f866b 100644 --- a/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java +++ b/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java @@ -45,7 +45,7 @@ public String flavorName() { @Override - protected SerialiserFlavorBase clone() { + public SerialiserFlavorBase clone() { return new TestFlavor(); } } @@ -109,7 +109,7 @@ public String[] getFileCommandNames() { } } - File file = new File("src/test/resources/serialiser/PlaybackSerialiserTest.mctas"); + File file; private static TestFlavor testFlavor = new TestFlavor(); private static TestMetadatada testMetadata = new TestMetadatada(); @@ -126,6 +126,7 @@ static void register() { void afterEach() { testFileCommand.inline.clear(); testFileCommand.endline.clear(); + file.delete(); } @AfterAll @@ -139,6 +140,8 @@ static void unregister() { void testSerialiser() { BigArrayList expected = new BigArrayList<>(); + file = new File("src/test/resources/serialiser/PlaybackSerialiserTest.mctas"); + testMetadata.testValue = "testing"; TASmodRegistry.PLAYBACK_FILE_COMMAND.setEnabled("tasmod_testFileExtension", true); // Tick 1 @@ -193,8 +196,6 @@ void testSerialiser() { assertEquals("testing", testMetadata.actual); } catch (PlaybackLoadException | IOException e) { fail(e); - } finally { - file.delete(); } } @@ -214,9 +215,9 @@ void testDeserialiser() throws PlaybackLoadException, IOException { lines.add("\t1|W,T;t|| // $testKey(test);$endlineKey();"); lines.add("2|W;w|-101;0,1,1|1;1"); lines.add("3|;|-101;0,~1,~1|~1;~1"); - lines.add("\t1|;|-101;|;0,~1,~1|~1;~1"); + lines.add("\t1|;|-101;0,~1,~1|~1;~1"); - File file = new File("src/test/resources/serialiser/PlaybackSerialiserTest2.mctas"); + file = new File("src/test/resources/serialiser/PlaybackSerialiserTest2.mctas"); try { FileUtils.writeLines(file, lines); } catch (IOException e) { @@ -256,10 +257,9 @@ void testDeserialiser() throws PlaybackLoadException, IOException { mouse3.updateFromEvent(VirtualKey.MOUSEMOVED, false, 0, 3, 3); VirtualCameraAngle cameraAngle3 = new VirtualCameraAngle(); - cameraAngle3.set(2f, 2f); - cameraAngle3.updateFromEvent(3f, 3f); + cameraAngle3.updateFromState(2f, 2f); - expected.add(new TickContainer(null, mouse3, cameraAngle3)); + expected.add(new TickContainer(new VirtualKeyboard(), mouse3, cameraAngle3)); assertBigArrayList(expected, actual); @@ -269,7 +269,12 @@ void testDeserialiser() throws PlaybackLoadException, IOException { PlaybackFileCommandContainer fccontainer = new PlaybackFileCommandContainer(); fccontainer.add("testKey", new PlaybackFileCommand("testKey", "test")); + PlaybackFileCommandContainer fccontainerempty = new PlaybackFileCommandContainer(); + fccontainerempty.put("testKey", null); + fclist.add(fccontainer); + fclist.add(fccontainerempty); + fclist.add(fccontainerempty); assertIterableEquals(fclist, testFileCommand.inline); List fclistEnd = new ArrayList<>(); @@ -277,10 +282,13 @@ void testDeserialiser() throws PlaybackLoadException, IOException { fccontainerEnd.add("endlineKey", null); fccontainerEnd.add("endlineKey", new PlaybackFileCommand("endlineKey")); + PlaybackFileCommandContainer fccontainerEndEmpty = new PlaybackFileCommandContainer(); + fccontainerEndEmpty.put("endlineKey", null); + fclistEnd.add(fccontainerEnd); + fclistEnd.add(fccontainerEndEmpty); + fclistEnd.add(fccontainerEndEmpty); assertIterableEquals(fclistEnd, testFileCommand.endline); - - file.delete(); } private void assertBigArrayList(BigArrayList expected, BigArrayList actual) { diff --git a/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java b/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java index 777e931b..5e430a73 100644 --- a/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java +++ b/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java @@ -1046,7 +1046,7 @@ private ArrayList convertBigArrayListToArrayList(Big } @Override - protected SerialiserFlavorBase clone() { + public SerialiserFlavorBase clone() { return new SerialiserFlavorBaseTest(); } diff --git a/src/test/resources/serialiser/PlaybackSerialiserTest2.mctas b/src/test/resources/serialiser/PlaybackSerialiserTest2.mctas deleted file mode 100644 index cb41fbe9..00000000 --- a/src/test/resources/serialiser/PlaybackSerialiserTest2.mctas +++ /dev/null @@ -1,14 +0,0 @@ -TASFile -FileCommand-Extensions: tasmod_testFileExtension -Flavor: Test -### Test -TestKey: Wat -################################################## -// This is a regular comment - -// $testKey(test); -1|W;w|| // test - 1|W,T;t|| // $testKey(test);$endlineKey(); -2|W;w|-101;0,1,1|1;1 -3|;|-101;0,~1,~1|~1;~1 - 1|;|-101;|;0,~1,~1|~1;~1 From e29d52bcfb82f645b272444be5f5ede10d0b858e Mon Sep 17 00:00:00 2001 From: Scribble Date: Sun, 23 Jun 2024 17:05:56 +0200 Subject: [PATCH 51/79] [PlaybackSerialiser] Added tests for serialiser errors - Added error handling for missing files --- .../playback/tasfile/PlaybackSerialiser2.java | 33 ++++++----------- .../flavor/SerialiserFlavorRegistry.java | 3 +- .../tasfile/PlaybackSerialiserTest.java | 36 ++++++++++++++++++- 3 files changed, 48 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java index 15e648f9..1059deac 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java @@ -86,6 +86,9 @@ public static BigArrayList loadFromFile(File file) throws Playbac if (file == null) { throw new PlaybackLoadException("Load from file failed. No file specified"); } + if(!file.exists()) { + throw new PlaybackLoadException("Trying to load %s but the file doesn't exist", file.getName()); + } // Read file BufferedReader reader = null; @@ -132,6 +135,13 @@ public static BigArrayList loadFromFile(File file, String flavorN } public static BigArrayList loadFromFile(File file, SerialiserFlavorBase flavor) throws PlaybackLoadException, IOException { + if (file == null) { + throw new PlaybackLoadException("Load from file failed. No file specified"); + } + if(!file.exists()) { + throw new PlaybackLoadException("Trying to load %s but the file doesn't exist", file.getName()); + } + // Read file BufferedReader reader = null; @@ -162,33 +172,12 @@ public static BigArrayList loadFromFile(File file, SerialiserFlav return deserialisedContainers; } -// private static List subsetBigArrayList(BigArrayList list, long startIndex, long stopIndex) throws Exception { -// List out = new ArrayList<>(); -// -// if (startIndex < 0) -// throw new Exception("Cannot subset big arraylist. StartIndex has to be positive: " + startIndex); -// -// if (startIndex > stopIndex) -// throw new Exception("Cannot subset big arraylist. StartIndex is bigger than StopIndex:" + startIndex + " " + stopIndex); -// -// if (startIndex >= list.size()) -// throw new Exception("Cannot subset big arraylist. StartIndex is bigger than the big arraylist" + startIndex + " " + list.size()); -// -// if (stopIndex >= list.size()) -// stopIndex = list.size() - 1; -// -// for (long i = startIndex; i < stopIndex; i++) { -// out.add(list.get(i)); -// } -// return out; -// } - public static SerialiserFlavorBase searchForFlavor(List lines, List flavorList) { for (SerialiserFlavorBase flavor : flavorList) { if (flavor.deserialiseFlavorName(lines)) { return flavor.clone(); } } - throw new PlaybackLoadException("Couldn't find a flavorname in the file while loading it"); + throw new PlaybackLoadException("Couldn't find a flavorname in the file. TASmod is missing a flavor-extension or the file is broken"); } } diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorRegistry.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorRegistry.java index e4c95227..56008dbd 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorRegistry.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorRegistry.java @@ -54,7 +54,8 @@ public Set getFlavorNames(){ } public SerialiserFlavorBase getFlavor(String name) { - return REGISTRY.get(name).clone(); + SerialiserFlavorBase out = REGISTRY.get(name); + return out == null ? null : out.clone(); } public List getFlavors() { diff --git a/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java b/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java index e31f866b..6529a3ec 100644 --- a/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java +++ b/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java @@ -2,6 +2,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertIterableEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.fail; import java.io.File; @@ -126,7 +127,9 @@ static void register() { void afterEach() { testFileCommand.inline.clear(); testFileCommand.endline.clear(); - file.delete(); + if(file!=null) { + file.delete(); + } } @AfterAll @@ -291,6 +294,37 @@ void testDeserialiser() throws PlaybackLoadException, IOException { assertIterableEquals(fclistEnd, testFileCommand.endline); } + @Test + void testFlavorNotFound() { + List lines = new ArrayList<>(); + for (int i = 0; i < 500; i++) { + lines.add("Test"); + } + + file = new File("src/test/resources/serialiser/PlaybackSerialiserTest3.mctas"); + try { + FileUtils.writeLines(file, lines); + } catch (IOException e) { + e.printStackTrace(); + } + + Throwable t = assertThrows(PlaybackLoadException.class, ()->{ + PlaybackSerialiser2.loadFromFile(file); + }); + + assertEquals("Couldn't find a flavorname in the file. TASmod is missing a flavor-extension or the file is broken", t.getMessage()); + } + + @Test + void testFlavorIsNull() { + Throwable t = assertThrows(PlaybackLoadException.class, ()->{ + PlaybackSerialiser2.loadFromFile(file, "NotAFlavor"); + }); + + assertEquals("Flavor name NotAFlavor doesn't exist.", t.getMessage()); + + } + private void assertBigArrayList(BigArrayList expected, BigArrayList actual) { assertIterableEquals(convertBigArrayListToArrayList(expected), convertBigArrayListToArrayList(actual)); } From f805a280dc79d322339e5e02e8f047fb47945252 Mon Sep 17 00:00:00 2001 From: Scribble Date: Tue, 25 Jun 2024 20:58:25 +0200 Subject: [PATCH 52/79] [PlaybackSerialiser] Added linecount to PlaybackLoadException --- .../playback/tasfile/PlaybackSerialiser2.java | 2 -- .../exception/PlaybackLoadException.java | 24 +++++++++---------- .../tasfile/flavor/SerialiserFlavorBase.java | 16 ++++++------- .../tasfile/SerialiserFlavorBaseTest.java | 18 +++++++------- 4 files changed, 29 insertions(+), 31 deletions(-) diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java index 1059deac..f0db646b 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java @@ -11,8 +11,6 @@ import com.dselent.bigarraylist.BigArrayList; import com.minecrafttas.tasmod.playback.PlaybackControllerClient; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickContainer; -import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandExtension; -import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata; import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackLoadException; import com.minecrafttas.tasmod.playback.tasfile.flavor.SerialiserFlavorBase; import com.minecrafttas.tasmod.util.FileThread; diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/exception/PlaybackLoadException.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/exception/PlaybackLoadException.java index 12a2fc40..b8086a1a 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/exception/PlaybackLoadException.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/exception/PlaybackLoadException.java @@ -4,48 +4,48 @@ public class PlaybackLoadException extends RuntimeException { - public PlaybackLoadException(long tick, int subtick, String msg) { - this(printTick(tick, subtick)+msg); + public PlaybackLoadException(long line, long tick, int subtick, String msg) { + this(printTick(line, tick, subtick)+msg); } public PlaybackLoadException(String msg) { super(msg); } - public PlaybackLoadException(long tick, int subtick, String msg, Object... args) { - this(printTick(tick, subtick)+msg, args); + public PlaybackLoadException(long line, long tick, int subtick, String msg, Object... args) { + this(printTick(line, tick, subtick)+msg, args); } public PlaybackLoadException(String msg, Object... args) { super(String.format(msg, args)); } - public PlaybackLoadException(long tick, int subtick, Throwable cause) { - this(printTick(tick, subtick), cause); + public PlaybackLoadException(long line, long tick, int subtick, Throwable cause) { + this(printTick(line, tick, subtick), cause); } public PlaybackLoadException(Throwable cause) { super(cause); } - public PlaybackLoadException(long tick, int subtick, Throwable cause, String msg) { - this(cause, printTick(tick, subtick)+msg); + public PlaybackLoadException(long line, long tick, int subtick, Throwable cause, String msg) { + this(cause, printTick(line, tick, subtick)+msg); } public PlaybackLoadException(Throwable cause, String msg) { super(msg, cause, false, false); } - public PlaybackLoadException(long tick, int subtick, Throwable cause, String msg, Object... args) { - this(cause, printTick(tick, subtick)+msg, args); + public PlaybackLoadException(long line, long tick, int subtick, Throwable cause, String msg, Object... args) { + this(cause, printTick(line, tick, subtick)+msg, args); } public PlaybackLoadException(Throwable cause, String msg, Object... args) { this(cause, String.format(msg, args)); } - private static String printTick(long tick, int subtick) { - return String.format("Tick %s, Subtick %s: ", tick, subtick); + private static String printTick(long line, long tick, int subtick) { + return String.format("Line %s, Tick %s, Subtick %s: ", line, tick, subtick); } @Override diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java index 0738e3d9..413c4e91 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java @@ -27,7 +27,7 @@ public abstract class SerialiserFlavorBase { - private long currentLine = 0; + private long currentLine = 1; /** * The current tick that is being serialised or deserialised @@ -527,7 +527,7 @@ protected long extractContainer(List extracted, BigArrayList lin switch (phase) { case NONE: if (contains(subtickRegex, line)) { // Subtick - throw new PlaybackLoadException(currentTick, currentSubtick, "Error while trying to parse the file in line %s. This should not be a subtick at this position", startPos + counter + 1); + throw new PlaybackLoadException(startPos + counter + 1, currentTick, currentSubtick, "Error while trying to parse the file. This should not be a subtick at this position"); } if (contains(commentRegex, line) || line.isEmpty()) { // Comment @@ -539,7 +539,7 @@ protected long extractContainer(List extracted, BigArrayList lin break; case COMMENTS: if (contains(subtickRegex, line)) { // Subtick - throw new PlaybackLoadException(currentTick, currentSubtick, "Error while trying to parse the file in line %s. This should not be a subtick at this position", startPos + counter + 1); + throw new PlaybackLoadException(startPos + counter + 1, currentTick, currentSubtick, "Error while trying to parse the file. This should not be a subtick at this position"); } if (contains(tickRegex, line)) { // Tick @@ -693,7 +693,7 @@ protected VirtualMouse deserialiseMouse(List mouseStrings) { cursorX = deserialiseRelativeInt("cursorX", functions[1], previousCursorX); cursorY = deserialiseRelativeInt("cursorY", functions[2], previousCursorY); } else { - throw new PlaybackLoadException(currentTick, currentSubtick, "Mouse functions do not have the correct length"); + throw new PlaybackLoadException(currentLine, currentTick, currentSubtick, "Mouse functions do not have the correct length"); } out.updateFromState(keycodes, scrollwheel, cursorX, cursorY); @@ -761,7 +761,7 @@ protected int parseInt(String name, String intstring) { try { return Integer.parseInt(intstring); } catch (NumberFormatException e) { - throw new PlaybackLoadException(currentTick, currentSubtick, e, "Can't parse integer in %s", name); + throw new PlaybackLoadException(currentLine, currentTick, currentSubtick, e, "Can't parse integer in %s", name); } } @@ -773,7 +773,7 @@ protected int deserialiseRelativeInt(String name, String intstring, Integer prev if (previous != null) { out = previous + relative; } else { - throw new PlaybackLoadException(currentTick, currentSubtick, "Can't process relative value ~%s in %s. Previous value for comparing is not available", intstring, name); + throw new PlaybackLoadException(currentLine, currentTick, currentSubtick, "Can't process relative value ~%s in %s. Previous value for comparing is not available", intstring, name); } } else { out = parseInt(name, intstring); @@ -785,7 +785,7 @@ protected float parseFloat(String name, String floatstring) { try { return Float.parseFloat(floatstring); } catch (NumberFormatException e) { - throw new PlaybackLoadException(currentTick, currentSubtick, e, "Can't parse float in %s", name); + throw new PlaybackLoadException(currentLine, currentTick, currentSubtick, e, "Can't parse float in %s", name); } } @@ -797,7 +797,7 @@ protected float deserialiseRelativeFloat(String name, String floatstring, Float if (previous != null) { out = previous + relative; } else { - throw new PlaybackLoadException(currentTick, currentSubtick, "Can't process relative value ~%s in %s. Previous value for comparing is not available", floatstring, name); + throw new PlaybackLoadException(currentLine, currentTick, currentSubtick, "Can't process relative value ~%s in %s. Previous value for comparing is not available", floatstring, name); } } else { out = parseFloat(name, floatstring); diff --git a/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java b/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java index 5e430a73..04fdd634 100644 --- a/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java +++ b/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java @@ -615,7 +615,7 @@ void testExtractExceptions() { }); // C o m p a r e - assertEquals("Tick 0, Subtick 0: Error while trying to parse the file in line 1. This should not be a subtick at this position", t.getMessage()); + assertEquals("Line 1, Tick 0, Subtick 0: Error while trying to parse the file. This should not be a subtick at this position", t.getMessage()); } @Test @@ -632,7 +632,7 @@ void testExtractExceptions2() { }); // C o m p a r e - assertEquals("Tick 0, Subtick 0: Error while trying to parse the file in line 2. This should not be a subtick at this position", t.getMessage()); + assertEquals("Line 2, Tick 0, Subtick 0: Error while trying to parse the file. This should not be a subtick at this position", t.getMessage()); } @Test @@ -651,7 +651,7 @@ void testExtractExceptions3() { }); // C o m p a r e - assertEquals("Tick 0, Subtick 0: Error while trying to parse the file in line 3. This should not be a subtick at this position", t.getMessage()); + assertEquals("Line 3, Tick 0, Subtick 0: Error while trying to parse the file. This should not be a subtick at this position", t.getMessage()); } /** @@ -850,7 +850,7 @@ void testDeserialiseMouse() { deserialiseMouse(tick2); }); - assertEquals("Tick 29, Subtick 2: Mouse functions do not have the correct length", t.getMessage()); + assertEquals("Line 1, Tick 29, Subtick 2: Mouse functions do not have the correct length", t.getMessage()); currentTick=30; List tick3 = new ArrayList<>(); @@ -862,7 +862,7 @@ void testDeserialiseMouse() { deserialiseMouse(tick3); }); - assertEquals("Tick 30, Subtick 1: Mouse functions do not have the correct length", t1.getMessage()); + assertEquals("Line 1, Tick 30, Subtick 1: Mouse functions do not have the correct length", t1.getMessage()); } /** @@ -919,7 +919,7 @@ void testParseInt() { parseInt("testParseInt", "12.1"); }); - assertEquals("Tick 13, Subtick 1: Can't parse integer in testParseInt", t.getMessage()); + assertEquals("Line 1, Tick 13, Subtick 1: Can't parse integer in testParseInt", t.getMessage()); assertEquals(NumberFormatException.class, t.getCause().getClass()); assertEquals("For input string: \"12.1\"", t.getCause().getMessage()); } @@ -935,7 +935,7 @@ void testParseFloat() { parseFloat("testParseFloat", "12.123h"); }); - assertEquals("Tick 15, Subtick 6: Can't parse float in testParseFloat", t.getMessage()); + assertEquals("Line 1, Tick 15, Subtick 6: Can't parse float in testParseFloat", t.getMessage()); assertEquals(NumberFormatException.class, t.getCause().getClass()); assertEquals("For input string: \"12.123h\"", t.getCause().getMessage()); } @@ -953,7 +953,7 @@ void testDeserialiseRelativeInt() { Throwable t = assertThrows(PlaybackLoadException.class, ()->{ deserialiseRelativeInt("testParseRelativeInt", "~12", null); }); - assertEquals("Tick 23, Subtick 11: Can't process relative value ~12 in testParseRelativeInt. Previous value for comparing is not available", t.getMessage()); + assertEquals("Line 1, Tick 23, Subtick 11: Can't process relative value ~12 in testParseRelativeInt. Previous value for comparing is not available", t.getMessage()); } @Test @@ -969,7 +969,7 @@ void testDeserialiseRelativeFloat() { Throwable t = assertThrows(PlaybackLoadException.class, ()->{ deserialiseRelativeFloat("testParseRelativeFloat", "~12.3", null); }); - assertEquals("Tick 20, Subtick 2: Can't process relative value ~12.3 in testParseRelativeFloat. Previous value for comparing is not available", t.getMessage()); + assertEquals("Line 1, Tick 20, Subtick 2: Can't process relative value ~12.3 in testParseRelativeFloat. Previous value for comparing is not available", t.getMessage()); } @Test From 1219a220a93be71c633ee8f9573493cb49c2db12 Mon Sep 17 00:00:00 2001 From: Scribble Date: Tue, 25 Jun 2024 22:54:07 +0200 Subject: [PATCH 53/79] [PlaybackSerialiser] Rewrite DesyncMonitor as file command extension - Move DesyncMonitoring to DesyncMonitorFileCommandExtension - Move Monitor to Utils - Remove seed value from DesyncMonitor - Registering new FileCommand in TASmodClient --- .../com/minecrafttas/tasmod/TASmodClient.java | 11 +- .../com/minecrafttas/tasmod/gui/InfoHud.java | 18 +- .../playback/PlaybackControllerClient.java | 4 +- .../filecommands/PlaybackFileCommand.java | 8 +- .../integrated/DesyncMonitorExtension.java | 18 - .../DesyncMonitorFileCommandExtension.java} | 313 +++++++++--------- .../playback/tasfile/PlaybackSerialiser.java | 6 +- .../tasmod/{monitoring => util}/Monitor.java | 2 +- .../tasfile/SerialiserFlavorBaseTest.java | 15 + 9 files changed, 192 insertions(+), 203 deletions(-) delete mode 100644 src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/DesyncMonitorExtension.java rename src/main/java/com/minecrafttas/tasmod/{monitoring/DesyncMonitoring.java => playback/filecommands/integrated/DesyncMonitorFileCommandExtension.java} (51%) rename src/main/java/com/minecrafttas/tasmod/{monitoring => util}/Monitor.java (97%) diff --git a/src/main/java/com/minecrafttas/tasmod/TASmodClient.java b/src/main/java/com/minecrafttas/tasmod/TASmodClient.java index d0334be0..f15ce304 100644 --- a/src/main/java/com/minecrafttas/tasmod/TASmodClient.java +++ b/src/main/java/com/minecrafttas/tasmod/TASmodClient.java @@ -24,6 +24,8 @@ import com.minecrafttas.tasmod.networking.TASmodPackets; import com.minecrafttas.tasmod.playback.PlaybackControllerClient; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TASstate; +import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandExtension; +import com.minecrafttas.tasmod.playback.filecommands.integrated.DesyncMonitorFileCommandExtension; import com.minecrafttas.tasmod.playback.metadata.integrated.CreditsMetadataExtension; import com.minecrafttas.tasmod.playback.metadata.integrated.StartpositionMetadataExtension; import com.minecrafttas.tasmod.playback.tasfile.PlaybackSerialiser; @@ -166,12 +168,13 @@ private void registerEventListeners() { EventListenerRegistry.register(creditsMetadataExtension); EventListenerRegistry.register(startpositionMetadataExtension); } - + @Override public void onClientInit(Minecraft mc) { registerKeybindings(mc); registerPlaybackMetadata(mc); registerSerialiserFlavors(mc); + registerFileCommands(); createTASDir(); createSavestatesDir(); @@ -296,6 +299,12 @@ private void registerSerialiserFlavors(Minecraft mc) { TASmodRegistry.SERIALISER_FLAVOR.register(betaFlavor); } + public static PlaybackFileCommandExtension desyncMonitorFileCommandExtension = new DesyncMonitorFileCommandExtension(); + + private void registerFileCommands() { + TASmodRegistry.PLAYBACK_FILE_COMMAND.register(desyncMonitorFileCommandExtension); + } + private void loadConfig(Minecraft mc) { File configDir = new File(mc.mcDataDir, "config"); if(!configDir.exists()) { diff --git a/src/main/java/com/minecrafttas/tasmod/gui/InfoHud.java b/src/main/java/com/minecrafttas/tasmod/gui/InfoHud.java index 94093181..52809abb 100644 --- a/src/main/java/com/minecrafttas/tasmod/gui/InfoHud.java +++ b/src/main/java/com/minecrafttas/tasmod/gui/InfoHud.java @@ -17,9 +17,9 @@ import com.minecrafttas.tasmod.TASmod; import com.minecrafttas.tasmod.TASmodClient; import com.minecrafttas.tasmod.events.EventClient.EventDrawHotbar; -import com.minecrafttas.tasmod.monitoring.DesyncMonitoring; import com.minecrafttas.tasmod.playback.ControlByteHandler; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TASstate; +import com.minecrafttas.tasmod.playback.filecommands.integrated.DesyncMonitorFileCommandExtension; import com.mojang.realmsclient.gui.ChatFormatting; import net.minecraft.client.Minecraft; @@ -373,7 +373,7 @@ public boolean checkInit() { if (configuration.getProperty(title + "_x", "err").equals("err")) setDefaults(title, y); lists.add(new InfoLabel(title, Integer.parseInt(configuration.getProperty(title + "_x")), Integer.parseInt(configuration.getProperty(title + "_y")), Boolean.parseBoolean(configuration.getProperty(title + "_visible")), Boolean.parseBoolean(configuration.getProperty(title + "_rect")), () -> { if (Minecraft.getMinecraft().currentScreen == this) return "Desync"; - DesyncMonitoring dMonitor=TASmodClient.controller.desyncMonitor; + DesyncMonitorFileCommandExtension dMonitor=TASmodClient.controller.desyncMonitor; return dMonitor.getStatus(Minecraft.getMinecraft().player); })); @@ -382,7 +382,7 @@ public boolean checkInit() { if (configuration.getProperty(title + "_x", "err").equals("err")) setDefaults(title, y); lists.add(new InfoLabel(title, Integer.parseInt(configuration.getProperty(title + "_x")), Integer.parseInt(configuration.getProperty(title + "_y")), Boolean.parseBoolean(configuration.getProperty(title + "_visible")), Boolean.parseBoolean(configuration.getProperty(title + "_rect")), () -> { if (Minecraft.getMinecraft().currentScreen == this) return "Desync Motion"; - DesyncMonitoring dMonitor=TASmodClient.controller.desyncMonitor; + DesyncMonitorFileCommandExtension dMonitor=TASmodClient.controller.desyncMonitor; return dMonitor.getMotion(); })); @@ -391,20 +391,10 @@ public boolean checkInit() { if (configuration.getProperty(title + "_x", "err").equals("err")) setDefaults(title, y); lists.add(new InfoLabel(title, Integer.parseInt(configuration.getProperty(title + "_x")), Integer.parseInt(configuration.getProperty(title + "_y")), Boolean.parseBoolean(configuration.getProperty(title + "_visible")), Boolean.parseBoolean(configuration.getProperty(title + "_rect")), () -> { if (Minecraft.getMinecraft().currentScreen == this) return "Desync Position"; - DesyncMonitoring dMonitor=TASmodClient.controller.desyncMonitor; + DesyncMonitorFileCommandExtension dMonitor=TASmodClient.controller.desyncMonitor; return dMonitor.getPos(); })); - y += 14; - title = "ktrng_desync"; - if (configuration.getProperty(title + "_x", "err").equals("err")) setDefaults(title, y); - lists.add(new InfoLabel(title, Integer.parseInt(configuration.getProperty(title + "_x")), Integer.parseInt(configuration.getProperty(title + "_y")), Boolean.parseBoolean(configuration.getProperty(title + "_visible")), Boolean.parseBoolean(configuration.getProperty(title + "_rect")), () -> { - if (Minecraft.getMinecraft().currentScreen == this) return "Desync KTRNG"; - DesyncMonitoring dMonitor=TASmodClient.controller.desyncMonitor; - return dMonitor.getSeed(); - })); - - y = height - 28; title = "playback_index"; if (configuration.getProperty(title + "_x", "err").equals("err")) setDefaults(title, y, true); diff --git a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java index a97077e6..cc63911f 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java @@ -41,9 +41,9 @@ import com.minecrafttas.tasmod.events.EventPlaybackClient.EventPlaybackJoinedWorld; import com.minecrafttas.tasmod.events.EventPlaybackClient.EventPlaybackTick; import com.minecrafttas.tasmod.events.EventPlaybackClient.EventRecordTick; -import com.minecrafttas.tasmod.monitoring.DesyncMonitoring; import com.minecrafttas.tasmod.networking.TASmodBufferBuilder; import com.minecrafttas.tasmod.networking.TASmodPackets; +import com.minecrafttas.tasmod.playback.filecommands.integrated.DesyncMonitorFileCommandExtension; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata; import com.minecrafttas.tasmod.playback.tasfile.PlaybackSerialiser; import com.minecrafttas.tasmod.playback.tasfile.flavor.SerialiserFlavorBase; @@ -124,7 +124,7 @@ public class PlaybackControllerClient implements ClientPacketHandler, EventClien */ private Map>> controlBytes = new HashMap>>(); // TODO Replace with TASFile extension - public DesyncMonitoring desyncMonitor = new DesyncMonitoring(this); // TODO Replace with TASFile extension + public DesyncMonitorFileCommandExtension desyncMonitor = new DesyncMonitorFileCommandExtension(); // TODO Replace with TASFile extension private long startSeed = TASmod.ktrngHandler.getGlobalSeedClient(); // TODO Replace with Metadata extension diff --git a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java index 7f052f76..20fe19be 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java @@ -54,9 +54,7 @@ public static abstract class PlaybackFileCommandExtension { public abstract String name(); - public String[] getFileCommandNames() { - return new String[] {}; - } + public abstract String[] getFileCommandNames(); public void onEnable() { }; @@ -71,11 +69,11 @@ public void onRecord(long tick, TickContainer tickContainer) { public void onPlayback(long tick, TickContainer tickContainer) { }; - protected PlaybackFileCommandContainer onSerialiseInlineComment(long tick, TickContainer tickContainer) { + public PlaybackFileCommandContainer onSerialiseInlineComment(long tick, TickContainer tickContainer) { return null; } - protected PlaybackFileCommandContainer onSerialiseEndlineComment(long currentTick, TickContainer tickContainer) { + public PlaybackFileCommandContainer onSerialiseEndlineComment(long currentTick, TickContainer tickContainer) { return null; } diff --git a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/DesyncMonitorExtension.java b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/DesyncMonitorExtension.java deleted file mode 100644 index 33b6b3c8..00000000 --- a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/DesyncMonitorExtension.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.minecrafttas.tasmod.playback.filecommands.integrated; - -import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickContainer; -import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandContainer; -import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandExtension; - -public class DesyncMonitorExtension extends PlaybackFileCommandExtension{ - - @Override - public String name() { - return "tasmod_desyncMonitor"; - } - - @Override - public void onDeserialiseEndlineComment(long tick, TickContainer container, PlaybackFileCommandContainer fileCommandContainer) { - super.onDeserialiseEndlineComment(tick, container, fileCommandContainer); - } -} diff --git a/src/main/java/com/minecrafttas/tasmod/monitoring/DesyncMonitoring.java b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/DesyncMonitorFileCommandExtension.java similarity index 51% rename from src/main/java/com/minecrafttas/tasmod/monitoring/DesyncMonitoring.java rename to src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/DesyncMonitorFileCommandExtension.java index 92a2aced..b5c4f80f 100644 --- a/src/main/java/com/minecrafttas/tasmod/monitoring/DesyncMonitoring.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/DesyncMonitorFileCommandExtension.java @@ -1,119 +1,138 @@ -package com.minecrafttas.tasmod.monitoring; +package com.minecrafttas.tasmod.playback.filecommands.integrated; import java.io.File; -import java.io.IOException; import java.io.Serializable; +import java.text.NumberFormat; +import java.text.ParseException; import java.util.List; +import java.util.Locale; import com.dselent.bigarraylist.BigArrayList; import com.minecrafttas.tasmod.TASmod; import com.minecrafttas.tasmod.playback.PlaybackControllerClient; +import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickContainer; +import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand; +import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandContainer; +import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandExtension; +import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackLoadException; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.EntityPlayerSP; import net.minecraft.util.text.TextFormatting; /** - * Stores the players position during recording and compares it with the position during playback + * Stores the players position during recording and compares it with the + * position during playback + * * @author Scribble - * */ -public class DesyncMonitoring { - +public class DesyncMonitorFileCommandExtension extends PlaybackFileCommandExtension { + private File tempDir = new File(Minecraft.getMinecraft().mcDataDir.getAbsolutePath() + File.separator + "saves" + File.separator + "tasfiles" + File.separator + "temp" + File.separator + "monitoring"); - + private BigArrayList container = new BigArrayList(tempDir.toString()); - + private MonitorContainer currentValues; - + private PlaybackControllerClient controller; - - /** - * Creates an empty desync monitor - * @param playbackController - */ - public DesyncMonitoring(PlaybackControllerClient playbackController) { - controller = playbackController; + + @Override + public String name() { + return "tasmod_desyncMonitoring@v1"; } - /** - * Parses lines and fills the desync monitor - * @param playbackController - * @param monitorLines - */ - public DesyncMonitoring(PlaybackControllerClient playbackController, List monitorLines) throws IOException{ - this(playbackController); - container = loadFromFile(monitorLines); + @Override + public String[] getFileCommandNames() { + return new String[] {"desyncMonitoring"}; } - - public void recordNull(int index) { - if(container.size()<=index) { - container.add(new MonitorContainer(index)); - } else { - container.set(index, new MonitorContainer(index)); - } - } - - public void recordMonitor(int index) { + + @Override + public void onRecord(long tick, TickContainer tickContainer) { EntityPlayerSP player = Minecraft.getMinecraft().player; MonitorContainer values = null; - if(player != null) { - values = new MonitorContainer(index, player.posX, player.posY, player.posZ, player.motionX, player.motionY, player.motionZ, TASmod.ktrngHandler.getGlobalSeedClient()); + if (player != null) { + values = new MonitorContainer(tick, player.posX, player.posY, player.posZ, player.motionX, player.motionY, player.motionZ); } else { - values = new MonitorContainer(index, 0D, 0D, 0D, 0D, 0D, 0D, 0L); + values = new MonitorContainer(tick); } - - if(container.size()<=index) { + + if (container.size() <= tick) { container.add(values); } else { - container.set(index, values); + container.set(tick, values); } } - - public void playMonitor(int index) { - currentValues = get(index-1); + + @Override + public PlaybackFileCommandContainer onSerialiseEndlineComment(long currentTick, TickContainer tickContainer) { + PlaybackFileCommandContainer out = new PlaybackFileCommandContainer(); + MonitorContainer monitoredValues = container.get(currentTick); + PlaybackFileCommand command = new PlaybackFileCommand("desyncMonitor", monitoredValues.toStringArray()); + + out.add("desyncMonitor", command); + + return out; } - private BigArrayList loadFromFile(List monitorLines) throws IOException { - BigArrayList out = new BigArrayList(tempDir.toString()); - int linenumber = 0; - for(String line : monitorLines) { - linenumber++; - String[] split = line.split(" "); - double x = 0; - double y = 0; - double z = 0; - double mx = 0; - double my = 0; - double mz = 0; - long seed = 0; - try { - x = Double.parseDouble(split[0]); - y = Double.parseDouble(split[1]); - z = Double.parseDouble(split[2]); - mx = Double.parseDouble(split[3]); - my = Double.parseDouble(split[4]); - mz = Double.parseDouble(split[5]); - seed = Long.parseLong(split[6]); - } catch (Exception e) { - e.printStackTrace(); - throw new IOException("Error in monitoring section in line "+ linenumber + ". Some value is not a number"); - } - out.add(new MonitorContainer(linenumber, x, y, z, mx, my, mz, seed)); + @Override + public void onDeserialiseEndlineComment(long tick, TickContainer container, PlaybackFileCommandContainer fileCommandContainer) { + List commandsEndline = fileCommandContainer.get("desyncMonitor"); + if(commandsEndline == null || commandsEndline.isEmpty()) { + return; } - return out; + + PlaybackFileCommand command = commandsEndline.get(0); + this.container.add(loadFromFile(tick, command.getArgs())); } - - public MonitorContainer get(int index) { + + public void recordNull(int index) { + if (container.size() <= index) { + container.add(new MonitorContainer(index)); + } else { + container.set(index, new MonitorContainer(index)); + } + } + + @Override + public void onPlayback(long tick, TickContainer tickContainer) { + currentValues = get(tick - 1); + } + + private MonitorContainer loadFromFile(long tick, String[] args) throws PlaybackLoadException { + + if (args.length != 6) + throw new PlaybackLoadException("Tick %s: desyncMonitorArgsLength "); + + double x = 0; + double y = 0; + double z = 0; + double mx = 0; + double my = 0; + double mz = 0; try { - return container.get(index); + x = parseDouble(args[0]); + y = parseDouble(args[1]); + z = parseDouble(args[2]); + mx = parseDouble(args[3]); + my = parseDouble(args[4]); + mz = parseDouble(args[5]); + } catch (ParseException e) { + throw new PlaybackLoadException(e); + } + + return new MonitorContainer(tick, x, y, z, mx, my, mz); + } + + public MonitorContainer get(long l) { + try { + return container.get(l); } catch (IndexOutOfBoundsException e) { return null; } } - + private String lastStatus = TextFormatting.GRAY + "Empty"; - + public String getStatus(EntityPlayerSP player) { if (!controller.isNothingPlaying()) { if (currentValues != null) { @@ -132,32 +151,32 @@ public String getStatus(EntityPlayerSP player) { } return lastStatus; } - + private String lastPos = ""; - + public String getPos() { - if(currentValues!=null && !controller.isNothingPlaying()) { + if (currentValues != null && !controller.isNothingPlaying()) { EntityPlayerSP player = Minecraft.getMinecraft().player; String[] values = new String[3]; - values[0]=getFormattedString(player.posX-currentValues.values[0]); - values[1]=getFormattedString(player.posY-currentValues.values[1]); - values[2]=getFormattedString(player.posZ-currentValues.values[2]); - + values[0] = getFormattedString(player.posX - currentValues.values[0]); + values[1] = getFormattedString(player.posY - currentValues.values[1]); + values[2] = getFormattedString(player.posZ - currentValues.values[2]); + String out = ""; for (String val : values) { - if(val !=null) { - out+=val+" "; + if (val != null) { + out += val + " "; } } - lastPos=out; + lastPos = out; } return lastPos; } - + private String lastMotion = ""; - + public String getMotion() { - if(currentValues!=null && !controller.isNothingPlaying()) { + if (currentValues != null && !controller.isNothingPlaying()) { EntityPlayerSP player = Minecraft.getMinecraft().player; String[] values = new String[3]; values[0] = getFormattedString(player.motionX - currentValues.values[3]); @@ -167,59 +186,34 @@ public String getMotion() { String out = ""; for (String val : values) { if (val != null) { - out+=val+" "; + out += val + " "; } } lastMotion = out; } return lastMotion; } - - private String lastSeed = ""; - - public String getSeed() { - if(currentValues!=null && !controller.isNothingPlaying()) { - if(currentValues.seed == TASmod.ktrngHandler.getGlobalSeedClient()) { - lastSeed = ""; - } else { - if(TASmod.ktrngHandler.isLoaded()) { - long distance = 0; //CustomRandom.distance(currentValues.seed, TASmod.ktrngHandler.getGlobalSeedClient()); - if(distance == 0L) { - lastSeed = ""; - } else { - lastSeed = DesyncStatus.SEED.format+Long.toString(distance); - } - } else { - lastSeed = DesyncStatus.SEED.format+"TAS was recorded with KillTheRNG"; - } - } - } - return lastSeed; - } - + private String getFormattedString(double delta) { String out = ""; - if(delta != 0D) { + if (delta != 0D) { DesyncStatus status = DesyncStatus.fromDelta(delta); - if(status == DesyncStatus.EQUAL) { + if (status == DesyncStatus.EQUAL) { return ""; } out = status.getFormat() + Double.toString(delta); } return out; } - - public class MonitorContainer implements Serializable{ + + public class MonitorContainer implements Serializable { private static final long serialVersionUID = -3138791930493647885L; - - int index; + + long index; double[] values = new double[6]; - - long seed; - - - public MonitorContainer(int index, double posx, double posy, double posz, double velx, double vely, double velz, long seed) { + + public MonitorContainer(long index, double posx, double posy, double posz, double velx, double vely, double velz) { this.index = index; this.values[0] = posx; this.values[1] = posy; @@ -227,32 +221,29 @@ public MonitorContainer(int index, double posx, double posy, double posz, double this.values[3] = velx; this.values[4] = vely; this.values[5] = velz; - this.seed = seed; } - public MonitorContainer(int index) { - this(index, 0, 0, 0, 0, 0, 0, 0); + public MonitorContainer(long index) { + this(index, 0, 0, 0, 0, 0, 0); + } + + public String[] toStringArray() { + String[] out = new String[values.length]; + for (int i = 0; i < values.length; i++) { + out[i] = String.format(Locale.ENGLISH, "%.5f", values[i]); + } + return out; } @Override public String toString() { - return String.format("%s %s %s %s %s %s %s", values[0], values[1], values[2], values[3], values[4], values[5], seed); + return String.format(Locale.US, "%d, %d, %d, %d, %d, %d", values[0], values[1], values[2], values[3], values[4], values[5]); } - + public DesyncStatus getSeverity(long index, double[] playerValues, long seed) { - - if(this.seed != seed) { - if(TASmod.ktrngHandler.isLoaded()) { -// if(CustomRandom.distance(this.seed, seed)!=1) { - return DesyncStatus.SEED; -// } - } else { - return DesyncStatus.SEED; - } - } - + DesyncStatus out = null; - + for (int i = 0; i < values.length; i++) { double delta = 0; try { @@ -261,75 +252,79 @@ public DesyncStatus getSeverity(long index, double[] playerValues, long seed) { return DesyncStatus.ERROR; } DesyncStatus status = DesyncStatus.fromDelta(delta); - if(out==null || status.getSeverity() > out.getSeverity()) { + if (out == null || status.getSeverity() > out.getSeverity()) { out = status; } } - + return out; } } - + public enum DesyncStatus { EQUAL(0, TextFormatting.GREEN, "In sync", 0D), WARNING(1, TextFormatting.YELLOW, "Slight desync", 0.00001D), MODERATE(2, TextFormatting.RED, "Moderate desync", 0.01D), TOTAL(3, TextFormatting.DARK_RED, "Total desync"), - SEED(3, TextFormatting.DARK_PURPLE, "RNG Seed desync"), ERROR(3, TextFormatting.DARK_PURPLE, "ERROR"); - + private Double tolerance; private int severity; private String text; private TextFormatting format; - + private DesyncStatus(int severity, TextFormatting color, String text) { this.severity = severity; this.format = color; this.text = text; tolerance = null; } - + private DesyncStatus(int severity, TextFormatting color, String text, double tolerance) { this(severity, color, text); - this.tolerance=tolerance; + this.tolerance = tolerance; } - + public static DesyncStatus fromDelta(double delta) { DesyncStatus out = TOTAL; - for(DesyncStatus status : values()) { - if(status.tolerance == null) { + for (DesyncStatus status : values()) { + if (status.tolerance == null) { return status; } - if(Math.abs(delta)=status.tolerance) { + if (Math.abs(delta) >= status.tolerance) { out = status; } } return out; } - + public TextFormatting getFormat() { return format; } - + public int getSeverity() { return severity; } - + public String getText() { return text; } } + + private double parseDouble(String doublestring) throws ParseException{ + NumberFormat format = NumberFormat.getInstance(Locale.ENGLISH); + Number number = format.parse(doublestring); + return number.doubleValue(); + } public void clear() { - currentValues=null; + currentValues = null; container = new BigArrayList(tempDir.toString()); - lastStatus = TextFormatting.GRAY+"Empty"; + lastStatus = TextFormatting.GRAY + "Empty"; lastPos = ""; lastMotion = ""; - lastSeed = ""; } } diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser.java index 4d2bd141..5725176b 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser.java @@ -2,10 +2,10 @@ import com.dselent.bigarraylist.BigArrayList; import com.minecrafttas.tasmod.TASmod; -import com.minecrafttas.tasmod.monitoring.DesyncMonitoring; import com.minecrafttas.tasmod.playback.ControlByteHandler; import com.minecrafttas.tasmod.playback.PlaybackControllerClient; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickContainer; +import com.minecrafttas.tasmod.playback.filecommands.integrated.DesyncMonitorFileCommandExtension; import com.minecrafttas.tasmod.util.FileThread; import com.minecrafttas.tasmod.util.LoggerMarkers; import com.minecrafttas.tasmod.virtual.VirtualCameraAngle; @@ -29,7 +29,7 @@ *
    * I plan to be backwards compatible so all the save functions have a V1 in their name by the time of writing this
    *
    - * It also serializes the {@linkplain DesyncMonitoring} from the input container
    + * It also serializes the {@linkplain DesyncMonitorFileCommandExtension} from the input container
    *
    * Side: Client * @@ -290,7 +290,7 @@ public PlaybackControllerClient fromEntireFileV1(File file) throws IOException { // controller.setStartLocation(startLocation); // controller.setStartSeed(startSeed); if(!monitorLines.isEmpty()) { - controller.desyncMonitor = new DesyncMonitoring(controller, monitorLines); +// controller.desyncMonitor = new DesyncMonitoringFileCommand(controller, monitorLines); } //If an old monitoring file is loaded, save the file immediately to not loose any data. diff --git a/src/main/java/com/minecrafttas/tasmod/monitoring/Monitor.java b/src/main/java/com/minecrafttas/tasmod/util/Monitor.java similarity index 97% rename from src/main/java/com/minecrafttas/tasmod/monitoring/Monitor.java rename to src/main/java/com/minecrafttas/tasmod/util/Monitor.java index 7e342eb4..86a3a61d 100644 --- a/src/main/java/com/minecrafttas/tasmod/monitoring/Monitor.java +++ b/src/main/java/com/minecrafttas/tasmod/util/Monitor.java @@ -1,4 +1,4 @@ -package com.minecrafttas.tasmod.monitoring; +package com.minecrafttas.tasmod.util; import java.lang.reflect.Field; diff --git a/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java b/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java index 04fdd634..cf25b759 100644 --- a/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java +++ b/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java @@ -169,6 +169,11 @@ class TestFileCommand extends PlaybackFileCommandExtension { public String name() { return "tasmod_testFileCommand"; } + + @Override + public String[] getFileCommandNames() { + return null; + } } TestFileCommand fc = new TestFileCommand(); @@ -479,6 +484,11 @@ class Test1 extends PlaybackFileCommandExtension{ public String name() { return "tasmod_test1"; } + + @Override + public String[] getFileCommandNames() { + return null; + } } @@ -488,6 +498,11 @@ class Test2 extends PlaybackFileCommandExtension { public String name() { return "tasmod_test2"; } + + @Override + public String[] getFileCommandNames() { + return null; + } } From 947a29c7bf842bb7b002cfe8083384ebc027d899 Mon Sep 17 00:00:00 2001 From: Scribble Date: Thu, 27 Jun 2024 20:38:42 +0200 Subject: [PATCH 54/79] [PlaybackSerialiser] Added PlaybackFileCommandLine for better readability --- .../filecommands/PlaybackFileCommand.java | 36 ++++++++++--------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java index 20fe19be..db11f05e 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java @@ -96,7 +96,7 @@ public void setEnabled(boolean enabled) { } } - public static class PlaybackFileCommandContainer extends LinkedHashMap> { + public static class PlaybackFileCommandContainer extends LinkedHashMap { public PlaybackFileCommandContainer() { } @@ -105,18 +105,18 @@ public PlaybackFileCommandContainer(List> list) { for (List lists : list) { if (lists != null) { for (PlaybackFileCommand command : lists) { - this.put(command.getName(), new ArrayList<>()); + this.put(command.getName(), new PlaybackFileCommandLine()); } } } for (List lists : list) { - for (Map.Entry> entry : this.entrySet()) { + for (Map.Entry entry : this.entrySet()) { String key = entry.getKey(); List val = entry.getValue(); boolean valuePresent = false; - if(lists!=null) { + if (lists != null) { for (PlaybackFileCommand command : lists) { if (key.equals(command.getName())) { valuePresent = true; @@ -130,13 +130,13 @@ public PlaybackFileCommandContainer(List> list) { } } } - + public void add(String key, PlaybackFileCommand fileCommand) { - List toAdd = getOrDefault(key, new ArrayList<>()); - if(toAdd.isEmpty()) { + PlaybackFileCommandLine toAdd = getOrDefault(key, new PlaybackFileCommandLine()); + if (toAdd.isEmpty()) { put(key, toAdd); } - + toAdd.add(fileCommand); } @@ -156,7 +156,7 @@ public List> valuesBySubtick() { List> out = new ArrayList<>(); int biggestSize = 0; - for (List list : values()) { + for (PlaybackFileCommandLine list : values()) { if (list.size() > biggestSize) { biggestSize = list.size(); } @@ -164,7 +164,7 @@ public List> valuesBySubtick() { for (int i = 0; i < biggestSize; i++) { List commandListForOneLine = new ArrayList<>(); - for (List list : values()) { + for (PlaybackFileCommandLine list : values()) { if (i < list.size()) { PlaybackFileCommand fc = list.get(i); commandListForOneLine.add(fc); @@ -177,16 +177,16 @@ public List> valuesBySubtick() { return out; } - + @Override public boolean equals(Object o) { - if(o instanceof PlaybackFileCommandContainer) { + if (o instanceof PlaybackFileCommandContainer) { PlaybackFileCommandContainer other = (PlaybackFileCommandContainer) o; - for (java.util.Map.Entry> entry : other.entrySet()) { + for (java.util.Map.Entry entry : other.entrySet()) { String key = entry.getKey(); - List val = entry.getValue(); - - if(!this.containsKey(key) && !this.get(key).equals(val)) + PlaybackFileCommandLine val = entry.getValue(); + + if (!this.containsKey(key) && !this.get(key).equals(val)) return false; } return true; @@ -194,4 +194,8 @@ public boolean equals(Object o) { return super.equals(o); } } + + public static class PlaybackFileCommandLine extends ArrayList { + + } } From 2da7c94f882b5a80b52b0594927e4d5a8fe8bb0e Mon Sep 17 00:00:00 2001 From: Scribble Date: Thu, 27 Jun 2024 20:39:46 +0200 Subject: [PATCH 55/79] [PlaybackSerialiser] Added options and label FileCommands - Option and Label FileCommands replacing Controlbytes - Interpolation can't be turned off so it will not make a return from Controlbytes - Refined FileCommands overall --- .../com/minecrafttas/tasmod/TASmodClient.java | 14 ++- .../tasmod/events/EventPlaybackClient.java | 12 +++ .../com/minecrafttas/tasmod/gui/InfoHud.java | 7 +- .../playback/PlaybackControllerClient.java | 7 +- .../filecommands/PlaybackFileCommand.java | 4 +- .../PlaybackFileCommandsRegistry.java | 9 +- .../DesyncMonitorFileCommandExtension.java | 71 ++++++++++------ .../integrated/LabelFileCommandExtension.java | 66 ++++++++++++++ .../OptionsFileCommandExtension.java | 85 +++++++++++++++++++ .../metadata/PlaybackMetadataRegistry.java | 6 +- 10 files changed, 242 insertions(+), 39 deletions(-) create mode 100644 src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/LabelFileCommandExtension.java create mode 100644 src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/OptionsFileCommandExtension.java diff --git a/src/main/java/com/minecrafttas/tasmod/TASmodClient.java b/src/main/java/com/minecrafttas/tasmod/TASmodClient.java index f15ce304..cf202007 100644 --- a/src/main/java/com/minecrafttas/tasmod/TASmodClient.java +++ b/src/main/java/com/minecrafttas/tasmod/TASmodClient.java @@ -24,8 +24,9 @@ import com.minecrafttas.tasmod.networking.TASmodPackets; import com.minecrafttas.tasmod.playback.PlaybackControllerClient; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TASstate; -import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandExtension; import com.minecrafttas.tasmod.playback.filecommands.integrated.DesyncMonitorFileCommandExtension; +import com.minecrafttas.tasmod.playback.filecommands.integrated.LabelFileCommandExtension; +import com.minecrafttas.tasmod.playback.filecommands.integrated.OptionsFileCommandExtension; import com.minecrafttas.tasmod.playback.metadata.integrated.CreditsMetadataExtension; import com.minecrafttas.tasmod.playback.metadata.integrated.StartpositionMetadataExtension; import com.minecrafttas.tasmod.playback.tasfile.PlaybackSerialiser; @@ -167,6 +168,11 @@ private void registerEventListeners() { EventListenerRegistry.register(controller); EventListenerRegistry.register(creditsMetadataExtension); EventListenerRegistry.register(startpositionMetadataExtension); + + EventListenerRegistry.register(desyncMonitorFileCommandExtension); + + EventListenerRegistry.register(TASmodRegistry.PLAYBACK_METADATA); + EventListenerRegistry.register(TASmodRegistry.PLAYBACK_FILE_COMMAND); } @Override @@ -299,10 +305,14 @@ private void registerSerialiserFlavors(Minecraft mc) { TASmodRegistry.SERIALISER_FLAVOR.register(betaFlavor); } - public static PlaybackFileCommandExtension desyncMonitorFileCommandExtension = new DesyncMonitorFileCommandExtension(); + public static DesyncMonitorFileCommandExtension desyncMonitorFileCommandExtension = new DesyncMonitorFileCommandExtension(); + public static OptionsFileCommandExtension optionsFileCommandExtension = new OptionsFileCommandExtension(); + public static LabelFileCommandExtension labelFileCommandExtension = new LabelFileCommandExtension(); private void registerFileCommands() { TASmodRegistry.PLAYBACK_FILE_COMMAND.register(desyncMonitorFileCommandExtension); + TASmodRegistry.PLAYBACK_FILE_COMMAND.register(optionsFileCommandExtension); + TASmodRegistry.PLAYBACK_FILE_COMMAND.register(labelFileCommandExtension); } private void loadConfig(Minecraft mc) { diff --git a/src/main/java/com/minecrafttas/tasmod/events/EventPlaybackClient.java b/src/main/java/com/minecrafttas/tasmod/events/EventPlaybackClient.java index dca5b577..5452b7c1 100644 --- a/src/main/java/com/minecrafttas/tasmod/events/EventPlaybackClient.java +++ b/src/main/java/com/minecrafttas/tasmod/events/EventPlaybackClient.java @@ -72,4 +72,16 @@ public interface EventPlaybackTick extends EventBase { */ public void onPlaybackTick(long index, TickContainer container); } + + /** + * Fired when a recording is cleared + */ + @FunctionalInterface + public interface EventRecordClear extends EventBase { + + /** + * Fired when a recording is cleared + */ + public void onClear(); + } } diff --git a/src/main/java/com/minecrafttas/tasmod/gui/InfoHud.java b/src/main/java/com/minecrafttas/tasmod/gui/InfoHud.java index 52809abb..f663abda 100644 --- a/src/main/java/com/minecrafttas/tasmod/gui/InfoHud.java +++ b/src/main/java/com/minecrafttas/tasmod/gui/InfoHud.java @@ -423,10 +423,11 @@ public boolean checkInit() { @Override public void onDrawHotbar() { // render custom info box if control byte is set - if (!ControlByteHandler.hideInfoBox && TASmodClient.controller.isPlayingback()) - drawRectWithText(ControlByteHandler.text, 10, 10, true); + String text = TASmodClient.labelFileCommandExtension.getLabelText(); + if (!text.isEmpty() && TASmodClient.controller.isPlayingback()) + drawRectWithText(text, 10, 10, true); // skip rendering of control byte is set - if (!ControlByteHandler.shouldRenderHud && TASmodClient.controller.isPlayingback()) + if (!TASmodClient.optionsFileCommandExtension.shouldRenderHud() && TASmodClient.controller.isPlayingback()) return; int xpos=40; int ypos=190; diff --git a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java index cc63911f..03abd376 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java @@ -37,6 +37,7 @@ import com.minecrafttas.tasmod.events.EventClient.EventVirtualCameraAngleTick; import com.minecrafttas.tasmod.events.EventClient.EventVirtualKeyboardTick; import com.minecrafttas.tasmod.events.EventClient.EventVirtualMouseTick; +import com.minecrafttas.tasmod.events.EventPlaybackClient; import com.minecrafttas.tasmod.events.EventPlaybackClient.EventControllerStateChange; import com.minecrafttas.tasmod.events.EventPlaybackClient.EventPlaybackJoinedWorld; import com.minecrafttas.tasmod.events.EventPlaybackClient.EventPlaybackTick; @@ -49,7 +50,6 @@ import com.minecrafttas.tasmod.playback.tasfile.flavor.SerialiserFlavorBase; import com.minecrafttas.tasmod.util.LoggerMarkers; import com.minecrafttas.tasmod.util.Scheduler.Task; -import com.minecrafttas.tasmod.util.TASmodRegistry; import com.minecrafttas.tasmod.virtual.VirtualCameraAngle; import com.minecrafttas.tasmod.virtual.VirtualInput; import com.minecrafttas.tasmod.virtual.VirtualKeyboard; @@ -530,16 +530,13 @@ public TickContainer get() { public void clear() { LOGGER.debug(LoggerMarkers.Playback, "Clearing playback controller"); + EventListenerRegistry.fireEvent(EventPlaybackClient.EventRecordClear.class); try { inputs.clearMemory(); } catch (IOException e) { e.printStackTrace(); } inputs = new BigArrayList(directory + File.separator + "temp"); - controlBytes.clear(); - index = 0; - desyncMonitor.clear(); - TASmodRegistry.PLAYBACK_METADATA.handleOnClear(); } /** diff --git a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java index db11f05e..39318769 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java @@ -60,7 +60,9 @@ public void onEnable() { }; public void onDisable() { - + }; + + public void onClear() { }; public void onRecord(long tick, TickContainer tickContainer) { diff --git a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommandsRegistry.java b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommandsRegistry.java index a4778fb9..1f7f4fe4 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommandsRegistry.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommandsRegistry.java @@ -11,7 +11,7 @@ import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandContainer; import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandExtension; -public class PlaybackFileCommandsRegistry extends AbstractRegistry implements EventPlaybackClient.EventRecordTick, EventPlaybackClient.EventPlaybackTick { +public class PlaybackFileCommandsRegistry extends AbstractRegistry implements EventPlaybackClient.EventRecordTick, EventPlaybackClient.EventPlaybackTick, EventPlaybackClient.EventRecordClear { private List enabledExtensions = new ArrayList<>(); @@ -137,4 +137,11 @@ public void handleOnDeserialiseEndline(long currentTick, TickContainer deseriali } } + @Override + public void onClear() { + REGISTRY.values().forEach(fc -> { + fc.onClear(); + }); + } + } diff --git a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/DesyncMonitorFileCommandExtension.java b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/DesyncMonitorFileCommandExtension.java index b5c4f80f..f138e430 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/DesyncMonitorFileCommandExtension.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/DesyncMonitorFileCommandExtension.java @@ -1,6 +1,7 @@ package com.minecrafttas.tasmod.playback.filecommands.integrated; import java.io.File; +import java.io.IOException; import java.io.Serializable; import java.text.NumberFormat; import java.text.ParseException; @@ -9,7 +10,9 @@ import com.dselent.bigarraylist.BigArrayList; import com.minecrafttas.tasmod.TASmod; +import com.minecrafttas.tasmod.events.EventPlaybackClient; import com.minecrafttas.tasmod.playback.PlaybackControllerClient; +import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TASstate; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickContainer; import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand; import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandContainer; @@ -26,11 +29,11 @@ * * @author Scribble */ -public class DesyncMonitorFileCommandExtension extends PlaybackFileCommandExtension { +public class DesyncMonitorFileCommandExtension extends PlaybackFileCommandExtension implements EventPlaybackClient.EventControllerStateChange { private File tempDir = new File(Minecraft.getMinecraft().mcDataDir.getAbsolutePath() + File.separator + "saves" + File.separator + "tasfiles" + File.separator + "temp" + File.separator + "monitoring"); - private BigArrayList container = new BigArrayList(tempDir.toString()); + private BigArrayList monitorContainer = new BigArrayList(tempDir.toString()); private MonitorContainer currentValues; @@ -40,10 +43,17 @@ public class DesyncMonitorFileCommandExtension extends PlaybackFileCommandExtens public String name() { return "tasmod_desyncMonitoring@v1"; } - + @Override public String[] getFileCommandNames() { - return new String[] {"desyncMonitoring"}; + return new String[] { "desyncMonitoring" }; + } + + @Override + public void onControllerStateChange(TASstate newstate, TASstate oldstate) { + if(newstate==TASstate.RECORDING && monitorContainer.isEmpty()) { + recordNull(0); + } } @Override @@ -56,40 +66,45 @@ public void onRecord(long tick, TickContainer tickContainer) { values = new MonitorContainer(tick); } - if (container.size() <= tick) { - container.add(values); + if (monitorContainer.size() <= tick) { + monitorContainer.add(values); } else { - container.set(tick, values); + monitorContainer.set(tick, values); } } + @Override + public void onDisable() { + this.onClear(); + } + @Override public PlaybackFileCommandContainer onSerialiseEndlineComment(long currentTick, TickContainer tickContainer) { PlaybackFileCommandContainer out = new PlaybackFileCommandContainer(); - MonitorContainer monitoredValues = container.get(currentTick); + MonitorContainer monitoredValues = monitorContainer.get(currentTick); PlaybackFileCommand command = new PlaybackFileCommand("desyncMonitor", monitoredValues.toStringArray()); - + out.add("desyncMonitor", command); return out; } - + @Override public void onDeserialiseEndlineComment(long tick, TickContainer container, PlaybackFileCommandContainer fileCommandContainer) { List commandsEndline = fileCommandContainer.get("desyncMonitor"); - if(commandsEndline == null || commandsEndline.isEmpty()) { - return; + if (commandsEndline == null || commandsEndline.isEmpty()) { + recordNull(tick); } - + PlaybackFileCommand command = commandsEndline.get(0); - this.container.add(loadFromFile(tick, command.getArgs())); + this.monitorContainer.add(loadFromFile(tick, command.getArgs())); } - public void recordNull(int index) { - if (container.size() <= index) { - container.add(new MonitorContainer(index)); + public void recordNull(long tick) { + if (monitorContainer.size() <= tick) { + monitorContainer.add(new MonitorContainer(tick)); } else { - container.set(index, new MonitorContainer(index)); + monitorContainer.set(tick, new MonitorContainer(tick)); } } @@ -119,13 +134,13 @@ private MonitorContainer loadFromFile(long tick, String[] args) throws PlaybackL } catch (ParseException e) { throw new PlaybackLoadException(e); } - + return new MonitorContainer(tick, x, y, z, mx, my, mz); } public MonitorContainer get(long l) { try { - return container.get(l); + return monitorContainer.get(l); } catch (IndexOutOfBoundsException e) { return null; } @@ -226,7 +241,7 @@ public MonitorContainer(long index, double posx, double posy, double posz, doubl public MonitorContainer(long index) { this(index, 0, 0, 0, 0, 0, 0); } - + public String[] toStringArray() { String[] out = new String[values.length]; for (int i = 0; i < values.length; i++) { @@ -313,16 +328,22 @@ public String getText() { return text; } } - - private double parseDouble(String doublestring) throws ParseException{ + + private double parseDouble(String doublestring) throws ParseException { NumberFormat format = NumberFormat.getInstance(Locale.ENGLISH); Number number = format.parse(doublestring); return number.doubleValue(); } - public void clear() { + @Override + public void onClear() { currentValues = null; - container = new BigArrayList(tempDir.toString()); + try { + monitorContainer.clearMemory(); + } catch (IOException e) { + e.printStackTrace(); + } + monitorContainer = new BigArrayList(tempDir.toString()); lastStatus = TextFormatting.GRAY + "Empty"; lastPos = ""; lastMotion = ""; diff --git a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/LabelFileCommandExtension.java b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/LabelFileCommandExtension.java new file mode 100644 index 00000000..505e54fe --- /dev/null +++ b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/LabelFileCommandExtension.java @@ -0,0 +1,66 @@ +package com.minecrafttas.tasmod.playback.filecommands.integrated; + +import java.io.IOException; + +import com.dselent.bigarraylist.BigArrayList; +import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickContainer; +import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand; +import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandContainer; +import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandExtension; +import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandLine; + +public class LabelFileCommandExtension extends PlaybackFileCommandExtension { + + private String labelText = ""; + + BigArrayList label = new BigArrayList<>(); + + @Override + public String name() { + return "tasmod_label@v1"; + } + + @Override + public String[] getFileCommandNames() { + return new String[] { "label" }; + } + + @Override + public void onDeserialiseInlineComment(long tick, TickContainer container, PlaybackFileCommandContainer fileCommandContainer) { + if (fileCommandContainer.containsKey("label")) { + label.add(fileCommandContainer.split("label")); + } + } + + @Override + public void onPlayback(long tick, TickContainer tickContainer) { + PlaybackFileCommandContainer containerInTick = label.get(tick - 1); + if (containerInTick == null) { + return; + } + + PlaybackFileCommandLine line = containerInTick.get("label"); + if (line == null) { + return; + } + + for (PlaybackFileCommand command : line) { + labelText = String.join(", ", command.getArgs()); + } + } + + @Override + public void onClear() { + try { + label.clearMemory(); + } catch (IOException e) { + e.printStackTrace(); + } + + label = new BigArrayList<>(); + } + + public String getLabelText() { + return labelText; + } +} diff --git a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/OptionsFileCommandExtension.java b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/OptionsFileCommandExtension.java new file mode 100644 index 00000000..ae15b5c3 --- /dev/null +++ b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/OptionsFileCommandExtension.java @@ -0,0 +1,85 @@ +package com.minecrafttas.tasmod.playback.filecommands.integrated; + +import java.io.IOException; + +import com.dselent.bigarraylist.BigArrayList; +import com.minecrafttas.tasmod.TASmod; +import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickContainer; +import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand; +import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandContainer; +import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandExtension; +import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandLine; +import com.minecrafttas.tasmod.util.LoggerMarkers; + +public class OptionsFileCommandExtension extends PlaybackFileCommandExtension { + + private boolean shouldRenderHud = true; + + BigArrayList hud = new BigArrayList<>(); + + @Override + public String name() { + return "tasmod_options@v1"; + } + + @Override + public String[] getFileCommandNames() { + return new String[] { "hud" }; + } + + @Override + public void onDeserialiseInlineComment(long tick, TickContainer container, PlaybackFileCommandContainer fileCommandContainer) { + if (fileCommandContainer.containsKey("hud")) { + hud.add(fileCommandContainer.split("hud")); + } + } + + @Override + public void onPlayback(long tick, TickContainer tickContainer) { + PlaybackFileCommandContainer containerInTick = hud.get(tick-1); + if(containerInTick == null) { + return; + } + + PlaybackFileCommandLine line = containerInTick.get("hud"); + if(line == null) { + return; + } + + for (PlaybackFileCommand command : line) { + String[] args = command.getArgs(); + if (args.length == 1) { + switch (args[0]) { + case "true": + shouldRenderHud = true; + break; + + case "false": + shouldRenderHud = false; + break; + + default: + TASmod.LOGGER.warn(LoggerMarkers.Playback, "FileCommand hud has the wrong argument in tick {}: {} (Must be true or false)", tick, args[0]); + break; + } + } else { + TASmod.LOGGER.warn(LoggerMarkers.Playback, "FileCommand hud has the wrong number of arguments in tick {}: {}", tick, args.length); + } + } + } + + @Override + public void onClear() { + try { + hud.clearMemory(); + } catch (IOException e) { + e.printStackTrace(); + } + + hud = new BigArrayList<>(); + } + + public boolean shouldRenderHud() { + return shouldRenderHud; + } +} diff --git a/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadataRegistry.java b/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadataRegistry.java index 63004ccf..b59805f6 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadataRegistry.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadataRegistry.java @@ -6,6 +6,7 @@ import com.minecrafttas.mctcommon.registry.AbstractRegistry; import com.minecrafttas.tasmod.TASmod; +import com.minecrafttas.tasmod.events.EventPlaybackClient; /** * Registry for registering custom metadata that is stored in the TASFile.
    @@ -17,7 +18,7 @@ * * @author Scribble */ -public class PlaybackMetadataRegistry extends AbstractRegistry{ +public class PlaybackMetadataRegistry extends AbstractRegistry implements EventPlaybackClient.EventRecordClear{ public PlaybackMetadataRegistry() { super(new LinkedHashMap<>()); @@ -80,7 +81,8 @@ public void handleOnLoad(List meta) { } } - public void handleOnClear() { + @Override + public void onClear() { REGISTRY.forEach((key, extension) ->{ extension.onClear(); }); From a2fdbb518684d763d55d8be74f41cf36604a8d59 Mon Sep 17 00:00:00 2001 From: Scribble Date: Fri, 28 Jun 2024 20:42:10 +0200 Subject: [PATCH 56/79] [PlaybackSerialiser] Added implementation to Beta1Flavor - [Commands] Added flavor argument to save and load - [Commands] Added TabCompletionUtils for fetching list of tasfiles and flavors from the client --- .../java/com/minecrafttas/tasmod/TASmod.java | 4 + .../tasmod/commands/CommandFileCommand.java | 5 + .../tasmod/commands/CommandLoadTAS.java | 69 ++++++----- .../tasmod/commands/CommandSaveTAS.java | 76 ++++++------ .../tasmod/commands/TabCompletionUtils.java | 110 ++++++++++++++++++ .../tasmod/networking/TASmodPackets.java | 16 +++ .../DesyncMonitorFileCommandExtension.java | 11 +- .../tasfile/flavor/SerialiserFlavorBase.java | 2 +- .../flavor/integrated/Beta1Flavor.java | 23 +--- 9 files changed, 223 insertions(+), 93 deletions(-) create mode 100644 src/main/java/com/minecrafttas/tasmod/commands/CommandFileCommand.java create mode 100644 src/main/java/com/minecrafttas/tasmod/commands/TabCompletionUtils.java diff --git a/src/main/java/com/minecrafttas/tasmod/TASmod.java b/src/main/java/com/minecrafttas/tasmod/TASmod.java index cf503604..8891d4a5 100644 --- a/src/main/java/com/minecrafttas/tasmod/TASmod.java +++ b/src/main/java/com/minecrafttas/tasmod/TASmod.java @@ -24,6 +24,7 @@ import com.minecrafttas.tasmod.commands.CommandSaveTAS; import com.minecrafttas.tasmod.commands.CommandSavestate; import com.minecrafttas.tasmod.commands.CommandTickrate; +import com.minecrafttas.tasmod.commands.TabCompletionUtils; import com.minecrafttas.tasmod.ktrng.KillTheRNGHandler; import com.minecrafttas.tasmod.networking.TASmodPackets; import com.minecrafttas.tasmod.playback.PlaybackControllerServer; @@ -71,6 +72,8 @@ public class TASmod implements ModInitializer, EventServerInit, EventServerStop{ public static final StartpositionMetadataExtension startPositionMetadataExtension = new StartpositionMetadataExtension(); + public static final TabCompletionUtils tabCompletionUtils = new TabCompletionUtils(); + @Override public void onInitialize() { @@ -100,6 +103,7 @@ public void onInitialize() { PacketHandlerRegistry.register(ktrngHandler); PacketHandlerRegistry.register(playbackControllerServer); PacketHandlerRegistry.register(startPositionMetadataExtension); + PacketHandlerRegistry.register(tabCompletionUtils); } @Override diff --git a/src/main/java/com/minecrafttas/tasmod/commands/CommandFileCommand.java b/src/main/java/com/minecrafttas/tasmod/commands/CommandFileCommand.java new file mode 100644 index 00000000..3d519eae --- /dev/null +++ b/src/main/java/com/minecrafttas/tasmod/commands/CommandFileCommand.java @@ -0,0 +1,5 @@ +package com.minecrafttas.tasmod.commands; + +public class CommandFileCommand { + +} diff --git a/src/main/java/com/minecrafttas/tasmod/commands/CommandLoadTAS.java b/src/main/java/com/minecrafttas/tasmod/commands/CommandLoadTAS.java index 0e2ef1d2..b74fce95 100644 --- a/src/main/java/com/minecrafttas/tasmod/commands/CommandLoadTAS.java +++ b/src/main/java/com/minecrafttas/tasmod/commands/CommandLoadTAS.java @@ -1,15 +1,12 @@ package com.minecrafttas.tasmod.commands; -import java.io.File; -import java.io.FileFilter; -import java.util.ArrayList; import java.util.List; +import java.util.concurrent.TimeoutException; import com.minecrafttas.tasmod.TASmod; import com.minecrafttas.tasmod.networking.TASmodBufferBuilder; import com.minecrafttas.tasmod.networking.TASmodPackets; -import net.minecraft.client.Minecraft; import net.minecraft.command.CommandBase; import net.minecraft.command.CommandException; import net.minecraft.command.ICommandSender; @@ -28,7 +25,7 @@ public String getName() { @Override public String getUsage(ICommandSender sender) { - return "/load "; + return "/load [flavor]"; } @Override @@ -38,17 +35,18 @@ public void execute(MinecraftServer server, ICommandSender sender, String[] args if (sender.canUseCommand(2, "load")) { if (args.length < 1) { sender.sendMessage(new TextComponentString(TextFormatting.RED + "Please add a filename, " + getUsage(sender))); - } else { - String name = ""; - String spacer = " "; - for (int i = 0; i < args.length; i++) { - if (i == args.length - 1) { - spacer=""; - } - name=name.concat(args[i]+spacer); + } else if(args.length == 1) { + String filename = args[0]; + try { + TASmod.server.sendToAll(new TASmodBufferBuilder(TASmodPackets.PLAYBACK_LOAD).writeString(filename).writeString("")); + } catch (Exception e) { + e.printStackTrace(); } + } else if (args.length == 2) { + String filename = args[0]; + String flavorname = args[1]; try { - TASmod.server.sendToAll(new TASmodBufferBuilder(TASmodPackets.PLAYBACK_LOAD).writeString(name)); + TASmod.server.sendToAll(new TASmodBufferBuilder(TASmodPackets.PLAYBACK_LOAD).writeString(filename).writeString(flavorname)); } catch (Exception e) { e.printStackTrace(); } @@ -63,28 +61,39 @@ public void execute(MinecraftServer server, ICommandSender sender, String[] args public List getTabCompletions(MinecraftServer server, ICommandSender sender, String[] args, BlockPos targetPos) { List tab; if (args.length == 1) { - tab = getFilenames(); + try { + tab = TASmod.tabCompletionUtils.getTASFileList(getCommandSenderAsPlayer(sender).getName()); + } catch (TimeoutException e) { + sender.sendMessage(new TextComponentString(TextFormatting.RED + "Failed to fetch the file list after 2 seconds, something went wrong")); + TASmod.LOGGER.catching(e); + return super.getTabCompletions(server, sender, args, targetPos); + } catch (Exception e) { + sender.sendMessage(new TextComponentString(TextFormatting.RED + "Something went wrong with Tab Completions")); + TASmod.LOGGER.catching(e); + return super.getTabCompletions(server, sender, args, targetPos); + } + if (tab.isEmpty()) { sender.sendMessage(new TextComponentString(TextFormatting.RED + "No files in directory")); return super.getTabCompletions(server, sender, args, targetPos); } return getListOfStringsMatchingLastWord(args, tab); + + } else if (args.length == 2) { + try { + tab = TASmod.tabCompletionUtils.getFlavorList(getCommandSenderAsPlayer(sender).getName()); + } catch (TimeoutException e) { + sender.sendMessage(new TextComponentString(TextFormatting.RED + "Failed to fetch the flavor list after 2 seconds, something went wrong")); + TASmod.LOGGER.catching(e); + return super.getTabCompletions(server, sender, args, targetPos); + } catch (Exception e) { + sender.sendMessage(new TextComponentString(TextFormatting.RED + "Something went wrong with Tab Completions")); + TASmod.LOGGER.catching(e); + return super.getTabCompletions(server, sender, args, targetPos); + } + return getListOfStringsMatchingLastWord(args, tab); + } else return super.getTabCompletions(server, sender, args, targetPos); } - - public List getFilenames() { - List tab = new ArrayList(); - File folder = new File(Minecraft.getMinecraft().mcDataDir, "saves" + File.separator + "tasfiles"); - File[] listOfFiles = folder.listFiles(new FileFilter() { - @Override - public boolean accept(File pathname) { - return pathname.getName().endsWith(".mctas"); - } - }); - for (int i = 0; i < listOfFiles.length; i++) { - tab.add(listOfFiles[i].getName().replaceAll("\\.mctas", "")); - } - return tab; - } } diff --git a/src/main/java/com/minecrafttas/tasmod/commands/CommandSaveTAS.java b/src/main/java/com/minecrafttas/tasmod/commands/CommandSaveTAS.java index 93063f98..0b27eaec 100644 --- a/src/main/java/com/minecrafttas/tasmod/commands/CommandSaveTAS.java +++ b/src/main/java/com/minecrafttas/tasmod/commands/CommandSaveTAS.java @@ -1,16 +1,13 @@ package com.minecrafttas.tasmod.commands; -import java.io.File; -import java.io.FileFilter; -import java.util.ArrayList; import java.util.List; +import java.util.concurrent.TimeoutException; import com.google.common.collect.ImmutableList; import com.minecrafttas.tasmod.TASmod; import com.minecrafttas.tasmod.networking.TASmodBufferBuilder; import com.minecrafttas.tasmod.networking.TASmodPackets; -import net.minecraft.client.Minecraft; import net.minecraft.command.CommandBase; import net.minecraft.command.CommandException; import net.minecraft.command.ICommandSender; @@ -31,7 +28,7 @@ public String getName() { @Override public String getUsage(ICommandSender sender) { - return "/save "; + return "/save [flavor]"; } @Override @@ -41,22 +38,23 @@ public List getAliases() { @Override public void execute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException { - sender.sendMessage(new TextComponentString(TextFormatting.RED + "This feature does not work at the moment!")); + if (sender instanceof EntityPlayer) { if (sender.canUseCommand(2, "save")) { if (args.length < 1) { - sender.sendMessage(new TextComponentString(TextFormatting.RED + "Please add a filename, " + getUsage(sender))); - } else { - String name = ""; - String spacer = " "; - for (int i = 0; i < args.length; i++) { - if (i == args.length - 1) { - spacer = ""; - } - name = name.concat(args[i] + spacer); + sender.sendMessage(new TextComponentString(TextFormatting.RED + "Command must contain a filename " + getUsage(sender))); + } else if (args.length == 1) { + String filename = args[0]; + try { + TASmod.server.sendToAll(new TASmodBufferBuilder(TASmodPackets.PLAYBACK_SAVE).writeString(filename).writeString("")); + } catch (Exception e) { + e.printStackTrace(); } + } else if (args.length == 2) { + String filename = args[0]; + String flavorname = args[1]; try { - TASmod.server.sendToAll(new TASmodBufferBuilder(TASmodPackets.PLAYBACK_SAVE).writeString(name)); + TASmod.server.sendToAll(new TASmodBufferBuilder(TASmodPackets.PLAYBACK_SAVE).writeString(filename).writeString(flavorname)); } catch (Exception e) { e.printStackTrace(); } @@ -69,38 +67,48 @@ public void execute(MinecraftServer server, ICommandSender sender, String[] args @Override public List getTabCompletions(MinecraftServer server, ICommandSender sender, String[] args, BlockPos targetPos) { - List tab; + List tab = null; if (args.length == 1) { if (!check) { sender.sendMessage(new TextComponentString(TextFormatting.BOLD + "" + TextFormatting.RED + "WARNING!" + TextFormatting.RESET + TextFormatting.RED + " Existing filenames will be overwritten! /fail to abort the recording if you accidentally started one")); check = true; } - tab = getFilenames(); + try { + tab = TASmod.tabCompletionUtils.getTASFileList(getCommandSenderAsPlayer(sender).getName()); + } catch (TimeoutException e) { + sender.sendMessage(new TextComponentString(TextFormatting.RED + "Failed to fetch the file list after 2 seconds, something went wrong")); + TASmod.LOGGER.catching(e); + return super.getTabCompletions(server, sender, args, targetPos); + } catch (Exception e) { + sender.sendMessage(new TextComponentString(TextFormatting.RED + "Something went wrong with Tab Completions")); + TASmod.LOGGER.catching(e); + return super.getTabCompletions(server, sender, args, targetPos); + } + if (tab.isEmpty()) { sender.sendMessage(new TextComponentString(TextFormatting.RED + "No files in directory")); return super.getTabCompletions(server, sender, args, targetPos); } return getListOfStringsMatchingLastWord(args, tab); + + } else if (args.length == 2) { + try { + tab = TASmod.tabCompletionUtils.getFlavorList(getCommandSenderAsPlayer(sender).getName()); + } catch (TimeoutException e) { + sender.sendMessage(new TextComponentString(TextFormatting.RED + "Failed to fetch the flavor list after 2 seconds, something went wrong")); + TASmod.LOGGER.catching(e); + return super.getTabCompletions(server, sender, args, targetPos); + } catch (Exception e) { + sender.sendMessage(new TextComponentString(TextFormatting.RED + "Something went wrong with Tab Completions")); + TASmod.LOGGER.catching(e); + return super.getTabCompletions(server, sender, args, targetPos); + } + return getListOfStringsMatchingLastWord(args, tab); + } else return super.getTabCompletions(server, sender, args, targetPos); } - public List getFilenames() { - List tab = new ArrayList(); - File folder = new File(Minecraft.getMinecraft().mcDataDir, "saves" + File.separator + "tasfiles"); - - File[] listOfFiles = folder.listFiles(new FileFilter() { - @Override - public boolean accept(File pathname) { - return pathname.getName().endsWith(".mctas"); - } - }); - for (int i = 0; i < listOfFiles.length; i++) { - tab.add(listOfFiles[i].getName().replaceAll("\\.mctas", "")); - } - return tab; - } - @Override public int getRequiredPermissionLevel() { return 2; diff --git a/src/main/java/com/minecrafttas/tasmod/commands/TabCompletionUtils.java b/src/main/java/com/minecrafttas/tasmod/commands/TabCompletionUtils.java new file mode 100644 index 00000000..f6540d50 --- /dev/null +++ b/src/main/java/com/minecrafttas/tasmod/commands/TabCompletionUtils.java @@ -0,0 +1,110 @@ +package com.minecrafttas.tasmod.commands; + +import java.io.File; +import java.io.FileFilter; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +import com.minecrafttas.mctcommon.server.exception.PacketNotImplementedException; +import com.minecrafttas.mctcommon.server.exception.WrongSideException; +import com.minecrafttas.mctcommon.server.interfaces.ClientPacketHandler; +import com.minecrafttas.mctcommon.server.interfaces.PacketID; +import static com.minecrafttas.tasmod.networking.TASmodPackets.*; +import com.minecrafttas.mctcommon.server.interfaces.ServerPacketHandler; +import com.minecrafttas.tasmod.TASmod; +import com.minecrafttas.tasmod.TASmodClient; +import com.minecrafttas.tasmod.networking.TASmodBufferBuilder; +import com.minecrafttas.tasmod.networking.TASmodPackets; +import com.minecrafttas.tasmod.util.TASmodRegistry; + +import net.minecraft.client.Minecraft; + +public class TabCompletionUtils implements ServerPacketHandler, ClientPacketHandler{ + + private volatile CompletableFuture> fileList = null; + private volatile CompletableFuture> flavorList = null; + + @Override + public PacketID[] getAcceptedPacketIDs() { + return new PacketID[] { COMMAND_TASFILELIST, COMMAND_FLAVORLIST }; + } + + //======== SERVER SIDE + + @Override + public void onServerPacket(PacketID id, ByteBuffer buf, String username) throws PacketNotImplementedException, WrongSideException, Exception { + TASmodPackets packet = (TASmodPackets) id; + switch (packet) { + case COMMAND_TASFILELIST: + String filenames = TASmodBufferBuilder.readString(buf); + fileList.complete(Arrays.asList(filenames.split("/"))); + break; + case COMMAND_FLAVORLIST: + String flavornames = TASmodBufferBuilder.readString(buf); + flavorList.complete(Arrays.asList(flavornames.split("/"))); + default: + break; + } + } + + public List getTASFileList(String playername) throws InterruptedException, ExecutionException, TimeoutException { + fileList = new CompletableFuture<>(); + try { + TASmod.server.sendTo(playername, new TASmodBufferBuilder(COMMAND_TASFILELIST)); + } catch (Exception e) { + e.printStackTrace(); + } + return fileList.get(2,TimeUnit.SECONDS); + } + + public List getFlavorList(String playername) throws InterruptedException, ExecutionException, TimeoutException { + flavorList = new CompletableFuture<>(); + try { + TASmod.server.sendTo(playername, new TASmodBufferBuilder(COMMAND_FLAVORLIST)); + } catch (Exception e) { + e.printStackTrace(); + } + return flavorList.get(2,TimeUnit.SECONDS); + } + + //======== CLIENT SIDE + + @Override + public void onClientPacket(PacketID id, ByteBuffer buf, String username) throws PacketNotImplementedException, WrongSideException, Exception { + TASmodPackets packet = (TASmodPackets) id; + switch (packet) { + case COMMAND_TASFILELIST: + String filenames = String.join("/", getFilenames()); + TASmodClient.client.send(new TASmodBufferBuilder(COMMAND_TASFILELIST).writeString(filenames)); + break; + + case COMMAND_FLAVORLIST: + String flavornames = String.join("/", TASmodRegistry.SERIALISER_FLAVOR.getFlavorNames()); + TASmodClient.client.send(new TASmodBufferBuilder(COMMAND_FLAVORLIST).writeString(flavornames)); + default: + break; + } + } + + private List getFilenames() { + List tab = new ArrayList(); + File folder = new File(Minecraft.getMinecraft().mcDataDir, "saves" + File.separator + "tasfiles"); + + File[] listOfFiles = folder.listFiles(new FileFilter() { + @Override + public boolean accept(File pathname) { + return pathname.getName().endsWith(".mctas"); + } + }); + for (int i = 0; i < listOfFiles.length; i++) { + tab.add(listOfFiles[i].getName().replaceAll("\\.mctas", "")); + } + return tab; + } +} diff --git a/src/main/java/com/minecrafttas/tasmod/networking/TASmodPackets.java b/src/main/java/com/minecrafttas/tasmod/networking/TASmodPackets.java index ac01c975..878eeeda 100644 --- a/src/main/java/com/minecrafttas/tasmod/networking/TASmodPackets.java +++ b/src/main/java/com/minecrafttas/tasmod/networking/TASmodPackets.java @@ -180,6 +180,22 @@ public enum TASmodPackets implements PacketID { break; } }), + /** + *

    Requests the list of TASfiles in the folder from the client for use in tab completions + *

    SIDE: Both
    + * ARGS:
    + * Server->Client None
    + * Client->Server String The string of TASfilenames seperated with / + */ + COMMAND_TASFILELIST, + /** + *

    Requests the list of SerialiserFlavors from the client for use in tab completions + *

    SIDE: Both
    + * ARGS:
    + * Server->Client None
    + * Client->Server String The string of flavors seperated with / + */ + COMMAND_FLAVORLIST, /** *

    Sets the KillTheRNG seed *

    SIDE: Both
    diff --git a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/DesyncMonitorFileCommandExtension.java b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/DesyncMonitorFileCommandExtension.java index f138e430..8dc2f8c7 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/DesyncMonitorFileCommandExtension.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/DesyncMonitorFileCommandExtension.java @@ -10,6 +10,7 @@ import com.dselent.bigarraylist.BigArrayList; import com.minecrafttas.tasmod.TASmod; +import com.minecrafttas.tasmod.TASmodClient; import com.minecrafttas.tasmod.events.EventPlaybackClient; import com.minecrafttas.tasmod.playback.PlaybackControllerClient; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TASstate; @@ -37,8 +38,6 @@ public class DesyncMonitorFileCommandExtension extends PlaybackFileCommandExtens private MonitorContainer currentValues; - private PlaybackControllerClient controller; - @Override public String name() { return "tasmod_desyncMonitoring@v1"; @@ -149,7 +148,7 @@ public MonitorContainer get(long l) { private String lastStatus = TextFormatting.GRAY + "Empty"; public String getStatus(EntityPlayerSP player) { - if (!controller.isNothingPlaying()) { + if (!TASmodClient.controller.isNothingPlaying()) { if (currentValues != null) { double[] playervalues = new double[6]; playervalues[0] = player.posX; @@ -158,7 +157,7 @@ public String getStatus(EntityPlayerSP player) { playervalues[3] = player.motionX; playervalues[4] = player.motionY; playervalues[5] = player.motionZ; - DesyncStatus status = currentValues.getSeverity(controller.index(), playervalues, TASmod.ktrngHandler.getGlobalSeedClient()); + DesyncStatus status = currentValues.getSeverity(TASmodClient.controller.index(), playervalues, TASmod.ktrngHandler.getGlobalSeedClient()); lastStatus = status.getFormat() + status.getText(); } else { lastStatus = TextFormatting.GRAY + "Empty"; @@ -170,7 +169,7 @@ public String getStatus(EntityPlayerSP player) { private String lastPos = ""; public String getPos() { - if (currentValues != null && !controller.isNothingPlaying()) { + if (currentValues != null && !TASmodClient.controller.isNothingPlaying()) { EntityPlayerSP player = Minecraft.getMinecraft().player; String[] values = new String[3]; values[0] = getFormattedString(player.posX - currentValues.values[0]); @@ -191,7 +190,7 @@ public String getPos() { private String lastMotion = ""; public String getMotion() { - if (currentValues != null && !controller.isNothingPlaying()) { + if (currentValues != null && !TASmodClient.controller.isNothingPlaying()) { EntityPlayerSP player = Minecraft.getMinecraft().player; String[] values = new String[3]; values[0] = getFormattedString(player.motionX - currentValues.values[3]); diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java index 413c4e91..44ddc26e 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java @@ -27,7 +27,7 @@ public abstract class SerialiserFlavorBase { - private long currentLine = 1; + protected long currentLine = 1; /** * The current tick that is being serialised or deserialised diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/integrated/Beta1Flavor.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/integrated/Beta1Flavor.java index cb08d7d2..a8aa420e 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/integrated/Beta1Flavor.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/integrated/Beta1Flavor.java @@ -1,35 +1,14 @@ package com.minecrafttas.tasmod.playback.tasfile.flavor.integrated; -import java.util.List; - import com.minecrafttas.tasmod.playback.tasfile.flavor.SerialiserFlavorBase; -import com.minecrafttas.tasmod.virtual.VirtualCameraAngle; -import com.minecrafttas.tasmod.virtual.VirtualKeyboard; -import com.minecrafttas.tasmod.virtual.VirtualMouse; public class Beta1Flavor extends SerialiserFlavorBase { @Override public String flavorName() { - return "beta"; - } - - @Override - protected List serialiseKeyboard(VirtualKeyboard keyboard) { - return null; - } - - @Override - protected List serialiseMouse(VirtualMouse mouse) { - return null; - + return "beta1"; } - @Override - protected List serialiseCameraAngle(VirtualCameraAngle cameraAngle) { - return null; - } - @Override public SerialiserFlavorBase clone() { return new Beta1Flavor(); From efe2dfa01e61d717d4888a2add9bb328f00f5115 Mon Sep 17 00:00:00 2001 From: Scribble Date: Sat, 29 Jun 2024 20:22:11 +0200 Subject: [PATCH 57/79] [PlaybackSerialiser] Hook up commands to the new serialiser - Improved exception handling for serialiser --- .../playback/PlaybackControllerClient.java | 51 ++++++++----- .../playback/tasfile/PlaybackSerialiser2.java | 72 ++++++++++--------- .../tasfile/flavor/SerialiserFlavorBase.java | 9 +++ 3 files changed, 80 insertions(+), 52 deletions(-) diff --git a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java index 03abd376..7b5c901e 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java @@ -47,6 +47,8 @@ import com.minecrafttas.tasmod.playback.filecommands.integrated.DesyncMonitorFileCommandExtension; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata; import com.minecrafttas.tasmod.playback.tasfile.PlaybackSerialiser; +import com.minecrafttas.tasmod.playback.tasfile.PlaybackSerialiser2; +import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackLoadException; import com.minecrafttas.tasmod.playback.tasfile.flavor.SerialiserFlavorBase; import com.minecrafttas.tasmod.util.LoggerMarkers; import com.minecrafttas.tasmod.util.Scheduler.Task; @@ -106,7 +108,7 @@ public class PlaybackControllerClient implements ClientPacketHandler, EventClien private VirtualCameraAngle camera = new VirtualCameraAngle(); public final File directory = new File(Minecraft.getMinecraft().mcDataDir.getAbsolutePath() + File.separator + "saves" + File.separator + "tasfiles"); - + /** * The place where all inputs get stored */ @@ -781,21 +783,25 @@ public PacketID[] getAcceptedPacketIDs() { public void onClientPacket(PacketID id, ByteBuffer buf, String username) throws PacketNotImplementedException, WrongSideException, Exception { TASmodPackets packet = (TASmodPackets) id; String name = null; + String flavor = null; Minecraft mc = Minecraft.getMinecraft(); switch (packet) { case PLAYBACK_SAVE: name = TASmodBufferBuilder.readString(buf); -// try { -// TASmodClient.virtual.saveInputs(name); TODO Move to PlaybackController -// } catch (IOException e) { -// if (mc.world != null) -// mc.ingameGUI.getChatGUI().printChatMessage(new TextComponentString(TextFormatting.RED + e.getMessage())); -// else -// e.printStackTrace(); -// return; -// } + flavor = TASmodBufferBuilder.readString(buf); + + try { + PlaybackSerialiser2.saveToFile(new File(directory, name + ".mctas"), this, flavor); + } catch (IOException e) { + if (mc.world != null) + mc.ingameGUI.getChatGUI().printChatMessage(new TextComponentString(TextFormatting.RED + e.getMessage())); + else + LOGGER.catching(e); + return; + } + if (mc.world != null) { TextComponentString confirm = new TextComponentString(TextFormatting.GREEN + "Saved inputs to " + name + ".mctas" + TextFormatting.RESET + " [" + TextFormatting.YELLOW + "Open folder" + TextFormatting.RESET + "]"); confirm.getStyle().setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/folder tasfiles")); @@ -807,15 +813,22 @@ public void onClientPacket(PacketID id, ByteBuffer buf, String username) throws case PLAYBACK_LOAD: name = TASmodBufferBuilder.readString(buf); -// try { -// TASmodClient.virtual.loadInputs(name); TODO Move to PlaybackController -// } catch (IOException e) { -// if (mc.world != null) -// mc.ingameGUI.getChatGUI().printChatMessage(new TextComponentString(TextFormatting.RED + e.getMessage())); -// else -// e.printStackTrace(); -// return; -// } + flavor = TASmodBufferBuilder.readString(buf); + + try { + PlaybackSerialiser2.loadFromFile(new File(directory, name + ".mctas"), flavor); + } catch (PlaybackLoadException e) { + if (mc.world != null) + mc.ingameGUI.getChatGUI().printChatMessage(new TextComponentString(TextFormatting.RED + e.getMessage())); + else + LOGGER.catching(e); + return; + } catch (Exception e) { + if (mc.world != null) { + mc.ingameGUI.getChatGUI().printChatMessage(new TextComponentString(TextFormatting.RED + "Something went very wrong")); + } + } + if (mc.world != null) mc.ingameGUI.getChatGUI().printChatMessage(new TextComponentString(TextFormatting.GREEN + "Loaded inputs from " + name + ".mctas")); else diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java index f0db646b..19520891 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java @@ -88,46 +88,27 @@ public static BigArrayList loadFromFile(File file) throws Playbac throw new PlaybackLoadException("Trying to load %s but the file doesn't exist", file.getName()); } - // Read file - BufferedReader reader = null; - - try { - reader = new BufferedReader(new FileReader(file)); - } catch (FileNotFoundException e) { - e.printStackTrace(); - return null; - } - - List lines = new ArrayList<>(); - String line = null; - - for (int i = 0; i < 100; i++) { - - line = reader.readLine(); - - if (line != null) { - lines.add(line); - } - } - reader.close(); - - SerialiserFlavorBase flavor = null; - - flavor = searchForFlavor(lines, TASmodRegistry.SERIALISER_FLAVOR.getFlavors()); // Test for the correct flavor on the first 100 lines + SerialiserFlavorBase flavor = readFlavor(file); return loadFromFile(file, flavor); } public static BigArrayList loadFromFile(File file, String flavorName) throws PlaybackLoadException, IOException { + if(flavorName == null || flavorName.isEmpty()) { - throw new PlaybackLoadException("Flavor name is null or empty"); + return loadFromFile(file); } SerialiserFlavorBase flavor = TASmodRegistry.SERIALISER_FLAVOR.getFlavor(flavorName); - + if (flavor == null) { throw new PlaybackLoadException("Flavor name %s doesn't exist.", flavorName); } + + SerialiserFlavorBase flavorInFile = readFlavor(file); + if(!flavor.equals(flavorInFile)) { + throw new PlaybackLoadException("Detected flavor %s in the TASfile, which does not match the specified flavor: %s"); + } return loadFromFile(file, flavor); } @@ -136,9 +117,6 @@ public static BigArrayList loadFromFile(File file, SerialiserFlav if (file == null) { throw new PlaybackLoadException("Load from file failed. No file specified"); } - if(!file.exists()) { - throw new PlaybackLoadException("Trying to load %s but the file doesn't exist", file.getName()); - } // Read file BufferedReader reader = null; @@ -146,8 +124,7 @@ public static BigArrayList loadFromFile(File file, SerialiserFlav try { reader = new BufferedReader(new FileReader(file)); } catch (FileNotFoundException e) { - e.printStackTrace(); - return null; + throw new PlaybackLoadException("Trying to load %s but the file doesn't exist", file.getName()); } BigArrayList lines = new BigArrayList<>(); @@ -178,4 +155,33 @@ public static SerialiserFlavorBase searchForFlavor(List lines, List lines = new ArrayList<>(); + String line = null; + + for (int i = 0; i < 100; i++) { + + line = reader.readLine(); + + if (line != null) { + lines.add(line); + } + } + reader.close(); + + SerialiserFlavorBase flavor = null; + + flavor = searchForFlavor(lines, TASmodRegistry.SERIALISER_FLAVOR.getFlavors()); // Test for the correct flavor on the first 100 lines + return flavor; + } } diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java index 44ddc26e..be7150a3 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java @@ -930,4 +930,13 @@ protected void pruneListEnd(List list){ @Override public abstract SerialiserFlavorBase clone(); + + @Override + public boolean equals(Object obj) { + if(obj instanceof SerialiserFlavorBase) { + SerialiserFlavorBase flavor = (SerialiserFlavorBase) obj; + return this.flavorName().equals(flavor.flavorName()); + } + return super.equals(obj); + } } From ca4d5aa7a83760582c7feabe11f02ee3fc08b907 Mon Sep 17 00:00:00 2001 From: Scribble Date: Sat, 29 Jun 2024 23:15:37 +0200 Subject: [PATCH 58/79] [PlaybackSerialiser] Added PlaybackSaveException --- .../playback/PlaybackControllerClient.java | 16 ++++++++--- .../playback/tasfile/PlaybackSerialiser2.java | 28 +++++++++++++------ .../exception/PlaybackSaveException.java | 20 +++++++++++++ .../tasfile/PlaybackSerialiserTest.java | 4 +-- 4 files changed, 53 insertions(+), 15 deletions(-) create mode 100644 src/main/java/com/minecrafttas/tasmod/playback/tasfile/exception/PlaybackSaveException.java diff --git a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java index 7b5c901e..4144a360 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java @@ -49,6 +49,7 @@ import com.minecrafttas.tasmod.playback.tasfile.PlaybackSerialiser; import com.minecrafttas.tasmod.playback.tasfile.PlaybackSerialiser2; import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackLoadException; +import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackSaveException; import com.minecrafttas.tasmod.playback.tasfile.flavor.SerialiserFlavorBase; import com.minecrafttas.tasmod.util.LoggerMarkers; import com.minecrafttas.tasmod.util.Scheduler.Task; @@ -794,12 +795,18 @@ public void onClientPacket(PacketID id, ByteBuffer buf, String username) throws try { PlaybackSerialiser2.saveToFile(new File(directory, name + ".mctas"), this, flavor); - } catch (IOException e) { + } catch (PlaybackSaveException e) { if (mc.world != null) mc.ingameGUI.getChatGUI().printChatMessage(new TextComponentString(TextFormatting.RED + e.getMessage())); else LOGGER.catching(e); return; + } catch (Exception e) { + if (mc.world != null) + mc.ingameGUI.getChatGUI().printChatMessage(new TextComponentString(TextFormatting.RED + "Saving failed, something went very wrong")); + else + LOGGER.catching(e); + return; } if (mc.world != null) { @@ -824,9 +831,10 @@ public void onClientPacket(PacketID id, ByteBuffer buf, String username) throws LOGGER.catching(e); return; } catch (Exception e) { - if (mc.world != null) { - mc.ingameGUI.getChatGUI().printChatMessage(new TextComponentString(TextFormatting.RED + "Something went very wrong")); - } + if (mc.world != null) + mc.ingameGUI.getChatGUI().printChatMessage(new TextComponentString(TextFormatting.RED + "Loading failed, something went very wrong")); + else + LOGGER.catching(e); } if (mc.world != null) diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java index 19520891..bcbd4081 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java @@ -12,6 +12,7 @@ import com.minecrafttas.tasmod.playback.PlaybackControllerClient; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickContainer; import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackLoadException; +import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackSaveException; import com.minecrafttas.tasmod.playback.tasfile.flavor.SerialiserFlavorBase; import com.minecrafttas.tasmod.util.FileThread; import com.minecrafttas.tasmod.util.TASmodRegistry; @@ -35,27 +36,36 @@ public class PlaybackSerialiser2 { * @param flavor * @throws FileNotFoundException */ - public static void saveToFile(File file, PlaybackControllerClient controller, String flavorname) throws FileNotFoundException { + public static void saveToFile(File file, PlaybackControllerClient controller, String flavorname) throws PlaybackSaveException { if (controller == null) { - throw new NullPointerException("Save to file failed. No controller specified"); + throw new PlaybackSaveException("Save to file failed. No controller specified"); } saveToFile(file, controller.getInputs(), flavorname); } - public static void saveToFile(File file, BigArrayList container, String flavorname) throws FileNotFoundException { + public static void saveToFile(File file, BigArrayList container, String flavorname) throws PlaybackSaveException { if (file == null) { - throw new NullPointerException("Save to file failed. No file specified"); + throw new PlaybackSaveException("Save to file failed. No file specified"); } if (container == null) { - throw new NullPointerException("Save to file failed. No tickcontainer list specified"); + throw new PlaybackSaveException("Save to file failed. No tickcontainer list specified"); } - if (flavorname == null) { + if (flavorname == null || flavorname.isEmpty()) { + if(defaultFlavor == null || defaultFlavor.isEmpty()) + throw new PlaybackSaveException("No default flavor specified... Please specify a flavor name first"); flavorname = defaultFlavor; + } else { + defaultFlavor = flavorname; + } + + FileThread writerThread; + try { + writerThread = new FileThread(file, false); + } catch (FileNotFoundException e) { + throw new PlaybackSaveException(e, "Trying to save the file %s, but the file can't be created", file.getName()); } - - FileThread writerThread = new FileThread(file, false); writerThread.start(); SerialiserFlavorBase flavor = TASmodRegistry.SERIALISER_FLAVOR.getFlavor(flavorname); @@ -124,7 +134,7 @@ public static BigArrayList loadFromFile(File file, SerialiserFlav try { reader = new BufferedReader(new FileReader(file)); } catch (FileNotFoundException e) { - throw new PlaybackLoadException("Trying to load %s but the file doesn't exist", file.getName()); + throw new PlaybackLoadException("Trying to load %s, but the file doesn't exist", file.getName()); } BigArrayList lines = new BigArrayList<>(); diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/exception/PlaybackSaveException.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/exception/PlaybackSaveException.java new file mode 100644 index 00000000..a24f627e --- /dev/null +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/exception/PlaybackSaveException.java @@ -0,0 +1,20 @@ +package com.minecrafttas.tasmod.playback.tasfile.exception; + +public class PlaybackSaveException extends PlaybackLoadException { + + public PlaybackSaveException(String msg) { + super(msg); + } + + public PlaybackSaveException(String msg, Object... args) { + super(String.format(msg, args)); + } + + public PlaybackSaveException(Throwable cause, String msg) { + super(msg, cause, false, false); + } + + public PlaybackSaveException(Throwable cause, String msg, Object... args) { + super(cause, String.format(msg, args)); + } +} diff --git a/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java b/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java index 6529a3ec..8f26ad6b 100644 --- a/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java +++ b/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java @@ -6,7 +6,6 @@ import static org.junit.jupiter.api.Assertions.fail; import java.io.File; -import java.io.FileNotFoundException; import java.io.IOException; import java.io.Serializable; import java.util.ArrayList; @@ -28,6 +27,7 @@ import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadataRegistry.PlaybackMetadataExtension; import com.minecrafttas.tasmod.playback.tasfile.PlaybackSerialiser2; import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackLoadException; +import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackSaveException; import com.minecrafttas.tasmod.playback.tasfile.flavor.SerialiserFlavorBase; import com.minecrafttas.tasmod.util.TASmodRegistry; import com.minecrafttas.tasmod.virtual.VirtualCameraAngle; @@ -189,7 +189,7 @@ void testSerialiser() { try { PlaybackSerialiser2.saveToFile(file, expected, "Test"); - } catch (FileNotFoundException e) { + } catch (PlaybackSaveException e) { e.printStackTrace(); } From 5b8a22c82d39b179cb7915d37d9164076844f6f6 Mon Sep 17 00:00:00 2001 From: Scribble Date: Sun, 30 Jun 2024 12:55:26 +0200 Subject: [PATCH 59/79] [PlaybackController] Removed deprecated fields --- .../tasmod/commands/CommandLoadTAS.java | 1 - .../com/minecrafttas/tasmod/gui/InfoHud.java | 7 +- .../tasmod/handlers/InterpolationHandler.java | 3 +- .../tasmod/playback/ControlByteHandler.java | 96 ------------------- .../playback/PlaybackControllerClient.java | 47 ++------- .../playback/tasfile/PlaybackSerialiser.java | 69 ++++++------- 6 files changed, 46 insertions(+), 177 deletions(-) delete mode 100644 src/main/java/com/minecrafttas/tasmod/playback/ControlByteHandler.java diff --git a/src/main/java/com/minecrafttas/tasmod/commands/CommandLoadTAS.java b/src/main/java/com/minecrafttas/tasmod/commands/CommandLoadTAS.java index b74fce95..936a298f 100644 --- a/src/main/java/com/minecrafttas/tasmod/commands/CommandLoadTAS.java +++ b/src/main/java/com/minecrafttas/tasmod/commands/CommandLoadTAS.java @@ -30,7 +30,6 @@ public String getUsage(ICommandSender sender) { @Override public void execute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException { - sender.sendMessage(new TextComponentString(TextFormatting.RED + "This feature does not work at the moment!")); if (sender instanceof EntityPlayer) { if (sender.canUseCommand(2, "load")) { if (args.length < 1) { diff --git a/src/main/java/com/minecrafttas/tasmod/gui/InfoHud.java b/src/main/java/com/minecrafttas/tasmod/gui/InfoHud.java index f663abda..20cb8f5c 100644 --- a/src/main/java/com/minecrafttas/tasmod/gui/InfoHud.java +++ b/src/main/java/com/minecrafttas/tasmod/gui/InfoHud.java @@ -17,7 +17,6 @@ import com.minecrafttas.tasmod.TASmod; import com.minecrafttas.tasmod.TASmodClient; import com.minecrafttas.tasmod.events.EventClient.EventDrawHotbar; -import com.minecrafttas.tasmod.playback.ControlByteHandler; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TASstate; import com.minecrafttas.tasmod.playback.filecommands.integrated.DesyncMonitorFileCommandExtension; import com.mojang.realmsclient.gui.ChatFormatting; @@ -373,7 +372,7 @@ public boolean checkInit() { if (configuration.getProperty(title + "_x", "err").equals("err")) setDefaults(title, y); lists.add(new InfoLabel(title, Integer.parseInt(configuration.getProperty(title + "_x")), Integer.parseInt(configuration.getProperty(title + "_y")), Boolean.parseBoolean(configuration.getProperty(title + "_visible")), Boolean.parseBoolean(configuration.getProperty(title + "_rect")), () -> { if (Minecraft.getMinecraft().currentScreen == this) return "Desync"; - DesyncMonitorFileCommandExtension dMonitor=TASmodClient.controller.desyncMonitor; + DesyncMonitorFileCommandExtension dMonitor=TASmodClient.desyncMonitorFileCommandExtension; return dMonitor.getStatus(Minecraft.getMinecraft().player); })); @@ -382,7 +381,7 @@ public boolean checkInit() { if (configuration.getProperty(title + "_x", "err").equals("err")) setDefaults(title, y); lists.add(new InfoLabel(title, Integer.parseInt(configuration.getProperty(title + "_x")), Integer.parseInt(configuration.getProperty(title + "_y")), Boolean.parseBoolean(configuration.getProperty(title + "_visible")), Boolean.parseBoolean(configuration.getProperty(title + "_rect")), () -> { if (Minecraft.getMinecraft().currentScreen == this) return "Desync Motion"; - DesyncMonitorFileCommandExtension dMonitor=TASmodClient.controller.desyncMonitor; + DesyncMonitorFileCommandExtension dMonitor=TASmodClient.desyncMonitorFileCommandExtension; return dMonitor.getMotion(); })); @@ -391,7 +390,7 @@ public boolean checkInit() { if (configuration.getProperty(title + "_x", "err").equals("err")) setDefaults(title, y); lists.add(new InfoLabel(title, Integer.parseInt(configuration.getProperty(title + "_x")), Integer.parseInt(configuration.getProperty(title + "_y")), Boolean.parseBoolean(configuration.getProperty(title + "_visible")), Boolean.parseBoolean(configuration.getProperty(title + "_rect")), () -> { if (Minecraft.getMinecraft().currentScreen == this) return "Desync Position"; - DesyncMonitorFileCommandExtension dMonitor=TASmodClient.controller.desyncMonitor; + DesyncMonitorFileCommandExtension dMonitor=TASmodClient.desyncMonitorFileCommandExtension; return dMonitor.getPos(); })); diff --git a/src/main/java/com/minecrafttas/tasmod/handlers/InterpolationHandler.java b/src/main/java/com/minecrafttas/tasmod/handlers/InterpolationHandler.java index a89bc899..cafe1ed5 100644 --- a/src/main/java/com/minecrafttas/tasmod/handlers/InterpolationHandler.java +++ b/src/main/java/com/minecrafttas/tasmod/handlers/InterpolationHandler.java @@ -2,7 +2,6 @@ import com.minecrafttas.mctcommon.events.EventClient.EventCamera; import com.minecrafttas.tasmod.TASmodClient; -import com.minecrafttas.tasmod.playback.ControlByteHandler; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickContainer; import net.minecraft.client.Minecraft; @@ -22,7 +21,7 @@ public class InterpolationHandler implements EventCamera { @Override public CameraData onCameraEvent(CameraData dataIn) { - if (TASmodClient.controller.isPlayingback() && ControlByteHandler.shouldInterpolate) { + if (TASmodClient.controller.isPlayingback() /*&& ControlByteHandler.shouldInterpolate*/) { TickContainer input = TASmodClient.controller.get(); if (input == null) return dataIn; diff --git a/src/main/java/com/minecrafttas/tasmod/playback/ControlByteHandler.java b/src/main/java/com/minecrafttas/tasmod/playback/ControlByteHandler.java deleted file mode 100644 index c3bfaed2..00000000 --- a/src/main/java/com/minecrafttas/tasmod/playback/ControlByteHandler.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.minecrafttas.tasmod.playback; - -import java.util.List; - -import com.mojang.realmsclient.util.Pair; - -/** - * Handles playback control bytes - * @author Pancake - */ -public class ControlByteHandler { - - /** - * Resets all control-byte-controlled settings - */ - public static void reset() { - ControlByteHandler.hideInfoBox = true; - ControlByteHandler.text = ""; - ControlByteHandler.shouldInterpolate = false; - ControlByteHandler.shouldRenderHud = true; - } - - public static void readCotrolByte(List> list) { - if (list != null) - for (Pair pair : list) - ControlByteHandler.onControlByte(pair.first(), pair.second()); - } - - public static String toString(List> cbytes) { - String out=""; - // Iterating over the list of cbytes - for(Pair pair : cbytes) { - - //Add the command byte - out=out.concat("$"+pair.first()+" "); - - //Add the arguments - String[] args=pair.second(); - for (int i = 0; i < args.length; i++) { - String limiter=" "; - if(args.length-1==i) { - limiter=""; - } - out=out.concat(args[i]+limiter); - } - //Add a new line for a new controlbyte - out=out.concat("\n"); - } - - return out; - } - - /** - * Reacts to control bytes - * @param command Control Command - * @param args Arguments - */ - public static void onControlByte(String command, String[] args) { - switch (command.toLowerCase()) { - case "interpolation": - interpolation(args); - break; - case "hud": - hud(args); - break; - case "info": - info(args); - default: - break; - } - } - - private static void info(String[] args) { - ControlByteHandler.hideInfoBox = "off".equals(args[0].trim()) || "false".equals(args[0].trim()) || "no".equals(args[0].trim()) || "0".equals(args[0].trim()); - // Parse array as text - ControlByteHandler.text = ""; - for (String string : args) { - ControlByteHandler.text += " " + string; - } - ControlByteHandler.text = ControlByteHandler.text.trim(); - } - - public static void interpolation(String[] args) { - ControlByteHandler.shouldInterpolate = "on".equals(args[0].trim()) || "true".equals(args[0].trim()) || "yes".equals(args[0].trim()) || "1".equals(args[0].trim()); - } - - public static void hud(String[] args) { - ControlByteHandler.shouldRenderHud = "on".equals(args[0].trim()) || "true".equals(args[0].trim()) || "yes".equals(args[0].trim()) || "1".equals(args[0].trim()); - } - - public static boolean hideInfoBox = true; - public static String text = ""; - public static boolean shouldInterpolate = false; - public static boolean shouldRenderHud = true; - -} diff --git a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java index 4144a360..8500a956 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java @@ -15,9 +15,7 @@ import java.io.Serializable; import java.nio.ByteBuffer; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; import org.lwjgl.opengl.Display; @@ -31,7 +29,6 @@ import com.minecrafttas.mctcommon.server.exception.WrongSideException; import com.minecrafttas.mctcommon.server.interfaces.ClientPacketHandler; import com.minecrafttas.mctcommon.server.interfaces.PacketID; -import com.minecrafttas.tasmod.TASmod; import com.minecrafttas.tasmod.TASmodClient; import com.minecrafttas.tasmod.events.EventClient.EventClientTickPost; import com.minecrafttas.tasmod.events.EventClient.EventVirtualCameraAngleTick; @@ -44,9 +41,7 @@ import com.minecrafttas.tasmod.events.EventPlaybackClient.EventRecordTick; import com.minecrafttas.tasmod.networking.TASmodBufferBuilder; import com.minecrafttas.tasmod.networking.TASmodPackets; -import com.minecrafttas.tasmod.playback.filecommands.integrated.DesyncMonitorFileCommandExtension; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata; -import com.minecrafttas.tasmod.playback.tasfile.PlaybackSerialiser; import com.minecrafttas.tasmod.playback.tasfile.PlaybackSerialiser2; import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackLoadException; import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackSaveException; @@ -57,7 +52,6 @@ import com.minecrafttas.tasmod.virtual.VirtualInput; import com.minecrafttas.tasmod.virtual.VirtualKeyboard; import com.minecrafttas.tasmod.virtual.VirtualMouse; -import com.mojang.realmsclient.util.Pair; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.EntityPlayerSP; @@ -115,21 +109,7 @@ public class PlaybackControllerClient implements ClientPacketHandler, EventClien */ private BigArrayList inputs = new BigArrayList(directory + File.separator + "temp"); - /** - * A map of control bytes. Used to change settings during playback via the - * playback file. - *

    - * A full list of changes can be found in {@link ControlByteHandler} - *

    - * The values are as follows: - *

    - * Map(int playbackLine, List(Pair(String controlCommand, String[] arguments))" - */ - private Map>> controlBytes = new HashMap>>(); // TODO Replace with TASFile extension - - public DesyncMonitorFileCommandExtension desyncMonitor = new DesyncMonitorFileCommandExtension(); // TODO Replace with TASFile extension - - private long startSeed = TASmod.ktrngHandler.getGlobalSeedClient(); // TODO Replace with Metadata extension +// private long startSeed = TASmod.ktrngHandler.getGlobalSeedClient(); // TODO Replace with Metadata extension // ===================================================================================================== @@ -171,8 +151,7 @@ public String setTASStateClient(TASstate stateIn) { */ public String setTASStateClient(TASstate stateIn, boolean verbose) { EventListenerRegistry.fireEvent(EventControllerStateChange.class, stateIn, state); - ControlByteHandler.reset(); // FIXME Controlbytes are resetting when loading a world, due to "Paused" state - // being active during loading... Fix Paused state shenanigans? + if (state == stateIn) { switch (stateIn) { case PLAYBACK: @@ -262,7 +241,6 @@ private void startRecording() { LOGGER.debug(LoggerMarkers.Playback, "Starting recording"); if (this.inputs.isEmpty()) { inputs.add(new TickContainer()); -// desyncMonitor.recordNull(index); } } @@ -275,7 +253,7 @@ private void startPlayback() { LOGGER.debug(LoggerMarkers.Playback, "Starting playback"); Minecraft.getMinecraft().gameSettings.chatLinks = false; // #119 index = 0; - TASmod.ktrngHandler.setInitialSeed(startSeed); +// TASmod.ktrngHandler.setInitialSeed(startSeed); } private void stopPlayback() { @@ -423,7 +401,6 @@ private void recordNextTick() { } EventListenerRegistry.fireEvent(EventRecordTick.class, index, container); -// desyncMonitor.recordMonitor(index); // Capturing monitor values } private void playbackNextTick() { @@ -460,8 +437,6 @@ private void playbackNextTick() { this.keyboard = container.getKeyboard().clone(); this.mouse = container.getMouse().clone(); this.camera = container.getCameraAngle().clone(); - // check for control bytes -// ControlByteHandler.readCotrolByte(controlBytes.get(index)); EventListenerRegistry.fireEvent(EventPlaybackTick.class, index, container); } @@ -496,10 +471,6 @@ public void setInputs(BigArrayList inputs) { SerialiserFlavorBase.addAll(this.inputs, inputs); } - public Map>> getControlBytes() { // TODO Replace with TASFile extension - return controlBytes; - } - public void setIndex(int index) throws IndexOutOfBoundsException { if (index <= size()) { this.index = index; @@ -798,14 +769,12 @@ public void onClientPacket(PacketID id, ByteBuffer buf, String username) throws } catch (PlaybackSaveException e) { if (mc.world != null) mc.ingameGUI.getChatGUI().printChatMessage(new TextComponentString(TextFormatting.RED + e.getMessage())); - else - LOGGER.catching(e); + LOGGER.catching(e); return; } catch (Exception e) { if (mc.world != null) mc.ingameGUI.getChatGUI().printChatMessage(new TextComponentString(TextFormatting.RED + "Saving failed, something went very wrong")); - else - LOGGER.catching(e); + LOGGER.catching(e); return; } @@ -827,14 +796,12 @@ public void onClientPacket(PacketID id, ByteBuffer buf, String username) throws } catch (PlaybackLoadException e) { if (mc.world != null) mc.ingameGUI.getChatGUI().printChatMessage(new TextComponentString(TextFormatting.RED + e.getMessage())); - else - LOGGER.catching(e); + LOGGER.catching(e); return; } catch (Exception e) { if (mc.world != null) mc.ingameGUI.getChatGUI().printChatMessage(new TextComponentString(TextFormatting.RED + "Loading failed, something went very wrong")); - else - LOGGER.catching(e); + LOGGER.catching(e); } if (mc.world != null) diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser.java index 5725176b..05fe893e 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser.java @@ -1,8 +1,19 @@ package com.minecrafttas.tasmod.playback.tasfile; +import static com.minecrafttas.tasmod.TASmod.LOGGER; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.commons.io.FileUtils; + import com.dselent.bigarraylist.BigArrayList; import com.minecrafttas.tasmod.TASmod; -import com.minecrafttas.tasmod.playback.ControlByteHandler; import com.minecrafttas.tasmod.playback.PlaybackControllerClient; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickContainer; import com.minecrafttas.tasmod.playback.filecommands.integrated.DesyncMonitorFileCommandExtension; @@ -12,17 +23,6 @@ import com.minecrafttas.tasmod.virtual.VirtualKeyboard; import com.minecrafttas.tasmod.virtual.VirtualMouse; import com.mojang.realmsclient.util.Pair; -import org.apache.commons.io.FileUtils; - -import java.io.File; -import java.io.IOException; -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import static com.minecrafttas.tasmod.TASmod.LOGGER; /** * Saves a given {@linkplain PlaybackControllerClient} to a file. Is also able to read an input container from a file.
    @@ -36,6 +36,7 @@ * @author ScribbleLP * */ +@Deprecated public class PlaybackSerialiser { /** @@ -131,14 +132,14 @@ public void saveToFileV1Until(File file, PlaybackControllerClient container, lon // + "#Comments start with \"//\" at the start of the line, comments with # will not be saved\n"); BigArrayList ticks = container.getInputs(); - Map>> cbytes= container.getControlBytes(); +// Map>> cbytes= container.getControlBytes(); // Map> comments = container.getComments(); - for (int i = 0; i < ticks.size(); i++) { - if(i==index) { - break; - } - +// for (int i = 0; i < ticks.size(); i++) { +// if(i==index) { +// break; +// } +// // // Add comments // if(comments.containsKey(i)) { // List multiLine=comments.get(i); @@ -148,19 +149,19 @@ public void saveToFileV1Until(File file, PlaybackControllerClient container, lon // } // Add controlbytes - if(cbytes.containsKey(i)) { - List> cbytelist= cbytes.get(i); - String cbyteString= ControlByteHandler.toString(cbytelist); - if(!cbyteString.isEmpty()) { - fileThread.addLine(cbyteString); - } - } - - // Add a data line - TickContainer tickInput = ticks.get(i); - fileThread.addLine(tickInput.toString() + "~&\t\t\t\t//Monitoring:"+container.desyncMonitor.get(i)+"\n"); - } - fileThread.close(); +// if(cbytes.containsKey(i)) { +// List> cbytelist= cbytes.get(i); +// String cbyteString= ControlByteHandler.toString(cbytelist); +// if(!cbyteString.isEmpty()) { +// fileThread.addLine(cbyteString); +// } +// } +// +// // Add a data line +// TickContainer tickInput = ticks.get(i); +// fileThread.addLine(tickInput.toString() + "~&\t\t\t\t//Monitoring:"+container.desyncMonitor.get(i)+"\n"); +// } +// fileThread.close(); } public int getFileVersion(File file) throws IOException { @@ -248,9 +249,9 @@ public PlaybackControllerClient fromEntireFileV1(File file) throws IOException { continue; String control = sections[0]; String[] params = sections[1].split(" "); - List> cbytes = controller.getControlBytes().getOrDefault(tickcount, new ArrayList<>()); - cbytes.add(Pair.of(control, params)); - controller.getControlBytes().put(tickcount, cbytes); +// List> cbytes = controller.getControlBytes().getOrDefault(tickcount, new ArrayList<>()); +// cbytes.add(Pair.of(control, params)); +// controller.getControlBytes().put(tickcount, cbytes); //Read comments } else if (line.startsWith("//")) { // List commentList = controller.getComments().getOrDefault(tickcount, new ArrayList<>()); From be1dcc163138b8cd63d22dd9fcbd3e6963dd1a17 Mon Sep 17 00:00:00 2001 From: Scribble Date: Sun, 30 Jun 2024 14:25:38 +0200 Subject: [PATCH 60/79] [MCTCommon/Keybinds] Fixed custom isKeyDownFunc not being used --- .../mctcommon/KeybindManager.java | 4 ++ .../tasmod/util/TASmodKeybinds.java | 67 +++++++++---------- 2 files changed, 36 insertions(+), 35 deletions(-) diff --git a/src/main/java/com/minecrafttas/mctcommon/KeybindManager.java b/src/main/java/com/minecrafttas/mctcommon/KeybindManager.java index dcb9066f..fcfdf5a2 100644 --- a/src/main/java/com/minecrafttas/mctcommon/KeybindManager.java +++ b/src/main/java/com/minecrafttas/mctcommon/KeybindManager.java @@ -55,6 +55,10 @@ public Keybind(String name, String category, int defaultKey, Runnable onKeyDown, this.isKeyDownFunc = func; } + @Override + public String toString() { + return this.vanillaKeyBinding.getKeyDescription(); + } } private List keybindings; diff --git a/src/main/java/com/minecrafttas/tasmod/util/TASmodKeybinds.java b/src/main/java/com/minecrafttas/tasmod/util/TASmodKeybinds.java index 8ff9d528..792e0f45 100644 --- a/src/main/java/com/minecrafttas/tasmod/util/TASmodKeybinds.java +++ b/src/main/java/com/minecrafttas/tasmod/util/TASmodKeybinds.java @@ -20,62 +20,59 @@ public enum TASmodKeybinds { TICKRATE_0("Tickrate 0 Key", "TASmod", Keyboard.KEY_F8, () -> TASmodClient.tickratechanger.togglePause(), VirtualKeybindings::isKeyDown), ADVANCE("Advance Tick", "TASmod", Keyboard.KEY_F9, () -> TASmodClient.tickratechanger.advanceTick(), VirtualKeybindings::isKeyDown), STOP("Recording/Playback Stop", "TASmod", Keyboard.KEY_F10, () -> TASmodClient.controller.setTASState(TASstate.NONE), VirtualKeybindings::isKeyDown), - SAVESTATE("Create Savestate", "TASmod", Keyboard.KEY_J, - () -> { - Minecraft.getMinecraft().ingameGUI.addChatMessage(ChatType.CHAT, new TextComponentString("Savestates might not work correctly at the moment... rewriting a lot of core features, which might break this...")); - try { - TASmodClient.client.send(new TASmodBufferBuilder(TASmodPackets.SAVESTATE_SAVE).writeInt(-1)); - } catch (Exception e) { - e.printStackTrace(); - } - }), - LOADSTATE("Load Latest Savestate", "TASmod", Keyboard.KEY_K, - () -> { - Minecraft.getMinecraft().ingameGUI.addChatMessage(ChatType.CHAT, new TextComponentString(TextFormatting.RED+"Savestates might not work correctly at the moment... rewriting a lot of core features, which might break this...")); - try { - TASmodClient.client.send(new TASmodBufferBuilder(TASmodPackets.SAVESTATE_LOAD).writeInt(-1)); - } catch (Exception e) { - e.printStackTrace(); - } - }), + SAVESTATE("Create Savestate", "TASmod", Keyboard.KEY_J, () -> { + Minecraft.getMinecraft().ingameGUI.addChatMessage(ChatType.CHAT, new TextComponentString("Savestates might not work correctly at the moment... rewriting a lot of core features, which might break this...")); + try { + TASmodClient.client.send(new TASmodBufferBuilder(TASmodPackets.SAVESTATE_SAVE).writeInt(-1)); + } catch (Exception e) { + e.printStackTrace(); + } + }), + LOADSTATE("Load Latest Savestate", "TASmod", Keyboard.KEY_K, () -> { + Minecraft.getMinecraft().ingameGUI.addChatMessage(ChatType.CHAT, new TextComponentString(TextFormatting.RED + "Savestates might not work correctly at the moment... rewriting a lot of core features, which might break this...")); + try { + TASmodClient.client.send(new TASmodBufferBuilder(TASmodPackets.SAVESTATE_LOAD).writeInt(-1)); + } catch (Exception e) { + e.printStackTrace(); + } + }), INFO_GUI("Open InfoGui Editor", "TASmod", Keyboard.KEY_F6, () -> Minecraft.getMinecraft().displayGuiScreen(TASmodClient.hud)), TEST1("Various Testing", "TASmod", Keyboard.KEY_F12, () -> { TASmodClient.controller.setTASState(TASstate.RECORDING); }, VirtualKeybindings::isKeyDown), - TEST2("Various Testing2", "TASmod", Keyboard.KEY_F7, - () -> { -// try { -// TASmodClient.client = new Client("localhost", TASmod.networkingport - 1, TASmodPackets.values(), mc.getSession().getProfile().getName(), true); -// } catch (Exception e) { -// e.printStackTrace(); -// } - TASmodClient.controller.setTASState(TASstate.PLAYBACK); - }, VirtualKeybindings::isKeyDown); - + TEST2("Various Testing2", "TASmod", Keyboard.KEY_F7, () -> { + // try { + // TASmodClient.client = new Client("localhost", TASmod.networkingport - 1, TASmodPackets.values(), mc.getSession().getProfile().getName(), true); + // } catch (Exception e) { + // e.printStackTrace(); + // } + TASmodClient.controller.setTASState(TASstate.PLAYBACK); + }, VirtualKeybindings::isKeyDown); + private Keybind keybind; - + private TASmodKeybinds(String name, String category, int defaultKey, Runnable onKeyDown, IsKeyDownFunc func) { - this.keybind=new Keybind(name, category, defaultKey, onKeyDown); + this.keybind = new Keybind(name, category, defaultKey, onKeyDown, func); } - + private TASmodKeybinds(String name, String category, int defaultKey, Runnable onKeyDown) { this(name, category, defaultKey, onKeyDown, null); } - + public static Keybind[] valuesKeybind() { TASmodKeybinds[] tasmodkeybinds = values(); Keybind[] keybinds = new Keybind[tasmodkeybinds.length]; for (int i = 0; i < tasmodkeybinds.length; i++) { - keybinds[i]=tasmodkeybinds[i].keybind; + keybinds[i] = tasmodkeybinds[i].keybind; } return keybinds; } - + public static KeyBinding[] valuesVanillaKeybind() { TASmodKeybinds[] tasmodkeybinds = values(); KeyBinding[] keybinds = new KeyBinding[tasmodkeybinds.length]; for (int i = 0; i < tasmodkeybinds.length; i++) { - keybinds[i]=tasmodkeybinds[i].keybind.vanillaKeyBinding; + keybinds[i] = tasmodkeybinds[i].keybind.vanillaKeyBinding; } return keybinds; } From 3f92474fd5f179b1560f6001fe57b0f785fec34f Mon Sep 17 00:00:00 2001 From: Scribble Date: Sun, 30 Jun 2024 15:14:18 +0200 Subject: [PATCH 61/79] [PlaybackController] Fixed TASfile not being applied to the controller - [PlaybackSerialiser] Added support for null values in Camera Angle --- .../com/minecrafttas/tasmod/TASmodClient.java | 1 - .../playbackhooks/MixinEntityRenderer.java | 2 +- .../playback/PlaybackControllerClient.java | 24 +++++++++---------- .../tasfile/flavor/SerialiserFlavorBase.java | 18 ++++++++++---- .../tasmod/virtual/VirtualCameraAngle.java | 7 ++++-- 5 files changed, 32 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/minecrafttas/tasmod/TASmodClient.java b/src/main/java/com/minecrafttas/tasmod/TASmodClient.java index cf202007..74b199d1 100644 --- a/src/main/java/com/minecrafttas/tasmod/TASmodClient.java +++ b/src/main/java/com/minecrafttas/tasmod/TASmodClient.java @@ -153,7 +153,6 @@ private void registerNetworkPacketHandlers() { private void registerEventListeners() { EventListenerRegistry.register(this); -// EventListenerRegistry.register(virtual); TODO Remove if unnecessary EventListenerRegistry.register(hud); EventListenerRegistry.register(shieldDownloader); EventListenerRegistry.register(loadingScreenHandler); diff --git a/src/main/java/com/minecrafttas/tasmod/mixin/playbackhooks/MixinEntityRenderer.java b/src/main/java/com/minecrafttas/tasmod/mixin/playbackhooks/MixinEntityRenderer.java index c736c7f0..761dbff6 100644 --- a/src/main/java/com/minecrafttas/tasmod/mixin/playbackhooks/MixinEntityRenderer.java +++ b/src/main/java/com/minecrafttas/tasmod/mixin/playbackhooks/MixinEntityRenderer.java @@ -47,7 +47,7 @@ public class MixinEntityRenderer implements SubtickDuck { /** * Injects into the vanilla camera updating cycle, runs every frame. - * Updates {@link com.minecrafttas.tasmod.virtual.VirtualInput.VirtualCameraAngleInput#nextCameraAngle} + * Updates {@link com.minecrafttas.tasmod.virtual.VirtualInput.VirtualCameraAngleInput#nextCameraAngle VirtualCameraAngleInput#nextCameraAngle} * @param partialTicks The partial ticks of the timer, unused * @param nanoTime The nanoTime, unused * @param ci CBI diff --git a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java index 8500a956..050ce0f7 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java @@ -50,6 +50,7 @@ import com.minecrafttas.tasmod.util.Scheduler.Task; import com.minecrafttas.tasmod.virtual.VirtualCameraAngle; import com.minecrafttas.tasmod.virtual.VirtualInput; +import com.minecrafttas.tasmod.virtual.VirtualInput.VirtualCameraAngleInput; import com.minecrafttas.tasmod.virtual.VirtualKeyboard; import com.minecrafttas.tasmod.virtual.VirtualMouse; @@ -239,7 +240,12 @@ public String setTASStateClient(TASstate stateIn, boolean verbose) { private void startRecording() { LOGGER.debug(LoggerMarkers.Playback, "Starting recording"); - if (this.inputs.isEmpty()) { + if(this.inputs.isEmpty()) { + VirtualCameraAngleInput CAMERA_ANGLE = TASmodClient.virtual.CAMERA_ANGLE; + Float pitch = CAMERA_ANGLE.getCurrentPitch(); + Float yaw = CAMERA_ANGLE.getCurrentYaw(); + this.camera.set(pitch, yaw); + inputs.add(new TickContainer()); } } @@ -462,12 +468,7 @@ public BigArrayList getInputs() { } public void setInputs(BigArrayList inputs) { - try { - inputs.clearMemory(); - } catch (IOException e) { - e.printStackTrace(); - } - inputs = new BigArrayList(directory + File.separator + "temp"); + clear(); SerialiserFlavorBase.addAll(this.inputs, inputs); } @@ -503,7 +504,7 @@ public TickContainer get() { } public void clear() { - LOGGER.debug(LoggerMarkers.Playback, "Clearing playback controller"); + LOGGER.info(LoggerMarkers.Playback, "Clearing playback controller"); EventListenerRegistry.fireEvent(EventPlaybackClient.EventRecordClear.class); try { inputs.clearMemory(); @@ -511,6 +512,7 @@ public void clear() { e.printStackTrace(); } inputs = new BigArrayList(directory + File.separator + "temp"); + index = 0; } /** @@ -575,9 +577,7 @@ public TickContainer(VirtualKeyboard keyboard, VirtualMouse mouse, VirtualCamera } public TickContainer() { - this.keyboard = new VirtualKeyboard(); - this.mouse = new VirtualMouse(); - this.cameraAngle = new VirtualCameraAngle(); + this(new VirtualKeyboard(), new VirtualMouse(), new VirtualCameraAngle()); } @Override @@ -792,7 +792,7 @@ public void onClientPacket(PacketID id, ByteBuffer buf, String username) throws flavor = TASmodBufferBuilder.readString(buf); try { - PlaybackSerialiser2.loadFromFile(new File(directory, name + ".mctas"), flavor); + TASmodClient.controller.setInputs(PlaybackSerialiser2.loadFromFile(new File(directory, name + ".mctas"), flavor)); } catch (PlaybackLoadException e) { if (mc.world != null) mc.ingameGUI.getChatGUI().printChatMessage(new TextComponentString(TextFormatting.RED + e.getMessage())); diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java index be7150a3..2251d1d6 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java @@ -719,9 +719,15 @@ protected VirtualCameraAngle deserialiseCameraAngle(List cameraAngleStri if (matcher.find()) { String cameraPitchString = matcher.group(1); String cameraYawString = matcher.group(2); - - float cameraPitch = deserialiseRelativeFloat("camera pitch", cameraPitchString, previousPitch); - float cameraYaw = deserialiseRelativeFloat("camera yaw", cameraYawString, previousYaw); + + Float cameraPitch = null; + Float cameraYaw = null; + + if(!"null".equals(cameraPitchString)) + cameraPitch = deserialiseRelativeFloat("camera pitch", cameraPitchString, previousPitch); + + if(!"null".equals(cameraYawString)) + cameraYaw = deserialiseRelativeFloat("camera yaw", cameraYawString, previousYaw); out.updateFromState(cameraPitch, cameraYaw); } @@ -789,7 +795,11 @@ protected float parseFloat(String name, String floatstring) { } } - protected float deserialiseRelativeFloat(String name, String floatstring, Float previous) { + protected Float deserialiseRelativeFloat(String name, String floatstring, Float previous) { + if(floatstring == null) { + return null; + } + float out = 0; if (floatstring.startsWith("~")) { floatstring = floatstring.replace("~", ""); diff --git a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualCameraAngle.java b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualCameraAngle.java index 8ef25b4f..021ed975 100644 --- a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualCameraAngle.java +++ b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualCameraAngle.java @@ -98,11 +98,14 @@ public void updateFromEvent(float pitchDelta, float yawDelta, boolean updateSubt this.yaw += yawDelta; } - public void updateFromState(float pitch, float yaw) { + public void updateFromState(Float pitch, Float yaw) { if(this.pitch!=null && this.yaw != null) { createSubtick(true); } - this.pitch = MathHelper.clamp(pitch, -90F, 90F); + if(pitch != null) { + pitch = MathHelper.clamp(pitch, -90F, 90F); + } + this.pitch = pitch; this.yaw = yaw; } From e6f89b0073bf23c18663905e95afc7e494fe493f Mon Sep 17 00:00:00 2001 From: Scribble Date: Sun, 30 Jun 2024 15:35:28 +0200 Subject: [PATCH 62/79] [PlaybackController] Fixed metadata getting cleared onLoad --- .../tasmod/playback/PlaybackControllerClient.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java index 050ce0f7..b4136cc5 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java @@ -468,8 +468,14 @@ public BigArrayList getInputs() { } public void setInputs(BigArrayList inputs) { - clear(); + try { + this.inputs.clearMemory(); + } catch (IOException e) { + e.printStackTrace(); + } + this.inputs = new BigArrayList(directory + File.separator + "temp"); SerialiserFlavorBase.addAll(this.inputs, inputs); + index = 0; } public void setIndex(int index) throws IndexOutOfBoundsException { From 86c5c5270fc76a47ea1e69276debcf5efce150c5 Mon Sep 17 00:00:00 2001 From: Scribble Date: Mon, 1 Jul 2024 23:33:36 +0200 Subject: [PATCH 63/79] [PlaybackSerialiser] Fixed FileCommmands#onRecord() not being called - Enabled DesyncMonitorFileCommandExtension by default --- .../tasmod/playback/PlaybackControllerClient.java | 7 +++++-- .../PlaybackFileCommandsRegistry.java | 15 ++++++++++----- .../DesyncMonitorFileCommandExtension.java | 6 +++++- .../playback/tasfile/PlaybackSerialiser2.java | 2 +- .../playback/tasfile/PlaybackSerialiserTest.java | 2 +- 5 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java index b4136cc5..590feb2f 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java @@ -42,6 +42,7 @@ import com.minecrafttas.tasmod.networking.TASmodBufferBuilder; import com.minecrafttas.tasmod.networking.TASmodPackets; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata; +import com.minecrafttas.tasmod.playback.tasfile.PlaybackSerialiser; import com.minecrafttas.tasmod.playback.tasfile.PlaybackSerialiser2; import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackLoadException; import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackSaveException; @@ -800,8 +801,10 @@ public void onClientPacket(PacketID id, ByteBuffer buf, String username) throws try { TASmodClient.controller.setInputs(PlaybackSerialiser2.loadFromFile(new File(directory, name + ".mctas"), flavor)); } catch (PlaybackLoadException e) { - if (mc.world != null) - mc.ingameGUI.getChatGUI().printChatMessage(new TextComponentString(TextFormatting.RED + e.getMessage())); + if (mc.world != null) { + TextComponentString textComponent = new TextComponentString(e.getMessage()); + mc.ingameGUI.getChatGUI().printChatMessage(textComponent); + } LOGGER.catching(e); return; } catch (Exception e) { diff --git a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommandsRegistry.java b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommandsRegistry.java index 1f7f4fe4..72d9d860 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommandsRegistry.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommandsRegistry.java @@ -36,6 +36,7 @@ public void register(PlaybackFileCommandExtension extension) { } REGISTRY.put(extension.name(), extension); + enabledExtensions = getEnabled(); } @Override @@ -86,16 +87,20 @@ public List getEnabled() { } @Override - public void onPlaybackTick(long index, TickContainer container) { + public void onRecordTick(long index, TickContainer container) { enabledExtensions.forEach(extension -> { - extension.onRecord(index, container); + if(extension.isEnabled()) { + extension.onRecord(index, container); + } }); } - + @Override - public void onRecordTick(long index, TickContainer container) { + public void onPlaybackTick(long index, TickContainer container) { enabledExtensions.forEach(extension -> { - extension.onPlayback(index, container); + if(extension.isEnabled()) { + extension.onPlayback(index, container); + } }); } diff --git a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/DesyncMonitorFileCommandExtension.java b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/DesyncMonitorFileCommandExtension.java index 8dc2f8c7..734cc32b 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/DesyncMonitorFileCommandExtension.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/DesyncMonitorFileCommandExtension.java @@ -12,7 +12,6 @@ import com.minecrafttas.tasmod.TASmod; import com.minecrafttas.tasmod.TASmodClient; import com.minecrafttas.tasmod.events.EventPlaybackClient; -import com.minecrafttas.tasmod.playback.PlaybackControllerClient; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TASstate; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickContainer; import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand; @@ -38,6 +37,10 @@ public class DesyncMonitorFileCommandExtension extends PlaybackFileCommandExtens private MonitorContainer currentValues; + public DesyncMonitorFileCommandExtension() { + enabled = true; + } + @Override public String name() { return "tasmod_desyncMonitoring@v1"; @@ -93,6 +96,7 @@ public void onDeserialiseEndlineComment(long tick, TickContainer container, Play List commandsEndline = fileCommandContainer.get("desyncMonitor"); if (commandsEndline == null || commandsEndline.isEmpty()) { recordNull(tick); + return; } PlaybackFileCommand command = commandsEndline.get(0); diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java index bcbd4081..f8883745 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java @@ -163,7 +163,7 @@ public static SerialiserFlavorBase searchForFlavor(List lines, List Date: Tue, 2 Jul 2024 21:11:09 +0200 Subject: [PATCH 64/79] [PlaybackSerialiser] Fixed DesyncMonitorFileCommand not being loaded --- .../integrated/DesyncMonitorFileCommandExtension.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/DesyncMonitorFileCommandExtension.java b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/DesyncMonitorFileCommandExtension.java index 734cc32b..d68d4de7 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/DesyncMonitorFileCommandExtension.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/DesyncMonitorFileCommandExtension.java @@ -48,7 +48,7 @@ public String name() { @Override public String[] getFileCommandNames() { - return new String[] { "desyncMonitoring" }; + return new String[] { "desyncMonitor" }; } @Override From a66ef9cde281cc347d4b7f3be36794519e91296d Mon Sep 17 00:00:00 2001 From: Scribble Date: Tue, 2 Jul 2024 21:11:59 +0200 Subject: [PATCH 65/79] [MCTCommon] Further abstracted registries This removes duplicate code in PlaybackMetadataRegistry, PlaybackFileCommandsRegistry and SerialiserFlavorRegistry - Moved TASmod specific configuration out of MCTCommon and created TASmodConfig - Added AbstractRegistry to Networking and Config - Renamed package "MCTCommon/server" to "MCTCommon/networking" - Added package registries - Renamed TASmodRegistry to TASmodAPIRegistry - Moved TASmodKeybinds to registries package - Moved TASmodPackets to registries package - Added seperate loading method for config. This is necessary as ConfigOptions need to be registered first --- .../minecrafttas/mctcommon/Configuration.java | 126 +++++++++++------- .../mctcommon/LanguageManager.java | 23 ++-- .../mctcommon/events/EventClient.java | 2 +- .../mctcommon/events/EventServer.java | 2 +- .../ByteBufferBuilder.java | 4 +- .../{server => networking}/Client.java | 12 +- .../CompactPacketHandler.java | 4 +- .../PacketHandlerRegistry.java | 16 +-- .../{server => networking}/SecureList.java | 2 +- .../{server => networking}/Server.java | 6 +- .../exception/InvalidPacketException.java | 2 +- .../PacketNotImplementedException.java | 8 +- .../exception/WrongSideException.java | 6 +- .../interfaces/ClientPacketHandler.java | 6 +- .../interfaces/PacketHandlerBase.java | 2 +- .../interfaces/PacketID.java | 9 +- .../interfaces/ServerPacketHandler.java | 6 +- .../mctcommon/registry/AbstractRegistry.java | 56 +++++++- .../mctcommon/registry/Registerable.java | 5 + .../java/com/minecrafttas/tasmod/TASmod.java | 6 +- .../com/minecrafttas/tasmod/TASmodClient.java | 34 ++--- .../tasmod/commands/CommandClearInputs.java | 2 +- .../tasmod/commands/CommandFolder.java | 2 +- .../tasmod/commands/CommandFullPlay.java | 2 +- .../tasmod/commands/CommandFullRecord.java | 2 +- .../tasmod/commands/CommandLoadTAS.java | 2 +- .../tasmod/commands/CommandPlayUntil.java | 2 +- .../commands/CommandRestartAndPlay.java | 2 +- .../tasmod/commands/CommandSaveTAS.java | 2 +- .../tasmod/commands/TabCompletionUtils.java | 19 +-- .../tasmod/events/TASmodEventListener.java | 6 - .../tasmod/ktrng/KTRNGMonitor.java | 2 +- .../tasmod/ktrng/KillTheRNGHandler.java | 15 ++- .../networking/TASmodBufferBuilder.java | 4 +- .../playback/PlaybackControllerClient.java | 41 +++--- .../playback/PlaybackControllerServer.java | 28 ++-- .../filecommands/PlaybackFileCommand.java | 5 +- .../PlaybackFileCommandsRegistry.java | 31 +---- .../DesyncMonitorFileCommandExtension.java | 7 +- .../integrated/LabelFileCommandExtension.java | 2 +- .../OptionsFileCommandExtension.java | 2 +- .../metadata/PlaybackMetadataRegistry.java | 45 +------ .../StartpositionMetadataExtension.java | 10 +- .../playback/tasfile/PlaybackSerialiser2.java | 8 +- .../tasfile/flavor/SerialiserFlavorBase.java | 32 +++-- .../flavor/SerialiserFlavorRegistry.java | 34 +---- .../flavor/integrated/Beta1Flavor.java | 2 +- .../TASmodAPIRegistry.java} | 4 +- .../tasmod/registries/TASmodConfig.java | 32 +++++ .../{util => registries}/TASmodKeybinds.java | 3 +- .../TASmodPackets.java | 19 ++- .../savestates/SavestateHandlerClient.java | 12 +- .../savestates/SavestateHandlerServer.java | 13 +- .../TickrateChangerClient.java | 12 +- .../TickrateChangerServer.java | 12 +- .../tasmod/ticksync/TickSyncClient.java | 6 +- .../tasmod/ticksync/TickSyncServer.java | 6 +- .../java/mctcommon/TestConfiguration.java | 68 +++++++--- .../server/ByteBufferBuilderTest.java | 13 +- .../java/mctcommon/server/ServerTest.java | 27 ++-- .../TASmodByteBufferBuilderTest.java | 11 +- .../PlaybackMetadataRegistryTest.java | 10 +- .../tasfile/PlaybackSerialiserTest.java | 20 +-- .../tasfile/SerialiserFlavorBaseTest.java | 36 ++--- .../tasfile/integrated/BetaFlavorTest.java | 2 +- 65 files changed, 507 insertions(+), 445 deletions(-) rename src/main/java/com/minecrafttas/mctcommon/{server => networking}/ByteBufferBuilder.java (97%) rename src/main/java/com/minecrafttas/mctcommon/{server => networking}/Client.java (95%) rename src/main/java/com/minecrafttas/mctcommon/{server => networking}/CompactPacketHandler.java (58%) rename src/main/java/com/minecrafttas/mctcommon/{server => networking}/PacketHandlerRegistry.java (81%) rename src/main/java/com/minecrafttas/mctcommon/{server => networking}/SecureList.java (96%) rename src/main/java/com/minecrafttas/mctcommon/{server => networking}/Server.java (96%) rename src/main/java/com/minecrafttas/mctcommon/{server => networking}/exception/InvalidPacketException.java (75%) rename src/main/java/com/minecrafttas/mctcommon/{server => networking}/exception/PacketNotImplementedException.java (70%) rename src/main/java/com/minecrafttas/mctcommon/{server => networking}/exception/WrongSideException.java (67%) rename src/main/java/com/minecrafttas/mctcommon/{server => networking}/interfaces/ClientPacketHandler.java (52%) rename src/main/java/com/minecrafttas/mctcommon/{server => networking}/interfaces/PacketHandlerBase.java (86%) rename src/main/java/com/minecrafttas/mctcommon/{server => networking}/interfaces/PacketID.java (65%) rename src/main/java/com/minecrafttas/mctcommon/{server => networking}/interfaces/ServerPacketHandler.java (52%) create mode 100644 src/main/java/com/minecrafttas/mctcommon/registry/Registerable.java delete mode 100644 src/main/java/com/minecrafttas/tasmod/events/TASmodEventListener.java rename src/main/java/com/minecrafttas/tasmod/{util/TASmodRegistry.java => registries/TASmodAPIRegistry.java} (95%) create mode 100644 src/main/java/com/minecrafttas/tasmod/registries/TASmodConfig.java rename src/main/java/com/minecrafttas/tasmod/{util => registries}/TASmodKeybinds.java (97%) rename src/main/java/com/minecrafttas/tasmod/{networking => registries}/TASmodPackets.java (95%) diff --git a/src/main/java/com/minecrafttas/mctcommon/Configuration.java b/src/main/java/com/minecrafttas/mctcommon/Configuration.java index 5d461f89..56eb33e6 100644 --- a/src/main/java/com/minecrafttas/mctcommon/Configuration.java +++ b/src/main/java/com/minecrafttas/mctcommon/Configuration.java @@ -5,40 +5,75 @@ import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; -import java.util.HashMap; +import java.util.ArrayList; import java.util.InvalidPropertiesFormatException; -import java.util.Map; +import java.util.LinkedHashMap; +import java.util.List; import java.util.Properties; +import com.minecrafttas.mctcommon.registry.AbstractRegistry; +import com.minecrafttas.mctcommon.registry.Registerable; /** * A very simple configuration class + * * @author Scribble - * */ -public class Configuration { - +public class Configuration extends AbstractRegistry { + private File file; - + private Properties properties; private String comment; - + public Configuration(String comment, File configFile) { + super("Configuration", new LinkedHashMap<>()); + file = configFile; this.comment = comment; + } + + protected final List configRegistry = new ArrayList<>(); + + @Override + public void register(ConfigOptions registryObject) { + if(registryObject == null) { + return; + } + + if(configRegistry.contains(registryObject)) { + return; + } + + configRegistry.add(registryObject); + } + + @Override + public void unregister(ConfigOptions registryObject) { + if (registryObject == null) { + return; + } + + if (!configRegistry.contains(registryObject)) { + return; + } - if(file.exists()) { - properties = load(); + configRegistry.remove(registryObject); + } + + public void load() { + if (file.exists()) { + properties = loadInner(); } - if(properties == null || !file.exists()) { + if (properties == null || !file.exists()) { properties = generateDefault(); save(); - } + } } - public Properties load() { + private Properties loadInner() { FileInputStream fis; Properties newProp = new Properties(); try { @@ -57,11 +92,11 @@ public Properties load() { } return newProp; } - + public void save() { save(file); } - + public void save(File file) { try { FileOutputStream fos = new FileOutputStream(file); @@ -71,73 +106,62 @@ public void save(File file) { e.printStackTrace(); } } - + public Properties generateDefault() { Properties newProperties = new Properties(); - newProperties.putAll(ConfigOptions.getDefaultValues()); + configRegistry.forEach((configOption)->{ + newProperties.put(configOption.getConfigKey(), configOption.getDefaultValue()); + }); return newProperties; } - + public String get(ConfigOptions configOption) { - return properties.getProperty(configOption.configKey); + return properties.getProperty(configOption.getConfigKey()); } - + public int getInt(ConfigOptions configOption) { return Integer.parseInt(get(configOption)); } - + public boolean getBoolean(ConfigOptions configOption) { return Boolean.parseBoolean(get(configOption)); } - + public boolean has(ConfigOptions configOption) { - return properties.contains(configOption.configKey); + return properties.contains(configOption.getConfigKey()); } - + public void set(ConfigOptions configOption, String value) { - properties.setProperty(configOption.configKey, value); + if(properties == null) { + throw new NullPointerException("Config needs to be loaded first, before trying to set a value"); + } + properties.setProperty(configOption.getConfigKey(), value); save(); } - + public void set(ConfigOptions configOption, int value) { String val = Integer.toString(value); set(configOption, val); } - + public void set(ConfigOptions configOption, boolean value) { String val = Boolean.toString(value); set(configOption, val); } - + public void reset(ConfigOptions configOption) { - set(configOption, configOption.defaultValue); + set(configOption, configOption.getDefaultValue()); } - + public void delete(ConfigOptions configOption) { properties.remove(configOption); save(); } - - public static enum ConfigOptions{ - FileToOpen("fileToOpen", ""), - ServerConnection("serverConnection", ""); - - private String configKey; - private String defaultValue; - - private ConfigOptions(String configKey, String defaultValue) { - this.configKey = configKey; - this.defaultValue = defaultValue; - } - - public static Map getDefaultValues() { - Map out = new HashMap<>(); - for (ConfigOptions configthing : values()) { - if(configthing.defaultValue!=null) { - out.put(configthing.configKey, configthing.defaultValue); - } - } - return out; - } + + public interface ConfigOptions extends Registerable { + + public String getDefaultValue(); + + public String getConfigKey(); } } diff --git a/src/main/java/com/minecrafttas/mctcommon/LanguageManager.java b/src/main/java/com/minecrafttas/mctcommon/LanguageManager.java index da3a4bce..acb7defe 100644 --- a/src/main/java/com/minecrafttas/mctcommon/LanguageManager.java +++ b/src/main/java/com/minecrafttas/mctcommon/LanguageManager.java @@ -1,19 +1,26 @@ package com.minecrafttas.mctcommon; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.regex.Pattern; + +import org.apache.commons.io.IOUtils; + import com.google.common.base.Splitter; import com.google.common.collect.Iterables; import com.google.gson.Gson; + import net.minecraft.client.resources.IResource; import net.minecraft.client.resources.IResourceManager; import net.minecraft.util.ResourceLocation; -import org.apache.commons.io.IOUtils; - -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; -import java.util.*; -import java.util.regex.Pattern; public class LanguageManager { diff --git a/src/main/java/com/minecrafttas/mctcommon/events/EventClient.java b/src/main/java/com/minecrafttas/mctcommon/events/EventClient.java index 78159c02..14a58991 100644 --- a/src/main/java/com/minecrafttas/mctcommon/events/EventClient.java +++ b/src/main/java/com/minecrafttas/mctcommon/events/EventClient.java @@ -1,7 +1,7 @@ package com.minecrafttas.mctcommon.events; import com.minecrafttas.mctcommon.events.EventListenerRegistry.EventBase; -import com.minecrafttas.mctcommon.server.Client; +import com.minecrafttas.mctcommon.networking.Client; import com.mojang.authlib.GameProfile; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/minecrafttas/mctcommon/events/EventServer.java b/src/main/java/com/minecrafttas/mctcommon/events/EventServer.java index 471baa00..0f8e6af2 100644 --- a/src/main/java/com/minecrafttas/mctcommon/events/EventServer.java +++ b/src/main/java/com/minecrafttas/mctcommon/events/EventServer.java @@ -1,7 +1,7 @@ package com.minecrafttas.mctcommon.events; import com.minecrafttas.mctcommon.events.EventListenerRegistry.EventBase; -import com.minecrafttas.mctcommon.server.Client; +import com.minecrafttas.mctcommon.networking.Client; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.server.MinecraftServer; diff --git a/src/main/java/com/minecrafttas/mctcommon/server/ByteBufferBuilder.java b/src/main/java/com/minecrafttas/mctcommon/networking/ByteBufferBuilder.java similarity index 97% rename from src/main/java/com/minecrafttas/mctcommon/server/ByteBufferBuilder.java rename to src/main/java/com/minecrafttas/mctcommon/networking/ByteBufferBuilder.java index 17d7b47a..8558439b 100644 --- a/src/main/java/com/minecrafttas/mctcommon/server/ByteBufferBuilder.java +++ b/src/main/java/com/minecrafttas/mctcommon/networking/ByteBufferBuilder.java @@ -1,10 +1,10 @@ -package com.minecrafttas.mctcommon.server; +package com.minecrafttas.mctcommon.networking; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.UUID; -import com.minecrafttas.mctcommon.server.interfaces.PacketID; +import com.minecrafttas.mctcommon.networking.interfaces.PacketID; /** * Helper method for creating byte buffers which get pooled from a diff --git a/src/main/java/com/minecrafttas/mctcommon/server/Client.java b/src/main/java/com/minecrafttas/mctcommon/networking/Client.java similarity index 95% rename from src/main/java/com/minecrafttas/mctcommon/server/Client.java rename to src/main/java/com/minecrafttas/mctcommon/networking/Client.java index 4858fbdd..c8989a1f 100644 --- a/src/main/java/com/minecrafttas/mctcommon/server/Client.java +++ b/src/main/java/com/minecrafttas/mctcommon/networking/Client.java @@ -1,9 +1,9 @@ -package com.minecrafttas.mctcommon.server; +package com.minecrafttas.mctcommon.networking; import static com.minecrafttas.mctcommon.MCTCommon.Client; import static com.minecrafttas.mctcommon.MCTCommon.LOGGER; import static com.minecrafttas.mctcommon.MCTCommon.Server; -import static com.minecrafttas.mctcommon.server.SecureList.BUFFER_SIZE; +import static com.minecrafttas.mctcommon.networking.SecureList.BUFFER_SIZE; import java.io.IOException; import java.net.InetSocketAddress; @@ -22,10 +22,10 @@ import com.minecrafttas.mctcommon.events.EventClient.EventDisconnectClient; import com.minecrafttas.mctcommon.events.EventListenerRegistry; import com.minecrafttas.mctcommon.events.EventServer.EventClientCompleteAuthentication; -import com.minecrafttas.mctcommon.server.exception.InvalidPacketException; -import com.minecrafttas.mctcommon.server.exception.PacketNotImplementedException; -import com.minecrafttas.mctcommon.server.exception.WrongSideException; -import com.minecrafttas.mctcommon.server.interfaces.PacketID; +import com.minecrafttas.mctcommon.networking.exception.InvalidPacketException; +import com.minecrafttas.mctcommon.networking.exception.PacketNotImplementedException; +import com.minecrafttas.mctcommon.networking.exception.WrongSideException; +import com.minecrafttas.mctcommon.networking.interfaces.PacketID; /** * A custom asynchronous client diff --git a/src/main/java/com/minecrafttas/mctcommon/server/CompactPacketHandler.java b/src/main/java/com/minecrafttas/mctcommon/networking/CompactPacketHandler.java similarity index 58% rename from src/main/java/com/minecrafttas/mctcommon/server/CompactPacketHandler.java rename to src/main/java/com/minecrafttas/mctcommon/networking/CompactPacketHandler.java index 8cd5c2b1..93bc10f1 100644 --- a/src/main/java/com/minecrafttas/mctcommon/server/CompactPacketHandler.java +++ b/src/main/java/com/minecrafttas/mctcommon/networking/CompactPacketHandler.java @@ -1,8 +1,8 @@ -package com.minecrafttas.mctcommon.server; +package com.minecrafttas.mctcommon.networking; import java.nio.ByteBuffer; -import com.minecrafttas.mctcommon.server.exception.PacketNotImplementedException; +import com.minecrafttas.mctcommon.networking.exception.PacketNotImplementedException; @FunctionalInterface public interface CompactPacketHandler { diff --git a/src/main/java/com/minecrafttas/mctcommon/server/PacketHandlerRegistry.java b/src/main/java/com/minecrafttas/mctcommon/networking/PacketHandlerRegistry.java similarity index 81% rename from src/main/java/com/minecrafttas/mctcommon/server/PacketHandlerRegistry.java rename to src/main/java/com/minecrafttas/mctcommon/networking/PacketHandlerRegistry.java index 25b29058..b073e0d0 100644 --- a/src/main/java/com/minecrafttas/mctcommon/server/PacketHandlerRegistry.java +++ b/src/main/java/com/minecrafttas/mctcommon/networking/PacketHandlerRegistry.java @@ -1,4 +1,4 @@ -package com.minecrafttas.mctcommon.server; +package com.minecrafttas.mctcommon.networking; import java.nio.ByteBuffer; import java.util.ArrayList; @@ -6,13 +6,13 @@ import java.util.List; import com.minecrafttas.mctcommon.MCTCommon; -import com.minecrafttas.mctcommon.server.Client.Side; -import com.minecrafttas.mctcommon.server.exception.PacketNotImplementedException; -import com.minecrafttas.mctcommon.server.exception.WrongSideException; -import com.minecrafttas.mctcommon.server.interfaces.ClientPacketHandler; -import com.minecrafttas.mctcommon.server.interfaces.PacketHandlerBase; -import com.minecrafttas.mctcommon.server.interfaces.PacketID; -import com.minecrafttas.mctcommon.server.interfaces.ServerPacketHandler; +import com.minecrafttas.mctcommon.networking.Client.Side; +import com.minecrafttas.mctcommon.networking.exception.PacketNotImplementedException; +import com.minecrafttas.mctcommon.networking.exception.WrongSideException; +import com.minecrafttas.mctcommon.networking.interfaces.ClientPacketHandler; +import com.minecrafttas.mctcommon.networking.interfaces.PacketHandlerBase; +import com.minecrafttas.mctcommon.networking.interfaces.PacketID; +import com.minecrafttas.mctcommon.networking.interfaces.ServerPacketHandler; public class PacketHandlerRegistry { private static final List REGISTRY = new ArrayList<>(); diff --git a/src/main/java/com/minecrafttas/mctcommon/server/SecureList.java b/src/main/java/com/minecrafttas/mctcommon/networking/SecureList.java similarity index 96% rename from src/main/java/com/minecrafttas/mctcommon/server/SecureList.java rename to src/main/java/com/minecrafttas/mctcommon/networking/SecureList.java index ce82af9e..372efaec 100644 --- a/src/main/java/com/minecrafttas/mctcommon/server/SecureList.java +++ b/src/main/java/com/minecrafttas/mctcommon/networking/SecureList.java @@ -1,4 +1,4 @@ -package com.minecrafttas.mctcommon.server; +package com.minecrafttas.mctcommon.networking; import java.nio.ByteBuffer; diff --git a/src/main/java/com/minecrafttas/mctcommon/server/Server.java b/src/main/java/com/minecrafttas/mctcommon/networking/Server.java similarity index 96% rename from src/main/java/com/minecrafttas/mctcommon/server/Server.java rename to src/main/java/com/minecrafttas/mctcommon/networking/Server.java index d10ff67a..da578d64 100644 --- a/src/main/java/com/minecrafttas/mctcommon/server/Server.java +++ b/src/main/java/com/minecrafttas/mctcommon/networking/Server.java @@ -1,4 +1,4 @@ -package com.minecrafttas.mctcommon.server; +package com.minecrafttas.mctcommon.networking; import static com.minecrafttas.mctcommon.MCTCommon.LOGGER; import static com.minecrafttas.mctcommon.MCTCommon.Server; @@ -15,8 +15,8 @@ import com.minecrafttas.mctcommon.MCTCommon; import com.minecrafttas.mctcommon.events.EventListenerRegistry; import com.minecrafttas.mctcommon.events.EventServer.EventDisconnectServer; -import com.minecrafttas.mctcommon.server.Client.ClientCallback; -import com.minecrafttas.mctcommon.server.interfaces.PacketID; +import com.minecrafttas.mctcommon.networking.Client.ClientCallback; +import com.minecrafttas.mctcommon.networking.interfaces.PacketID; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/com/minecrafttas/mctcommon/server/exception/InvalidPacketException.java b/src/main/java/com/minecrafttas/mctcommon/networking/exception/InvalidPacketException.java similarity index 75% rename from src/main/java/com/minecrafttas/mctcommon/server/exception/InvalidPacketException.java rename to src/main/java/com/minecrafttas/mctcommon/networking/exception/InvalidPacketException.java index fa8e389b..ef184e1c 100644 --- a/src/main/java/com/minecrafttas/mctcommon/server/exception/InvalidPacketException.java +++ b/src/main/java/com/minecrafttas/mctcommon/networking/exception/InvalidPacketException.java @@ -1,4 +1,4 @@ -package com.minecrafttas.mctcommon.server.exception; +package com.minecrafttas.mctcommon.networking.exception; public class InvalidPacketException extends Exception { diff --git a/src/main/java/com/minecrafttas/mctcommon/server/exception/PacketNotImplementedException.java b/src/main/java/com/minecrafttas/mctcommon/networking/exception/PacketNotImplementedException.java similarity index 70% rename from src/main/java/com/minecrafttas/mctcommon/server/exception/PacketNotImplementedException.java rename to src/main/java/com/minecrafttas/mctcommon/networking/exception/PacketNotImplementedException.java index 95365017..37994139 100644 --- a/src/main/java/com/minecrafttas/mctcommon/server/exception/PacketNotImplementedException.java +++ b/src/main/java/com/minecrafttas/mctcommon/networking/exception/PacketNotImplementedException.java @@ -1,8 +1,8 @@ -package com.minecrafttas.mctcommon.server.exception; +package com.minecrafttas.mctcommon.networking.exception; -import com.minecrafttas.mctcommon.server.Client.Side; -import com.minecrafttas.mctcommon.server.interfaces.PacketHandlerBase; -import com.minecrafttas.mctcommon.server.interfaces.PacketID; +import com.minecrafttas.mctcommon.networking.Client.Side; +import com.minecrafttas.mctcommon.networking.interfaces.PacketHandlerBase; +import com.minecrafttas.mctcommon.networking.interfaces.PacketID; public class PacketNotImplementedException extends Exception { diff --git a/src/main/java/com/minecrafttas/mctcommon/server/exception/WrongSideException.java b/src/main/java/com/minecrafttas/mctcommon/networking/exception/WrongSideException.java similarity index 67% rename from src/main/java/com/minecrafttas/mctcommon/server/exception/WrongSideException.java rename to src/main/java/com/minecrafttas/mctcommon/networking/exception/WrongSideException.java index 97c33878..f19c8922 100644 --- a/src/main/java/com/minecrafttas/mctcommon/server/exception/WrongSideException.java +++ b/src/main/java/com/minecrafttas/mctcommon/networking/exception/WrongSideException.java @@ -1,7 +1,7 @@ -package com.minecrafttas.mctcommon.server.exception; +package com.minecrafttas.mctcommon.networking.exception; -import com.minecrafttas.mctcommon.server.Client; -import com.minecrafttas.mctcommon.server.interfaces.PacketID; +import com.minecrafttas.mctcommon.networking.Client; +import com.minecrafttas.mctcommon.networking.interfaces.PacketID; public class WrongSideException extends Exception { diff --git a/src/main/java/com/minecrafttas/mctcommon/server/interfaces/ClientPacketHandler.java b/src/main/java/com/minecrafttas/mctcommon/networking/interfaces/ClientPacketHandler.java similarity index 52% rename from src/main/java/com/minecrafttas/mctcommon/server/interfaces/ClientPacketHandler.java rename to src/main/java/com/minecrafttas/mctcommon/networking/interfaces/ClientPacketHandler.java index 9ce21f45..2abbaad6 100644 --- a/src/main/java/com/minecrafttas/mctcommon/server/interfaces/ClientPacketHandler.java +++ b/src/main/java/com/minecrafttas/mctcommon/networking/interfaces/ClientPacketHandler.java @@ -1,9 +1,9 @@ -package com.minecrafttas.mctcommon.server.interfaces; +package com.minecrafttas.mctcommon.networking.interfaces; import java.nio.ByteBuffer; -import com.minecrafttas.mctcommon.server.exception.PacketNotImplementedException; -import com.minecrafttas.mctcommon.server.exception.WrongSideException; +import com.minecrafttas.mctcommon.networking.exception.PacketNotImplementedException; +import com.minecrafttas.mctcommon.networking.exception.WrongSideException; public interface ClientPacketHandler extends PacketHandlerBase{ diff --git a/src/main/java/com/minecrafttas/mctcommon/server/interfaces/PacketHandlerBase.java b/src/main/java/com/minecrafttas/mctcommon/networking/interfaces/PacketHandlerBase.java similarity index 86% rename from src/main/java/com/minecrafttas/mctcommon/server/interfaces/PacketHandlerBase.java rename to src/main/java/com/minecrafttas/mctcommon/networking/interfaces/PacketHandlerBase.java index b3cdc182..3651b45f 100644 --- a/src/main/java/com/minecrafttas/mctcommon/server/interfaces/PacketHandlerBase.java +++ b/src/main/java/com/minecrafttas/mctcommon/networking/interfaces/PacketHandlerBase.java @@ -1,4 +1,4 @@ -package com.minecrafttas.mctcommon.server.interfaces; +package com.minecrafttas.mctcommon.networking.interfaces; public interface PacketHandlerBase { /** diff --git a/src/main/java/com/minecrafttas/mctcommon/server/interfaces/PacketID.java b/src/main/java/com/minecrafttas/mctcommon/networking/interfaces/PacketID.java similarity index 65% rename from src/main/java/com/minecrafttas/mctcommon/server/interfaces/PacketID.java rename to src/main/java/com/minecrafttas/mctcommon/networking/interfaces/PacketID.java index 462ab012..99506c07 100644 --- a/src/main/java/com/minecrafttas/mctcommon/server/interfaces/PacketID.java +++ b/src/main/java/com/minecrafttas/mctcommon/networking/interfaces/PacketID.java @@ -1,9 +1,10 @@ -package com.minecrafttas.mctcommon.server.interfaces; +package com.minecrafttas.mctcommon.networking.interfaces; -import com.minecrafttas.mctcommon.server.CompactPacketHandler; -import com.minecrafttas.mctcommon.server.Client.Side; +import com.minecrafttas.mctcommon.networking.CompactPacketHandler; +import com.minecrafttas.mctcommon.registry.Registerable; +import com.minecrafttas.mctcommon.networking.Client.Side; -public interface PacketID { +public interface PacketID extends Registerable{ /** * @return The numerical ID of the packet */ diff --git a/src/main/java/com/minecrafttas/mctcommon/server/interfaces/ServerPacketHandler.java b/src/main/java/com/minecrafttas/mctcommon/networking/interfaces/ServerPacketHandler.java similarity index 52% rename from src/main/java/com/minecrafttas/mctcommon/server/interfaces/ServerPacketHandler.java rename to src/main/java/com/minecrafttas/mctcommon/networking/interfaces/ServerPacketHandler.java index 9c380a59..ba66fb29 100644 --- a/src/main/java/com/minecrafttas/mctcommon/server/interfaces/ServerPacketHandler.java +++ b/src/main/java/com/minecrafttas/mctcommon/networking/interfaces/ServerPacketHandler.java @@ -1,9 +1,9 @@ -package com.minecrafttas.mctcommon.server.interfaces; +package com.minecrafttas.mctcommon.networking.interfaces; import java.nio.ByteBuffer; -import com.minecrafttas.mctcommon.server.exception.PacketNotImplementedException; -import com.minecrafttas.mctcommon.server.exception.WrongSideException; +import com.minecrafttas.mctcommon.networking.exception.PacketNotImplementedException; +import com.minecrafttas.mctcommon.networking.exception.WrongSideException; public interface ServerPacketHandler extends PacketHandlerBase{ diff --git a/src/main/java/com/minecrafttas/mctcommon/registry/AbstractRegistry.java b/src/main/java/com/minecrafttas/mctcommon/registry/AbstractRegistry.java index d2370a75..2384d81e 100644 --- a/src/main/java/com/minecrafttas/mctcommon/registry/AbstractRegistry.java +++ b/src/main/java/com/minecrafttas/mctcommon/registry/AbstractRegistry.java @@ -1,27 +1,65 @@ package com.minecrafttas.mctcommon.registry; +import java.util.Arrays; import java.util.Map; -public abstract class AbstractRegistry { - protected final Map REGISTRY; +import com.minecrafttas.tasmod.TASmod; - public AbstractRegistry(Map map) { - REGISTRY = map; +public abstract class AbstractRegistry { + protected final Map REGISTRY; + protected final String name; + + public AbstractRegistry(String name, Map map) { + this.REGISTRY = map; + this.name = name; } - public abstract void register(V registryObject); + public void register(V registryObject) { + if (registryObject == null) { + throw new NullPointerException("Tried to register an object to "+name+" with value null"); + } + + if (containsClass(registryObject)) { + TASmod.LOGGER.warn("Trying to register an object in {}, but another instance of this class is already registered: {}", name, registryObject.getClass().getName()); + return; + } + + if(REGISTRY.containsKey(registryObject.getExtensionName())) { + TASmod.LOGGER.warn("Trying to register the an object in {}, but an extension with the same name is already registered: {}", registryObject.getExtensionName()); + return; + } + + REGISTRY.put(registryObject.getExtensionName(), registryObject); + } @SafeVarargs public final void register(V... registryObjects) { + this.register(Arrays.asList(registryObjects)); + } + + public final void register(Iterable registryObjects) { for (V registryObject : registryObjects) { this.register(registryObject); } } - public abstract void unregister(V registryObject); + public void unregister(V registryObject) { + if (registryObject == null) { + throw new NullPointerException("Tried to unregister an object from "+name+" with value null"); + } + if (REGISTRY.containsKey(registryObject.getExtensionName())) { + REGISTRY.remove(registryObject.getExtensionName()); + } else { + TASmod.LOGGER.warn("Trying to unregister an object from {}, but it was not registered: {}", name, registryObject.getClass().getName()); + } + } @SafeVarargs public final void unregister(V... registryObjects) { + this.unregister(Arrays.asList(registryObjects)); + } + + public final void unregister(Iterable registryObjects) { for (V registryObject : registryObjects) { this.unregister(registryObject); } @@ -32,7 +70,11 @@ public void clear() { } protected boolean containsClass(V newExtension) { - for (V extension : REGISTRY.values()) { + return containsClazz(newExtension, REGISTRY.values()); + } + + public static boolean containsClazz(W newExtension, Iterable iterable) { + for (W extension : iterable) { if (extension.getClass().equals(newExtension.getClass())) { return true; } diff --git a/src/main/java/com/minecrafttas/mctcommon/registry/Registerable.java b/src/main/java/com/minecrafttas/mctcommon/registry/Registerable.java new file mode 100644 index 00000000..226179a6 --- /dev/null +++ b/src/main/java/com/minecrafttas/mctcommon/registry/Registerable.java @@ -0,0 +1,5 @@ +package com.minecrafttas.mctcommon.registry; + +public interface Registerable { + public String getExtensionName(); +} \ No newline at end of file diff --git a/src/main/java/com/minecrafttas/tasmod/TASmod.java b/src/main/java/com/minecrafttas/tasmod/TASmod.java index 8891d4a5..36cdc526 100644 --- a/src/main/java/com/minecrafttas/tasmod/TASmod.java +++ b/src/main/java/com/minecrafttas/tasmod/TASmod.java @@ -10,8 +10,8 @@ import com.minecrafttas.mctcommon.events.EventListenerRegistry; import com.minecrafttas.mctcommon.events.EventServer.EventServerInit; import com.minecrafttas.mctcommon.events.EventServer.EventServerStop; -import com.minecrafttas.mctcommon.server.PacketHandlerRegistry; -import com.minecrafttas.mctcommon.server.Server; +import com.minecrafttas.mctcommon.networking.PacketHandlerRegistry; +import com.minecrafttas.mctcommon.networking.Server; import com.minecrafttas.tasmod.commands.CommandClearInputs; import com.minecrafttas.tasmod.commands.CommandFolder; import com.minecrafttas.tasmod.commands.CommandFullPlay; @@ -26,9 +26,9 @@ import com.minecrafttas.tasmod.commands.CommandTickrate; import com.minecrafttas.tasmod.commands.TabCompletionUtils; import com.minecrafttas.tasmod.ktrng.KillTheRNGHandler; -import com.minecrafttas.tasmod.networking.TASmodPackets; import com.minecrafttas.tasmod.playback.PlaybackControllerServer; import com.minecrafttas.tasmod.playback.metadata.integrated.StartpositionMetadataExtension; +import com.minecrafttas.tasmod.registries.TASmodPackets; import com.minecrafttas.tasmod.savestates.SavestateHandlerServer; import com.minecrafttas.tasmod.savestates.files.SavestateTrackerFile; import com.minecrafttas.tasmod.tickratechanger.TickrateChangerServer; diff --git a/src/main/java/com/minecrafttas/tasmod/TASmodClient.java b/src/main/java/com/minecrafttas/tasmod/TASmodClient.java index 74b199d1..0e6f9596 100644 --- a/src/main/java/com/minecrafttas/tasmod/TASmodClient.java +++ b/src/main/java/com/minecrafttas/tasmod/TASmodClient.java @@ -9,19 +9,17 @@ import org.apache.logging.log4j.Level; import com.minecrafttas.mctcommon.Configuration; -import com.minecrafttas.mctcommon.Configuration.ConfigOptions; import com.minecrafttas.mctcommon.KeybindManager; import com.minecrafttas.mctcommon.LanguageManager; import com.minecrafttas.mctcommon.events.EventClient.EventClientInit; import com.minecrafttas.mctcommon.events.EventClient.EventOpenGui; import com.minecrafttas.mctcommon.events.EventClient.EventPlayerJoinedClientSide; import com.minecrafttas.mctcommon.events.EventListenerRegistry; -import com.minecrafttas.mctcommon.server.Client; -import com.minecrafttas.mctcommon.server.PacketHandlerRegistry; -import com.minecrafttas.mctcommon.server.Server; +import com.minecrafttas.mctcommon.networking.Client; +import com.minecrafttas.mctcommon.networking.PacketHandlerRegistry; +import com.minecrafttas.mctcommon.networking.Server; import com.minecrafttas.tasmod.gui.InfoHud; import com.minecrafttas.tasmod.handlers.LoadingScreenHandler; -import com.minecrafttas.tasmod.networking.TASmodPackets; import com.minecrafttas.tasmod.playback.PlaybackControllerClient; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TASstate; import com.minecrafttas.tasmod.playback.filecommands.integrated.DesyncMonitorFileCommandExtension; @@ -31,14 +29,16 @@ import com.minecrafttas.tasmod.playback.metadata.integrated.StartpositionMetadataExtension; import com.minecrafttas.tasmod.playback.tasfile.PlaybackSerialiser; import com.minecrafttas.tasmod.playback.tasfile.flavor.integrated.Beta1Flavor; +import com.minecrafttas.tasmod.registries.TASmodAPIRegistry; +import com.minecrafttas.tasmod.registries.TASmodConfig; +import com.minecrafttas.tasmod.registries.TASmodKeybinds; +import com.minecrafttas.tasmod.registries.TASmodPackets; import com.minecrafttas.tasmod.savestates.SavestateHandlerClient; import com.minecrafttas.tasmod.tickratechanger.TickrateChangerClient; import com.minecrafttas.tasmod.ticksync.TickSyncClient; import com.minecrafttas.tasmod.util.LoggerMarkers; import com.minecrafttas.tasmod.util.Scheduler; import com.minecrafttas.tasmod.util.ShieldDownloader; -import com.minecrafttas.tasmod.util.TASmodKeybinds; -import com.minecrafttas.tasmod.util.TASmodRegistry; import com.minecrafttas.tasmod.virtual.VirtualInput; import com.minecrafttas.tasmod.virtual.VirtualKeybindings; @@ -170,8 +170,8 @@ private void registerEventListeners() { EventListenerRegistry.register(desyncMonitorFileCommandExtension); - EventListenerRegistry.register(TASmodRegistry.PLAYBACK_METADATA); - EventListenerRegistry.register(TASmodRegistry.PLAYBACK_FILE_COMMAND); + EventListenerRegistry.register(TASmodAPIRegistry.PLAYBACK_METADATA); + EventListenerRegistry.register(TASmodAPIRegistry.PLAYBACK_FILE_COMMAND); } @Override @@ -265,7 +265,7 @@ private void initializeCustomPacketHandler() { int PORT = TASmod.networkingport - 1; // Get the connection on startup from config - String configAddress = config.get(ConfigOptions.ServerConnection); + String configAddress = config.get(TASmodConfig.ServerConnection); if(configAddress != null && !configAddress.isEmpty()) { String[] ipSplit = configAddress.split(":"); IP = ipSplit[0]; @@ -294,14 +294,14 @@ private void registerKeybindings(Minecraft mc) { } private void registerPlaybackMetadata(Minecraft mc) { - TASmodRegistry.PLAYBACK_METADATA.register(creditsMetadataExtension); - TASmodRegistry.PLAYBACK_METADATA.register(startpositionMetadataExtension); + TASmodAPIRegistry.PLAYBACK_METADATA.register(creditsMetadataExtension); + TASmodAPIRegistry.PLAYBACK_METADATA.register(startpositionMetadataExtension); } public static Beta1Flavor betaFlavor = new Beta1Flavor(); private void registerSerialiserFlavors(Minecraft mc) { - TASmodRegistry.SERIALISER_FLAVOR.register(betaFlavor); + TASmodAPIRegistry.SERIALISER_FLAVOR.register(betaFlavor); } public static DesyncMonitorFileCommandExtension desyncMonitorFileCommandExtension = new DesyncMonitorFileCommandExtension(); @@ -309,9 +309,9 @@ private void registerSerialiserFlavors(Minecraft mc) { public static LabelFileCommandExtension labelFileCommandExtension = new LabelFileCommandExtension(); private void registerFileCommands() { - TASmodRegistry.PLAYBACK_FILE_COMMAND.register(desyncMonitorFileCommandExtension); - TASmodRegistry.PLAYBACK_FILE_COMMAND.register(optionsFileCommandExtension); - TASmodRegistry.PLAYBACK_FILE_COMMAND.register(labelFileCommandExtension); + TASmodAPIRegistry.PLAYBACK_FILE_COMMAND.register(desyncMonitorFileCommandExtension); + TASmodAPIRegistry.PLAYBACK_FILE_COMMAND.register(optionsFileCommandExtension); + TASmodAPIRegistry.PLAYBACK_FILE_COMMAND.register(labelFileCommandExtension); } private void loadConfig(Minecraft mc) { @@ -320,5 +320,7 @@ private void loadConfig(Minecraft mc) { configDir.mkdir(); } config = new Configuration("TASmod configuration", new File(configDir, "tasmod.cfg")); + config.register(TASmodConfig.values()); + config.load(); } } diff --git a/src/main/java/com/minecrafttas/tasmod/commands/CommandClearInputs.java b/src/main/java/com/minecrafttas/tasmod/commands/CommandClearInputs.java index b93ac489..38f7337f 100644 --- a/src/main/java/com/minecrafttas/tasmod/commands/CommandClearInputs.java +++ b/src/main/java/com/minecrafttas/tasmod/commands/CommandClearInputs.java @@ -2,7 +2,7 @@ import com.minecrafttas.tasmod.TASmod; import com.minecrafttas.tasmod.networking.TASmodBufferBuilder; -import com.minecrafttas.tasmod.networking.TASmodPackets; +import com.minecrafttas.tasmod.registries.TASmodPackets; import net.minecraft.command.CommandBase; import net.minecraft.command.CommandException; diff --git a/src/main/java/com/minecrafttas/tasmod/commands/CommandFolder.java b/src/main/java/com/minecrafttas/tasmod/commands/CommandFolder.java index 3642126f..eae277ed 100644 --- a/src/main/java/com/minecrafttas/tasmod/commands/CommandFolder.java +++ b/src/main/java/com/minecrafttas/tasmod/commands/CommandFolder.java @@ -11,7 +11,7 @@ import com.minecrafttas.tasmod.TASmod; import com.minecrafttas.tasmod.TASmodClient; import com.minecrafttas.tasmod.networking.TASmodBufferBuilder; -import com.minecrafttas.tasmod.networking.TASmodPackets; +import com.minecrafttas.tasmod.registries.TASmodPackets; import net.minecraft.command.CommandBase; import net.minecraft.command.CommandException; diff --git a/src/main/java/com/minecrafttas/tasmod/commands/CommandFullPlay.java b/src/main/java/com/minecrafttas/tasmod/commands/CommandFullPlay.java index 1dc02367..c8626e4d 100644 --- a/src/main/java/com/minecrafttas/tasmod/commands/CommandFullPlay.java +++ b/src/main/java/com/minecrafttas/tasmod/commands/CommandFullPlay.java @@ -2,8 +2,8 @@ import com.minecrafttas.tasmod.TASmod; import com.minecrafttas.tasmod.networking.TASmodBufferBuilder; -import com.minecrafttas.tasmod.networking.TASmodPackets; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TASstate; +import com.minecrafttas.tasmod.registries.TASmodPackets; import com.minecrafttas.tasmod.savestates.SavestateHandlerServer.SavestateState; import com.minecrafttas.tasmod.savestates.exceptions.LoadstateException; diff --git a/src/main/java/com/minecrafttas/tasmod/commands/CommandFullRecord.java b/src/main/java/com/minecrafttas/tasmod/commands/CommandFullRecord.java index 585a50d1..9ab51422 100644 --- a/src/main/java/com/minecrafttas/tasmod/commands/CommandFullRecord.java +++ b/src/main/java/com/minecrafttas/tasmod/commands/CommandFullRecord.java @@ -2,8 +2,8 @@ import com.minecrafttas.tasmod.TASmod; import com.minecrafttas.tasmod.networking.TASmodBufferBuilder; -import com.minecrafttas.tasmod.networking.TASmodPackets; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TASstate; +import com.minecrafttas.tasmod.registries.TASmodPackets; import com.minecrafttas.tasmod.savestates.SavestateHandlerServer.SavestateState; import com.minecrafttas.tasmod.savestates.exceptions.SavestateException; diff --git a/src/main/java/com/minecrafttas/tasmod/commands/CommandLoadTAS.java b/src/main/java/com/minecrafttas/tasmod/commands/CommandLoadTAS.java index 936a298f..add5e67e 100644 --- a/src/main/java/com/minecrafttas/tasmod/commands/CommandLoadTAS.java +++ b/src/main/java/com/minecrafttas/tasmod/commands/CommandLoadTAS.java @@ -5,7 +5,7 @@ import com.minecrafttas.tasmod.TASmod; import com.minecrafttas.tasmod.networking.TASmodBufferBuilder; -import com.minecrafttas.tasmod.networking.TASmodPackets; +import com.minecrafttas.tasmod.registries.TASmodPackets; import net.minecraft.command.CommandBase; import net.minecraft.command.CommandException; diff --git a/src/main/java/com/minecrafttas/tasmod/commands/CommandPlayUntil.java b/src/main/java/com/minecrafttas/tasmod/commands/CommandPlayUntil.java index d9f284af..21d93cd5 100644 --- a/src/main/java/com/minecrafttas/tasmod/commands/CommandPlayUntil.java +++ b/src/main/java/com/minecrafttas/tasmod/commands/CommandPlayUntil.java @@ -2,7 +2,7 @@ import com.minecrafttas.tasmod.TASmod; import com.minecrafttas.tasmod.networking.TASmodBufferBuilder; -import com.minecrafttas.tasmod.networking.TASmodPackets; +import com.minecrafttas.tasmod.registries.TASmodPackets; import net.minecraft.command.CommandBase; import net.minecraft.command.CommandException; diff --git a/src/main/java/com/minecrafttas/tasmod/commands/CommandRestartAndPlay.java b/src/main/java/com/minecrafttas/tasmod/commands/CommandRestartAndPlay.java index 60bd5f6d..deb96bc6 100644 --- a/src/main/java/com/minecrafttas/tasmod/commands/CommandRestartAndPlay.java +++ b/src/main/java/com/minecrafttas/tasmod/commands/CommandRestartAndPlay.java @@ -8,8 +8,8 @@ import com.minecrafttas.tasmod.TASmod; import com.minecrafttas.tasmod.networking.TASmodBufferBuilder; -import com.minecrafttas.tasmod.networking.TASmodPackets; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TASstate; +import com.minecrafttas.tasmod.registries.TASmodPackets; import com.minecrafttas.tasmod.savestates.exceptions.LoadstateException; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/minecrafttas/tasmod/commands/CommandSaveTAS.java b/src/main/java/com/minecrafttas/tasmod/commands/CommandSaveTAS.java index 0b27eaec..aaf4ef7a 100644 --- a/src/main/java/com/minecrafttas/tasmod/commands/CommandSaveTAS.java +++ b/src/main/java/com/minecrafttas/tasmod/commands/CommandSaveTAS.java @@ -6,7 +6,7 @@ import com.google.common.collect.ImmutableList; import com.minecrafttas.tasmod.TASmod; import com.minecrafttas.tasmod.networking.TASmodBufferBuilder; -import com.minecrafttas.tasmod.networking.TASmodPackets; +import com.minecrafttas.tasmod.registries.TASmodPackets; import net.minecraft.command.CommandBase; import net.minecraft.command.CommandException; diff --git a/src/main/java/com/minecrafttas/tasmod/commands/TabCompletionUtils.java b/src/main/java/com/minecrafttas/tasmod/commands/TabCompletionUtils.java index f6540d50..e1f2a758 100644 --- a/src/main/java/com/minecrafttas/tasmod/commands/TabCompletionUtils.java +++ b/src/main/java/com/minecrafttas/tasmod/commands/TabCompletionUtils.java @@ -1,5 +1,7 @@ package com.minecrafttas.tasmod.commands; +import static com.minecrafttas.tasmod.registries.TASmodPackets.*; + import java.io.File; import java.io.FileFilter; import java.nio.ByteBuffer; @@ -11,17 +13,16 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; -import com.minecrafttas.mctcommon.server.exception.PacketNotImplementedException; -import com.minecrafttas.mctcommon.server.exception.WrongSideException; -import com.minecrafttas.mctcommon.server.interfaces.ClientPacketHandler; -import com.minecrafttas.mctcommon.server.interfaces.PacketID; -import static com.minecrafttas.tasmod.networking.TASmodPackets.*; -import com.minecrafttas.mctcommon.server.interfaces.ServerPacketHandler; +import com.minecrafttas.mctcommon.networking.exception.PacketNotImplementedException; +import com.minecrafttas.mctcommon.networking.exception.WrongSideException; +import com.minecrafttas.mctcommon.networking.interfaces.ClientPacketHandler; +import com.minecrafttas.mctcommon.networking.interfaces.PacketID; +import com.minecrafttas.mctcommon.networking.interfaces.ServerPacketHandler; import com.minecrafttas.tasmod.TASmod; import com.minecrafttas.tasmod.TASmodClient; import com.minecrafttas.tasmod.networking.TASmodBufferBuilder; -import com.minecrafttas.tasmod.networking.TASmodPackets; -import com.minecrafttas.tasmod.util.TASmodRegistry; +import com.minecrafttas.tasmod.registries.TASmodAPIRegistry; +import com.minecrafttas.tasmod.registries.TASmodPackets; import net.minecraft.client.Minecraft; @@ -85,7 +86,7 @@ public void onClientPacket(PacketID id, ByteBuffer buf, String username) throws break; case COMMAND_FLAVORLIST: - String flavornames = String.join("/", TASmodRegistry.SERIALISER_FLAVOR.getFlavorNames()); + String flavornames = String.join("/", TASmodAPIRegistry.SERIALISER_FLAVOR.getFlavorNames()); TASmodClient.client.send(new TASmodBufferBuilder(COMMAND_FLAVORLIST).writeString(flavornames)); default: break; diff --git a/src/main/java/com/minecrafttas/tasmod/events/TASmodEventListener.java b/src/main/java/com/minecrafttas/tasmod/events/TASmodEventListener.java deleted file mode 100644 index e1dfea63..00000000 --- a/src/main/java/com/minecrafttas/tasmod/events/TASmodEventListener.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.minecrafttas.tasmod.events; - -import com.minecrafttas.mctcommon.events.EventListenerRegistry; - -public class TASmodEventListener extends EventListenerRegistry{ -} diff --git a/src/main/java/com/minecrafttas/tasmod/ktrng/KTRNGMonitor.java b/src/main/java/com/minecrafttas/tasmod/ktrng/KTRNGMonitor.java index 0a16d9e9..baa32a5c 100644 --- a/src/main/java/com/minecrafttas/tasmod/ktrng/KTRNGMonitor.java +++ b/src/main/java/com/minecrafttas/tasmod/ktrng/KTRNGMonitor.java @@ -1,6 +1,6 @@ package com.minecrafttas.tasmod.ktrng; - +@Deprecated public class KTRNGMonitor { // @CaptureRandomness(name = "jukeboxRecordDropPosition") diff --git a/src/main/java/com/minecrafttas/tasmod/ktrng/KillTheRNGHandler.java b/src/main/java/com/minecrafttas/tasmod/ktrng/KillTheRNGHandler.java index f6643fc8..b2669838 100644 --- a/src/main/java/com/minecrafttas/tasmod/ktrng/KillTheRNGHandler.java +++ b/src/main/java/com/minecrafttas/tasmod/ktrng/KillTheRNGHandler.java @@ -6,17 +6,17 @@ import com.minecrafttas.mctcommon.events.EventClient.EventPlayerJoinedClientSide; import com.minecrafttas.mctcommon.events.EventServer.EventServerTick; -import com.minecrafttas.mctcommon.server.Client.Side; -import com.minecrafttas.mctcommon.server.exception.PacketNotImplementedException; -import com.minecrafttas.mctcommon.server.exception.WrongSideException; -import com.minecrafttas.mctcommon.server.interfaces.ClientPacketHandler; -import com.minecrafttas.mctcommon.server.interfaces.PacketID; -import com.minecrafttas.mctcommon.server.interfaces.ServerPacketHandler; +import com.minecrafttas.mctcommon.networking.Client.Side; +import com.minecrafttas.mctcommon.networking.exception.PacketNotImplementedException; +import com.minecrafttas.mctcommon.networking.exception.WrongSideException; +import com.minecrafttas.mctcommon.networking.interfaces.ClientPacketHandler; +import com.minecrafttas.mctcommon.networking.interfaces.PacketID; +import com.minecrafttas.mctcommon.networking.interfaces.ServerPacketHandler; import com.minecrafttas.tasmod.TASmod; import com.minecrafttas.tasmod.TASmodClient; import com.minecrafttas.tasmod.networking.TASmodBufferBuilder; -import com.minecrafttas.tasmod.networking.TASmodPackets; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TASstate; +import com.minecrafttas.tasmod.registries.TASmodPackets; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; @@ -29,6 +29,7 @@ * @author Scribble * */ +@Deprecated public class KillTheRNGHandler implements EventServerTick, EventPlayerJoinedClientSide, ClientPacketHandler, ServerPacketHandler { private boolean isLoaded; diff --git a/src/main/java/com/minecrafttas/tasmod/networking/TASmodBufferBuilder.java b/src/main/java/com/minecrafttas/tasmod/networking/TASmodBufferBuilder.java index c553ea05..053fd8ff 100644 --- a/src/main/java/com/minecrafttas/tasmod/networking/TASmodBufferBuilder.java +++ b/src/main/java/com/minecrafttas/tasmod/networking/TASmodBufferBuilder.java @@ -7,8 +7,8 @@ import java.io.IOException; import java.nio.ByteBuffer; -import com.minecrafttas.mctcommon.server.ByteBufferBuilder; -import com.minecrafttas.mctcommon.server.interfaces.PacketID; +import com.minecrafttas.mctcommon.networking.ByteBufferBuilder; +import com.minecrafttas.mctcommon.networking.interfaces.PacketID; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TASstate; import com.minecrafttas.tasmod.savestates.SavestateHandlerServer.PlayerHandler.MotionData; import com.minecrafttas.tasmod.tickratechanger.TickrateChangerServer.TickratePauseState; diff --git a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java index 590feb2f..7e58b0f8 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java @@ -1,14 +1,14 @@ package com.minecrafttas.tasmod.playback; import static com.minecrafttas.tasmod.TASmod.LOGGER; -import static com.minecrafttas.tasmod.networking.TASmodPackets.PLAYBACK_CLEAR_INPUTS; -import static com.minecrafttas.tasmod.networking.TASmodPackets.PLAYBACK_FULLPLAY; -import static com.minecrafttas.tasmod.networking.TASmodPackets.PLAYBACK_FULLRECORD; -import static com.minecrafttas.tasmod.networking.TASmodPackets.PLAYBACK_LOAD; -import static com.minecrafttas.tasmod.networking.TASmodPackets.PLAYBACK_PLAYUNTIL; -import static com.minecrafttas.tasmod.networking.TASmodPackets.PLAYBACK_RESTARTANDPLAY; -import static com.minecrafttas.tasmod.networking.TASmodPackets.PLAYBACK_SAVE; -import static com.minecrafttas.tasmod.networking.TASmodPackets.PLAYBACK_STATE; +import static com.minecrafttas.tasmod.registries.TASmodPackets.PLAYBACK_CLEAR_INPUTS; +import static com.minecrafttas.tasmod.registries.TASmodPackets.PLAYBACK_FULLPLAY; +import static com.minecrafttas.tasmod.registries.TASmodPackets.PLAYBACK_FULLRECORD; +import static com.minecrafttas.tasmod.registries.TASmodPackets.PLAYBACK_LOAD; +import static com.minecrafttas.tasmod.registries.TASmodPackets.PLAYBACK_PLAYUNTIL; +import static com.minecrafttas.tasmod.registries.TASmodPackets.PLAYBACK_RESTARTANDPLAY; +import static com.minecrafttas.tasmod.registries.TASmodPackets.PLAYBACK_SAVE; +import static com.minecrafttas.tasmod.registries.TASmodPackets.PLAYBACK_STATE; import java.io.File; import java.io.IOException; @@ -20,15 +20,14 @@ import org.lwjgl.opengl.Display; import com.dselent.bigarraylist.BigArrayList; -import com.minecrafttas.mctcommon.Configuration.ConfigOptions; import com.minecrafttas.mctcommon.events.EventClient.EventClientInit; import com.minecrafttas.mctcommon.events.EventListenerRegistry; -import com.minecrafttas.mctcommon.server.ByteBufferBuilder; -import com.minecrafttas.mctcommon.server.Client.Side; -import com.minecrafttas.mctcommon.server.exception.PacketNotImplementedException; -import com.minecrafttas.mctcommon.server.exception.WrongSideException; -import com.minecrafttas.mctcommon.server.interfaces.ClientPacketHandler; -import com.minecrafttas.mctcommon.server.interfaces.PacketID; +import com.minecrafttas.mctcommon.networking.ByteBufferBuilder; +import com.minecrafttas.mctcommon.networking.Client.Side; +import com.minecrafttas.mctcommon.networking.exception.PacketNotImplementedException; +import com.minecrafttas.mctcommon.networking.exception.WrongSideException; +import com.minecrafttas.mctcommon.networking.interfaces.ClientPacketHandler; +import com.minecrafttas.mctcommon.networking.interfaces.PacketID; import com.minecrafttas.tasmod.TASmodClient; import com.minecrafttas.tasmod.events.EventClient.EventClientTickPost; import com.minecrafttas.tasmod.events.EventClient.EventVirtualCameraAngleTick; @@ -40,13 +39,13 @@ import com.minecrafttas.tasmod.events.EventPlaybackClient.EventPlaybackTick; import com.minecrafttas.tasmod.events.EventPlaybackClient.EventRecordTick; import com.minecrafttas.tasmod.networking.TASmodBufferBuilder; -import com.minecrafttas.tasmod.networking.TASmodPackets; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata; -import com.minecrafttas.tasmod.playback.tasfile.PlaybackSerialiser; import com.minecrafttas.tasmod.playback.tasfile.PlaybackSerialiser2; import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackLoadException; import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackSaveException; import com.minecrafttas.tasmod.playback.tasfile.flavor.SerialiserFlavorBase; +import com.minecrafttas.tasmod.registries.TASmodConfig; +import com.minecrafttas.tasmod.registries.TASmodPackets; import com.minecrafttas.tasmod.util.LoggerMarkers; import com.minecrafttas.tasmod.util.Scheduler.Task; import com.minecrafttas.tasmod.virtual.VirtualCameraAngle; @@ -76,7 +75,7 @@ * Information about the author etc. get stored in the playback controller too * and will be printed out in chat when the player loads into a world
    * Inputs are saved and loaded to/from file via the - * {@linkplain PlaybackSerialiser} TODO Update with new {@link PlaybackMetadata} + * {@linkplain PlaybackSerialiser2} TODO Update with new {@link PlaybackMetadata} * * @author Scribble * @@ -856,7 +855,7 @@ public void onClientPacket(PacketID id, ByteBuffer buf, String username) throws e.printStackTrace(); } Minecraft.getMinecraft().addScheduledTask(() -> { - TASmodClient.config.set(ConfigOptions.FileToOpen, finalname); + TASmodClient.config.set(TASmodConfig.FileToOpen, finalname); System.exit(0); }); break; @@ -910,11 +909,11 @@ public void onClientPacket(PacketID id, ByteBuffer buf, String username) throws @Override public void onClientInit(Minecraft mc) { // Execute /restartandplay. Load the file to start from the config. If it exists load the playback file on start. - String fileOnStart = TASmodClient.config.get(ConfigOptions.FileToOpen); + String fileOnStart = TASmodClient.config.get(TASmodConfig.FileToOpen); if (fileOnStart.isEmpty()) { fileOnStart = null; } else { - TASmodClient.config.reset(ConfigOptions.FileToOpen); + TASmodClient.config.reset(TASmodConfig.FileToOpen); } } } diff --git a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerServer.java b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerServer.java index a834fc40..889a5647 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerServer.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerServer.java @@ -1,27 +1,27 @@ package com.minecrafttas.tasmod.playback; import static com.minecrafttas.tasmod.TASmod.LOGGER; -import static com.minecrafttas.tasmod.networking.TASmodPackets.PLAYBACK_CLEAR_INPUTS; -import static com.minecrafttas.tasmod.networking.TASmodPackets.PLAYBACK_FULLPLAY; -import static com.minecrafttas.tasmod.networking.TASmodPackets.PLAYBACK_FULLRECORD; -import static com.minecrafttas.tasmod.networking.TASmodPackets.PLAYBACK_LOAD; -import static com.minecrafttas.tasmod.networking.TASmodPackets.PLAYBACK_PLAYUNTIL; -import static com.minecrafttas.tasmod.networking.TASmodPackets.PLAYBACK_RESTARTANDPLAY; -import static com.minecrafttas.tasmod.networking.TASmodPackets.PLAYBACK_SAVE; -import static com.minecrafttas.tasmod.networking.TASmodPackets.PLAYBACK_STATE; +import static com.minecrafttas.tasmod.registries.TASmodPackets.PLAYBACK_CLEAR_INPUTS; +import static com.minecrafttas.tasmod.registries.TASmodPackets.PLAYBACK_FULLPLAY; +import static com.minecrafttas.tasmod.registries.TASmodPackets.PLAYBACK_FULLRECORD; +import static com.minecrafttas.tasmod.registries.TASmodPackets.PLAYBACK_LOAD; +import static com.minecrafttas.tasmod.registries.TASmodPackets.PLAYBACK_PLAYUNTIL; +import static com.minecrafttas.tasmod.registries.TASmodPackets.PLAYBACK_RESTARTANDPLAY; +import static com.minecrafttas.tasmod.registries.TASmodPackets.PLAYBACK_SAVE; +import static com.minecrafttas.tasmod.registries.TASmodPackets.PLAYBACK_STATE; import static com.minecrafttas.tasmod.util.LoggerMarkers.Playback; import java.nio.ByteBuffer; -import com.minecrafttas.mctcommon.server.Client.Side; -import com.minecrafttas.mctcommon.server.exception.PacketNotImplementedException; -import com.minecrafttas.mctcommon.server.exception.WrongSideException; -import com.minecrafttas.mctcommon.server.interfaces.PacketID; -import com.minecrafttas.mctcommon.server.interfaces.ServerPacketHandler; +import com.minecrafttas.mctcommon.networking.Client.Side; +import com.minecrafttas.mctcommon.networking.exception.PacketNotImplementedException; +import com.minecrafttas.mctcommon.networking.exception.WrongSideException; +import com.minecrafttas.mctcommon.networking.interfaces.PacketID; +import com.minecrafttas.mctcommon.networking.interfaces.ServerPacketHandler; import com.minecrafttas.tasmod.TASmod; import com.minecrafttas.tasmod.networking.TASmodBufferBuilder; -import com.minecrafttas.tasmod.networking.TASmodPackets; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TASstate; +import com.minecrafttas.tasmod.registries.TASmodPackets; /** * The playback controller on the server side.
    diff --git a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java index 39318769..6d44d60d 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java @@ -6,6 +6,7 @@ import java.util.List; import java.util.Map; +import com.minecrafttas.mctcommon.registry.Registerable; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickContainer; public class PlaybackFileCommand { @@ -48,12 +49,10 @@ public String toString() { return String.format("$%s(%s);", name, String.join(", ", args)); } - public static abstract class PlaybackFileCommandExtension { + public static abstract class PlaybackFileCommandExtension implements Registerable{ protected boolean enabled = false; - public abstract String name(); - public abstract String[] getFileCommandNames(); public void onEnable() { diff --git a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommandsRegistry.java b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommandsRegistry.java index 72d9d860..09e569c4 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommandsRegistry.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommandsRegistry.java @@ -5,50 +5,29 @@ import java.util.List; import com.minecrafttas.mctcommon.registry.AbstractRegistry; -import com.minecrafttas.tasmod.TASmod; import com.minecrafttas.tasmod.events.EventPlaybackClient; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickContainer; import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandContainer; import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandExtension; -public class PlaybackFileCommandsRegistry extends AbstractRegistry implements EventPlaybackClient.EventRecordTick, EventPlaybackClient.EventPlaybackTick, EventPlaybackClient.EventRecordClear { +public class PlaybackFileCommandsRegistry extends AbstractRegistry implements EventPlaybackClient.EventRecordTick, EventPlaybackClient.EventPlaybackTick, EventPlaybackClient.EventRecordClear { private List enabledExtensions = new ArrayList<>(); public PlaybackFileCommandsRegistry() { - super(new LinkedHashMap<>()); + super("FILECOMMAND_REGISTRY", new LinkedHashMap<>()); } @Override public void register(PlaybackFileCommandExtension extension) { - if (extension == null) { - throw new NullPointerException("Tried to register a serialiser flavor. But flavor is null."); - } - - if (containsClass(extension)) { - TASmod.LOGGER.warn("Tried to register the serialiser flavor {}, but another instance of this class is already registered!", extension.getClass().getName()); - return; - } - - if (REGISTRY.containsKey(extension.name())) { - TASmod.LOGGER.warn("Trying to register the playback extension{}, but a flavor with the same name is already registered!", extension.name()); - return; - } - - REGISTRY.put(extension.name(), extension); + super.register(extension); enabledExtensions = getEnabled(); } @Override public void unregister(PlaybackFileCommandExtension extension) { - if (extension == null) { - throw new NullPointerException("Tried to unregister an playback extension with value null"); - } - if (REGISTRY.containsKey(extension.name())) { - REGISTRY.remove(extension.name()); - } else { - TASmod.LOGGER.warn("Trying to unregister the playback extension {}, but it was not registered!", extension.getClass().getName()); - } + super.unregister(extension); + enabledExtensions = getEnabled(); } public boolean setEnabled(String extensionName, boolean enabled) { diff --git a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/DesyncMonitorFileCommandExtension.java b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/DesyncMonitorFileCommandExtension.java index d68d4de7..32c7d592 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/DesyncMonitorFileCommandExtension.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/DesyncMonitorFileCommandExtension.java @@ -9,7 +9,6 @@ import java.util.Locale; import com.dselent.bigarraylist.BigArrayList; -import com.minecrafttas.tasmod.TASmod; import com.minecrafttas.tasmod.TASmodClient; import com.minecrafttas.tasmod.events.EventPlaybackClient; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TASstate; @@ -42,7 +41,7 @@ public DesyncMonitorFileCommandExtension() { } @Override - public String name() { + public String getExtensionName() { return "tasmod_desyncMonitoring@v1"; } @@ -161,7 +160,7 @@ public String getStatus(EntityPlayerSP player) { playervalues[3] = player.motionX; playervalues[4] = player.motionY; playervalues[5] = player.motionZ; - DesyncStatus status = currentValues.getSeverity(TASmodClient.controller.index(), playervalues, TASmod.ktrngHandler.getGlobalSeedClient()); + DesyncStatus status = currentValues.getSeverity(TASmodClient.controller.index(), playervalues); lastStatus = status.getFormat() + status.getText(); } else { lastStatus = TextFormatting.GRAY + "Empty"; @@ -258,7 +257,7 @@ public String toString() { return String.format(Locale.US, "%d, %d, %d, %d, %d, %d", values[0], values[1], values[2], values[3], values[4], values[5]); } - public DesyncStatus getSeverity(long index, double[] playerValues, long seed) { + public DesyncStatus getSeverity(long index, double[] playerValues) { DesyncStatus out = null; diff --git a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/LabelFileCommandExtension.java b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/LabelFileCommandExtension.java index 505e54fe..d652f49e 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/LabelFileCommandExtension.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/LabelFileCommandExtension.java @@ -16,7 +16,7 @@ public class LabelFileCommandExtension extends PlaybackFileCommandExtension { BigArrayList label = new BigArrayList<>(); @Override - public String name() { + public String getExtensionName() { return "tasmod_label@v1"; } diff --git a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/OptionsFileCommandExtension.java b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/OptionsFileCommandExtension.java index ae15b5c3..73fd3fdf 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/OptionsFileCommandExtension.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/OptionsFileCommandExtension.java @@ -18,7 +18,7 @@ public class OptionsFileCommandExtension extends PlaybackFileCommandExtension { BigArrayList hud = new BigArrayList<>(); @Override - public String name() { + public String getExtensionName() { return "tasmod_options@v1"; } diff --git a/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadataRegistry.java b/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadataRegistry.java index b59805f6..ea2ecaea 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadataRegistry.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadataRegistry.java @@ -18,41 +18,10 @@ * * @author Scribble */ -public class PlaybackMetadataRegistry extends AbstractRegistry implements EventPlaybackClient.EventRecordClear{ +public class PlaybackMetadataRegistry extends AbstractRegistry implements EventPlaybackClient.EventRecordClear{ public PlaybackMetadataRegistry() { - super(new LinkedHashMap<>()); - } - - @Override - public void register(PlaybackMetadataExtension extension) { - if (extension == null) { - throw new NullPointerException("Tried to register a playback extension with value null"); - } - - if (containsClass(extension)) { - TASmod.LOGGER.warn("Trying to register the playback extension {}, but another instance of this class is already registered!", extension.getClass().getName()); - return; - } - - if(REGISTRY.containsKey(extension.getExtensionName())) { - TASmod.LOGGER.warn("Trying to register the playback extension {}, but an extension with the same name is already registered!", extension.getExtensionName()); - return; - } - - REGISTRY.put(extension.getExtensionName(), extension); - } - - @Override - public void unregister(PlaybackMetadataExtension extension) { - if (extension == null) { - throw new NullPointerException("Tried to unregister an extension with value null"); - } - if (REGISTRY.containsKey(extension.getExtensionName())) { - REGISTRY.remove(extension.getExtensionName()); - } else { - TASmod.LOGGER.warn("Trying to unregister the playback extension {}, but it was not registered!", extension.getClass().getName()); - } + super("METADATA_REGISTRY", new LinkedHashMap<>()); } public static void handleOnCreate() { @@ -88,16 +57,8 @@ public void onClear() { }); } - public static interface PlaybackMetadataExtension { + public static interface PlaybackMetadataExtension extends com.minecrafttas.mctcommon.registry.Registerable { - /** - * The name of this playback metadata extension.
    - * The name is printed in the playback file and declares this "section".
    - * It is also used in the {@link PlaybackMetadata} itself to link the metadata to the extension.
    - * @return The name of this playback metadata extension. - */ - public String getExtensionName(); - /** * Currently unused.
    * Maybe in the future, TASes have to be created with /create, then you can interactively set the values...
    diff --git a/src/main/java/com/minecrafttas/tasmod/playback/metadata/integrated/StartpositionMetadataExtension.java b/src/main/java/com/minecrafttas/tasmod/playback/metadata/integrated/StartpositionMetadataExtension.java index 14b8150b..3af060e3 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/metadata/integrated/StartpositionMetadataExtension.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/metadata/integrated/StartpositionMetadataExtension.java @@ -4,19 +4,19 @@ import java.nio.ByteBuffer; -import com.minecrafttas.mctcommon.server.exception.PacketNotImplementedException; -import com.minecrafttas.mctcommon.server.exception.WrongSideException; -import com.minecrafttas.mctcommon.server.interfaces.PacketID; -import com.minecrafttas.mctcommon.server.interfaces.ServerPacketHandler; +import com.minecrafttas.mctcommon.networking.exception.PacketNotImplementedException; +import com.minecrafttas.mctcommon.networking.exception.WrongSideException; +import com.minecrafttas.mctcommon.networking.interfaces.PacketID; +import com.minecrafttas.mctcommon.networking.interfaces.ServerPacketHandler; import com.minecrafttas.tasmod.TASmod; import com.minecrafttas.tasmod.TASmodClient; import com.minecrafttas.tasmod.events.EventPlaybackClient.EventControllerStateChange; import com.minecrafttas.tasmod.networking.TASmodBufferBuilder; -import com.minecrafttas.tasmod.networking.TASmodPackets; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TASstate; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadataRegistry.PlaybackMetadataExtension; import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackLoadException; +import com.minecrafttas.tasmod.registries.TASmodPackets; import com.minecrafttas.tasmod.util.LoggerMarkers; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java index f8883745..607e8661 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java @@ -14,8 +14,8 @@ import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackLoadException; import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackSaveException; import com.minecrafttas.tasmod.playback.tasfile.flavor.SerialiserFlavorBase; +import com.minecrafttas.tasmod.registries.TASmodAPIRegistry; import com.minecrafttas.tasmod.util.FileThread; -import com.minecrafttas.tasmod.util.TASmodRegistry; /** * Serialises and deserialises the {@link PlaybackControllerClient}.
    @@ -68,7 +68,7 @@ public static void saveToFile(File file, BigArrayList container, } writerThread.start(); - SerialiserFlavorBase flavor = TASmodRegistry.SERIALISER_FLAVOR.getFlavor(flavorname); + SerialiserFlavorBase flavor = TASmodAPIRegistry.SERIALISER_FLAVOR.getFlavor(flavorname); List header = flavor.serialiseHeader(); for (String line : header) { @@ -109,7 +109,7 @@ public static BigArrayList loadFromFile(File file, String flavorN return loadFromFile(file); } - SerialiserFlavorBase flavor = TASmodRegistry.SERIALISER_FLAVOR.getFlavor(flavorName); + SerialiserFlavorBase flavor = TASmodAPIRegistry.SERIALISER_FLAVOR.getFlavor(flavorName); if (flavor == null) { throw new PlaybackLoadException("Flavor name %s doesn't exist.", flavorName); @@ -191,7 +191,7 @@ public static SerialiserFlavorBase readFlavor(File file) throws PlaybackLoadExce SerialiserFlavorBase flavor = null; - flavor = searchForFlavor(lines, TASmodRegistry.SERIALISER_FLAVOR.getFlavors()); // Test for the correct flavor on the first 100 lines + flavor = searchForFlavor(lines, TASmodAPIRegistry.SERIALISER_FLAVOR.getFlavors()); // Test for the correct flavor on the first 100 lines return flavor; } } diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java index 2251d1d6..d93769c0 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java @@ -12,6 +12,7 @@ import java.util.regex.Pattern; import com.dselent.bigarraylist.BigArrayList; +import com.minecrafttas.mctcommon.registry.Registerable; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.CommentContainer; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickContainer; import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand; @@ -19,13 +20,13 @@ import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandExtension; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata; import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackLoadException; -import com.minecrafttas.tasmod.util.TASmodRegistry; +import com.minecrafttas.tasmod.registries.TASmodAPIRegistry; import com.minecrafttas.tasmod.virtual.VirtualCameraAngle; import com.minecrafttas.tasmod.virtual.VirtualKey; import com.minecrafttas.tasmod.virtual.VirtualKeyboard; import com.minecrafttas.tasmod.virtual.VirtualMouse; -public abstract class SerialiserFlavorBase { +public abstract class SerialiserFlavorBase implements Registerable{ protected long currentLine = 1; @@ -41,9 +42,6 @@ public abstract class SerialiserFlavorBase { protected TickContainer previousTickContainer = null; - - public abstract String flavorName(); - protected String headerStart() { return createCenteredHeading("TASFile", '#', 50); } @@ -84,18 +82,18 @@ public List serialiseHeader() { } protected void serialiseFlavorName(List out) { - out.add("Flavor: " + flavorName()); + out.add("Flavor: " + getExtensionName()); } protected void serialiseFileCommandNames(List out) { List stringlist = new ArrayList<>(); - List extensionList = TASmodRegistry.PLAYBACK_FILE_COMMAND.getEnabled(); - extensionList.forEach(extension -> stringlist.add(extension.name())); + List extensionList = TASmodAPIRegistry.PLAYBACK_FILE_COMMAND.getEnabled(); + extensionList.forEach(extension -> stringlist.add(extension.getExtensionName())); out.add("FileCommand-Extensions: " + String.join(", ", stringlist)); } protected void serialiseMetadata(List out) { - List metadataList = TASmodRegistry.PLAYBACK_METADATA.handleOnStore(); + List metadataList = TASmodAPIRegistry.PLAYBACK_METADATA.handleOnStore(); for (PlaybackMetadata metadata : metadataList) { serialiseMetadataName(out, metadata.getExtensionName()); @@ -129,8 +127,8 @@ protected void serialiseContainer(BigArrayList out, TickContainer contai List serialisedMouse = serialiseMouse(container.getMouse()); List serialisedCameraAngle = serialiseCameraAngle(container.getCameraAngle()); - PlaybackFileCommandContainer fileCommandsInline = TASmodRegistry.PLAYBACK_FILE_COMMAND.handleOnSerialiseInline(currentTick, container); - PlaybackFileCommandContainer fileCommandsEndline = TASmodRegistry.PLAYBACK_FILE_COMMAND.handleOnSerialiseEndline(currentTick, container); + PlaybackFileCommandContainer fileCommandsInline = TASmodAPIRegistry.PLAYBACK_FILE_COMMAND.handleOnSerialiseInline(currentTick, container); + PlaybackFileCommandContainer fileCommandsEndline = TASmodAPIRegistry.PLAYBACK_FILE_COMMAND.handleOnSerialiseEndline(currentTick, container); CommentContainer comments = container.getComments(); if (comments == null) { @@ -312,7 +310,7 @@ protected String joinNotEmpty(String delimiter, String... args) { public boolean deserialiseFlavorName(List headerLines) { for (String line : headerLines) { - Matcher matcher = extract("^Flavor: " + flavorName(), line); + Matcher matcher = extract("^Flavor: " + getExtensionName(), line); if (matcher.find()) { return true; @@ -351,7 +349,7 @@ protected void deserialiseFileCommandNames(List headerLines) { String extensionStrings = matcher.group(1); String[] extensionNames = extensionStrings.split(", ?"); - TASmodRegistry.PLAYBACK_FILE_COMMAND.setEnabled(Arrays.asList(extensionNames)); + TASmodAPIRegistry.PLAYBACK_FILE_COMMAND.setEnabled(Arrays.asList(extensionNames)); return; } } @@ -388,7 +386,7 @@ protected void deserialiseMetadata(List headerLines) { if (metadataName != null) out.add(PlaybackMetadata.fromHashMap(metadataName, values)); - TASmodRegistry.PLAYBACK_METADATA.handleOnLoad(out); + TASmodAPIRegistry.PLAYBACK_METADATA.handleOnLoad(out); } /** @@ -595,8 +593,8 @@ protected void deserialiseContainer(BigArrayList out, List void pruneListEnd(List list){ public boolean equals(Object obj) { if(obj instanceof SerialiserFlavorBase) { SerialiserFlavorBase flavor = (SerialiserFlavorBase) obj; - return this.flavorName().equals(flavor.flavorName()); + return this.getExtensionName().equals(flavor.getExtensionName()); } return super.equals(obj); } diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorRegistry.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorRegistry.java index 56008dbd..f9ad7344 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorRegistry.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorRegistry.java @@ -6,7 +6,6 @@ import java.util.Set; import com.minecrafttas.mctcommon.registry.AbstractRegistry; -import com.minecrafttas.tasmod.TASmod; /** * Registry for registering custom PlaybackSerialisers.
    @@ -14,39 +13,10 @@ * * @author Scribble */ -public class SerialiserFlavorRegistry extends AbstractRegistry{ +public class SerialiserFlavorRegistry extends AbstractRegistry{ public SerialiserFlavorRegistry() { - super(new LinkedHashMap<>()); - } - - public void register(SerialiserFlavorBase flavor) { - if (flavor == null) { - throw new NullPointerException("Tried to register a serialiser flavor. But flavor is null."); - } - - if (containsClass(flavor)) { - TASmod.LOGGER.warn("Tried to register the serialiser flavor {}, but another instance of this class is already registered!", flavor.getClass().getName()); - return; - } - - if(REGISTRY.containsKey(flavor.flavorName())) { - TASmod.LOGGER.warn("Trying to register the serialiser flavor {}, but a flavor with the same name is already registered!", flavor.flavorName()); - return; - } - - REGISTRY.put(flavor.flavorName(), flavor); - } - - public void unregister(SerialiserFlavorBase flavor) { - if (flavor == null) { - throw new NullPointerException("Tried to unregister a flavor with value null"); - } - if (REGISTRY.containsKey(flavor.flavorName())) { - REGISTRY.remove(flavor.flavorName()); - } else { - TASmod.LOGGER.warn("Trying to unregister the flavor {}, but it was not registered!", flavor.getClass().getName()); - } + super("FLAVOR_REGISTRY", new LinkedHashMap<>()); } public Set getFlavorNames(){ diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/integrated/Beta1Flavor.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/integrated/Beta1Flavor.java index a8aa420e..39f5164c 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/integrated/Beta1Flavor.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/integrated/Beta1Flavor.java @@ -5,7 +5,7 @@ public class Beta1Flavor extends SerialiserFlavorBase { @Override - public String flavorName() { + public String getExtensionName() { return "beta1"; } diff --git a/src/main/java/com/minecrafttas/tasmod/util/TASmodRegistry.java b/src/main/java/com/minecrafttas/tasmod/registries/TASmodAPIRegistry.java similarity index 95% rename from src/main/java/com/minecrafttas/tasmod/util/TASmodRegistry.java rename to src/main/java/com/minecrafttas/tasmod/registries/TASmodAPIRegistry.java index 8c94a58a..f76b9e55 100644 --- a/src/main/java/com/minecrafttas/tasmod/util/TASmodRegistry.java +++ b/src/main/java/com/minecrafttas/tasmod/registries/TASmodAPIRegistry.java @@ -1,4 +1,4 @@ -package com.minecrafttas.tasmod.util; +package com.minecrafttas.tasmod.registries; import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommandsRegistry; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadataRegistry; @@ -6,7 +6,7 @@ import com.minecrafttas.tasmod.playback.tasfile.flavor.SerialiserFlavorRegistry; import com.minecrafttas.tasmod.playback.tasfile.flavor.integrated.Beta1Flavor; -public class TASmodRegistry { +public class TASmodAPIRegistry { /** * Registry for registering custom metadata that is stored in the TASFile.
    *
    diff --git a/src/main/java/com/minecrafttas/tasmod/registries/TASmodConfig.java b/src/main/java/com/minecrafttas/tasmod/registries/TASmodConfig.java new file mode 100644 index 00000000..a03016db --- /dev/null +++ b/src/main/java/com/minecrafttas/tasmod/registries/TASmodConfig.java @@ -0,0 +1,32 @@ +package com.minecrafttas.tasmod.registries; + +import com.minecrafttas.mctcommon.Configuration.ConfigOptions; + +public enum TASmodConfig implements ConfigOptions { + FileToOpen("fileToOpen", ""), + ServerConnection("serverConnection", ""); + + private String configKey; + private String defaultValue; + + private TASmodConfig(String configKey, String defaultValue) { + this.configKey = configKey; + this.defaultValue = defaultValue; + } + + @Override + public String getDefaultValue() { + return defaultValue; + } + + @Override + public String getConfigKey() { + return configKey; + } + + @Override + public String getExtensionName() { + return "TASmodConfig"; + } + +} diff --git a/src/main/java/com/minecrafttas/tasmod/util/TASmodKeybinds.java b/src/main/java/com/minecrafttas/tasmod/registries/TASmodKeybinds.java similarity index 97% rename from src/main/java/com/minecrafttas/tasmod/util/TASmodKeybinds.java rename to src/main/java/com/minecrafttas/tasmod/registries/TASmodKeybinds.java index 792e0f45..5abafea7 100644 --- a/src/main/java/com/minecrafttas/tasmod/util/TASmodKeybinds.java +++ b/src/main/java/com/minecrafttas/tasmod/registries/TASmodKeybinds.java @@ -1,4 +1,4 @@ -package com.minecrafttas.tasmod.util; +package com.minecrafttas.tasmod.registries; import org.lwjgl.input.Keyboard; @@ -6,7 +6,6 @@ import com.minecrafttas.mctcommon.KeybindManager.Keybind; import com.minecrafttas.tasmod.TASmodClient; import com.minecrafttas.tasmod.networking.TASmodBufferBuilder; -import com.minecrafttas.tasmod.networking.TASmodPackets; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TASstate; import com.minecrafttas.tasmod.virtual.VirtualKeybindings; diff --git a/src/main/java/com/minecrafttas/tasmod/networking/TASmodPackets.java b/src/main/java/com/minecrafttas/tasmod/registries/TASmodPackets.java similarity index 95% rename from src/main/java/com/minecrafttas/tasmod/networking/TASmodPackets.java rename to src/main/java/com/minecrafttas/tasmod/registries/TASmodPackets.java index 878eeeda..6308696b 100644 --- a/src/main/java/com/minecrafttas/tasmod/networking/TASmodPackets.java +++ b/src/main/java/com/minecrafttas/tasmod/registries/TASmodPackets.java @@ -1,12 +1,12 @@ -package com.minecrafttas.tasmod.networking; +package com.minecrafttas.tasmod.registries; -import com.minecrafttas.mctcommon.server.CompactPacketHandler; -import com.minecrafttas.mctcommon.server.Client.Side; -import com.minecrafttas.mctcommon.server.interfaces.PacketID; +import com.minecrafttas.mctcommon.networking.CompactPacketHandler; +import com.minecrafttas.mctcommon.networking.Client.Side; +import com.minecrafttas.mctcommon.networking.interfaces.PacketID; import com.minecrafttas.tasmod.commands.CommandFolder; import com.minecrafttas.tasmod.playback.PlaybackControllerClient; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TASstate; -import com.minecrafttas.tasmod.playback.tasfile.PlaybackSerialiser; +import com.minecrafttas.tasmod.playback.tasfile.PlaybackSerialiser2; import com.minecrafttas.tasmod.savestates.SavestateHandlerServer.PlayerHandler.MotionData; import com.minecrafttas.tasmod.tickratechanger.TickrateChangerServer.TickratePauseState; @@ -113,7 +113,7 @@ public enum TASmodPackets implements PacketID { */ PLAYBACK_RESTARTANDPLAY, /** - *

    Notifies the client to store the current inputs to a file in {@link PlaybackControllerClient}. This is done using {@link PlaybackSerialiser} + *

    Notifies the client to store the current inputs to a file in {@link PlaybackControllerClient}. This is done using {@link PlaybackSerialiser2} *

    SIDE: Both
    * ARGS:
    * Client->Server None
    @@ -121,7 +121,7 @@ public enum TASmodPackets implements PacketID { */ PLAYBACK_SAVE, /** - *

    Notifies the client to load the inputs from a file in {@link PlaybackControllerClient}. This is done using {@link PlaybackSerialiser} + *

    Notifies the client to load the inputs from a file in {@link PlaybackControllerClient}. This is done using {@link PlaybackSerialiser2} *

    SIDE: Both
    * ARGS:
    * Client->Server None
    @@ -256,4 +256,9 @@ public String getName() { public boolean shouldTrace() { return shouldTrace; } + + @Override + public String getExtensionName() { + return "TASmodPackets"; + } } diff --git a/src/main/java/com/minecrafttas/tasmod/savestates/SavestateHandlerClient.java b/src/main/java/com/minecrafttas/tasmod/savestates/SavestateHandlerClient.java index d5d82e37..4abff7fd 100644 --- a/src/main/java/com/minecrafttas/tasmod/savestates/SavestateHandlerClient.java +++ b/src/main/java/com/minecrafttas/tasmod/savestates/SavestateHandlerClient.java @@ -6,17 +6,17 @@ import java.io.IOException; import java.nio.ByteBuffer; -import com.minecrafttas.mctcommon.server.Client.Side; -import com.minecrafttas.mctcommon.server.exception.PacketNotImplementedException; -import com.minecrafttas.mctcommon.server.exception.WrongSideException; -import com.minecrafttas.mctcommon.server.interfaces.ClientPacketHandler; -import com.minecrafttas.mctcommon.server.interfaces.PacketID; +import com.minecrafttas.mctcommon.networking.Client.Side; +import com.minecrafttas.mctcommon.networking.exception.PacketNotImplementedException; +import com.minecrafttas.mctcommon.networking.exception.WrongSideException; +import com.minecrafttas.mctcommon.networking.interfaces.ClientPacketHandler; +import com.minecrafttas.mctcommon.networking.interfaces.PacketID; import com.minecrafttas.tasmod.TASmodClient; import com.minecrafttas.tasmod.mixin.savestates.MixinChunkProviderClient; import com.minecrafttas.tasmod.networking.TASmodBufferBuilder; -import com.minecrafttas.tasmod.networking.TASmodPackets; import com.minecrafttas.tasmod.playback.PlaybackControllerClient; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TASstate; +import com.minecrafttas.tasmod.registries.TASmodPackets; import com.minecrafttas.tasmod.savestates.SavestateHandlerServer.PlayerHandler.MotionData; import com.minecrafttas.tasmod.savestates.exceptions.SavestateException; import com.minecrafttas.tasmod.savestates.gui.GuiSavestateSavingScreen; diff --git a/src/main/java/com/minecrafttas/tasmod/savestates/SavestateHandlerServer.java b/src/main/java/com/minecrafttas/tasmod/savestates/SavestateHandlerServer.java index 23fd1d68..04004175 100644 --- a/src/main/java/com/minecrafttas/tasmod/savestates/SavestateHandlerServer.java +++ b/src/main/java/com/minecrafttas/tasmod/savestates/SavestateHandlerServer.java @@ -16,15 +16,16 @@ import java.util.regex.Pattern; import com.minecrafttas.mctcommon.events.EventListenerRegistry; +import com.minecrafttas.mctcommon.networking.Client.Side; +import com.minecrafttas.mctcommon.networking.exception.PacketNotImplementedException; +import com.minecrafttas.mctcommon.networking.exception.WrongSideException; +import com.minecrafttas.mctcommon.networking.interfaces.PacketID; +import com.minecrafttas.mctcommon.networking.interfaces.ServerPacketHandler; + import org.apache.commons.io.FileUtils; import org.apache.logging.log4j.Logger; import com.google.common.collect.Maps; -import com.minecrafttas.mctcommon.server.Client.Side; -import com.minecrafttas.mctcommon.server.exception.PacketNotImplementedException; -import com.minecrafttas.mctcommon.server.exception.WrongSideException; -import com.minecrafttas.mctcommon.server.interfaces.PacketID; -import com.minecrafttas.mctcommon.server.interfaces.ServerPacketHandler; import com.minecrafttas.tasmod.TASmod; import com.minecrafttas.tasmod.events.EventServer.EventCompleteLoadstate; import com.minecrafttas.tasmod.events.EventServer.EventLoadstate; @@ -33,7 +34,7 @@ import com.minecrafttas.tasmod.mixin.savestates.AccessorChunkLoader; import com.minecrafttas.tasmod.mixin.savestates.MixinChunkProviderServer; import com.minecrafttas.tasmod.networking.TASmodBufferBuilder; -import com.minecrafttas.tasmod.networking.TASmodPackets; +import com.minecrafttas.tasmod.registries.TASmodPackets; import com.minecrafttas.tasmod.savestates.SavestateHandlerServer.PlayerHandler.MotionData; import com.minecrafttas.tasmod.savestates.exceptions.LoadstateException; import com.minecrafttas.tasmod.savestates.exceptions.SavestateDeleteException; diff --git a/src/main/java/com/minecrafttas/tasmod/tickratechanger/TickrateChangerClient.java b/src/main/java/com/minecrafttas/tasmod/tickratechanger/TickrateChangerClient.java index 9363b006..3a9418e7 100644 --- a/src/main/java/com/minecrafttas/tasmod/tickratechanger/TickrateChangerClient.java +++ b/src/main/java/com/minecrafttas/tasmod/tickratechanger/TickrateChangerClient.java @@ -5,15 +5,15 @@ import java.nio.ByteBuffer; import com.minecrafttas.mctcommon.events.EventListenerRegistry; -import com.minecrafttas.mctcommon.server.Client.Side; -import com.minecrafttas.mctcommon.server.exception.PacketNotImplementedException; -import com.minecrafttas.mctcommon.server.exception.WrongSideException; -import com.minecrafttas.mctcommon.server.interfaces.ClientPacketHandler; -import com.minecrafttas.mctcommon.server.interfaces.PacketID; +import com.minecrafttas.mctcommon.networking.Client.Side; +import com.minecrafttas.mctcommon.networking.exception.PacketNotImplementedException; +import com.minecrafttas.mctcommon.networking.exception.WrongSideException; +import com.minecrafttas.mctcommon.networking.interfaces.ClientPacketHandler; +import com.minecrafttas.mctcommon.networking.interfaces.PacketID; import com.minecrafttas.tasmod.TASmodClient; import com.minecrafttas.tasmod.events.EventClient.EventClientTickrateChange; import com.minecrafttas.tasmod.networking.TASmodBufferBuilder; -import com.minecrafttas.tasmod.networking.TASmodPackets; +import com.minecrafttas.tasmod.registries.TASmodPackets; import com.minecrafttas.tasmod.tickratechanger.TickrateChangerServer.TickratePauseState; import com.minecrafttas.tasmod.util.LoggerMarkers; diff --git a/src/main/java/com/minecrafttas/tasmod/tickratechanger/TickrateChangerServer.java b/src/main/java/com/minecrafttas/tasmod/tickratechanger/TickrateChangerServer.java index c05ae665..c5053ccd 100644 --- a/src/main/java/com/minecrafttas/tasmod/tickratechanger/TickrateChangerServer.java +++ b/src/main/java/com/minecrafttas/tasmod/tickratechanger/TickrateChangerServer.java @@ -7,15 +7,15 @@ import com.minecrafttas.mctcommon.events.EventServer.EventPlayerJoinedServerSide; import com.minecrafttas.mctcommon.events.EventServer.EventServerStop; -import com.minecrafttas.mctcommon.server.Client.Side; -import com.minecrafttas.mctcommon.server.exception.PacketNotImplementedException; -import com.minecrafttas.mctcommon.server.exception.WrongSideException; -import com.minecrafttas.mctcommon.server.interfaces.PacketID; -import com.minecrafttas.mctcommon.server.interfaces.ServerPacketHandler; +import com.minecrafttas.mctcommon.networking.Client.Side; +import com.minecrafttas.mctcommon.networking.exception.PacketNotImplementedException; +import com.minecrafttas.mctcommon.networking.exception.WrongSideException; +import com.minecrafttas.mctcommon.networking.interfaces.PacketID; +import com.minecrafttas.mctcommon.networking.interfaces.ServerPacketHandler; import com.minecrafttas.tasmod.TASmod; import com.minecrafttas.tasmod.events.EventServer.EventServerTickrateChange; import com.minecrafttas.tasmod.networking.TASmodBufferBuilder; -import com.minecrafttas.tasmod.networking.TASmodPackets; +import com.minecrafttas.tasmod.registries.TASmodPackets; import com.minecrafttas.tasmod.util.LoggerMarkers; import net.minecraft.entity.player.EntityPlayerMP; diff --git a/src/main/java/com/minecrafttas/tasmod/ticksync/TickSyncClient.java b/src/main/java/com/minecrafttas/tasmod/ticksync/TickSyncClient.java index cb89d4bc..ffe0f005 100644 --- a/src/main/java/com/minecrafttas/tasmod/ticksync/TickSyncClient.java +++ b/src/main/java/com/minecrafttas/tasmod/ticksync/TickSyncClient.java @@ -5,12 +5,12 @@ import java.nio.ByteBuffer; import java.util.concurrent.atomic.AtomicBoolean; -import com.minecrafttas.mctcommon.server.interfaces.ClientPacketHandler; -import com.minecrafttas.mctcommon.server.interfaces.PacketID; +import com.minecrafttas.mctcommon.networking.interfaces.ClientPacketHandler; +import com.minecrafttas.mctcommon.networking.interfaces.PacketID; import com.minecrafttas.tasmod.TASmodClient; import com.minecrafttas.tasmod.events.EventClient.EventClientTickPost; import com.minecrafttas.tasmod.networking.TASmodBufferBuilder; -import com.minecrafttas.tasmod.networking.TASmodPackets; +import com.minecrafttas.tasmod.registries.TASmodPackets; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/minecrafttas/tasmod/ticksync/TickSyncServer.java b/src/main/java/com/minecrafttas/tasmod/ticksync/TickSyncServer.java index e870c16d..18d3ec4d 100644 --- a/src/main/java/com/minecrafttas/tasmod/ticksync/TickSyncServer.java +++ b/src/main/java/com/minecrafttas/tasmod/ticksync/TickSyncServer.java @@ -9,12 +9,12 @@ import java.util.List; import com.minecrafttas.mctcommon.events.EventServer.EventClientCompleteAuthentication; -import com.minecrafttas.mctcommon.server.interfaces.PacketID; -import com.minecrafttas.mctcommon.server.interfaces.ServerPacketHandler; +import com.minecrafttas.mctcommon.networking.interfaces.PacketID; +import com.minecrafttas.mctcommon.networking.interfaces.ServerPacketHandler; import com.minecrafttas.tasmod.TASmod; import com.minecrafttas.tasmod.events.EventServer.EventServerTickPost; import com.minecrafttas.tasmod.networking.TASmodBufferBuilder; -import com.minecrafttas.tasmod.networking.TASmodPackets; +import com.minecrafttas.tasmod.registries.TASmodPackets; import net.minecraft.server.MinecraftServer; diff --git a/src/test/java/mctcommon/TestConfiguration.java b/src/test/java/mctcommon/TestConfiguration.java index 846b6d18..70177b22 100644 --- a/src/test/java/mctcommon/TestConfiguration.java +++ b/src/test/java/mctcommon/TestConfiguration.java @@ -7,7 +7,6 @@ import java.io.File; import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -15,21 +14,46 @@ import com.minecrafttas.mctcommon.Configuration.ConfigOptions; class TestConfiguration { + + enum TestConfig implements ConfigOptions { + FileToOpen("fileToOpen", ""), + ServerConnection("serverConnection", ""); + + private String configKey; + private String defaultValue; + + private TestConfig(String configKey, String defaultValue) { + this.configKey = configKey; + this.defaultValue = defaultValue; + } + + @Override + public String getDefaultValue() { + return defaultValue; + } + + @Override + public String getConfigKey() { + return configKey; + } + + @Override + public String getExtensionName() { + return "TestConfig"; + } + } - private static Configuration config; + private Configuration config; private static final File configPath = new File("./config.xml"); - @BeforeAll - static void setUpBeforeClass() throws Exception { + @BeforeEach + void beforeEach() { config = new Configuration("Test config", configPath); + config.register(TestConfig.values()); + config.load(); } - @BeforeEach - void resetOptions() throws Exception { - config.reset(ConfigOptions.FileToOpen); - } - @AfterAll static void tearDownAfterClass() throws Exception { configPath.delete(); @@ -50,7 +74,9 @@ void testIfInitialized() { void testDefault() { configPath.delete(); config = new Configuration("Test config", configPath); - assertEquals("", config.get(ConfigOptions.FileToOpen)); + config.register(TestConfig.values()); + config.load(); + assertEquals("", config.get(TestConfig.FileToOpen)); } /** @@ -58,9 +84,11 @@ void testDefault() { */ @Test void testSavingAndLoading() { - config.set(ConfigOptions.FileToOpen, "Test"); + config.set(TestConfig.FileToOpen, "Test"); config = new Configuration("Test config", configPath); - assertEquals("Test", config.get(ConfigOptions.FileToOpen)); + config.register(TestConfig.values()); + config.load(); + assertEquals("Test", config.get(TestConfig.FileToOpen)); } /** @@ -68,8 +96,8 @@ void testSavingAndLoading() { */ @Test void testIntegers() { - config.set(ConfigOptions.FileToOpen, 3); - assertEquals(3, config.getInt(ConfigOptions.FileToOpen)); + config.set(TestConfig.FileToOpen, 3); + assertEquals(3, config.getInt(TestConfig.FileToOpen)); } /** @@ -77,8 +105,8 @@ void testIntegers() { */ @Test void testBooleans() { - config.set(ConfigOptions.FileToOpen, true); - assertEquals(true, config.getBoolean(ConfigOptions.FileToOpen)); + config.set(TestConfig.FileToOpen, true); + assertEquals(true, config.getBoolean(TestConfig.FileToOpen)); } /** @@ -86,8 +114,8 @@ void testBooleans() { */ @Test void testDeleteAndContains() { - config.delete(ConfigOptions.FileToOpen); - assertFalse(config.has(ConfigOptions.FileToOpen)); + config.delete(TestConfig.FileToOpen); + assertFalse(config.has(TestConfig.FileToOpen)); } /** @@ -95,7 +123,7 @@ void testDeleteAndContains() { */ @Test void resetToDefault() { - config.reset(ConfigOptions.FileToOpen); - assertEquals("", config.get(ConfigOptions.FileToOpen)); + config.reset(TestConfig.FileToOpen); + assertEquals("", config.get(TestConfig.FileToOpen)); } } diff --git a/src/test/java/mctcommon/server/ByteBufferBuilderTest.java b/src/test/java/mctcommon/server/ByteBufferBuilderTest.java index 8a78432f..dc3f5f02 100644 --- a/src/test/java/mctcommon/server/ByteBufferBuilderTest.java +++ b/src/test/java/mctcommon/server/ByteBufferBuilderTest.java @@ -10,10 +10,10 @@ import org.junit.jupiter.api.Test; -import com.minecrafttas.mctcommon.server.ByteBufferBuilder; -import com.minecrafttas.mctcommon.server.CompactPacketHandler; -import com.minecrafttas.mctcommon.server.Client.Side; -import com.minecrafttas.mctcommon.server.interfaces.PacketID; +import com.minecrafttas.mctcommon.networking.ByteBufferBuilder; +import com.minecrafttas.mctcommon.networking.CompactPacketHandler; +import com.minecrafttas.mctcommon.networking.Client.Side; +import com.minecrafttas.mctcommon.networking.interfaces.PacketID; class ByteBufferBuilderTest { @@ -58,6 +58,11 @@ public String getName() { public boolean shouldTrace() { return false; } + + @Override + public String getExtensionName() { + return "TestPackets"; + } } diff --git a/src/test/java/mctcommon/server/ServerTest.java b/src/test/java/mctcommon/server/ServerTest.java index 93459991..fc096cf4 100644 --- a/src/test/java/mctcommon/server/ServerTest.java +++ b/src/test/java/mctcommon/server/ServerTest.java @@ -15,17 +15,17 @@ import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; -import com.minecrafttas.mctcommon.server.ByteBufferBuilder; -import com.minecrafttas.mctcommon.server.Client; -import com.minecrafttas.mctcommon.server.CompactPacketHandler; -import com.minecrafttas.mctcommon.server.Client.Side; -import com.minecrafttas.mctcommon.server.PacketHandlerRegistry; -import com.minecrafttas.mctcommon.server.Server; -import com.minecrafttas.mctcommon.server.exception.PacketNotImplementedException; -import com.minecrafttas.mctcommon.server.exception.WrongSideException; -import com.minecrafttas.mctcommon.server.interfaces.ClientPacketHandler; -import com.minecrafttas.mctcommon.server.interfaces.PacketID; -import com.minecrafttas.mctcommon.server.interfaces.ServerPacketHandler; +import com.minecrafttas.mctcommon.networking.ByteBufferBuilder; +import com.minecrafttas.mctcommon.networking.Client; +import com.minecrafttas.mctcommon.networking.CompactPacketHandler; +import com.minecrafttas.mctcommon.networking.PacketHandlerRegistry; +import com.minecrafttas.mctcommon.networking.Server; +import com.minecrafttas.mctcommon.networking.Client.Side; +import com.minecrafttas.mctcommon.networking.exception.PacketNotImplementedException; +import com.minecrafttas.mctcommon.networking.exception.WrongSideException; +import com.minecrafttas.mctcommon.networking.interfaces.ClientPacketHandler; +import com.minecrafttas.mctcommon.networking.interfaces.PacketID; +import com.minecrafttas.mctcommon.networking.interfaces.ServerPacketHandler; /** * An integration test for the {@link Server} class by setting up a connection. @@ -87,6 +87,11 @@ public boolean shouldTrace() { return false; } + @Override + public String getExtensionName() { + return "TestPacketIds"; + } + } private static Client.Side side = null; diff --git a/src/test/java/tasmod/networking/TASmodByteBufferBuilderTest.java b/src/test/java/tasmod/networking/TASmodByteBufferBuilderTest.java index 7fd8ebb5..34a18a8b 100644 --- a/src/test/java/tasmod/networking/TASmodByteBufferBuilderTest.java +++ b/src/test/java/tasmod/networking/TASmodByteBufferBuilderTest.java @@ -10,9 +10,9 @@ import org.junit.jupiter.api.Test; -import com.minecrafttas.mctcommon.server.CompactPacketHandler; -import com.minecrafttas.mctcommon.server.Client.Side; -import com.minecrafttas.mctcommon.server.interfaces.PacketID; +import com.minecrafttas.mctcommon.networking.CompactPacketHandler; +import com.minecrafttas.mctcommon.networking.Client.Side; +import com.minecrafttas.mctcommon.networking.interfaces.PacketID; import com.minecrafttas.tasmod.networking.TASmodBufferBuilder; import net.minecraft.nbt.NBTTagCompound; @@ -57,6 +57,11 @@ public String getName() { public boolean shouldTrace() { return false; } + + @Override + public String getExtensionName() { + return "TestPacketIds"; + } } diff --git a/src/test/java/tasmod/playback/metadata/PlaybackMetadataRegistryTest.java b/src/test/java/tasmod/playback/metadata/PlaybackMetadataRegistryTest.java index 812ec563..8f0af818 100644 --- a/src/test/java/tasmod/playback/metadata/PlaybackMetadataRegistryTest.java +++ b/src/test/java/tasmod/playback/metadata/PlaybackMetadataRegistryTest.java @@ -14,7 +14,7 @@ import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadataRegistry.PlaybackMetadataExtension; -import com.minecrafttas.tasmod.util.TASmodRegistry; +import com.minecrafttas.tasmod.registries.TASmodAPIRegistry; public class PlaybackMetadataRegistryTest { @@ -57,7 +57,7 @@ public void onClear() { File file = new File("src/test/resources/metadata/MetadataRegistry.txt"); void store() { - List list = TASmodRegistry.PLAYBACK_METADATA.handleOnStore(); + List list = TASmodAPIRegistry.PLAYBACK_METADATA.handleOnStore(); List out = new ArrayList<>(); list.forEach(data -> { @@ -84,7 +84,7 @@ void load() { meta.add(PlaybackMetadata.fromStringList("Test1", loaded)); - TASmodRegistry.PLAYBACK_METADATA.handleOnLoad(meta); + TASmodAPIRegistry.PLAYBACK_METADATA.handleOnLoad(meta); } /** @@ -93,7 +93,7 @@ void load() { @Test void testRegistry() { Test1 actual = new Test1(); - TASmodRegistry.PLAYBACK_METADATA.register(actual); + TASmodAPIRegistry.PLAYBACK_METADATA.register(actual); store(); load(); @@ -106,6 +106,6 @@ void testRegistry() { @AfterAll static void afterAll() { - TASmodRegistry.PLAYBACK_METADATA.clear(); + TASmodAPIRegistry.PLAYBACK_METADATA.clear(); } } diff --git a/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java b/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java index facc1f36..7ffcd6b7 100644 --- a/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java +++ b/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java @@ -29,7 +29,7 @@ import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackLoadException; import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackSaveException; import com.minecrafttas.tasmod.playback.tasfile.flavor.SerialiserFlavorBase; -import com.minecrafttas.tasmod.util.TASmodRegistry; +import com.minecrafttas.tasmod.registries.TASmodAPIRegistry; import com.minecrafttas.tasmod.virtual.VirtualCameraAngle; import com.minecrafttas.tasmod.virtual.VirtualKey; import com.minecrafttas.tasmod.virtual.VirtualKeyboard; @@ -40,7 +40,7 @@ public class PlaybackSerialiserTest { private static class TestFlavor extends SerialiserFlavorBase { @Override - public String flavorName() { + public String getExtensionName() { return "Test"; } @@ -90,7 +90,7 @@ private static class TestFileCommand extends PlaybackFileCommandExtension { List endline = new ArrayList<>(); @Override - public String name() { + public String getExtensionName() { return "tasmod_testFileExtension"; } @@ -118,9 +118,9 @@ public String[] getFileCommandNames() { @BeforeAll static void register() { - TASmodRegistry.SERIALISER_FLAVOR.register(testFlavor); - TASmodRegistry.PLAYBACK_METADATA.register(testMetadata); - TASmodRegistry.PLAYBACK_FILE_COMMAND.register(testFileCommand); + TASmodAPIRegistry.SERIALISER_FLAVOR.register(testFlavor); + TASmodAPIRegistry.PLAYBACK_METADATA.register(testMetadata); + TASmodAPIRegistry.PLAYBACK_FILE_COMMAND.register(testFileCommand); } @AfterEach @@ -134,9 +134,9 @@ void afterEach() { @AfterAll static void unregister() { - TASmodRegistry.SERIALISER_FLAVOR.unregister(testFlavor); - TASmodRegistry.PLAYBACK_METADATA.unregister(testMetadata); - TASmodRegistry.PLAYBACK_FILE_COMMAND.unregister(testFileCommand); + TASmodAPIRegistry.SERIALISER_FLAVOR.unregister(testFlavor); + TASmodAPIRegistry.PLAYBACK_METADATA.unregister(testMetadata); + TASmodAPIRegistry.PLAYBACK_FILE_COMMAND.unregister(testFileCommand); } @Test @@ -146,7 +146,7 @@ void testSerialiser() { file = new File("src/test/resources/serialiser/PlaybackSerialiserTest.mctas"); testMetadata.testValue = "testing"; - TASmodRegistry.PLAYBACK_FILE_COMMAND.setEnabled("tasmod_testFileExtension", true); + TASmodAPIRegistry.PLAYBACK_FILE_COMMAND.setEnabled("tasmod_testFileExtension", true); // Tick 1 // Keyboard diff --git a/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java b/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java index cf25b759..a0560a49 100644 --- a/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java +++ b/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java @@ -22,7 +22,7 @@ import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadataRegistry.PlaybackMetadataExtension; import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackLoadException; import com.minecrafttas.tasmod.playback.tasfile.flavor.SerialiserFlavorBase; -import com.minecrafttas.tasmod.util.TASmodRegistry; +import com.minecrafttas.tasmod.registries.TASmodAPIRegistry; import com.minecrafttas.tasmod.virtual.VirtualCameraAngle; import com.minecrafttas.tasmod.virtual.VirtualKey; import com.minecrafttas.tasmod.virtual.VirtualKeyboard; @@ -32,9 +32,9 @@ public class SerialiserFlavorBaseTest extends SerialiserFlavorBase { @AfterEach void afterEach() { - TASmodRegistry.PLAYBACK_FILE_COMMAND.clear(); - TASmodRegistry.PLAYBACK_METADATA.clear(); - TASmodRegistry.SERIALISER_FLAVOR.clear(); + TASmodAPIRegistry.PLAYBACK_FILE_COMMAND.clear(); + TASmodAPIRegistry.PLAYBACK_METADATA.clear(); + TASmodAPIRegistry.SERIALISER_FLAVOR.clear(); this.currentTick = 0; this.currentSubtick = 0; @@ -42,7 +42,7 @@ void afterEach() { } @Override - public String flavorName() { + public String getExtensionName() { return "Test"; } @@ -140,8 +140,8 @@ public void onClear() { MetadataTest2 testmetadata2 = new MetadataTest2(); testmetadata2.testValue = "This is a second test"; - TASmodRegistry.PLAYBACK_METADATA.register(testmetadata1); - TASmodRegistry.PLAYBACK_METADATA.register(testmetadata2); + TASmodAPIRegistry.PLAYBACK_METADATA.register(testmetadata1); + TASmodAPIRegistry.PLAYBACK_METADATA.register(testmetadata2); List actual = new ArrayList<>(); serialiseMetadata(actual); @@ -156,8 +156,8 @@ public void onClear() { assertIterableEquals(expected, actual); assertEquals(0, currentTick); - TASmodRegistry.PLAYBACK_METADATA.unregister(testmetadata1); - TASmodRegistry.PLAYBACK_METADATA.unregister(testmetadata2); + TASmodAPIRegistry.PLAYBACK_METADATA.unregister(testmetadata1); + TASmodAPIRegistry.PLAYBACK_METADATA.unregister(testmetadata2); } @Test @@ -166,7 +166,7 @@ void testSerialiseFileCommandNames() { class TestFileCommand extends PlaybackFileCommandExtension { @Override - public String name() { + public String getExtensionName() { return "tasmod_testFileCommand"; } @@ -177,8 +177,8 @@ public String[] getFileCommandNames() { } TestFileCommand fc = new TestFileCommand(); - TASmodRegistry.PLAYBACK_FILE_COMMAND.register(fc); - TASmodRegistry.PLAYBACK_FILE_COMMAND.setEnabled("tasmod_testFileCommand", true); + TASmodAPIRegistry.PLAYBACK_FILE_COMMAND.register(fc); + TASmodAPIRegistry.PLAYBACK_FILE_COMMAND.setEnabled("tasmod_testFileCommand", true); List actual = new ArrayList<>(); serialiseFileCommandNames(actual); @@ -440,8 +440,8 @@ public void onClear() { GeneralMetadata general = new GeneralMetadata(); StartPositionMetadata startPosition = new StartPositionMetadata(); - TASmodRegistry.PLAYBACK_METADATA.register(general); - TASmodRegistry.PLAYBACK_METADATA.register(startPosition); + TASmodAPIRegistry.PLAYBACK_METADATA.register(general); + TASmodAPIRegistry.PLAYBACK_METADATA.register(startPosition); List lines = new ArrayList<>(); lines.add("### General"); @@ -481,7 +481,7 @@ void testDeserialiseFileCommandNames() { class Test1 extends PlaybackFileCommandExtension{ @Override - public String name() { + public String getExtensionName() { return "tasmod_test1"; } @@ -495,7 +495,7 @@ public String[] getFileCommandNames() { class Test2 extends PlaybackFileCommandExtension { @Override - public String name() { + public String getExtensionName() { return "tasmod_test2"; } @@ -509,8 +509,8 @@ public String[] getFileCommandNames() { Test1 test1 = new Test1(); Test2 test2 = new Test2(); - TASmodRegistry.PLAYBACK_FILE_COMMAND.register(test1); - TASmodRegistry.PLAYBACK_FILE_COMMAND.register(test2); + TASmodAPIRegistry.PLAYBACK_FILE_COMMAND.register(test1); + TASmodAPIRegistry.PLAYBACK_FILE_COMMAND.register(test2); List lines = new ArrayList<>(); lines.add("FileCommand-Extensions: tasmod_test1, tasmod_test2"); diff --git a/src/test/java/tasmod/playback/tasfile/integrated/BetaFlavorTest.java b/src/test/java/tasmod/playback/tasfile/integrated/BetaFlavorTest.java index 3c0f23b6..48089694 100644 --- a/src/test/java/tasmod/playback/tasfile/integrated/BetaFlavorTest.java +++ b/src/test/java/tasmod/playback/tasfile/integrated/BetaFlavorTest.java @@ -8,7 +8,7 @@ import com.minecrafttas.tasmod.playback.tasfile.PlaybackSerialiser2; import com.minecrafttas.tasmod.playback.tasfile.flavor.integrated.Beta1Flavor; -import com.minecrafttas.tasmod.util.TASmodRegistry; +import com.minecrafttas.tasmod.registries.TASmodAPIRegistry; public class BetaFlavorTest { From f610827e3f5fa50edc4c8e1100e32c037318d841 Mon Sep 17 00:00:00 2001 From: Scribble Date: Wed, 3 Jul 2024 19:20:47 +0200 Subject: [PATCH 66/79] [PlaybackSerialiser] Added stopIndex to serialiser - This will only store files up to the stop index for savestate purposes --- .../com/minecrafttas/tasmod/TASmodClient.java | 2 - .../playback/PlaybackControllerClient.java | 2 - .../playback/tasfile/PlaybackSerialiser2.java | 14 +++-- .../tasfile/flavor/SerialiserFlavorBase.java | 54 ++++++++++--------- .../savestates/SavestateHandlerClient.java | 9 ++-- 5 files changed, 45 insertions(+), 36 deletions(-) diff --git a/src/main/java/com/minecrafttas/tasmod/TASmodClient.java b/src/main/java/com/minecrafttas/tasmod/TASmodClient.java index 0e6f9596..9b15640a 100644 --- a/src/main/java/com/minecrafttas/tasmod/TASmodClient.java +++ b/src/main/java/com/minecrafttas/tasmod/TASmodClient.java @@ -58,8 +58,6 @@ public class TASmodClient implements ClientModInitializer, EventClientInit, Even public static TickSyncClient ticksyncClient; - public static PlaybackSerialiser serialiser = new PlaybackSerialiser(); - public static final String tasdirectory = Minecraft.getMinecraft().mcDataDir.getAbsolutePath() + File.separator + "saves" + File.separator + "tasfiles"; public static final String savestatedirectory = Minecraft.getMinecraft().mcDataDir.getAbsolutePath() + File.separator + "saves" + File.separator + "savestates"; diff --git a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java index 7e58b0f8..afc89a5e 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java @@ -446,7 +446,6 @@ private void playbackNextTick() { EventListenerRegistry.fireEvent(EventPlaybackTick.class, index, container); } -// desyncMonitor.playMonitor(index); } // ===================================================================================================== // Methods to manipulate inputs @@ -475,7 +474,6 @@ public void setInputs(BigArrayList inputs) { } this.inputs = new BigArrayList(directory + File.separator + "temp"); SerialiserFlavorBase.addAll(this.inputs, inputs); - index = 0; } public void setIndex(int index) throws IndexOutOfBoundsException { diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java index 607e8661..391aa995 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java @@ -28,6 +28,10 @@ public class PlaybackSerialiser2 { private static String defaultFlavor = "beta1"; + public static void saveToFile(File file, PlaybackControllerClient controller, String flavorname) throws PlaybackSaveException { + saveToFile(file, controller, flavorname, -1L); + } + /** * Saves the {@link PlaybackControllerClient} to a file * @@ -36,14 +40,18 @@ public class PlaybackSerialiser2 { * @param flavor * @throws FileNotFoundException */ - public static void saveToFile(File file, PlaybackControllerClient controller, String flavorname) throws PlaybackSaveException { + public static void saveToFile(File file, PlaybackControllerClient controller, String flavorname, long stopIndex) throws PlaybackSaveException { if (controller == null) { throw new PlaybackSaveException("Save to file failed. No controller specified"); } - saveToFile(file, controller.getInputs(), flavorname); + saveToFile(file, controller.getInputs(), flavorname, stopIndex); } public static void saveToFile(File file, BigArrayList container, String flavorname) throws PlaybackSaveException { + saveToFile(file, container, flavorname, -1); + } + + public static void saveToFile(File file, BigArrayList container, String flavorname, long stopIndex) throws PlaybackSaveException { if (file == null) { throw new PlaybackSaveException("Save to file failed. No file specified"); } @@ -75,7 +83,7 @@ public static void saveToFile(File file, BigArrayList container, writerThread.addLine(line); } - BigArrayList tickLines = flavor.serialise(container); + BigArrayList tickLines = flavor.serialise(container, stopIndex); for (long i = 0; i < tickLines.size(); i++) { writerThread.addLine(tickLines.get(i)); } diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java index d93769c0..04aca42a 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java @@ -26,10 +26,10 @@ import com.minecrafttas.tasmod.virtual.VirtualKeyboard; import com.minecrafttas.tasmod.virtual.VirtualMouse; -public abstract class SerialiserFlavorBase implements Registerable{ +public abstract class SerialiserFlavorBase implements Registerable { protected long currentLine = 1; - + /** * The current tick that is being serialised or deserialised */ @@ -39,7 +39,7 @@ public abstract class SerialiserFlavorBase implements Registerable{ * Debug subtick field for error handling */ protected int currentSubtick = 0; - + protected TickContainer previousTickContainer = null; protected String headerStart() { @@ -111,10 +111,13 @@ protected void serialiseMetadataValue(List out, LinkedHashMap serialise(BigArrayList inputs) { + public BigArrayList serialise(BigArrayList inputs, long toTick) { BigArrayList out = new BigArrayList<>(); for (int i = 0; i < inputs.size(); i++) { + if (toTick == i) { + break; + } currentTick = i; TickContainer container = inputs.get(i); serialiseContainer(out, container); @@ -583,9 +586,9 @@ protected void deserialiseContainer(BigArrayList out, List> endlineFileCommands = new ArrayList<>(); splitInputs(containerLines, keyboardStrings, mouseStrings, cameraAngleStrings, endlineComments, endlineFileCommands); - + pruneListEnd(endlineComments); - + VirtualKeyboard keyboard = deserialiseKeyboard(keyboardStrings); VirtualMouse mouse = deserialiseMouse(mouseStrings); VirtualCameraAngle cameraAngle = deserialiseCameraAngle(cameraAngleStrings); @@ -717,14 +720,14 @@ protected VirtualCameraAngle deserialiseCameraAngle(List cameraAngleStri if (matcher.find()) { String cameraPitchString = matcher.group(1); String cameraYawString = matcher.group(2); - + Float cameraPitch = null; Float cameraYaw = null; - - if(!"null".equals(cameraPitchString)) + + if (!"null".equals(cameraPitchString)) cameraPitch = deserialiseRelativeFloat("camera pitch", cameraPitchString, previousPitch); - - if(!"null".equals(cameraYawString)) + + if (!"null".equals(cameraYawString)) cameraYaw = deserialiseRelativeFloat("camera yaw", cameraYawString, previousYaw); out.updateFromState(cameraPitch, cameraYaw); @@ -794,10 +797,10 @@ protected float parseFloat(String name, String floatstring) { } protected Float deserialiseRelativeFloat(String name, String floatstring, Float previous) { - if(floatstring == null) { + if (floatstring == null) { return null; } - + float out = 0; if (floatstring.startsWith("~")) { floatstring = floatstring.replace("~", ""); @@ -828,15 +831,15 @@ protected void splitInputs(List lines, List serialisedKeyboard, if (!tickMatcher.group(3).isEmpty()) { serialisedCameraAngle.add(tickMatcher.group(3)); } - + List deserialisedFileCommands = new ArrayList<>(); - + String endlineComment = line.substring(tickMatcher.group(0).length()); commentsAtEnd.add(deserialiseEndlineComment(endlineComment, deserialisedFileCommands)); - + if (deserialisedFileCommands.isEmpty()) deserialisedFileCommands = null; - + endlineFileCommands.add(deserialisedFileCommands); } } @@ -920,28 +923,29 @@ public static void addAll(BigArrayList list, List list.add(element); } } - + /** * Empties the list if it only consists of null values - * @param The element of the list + * + * @param The element of the list * @param list The list to prune */ - protected void pruneListEnd(List list){ + protected void pruneListEnd(List list) { List copy = new ArrayList<>(list); - for (int i = copy.size()-1; i >=0; i--) { + for (int i = copy.size() - 1; i >= 0; i--) { T element = copy.get(i); - if(element != null) + if (element != null) return; - list.remove(list.size()-1); + list.remove(list.size() - 1); } } @Override public abstract SerialiserFlavorBase clone(); - + @Override public boolean equals(Object obj) { - if(obj instanceof SerialiserFlavorBase) { + if (obj instanceof SerialiserFlavorBase) { SerialiserFlavorBase flavor = (SerialiserFlavorBase) obj; return this.getExtensionName().equals(flavor.getExtensionName()); } diff --git a/src/main/java/com/minecrafttas/tasmod/savestates/SavestateHandlerClient.java b/src/main/java/com/minecrafttas/tasmod/savestates/SavestateHandlerClient.java index 4abff7fd..67e828be 100644 --- a/src/main/java/com/minecrafttas/tasmod/savestates/SavestateHandlerClient.java +++ b/src/main/java/com/minecrafttas/tasmod/savestates/SavestateHandlerClient.java @@ -16,6 +16,7 @@ import com.minecrafttas.tasmod.networking.TASmodBufferBuilder; import com.minecrafttas.tasmod.playback.PlaybackControllerClient; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TASstate; +import com.minecrafttas.tasmod.playback.tasfile.PlaybackSerialiser2; import com.minecrafttas.tasmod.registries.TASmodPackets; import com.minecrafttas.tasmod.savestates.SavestateHandlerServer.PlayerHandler.MotionData; import com.minecrafttas.tasmod.savestates.exceptions.SavestateException; @@ -121,9 +122,9 @@ public static void savestate(String nameOfSavestate) throws SavestateException, PlaybackControllerClient container = TASmodClient.controller; if (container.isRecording()) { - TASmodClient.serialiser.saveToFileV1(targetfile, container); // If the container is recording, store it entirely + PlaybackSerialiser2.saveToFile(targetfile, container, ""); // If the container is recording, store it entirely } else if (container.isPlayingback()) { - TASmodClient.serialiser.saveToFileV1Until(targetfile, container, container.index()); // If the container is playing, store it until the current index + PlaybackSerialiser2.saveToFile(targetfile, container, "", container.index()); // If the container is playing, store it until the current index } } @@ -135,7 +136,7 @@ public static void savestate(String nameOfSavestate) throws SavestateException, * @param nameOfSavestate coming from the server * @throws IOException */ - public static void loadstate(String nameOfSavestate) throws IOException { + public static void loadstate(String nameOfSavestate) throws Exception { LOGGER.debug(LoggerMarkers.Savestate, "Loading client savestate {}", nameOfSavestate); if (nameOfSavestate.isEmpty()) { LOGGER.error(LoggerMarkers.Savestate, "No recording savestate loaded since the name of savestate is empty"); @@ -150,7 +151,7 @@ public static void loadstate(String nameOfSavestate) throws IOException { if (!container.isNothingPlaying()) { // If the file exists and the container is recording or playing, load the // clientSavestate if (targetfile.exists()) { -// TASmodClient.virtual.loadClientSavestate(TASmodClient.serialiser.fromEntireFileV1(targetfile)); TODO Move to PlaybackController + TASmodClient.controller.setInputs(PlaybackSerialiser2.loadFromFile(targetfile)); } else { TASmodClient.controller.setTASStateClient(TASstate.NONE, false); Minecraft.getMinecraft().player.sendMessage(new TextComponentString(ChatFormatting.YELLOW + "Inputs could not be loaded for this savestate,")); From bb8cfca528ad5796eb71fc1bff5c8297c7e9375c Mon Sep 17 00:00:00 2001 From: Scribble Date: Wed, 3 Jul 2024 19:40:18 +0200 Subject: [PATCH 67/79] [Events] Split EvenServer and EventClient into more sub events - Added EventSavestate, EventVirtualInput, EventTickratechanger --- .../tasmod/events/EventClient.java | 73 ------------------- .../tasmod/events/EventPlaybackClient.java | 8 +- .../tasmod/events/EventSavestate.java | 53 ++++++++++++++ .../tasmod/events/EventServer.java | 62 +--------------- .../tasmod/events/EventTickratechanger.java | 31 ++++++++ .../tasmod/events/EventVirtualInput.java | 68 +++++++++++++++++ .../playback/PlaybackControllerClient.java | 11 +-- .../savestates/SavestateHandlerServer.java | 13 ++-- .../TickrateChangerClient.java | 5 +- .../TickrateChangerServer.java | 5 +- .../tasmod/virtual/VirtualInput.java | 13 ++-- .../java/tasmod/virtual/VirtualInputTest.java | 13 ++-- 12 files changed, 191 insertions(+), 164 deletions(-) create mode 100644 src/main/java/com/minecrafttas/tasmod/events/EventSavestate.java create mode 100644 src/main/java/com/minecrafttas/tasmod/events/EventTickratechanger.java create mode 100644 src/main/java/com/minecrafttas/tasmod/events/EventVirtualInput.java diff --git a/src/main/java/com/minecrafttas/tasmod/events/EventClient.java b/src/main/java/com/minecrafttas/tasmod/events/EventClient.java index 4314ce50..8cc771e4 100644 --- a/src/main/java/com/minecrafttas/tasmod/events/EventClient.java +++ b/src/main/java/com/minecrafttas/tasmod/events/EventClient.java @@ -1,12 +1,6 @@ package com.minecrafttas.tasmod.events; import com.minecrafttas.mctcommon.events.EventListenerRegistry.EventBase; -import com.minecrafttas.tasmod.virtual.VirtualCameraAngle; -import com.minecrafttas.tasmod.virtual.VirtualInput.VirtualCameraAngleInput; -import com.minecrafttas.tasmod.virtual.VirtualInput.VirtualKeyboardInput; -import com.minecrafttas.tasmod.virtual.VirtualInput.VirtualMouseInput; -import com.minecrafttas.tasmod.virtual.VirtualKeyboard; -import com.minecrafttas.tasmod.virtual.VirtualMouse; import net.minecraft.client.Minecraft; @@ -39,71 +33,4 @@ public static interface EventClientTickPost extends EventBase { */ public void onClientTickPost(Minecraft mc); } - - /** - * Fired when the tickrate changes on the client side - */ - @FunctionalInterface - public static interface EventClientTickrateChange extends EventBase { - - /** - * Fired at the end of a client tick - */ - public void onClientTickrateChange(float tickrate); - } - - - /** - * Fired when the {@link VirtualKeyboardInput#currentKeyboard} is updated - * - * @see VirtualKeyboardInput#nextKeyboardTick() - */ - @FunctionalInterface - public static interface EventVirtualKeyboardTick extends EventBase { - - /** - * Fired when the {@link VirtualKeyboard} ticks - * - * @param vkeyboard The {@link VirtualKeyboardInput#nextKeyboard} that is supposed to be pressed - * @returns The redirected keyboard - * @see VirtualKeyboardInput#nextKeyboardTick() - */ - public VirtualKeyboard onVirtualKeyboardTick(VirtualKeyboard vkeyboard); - } - - /** - * Fired when the {@link VirtualMouseInput#currentMouse} is updated - * - * @see VirtualMouseInput#nextMouseTick() - */ - @FunctionalInterface - public static interface EventVirtualMouseTick extends EventBase { - - /** - * Fired when the {@link VirtualMouseInput#currentMouse} is updated - * - * @param vmouse The {@link VirtualMouseInput#nextMouse} that is supposed to be pressed - * @returns The redirected mouse - * @see VirtualMouseInput#nextMouseTick() - */ - public VirtualMouse onVirtualMouseTick(VirtualMouse vmouse); - } - - /** - * Fired when the {@link VirtualCameraAngleInput#currentCameraAngle} is updated - * - * @see VirtualCameraAngleInput#nextCameraTick() - */ - @FunctionalInterface - public static interface EventVirtualCameraAngleTick extends EventBase { - - /** - * Fired when the {@link VirtualCameraAngleInput#currentCameraAngle} is updated - * - * @param vcamera The {@link VirtualCameraAngleInput#nextCameraAngle} - * @returns The redirected cameraAngle - * @see VirtualCameraAngleInput#nextCameraTick() - */ - public VirtualCameraAngle onVirtualCameraTick(VirtualCameraAngle vcamera); - } } diff --git a/src/main/java/com/minecrafttas/tasmod/events/EventPlaybackClient.java b/src/main/java/com/minecrafttas/tasmod/events/EventPlaybackClient.java index 5452b7c1..8608d9d1 100644 --- a/src/main/java/com/minecrafttas/tasmod/events/EventPlaybackClient.java +++ b/src/main/java/com/minecrafttas/tasmod/events/EventPlaybackClient.java @@ -9,8 +9,8 @@ public interface EventPlaybackClient { /** * Fired when - * {@link PlaybackControllerClient#setTASStateClient(com.minecrafttas.tasmod.playback.PlaybackControllerClient.TASstate, boolean) PlaybackControllerClient#setTASStateClient} - * is called + * {@link PlaybackControllerClient#setTASStateClient(com.minecrafttas.tasmod.playback.PlaybackControllerClient.TASstate, boolean) + * PlaybackControllerClient#setTASStateClient} is called */ @FunctionalInterface public interface EventControllerStateChange extends EventBase { @@ -72,13 +72,13 @@ public interface EventPlaybackTick extends EventBase { */ public void onPlaybackTick(long index, TickContainer container); } - + /** * Fired when a recording is cleared */ @FunctionalInterface public interface EventRecordClear extends EventBase { - + /** * Fired when a recording is cleared */ diff --git a/src/main/java/com/minecrafttas/tasmod/events/EventSavestate.java b/src/main/java/com/minecrafttas/tasmod/events/EventSavestate.java new file mode 100644 index 00000000..94409594 --- /dev/null +++ b/src/main/java/com/minecrafttas/tasmod/events/EventSavestate.java @@ -0,0 +1,53 @@ +package com.minecrafttas.tasmod.events; + +import java.io.File; + +import com.minecrafttas.mctcommon.events.EventListenerRegistry.EventBase; + +public interface EventSavestate { + + /** + * Fired when saving a savestate, before the savestate folder is copied + */ + @FunctionalInterface + interface EventServerSavestate extends EventBase { + + /** + * Fired when saving a savestate, before the savestate folder is copied + * + * @param index The savestate index for this savestate + * @param target Target folder, where the savestate is copied to + * @param current The current folder that will be copied from + */ + public void onServerSavestate(int index, File target, File current); + } + + /** + * Fired when loading a savestate, before the savestate folder is copied + */ + @FunctionalInterface + interface EventServerLoadstate extends EventBase { + + /** + * Fired when loading a savestate, before the savestate folder is copied + * + * @param index The savestate index for this loadstate + * @param target Target folder, where the savestate is copied to + * @param current The current folder that will be copied from + */ + public void onServerLoadstate(int index, File target, File current); + } + + /** + * Fired one tick after a loadstate was carried out + */ + @FunctionalInterface + interface EventServerCompleteLoadstate extends EventBase { + + /** + * Fired one tick after a loadstate was carried out + */ + public void onServerLoadstateComplete(); + } + +} diff --git a/src/main/java/com/minecrafttas/tasmod/events/EventServer.java b/src/main/java/com/minecrafttas/tasmod/events/EventServer.java index a3c15f63..7ddf8fad 100644 --- a/src/main/java/com/minecrafttas/tasmod/events/EventServer.java +++ b/src/main/java/com/minecrafttas/tasmod/events/EventServer.java @@ -3,80 +3,22 @@ import com.minecrafttas.mctcommon.events.EventListenerRegistry.EventBase; import net.minecraft.server.MinecraftServer; -import java.io.File; - /** * TASmod specific events fired on the server side * * @author Scribble */ public interface EventServer { - - /** - * Fired when saving a savestate, before the savestate folder is copied - */ - @FunctionalInterface - public static interface EventSavestate extends EventBase { - - /** - * Fired when saving a savestate, before the savestate folder is copied - * @param index The savestate index for this savestate - * @param target Target folder, where the savestate is copied to - * @param current The current folder that will be copied from - */ - public void onSavestateEvent(int index, File target, File current); - } - - /** - * Fired when loading a savestate, before the savestate folder is copied - */ - @FunctionalInterface - public static interface EventLoadstate extends EventBase { - - /** - * Fired when loading a savestate, before the savestate folder is copied - * @param index The savestate index for this loadstate - * @param target Target folder, where the savestate is copied to - * @param current The current folder that will be copied from - */ - public void onLoadstateEvent(int index, File target, File current); - } - - /** - * Fired one tick after a loadstate was carried out - */ - @FunctionalInterface - public static interface EventCompleteLoadstate extends EventBase{ - - /** - * Fired one tick after a loadstate was carried out - */ - public void onLoadstateComplete(); - } - /** * Fired at the end of a server tick */ @FunctionalInterface - public static interface EventServerTickPost extends EventBase{ - + public static interface EventServerTickPost extends EventBase { + /** * Fired at the end of a server tick */ public void onServerTickPost(MinecraftServer minecraftServer); } - - - /** - * Fired when the tickrate changes on the server side - */ - @FunctionalInterface - public static interface EventServerTickrateChange extends EventBase{ - - /** - * Fired at the end of a client tick - */ - public void onServerTickrateChange(float tickrate); - } } diff --git a/src/main/java/com/minecrafttas/tasmod/events/EventTickratechanger.java b/src/main/java/com/minecrafttas/tasmod/events/EventTickratechanger.java new file mode 100644 index 00000000..bae1cba4 --- /dev/null +++ b/src/main/java/com/minecrafttas/tasmod/events/EventTickratechanger.java @@ -0,0 +1,31 @@ +package com.minecrafttas.tasmod.events; + +import com.minecrafttas.mctcommon.events.EventListenerRegistry.EventBase; + +public interface EventTickratechanger { + + /** + * Fired when the tickrate changes on the client side + */ + @FunctionalInterface + interface EventClientTickrateChange extends EventBase { + + /** + * Fired at the end of a client tick + */ + public void onClientTickrateChange(float tickrate); + } + + /** + * Fired when the tickrate changes on the server side + */ + @FunctionalInterface + interface EventServerTickrateChange extends EventBase { + + /** + * Fired at the end of a client tick + */ + public void onServerTickrateChange(float tickrate); + } + +} diff --git a/src/main/java/com/minecrafttas/tasmod/events/EventVirtualInput.java b/src/main/java/com/minecrafttas/tasmod/events/EventVirtualInput.java new file mode 100644 index 00000000..0aa52aa5 --- /dev/null +++ b/src/main/java/com/minecrafttas/tasmod/events/EventVirtualInput.java @@ -0,0 +1,68 @@ +package com.minecrafttas.tasmod.events; + +import com.minecrafttas.mctcommon.events.EventListenerRegistry.EventBase; +import com.minecrafttas.tasmod.virtual.VirtualCameraAngle; +import com.minecrafttas.tasmod.virtual.VirtualInput.VirtualCameraAngleInput; +import com.minecrafttas.tasmod.virtual.VirtualInput.VirtualKeyboardInput; +import com.minecrafttas.tasmod.virtual.VirtualInput.VirtualMouseInput; +import com.minecrafttas.tasmod.virtual.VirtualKeyboard; +import com.minecrafttas.tasmod.virtual.VirtualMouse; + +public interface EventVirtualInput { + + /** + * Fired when the {@link VirtualKeyboardInput#currentKeyboard} is updated + * + * @see VirtualKeyboardInput#nextKeyboardTick() + */ + @FunctionalInterface + interface EventVirtualKeyboardTick extends EventBase { + + /** + * Fired when the {@link VirtualKeyboard} ticks + * + * @param vkeyboard The {@link VirtualKeyboardInput#nextKeyboard} that is + * supposed to be pressed + * @returns The redirected keyboard + * @see VirtualKeyboardInput#nextKeyboardTick() + */ + public VirtualKeyboard onVirtualKeyboardTick(VirtualKeyboard vkeyboard); + } + + /** + * Fired when the {@link VirtualMouseInput#currentMouse} is updated + * + * @see VirtualMouseInput#nextMouseTick() + */ + @FunctionalInterface + interface EventVirtualMouseTick extends EventBase { + + /** + * Fired when the {@link VirtualMouseInput#currentMouse} is updated + * + * @param vmouse The {@link VirtualMouseInput#nextMouse} that is supposed to be + * pressed + * @returns The redirected mouse + * @see VirtualMouseInput#nextMouseTick() + */ + public VirtualMouse onVirtualMouseTick(VirtualMouse vmouse); + } + + /** + * Fired when the {@link VirtualCameraAngleInput#currentCameraAngle} is updated + * + * @see VirtualCameraAngleInput#nextCameraTick() + */ + @FunctionalInterface + interface EventVirtualCameraAngleTick extends EventBase { + + /** + * Fired when the {@link VirtualCameraAngleInput#currentCameraAngle} is updated + * + * @param vcamera The {@link VirtualCameraAngleInput#nextCameraAngle} + * @returns The redirected cameraAngle + * @see VirtualCameraAngleInput#nextCameraTick() + */ + public VirtualCameraAngle onVirtualCameraTick(VirtualCameraAngle vcamera); + } +} diff --git a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java index afc89a5e..80e9eda2 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java @@ -30,14 +30,15 @@ import com.minecrafttas.mctcommon.networking.interfaces.PacketID; import com.minecrafttas.tasmod.TASmodClient; import com.minecrafttas.tasmod.events.EventClient.EventClientTickPost; -import com.minecrafttas.tasmod.events.EventClient.EventVirtualCameraAngleTick; -import com.minecrafttas.tasmod.events.EventClient.EventVirtualKeyboardTick; -import com.minecrafttas.tasmod.events.EventClient.EventVirtualMouseTick; import com.minecrafttas.tasmod.events.EventPlaybackClient; import com.minecrafttas.tasmod.events.EventPlaybackClient.EventControllerStateChange; import com.minecrafttas.tasmod.events.EventPlaybackClient.EventPlaybackJoinedWorld; import com.minecrafttas.tasmod.events.EventPlaybackClient.EventPlaybackTick; import com.minecrafttas.tasmod.events.EventPlaybackClient.EventRecordTick; +import com.minecrafttas.tasmod.events.EventVirtualInput; +import com.minecrafttas.tasmod.events.EventVirtualInput.EventVirtualCameraAngleTick; +import com.minecrafttas.tasmod.events.EventVirtualInput.EventVirtualKeyboardTick; +import com.minecrafttas.tasmod.events.EventVirtualInput.EventVirtualMouseTick; import com.minecrafttas.tasmod.networking.TASmodBufferBuilder; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata; import com.minecrafttas.tasmod.playback.tasfile.PlaybackSerialiser2; @@ -80,7 +81,7 @@ * @author Scribble * */ -public class PlaybackControllerClient implements ClientPacketHandler, EventClientInit, EventVirtualKeyboardTick, EventVirtualMouseTick, EventVirtualCameraAngleTick, EventClientTickPost { +public class PlaybackControllerClient implements ClientPacketHandler, EventClientInit, EventVirtualInput.EventVirtualKeyboardTick, EventVirtualInput.EventVirtualMouseTick, EventVirtualInput.EventVirtualCameraAngleTick, EventClientTickPost { /** * The current state of the controller. @@ -476,7 +477,7 @@ public void setInputs(BigArrayList inputs) { SerialiserFlavorBase.addAll(this.inputs, inputs); } - public void setIndex(int index) throws IndexOutOfBoundsException { + public void setIndex(long index) throws IndexOutOfBoundsException { if (index <= size()) { this.index = index; if (state == TASstate.PLAYBACK) { diff --git a/src/main/java/com/minecrafttas/tasmod/savestates/SavestateHandlerServer.java b/src/main/java/com/minecrafttas/tasmod/savestates/SavestateHandlerServer.java index 04004175..f3ff8994 100644 --- a/src/main/java/com/minecrafttas/tasmod/savestates/SavestateHandlerServer.java +++ b/src/main/java/com/minecrafttas/tasmod/savestates/SavestateHandlerServer.java @@ -27,9 +27,10 @@ import com.google.common.collect.Maps; import com.minecrafttas.tasmod.TASmod; -import com.minecrafttas.tasmod.events.EventServer.EventCompleteLoadstate; -import com.minecrafttas.tasmod.events.EventServer.EventLoadstate; -import com.minecrafttas.tasmod.events.EventServer.EventSavestate; +import com.minecrafttas.tasmod.events.EventSavestate; +import com.minecrafttas.tasmod.events.EventSavestate.EventServerCompleteLoadstate; +import com.minecrafttas.tasmod.events.EventSavestate.EventServerLoadstate; +import com.minecrafttas.tasmod.events.EventSavestate.EventServerSavestate; import com.minecrafttas.tasmod.mixin.savestates.AccessorAnvilChunkLoader; import com.minecrafttas.tasmod.mixin.savestates.AccessorChunkLoader; import com.minecrafttas.tasmod.mixin.savestates.MixinChunkProviderServer; @@ -198,7 +199,7 @@ public void saveState(int savestateIndex, boolean tickrate0, boolean changeIndex File currentfolder = new File(savestateDirectory, ".." + File.separator + worldname); File targetfolder = getSavestateFile(indexToSave); - EventListenerRegistry.fireEvent(EventSavestate.class, indexToSave, targetfolder, currentfolder); + EventListenerRegistry.fireEvent(EventSavestate.EventServerSavestate.class, indexToSave, targetfolder, currentfolder); if (targetfolder.exists()) { logger.warn(LoggerMarkers.Savestate, "WARNING! Overwriting the savestate with the index {}", indexToSave); @@ -341,7 +342,7 @@ public void loadState(int savestateIndex, boolean tickrate0, boolean changeIndex File currentfolder = new File(savestateDirectory, ".." + File.separator + worldname); File targetfolder = getSavestateFile(indexToLoad); - EventListenerRegistry.fireEvent(EventLoadstate.class, indexToLoad, targetfolder, currentfolder); + EventListenerRegistry.fireEvent(EventSavestate.EventServerLoadstate.class, indexToLoad, targetfolder, currentfolder); /* * Prevents loading an InputSavestate when loading index 0 (Index 0 is the @@ -420,7 +421,7 @@ public void loadState(int savestateIndex, boolean tickrate0, boolean changeIndex TASmod.tickSchedulerServer.add(()->{ - EventListenerRegistry.fireEvent(EventCompleteLoadstate.class); + EventListenerRegistry.fireEvent(EventSavestate.EventServerCompleteLoadstate.class); onLoadstateComplete(); // Unlock savestating diff --git a/src/main/java/com/minecrafttas/tasmod/tickratechanger/TickrateChangerClient.java b/src/main/java/com/minecrafttas/tasmod/tickratechanger/TickrateChangerClient.java index 3a9418e7..75885bef 100644 --- a/src/main/java/com/minecrafttas/tasmod/tickratechanger/TickrateChangerClient.java +++ b/src/main/java/com/minecrafttas/tasmod/tickratechanger/TickrateChangerClient.java @@ -11,7 +11,8 @@ import com.minecrafttas.mctcommon.networking.interfaces.ClientPacketHandler; import com.minecrafttas.mctcommon.networking.interfaces.PacketID; import com.minecrafttas.tasmod.TASmodClient; -import com.minecrafttas.tasmod.events.EventClient.EventClientTickrateChange; +import com.minecrafttas.tasmod.events.EventTickratechanger; +import com.minecrafttas.tasmod.events.EventTickratechanger.EventClientTickrateChange; import com.minecrafttas.tasmod.networking.TASmodBufferBuilder; import com.minecrafttas.tasmod.registries.TASmodPackets; import com.minecrafttas.tasmod.tickratechanger.TickrateChangerServer.TickratePauseState; @@ -89,7 +90,7 @@ public void changeClientTickrate(float tickrate, boolean log) { mc.timer.tickLength = Float.MAX_VALUE; } ticksPerSecond = tickrate; - EventListenerRegistry.fireEvent(EventClientTickrateChange.class, tickrate); + EventListenerRegistry.fireEvent(EventTickratechanger.EventClientTickrateChange.class, tickrate); if (log) log("Setting the client tickrate to " + ticksPerSecond); } diff --git a/src/main/java/com/minecrafttas/tasmod/tickratechanger/TickrateChangerServer.java b/src/main/java/com/minecrafttas/tasmod/tickratechanger/TickrateChangerServer.java index c5053ccd..c9cc0173 100644 --- a/src/main/java/com/minecrafttas/tasmod/tickratechanger/TickrateChangerServer.java +++ b/src/main/java/com/minecrafttas/tasmod/tickratechanger/TickrateChangerServer.java @@ -13,7 +13,8 @@ import com.minecrafttas.mctcommon.networking.interfaces.PacketID; import com.minecrafttas.mctcommon.networking.interfaces.ServerPacketHandler; import com.minecrafttas.tasmod.TASmod; -import com.minecrafttas.tasmod.events.EventServer.EventServerTickrateChange; +import com.minecrafttas.tasmod.events.EventTickratechanger; +import com.minecrafttas.tasmod.events.EventTickratechanger.EventServerTickrateChange; import com.minecrafttas.tasmod.networking.TASmodBufferBuilder; import com.minecrafttas.tasmod.registries.TASmodPackets; import com.minecrafttas.tasmod.util.LoggerMarkers; @@ -128,7 +129,7 @@ public void changeServerTickrate(float tickrate, boolean log) { } } ticksPerSecond = tickrate; - EventListenerRegistry.fireEvent(EventServerTickrateChange.class, tickrate); + EventListenerRegistry.fireEvent(EventTickratechanger.EventServerTickrateChange.class, tickrate); if (log) { log("Setting the server tickrate to " + ticksPerSecond); } diff --git a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualInput.java b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualInput.java index 303e10af..406929b1 100644 --- a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualInput.java +++ b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualInput.java @@ -12,9 +12,10 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import com.minecrafttas.mctcommon.events.EventListenerRegistry; -import com.minecrafttas.tasmod.events.EventClient.EventVirtualCameraAngleTick; -import com.minecrafttas.tasmod.events.EventClient.EventVirtualKeyboardTick; -import com.minecrafttas.tasmod.events.EventClient.EventVirtualMouseTick; +import com.minecrafttas.tasmod.events.EventVirtualInput; +import com.minecrafttas.tasmod.events.EventVirtualInput.EventVirtualCameraAngleTick; +import com.minecrafttas.tasmod.events.EventVirtualInput.EventVirtualKeyboardTick; +import com.minecrafttas.tasmod.events.EventVirtualInput.EventVirtualMouseTick; import com.minecrafttas.tasmod.mixin.playbackhooks.MixinEntityRenderer; import com.minecrafttas.tasmod.mixin.playbackhooks.MixinMinecraft; import com.minecrafttas.tasmod.util.Ducks; @@ -248,7 +249,7 @@ public void updateNextKeyboard(int keycode, boolean keystate, char character, bo * @see MixinMinecraft#playback_injectRunTickKeyboard(org.spongepowered.asm.mixin.injection.callback.CallbackInfo) */ public void nextKeyboardTick() { - nextKeyboard.deepCopyFrom((VirtualKeyboard) EventListenerRegistry.fireEvent(EventVirtualKeyboardTick.class, nextKeyboard)); + nextKeyboard.deepCopyFrom((VirtualKeyboard) EventListenerRegistry.fireEvent(EventVirtualInput.EventVirtualKeyboardTick.class, nextKeyboard)); currentKeyboard.getVirtualEvents(nextKeyboard, keyboardEventQueue); currentKeyboard.moveFrom(nextKeyboard); } @@ -408,7 +409,7 @@ public void updateNextMouse(int keycode, boolean keystate, int scrollwheel, int * @see MixinMinecraft#playback_injectRunTickMouse(org.spongepowered.asm.mixin.injection.callback.CallbackInfo) */ public void nextMouseTick() { - nextMouse.deepCopyFrom((VirtualMouse) EventListenerRegistry.fireEvent(EventVirtualMouseTick.class, nextMouse)); + nextMouse.deepCopyFrom((VirtualMouse) EventListenerRegistry.fireEvent(EventVirtualInput.EventVirtualMouseTick.class, nextMouse)); currentMouse.getVirtualEvents(nextMouse, mouseEventQueue); currentMouse.moveFrom(nextMouse); } @@ -608,7 +609,7 @@ public void updateNextCameraAngle(float pitchDelta, float yawDelta, boolean upda * @see MixinEntityRenderer#runUpdate(float) */ public void nextCameraTick() { - nextCameraAngle.deepCopyFrom((VirtualCameraAngle) EventListenerRegistry.fireEvent(EventVirtualCameraAngleTick.class, nextCameraAngle)); + nextCameraAngle.deepCopyFrom((VirtualCameraAngle) EventListenerRegistry.fireEvent(EventVirtualInput.EventVirtualCameraAngleTick.class, nextCameraAngle)); cameraAngleInterpolationStates.clear(); nextCameraAngle.getStates(cameraAngleInterpolationStates); currentCameraAngle.moveFrom(nextCameraAngle); diff --git a/src/test/java/tasmod/virtual/VirtualInputTest.java b/src/test/java/tasmod/virtual/VirtualInputTest.java index 4a343b61..5daa0dad 100644 --- a/src/test/java/tasmod/virtual/VirtualInputTest.java +++ b/src/test/java/tasmod/virtual/VirtualInputTest.java @@ -12,9 +12,10 @@ import org.junit.jupiter.api.Test; import com.minecrafttas.mctcommon.events.EventListenerRegistry; -import com.minecrafttas.tasmod.events.EventClient.EventVirtualCameraAngleTick; -import com.minecrafttas.tasmod.events.EventClient.EventVirtualKeyboardTick; -import com.minecrafttas.tasmod.events.EventClient.EventVirtualMouseTick; +import com.minecrafttas.tasmod.events.EventVirtualInput; +import com.minecrafttas.tasmod.events.EventVirtualInput.EventVirtualCameraAngleTick; +import com.minecrafttas.tasmod.events.EventVirtualInput.EventVirtualKeyboardTick; +import com.minecrafttas.tasmod.events.EventVirtualInput.EventVirtualMouseTick; import com.minecrafttas.tasmod.virtual.VirtualCameraAngle; import com.minecrafttas.tasmod.virtual.VirtualInput; import com.minecrafttas.tasmod.virtual.VirtualKey; @@ -27,9 +28,9 @@ class VirtualInputTest { @BeforeAll static void beforeAll() { - EventVirtualKeyboardTick kb = (keyboard)->null; - EventVirtualMouseTick ms = (mouse)->null; - EventVirtualCameraAngleTick cmra = (cameraangle)->null; + EventVirtualInput.EventVirtualKeyboardTick kb = (keyboard)->null; + EventVirtualInput.EventVirtualMouseTick ms = (mouse)->null; + EventVirtualInput.EventVirtualCameraAngleTick cmra = (cameraangle)->null; EventListenerRegistry.register(kb, ms, cmra); } From 4d069578ff4d48e51064667345055ca7ca4e040a Mon Sep 17 00:00:00 2001 From: Scribble Date: Wed, 3 Jul 2024 21:28:47 +0200 Subject: [PATCH 68/79] [Savestates] Added serialiser to client savestates --- .../tasmod/events/EventSavestate.java | 7 +- .../playback/PlaybackControllerClient.java | 33 ++-- .../savestates/SavestateHandlerClient.java | 154 +++++++++++++----- .../tasmod/virtual/VirtualInput.java | 61 ++++--- 4 files changed, 173 insertions(+), 82 deletions(-) diff --git a/src/main/java/com/minecrafttas/tasmod/events/EventSavestate.java b/src/main/java/com/minecrafttas/tasmod/events/EventSavestate.java index 94409594..58791881 100644 --- a/src/main/java/com/minecrafttas/tasmod/events/EventSavestate.java +++ b/src/main/java/com/minecrafttas/tasmod/events/EventSavestate.java @@ -49,5 +49,10 @@ interface EventServerCompleteLoadstate extends EventBase { */ public void onServerLoadstateComplete(); } - + + @FunctionalInterface + interface EventClientSavestate extends EventBase { + + public void onClientSavestate(); + } } diff --git a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java index 80e9eda2..bfded1a7 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java @@ -89,9 +89,9 @@ public class PlaybackControllerClient implements ClientPacketHandler, EventClien private TASstate state = TASstate.NONE; /** - * The state of the controller when the {@link #state} is paused + * The {@link #state} that this controller will return to, after a pause */ - private TASstate tempPause = TASstate.NONE; + private TASstate stateAfterPause = TASstate.NONE; /** * The current index of the inputs @@ -190,7 +190,7 @@ public String setTASStateClient(TASstate stateIn, boolean verbose) { case PAUSED: LOGGER.debug(LoggerMarkers.Playback, "Pausing a recording"); state = TASstate.PAUSED; - tempPause = TASstate.RECORDING; + stateAfterPause = TASstate.RECORDING; return verbose ? TextFormatting.GREEN + "Pausing a recording" : ""; case NONE: stopRecording(); @@ -206,7 +206,7 @@ public String setTASStateClient(TASstate stateIn, boolean verbose) { case PAUSED: LOGGER.debug(LoggerMarkers.Playback, "Pausing a playback"); state = TASstate.PAUSED; - tempPause = TASstate.PLAYBACK; + stateAfterPause = TASstate.PLAYBACK; TASmodClient.virtual.clear(); return verbose ? TextFormatting.GREEN + "Pausing a playback" : ""; case NONE: @@ -219,20 +219,20 @@ public String setTASStateClient(TASstate stateIn, boolean verbose) { case PLAYBACK: LOGGER.debug(LoggerMarkers.Playback, "Resuming a playback"); state = TASstate.PLAYBACK; - tempPause = TASstate.NONE; + stateAfterPause = TASstate.NONE; return verbose ? TextFormatting.GREEN + "Resuming a playback" : ""; case RECORDING: LOGGER.debug(LoggerMarkers.Playback, "Resuming a recording"); state = TASstate.RECORDING; - tempPause = TASstate.NONE; + stateAfterPause = TASstate.NONE; return verbose ? TextFormatting.GREEN + "Resuming a recording" : ""; case PAUSED: return TextFormatting.RED + "Please report this message to the mod author, because you should never be able to see this (Error: Paused)"; case NONE: LOGGER.debug(LoggerMarkers.Playback, "Aborting pausing"); state = TASstate.NONE; - TASstate statey = tempPause; - tempPause = TASstate.NONE; + TASstate statey = stateAfterPause; + stateAfterPause = TASstate.NONE; return TextFormatting.GREEN + "Aborting a " + statey.toString().toLowerCase() + " that was paused"; } } @@ -278,7 +278,7 @@ public TASstate togglePause() { if (state != TASstate.PAUSED) { setTASStateClient(TASstate.PAUSED); } else { - setTASStateClient(tempPause); + setTASStateClient(stateAfterPause); } return state; } @@ -296,7 +296,7 @@ public void pause(boolean pause) { } } else { if (state == TASstate.PAUSED) { - setTASStateClient(tempPause, false); + setTASStateClient(stateAfterPause, false); } } } @@ -323,6 +323,10 @@ public boolean isNothingPlaying() { public TASstate getState() { return state; } + + public TASstate getStateAfterPause() { + return stateAfterPause; + } // ===================================================================================================== // Methods to update the temporary variables of the container. @@ -380,8 +384,8 @@ public void onClientTickPost(Minecraft mc) { EntityPlayerSP player = mc.player; if (player != null && player.addedToChunk) { - if (isPaused() && tempPause != TASstate.NONE) { - setTASState(tempPause); // The recording is paused in LoadWorldEvents#startLaunchServer + if (isPaused() && stateAfterPause != TASstate.NONE) { + setTASState(stateAfterPause); // The recording is paused in LoadWorldEvents#startLaunchServer pause(false); EventListenerRegistry.fireEvent(EventPlaybackJoinedWorld.class, state); } @@ -468,6 +472,10 @@ public BigArrayList getInputs() { } public void setInputs(BigArrayList inputs) { + this.setInputs(inputs, 0); + } + + public void setInputs(BigArrayList inputs, long index) { try { this.inputs.clearMemory(); } catch (IOException e) { @@ -475,6 +483,7 @@ public void setInputs(BigArrayList inputs) { } this.inputs = new BigArrayList(directory + File.separator + "temp"); SerialiserFlavorBase.addAll(this.inputs, inputs); + setIndex(index); } public void setIndex(long index) throws IndexOutOfBoundsException { diff --git a/src/main/java/com/minecrafttas/tasmod/savestates/SavestateHandlerClient.java b/src/main/java/com/minecrafttas/tasmod/savestates/SavestateHandlerClient.java index 67e828be..71caa0a9 100644 --- a/src/main/java/com/minecrafttas/tasmod/savestates/SavestateHandlerClient.java +++ b/src/main/java/com/minecrafttas/tasmod/savestates/SavestateHandlerClient.java @@ -6,6 +6,7 @@ import java.io.IOException; import java.nio.ByteBuffer; +import com.dselent.bigarraylist.BigArrayList; import com.minecrafttas.mctcommon.networking.Client.Side; import com.minecrafttas.mctcommon.networking.exception.PacketNotImplementedException; import com.minecrafttas.mctcommon.networking.exception.WrongSideException; @@ -16,6 +17,7 @@ import com.minecrafttas.tasmod.networking.TASmodBufferBuilder; import com.minecrafttas.tasmod.playback.PlaybackControllerClient; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TASstate; +import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickContainer; import com.minecrafttas.tasmod.playback.tasfile.PlaybackSerialiser2; import com.minecrafttas.tasmod.registries.TASmodPackets; import com.minecrafttas.tasmod.savestates.SavestateHandlerServer.PlayerHandler.MotionData; @@ -80,7 +82,6 @@ public static void keepPlayerInLoadedEntityList(net.minecraft.entity.player.Enti * This state is fixed, once the player moves into a different chunk, since the * new chunk adds the player to it's list.
    *
    - * * TLDR:
    * Adds the player to the chunk so the player is shown in third person
    *
    @@ -129,9 +130,10 @@ public static void savestate(String nameOfSavestate) throws SavestateException, } /** - * Replaces the current recording with the recording from the savestate. Gets - * triggered when a savestate is loaded on the server
    - * Side: Client + *

    Loads a copy of the TASfile from the file system and applies it depending on the {@link PlaybackControllerClient#state TASstate}. + * + *

    Savestates can be loaded while the state is {@link TASstate#RECORDING recording}, {@link TASstate#PLAYBACK playing back} or {@link TASstate#PAUSED paused},
    + * in that case however, the {@link PlaybackControllerClient#stateAfterPause TASstate after pause} will be used. * * @param nameOfSavestate coming from the server * @throws IOException @@ -145,21 +147,109 @@ public static void loadstate(String nameOfSavestate) throws Exception { savestateDirectory.mkdir(); + PlaybackControllerClient controller = TASmodClient.controller; + + TASstate state = controller.getState(); + + if (state == TASstate.NONE) { + return; + } + + if(state == TASstate.PAUSED) { + state = controller.getStateAfterPause(); + } + File targetfile = new File(savestateDirectory, nameOfSavestate + ".mctas"); - PlaybackControllerClient container = TASmodClient.controller; - if (!container.isNothingPlaying()) { // If the file exists and the container is recording or playing, load the - // clientSavestate - if (targetfile.exists()) { - TASmodClient.controller.setInputs(PlaybackSerialiser2.loadFromFile(targetfile)); - } else { - TASmodClient.controller.setTASStateClient(TASstate.NONE, false); - Minecraft.getMinecraft().player.sendMessage(new TextComponentString(ChatFormatting.YELLOW + "Inputs could not be loaded for this savestate,")); - Minecraft.getMinecraft().player.sendMessage(new TextComponentString(ChatFormatting.YELLOW + "since the file doesn't exist. Stopping!")); - LOGGER.warn(LoggerMarkers.Savestate, "Inputs could not be loaded for this savestate, since the file doesn't exist."); + BigArrayList savestateContainerList; + + if (targetfile.exists()) { + savestateContainerList = PlaybackSerialiser2.loadFromFile(targetfile); + } else { + controller.setTASStateClient(TASstate.NONE, false); + Minecraft.getMinecraft().player.sendMessage(new TextComponentString(ChatFormatting.YELLOW + "Inputs could not be loaded for this savestate,")); + Minecraft.getMinecraft().player.sendMessage(new TextComponentString(ChatFormatting.YELLOW + "since the file doesn't exist. Stopping!")); + LOGGER.warn(LoggerMarkers.Savestate, "Inputs could not be loaded for this savestate, since the file doesn't exist."); + return; + } + + /* + * Imagine a recording that is 20 tick long with VV showing the current index of the controller: + * VV + * 0 20 + * <====================> + * + * Now we load a savestate with only 10 ticks: + * + * 0 10 + * <==========> + * + * We expect to resume the recording at the 10th tick. + * Therefore when loading a client savestate during a recording we set the index to size-1 and preload the inputs at the same index. + * VV + * 0 10 + * <==========> + * + * */ + if (state == TASstate.RECORDING) { + long index = savestateContainerList.size()-1; + + preload(savestateContainerList, index); + controller.setInputs(savestateContainerList, index); + + /* + * When loading a savestate during a playback 2 different scenarios can happen. + * */ + } else if (state == TASstate.PLAYBACK) { + + /* + * Scenario 1: + * The loadstated file is SMALLER than the total inputs in the controller: + * + * The recording is 20 ticks long, with VV being the index where the playback is currently at. + * VV + * 0 13 20 + * <====================> + * + * And our loadstated file being only 10 ticks long: + * + * 0 10 + * <==========> + * + * We expect to start at tick 10 WITHOUT clearing the controller. + * If we were to replace the controller, everything above tick 10 would be lost. + * So we only set the index to 10, preload and preload the inputs. + * + * VV + * 0 10 20 + * <====================> + * */ + if (controller.size() >= savestateContainerList.size()) { + long index = savestateContainerList.size(); + + preload(controller.getInputs(), index); + controller.setIndex(index); + } + /* + * Scenario 2: + * The loadstated file is LARGER than the controller, + * which may happen when loading a more recent savestate after loading an old one + * + * In that case we just apply the playback just like in the recording + * */ + else { + long index = savestateContainerList.size()-1; + + preload(savestateContainerList, index); + controller.setInputs(savestateContainerList, index); } } } + + private static void preload(BigArrayList containerList, long index) { + TickContainer containerToPreload = containerList.get(index); + TASmodClient.virtual.preloadInput(containerToPreload.getKeyboard(), containerToPreload.getMouse(), containerToPreload.getCameraAngle()); + } public static void loadPlayer(NBTTagCompound compound) { LOGGER.trace(LoggerMarkers.Savestate, "Loading client player from NBT"); @@ -168,8 +258,8 @@ public static void loadPlayer(NBTTagCompound compound) { player.readFromNBT(compound); NBTTagCompound motion = compound.getCompoundTag("clientMotion"); - - if(motion.hasNoTags()) { + + if (motion.hasNoTags()) { LOGGER.warn(LoggerMarkers.Savestate, "Could not load the motion from the savestate. Savestate seems to be created manually or by a different mod"); } else { LOGGER.trace(LoggerMarkers.Savestate, "Loading client motion from NBT"); @@ -179,14 +269,14 @@ public static void loadPlayer(NBTTagCompound compound) { player.motionX = x; player.motionY = y; player.motionZ = z; - + float rx = motion.getFloat("RelativeX"); float ry = motion.getFloat("RelativeY"); float rz = motion.getFloat("RelativeZ"); player.moveForward = rx; player.moveVertical = ry; player.moveStrafing = rz; - + boolean sprinting = motion.getBoolean("Sprinting"); float jumpVector = motion.getFloat("JumpFactor"); player.setSprinting(sprinting); @@ -200,8 +290,8 @@ public static void loadPlayer(NBTTagCompound compound) { mc.playerController.setGameType(type); // #?? Player rotation does not change when loading a savestate -// CameraInterpolationEvents.rotationPitch = player.rotationPitch; -// CameraInterpolationEvents.rotationYaw = player.rotationYaw + 180f; + // CameraInterpolationEvents.rotationPitch = player.rotationPitch; + // CameraInterpolationEvents.rotationYaw = player.rotationYaw + 180f; SavestateHandlerClient.keepPlayerInLoadedEntityList(player); } @@ -227,14 +317,7 @@ public static void unloadAllClientChunks() { @Override public PacketID[] getAcceptedPacketIDs() { - return new TASmodPackets[] { - TASmodPackets.SAVESTATE_SAVE, - TASmodPackets.SAVESTATE_LOAD, - TASmodPackets.SAVESTATE_PLAYER, - TASmodPackets.SAVESTATE_REQUEST_MOTION, - TASmodPackets.SAVESTATE_SCREEN, - TASmodPackets.SAVESTATE_UNLOAD_CHUNKS - }; + return new TASmodPackets[] { TASmodPackets.SAVESTATE_SAVE, TASmodPackets.SAVESTATE_LOAD, TASmodPackets.SAVESTATE_PLAYER, TASmodPackets.SAVESTATE_REQUEST_MOTION, TASmodPackets.SAVESTATE_SCREEN, TASmodPackets.SAVESTATE_UNLOAD_CHUNKS }; } @Override @@ -288,20 +371,7 @@ public void onClientPacket(PacketID id, ByteBuffer buf, String username) throws if (!(Minecraft.getMinecraft().currentScreen instanceof GuiSavestateSavingScreen)) { Minecraft.getMinecraft().displayGuiScreen(new GuiSavestateSavingScreen()); } - TASmodClient.client.send( - new TASmodBufferBuilder(TASmodPackets.SAVESTATE_REQUEST_MOTION) - .writeMotionData( - new MotionData( - player.motionX, - player.motionY, - player.motionZ, - player.moveForward, - player.moveVertical, - player.moveStrafing, - player.isSprinting(), - player.jumpMovementFactor) - ) - ); + TASmodClient.client.send(new TASmodBufferBuilder(TASmodPackets.SAVESTATE_REQUEST_MOTION).writeMotionData(new MotionData(player.motionX, player.motionY, player.motionZ, player.moveForward, player.moveVertical, player.moveStrafing, player.isSprinting(), player.jumpMovementFactor))); } break; case SAVESTATE_SCREEN: diff --git a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualInput.java b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualInput.java index 406929b1..7ff5ccad 100644 --- a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualInput.java +++ b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualInput.java @@ -13,9 +13,6 @@ import com.minecrafttas.mctcommon.events.EventListenerRegistry; import com.minecrafttas.tasmod.events.EventVirtualInput; -import com.minecrafttas.tasmod.events.EventVirtualInput.EventVirtualCameraAngleTick; -import com.minecrafttas.tasmod.events.EventVirtualInput.EventVirtualKeyboardTick; -import com.minecrafttas.tasmod.events.EventVirtualInput.EventVirtualMouseTick; import com.minecrafttas.tasmod.mixin.playbackhooks.MixinEntityRenderer; import com.minecrafttas.tasmod.mixin.playbackhooks.MixinMinecraft; import com.minecrafttas.tasmod.util.Ducks; @@ -24,6 +21,7 @@ import com.minecrafttas.tasmod.virtual.event.VirtualKeyboardEvent; import com.minecrafttas.tasmod.virtual.event.VirtualMouseEvent; +import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; import net.minecraft.util.math.MathHelper; @@ -88,14 +86,14 @@ public void update(GuiScreen currentScreen) { } while (Mouse.next()) { if (currentScreen == null) { - MOUSE.updateNextMouse(Mouse.getEventButton()-100, Mouse.getEventButtonState(), Mouse.getEventDWheel(), 0, 0); + MOUSE.updateNextMouse(Mouse.getEventButton() - 100, Mouse.getEventButtonState(), Mouse.getEventDWheel(), 0, 0); } else { Ducks.GuiScreenDuck screen = (Ducks.GuiScreenDuck) currentScreen; int eventX = screen.unscaleX(Mouse.getEventX()); int eventY = screen.unscaleY(Mouse.getEventY()); eventX = PointerNormalizer.getNormalizedX(eventX); eventY = PointerNormalizer.getNormalizedY(eventY); - MOUSE.updateNextMouse(Mouse.getEventButton()-100, Mouse.getEventButtonState(), Mouse.getEventDWheel(), eventX, eventY); + MOUSE.updateNextMouse(Mouse.getEventButton() - 100, Mouse.getEventButtonState(), Mouse.getEventDWheel(), eventX, eventY); } } } @@ -109,13 +107,13 @@ public void update(GuiScreen currentScreen) { * @return If the key is down either on mouse or keyboard */ public boolean isKeyDown(int keycode) { - if(keycode >= 0) { + if (keycode >= 0) { return KEYBOARD.isKeyDown(keycode); } else { return MOUSE.isKeyDown(keycode); } } - + /** * If the keyboard or mouse key is will be down in the next tick. * If keycode >= 0 then {@link VirtualKeyboardInput#willKeyBeDown(int)} will be called,
    @@ -125,13 +123,13 @@ public boolean isKeyDown(int keycode) { * @return If the key will be down either on mouse or keyboard */ public boolean willKeyBeDown(int keycode) { - if(keycode >= 0) { + if (keycode >= 0) { return KEYBOARD.willKeyBeDown(keycode); } else { return MOUSE.willKeyBeDown(keycode); } } - + /** * Unpresses all keys in {@link VirtualKeyboardInput#nextKeyboard} and {@link VirtualMouseInput#nextMouse} */ @@ -140,7 +138,16 @@ public void clear() { MOUSE.nextMouse.clear(); CAMERA_ANGLE.nextCameraAngle.clear(); } - + + public void preloadInput(VirtualKeyboard keyboardToPreload, VirtualMouse mouseToPreload, VirtualCameraAngle angleToPreload) { + KEYBOARD.nextKeyboard.deepCopyFrom(keyboardToPreload); + MOUSE.nextMouse.deepCopyFrom(mouseToPreload); + CAMERA_ANGLE.nextCameraAngle.deepCopyFrom(angleToPreload); + Minecraft.getMinecraft().runTickKeyboard(); // Letting mouse and keyboard tick once to load inputs into the "currentKeyboard" + // + Minecraft.getMinecraft().runTickMouse(); + } + /** * Subclass of {@link VirtualInput} handling keyboard logic.
    *
    @@ -226,7 +233,7 @@ public VirtualKeyboardInput(VirtualKeyboard preloadedKeyboard) { public void updateNextKeyboard(int keycode, boolean keystate, char character) { updateNextKeyboard(keycode, keystate, character, false); } - + /** * Updates the next keyboard * @@ -237,10 +244,10 @@ public void updateNextKeyboard(int keycode, boolean keystate, char character) { * @param repeatEventsEnabled If repeat events are enabled */ public void updateNextKeyboard(int keycode, boolean keystate, char character, boolean repeatEventsEnabled) { - LOGGER.debug(LoggerMarkers.Keyboard, "Update: {}, {}, {}, {}", keycode, keystate, character); // Activate with -Dtasmod.marker.keyboard=ACCEPT in VM arguments (and -Dtasmod.log.level=debug) + LOGGER.debug(LoggerMarkers.Keyboard, "Update: {}, {}, {}, {}", keycode, keystate, character); // Activate with -Dtasmod.marker.keyboard=ACCEPT in VM arguments (and -Dtasmod.log.level=debug) nextKeyboard.updateFromEvent(keycode, keystate, character, repeatEventsEnabled); } - + /** * Runs when the next keyboard tick is about to occur.
    * Used to load {@link #nextKeyboard} into {@link #currentKeyboard}, creating @@ -285,7 +292,7 @@ public boolean getEventKeyboardState() { public char getEventKeyboardCharacter() { return currentKeyboardEvent.getCharacter(); } - + /** * If the key is currently down and recognised by Minecraft * @param keycode The keycode of the key in question @@ -294,7 +301,7 @@ public char getEventKeyboardCharacter() { public boolean isKeyDown(int keycode) { return currentKeyboard.isKeyDown(keycode); } - + /** * If the key will be down and recognised in the next tick by Minecraft.
    * This is equal to checking if a key on the physical keyboard is pressed @@ -397,7 +404,7 @@ public VirtualMouseInput(VirtualMouse preloadedMouse) { * @param cursorY The y coordinate of the cursot of this event */ public void updateNextMouse(int keycode, boolean keystate, int scrollwheel, int cursorX, int cursorY) { - LOGGER.debug(LoggerMarkers.Mouse,"Update: {} ({}), {}, {}, {}, {}", keycode, VirtualKey.getName(keycode), keystate, scrollwheel, cursorX, cursorY); // Activate with -Dtasmod.marker.mouse=ACCEPT in VM arguments (and -Dtasmod.log.level=debug) + LOGGER.debug(LoggerMarkers.Mouse, "Update: {} ({}), {}, {}, {}, {}", keycode, VirtualKey.getName(keycode), keystate, scrollwheel, cursorX, cursorY); // Activate with -Dtasmod.marker.mouse=ACCEPT in VM arguments (and -Dtasmod.log.level=debug) nextMouse.updateFromEvent(keycode, keystate, scrollwheel, cursorX, cursorY); } @@ -459,21 +466,21 @@ public int getEventCursorX() { public int getNormalizedCursorX() { return currentMouseEvent.getCursorX(); } - + /** * @return The scaled y coordinate of the cursor of {@link #currentMouseEvent} */ public int getEventCursorY() { return PointerNormalizer.reapplyScalingY(getNormalizedCursorY()); } - + /** * @return The y coordinate of the cursor of {@link #currentMouseEvent} */ public int getNormalizedCursorY() { return currentMouseEvent.getCursorY(); } - + /** * If the key is currently down and recognised by Minecraft * @param keycode The keycode of the key in question @@ -482,7 +489,7 @@ public int getNormalizedCursorY() { public boolean isKeyDown(int keycode) { return currentMouse.isKeyDown(keycode); } - + /** * If the key will be down and recognised in the next tick by Minecraft.
    * This is equal to checking if a key on the physical mouse is pressed @@ -492,7 +499,7 @@ public boolean isKeyDown(int keycode) { public boolean willKeyBeDown(int keycode) { return nextMouse.isKeyDown(keycode); } - + } /** @@ -586,19 +593,19 @@ public VirtualCameraAngleInput(VirtualCameraAngle preloadedCamera) { public void updateNextCameraAngle(float pitchDelta, float yawDelta) { updateNextCameraAngle(pitchDelta, yawDelta, true); } - + /** * Update the camera angle.
    *
    * Runs every frame * * @see com.minecrafttas.tasmod.mixin.playbackhooks.MixinEntityRenderer#runUpdate(float); - * @param pitchDelta Relative rotationPitch delta from LWJGLs mouse delta. - * @param yawDelta Relative rotationYaw delta from LWJGLs mouse delta. + * @param pitchDelta Relative rotationPitch delta from LWJGLs mouse delta. + * @param yawDelta Relative rotationYaw delta from LWJGLs mouse delta. * @param updateSubtick Whether to add the previous camera angle to the {@link Subtickable#subtickList} */ public void updateNextCameraAngle(float pitchDelta, float yawDelta, boolean updateSubtick) { -// LOGGER.debug("Pitch: {}, Yaw: {}", pitch, yaw); + // LOGGER.debug("Pitch: {}, Yaw: {}", pitch, yaw); nextCameraAngle.updateFromEvent(pitchDelta, yawDelta, updateSubtick); } @@ -639,7 +646,7 @@ public void setCamera(Float pitch, Float yaw) { public Float getCurrentPitch() { return currentCameraAngle.getPitch(); } - + /** * @return The absolute yaw coordinate of the player. May be null when it's initialized */ @@ -657,7 +664,7 @@ public Float getCurrentYaw() { * @return A triple of pitch, yaw and roll, as left, middle and right respectively */ public Triple getInterpolatedState(float partialTick, float pitch, float yaw, boolean enable) { - + float interpolatedPitch = nextCameraAngle.getPitch() == null ? pitch : nextCameraAngle.getPitch(); float interpolatedYaw = nextCameraAngle.getYaw() == null ? yaw : nextCameraAngle.getYaw() + 180; From e0c0cfdd81b68f089c5c07e12a1e6c7c83203854 Mon Sep 17 00:00:00 2001 From: Scribble Date: Mon, 8 Jul 2024 20:40:15 +0200 Subject: [PATCH 69/79] [PlaybackSerialiser] Added better styling for metadata Metadata now looks like this: ---------------------- Test1 --------------------- Test1:This is a test ---------------------- Test2 --------------------- Test2:This is another test --- .../java/com/minecrafttas/tasmod/TASmodClient.java | 1 - .../tasmod/playback/PlaybackControllerClient.java | 3 --- .../tasfile/flavor/SerialiserFlavorBase.java | 9 +++++---- .../tasmod/savestates/SavestateHandlerServer.java | 12 ++++-------- .../tickratechanger/TickrateChangerClient.java | 1 - .../tickratechanger/TickrateChangerServer.java | 3 +-- .../playback/tasfile/PlaybackSerialiserTest.java | 2 +- .../playback/tasfile/SerialiserFlavorBaseTest.java | 13 ++++++++----- src/test/java/tasmod/virtual/VirtualInputTest.java | 3 --- 9 files changed, 19 insertions(+), 28 deletions(-) diff --git a/src/main/java/com/minecrafttas/tasmod/TASmodClient.java b/src/main/java/com/minecrafttas/tasmod/TASmodClient.java index 9b15640a..97c3612d 100644 --- a/src/main/java/com/minecrafttas/tasmod/TASmodClient.java +++ b/src/main/java/com/minecrafttas/tasmod/TASmodClient.java @@ -27,7 +27,6 @@ import com.minecrafttas.tasmod.playback.filecommands.integrated.OptionsFileCommandExtension; import com.minecrafttas.tasmod.playback.metadata.integrated.CreditsMetadataExtension; import com.minecrafttas.tasmod.playback.metadata.integrated.StartpositionMetadataExtension; -import com.minecrafttas.tasmod.playback.tasfile.PlaybackSerialiser; import com.minecrafttas.tasmod.playback.tasfile.flavor.integrated.Beta1Flavor; import com.minecrafttas.tasmod.registries.TASmodAPIRegistry; import com.minecrafttas.tasmod.registries.TASmodConfig; diff --git a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java index bfded1a7..3e4428df 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java @@ -36,9 +36,6 @@ import com.minecrafttas.tasmod.events.EventPlaybackClient.EventPlaybackTick; import com.minecrafttas.tasmod.events.EventPlaybackClient.EventRecordTick; import com.minecrafttas.tasmod.events.EventVirtualInput; -import com.minecrafttas.tasmod.events.EventVirtualInput.EventVirtualCameraAngleTick; -import com.minecrafttas.tasmod.events.EventVirtualInput.EventVirtualKeyboardTick; -import com.minecrafttas.tasmod.events.EventVirtualInput.EventVirtualMouseTick; import com.minecrafttas.tasmod.networking.TASmodBufferBuilder; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata; import com.minecrafttas.tasmod.playback.tasfile.PlaybackSerialiser2; diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java index 04aca42a..94d153f3 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java @@ -98,11 +98,12 @@ protected void serialiseMetadata(List out) { for (PlaybackMetadata metadata : metadataList) { serialiseMetadataName(out, metadata.getExtensionName()); serialiseMetadataValue(out, metadata.getData()); + out.add(""); } } protected void serialiseMetadataName(List out, String name) { - out.add("### " + name); + out.add(createCenteredHeading(name, '-', 50)); } protected void serialiseMetadataValue(List out, LinkedHashMap data) { @@ -367,7 +368,7 @@ protected void deserialiseMetadata(List headerLines) { for (String headerLine : headerLines) { - Matcher nameMatcher = extract("^#{3} (.+)", headerLine); // If the line starts with ###, an optional space char after and then capture the name + Matcher nameMatcher = extract("^-+ ([^-]+)", headerLine); // If the line starts with ###, an optional space char after and then capture the name Matcher valueMatcher = extract("^([^#].*?):\\s*(.+)", headerLine); // If the line doesn't start with a #, then the key of the metadata, then a : then any or no number of whitespace chars, then the value of the metadata if (nameMatcher.find()) { @@ -378,11 +379,11 @@ protected void deserialiseMetadata(List headerLines) { out.add(PlaybackMetadata.fromHashMap(metadataName, values)); values.clear(); } - metadataName = nameMatcher.group(1); + metadataName = nameMatcher.group(1).trim(); continue; } else if (metadataName != null && valueMatcher.find()) { - values.put(valueMatcher.group(1), valueMatcher.group(2)); + values.put(valueMatcher.group(1).trim(), valueMatcher.group(2).trim()); } } diff --git a/src/main/java/com/minecrafttas/tasmod/savestates/SavestateHandlerServer.java b/src/main/java/com/minecrafttas/tasmod/savestates/SavestateHandlerServer.java index f3ff8994..336ea88b 100644 --- a/src/main/java/com/minecrafttas/tasmod/savestates/SavestateHandlerServer.java +++ b/src/main/java/com/minecrafttas/tasmod/savestates/SavestateHandlerServer.java @@ -15,22 +15,18 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.apache.commons.io.FileUtils; +import org.apache.logging.log4j.Logger; + +import com.google.common.collect.Maps; import com.minecrafttas.mctcommon.events.EventListenerRegistry; import com.minecrafttas.mctcommon.networking.Client.Side; import com.minecrafttas.mctcommon.networking.exception.PacketNotImplementedException; import com.minecrafttas.mctcommon.networking.exception.WrongSideException; import com.minecrafttas.mctcommon.networking.interfaces.PacketID; import com.minecrafttas.mctcommon.networking.interfaces.ServerPacketHandler; - -import org.apache.commons.io.FileUtils; -import org.apache.logging.log4j.Logger; - -import com.google.common.collect.Maps; import com.minecrafttas.tasmod.TASmod; import com.minecrafttas.tasmod.events.EventSavestate; -import com.minecrafttas.tasmod.events.EventSavestate.EventServerCompleteLoadstate; -import com.minecrafttas.tasmod.events.EventSavestate.EventServerLoadstate; -import com.minecrafttas.tasmod.events.EventSavestate.EventServerSavestate; import com.minecrafttas.tasmod.mixin.savestates.AccessorAnvilChunkLoader; import com.minecrafttas.tasmod.mixin.savestates.AccessorChunkLoader; import com.minecrafttas.tasmod.mixin.savestates.MixinChunkProviderServer; diff --git a/src/main/java/com/minecrafttas/tasmod/tickratechanger/TickrateChangerClient.java b/src/main/java/com/minecrafttas/tasmod/tickratechanger/TickrateChangerClient.java index 75885bef..31cd97f8 100644 --- a/src/main/java/com/minecrafttas/tasmod/tickratechanger/TickrateChangerClient.java +++ b/src/main/java/com/minecrafttas/tasmod/tickratechanger/TickrateChangerClient.java @@ -12,7 +12,6 @@ import com.minecrafttas.mctcommon.networking.interfaces.PacketID; import com.minecrafttas.tasmod.TASmodClient; import com.minecrafttas.tasmod.events.EventTickratechanger; -import com.minecrafttas.tasmod.events.EventTickratechanger.EventClientTickrateChange; import com.minecrafttas.tasmod.networking.TASmodBufferBuilder; import com.minecrafttas.tasmod.registries.TASmodPackets; import com.minecrafttas.tasmod.tickratechanger.TickrateChangerServer.TickratePauseState; diff --git a/src/main/java/com/minecrafttas/tasmod/tickratechanger/TickrateChangerServer.java b/src/main/java/com/minecrafttas/tasmod/tickratechanger/TickrateChangerServer.java index c9cc0173..f5a01bf3 100644 --- a/src/main/java/com/minecrafttas/tasmod/tickratechanger/TickrateChangerServer.java +++ b/src/main/java/com/minecrafttas/tasmod/tickratechanger/TickrateChangerServer.java @@ -2,9 +2,9 @@ import java.nio.ByteBuffer; -import com.minecrafttas.mctcommon.events.EventListenerRegistry; import org.apache.logging.log4j.Logger; +import com.minecrafttas.mctcommon.events.EventListenerRegistry; import com.minecrafttas.mctcommon.events.EventServer.EventPlayerJoinedServerSide; import com.minecrafttas.mctcommon.events.EventServer.EventServerStop; import com.minecrafttas.mctcommon.networking.Client.Side; @@ -14,7 +14,6 @@ import com.minecrafttas.mctcommon.networking.interfaces.ServerPacketHandler; import com.minecrafttas.tasmod.TASmod; import com.minecrafttas.tasmod.events.EventTickratechanger; -import com.minecrafttas.tasmod.events.EventTickratechanger.EventServerTickrateChange; import com.minecrafttas.tasmod.networking.TASmodBufferBuilder; import com.minecrafttas.tasmod.registries.TASmodPackets; import com.minecrafttas.tasmod.util.LoggerMarkers; diff --git a/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java b/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java index 7ffcd6b7..ca0c5f01 100644 --- a/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java +++ b/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java @@ -208,7 +208,7 @@ void testDeserialiser() throws PlaybackLoadException, IOException { lines.add("TASFile"); lines.add("FileCommand-Extensions: tasmod_testFileExtension"); lines.add("Flavor: Test"); - lines.add("### Test"); + lines.add("----------- Test ----------"); lines.add("TestKey: Wat"); lines.add("##################################################"); lines.add("// This is a regular comment"); diff --git a/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java b/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java index a0560a49..7768a641 100644 --- a/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java +++ b/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java @@ -147,11 +147,12 @@ public void onClear() { serialiseMetadata(actual); List expected = new ArrayList<>(); - expected.add("### Test1"); + expected.add("---------------------- Test1 ---------------------"); expected.add("TestKey:This is a test"); - - expected.add("### Test2"); + expected.add(""); + expected.add("---------------------- Test2 ---------------------"); expected.add("TestKey:This is a second test"); + expected.add(""); assertIterableEquals(expected, actual); assertEquals(0, currentTick); @@ -444,16 +445,18 @@ public void onClear() { TASmodAPIRegistry.PLAYBACK_METADATA.register(startPosition); List lines = new ArrayList<>(); - lines.add("### General"); + lines.add("--- General"); lines.add("Author: Scribble"); lines.add("Title: 77 Buttons"); lines.add("Playing Time:00:00.0"); - lines.add("### StartPosition"); + lines.add(""); + lines.add("--- StartPosition"); lines.add("x:1.0"); lines.add("y:2.0"); lines.add("z:3.0"); lines.add("pitch:4.0"); lines.add("yaw:5.0"); + lines.add(""); deserialiseMetadata(lines); diff --git a/src/test/java/tasmod/virtual/VirtualInputTest.java b/src/test/java/tasmod/virtual/VirtualInputTest.java index 5daa0dad..04084feb 100644 --- a/src/test/java/tasmod/virtual/VirtualInputTest.java +++ b/src/test/java/tasmod/virtual/VirtualInputTest.java @@ -13,9 +13,6 @@ import com.minecrafttas.mctcommon.events.EventListenerRegistry; import com.minecrafttas.tasmod.events.EventVirtualInput; -import com.minecrafttas.tasmod.events.EventVirtualInput.EventVirtualCameraAngleTick; -import com.minecrafttas.tasmod.events.EventVirtualInput.EventVirtualKeyboardTick; -import com.minecrafttas.tasmod.events.EventVirtualInput.EventVirtualMouseTick; import com.minecrafttas.tasmod.virtual.VirtualCameraAngle; import com.minecrafttas.tasmod.virtual.VirtualInput; import com.minecrafttas.tasmod.virtual.VirtualKey; From ab5f91d261e97f3dea48260d9229e40634f7d2cb Mon Sep 17 00:00:00 2001 From: Scribble Date: Mon, 8 Jul 2024 10:57:31 +0200 Subject: [PATCH 70/79] Add .gitattributes file --- .gitattributes | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..c3d5a3da --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +*.java diff=java +*.md diff=markdown \ No newline at end of file From d3a11d876a929be79c09fbe4de875fd606a7d74a Mon Sep 17 00:00:00 2001 From: Scribble Date: Mon, 8 Jul 2024 23:03:47 +0200 Subject: [PATCH 71/79] [PlaybackSerialiser] Reduced clutter Removed a lot empty slots from the file - [VirtualInput] Added #isEmpty() - Fixed currentLine not containing the rough line during serialisation --- .../tasfile/flavor/SerialiserFlavorBase.java | 81 +++++++++++++++++-- .../tasmod/virtual/Subtickable.java | 4 + .../tasmod/virtual/VirtualCameraAngle.java | 5 ++ .../tasmod/virtual/VirtualKeyboard.java | 4 + .../tasmod/virtual/VirtualMouse.java | 5 ++ .../tasmod/virtual/VirtualPeripheral.java | 8 ++ .../tasfile/SerialiserFlavorBaseTest.java | 1 + 7 files changed, 100 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java index 94d153f3..b679bed3 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java @@ -21,6 +21,7 @@ import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata; import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackLoadException; import com.minecrafttas.tasmod.registries.TASmodAPIRegistry; +import com.minecrafttas.tasmod.virtual.Subtickable; import com.minecrafttas.tasmod.virtual.VirtualCameraAngle; import com.minecrafttas.tasmod.virtual.VirtualKey; import com.minecrafttas.tasmod.virtual.VirtualKeyboard; @@ -90,6 +91,7 @@ protected void serialiseFileCommandNames(List out) { List extensionList = TASmodAPIRegistry.PLAYBACK_FILE_COMMAND.getEnabled(); extensionList.forEach(extension -> stringlist.add(extension.getExtensionName())); out.add("FileCommand-Extensions: " + String.join(", ", stringlist)); + out.add(""); } protected void serialiseMetadata(List out) { @@ -122,14 +124,17 @@ public BigArrayList serialise(BigArrayList inputs, long t currentTick = i; TickContainer container = inputs.get(i); serialiseContainer(out, container); + previousTickContainer = container; } return out; } protected void serialiseContainer(BigArrayList out, TickContainer container) { + currentLine = out.size()-1; List serialisedKeyboard = serialiseKeyboard(container.getKeyboard()); List serialisedMouse = serialiseMouse(container.getMouse()); List serialisedCameraAngle = serialiseCameraAngle(container.getCameraAngle()); + pruneListEndEmpty(serialisedCameraAngle); PlaybackFileCommandContainer fileCommandsInline = TASmodAPIRegistry.PLAYBACK_FILE_COMMAND.handleOnSerialiseInline(currentTick, container); PlaybackFileCommandContainer fileCommandsEndline = TASmodAPIRegistry.PLAYBACK_FILE_COMMAND.handleOnSerialiseEndline(currentTick, container); @@ -163,8 +168,11 @@ protected String serialiseFileCommandsInLine(List fileComma protected List serialiseKeyboard(VirtualKeyboard keyboard) { List out = new ArrayList<>(); - List list = keyboard.getAll(); - for (VirtualKeyboard subtick : list) { + + List subticks = new ArrayList<>(keyboard.getAll()); + pruneListEndEmptySubtickable(subticks); + + for (VirtualKeyboard subtick : subticks) { out.add(subtick.toString2()); } return out; @@ -172,16 +180,30 @@ protected List serialiseKeyboard(VirtualKeyboard keyboard) { protected List serialiseMouse(VirtualMouse mouse) { List out = new ArrayList<>(); - for (VirtualMouse subtick : mouse.getAll()) { + + List subticks = new ArrayList<>(mouse.getAll()); + pruneListEndEmptySubtickable(subticks); + + for (VirtualMouse subtick : subticks) { out.add(subtick.toString2()); } return out; } protected List serialiseCameraAngle(VirtualCameraAngle cameraAngle) { + + VirtualCameraAngle previousCamera = null; + if(previousTickContainer != null) { + previousCamera = previousTickContainer.getCameraAngle(); + } + List out = new ArrayList<>(); for (VirtualCameraAngle subtick : cameraAngle.getAll()) { - out.add(subtick.toString2()); + + if(!subtick.equals(previousCamera)) + out.add(subtick.toString2()); + + previousCamera = subtick; } return out; } @@ -588,7 +610,7 @@ protected void deserialiseContainer(BigArrayList out, List lines, List serialisedKeyboard, List serialisedMouse, List serialisedCameraAngle, List commentsAtEnd, List> endlineFileCommands) { + String previousCamera = null; + if(previousTickContainer != null) { + previousCamera = previousTickContainer.getCameraAngle().toString2(); + } + for (String line : lines) { - Matcher tickMatcher = extract("^\\t?\\d+\\|(.*?)\\|(.*?)\\|(\\S*)\\s?", line); + if (tickMatcher.find()) { if (!tickMatcher.group(1).isEmpty()) { serialisedKeyboard.add(tickMatcher.group(1)); @@ -829,8 +856,13 @@ protected void splitInputs(List lines, List serialisedKeyboard, if (!tickMatcher.group(2).isEmpty()) { serialisedMouse.add(tickMatcher.group(2)); } + if (!tickMatcher.group(3).isEmpty()) { serialisedCameraAngle.add(tickMatcher.group(3)); + previousCamera = tickMatcher.group(3); + } else { + if(previousCamera!=null) + serialisedCameraAngle.add(previousCamera); } List deserialisedFileCommands = new ArrayList<>(); @@ -926,12 +958,12 @@ public static void addAll(BigArrayList list, List } /** - * Empties the list if it only consists of null values + * Empties the list starting from the back if the values are null * * @param The element of the list * @param list The list to prune */ - protected void pruneListEnd(List list) { + protected void pruneListEndNull(List list) { List copy = new ArrayList<>(list); for (int i = copy.size() - 1; i >= 0; i--) { T element = copy.get(i); @@ -940,6 +972,39 @@ protected void pruneListEnd(List list) { list.remove(list.size() - 1); } } + + /** + * Empties the list starting from the back if the values are empty + * + * @param The element of the list + * @param list The list to prune + */ + protected void pruneListEndEmpty(List list) { + List copy = new ArrayList<>(list); + for (int i = copy.size() - 1; i >= 0; i--) { + String element = copy.get(i); + if (!element.isEmpty()) + return; + list.remove(list.size() - 1); + } + } + + /** + * Empties the list starting from the back if the values are empty + * + * @param The element of the list + * @param list The list to prune + */ + protected > void pruneListEndEmptySubtickable(List list) { + List copy = new ArrayList<>(list); + for (int i = copy.size() - 1; i >= 0; i--) { + T element = copy.get(i); + if (!element.isEmpty()) + return; + list.remove(list.size() - 1); + } + } + @Override public abstract SerialiserFlavorBase clone(); diff --git a/src/main/java/com/minecrafttas/tasmod/virtual/Subtickable.java b/src/main/java/com/minecrafttas/tasmod/virtual/Subtickable.java index 56a0873e..6e5b407d 100644 --- a/src/main/java/com/minecrafttas/tasmod/virtual/Subtickable.java +++ b/src/main/java/com/minecrafttas/tasmod/virtual/Subtickable.java @@ -98,4 +98,8 @@ protected boolean isIgnoreFirstUpdate() { protected void resetFirstUpdate() { ignoreFirstUpdate = true; } + + public boolean isEmpty() { + return true; + } } diff --git a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualCameraAngle.java b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualCameraAngle.java index 021ed975..7150e056 100644 --- a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualCameraAngle.java +++ b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualCameraAngle.java @@ -232,4 +232,9 @@ public Float getPitch() { public Float getYaw() { return yaw; } + + @Override + public boolean isEmpty() { + return super.isEmpty() && (pitch == null || pitch == 0) && (yaw == null || yaw == 0) ; + } } diff --git a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualKeyboard.java b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualKeyboard.java index cee04f72..f99cba45 100644 --- a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualKeyboard.java +++ b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualKeyboard.java @@ -389,4 +389,8 @@ public boolean equals(Object obj) { public List getCharList() { return ImmutableList.copyOf(charList); } + + public boolean isEmpty() { + return super.isEmpty() && charList.isEmpty(); + } } diff --git a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualMouse.java b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualMouse.java index b0bdb8bd..8398a231 100644 --- a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualMouse.java +++ b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualMouse.java @@ -352,4 +352,9 @@ public int getCursorX() { public int getCursorY() { return cursorY; } + + @Override + public boolean isEmpty() { + return super.isEmpty() && scrollWheel == 0 && cursorX == 0 && cursorY == 0; + } } diff --git a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualPeripheral.java b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualPeripheral.java index 32a90dfc..49f4c2b7 100644 --- a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualPeripheral.java +++ b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualPeripheral.java @@ -180,4 +180,12 @@ protected void deepCopyFrom(T peripheral) { this.subtickList.addAll(peripheral.subtickList); } + @Override + public boolean isEmpty() { + boolean flag = pressedKeys.isEmpty(); + if(pressedKeys.size() == 1) { + flag = pressedKeys.contains(VirtualKey.ZERO.getKeycode()) || pressedKeys.contains(VirtualKey.MOUSEMOVED.getKeycode()); + } + return super.isEmpty() && flag; + } } diff --git a/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java b/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java index 7768a641..77f19fc3 100644 --- a/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java +++ b/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java @@ -186,6 +186,7 @@ public String[] getFileCommandNames() { List expected = new ArrayList<>(); expected.add("FileCommand-Extensions: tasmod_testFileCommand"); + expected.add(""); assertIterableEquals(expected, actual); } From bd2e0f07ccf93ae3b95d8917a5429593820e6a4d Mon Sep 17 00:00:00 2001 From: Scribble Date: Tue, 9 Jul 2024 08:21:56 +0200 Subject: [PATCH 72/79] [PlaybackSerialiser] Renames PlaybackSerialiser2 to PlaybackSerialiser - Renamed PlaybackSerialiser to PlaybackSerialiserOld - Added documentation to PlaybackSerialiser - Removed BetaFlavorTest as that is tested in SerialiserFlavorBase - Fixed tests failing - Organised some imports --- .../playback/PlaybackControllerClient.java | 8 +- .../playback/tasfile/PlaybackSerialiser.java | 614 ++++++------------ .../playback/tasfile/PlaybackSerialiser2.java | 205 ------ .../tasfile/PlaybackSerialiserOld.java | 471 ++++++++++++++ .../tasmod/registries/TASmodPackets.java | 3 +- .../savestates/SavestateHandlerClient.java | 8 +- .../tasmod/virtual/Subtickable.java | 3 + .../tasfile/PlaybackSerialiserTest.java | 12 +- .../tasfile/integrated/BetaFlavorTest.java | 22 - 9 files changed, 691 insertions(+), 655 deletions(-) delete mode 100644 src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java create mode 100644 src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiserOld.java delete mode 100644 src/test/java/tasmod/playback/tasfile/integrated/BetaFlavorTest.java diff --git a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java index 3e4428df..ca6aa0f6 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/PlaybackControllerClient.java @@ -38,7 +38,7 @@ import com.minecrafttas.tasmod.events.EventVirtualInput; import com.minecrafttas.tasmod.networking.TASmodBufferBuilder; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata; -import com.minecrafttas.tasmod.playback.tasfile.PlaybackSerialiser2; +import com.minecrafttas.tasmod.playback.tasfile.PlaybackSerialiser; import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackLoadException; import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackSaveException; import com.minecrafttas.tasmod.playback.tasfile.flavor.SerialiserFlavorBase; @@ -73,7 +73,7 @@ * Information about the author etc. get stored in the playback controller too * and will be printed out in chat when the player loads into a world
    * Inputs are saved and loaded to/from file via the - * {@linkplain PlaybackSerialiser2} TODO Update with new {@link PlaybackMetadata} + * {@linkplain PlaybackSerialiser} TODO Update with new {@link PlaybackMetadata} * * @author Scribble * @@ -776,7 +776,7 @@ public void onClientPacket(PacketID id, ByteBuffer buf, String username) throws flavor = TASmodBufferBuilder.readString(buf); try { - PlaybackSerialiser2.saveToFile(new File(directory, name + ".mctas"), this, flavor); + PlaybackSerialiser.saveToFile(new File(directory, name + ".mctas"), this, flavor); } catch (PlaybackSaveException e) { if (mc.world != null) mc.ingameGUI.getChatGUI().printChatMessage(new TextComponentString(TextFormatting.RED + e.getMessage())); @@ -803,7 +803,7 @@ public void onClientPacket(PacketID id, ByteBuffer buf, String username) throws flavor = TASmodBufferBuilder.readString(buf); try { - TASmodClient.controller.setInputs(PlaybackSerialiser2.loadFromFile(new File(directory, name + ".mctas"), flavor)); + TASmodClient.controller.setInputs(PlaybackSerialiser.loadFromFile(new File(directory, name + ".mctas"), flavor)); } catch (PlaybackLoadException e) { if (mc.world != null) { TextComponentString textComponent = new TextComponentString(e.getMessage()); diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser.java index 05fe893e..e8945a7f 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser.java @@ -1,473 +1,263 @@ package com.minecrafttas.tasmod.playback.tasfile; -import static com.minecrafttas.tasmod.TASmod.LOGGER; - +import java.io.BufferedReader; import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; import java.io.IOException; -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; -import java.util.Map; - -import org.apache.commons.io.FileUtils; import com.dselent.bigarraylist.BigArrayList; -import com.minecrafttas.tasmod.TASmod; import com.minecrafttas.tasmod.playback.PlaybackControllerClient; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickContainer; -import com.minecrafttas.tasmod.playback.filecommands.integrated.DesyncMonitorFileCommandExtension; +import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackLoadException; +import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackSaveException; +import com.minecrafttas.tasmod.playback.tasfile.flavor.SerialiserFlavorBase; +import com.minecrafttas.tasmod.registries.TASmodAPIRegistry; import com.minecrafttas.tasmod.util.FileThread; -import com.minecrafttas.tasmod.util.LoggerMarkers; -import com.minecrafttas.tasmod.virtual.VirtualCameraAngle; -import com.minecrafttas.tasmod.virtual.VirtualKeyboard; -import com.minecrafttas.tasmod.virtual.VirtualMouse; -import com.mojang.realmsclient.util.Pair; /** - * Saves a given {@linkplain PlaybackControllerClient} to a file. Is also able to read an input container from a file.
    - *
    - * I plan to be backwards compatible so all the save functions have a V1 in their name by the time of writing this
    - *
    - * It also serializes the {@linkplain DesyncMonitorFileCommandExtension} from the input container
    - *
    - * Side: Client + * Loads and stores the {@link PlaybackControllerClient} to/from a file.
    * - * @author ScribbleLP - * + * @author Scribble */ -@Deprecated public class PlaybackSerialiser { - + + private static String defaultFlavor = "beta1"; + /** - * A list of sections to check for in the playback file - * @author ScribbleLP - * + * Saves the {@link PlaybackControllerClient} to a file + * + * @param file The file to save the serialised inputs to + * @param controller The {@link PlaybackControllerClient} to use. Uses the {@link PlaybackControllerClient#getInputs() getInputs()} method, to extract the ticks. + * @param flavorName The name of the {@link SerialiserFlavorBase flavor} to use for the tasfile + * @throws PlaybackSaveException When a saving operation fails */ - public enum SectionsV1{ - TICKS("Ticks", ""), - KEYBOARD("Keyboard", "(\\|Keyboard:)"), - MOUSE("Mouse", "(\\|Mouse:)"), - CAMERA("Camera", "(\\|Camera:)"); - - private String name; - private String regex; - - private SectionsV1(String nameIn, String regexIn) { - name=nameIn; - regex=regexIn; - } - - public String getName() { - return name; - } - - public String getRegex() { - return regex; - } - - public static String getRegexString() { - String out=""; - for(SectionsV1 section : values()) { - if(!section.getRegex().isEmpty()) { - String seperator="|"; - if(values().length-1==section.ordinal()) { - seperator=""; - } - out=out.concat(section.getRegex()+seperator); - } - } - return out; + public static void saveToFile(File file, PlaybackControllerClient controller, String flavorName) throws PlaybackSaveException { + saveToFile(file, controller, flavorName, -1L); + } + + /** + * Saves the {@link PlaybackControllerClient} partially to a file + * + * @param file The file to save the serialised inputs to + * @param controller The {@link PlaybackControllerClient} to use. Uses the {@link PlaybackControllerClient#getInputs() getInputs()} method, to extract the ticks. + * @param flavorName The name of the {@link SerialiserFlavorBase flavor} to use for the tasfile + * @param stopIndex The index at which the serialiser stops. Use -1L to parse the entire file + * @throws PlaybackSaveException When a saving operation fails + */ + public static void saveToFile(File file, PlaybackControllerClient controller, String flavorName, long stopIndex) throws PlaybackSaveException { + if (controller == null) { + throw new PlaybackSaveException("Save to file failed. No controller specified"); } + saveToFile(file, controller.getInputs(), flavorName, stopIndex); } - + /** - * Saves all inputs of the input container - * @param file Where to save the container - * @param container The container to save - * @throws IOException When the input container is empty + * Saves a BigArrayList of {@link TickContainer TickContainers} to a file + * + * @param file The file to save the serialised inputs to + * @param container The list of {@link TickContainer TickContainers} to use + * @param flavorName The name of the {@link SerialiserFlavorBase flavor} to use for the tasfile + * @throws PlaybackSaveException When a saving operation fails */ - public void saveToFileV1(File file, PlaybackControllerClient container) throws IOException { - saveToFileV1Until(file, container, -1); + public static void saveToFile(File file, BigArrayList container, String flavorName) throws PlaybackSaveException { + saveToFile(file, container, flavorName, -1); } - + /** - * Saves inputs up to a certain index of the input container - * @param file Where to save the container - * @param container The container to save - * @param index index until the inputs get saved - * @throws IOException When the input container is empty + * Saves a BigArrayList of {@link TickContainer TickContainers} partially to a file + * @param file The file to save the serialised inputs to + * @param container The list of {@link TickContainer TickContainers} to use + * @param flavorName The name of the {@link SerialiserFlavorBase flavor} to use for the tasfile + * @param stopIndex The index at which the serialiser stops. Use -1L to parse the entire file + * @throws PlaybackSaveException When a saving operation fails */ - public void saveToFileV1Until(File file, PlaybackControllerClient container, long index) throws IOException{ - LOGGER.debug(LoggerMarkers.Playback, "Saving playback controller to file {}", file); - if (container.size() == 0) { - throw new IOException("There are no inputs to save to a file"); + public static void saveToFile(File file, BigArrayList container, String flavorName, long stopIndex) throws PlaybackSaveException { + if (file == null) { + throw new PlaybackSaveException("Save to file failed. No file specified"); } - FileThread fileThread = new FileThread(file, false); -// FileThread monitorThread= new FileThread(new File(file, "../"+file.getName().replace(".mctas", "")+".mon"), false); - fileThread.start(); -// monitorThread.start(); - -// fileThread.addLine("################################################# TASFile ###################################################\n" -// + "# Version:1 #\n" -// + "# This file was generated using the Minecraft TASMod #\n" -// + "# #\n" -// + "# Any errors while reading this file will be printed out in the console and the chat #\n" -// + "# #\n" -// + "#------------------------------------------------ Header ---------------------------------------------------#\n" -// + "#Author:" + container.getAuthors() + "\n" -// + "# #\n" -// + "#Title:" + container.getTitle() + "\n" -// + "# #\n" -// + "#Playing Time:" + container.getPlaytime() + "\n" -// + "# #\n" -// + "#Rerecords:"+container.getRerecords() + "\n" -// + "# #\n" -// + "#----------------------------------------------- Settings --------------------------------------------------#\n" -// + "#StartPosition:"+container.getStartLocation()+"\n" -// + "# #\n" -// + "#StartSeed:" + container.getStartSeed() + "\n" -// + "#############################################################################################################\n" -// + "#Comments start with \"//\" at the start of the line, comments with # will not be saved\n"); - - BigArrayList ticks = container.getInputs(); -// Map>> cbytes= container.getControlBytes(); -// Map> comments = container.getComments(); - -// for (int i = 0; i < ticks.size(); i++) { -// if(i==index) { -// break; -// } -// -// // Add comments -// if(comments.containsKey(i)) { -// List multiLine=comments.get(i); -// multiLine.forEach(comment -> { -// fileThread.addLine("//"+comment+"\n"); -// }); -// } - - // Add controlbytes -// if(cbytes.containsKey(i)) { -// List> cbytelist= cbytes.get(i); -// String cbyteString= ControlByteHandler.toString(cbytelist); -// if(!cbyteString.isEmpty()) { -// fileThread.addLine(cbyteString); -// } -// } -// -// // Add a data line -// TickContainer tickInput = ticks.get(i); -// fileThread.addLine(tickInput.toString() + "~&\t\t\t\t//Monitoring:"+container.desyncMonitor.get(i)+"\n"); -// } -// fileThread.close(); - } + if (container == null) { + throw new PlaybackSaveException("Save to file failed. No tickcontainer list specified"); + } - public int getFileVersion(File file) throws IOException { - LOGGER.trace(LoggerMarkers.Playback, "Retrieving file version from {}", file); - List lines = FileUtils.readLines(file, Charset.defaultCharset()); - for (String line : lines) { - if (line.contains("Version")) { - String trimmed = line.replaceAll("#|\t", ""); - int tick=0; - try { - tick=Integer.parseInt(trimmed.split(":")[1]); - } catch (NumberFormatException e) { - throw new IOException("Can't read the file version: "+trimmed); - } - return tick; - } + if (flavorName == null || flavorName.isEmpty()) { + if (defaultFlavor == null || defaultFlavor.isEmpty()) + throw new PlaybackSaveException("No default flavor specified... Please specify a flavor name first"); + flavorName = defaultFlavor; + } else { + defaultFlavor = flavorName; } - return 0; - } - public PlaybackControllerClient fromEntireFileV1(File file) throws IOException { - LOGGER.debug(LoggerMarkers.Playback, "Loading playback controller to file {}", file); - List lines = FileUtils.readLines(file, StandardCharsets.UTF_8); - - File monitorFile=new File(file, "../"+file.getName().replace(".mctas", "")+".mon"); - - List monitorLines=new ArrayList<>(); - - // Read the legacy monitoring file system. Still reads the file but deletes it afterwards - if(monitorFile.exists()) { - monitorLines = FileUtils.readLines(monitorFile, StandardCharsets.UTF_8); - monitorFile.delete(); + FileThread writerThread; + try { + writerThread = new FileThread(file, false); + } catch (FileNotFoundException e) { + throw new PlaybackSaveException(e, "Trying to save the file %s, but the file can't be created", file.getName()); } - boolean oldmonfileLoaded=!monitorLines.isEmpty(); + writerThread.start(); - PlaybackControllerClient controller = new PlaybackControllerClient(); + SerialiserFlavorBase flavor = TASmodAPIRegistry.SERIALISER_FLAVOR.getFlavor(flavorName); - String author = "Insert author here"; + List header = flavor.serialiseHeader(); + for (String line : header) { + writerThread.addLine(line); + } - String title = "Insert TAS category here"; + BigArrayList tickLines = flavor.serialise(container, stopIndex); + for (long i = 0; i < tickLines.size(); i++) { + writerThread.addLine(tickLines.get(i)); + } - String playtime = "00:00.0"; + writerThread.close(); + } - int rerecords = 0; - - // No default start location - String startLocation=""; - - // Default the start seed to the current global ktrng seed. If KTRNG is not loaded, defaults to 0 - long startSeed=TASmod.ktrngHandler.getGlobalSeedClient(); + /** + * Loads a BigArrayList of {@link TickContainer TickContainers} from a file.
    + * Tries to determine the {@link SerialiserFlavorBase flavor} by reading the header of the TASfile + * + * @param file The file to load from + * @return The loaded BigArrayList of {@link TickContainer TickContainers} + * @throws PlaybackLoadException If the file contains errors + * @throws IOException If the file could not be read + */ + public static BigArrayList loadFromFile(File file) throws PlaybackLoadException, IOException { + if (file == null) { + throw new PlaybackLoadException("Load from file failed. No file specified"); + } + if (!file.exists()) { + throw new PlaybackLoadException("Trying to load %s but the file doesn't exist", file.getName()); + } + + SerialiserFlavorBase flavor = readFlavor(file); - // Clear the current container before reading new data - controller.clear(); + return loadFromFile(file, flavor); + } - int linenumber = 0; //The current line number + /** + * Loads a BigArrayList of {@link TickContainer TickContainers} from a file, with a specific flavor + * + * @param file The file to load from + * @param flavorName The name of the {@link SerialiserFlavorBase flavor} to use. If the detected flavor in the TASfile mismatches, a {@link PlaybackLoadException} is thrown + * @return The loaded BigArrayList of {@link TickContainer TickContainers} + * @throws PlaybackLoadException If the file contains errors + * @throws IOException If the file could not be read + */ + public static BigArrayList loadFromFile(File file, String flavorName) throws PlaybackLoadException, IOException { - for (String line : lines) { - linenumber++; - int tickcount=(int) controller.getInputs().size(); - // Read out header - if (line.startsWith("#")) { - // Read author tag - if (line.startsWith("#Author:")) { - author = line.split(":")[1]; - // Read title tag - } else if (line.startsWith("#Title:")) { - title = line.split(":")[1]; - // Read playtime - } else if (line.startsWith("#Playing Time:")) { - playtime = line.split("Playing Time:")[1]; - // Read rerecords - } else if (line.startsWith("#Rerecords:")) { - rerecords = Integer.parseInt(line.split(":")[1]); - // Read start position - } else if (line.startsWith("#StartPosition:")) { - startLocation = line.replace("#StartPosition:", ""); - // Read start seed - } else if (line.startsWith("#StartSeed:")) { - startSeed = Long.parseLong(line.replace("#StartSeed:", "")); - } - // Read control bytes - } else if (line.startsWith("$") && line.replace('$', ' ').trim().contains(" ")) { - String[] sections = line.replace('$', ' ').trim().split(" ", 2); - if (sections.length == 0) - continue; - String control = sections[0]; - String[] params = sections[1].split(" "); -// List> cbytes = controller.getControlBytes().getOrDefault(tickcount, new ArrayList<>()); -// cbytes.add(Pair.of(control, params)); -// controller.getControlBytes().put(tickcount, cbytes); - //Read comments - } else if (line.startsWith("//")) { -// List commentList = controller.getComments().getOrDefault(tickcount, new ArrayList<>()); -// commentList.add(line.replace("//", "")); -// controller.getComments().put(tickcount, commentList); - //Read data - } else { - - // Splitting the line into a data- and commentPart, the comment part will most likely contain the Monitoring - String dataPart=line; - String commentPart=""; - if(line.contains("~&")) { - String[] splitComments=line.split("~&"); - dataPart=splitComments[0]; - commentPart=splitComments[1]; - } - String[] sections = dataPart.split(SectionsV1.getRegexString()); - - if (sections.length != SectionsV1.values().length) { - throw new IOException("Error in line " + linenumber + ". Cannot read the line correctly"); - } - -// controller.getInputs().add(new TickInputContainer(readTicks(sections[0], linenumber), readKeyboard(sections[1], linenumber), readMouse(sections[2], linenumber), readSubtick(sections[3], linenumber))); - - if(!oldmonfileLoaded) { - String[] commentData = commentPart.split("Monitoring:"); - if(commentData.length==2) { - monitorLines.add(commentData[1]); - } - } - } - } -// controller.setAuthors(author); -// controller.setTitle(title); -// controller.setPlaytime(playtime); -// controller.setRerecords(rerecords); -// controller.setStartLocation(startLocation); -// controller.setStartSeed(startSeed); - if(!monitorLines.isEmpty()) { -// controller.desyncMonitor = new DesyncMonitoringFileCommand(controller, monitorLines); + // If the flavor is null or empty, try to determine the flavor by reading the header + if (flavorName == null || flavorName.isEmpty()) { + return loadFromFile(file); } - - //If an old monitoring file is loaded, save the file immediately to not loose any data. - if(oldmonfileLoaded) { - saveToFileV1(file, controller); + + // Try to get the flavor from the registry via its name + SerialiserFlavorBase flavor = TASmodAPIRegistry.SERIALISER_FLAVOR.getFlavor(flavorName); + + if (flavor == null) { + throw new PlaybackLoadException("Flavor name %s doesn't exist.", flavorName); } - - return controller; - } - private int readTicks(String section, int linenumber) throws IOException { - int ticks = 0; - try { - ticks = Integer.parseInt(section); - } catch (NumberFormatException e) { - throw new IOException(section + " is not a recognised number in line " + linenumber); + // Read the head of the TASfile to check if the flavors match + SerialiserFlavorBase flavorInFile = readFlavor(file); + if (!flavor.equals(flavorInFile)) { + throw new PlaybackLoadException("Detected flavor %s in the TASfile, which does not match the specified flavor: %s"); } - return ticks; + + return loadFromFile(file, flavor); } - - private VirtualKeyboard readKeyboard(String section, int linenumber) throws IOException { - VirtualKeyboard keyboard = new VirtualKeyboard(); - // Remove the prefix - section = section.replace("Keyboard:", ""); + /** + * Loads a BigArrayList of {@link TickContainer TickContainers} from a file, with a specific flavor + * + * @param file The file to load from + * @param flavor The {@link SerialiserFlavorBase flavor} to use. If the detected flavor in the TASfile mismatches, a {@link PlaybackLoadException} is thrown + * @return The loaded BigArrayList of {@link TickContainer TickContainers} + * @throws PlaybackLoadException If the file contains errors + * @throws IOException If the file could not be read + */ + public static BigArrayList loadFromFile(File file, SerialiserFlavorBase flavor) throws PlaybackLoadException, IOException { + if (file == null) { + throw new PlaybackLoadException("Load from file failed. No file specified"); + } - // Split in keys and characters - String[] keys = section.split(";"); + // Read file + BufferedReader reader = null; - // If there is nothing, return the empty keyboard - if (keys.length == 0) { - return keyboard; + try { + reader = new BufferedReader(new FileReader(file)); + } catch (FileNotFoundException e) { + throw new PlaybackLoadException("Trying to load %s, but the file doesn't exist", file.getName()); } - // Check if the keylist is empty - if (!keys[0].isEmpty()) { - - // Split multiple keys - String[] splitKeys = keys[0].split(","); - - for (String key : splitKeys) { - -// VirtualKey vkey = null; -// // Check if the key is a keycode -// if (isNumeric(key)) { -// vkey = keyboard.get(Integer.parseInt(key)); -// } else { -// vkey = keyboard.get(key); -// } -// -// if (vkey == null) { -// throw new IOException(key + " is not a recognised keyboard key in line " + linenumber); -// } -// -// vkey.setPressed(true); - } - } - - char[] chars = {}; - //Check if the characterlist is empty - if (keys.length == 2) { - chars = keys[1].replace("\\n", "\n").toCharArray(); //Replacing the "\n" in lines to the character \n + BigArrayList lines = new BigArrayList<>(); + String line = null; + while ((line = reader.readLine()) != null) { + lines.add(line); } - - for (char onechar : chars) { -// keyboard.addChar(onechar); - } - return keyboard; + reader.close(); + + // Deserialise Header + List headerLines = flavor.extractHeader(lines); + flavor.deserialiseHeader(headerLines); + + // Deserialise main data + BigArrayList deserialisedContainers = flavor.deserialise(lines, headerLines.size()); + + return deserialisedContainers; } - private VirtualMouse readMouse(String section, int linenumber) throws IOException { - VirtualMouse mouse = new VirtualMouse(); - - // Remove the prefix - section = section.replace("Mouse:", ""); - - //Split into buttons and paths... - String buttons = section.split(";")[0]; - String path = section.split(";")[1]; - - //Check whether the button is empty - if(!buttons.isEmpty()) { - - //Splitting multiple buttons - String[] splitButtons=buttons.split(","); - for (String button : splitButtons) { - -// VirtualKey vkey = null; -// // Check if the key is a keycode -// if (isNumeric(button)) { -// vkey = mouse.get(Integer.parseInt(button)); -// } else { -// vkey = mouse.get(button); -// } -// if (vkey == null) { -// throw new IOException(button + " is not a recognised mouse key in line " + linenumber); -// } -// mouse.get(button).setPressed(true); + /** + * Searches in a list of lines if one of the {@link SerialiserFlavorBase flavors} matches + * @param lines The lines to search through + * @param flavorList The list of {@link SerialiserFlavorBase flavor} to check for + * @return A copy of the {@link SerialiserFlavorBase flavor} that was found + * @throws PlaybackLoadException If no {@link SerialiserFlavorBase flavor} was found + */ + public static SerialiserFlavorBase searchForFlavor(List lines, List flavorList) { + for (SerialiserFlavorBase flavor : flavorList) { + if (flavor.deserialiseFlavorName(lines)) { + return flavor.clone(); } } -// mouse.setPath(readPath(path, linenumber, mouse)); - - return mouse; + throw new PlaybackLoadException("Couldn't find a flavorname in the file. TASfile is missing a flavor-extension or the file is broken"); } -// private List readPath(String section, int linenumber, VirtualMouse mouse) throws IOException { -// List path = new ArrayList(); -// -// section = section.replace("[", "").replace("]", ""); -// String[] pathNodes = section.split("->"); -// -// for (String pathNode : pathNodes) { -// String[] split = pathNode.split(","); -// -// int length=split.length; -// int scrollWheel = 0; -// int cursorX = 0; -// int cursorY = 0; -// try { -// scrollWheel = Integer.parseInt(split[length-3]); -// cursorX = Integer.parseInt(split[length-2]); -// cursorY = Integer.parseInt(split[length-1]); -// } catch (NumberFormatException e) { -// throw new IOException("'" + pathNode + "' couldn't be read in line " + linenumber+": Something is not a number"); -// } catch (ArrayIndexOutOfBoundsException e) { -// throw new IOException("'" + pathNode + "' couldn't be read in line " + linenumber+": Something is missing or is too much"); -// } -// PathNode node = mouse.new PathNode(); -// for (int i=0; i lines = new ArrayList<>(); + String line = null; + + // Reads the first 100 lines + for (int i = 0; i < 100; i++) { + + line = reader.readLine(); + + if (line != null) { + lines.add(line); + } } - return true; + reader.close(); + + SerialiserFlavorBase flavor = null; + + flavor = searchForFlavor(lines, TASmodAPIRegistry.SERIALISER_FLAVOR.getFlavors()); + return flavor; } } diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java deleted file mode 100644 index 391aa995..00000000 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiser2.java +++ /dev/null @@ -1,205 +0,0 @@ -package com.minecrafttas.tasmod.playback.tasfile; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import com.dselent.bigarraylist.BigArrayList; -import com.minecrafttas.tasmod.playback.PlaybackControllerClient; -import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickContainer; -import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackLoadException; -import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackSaveException; -import com.minecrafttas.tasmod.playback.tasfile.flavor.SerialiserFlavorBase; -import com.minecrafttas.tasmod.registries.TASmodAPIRegistry; -import com.minecrafttas.tasmod.util.FileThread; - -/** - * Serialises and deserialises the {@link PlaybackControllerClient}.
    - * Also contains methods to save and read the {@link PlaybackControllerClient} - * to/from a file - * - * @author Scribble - */ -public class PlaybackSerialiser2 { - - private static String defaultFlavor = "beta1"; - - public static void saveToFile(File file, PlaybackControllerClient controller, String flavorname) throws PlaybackSaveException { - saveToFile(file, controller, flavorname, -1L); - } - - /** - * Saves the {@link PlaybackControllerClient} to a file - * - * @param file The file to save the serialised inputs to. - * @param controller - * @param flavor - * @throws FileNotFoundException - */ - public static void saveToFile(File file, PlaybackControllerClient controller, String flavorname, long stopIndex) throws PlaybackSaveException { - if (controller == null) { - throw new PlaybackSaveException("Save to file failed. No controller specified"); - } - saveToFile(file, controller.getInputs(), flavorname, stopIndex); - } - - public static void saveToFile(File file, BigArrayList container, String flavorname) throws PlaybackSaveException { - saveToFile(file, container, flavorname, -1); - } - - public static void saveToFile(File file, BigArrayList container, String flavorname, long stopIndex) throws PlaybackSaveException { - if (file == null) { - throw new PlaybackSaveException("Save to file failed. No file specified"); - } - - if (container == null) { - throw new PlaybackSaveException("Save to file failed. No tickcontainer list specified"); - } - - if (flavorname == null || flavorname.isEmpty()) { - if(defaultFlavor == null || defaultFlavor.isEmpty()) - throw new PlaybackSaveException("No default flavor specified... Please specify a flavor name first"); - flavorname = defaultFlavor; - } else { - defaultFlavor = flavorname; - } - - FileThread writerThread; - try { - writerThread = new FileThread(file, false); - } catch (FileNotFoundException e) { - throw new PlaybackSaveException(e, "Trying to save the file %s, but the file can't be created", file.getName()); - } - writerThread.start(); - - SerialiserFlavorBase flavor = TASmodAPIRegistry.SERIALISER_FLAVOR.getFlavor(flavorname); - - List header = flavor.serialiseHeader(); - for (String line : header) { - writerThread.addLine(line); - } - - BigArrayList tickLines = flavor.serialise(container, stopIndex); - for (long i = 0; i < tickLines.size(); i++) { - writerThread.addLine(tickLines.get(i)); - } - - writerThread.close(); - } - - /** - * Loads the {@link PlaybackControllerClient} from a file - * - * @param file The file to load from - * @return The loaded {@link PlaybackControllerClient} - * @throws IOException - */ - public static BigArrayList loadFromFile(File file) throws PlaybackLoadException, IOException { - if (file == null) { - throw new PlaybackLoadException("Load from file failed. No file specified"); - } - if(!file.exists()) { - throw new PlaybackLoadException("Trying to load %s but the file doesn't exist", file.getName()); - } - - SerialiserFlavorBase flavor = readFlavor(file); - - return loadFromFile(file, flavor); - } - - public static BigArrayList loadFromFile(File file, String flavorName) throws PlaybackLoadException, IOException { - - if(flavorName == null || flavorName.isEmpty()) { - return loadFromFile(file); - } - - SerialiserFlavorBase flavor = TASmodAPIRegistry.SERIALISER_FLAVOR.getFlavor(flavorName); - - if (flavor == null) { - throw new PlaybackLoadException("Flavor name %s doesn't exist.", flavorName); - } - - SerialiserFlavorBase flavorInFile = readFlavor(file); - if(!flavor.equals(flavorInFile)) { - throw new PlaybackLoadException("Detected flavor %s in the TASfile, which does not match the specified flavor: %s"); - } - - return loadFromFile(file, flavor); - } - - public static BigArrayList loadFromFile(File file, SerialiserFlavorBase flavor) throws PlaybackLoadException, IOException { - if (file == null) { - throw new PlaybackLoadException("Load from file failed. No file specified"); - } - - // Read file - BufferedReader reader = null; - - try { - reader = new BufferedReader(new FileReader(file)); - } catch (FileNotFoundException e) { - throw new PlaybackLoadException("Trying to load %s, but the file doesn't exist", file.getName()); - } - - BigArrayList lines = new BigArrayList<>(); - String line = null; - - while ((line = reader.readLine()) != null) { - lines.add(line); - } - - reader.close(); - - // Deserialise Header - List headerLines = flavor.extractHeader(lines); - - flavor.deserialiseHeader(headerLines); - - // Deserialise main data - BigArrayList deserialisedContainers = flavor.deserialise(lines, headerLines.size()); - - return deserialisedContainers; - } - - public static SerialiserFlavorBase searchForFlavor(List lines, List flavorList) { - for (SerialiserFlavorBase flavor : flavorList) { - if (flavor.deserialiseFlavorName(lines)) { - return flavor.clone(); - } - } - throw new PlaybackLoadException("Couldn't find a flavorname in the file. TASfile is missing a flavor-extension or the file is broken"); - } - - public static SerialiserFlavorBase readFlavor(File file) throws PlaybackLoadException, IOException { - // Read file - BufferedReader reader = null; - - try { - reader = new BufferedReader(new FileReader(file)); - } catch (FileNotFoundException e) { - throw new PlaybackLoadException("Trying to load %s but the file doesn't exist", file.getName()); - } - - List lines = new ArrayList<>(); - String line = null; - - for (int i = 0; i < 100; i++) { - - line = reader.readLine(); - - if (line != null) { - lines.add(line); - } - } - reader.close(); - - SerialiserFlavorBase flavor = null; - - flavor = searchForFlavor(lines, TASmodAPIRegistry.SERIALISER_FLAVOR.getFlavors()); // Test for the correct flavor on the first 100 lines - return flavor; - } -} diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiserOld.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiserOld.java new file mode 100644 index 00000000..9a36dcf2 --- /dev/null +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/PlaybackSerialiserOld.java @@ -0,0 +1,471 @@ +package com.minecrafttas.tasmod.playback.tasfile; + +import static com.minecrafttas.tasmod.TASmod.LOGGER; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.io.FileUtils; + +import com.dselent.bigarraylist.BigArrayList; +import com.minecrafttas.tasmod.TASmod; +import com.minecrafttas.tasmod.playback.PlaybackControllerClient; +import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickContainer; +import com.minecrafttas.tasmod.playback.filecommands.integrated.DesyncMonitorFileCommandExtension; +import com.minecrafttas.tasmod.util.FileThread; +import com.minecrafttas.tasmod.util.LoggerMarkers; +import com.minecrafttas.tasmod.virtual.VirtualCameraAngle; +import com.minecrafttas.tasmod.virtual.VirtualKeyboard; +import com.minecrafttas.tasmod.virtual.VirtualMouse; + +/** + * Saves a given {@linkplain PlaybackControllerClient} to a file. Is also able to read an input container from a file.
    + *
    + * I plan to be backwards compatible so all the save functions have a V1 in their name by the time of writing this
    + *
    + * It also serializes the {@linkplain DesyncMonitorFileCommandExtension} from the input container
    + *
    + * Side: Client + * + * @author ScribbleLP + * + */ +@Deprecated +public class PlaybackSerialiserOld { + + /** + * A list of sections to check for in the playback file + * @author ScribbleLP + * + */ + public enum SectionsV1{ + TICKS("Ticks", ""), + KEYBOARD("Keyboard", "(\\|Keyboard:)"), + MOUSE("Mouse", "(\\|Mouse:)"), + CAMERA("Camera", "(\\|Camera:)"); + + private String name; + private String regex; + + private SectionsV1(String nameIn, String regexIn) { + name=nameIn; + regex=regexIn; + } + + public String getName() { + return name; + } + + public String getRegex() { + return regex; + } + + public static String getRegexString() { + String out=""; + for(SectionsV1 section : values()) { + if(!section.getRegex().isEmpty()) { + String seperator="|"; + if(values().length-1==section.ordinal()) { + seperator=""; + } + out=out.concat(section.getRegex()+seperator); + } + } + return out; + } + } + + /** + * Saves all inputs of the input container + * @param file Where to save the container + * @param container The container to save + * @throws IOException When the input container is empty + */ + public void saveToFileV1(File file, PlaybackControllerClient container) throws IOException { + saveToFileV1Until(file, container, -1); + } + + /** + * Saves inputs up to a certain index of the input container + * @param file Where to save the container + * @param container The container to save + * @param index index until the inputs get saved + * @throws IOException When the input container is empty + */ + public void saveToFileV1Until(File file, PlaybackControllerClient container, long index) throws IOException{ + LOGGER.debug(LoggerMarkers.Playback, "Saving playback controller to file {}", file); + if (container.size() == 0) { + throw new IOException("There are no inputs to save to a file"); + } + FileThread fileThread = new FileThread(file, false); +// FileThread monitorThread= new FileThread(new File(file, "../"+file.getName().replace(".mctas", "")+".mon"), false); + + fileThread.start(); +// monitorThread.start(); + +// fileThread.addLine("################################################# TASFile ###################################################\n" +// + "# Version:1 #\n" +// + "# This file was generated using the Minecraft TASMod #\n" +// + "# #\n" +// + "# Any errors while reading this file will be printed out in the console and the chat #\n" +// + "# #\n" +// + "#------------------------------------------------ Header ---------------------------------------------------#\n" +// + "#Author:" + container.getAuthors() + "\n" +// + "# #\n" +// + "#Title:" + container.getTitle() + "\n" +// + "# #\n" +// + "#Playing Time:" + container.getPlaytime() + "\n" +// + "# #\n" +// + "#Rerecords:"+container.getRerecords() + "\n" +// + "# #\n" +// + "#----------------------------------------------- Settings --------------------------------------------------#\n" +// + "#StartPosition:"+container.getStartLocation()+"\n" +// + "# #\n" +// + "#StartSeed:" + container.getStartSeed() + "\n" +// + "#############################################################################################################\n" +// + "#Comments start with \"//\" at the start of the line, comments with # will not be saved\n"); + + BigArrayList ticks = container.getInputs(); +// Map>> cbytes= container.getControlBytes(); +// Map> comments = container.getComments(); + +// for (int i = 0; i < ticks.size(); i++) { +// if(i==index) { +// break; +// } +// +// // Add comments +// if(comments.containsKey(i)) { +// List multiLine=comments.get(i); +// multiLine.forEach(comment -> { +// fileThread.addLine("//"+comment+"\n"); +// }); +// } + + // Add controlbytes +// if(cbytes.containsKey(i)) { +// List> cbytelist= cbytes.get(i); +// String cbyteString= ControlByteHandler.toString(cbytelist); +// if(!cbyteString.isEmpty()) { +// fileThread.addLine(cbyteString); +// } +// } +// +// // Add a data line +// TickContainer tickInput = ticks.get(i); +// fileThread.addLine(tickInput.toString() + "~&\t\t\t\t//Monitoring:"+container.desyncMonitor.get(i)+"\n"); +// } +// fileThread.close(); + } + + public int getFileVersion(File file) throws IOException { + LOGGER.trace(LoggerMarkers.Playback, "Retrieving file version from {}", file); + List lines = FileUtils.readLines(file, Charset.defaultCharset()); + for (String line : lines) { + if (line.contains("Version")) { + String trimmed = line.replaceAll("#|\t", ""); + int tick=0; + try { + tick=Integer.parseInt(trimmed.split(":")[1]); + } catch (NumberFormatException e) { + throw new IOException("Can't read the file version: "+trimmed); + } + return tick; + } + } + return 0; + } + + public PlaybackControllerClient fromEntireFileV1(File file) throws IOException { + LOGGER.debug(LoggerMarkers.Playback, "Loading playback controller to file {}", file); + List lines = FileUtils.readLines(file, StandardCharsets.UTF_8); + + File monitorFile=new File(file, "../"+file.getName().replace(".mctas", "")+".mon"); + + List monitorLines=new ArrayList<>(); + + // Read the legacy monitoring file system. Still reads the file but deletes it afterwards + if(monitorFile.exists()) { + monitorLines = FileUtils.readLines(monitorFile, StandardCharsets.UTF_8); + monitorFile.delete(); + } + boolean oldmonfileLoaded=!monitorLines.isEmpty(); + + PlaybackControllerClient controller = new PlaybackControllerClient(); + + String author = "Insert author here"; + + String title = "Insert TAS category here"; + + String playtime = "00:00.0"; + + int rerecords = 0; + + // No default start location + String startLocation=""; + + // Default the start seed to the current global ktrng seed. If KTRNG is not loaded, defaults to 0 + long startSeed=TASmod.ktrngHandler.getGlobalSeedClient(); + + // Clear the current container before reading new data + controller.clear(); + + int linenumber = 0; //The current line number + + for (String line : lines) { + linenumber++; + int tickcount=(int) controller.getInputs().size(); + // Read out header + if (line.startsWith("#")) { + // Read author tag + if (line.startsWith("#Author:")) { + author = line.split(":")[1]; + // Read title tag + } else if (line.startsWith("#Title:")) { + title = line.split(":")[1]; + // Read playtime + } else if (line.startsWith("#Playing Time:")) { + playtime = line.split("Playing Time:")[1]; + // Read rerecords + } else if (line.startsWith("#Rerecords:")) { + rerecords = Integer.parseInt(line.split(":")[1]); + // Read start position + } else if (line.startsWith("#StartPosition:")) { + startLocation = line.replace("#StartPosition:", ""); + // Read start seed + } else if (line.startsWith("#StartSeed:")) { + startSeed = Long.parseLong(line.replace("#StartSeed:", "")); + } + // Read control bytes + } else if (line.startsWith("$") && line.replace('$', ' ').trim().contains(" ")) { + String[] sections = line.replace('$', ' ').trim().split(" ", 2); + if (sections.length == 0) + continue; + String control = sections[0]; + String[] params = sections[1].split(" "); +// List> cbytes = controller.getControlBytes().getOrDefault(tickcount, new ArrayList<>()); +// cbytes.add(Pair.of(control, params)); +// controller.getControlBytes().put(tickcount, cbytes); + //Read comments + } else if (line.startsWith("//")) { +// List commentList = controller.getComments().getOrDefault(tickcount, new ArrayList<>()); +// commentList.add(line.replace("//", "")); +// controller.getComments().put(tickcount, commentList); + //Read data + } else { + + // Splitting the line into a data- and commentPart, the comment part will most likely contain the Monitoring + String dataPart=line; + String commentPart=""; + if(line.contains("~&")) { + String[] splitComments=line.split("~&"); + dataPart=splitComments[0]; + commentPart=splitComments[1]; + } + String[] sections = dataPart.split(SectionsV1.getRegexString()); + + if (sections.length != SectionsV1.values().length) { + throw new IOException("Error in line " + linenumber + ". Cannot read the line correctly"); + } + +// controller.getInputs().add(new TickInputContainer(readTicks(sections[0], linenumber), readKeyboard(sections[1], linenumber), readMouse(sections[2], linenumber), readSubtick(sections[3], linenumber))); + + if(!oldmonfileLoaded) { + String[] commentData = commentPart.split("Monitoring:"); + if(commentData.length==2) { + monitorLines.add(commentData[1]); + } + } + } + } +// controller.setAuthors(author); +// controller.setTitle(title); +// controller.setPlaytime(playtime); +// controller.setRerecords(rerecords); +// controller.setStartLocation(startLocation); +// controller.setStartSeed(startSeed); + if(!monitorLines.isEmpty()) { +// controller.desyncMonitor = new DesyncMonitoringFileCommand(controller, monitorLines); + } + + //If an old monitoring file is loaded, save the file immediately to not loose any data. + if(oldmonfileLoaded) { + saveToFileV1(file, controller); + } + + return controller; + } + + private int readTicks(String section, int linenumber) throws IOException { + int ticks = 0; + try { + ticks = Integer.parseInt(section); + } catch (NumberFormatException e) { + throw new IOException(section + " is not a recognised number in line " + linenumber); + } + return ticks; + } + + private VirtualKeyboard readKeyboard(String section, int linenumber) throws IOException { + VirtualKeyboard keyboard = new VirtualKeyboard(); + + // Remove the prefix + section = section.replace("Keyboard:", ""); + + // Split in keys and characters + String[] keys = section.split(";"); + + // If there is nothing, return the empty keyboard + if (keys.length == 0) { + return keyboard; + } + + // Check if the keylist is empty + if (!keys[0].isEmpty()) { + + // Split multiple keys + String[] splitKeys = keys[0].split(","); + + for (String key : splitKeys) { + +// VirtualKey vkey = null; +// // Check if the key is a keycode +// if (isNumeric(key)) { +// vkey = keyboard.get(Integer.parseInt(key)); +// } else { +// vkey = keyboard.get(key); +// } +// +// if (vkey == null) { +// throw new IOException(key + " is not a recognised keyboard key in line " + linenumber); +// } +// +// vkey.setPressed(true); + } + } + + char[] chars = {}; + //Check if the characterlist is empty + if (keys.length == 2) { + chars = keys[1].replace("\\n", "\n").toCharArray(); //Replacing the "\n" in lines to the character \n + } + + for (char onechar : chars) { +// keyboard.addChar(onechar); + } + return keyboard; + } + + private VirtualMouse readMouse(String section, int linenumber) throws IOException { + VirtualMouse mouse = new VirtualMouse(); + + // Remove the prefix + section = section.replace("Mouse:", ""); + + //Split into buttons and paths... + String buttons = section.split(";")[0]; + String path = section.split(";")[1]; + + //Check whether the button is empty + if(!buttons.isEmpty()) { + + //Splitting multiple buttons + String[] splitButtons=buttons.split(","); + for (String button : splitButtons) { + +// VirtualKey vkey = null; +// // Check if the key is a keycode +// if (isNumeric(button)) { +// vkey = mouse.get(Integer.parseInt(button)); +// } else { +// vkey = mouse.get(button); +// } +// if (vkey == null) { +// throw new IOException(button + " is not a recognised mouse key in line " + linenumber); +// } +// mouse.get(button).setPressed(true); + } + } +// mouse.setPath(readPath(path, linenumber, mouse)); + + return mouse; + } + +// private List readPath(String section, int linenumber, VirtualMouse mouse) throws IOException { +// List path = new ArrayList(); +// +// section = section.replace("[", "").replace("]", ""); +// String[] pathNodes = section.split("->"); +// +// for (String pathNode : pathNodes) { +// String[] split = pathNode.split(","); +// +// int length=split.length; +// int scrollWheel = 0; +// int cursorX = 0; +// int cursorY = 0; +// try { +// scrollWheel = Integer.parseInt(split[length-3]); +// cursorX = Integer.parseInt(split[length-2]); +// cursorY = Integer.parseInt(split[length-1]); +// } catch (NumberFormatException e) { +// throw new IOException("'" + pathNode + "' couldn't be read in line " + linenumber+": Something is not a number"); +// } catch (ArrayIndexOutOfBoundsException e) { +// throw new IOException("'" + pathNode + "' couldn't be read in line " + linenumber+": Something is missing or is too much"); +// } +// PathNode node = mouse.new PathNode(); +// for (int i=0; i savestateContainerList; if (targetfile.exists()) { - savestateContainerList = PlaybackSerialiser2.loadFromFile(targetfile); + savestateContainerList = PlaybackSerialiser.loadFromFile(targetfile); } else { controller.setTASStateClient(TASstate.NONE, false); Minecraft.getMinecraft().player.sendMessage(new TextComponentString(ChatFormatting.YELLOW + "Inputs could not be loaded for this savestate,")); diff --git a/src/main/java/com/minecrafttas/tasmod/virtual/Subtickable.java b/src/main/java/com/minecrafttas/tasmod/virtual/Subtickable.java index 6e5b407d..92c4dab9 100644 --- a/src/main/java/com/minecrafttas/tasmod/virtual/Subtickable.java +++ b/src/main/java/com/minecrafttas/tasmod/virtual/Subtickable.java @@ -100,6 +100,9 @@ protected void resetFirstUpdate() { } public boolean isEmpty() { + if(isParent()) { + return subtickList.isEmpty(); + } return true; } } diff --git a/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java b/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java index ca0c5f01..83f2690e 100644 --- a/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java +++ b/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java @@ -25,7 +25,7 @@ import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandExtension; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadataRegistry.PlaybackMetadataExtension; -import com.minecrafttas.tasmod.playback.tasfile.PlaybackSerialiser2; +import com.minecrafttas.tasmod.playback.tasfile.PlaybackSerialiser; import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackLoadException; import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackSaveException; import com.minecrafttas.tasmod.playback.tasfile.flavor.SerialiserFlavorBase; @@ -188,13 +188,13 @@ void testSerialiser() { expected.add(new TickContainer(keyboard2, mouse2, angle2)); try { - PlaybackSerialiser2.saveToFile(file, expected, "Test"); + PlaybackSerialiser.saveToFile(file, expected, "Test"); } catch (PlaybackSaveException e) { e.printStackTrace(); } try { - BigArrayList actual = PlaybackSerialiser2.loadFromFile(file, testFlavor); + BigArrayList actual = PlaybackSerialiser.loadFromFile(file, testFlavor); assertBigArrayList(expected, actual); assertEquals("testing", testMetadata.actual); } catch (PlaybackLoadException | IOException e) { @@ -227,7 +227,7 @@ void testDeserialiser() throws PlaybackLoadException, IOException { e.printStackTrace(); } - BigArrayList actual = PlaybackSerialiser2.loadFromFile(file); + BigArrayList actual = PlaybackSerialiser.loadFromFile(file); BigArrayList expected = new BigArrayList<>(); @@ -309,7 +309,7 @@ void testFlavorNotFound() { } Throwable t = assertThrows(PlaybackLoadException.class, ()->{ - PlaybackSerialiser2.loadFromFile(file); + PlaybackSerialiser.loadFromFile(file); }); assertEquals("Couldn't find a flavorname in the file. TASfile is missing a flavor-extension or the file is broken", t.getMessage()); @@ -318,7 +318,7 @@ void testFlavorNotFound() { @Test void testFlavorIsNull() { Throwable t = assertThrows(PlaybackLoadException.class, ()->{ - PlaybackSerialiser2.loadFromFile(file, "NotAFlavor"); + PlaybackSerialiser.loadFromFile(file, "NotAFlavor"); }); assertEquals("Flavor name NotAFlavor doesn't exist.", t.getMessage()); diff --git a/src/test/java/tasmod/playback/tasfile/integrated/BetaFlavorTest.java b/src/test/java/tasmod/playback/tasfile/integrated/BetaFlavorTest.java deleted file mode 100644 index 48089694..00000000 --- a/src/test/java/tasmod/playback/tasfile/integrated/BetaFlavorTest.java +++ /dev/null @@ -1,22 +0,0 @@ -package tasmod.playback.tasfile.integrated; - -import java.io.File; - -import org.junit.jupiter.api.Assertions.*; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; - -import com.minecrafttas.tasmod.playback.tasfile.PlaybackSerialiser2; -import com.minecrafttas.tasmod.playback.tasfile.flavor.integrated.Beta1Flavor; -import com.minecrafttas.tasmod.registries.TASmodAPIRegistry; - -public class BetaFlavorTest { - - private Beta1Flavor flavor = new Beta1Flavor(); - - private File file = new File("src/test/resources/betaflavor"); - - @Test - void testSerialize() { - } -} From 102a8a8712876d7ee9c00dd9959b857f52afe883 Mon Sep 17 00:00:00 2001 From: Scribble Date: Tue, 9 Jul 2024 18:58:30 +0200 Subject: [PATCH 73/79] [PlaybackSerialiser] Starting with CommandFileCommand --- .../tasmod/commands/CommandFileCommand.java | 132 +++++++++++++++++- .../tasmod/commands/TabCompletionUtils.java | 51 ++++--- .../filecommands/PlaybackFileCommand.java | 7 +- .../PlaybackFileCommandsRegistry.java | 6 +- .../tasmod/registries/TASmodPackets.java | 17 ++- 5 files changed, 191 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/minecrafttas/tasmod/commands/CommandFileCommand.java b/src/main/java/com/minecrafttas/tasmod/commands/CommandFileCommand.java index 3d519eae..6e96d538 100644 --- a/src/main/java/com/minecrafttas/tasmod/commands/CommandFileCommand.java +++ b/src/main/java/com/minecrafttas/tasmod/commands/CommandFileCommand.java @@ -1,5 +1,135 @@ package com.minecrafttas.tasmod.commands; -public class CommandFileCommand { +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import com.minecrafttas.mctcommon.networking.exception.PacketNotImplementedException; +import com.minecrafttas.mctcommon.networking.exception.WrongSideException; +import com.minecrafttas.mctcommon.networking.interfaces.ClientPacketHandler; +import com.minecrafttas.mctcommon.networking.interfaces.PacketID; +import com.minecrafttas.mctcommon.networking.interfaces.ServerPacketHandler; +import com.minecrafttas.tasmod.TASmod; +import com.minecrafttas.tasmod.TASmodClient; +import com.minecrafttas.tasmod.networking.TASmodBufferBuilder; +import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandExtension; +import com.minecrafttas.tasmod.registries.TASmodAPIRegistry; +import com.minecrafttas.tasmod.registries.TASmodPackets; + +import static com.minecrafttas.tasmod.registries.TASmodPackets.*; + +import net.minecraft.command.CommandBase; +import net.minecraft.command.CommandException; +import net.minecraft.command.ICommandSender; +import net.minecraft.command.PlayerNotFoundException; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.text.TextComponentString; +import net.minecraft.util.text.TextFormatting; + +public class CommandFileCommand extends CommandBase implements ClientPacketHandler, ServerPacketHandler { + + CompletableFuture> fileCommandList = null; + + @Override + public String getName() { + return "filecommand"; + } + + @Override + public String getUsage(ICommandSender iCommandSender) { + return "/filecommand [enable|disable]"; + } + + @Override + public void execute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException { + if (sender instanceof EntityPlayer) { + if (sender.canUseCommand(2, "fileCommand")) { + + // Get the list of file commands from the server + List names; + try { + names = TASmod.tabCompletionUtils.getFileCommandList(getCommandSenderAsPlayer(sender).getName()); + } catch (PlayerNotFoundException | InterruptedException | ExecutionException | TimeoutException e) { + sender.sendMessage(new TextComponentString(e.getMessage())); + return; + } + + if (args.length == 0) { + sender.sendMessage(new TextComponentString(String.join(" ", names))); + } + if (args.length == 1) { + sender.sendMessage(new TextComponentString(TextFormatting.RED + "Please add a filecommand " + getUsage(sender))); + } else if (args.length == 1) { + String filename = args[0]; + try { + TASmod.server.sendToAll(new TASmodBufferBuilder(PLAYBACK_LOAD).writeString(filename).writeString("")); + } catch (Exception e) { + e.printStackTrace(); + } + } else if (args.length == 2) { + String filename = args[0]; + String flavorname = args[1]; + try { + TASmod.server.sendToAll(new TASmodBufferBuilder(PLAYBACK_LOAD).writeString(filename).writeString(flavorname)); + } catch (Exception e) { + e.printStackTrace(); + } + } + } else { + sender.sendMessage(new TextComponentString(TextFormatting.RED + "You have no permission to use this command")); + } + } + } + + private List getExtensions(String playername) throws InterruptedException, ExecutionException, TimeoutException { + List out = new ArrayList<>(); + fileCommandList = new CompletableFuture<>(); + + List commands = fileCommandList.get(2, TimeUnit.SECONDS); + + return out; + } + + @Override + public PacketID[] getAcceptedPacketIDs() { + return new PacketID[] { COMMAND_FLAVORLIST }; + } + + @Override + public void onServerPacket(PacketID id, ByteBuffer buf, String username) throws PacketNotImplementedException, WrongSideException, Exception { + TASmodPackets packet = (TASmodPackets) id; + switch (packet) { + case COMMAND_FILECOMMANDLIST: + String filecommandnames = TASmodBufferBuilder.readString(buf); + fileCommandList.complete(Arrays.asList(filecommandnames.split("|"))); + break; + default: + break; + } + } + + @Override + public void onClientPacket(PacketID id, ByteBuffer buf, String username) throws PacketNotImplementedException, WrongSideException, Exception { + TASmodPackets packet = (TASmodPackets) id; + switch (packet) { + case COMMAND_FILECOMMANDLIST: + String filecommandnames = String.join("|", getFileCommandNames(TASmodAPIRegistry.PLAYBACK_FILE_COMMAND.getAll())); + TASmodClient.client.send(new TASmodBufferBuilder(COMMAND_FILECOMMANDLIST).writeString(filecommandnames)); + } + } + + private List getFileCommandNames(List fileCommands) { + List out = new ArrayList<>(); + fileCommands.forEach(element -> { + out.add(String.format("%s_%s", element.isEnabled() ? "E" : "D", element.toString())); + }); + return out; + } + } diff --git a/src/main/java/com/minecrafttas/tasmod/commands/TabCompletionUtils.java b/src/main/java/com/minecrafttas/tasmod/commands/TabCompletionUtils.java index e1f2a758..538454b9 100644 --- a/src/main/java/com/minecrafttas/tasmod/commands/TabCompletionUtils.java +++ b/src/main/java/com/minecrafttas/tasmod/commands/TabCompletionUtils.java @@ -21,78 +21,97 @@ import com.minecrafttas.tasmod.TASmod; import com.minecrafttas.tasmod.TASmodClient; import com.minecrafttas.tasmod.networking.TASmodBufferBuilder; +import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandExtension; import com.minecrafttas.tasmod.registries.TASmodAPIRegistry; import com.minecrafttas.tasmod.registries.TASmodPackets; import net.minecraft.client.Minecraft; +import net.minecraft.util.text.TextFormatting; -public class TabCompletionUtils implements ServerPacketHandler, ClientPacketHandler{ +public class TabCompletionUtils implements ServerPacketHandler, ClientPacketHandler { private volatile CompletableFuture> fileList = null; private volatile CompletableFuture> flavorList = null; - + private volatile CompletableFuture> fileCommandList = null; + @Override public PacketID[] getAcceptedPacketIDs() { return new PacketID[] { COMMAND_TASFILELIST, COMMAND_FLAVORLIST }; } //======== SERVER SIDE - + @Override public void onServerPacket(PacketID id, ByteBuffer buf, String username) throws PacketNotImplementedException, WrongSideException, Exception { TASmodPackets packet = (TASmodPackets) id; switch (packet) { case COMMAND_TASFILELIST: String filenames = TASmodBufferBuilder.readString(buf); - fileList.complete(Arrays.asList(filenames.split("/"))); + fileList.complete(Arrays.asList(filenames.split("|"))); break; case COMMAND_FLAVORLIST: String flavornames = TASmodBufferBuilder.readString(buf); - flavorList.complete(Arrays.asList(flavornames.split("/"))); + flavorList.complete(Arrays.asList(flavornames.split("|"))); + break; + case COMMAND_FILECOMMANDLIST: + String filecommandnames = TASmodBufferBuilder.readString(buf); + fileCommandList.complete(Arrays.asList(filecommandnames.split("|"))); default: break; } } - + public List getTASFileList(String playername) throws InterruptedException, ExecutionException, TimeoutException { fileList = new CompletableFuture<>(); try { TASmod.server.sendTo(playername, new TASmodBufferBuilder(COMMAND_TASFILELIST)); } catch (Exception e) { - e.printStackTrace(); + TASmod.LOGGER.catching(e); } - return fileList.get(2,TimeUnit.SECONDS); + return fileList.get(2, TimeUnit.SECONDS); } - + public List getFlavorList(String playername) throws InterruptedException, ExecutionException, TimeoutException { flavorList = new CompletableFuture<>(); try { TASmod.server.sendTo(playername, new TASmodBufferBuilder(COMMAND_FLAVORLIST)); } catch (Exception e) { - e.printStackTrace(); + TASmod.LOGGER.catching(e); + } + return flavorList.get(2, TimeUnit.SECONDS); + } + + public List getFileCommandList(String playername) throws InterruptedException, ExecutionException, TimeoutException { + fileCommandList = new CompletableFuture<>(); + try { + TASmod.server.sendTo(playername, new TASmodBufferBuilder(COMMAND_FILECOMMANDLIST)); + } catch (Exception e) { + TASmod.LOGGER.catching(e); } - return flavorList.get(2,TimeUnit.SECONDS); + return fileCommandList.get(2, TimeUnit.SECONDS); } - + //======== CLIENT SIDE - + @Override public void onClientPacket(PacketID id, ByteBuffer buf, String username) throws PacketNotImplementedException, WrongSideException, Exception { TASmodPackets packet = (TASmodPackets) id; switch (packet) { case COMMAND_TASFILELIST: - String filenames = String.join("/", getFilenames()); + String filenames = String.join("|", getFilenames()); TASmodClient.client.send(new TASmodBufferBuilder(COMMAND_TASFILELIST).writeString(filenames)); break; case COMMAND_FLAVORLIST: - String flavornames = String.join("/", TASmodAPIRegistry.SERIALISER_FLAVOR.getFlavorNames()); + String flavornames = String.join("|", TASmodAPIRegistry.SERIALISER_FLAVOR.getFlavorNames()); TASmodClient.client.send(new TASmodBufferBuilder(COMMAND_FLAVORLIST).writeString(flavornames)); + break; + default: break; } } - + private List getFilenames() { List tab = new ArrayList(); File folder = new File(Minecraft.getMinecraft().mcDataDir, "saves" + File.separator + "tasfiles"); diff --git a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java index 6d44d60d..9aed7f28 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommand.java @@ -30,7 +30,7 @@ public PlaybackFileCommand(String name, String... args) { public String getName() { return name; } - + public String[] getArgs() { return args; } @@ -95,6 +95,11 @@ public void setEnabled(boolean enabled) { onDisable(); this.enabled = enabled; } + + @Override + public String toString() { + return getExtensionName(); + } } public static class PlaybackFileCommandContainer extends LinkedHashMap { diff --git a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommandsRegistry.java b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommandsRegistry.java index 09e569c4..695bb8a9 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommandsRegistry.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommandsRegistry.java @@ -64,7 +64,11 @@ public List getEnabled() { return out; } - + + public List getAll(){ + return new ArrayList<>(REGISTRY.values()); + } + @Override public void onRecordTick(long index, TickContainer container) { enabledExtensions.forEach(extension -> { diff --git a/src/main/java/com/minecrafttas/tasmod/registries/TASmodPackets.java b/src/main/java/com/minecrafttas/tasmod/registries/TASmodPackets.java index 8c4396a5..95d30949 100644 --- a/src/main/java/com/minecrafttas/tasmod/registries/TASmodPackets.java +++ b/src/main/java/com/minecrafttas/tasmod/registries/TASmodPackets.java @@ -6,6 +6,9 @@ import com.minecrafttas.tasmod.commands.CommandFolder; import com.minecrafttas.tasmod.playback.PlaybackControllerClient; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TASstate; +import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand; +import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandExtension; +import com.minecrafttas.tasmod.playback.tasfile.flavor.SerialiserFlavorBase; import com.minecrafttas.tasmod.savestates.SavestateHandlerServer.PlayerHandler.MotionData; import com.minecrafttas.tasmod.tickratechanger.TickrateChangerServer.TickratePauseState; @@ -184,17 +187,25 @@ public enum TASmodPackets implements PacketID { *

    SIDE: Both
    * ARGS:
    * Server->Client None
    - * Client->Server String The string of TASfilenames seperated with / + * Client->Server String The string of TASfilenames seperated with | */ COMMAND_TASFILELIST, /** - *

    Requests the list of SerialiserFlavors from the client for use in tab completions + *

    Requests the list of {@link SerialiserFlavorBase SerialiserFlavors} from the client for use in tab completions *

    SIDE: Both
    * ARGS:
    * Server->Client None
    - * Client->Server String The string of flavors seperated with / + * Client->Server String The string of flavors seperated with | */ COMMAND_FLAVORLIST, + /** + *

    Requests the list of {@link PlaybackFileCommandExtension PlaybackFileCommandExtensions} from the client for use in tab completions + *

    SIDE: Bith
    + * ARGS:
    + * Server->Client None
    + * Client->Server String The string of file command names, seperated with | + */ + COMMAND_FILECOMMANDLIST, /** *

    Sets the KillTheRNG seed *

    SIDE: Both
    From d1e806ee277654c45756a9028573d864a864b89e Mon Sep 17 00:00:00 2001 From: Scribble Date: Tue, 9 Jul 2024 23:00:21 +0200 Subject: [PATCH 74/79] [PlaybackSerialiser] Finished CommandFileCommand --- .../java/com/minecrafttas/tasmod/TASmod.java | 5 + .../tasmod/commands/CommandFileCommand.java | 121 ++++++++++++++---- .../tasmod/commands/TabCompletionUtils.java | 23 +--- .../integrated/LabelFileCommandExtension.java | 4 + .../OptionsFileCommandExtension.java | 4 + .../tasmod/registries/TASmodPackets.java | 8 ++ 6 files changed, 120 insertions(+), 45 deletions(-) diff --git a/src/main/java/com/minecrafttas/tasmod/TASmod.java b/src/main/java/com/minecrafttas/tasmod/TASmod.java index 36cdc526..9fcee195 100644 --- a/src/main/java/com/minecrafttas/tasmod/TASmod.java +++ b/src/main/java/com/minecrafttas/tasmod/TASmod.java @@ -13,6 +13,7 @@ import com.minecrafttas.mctcommon.networking.PacketHandlerRegistry; import com.minecrafttas.mctcommon.networking.Server; import com.minecrafttas.tasmod.commands.CommandClearInputs; +import com.minecrafttas.tasmod.commands.CommandFileCommand; import com.minecrafttas.tasmod.commands.CommandFolder; import com.minecrafttas.tasmod.commands.CommandFullPlay; import com.minecrafttas.tasmod.commands.CommandFullRecord; @@ -74,6 +75,8 @@ public class TASmod implements ModInitializer, EventServerInit, EventServerStop{ public static final TabCompletionUtils tabCompletionUtils = new TabCompletionUtils(); + public static final CommandFileCommand commandFileCommand = new CommandFileCommand(); + @Override public void onInitialize() { @@ -104,6 +107,7 @@ public void onInitialize() { PacketHandlerRegistry.register(playbackControllerServer); PacketHandlerRegistry.register(startPositionMetadataExtension); PacketHandlerRegistry.register(tabCompletionUtils); + PacketHandlerRegistry.register(commandFileCommand); } @Override @@ -125,6 +129,7 @@ public void onServerInit(MinecraftServer server) { CommandRegistry.registerServerCommand(new CommandFullPlay(), server); CommandRegistry.registerServerCommand(new CommandRestartAndPlay(), server); CommandRegistry.registerServerCommand(new CommandPlayUntil(), server); + CommandRegistry.registerServerCommand(commandFileCommand, server); // Save Loadstate Count File savestateDirectory = new File(server.getDataDirectory() + File.separator + "saves" + File.separator + "savestates" + File.separator); diff --git a/src/main/java/com/minecrafttas/tasmod/commands/CommandFileCommand.java b/src/main/java/com/minecrafttas/tasmod/commands/CommandFileCommand.java index 6e96d538..07c649f1 100644 --- a/src/main/java/com/minecrafttas/tasmod/commands/CommandFileCommand.java +++ b/src/main/java/com/minecrafttas/tasmod/commands/CommandFileCommand.java @@ -1,14 +1,22 @@ package com.minecrafttas.tasmod.commands; +import static com.minecrafttas.tasmod.registries.TASmodPackets.COMMAND_FILECOMMANDLIST; +import static com.minecrafttas.tasmod.registries.TASmodPackets.PLAYBACK_FILECOMMAND_ENABLE; + import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.Arrays; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import com.minecrafttas.mctcommon.networking.Client.Side; import com.minecrafttas.mctcommon.networking.exception.PacketNotImplementedException; import com.minecrafttas.mctcommon.networking.exception.WrongSideException; import com.minecrafttas.mctcommon.networking.interfaces.ClientPacketHandler; @@ -21,14 +29,15 @@ import com.minecrafttas.tasmod.registries.TASmodAPIRegistry; import com.minecrafttas.tasmod.registries.TASmodPackets; -import static com.minecrafttas.tasmod.registries.TASmodPackets.*; - +import net.minecraft.client.Minecraft; import net.minecraft.command.CommandBase; import net.minecraft.command.CommandException; import net.minecraft.command.ICommandSender; import net.minecraft.command.PlayerNotFoundException; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.server.MinecraftServer; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.text.ChatType; import net.minecraft.util.text.TextComponentString; import net.minecraft.util.text.TextFormatting; @@ -51,32 +60,31 @@ public void execute(MinecraftServer server, ICommandSender sender, String[] args if (sender instanceof EntityPlayer) { if (sender.canUseCommand(2, "fileCommand")) { + String senderName = null; + // Get the list of file commands from the server - List names; + Map fileCommandNames; try { - names = TASmod.tabCompletionUtils.getFileCommandList(getCommandSenderAsPlayer(sender).getName()); + senderName = getCommandSenderAsPlayer(sender).getName(); + fileCommandNames = getExtensions(senderName); } catch (PlayerNotFoundException | InterruptedException | ExecutionException | TimeoutException e) { sender.sendMessage(new TextComponentString(e.getMessage())); return; } - if (args.length == 0) { - sender.sendMessage(new TextComponentString(String.join(" ", names))); - } - if (args.length == 1) { - sender.sendMessage(new TextComponentString(TextFormatting.RED + "Please add a filecommand " + getUsage(sender))); - } else if (args.length == 1) { - String filename = args[0]; - try { - TASmod.server.sendToAll(new TASmodBufferBuilder(PLAYBACK_LOAD).writeString(filename).writeString("")); - } catch (Exception e) { - e.printStackTrace(); + if (args.length == 0) { // Displays all enabled and disabled filecommands + sender.sendMessage(new TextComponentString(String.join(" ", getColoredNames(fileCommandNames)))); + } else if (args.length == 1) { // Toggles the filecommand + + String name = args[0]; + Boolean enable = fileCommandNames.get(name); + + if (enable == null) { + throw new CommandException("The file command was not found: %s", name); } - } else if (args.length == 2) { - String filename = args[0]; - String flavorname = args[1]; + try { - TASmod.server.sendToAll(new TASmodBufferBuilder(PLAYBACK_LOAD).writeString(filename).writeString(flavorname)); + TASmod.server.sendTo(senderName, new TASmodBufferBuilder(PLAYBACK_FILECOMMAND_ENABLE).writeString(name).writeBoolean(!enable)); } catch (Exception e) { e.printStackTrace(); } @@ -87,18 +95,66 @@ public void execute(MinecraftServer server, ICommandSender sender, String[] args } } - private List getExtensions(String playername) throws InterruptedException, ExecutionException, TimeoutException { - List out = new ArrayList<>(); + @Override + public List getTabCompletions(MinecraftServer minecraftServer, ICommandSender iCommandSender, String[] args, BlockPos blockPos) { + if (args.length == 1) { + List names = null; + try { + names = new ArrayList<>(getExtensions(getCommandSenderAsPlayer(iCommandSender).getName()).keySet()); + } catch (PlayerNotFoundException | InterruptedException | ExecutionException | TimeoutException e) { + e.printStackTrace(); + return super.getTabCompletions(minecraftServer, iCommandSender, args, blockPos); + } + return getListOfStringsMatchingLastWord(args, names); + } + return super.getTabCompletions(minecraftServer, iCommandSender, args, blockPos); + } + + private Map getExtensions(String playername) throws InterruptedException, ExecutionException, TimeoutException { + Map out = new LinkedHashMap<>(); fileCommandList = new CompletableFuture<>(); + try { + TASmod.server.sendTo(playername, new TASmodBufferBuilder(COMMAND_FILECOMMANDLIST)); + } catch (Exception e) { + e.printStackTrace(); + } + List commands = fileCommandList.get(2, TimeUnit.SECONDS); - + + commands.forEach(element -> { + + Pattern pattern = Pattern.compile("^E_"); + Matcher matcher = pattern.matcher(element); + if (matcher.find()) { + element = matcher.replaceFirst(""); + out.put(element, true); + return; + } + + pattern = Pattern.compile("^D_"); + matcher = pattern.matcher(element); + if (matcher.find()) { + element = matcher.replaceFirst(""); + out.put(element, false); + return; + } + }); + + return out; + } + + private List getColoredNames(Map list) { + List out = new ArrayList<>(); + list.forEach((name, enabled) -> { + out.add(String.format("%s%s%s", enabled ? TextFormatting.GREEN : TextFormatting.RED, name, TextFormatting.RESET)); + }); return out; } @Override public PacketID[] getAcceptedPacketIDs() { - return new PacketID[] { COMMAND_FLAVORLIST }; + return new PacketID[] { COMMAND_FILECOMMANDLIST, PLAYBACK_FILECOMMAND_ENABLE }; } @Override @@ -107,13 +163,15 @@ public void onServerPacket(PacketID id, ByteBuffer buf, String username) throws switch (packet) { case COMMAND_FILECOMMANDLIST: String filecommandnames = TASmodBufferBuilder.readString(buf); - fileCommandList.complete(Arrays.asList(filecommandnames.split("|"))); + fileCommandList.complete(Arrays.asList(filecommandnames.split("\\|"))); break; default: - break; + throw new WrongSideException(packet, Side.SERVER); } } + // ========== Client + @Override public void onClientPacket(PacketID id, ByteBuffer buf, String username) throws PacketNotImplementedException, WrongSideException, Exception { TASmodPackets packet = (TASmodPackets) id; @@ -121,6 +179,17 @@ public void onClientPacket(PacketID id, ByteBuffer buf, String username) throws case COMMAND_FILECOMMANDLIST: String filecommandnames = String.join("|", getFileCommandNames(TASmodAPIRegistry.PLAYBACK_FILE_COMMAND.getAll())); TASmodClient.client.send(new TASmodBufferBuilder(COMMAND_FILECOMMANDLIST).writeString(filecommandnames)); + break; + case PLAYBACK_FILECOMMAND_ENABLE: + String filecommand = TASmodBufferBuilder.readString(buf); + boolean enable = TASmodBufferBuilder.readBoolean(buf); + boolean success = TASmodAPIRegistry.PLAYBACK_FILE_COMMAND.setEnabled(filecommand, enable); + + String msg = success ? String.format("%s%s file command: %s", TextFormatting.GREEN, enable ? "Enabled" : "Disabled", filecommand) : String.format("%sFailed to %s file command: %s", TextFormatting.RED, enable ? "enable" : "disable", filecommand); + Minecraft.getMinecraft().ingameGUI.addChatMessage(ChatType.CHAT, new TextComponentString(msg)); + break; + default: + break; } } @@ -131,5 +200,5 @@ private List getFileCommandNames(List file }); return out; } - + } diff --git a/src/main/java/com/minecrafttas/tasmod/commands/TabCompletionUtils.java b/src/main/java/com/minecrafttas/tasmod/commands/TabCompletionUtils.java index 538454b9..0966f7f8 100644 --- a/src/main/java/com/minecrafttas/tasmod/commands/TabCompletionUtils.java +++ b/src/main/java/com/minecrafttas/tasmod/commands/TabCompletionUtils.java @@ -1,6 +1,7 @@ package com.minecrafttas.tasmod.commands; -import static com.minecrafttas.tasmod.registries.TASmodPackets.*; +import static com.minecrafttas.tasmod.registries.TASmodPackets.COMMAND_FLAVORLIST; +import static com.minecrafttas.tasmod.registries.TASmodPackets.COMMAND_TASFILELIST; import java.io.File; import java.io.FileFilter; @@ -21,18 +22,15 @@ import com.minecrafttas.tasmod.TASmod; import com.minecrafttas.tasmod.TASmodClient; import com.minecrafttas.tasmod.networking.TASmodBufferBuilder; -import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandExtension; import com.minecrafttas.tasmod.registries.TASmodAPIRegistry; import com.minecrafttas.tasmod.registries.TASmodPackets; import net.minecraft.client.Minecraft; -import net.minecraft.util.text.TextFormatting; public class TabCompletionUtils implements ServerPacketHandler, ClientPacketHandler { private volatile CompletableFuture> fileList = null; private volatile CompletableFuture> flavorList = null; - private volatile CompletableFuture> fileCommandList = null; @Override public PacketID[] getAcceptedPacketIDs() { @@ -47,15 +45,12 @@ public void onServerPacket(PacketID id, ByteBuffer buf, String username) throws switch (packet) { case COMMAND_TASFILELIST: String filenames = TASmodBufferBuilder.readString(buf); - fileList.complete(Arrays.asList(filenames.split("|"))); + fileList.complete(Arrays.asList(filenames.split("\\|"))); break; case COMMAND_FLAVORLIST: String flavornames = TASmodBufferBuilder.readString(buf); - flavorList.complete(Arrays.asList(flavornames.split("|"))); + flavorList.complete(Arrays.asList(flavornames.split("\\|"))); break; - case COMMAND_FILECOMMANDLIST: - String filecommandnames = TASmodBufferBuilder.readString(buf); - fileCommandList.complete(Arrays.asList(filecommandnames.split("|"))); default: break; } @@ -81,16 +76,6 @@ public List getFlavorList(String playername) throws InterruptedException return flavorList.get(2, TimeUnit.SECONDS); } - public List getFileCommandList(String playername) throws InterruptedException, ExecutionException, TimeoutException { - fileCommandList = new CompletableFuture<>(); - try { - TASmod.server.sendTo(playername, new TASmodBufferBuilder(COMMAND_FILECOMMANDLIST)); - } catch (Exception e) { - TASmod.LOGGER.catching(e); - } - return fileCommandList.get(2, TimeUnit.SECONDS); - } - //======== CLIENT SIDE @Override diff --git a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/LabelFileCommandExtension.java b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/LabelFileCommandExtension.java index d652f49e..ea1cc6dc 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/LabelFileCommandExtension.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/LabelFileCommandExtension.java @@ -15,6 +15,10 @@ public class LabelFileCommandExtension extends PlaybackFileCommandExtension { BigArrayList label = new BigArrayList<>(); + public LabelFileCommandExtension() { + enabled = true; + } + @Override public String getExtensionName() { return "tasmod_label@v1"; diff --git a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/OptionsFileCommandExtension.java b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/OptionsFileCommandExtension.java index 73fd3fdf..4bbffd80 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/OptionsFileCommandExtension.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/OptionsFileCommandExtension.java @@ -16,6 +16,10 @@ public class OptionsFileCommandExtension extends PlaybackFileCommandExtension { private boolean shouldRenderHud = true; BigArrayList hud = new BigArrayList<>(); + + public OptionsFileCommandExtension() { + enabled = true; + } @Override public String getExtensionName() { diff --git a/src/main/java/com/minecrafttas/tasmod/registries/TASmodPackets.java b/src/main/java/com/minecrafttas/tasmod/registries/TASmodPackets.java index 95d30949..6cbc56a5 100644 --- a/src/main/java/com/minecrafttas/tasmod/registries/TASmodPackets.java +++ b/src/main/java/com/minecrafttas/tasmod/registries/TASmodPackets.java @@ -159,6 +159,14 @@ public enum TASmodPackets implements PacketID { * boolean verbose If a chat message should be printed */ PLAYBACK_STATE, + /** + *

    Enables/Disables {@link PlaybackFileCommandExtension PlaybackFileCommandExtensions} + *

    SIDE: Client
    + * ARGS:
    + * String name Name of the {@link PlaybackFileCommandExtension} + * boolean enable Whether the extensions should be enabled or disabled + */ + PLAYBACK_FILECOMMAND_ENABLE, /** *

    Opens a TASmod related folder on the file system *

    The action describes which folder to open: From 8af3ffb6a10075c510db2dac35d8e0bb6e31b946 Mon Sep 17 00:00:00 2001 From: Scribble Date: Wed, 10 Jul 2024 13:50:37 +0200 Subject: [PATCH 75/79] [PlaybackSerialiser] Store enabled filecommands in the config --- .../minecrafttas/mctcommon/Configuration.java | 2 +- .../com/minecrafttas/tasmod/TASmodClient.java | 3 ++ .../PlaybackFileCommandsRegistry.java | 40 ++++++++++++++++++- .../DesyncMonitorFileCommandExtension.java | 2 +- .../tasmod/registries/TASmodConfig.java | 3 +- .../tasmod/registries/TASmodPackets.java | 1 - 6 files changed, 46 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/minecrafttas/mctcommon/Configuration.java b/src/main/java/com/minecrafttas/mctcommon/Configuration.java index 56eb33e6..6edc3e08 100644 --- a/src/main/java/com/minecrafttas/mctcommon/Configuration.java +++ b/src/main/java/com/minecrafttas/mctcommon/Configuration.java @@ -116,7 +116,7 @@ public Properties generateDefault() { } public String get(ConfigOptions configOption) { - return properties.getProperty(configOption.getConfigKey()); + return properties.getProperty(configOption.getConfigKey(), configOption.getDefaultValue()); } public int getInt(ConfigOptions configOption) { diff --git a/src/main/java/com/minecrafttas/tasmod/TASmodClient.java b/src/main/java/com/minecrafttas/tasmod/TASmodClient.java index 97c3612d..b8aaa122 100644 --- a/src/main/java/com/minecrafttas/tasmod/TASmodClient.java +++ b/src/main/java/com/minecrafttas/tasmod/TASmodClient.java @@ -309,6 +309,8 @@ private void registerFileCommands() { TASmodAPIRegistry.PLAYBACK_FILE_COMMAND.register(desyncMonitorFileCommandExtension); TASmodAPIRegistry.PLAYBACK_FILE_COMMAND.register(optionsFileCommandExtension); TASmodAPIRegistry.PLAYBACK_FILE_COMMAND.register(labelFileCommandExtension); + + TASmodAPIRegistry.PLAYBACK_FILE_COMMAND.setConfig(config); } private void loadConfig(Minecraft mc) { @@ -319,5 +321,6 @@ private void loadConfig(Minecraft mc) { config = new Configuration("TASmod configuration", new File(configDir, "tasmod.cfg")); config.register(TASmodConfig.values()); config.load(); + config.save(); } } diff --git a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommandsRegistry.java b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommandsRegistry.java index 695bb8a9..f82ab9ff 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommandsRegistry.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommandsRegistry.java @@ -1,18 +1,23 @@ package com.minecrafttas.tasmod.playback.filecommands; import java.util.ArrayList; +import java.util.Arrays; import java.util.LinkedHashMap; import java.util.List; +import com.minecrafttas.mctcommon.Configuration; import com.minecrafttas.mctcommon.registry.AbstractRegistry; import com.minecrafttas.tasmod.events.EventPlaybackClient; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickContainer; import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandContainer; import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandExtension; +import com.minecrafttas.tasmod.registries.TASmodConfig; public class PlaybackFileCommandsRegistry extends AbstractRegistry implements EventPlaybackClient.EventRecordTick, EventPlaybackClient.EventPlaybackTick, EventPlaybackClient.EventRecordClear { private List enabledExtensions = new ArrayList<>(); + + private Configuration config = null; public PlaybackFileCommandsRegistry() { super("FILECOMMAND_REGISTRY", new LinkedHashMap<>()); @@ -31,12 +36,20 @@ public void unregister(PlaybackFileCommandExtension extension) { } public boolean setEnabled(String extensionName, boolean enabled) { + return setEnabled(extensionName, enabled, true); + } + + public boolean setEnabled(String extensionName, boolean enabled, boolean saveToConfig) { PlaybackFileCommandExtension extension = REGISTRY.get(extensionName); if(extension == null) { return false; } extension.setEnabled(enabled); enabledExtensions = getEnabled(); + + if(saveToConfig) { + saveConfig(); + } return true; } @@ -47,10 +60,16 @@ private void disableAll() { } public void setEnabled(List extensionNames) { + setEnabled(extensionNames, false); + } + + public void setEnabled(List extensionNames, boolean saveToConfig) { disableAll(); for (String name : extensionNames) { - setEnabled(name, true); + setEnabled(name, true, false); } + if(saveToConfig) + saveConfig(); } public List getEnabled() { @@ -132,4 +151,23 @@ public void onClear() { }); } + public void setConfig(Configuration config) { + this.config = config; + loadConfig(); + } + + private void loadConfig() { + String enabled = config.get(TASmodConfig.EnabledFileCommands); + setEnabled(Arrays.asList(enabled.split(", "))); + } + + private void saveConfig() { + List nameList = new ArrayList<>(); + + enabledExtensions.forEach(element ->{ + nameList.add(element.getExtensionName()); + }); + config.set(TASmodConfig.EnabledFileCommands, String.join(", ", nameList)); + config.save(); + } } diff --git a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/DesyncMonitorFileCommandExtension.java b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/DesyncMonitorFileCommandExtension.java index 32c7d592..a89fef45 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/DesyncMonitorFileCommandExtension.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/DesyncMonitorFileCommandExtension.java @@ -42,7 +42,7 @@ public DesyncMonitorFileCommandExtension() { @Override public String getExtensionName() { - return "tasmod_desyncMonitoring@v1"; + return "tasmod_desyncMonitor@v1"; } @Override diff --git a/src/main/java/com/minecrafttas/tasmod/registries/TASmodConfig.java b/src/main/java/com/minecrafttas/tasmod/registries/TASmodConfig.java index a03016db..166582c3 100644 --- a/src/main/java/com/minecrafttas/tasmod/registries/TASmodConfig.java +++ b/src/main/java/com/minecrafttas/tasmod/registries/TASmodConfig.java @@ -4,7 +4,8 @@ public enum TASmodConfig implements ConfigOptions { FileToOpen("fileToOpen", ""), - ServerConnection("serverConnection", ""); + ServerConnection("serverConnection", ""), + EnabledFileCommands("enabledFileCommands", "tasmod_desyncMonitor@v1, tasmod_label@v1, tasmod_options@v1"); private String configKey; private String defaultValue; diff --git a/src/main/java/com/minecrafttas/tasmod/registries/TASmodPackets.java b/src/main/java/com/minecrafttas/tasmod/registries/TASmodPackets.java index 6cbc56a5..b8c996b1 100644 --- a/src/main/java/com/minecrafttas/tasmod/registries/TASmodPackets.java +++ b/src/main/java/com/minecrafttas/tasmod/registries/TASmodPackets.java @@ -6,7 +6,6 @@ import com.minecrafttas.tasmod.commands.CommandFolder; import com.minecrafttas.tasmod.playback.PlaybackControllerClient; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TASstate; -import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand; import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandExtension; import com.minecrafttas.tasmod.playback.tasfile.flavor.SerialiserFlavorBase; import com.minecrafttas.tasmod.savestates.SavestateHandlerServer.PlayerHandler.MotionData; From 6a8979af7910665a35df1c726afb8069aa7dfa57 Mon Sep 17 00:00:00 2001 From: Scribble Date: Wed, 10 Jul 2024 14:10:30 +0200 Subject: [PATCH 76/79] [PlaybackSerialiser] Fixed NPE in FileCommandsRegistry config --- .../filecommands/PlaybackFileCommandsRegistry.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommandsRegistry.java b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommandsRegistry.java index f82ab9ff..9b888819 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommandsRegistry.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommandsRegistry.java @@ -7,6 +7,7 @@ import com.minecrafttas.mctcommon.Configuration; import com.minecrafttas.mctcommon.registry.AbstractRegistry; +import com.minecrafttas.tasmod.TASmod; import com.minecrafttas.tasmod.events.EventPlaybackClient; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickContainer; import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandContainer; @@ -18,7 +19,7 @@ public class PlaybackFileCommandsRegistry extends AbstractRegistry enabledExtensions = new ArrayList<>(); private Configuration config = null; - + public PlaybackFileCommandsRegistry() { super("FILECOMMAND_REGISTRY", new LinkedHashMap<>()); } @@ -157,11 +158,17 @@ public void setConfig(Configuration config) { } private void loadConfig() { + if (config == null) { + return; + } String enabled = config.get(TASmodConfig.EnabledFileCommands); setEnabled(Arrays.asList(enabled.split(", "))); } private void saveConfig() { + if (config == null) { + return; + } List nameList = new ArrayList<>(); enabledExtensions.forEach(element ->{ From 966bb4595a80750a25d9e09b4cb7b1ce108a1b79 Mon Sep 17 00:00:00 2001 From: Scribble Date: Wed, 10 Jul 2024 19:13:53 +0200 Subject: [PATCH 77/79] [PlaybackSerialiser] Changed PlaybackMetadataExtension to abstract class - Moved PlaybackMetadataExtension to PlaybackMetadata --- .../PlaybackFileCommandsRegistry.java | 1 - .../playback/metadata/PlaybackMetadata.java | 34 ++++++++++++++++- .../metadata/PlaybackMetadataRegistry.java | 33 +--------------- .../integrated/CreditsMetadataExtension.java | 4 +- .../StartpositionMetadataExtension.java | 4 +- .../PlaybackMetadataRegistryTest.java | 38 +++++++++---------- .../metadata/PlaybackMetadataTest.java | 4 +- .../tasfile/PlaybackSerialiserTest.java | 4 +- .../tasfile/SerialiserFlavorBaseTest.java | 10 ++--- 9 files changed, 66 insertions(+), 66 deletions(-) diff --git a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommandsRegistry.java b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommandsRegistry.java index 9b888819..d70e4f5e 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommandsRegistry.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/PlaybackFileCommandsRegistry.java @@ -7,7 +7,6 @@ import com.minecrafttas.mctcommon.Configuration; import com.minecrafttas.mctcommon.registry.AbstractRegistry; -import com.minecrafttas.tasmod.TASmod; import com.minecrafttas.tasmod.events.EventPlaybackClient; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TickContainer; import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandContainer; diff --git a/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadata.java b/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadata.java index f654e0f7..19536115 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadata.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadata.java @@ -6,13 +6,15 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadataRegistry.PlaybackMetadataExtension; +import com.minecrafttas.mctcommon.registry.Registerable; +import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata.PlaybackMetadataExtension; /** * Stores a section of
    *
    */ public class PlaybackMetadata { + private String extensionName; private LinkedHashMap data; @@ -100,4 +102,34 @@ public static PlaybackMetadata fromStringList(String extensionName, List public static PlaybackMetadata fromHashMap(String extensionName, LinkedHashMap data) { return new PlaybackMetadata(extensionName, new LinkedHashMap<>(data)); } + + public static abstract class PlaybackMetadataExtension implements com.minecrafttas.mctcommon.registry.Registerable { + + /** + * Currently unused.
    + * Maybe in the future, TASes have to be created with /create, then you can interactively set the values...
    + */ + public void onCreate() {}; + + /** + * Runs, when the TASfile is being stored to a file.
    + * Create a new {@link PlaybackMetadata} with PlaybackMetadata metadata = new PlaybackMetadata(this);.
    + * This will ensure, that the metadata is linked to this extension by using the {@link PlaybackMetadataExtension#getExtensionName()}.
    + * + * @return The {@link PlaybackMetadata} to be saved in the TASfile + */ + public abstract PlaybackMetadata onStore(); + + /** + * Runs when the TASfile is being loaded from a file
    + * + * @param metadata The metadata for this extension to read from + */ + public abstract void onLoad(PlaybackMetadata metadata); + + /** + * Runs when the PlaybackController is cleared + */ + public abstract void onClear(); + } } diff --git a/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadataRegistry.java b/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadataRegistry.java index ea2ecaea..4cfa74d1 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadataRegistry.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadataRegistry.java @@ -7,6 +7,7 @@ import com.minecrafttas.mctcommon.registry.AbstractRegistry; import com.minecrafttas.tasmod.TASmod; import com.minecrafttas.tasmod.events.EventPlaybackClient; +import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata.PlaybackMetadataExtension; /** * Registry for registering custom metadata that is stored in the TASFile.
    @@ -18,7 +19,7 @@ * * @author Scribble */ -public class PlaybackMetadataRegistry extends AbstractRegistry implements EventPlaybackClient.EventRecordClear{ +public class PlaybackMetadataRegistry extends AbstractRegistry implements EventPlaybackClient.EventRecordClear{ public PlaybackMetadataRegistry() { super("METADATA_REGISTRY", new LinkedHashMap<>()); @@ -56,34 +57,4 @@ public void onClear() { extension.onClear(); }); } - - public static interface PlaybackMetadataExtension extends com.minecrafttas.mctcommon.registry.Registerable { - - /** - * Currently unused.
    - * Maybe in the future, TASes have to be created with /create, then you can interactively set the values...
    - */ - public void onCreate(); - - /** - * Runs, when the TASfile is being stored to a file.
    - * Create a new {@link PlaybackMetadata} with PlaybackMetadata metadata = new PlaybackMetadata(this);.
    - * This will ensure, that the metadata is linked to this extension by using the {@link PlaybackMetadataExtension#getExtensionName()}.
    - * - * @return The {@link PlaybackMetadata} to be saved in the TASfile - */ - public PlaybackMetadata onStore(); - - /** - * Runs when the TASfile is being loaded from a file
    - * - * @param metadata The metadata for this extension to read from - */ - public void onLoad(PlaybackMetadata metadata); - - /** - * Runs when the PlaybackController is cleared - */ - public void onClear(); - } } diff --git a/src/main/java/com/minecrafttas/tasmod/playback/metadata/integrated/CreditsMetadataExtension.java b/src/main/java/com/minecrafttas/tasmod/playback/metadata/integrated/CreditsMetadataExtension.java index ddeb0a9d..a7eec12d 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/metadata/integrated/CreditsMetadataExtension.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/metadata/integrated/CreditsMetadataExtension.java @@ -6,7 +6,7 @@ import com.minecrafttas.tasmod.events.EventPlaybackClient.EventPlaybackJoinedWorld; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TASstate; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata; -import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadataRegistry.PlaybackMetadataExtension; +import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata.PlaybackMetadataExtension; import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackLoadException; import com.minecrafttas.tasmod.util.LoggerMarkers; @@ -20,7 +20,7 @@ * Credits can be changed in the file and will be printed in chat, when the * player joins a world after /fullplay */ -public class CreditsMetadataExtension implements PlaybackMetadataExtension, EventPlaybackJoinedWorld, EventControllerStateChange { +public class CreditsMetadataExtension extends PlaybackMetadataExtension implements EventPlaybackJoinedWorld, EventControllerStateChange { /** * The title/category of the TAS (e.g. KillSquid - Any% Glitched) diff --git a/src/main/java/com/minecrafttas/tasmod/playback/metadata/integrated/StartpositionMetadataExtension.java b/src/main/java/com/minecrafttas/tasmod/playback/metadata/integrated/StartpositionMetadataExtension.java index 3af060e3..81954595 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/metadata/integrated/StartpositionMetadataExtension.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/metadata/integrated/StartpositionMetadataExtension.java @@ -14,7 +14,7 @@ import com.minecrafttas.tasmod.networking.TASmodBufferBuilder; import com.minecrafttas.tasmod.playback.PlaybackControllerClient.TASstate; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata; -import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadataRegistry.PlaybackMetadataExtension; +import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata.PlaybackMetadataExtension; import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackLoadException; import com.minecrafttas.tasmod.registries.TASmodPackets; import com.minecrafttas.tasmod.util.LoggerMarkers; @@ -31,7 +31,7 @@ * * @author Scribble */ -public class StartpositionMetadataExtension implements PlaybackMetadataExtension, EventControllerStateChange, ServerPacketHandler { +public class StartpositionMetadataExtension extends PlaybackMetadataExtension implements EventControllerStateChange, ServerPacketHandler { /** * The startposition of the playback diff --git a/src/test/java/tasmod/playback/metadata/PlaybackMetadataRegistryTest.java b/src/test/java/tasmod/playback/metadata/PlaybackMetadataRegistryTest.java index 8f0af818..326baf9a 100644 --- a/src/test/java/tasmod/playback/metadata/PlaybackMetadataRegistryTest.java +++ b/src/test/java/tasmod/playback/metadata/PlaybackMetadataRegistryTest.java @@ -13,20 +13,19 @@ import org.junit.jupiter.api.Test; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata; -import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadataRegistry.PlaybackMetadataExtension; +import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata.PlaybackMetadataExtension; import com.minecrafttas.tasmod.registries.TASmodAPIRegistry; - public class PlaybackMetadataRegistryTest { - class Test1 implements PlaybackMetadataExtension{ + class Test1 extends PlaybackMetadataExtension { private String actual; - + public String getActual() { return actual; } - + @Override public String getExtensionName() { return "Test1"; @@ -51,26 +50,26 @@ public void onLoad(PlaybackMetadata metadata) { @Override public void onClear() { } - + } - + File file = new File("src/test/resources/metadata/MetadataRegistry.txt"); - + void store() { List list = TASmodAPIRegistry.PLAYBACK_METADATA.handleOnStore(); List out = new ArrayList<>(); - + list.forEach(data -> { out.addAll(data.toStringList()); }); - + try { FileUtils.writeLines(file, out); } catch (IOException e) { e.printStackTrace(); } } - + void load() { List loaded = null; try { @@ -78,15 +77,14 @@ void load() { } catch (IOException e) { e.printStackTrace(); } - - + List meta = new ArrayList<>(); - + meta.add(PlaybackMetadata.fromStringList("Test1", loaded)); - + TASmodAPIRegistry.PLAYBACK_METADATA.handleOnLoad(meta); } - + /** * Register, store and read metadata */ @@ -94,16 +92,16 @@ void load() { void testRegistry() { Test1 actual = new Test1(); TASmodAPIRegistry.PLAYBACK_METADATA.register(actual); - + store(); load(); - + assertEquals("Testing 1", actual.getActual()); - if(file.exists()) { + if (file.exists()) { file.delete(); } } - + @AfterAll static void afterAll() { TASmodAPIRegistry.PLAYBACK_METADATA.clear(); diff --git a/src/test/java/tasmod/playback/metadata/PlaybackMetadataTest.java b/src/test/java/tasmod/playback/metadata/PlaybackMetadataTest.java index 3a8e104a..bbb7e94e 100644 --- a/src/test/java/tasmod/playback/metadata/PlaybackMetadataTest.java +++ b/src/test/java/tasmod/playback/metadata/PlaybackMetadataTest.java @@ -11,11 +11,11 @@ import org.junit.jupiter.api.Test; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata; -import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadataRegistry.PlaybackMetadataExtension; +import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata.PlaybackMetadataExtension; public class PlaybackMetadataTest { - class MetadataTest implements PlaybackMetadataExtension{ + class MetadataTest extends PlaybackMetadataExtension{ @Override public String getExtensionName() { diff --git a/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java b/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java index 83f2690e..ef3e99f8 100644 --- a/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java +++ b/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java @@ -24,7 +24,7 @@ import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandContainer; import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandExtension; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata; -import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadataRegistry.PlaybackMetadataExtension; +import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata.PlaybackMetadataExtension; import com.minecrafttas.tasmod.playback.tasfile.PlaybackSerialiser; import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackLoadException; import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackSaveException; @@ -51,7 +51,7 @@ public SerialiserFlavorBase clone() { } } - private static class TestMetadatada implements PlaybackMetadataExtension { + private static class TestMetadatada extends PlaybackMetadataExtension { String testValue = ""; String actual = "e"; diff --git a/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java b/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java index 77f19fc3..f0719bac 100644 --- a/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java +++ b/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java @@ -19,7 +19,7 @@ import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand; import com.minecrafttas.tasmod.playback.filecommands.PlaybackFileCommand.PlaybackFileCommandExtension; import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata; -import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadataRegistry.PlaybackMetadataExtension; +import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata.PlaybackMetadataExtension; import com.minecrafttas.tasmod.playback.tasfile.exception.PlaybackLoadException; import com.minecrafttas.tasmod.playback.tasfile.flavor.SerialiserFlavorBase; import com.minecrafttas.tasmod.registries.TASmodAPIRegistry; @@ -68,7 +68,7 @@ void testSerialiseHeaderStart() { @Test void testSerialiseMetadata() { - class MetadataTest implements PlaybackMetadataExtension { + class MetadataTest extends PlaybackMetadataExtension { public String testValue; @@ -101,7 +101,7 @@ public void onClear() { } - class MetadataTest2 implements PlaybackMetadataExtension { + class MetadataTest2 extends PlaybackMetadataExtension { public String testValue; @@ -381,7 +381,7 @@ void testExtractHeaderFail() { @Test void testDeserialiseMetadata() { - class GeneralMetadata implements PlaybackMetadataExtension{ + class GeneralMetadata extends PlaybackMetadataExtension{ PlaybackMetadata metadata = null; @@ -410,7 +410,7 @@ public void onClear() { } - class StartPositionMetadata implements PlaybackMetadataExtension { + class StartPositionMetadata extends PlaybackMetadataExtension { PlaybackMetadata metadata = null; From 4d12a49ea719a6f0de46d2fbc54b8c427c8abfff Mon Sep 17 00:00:00 2001 From: Scribble Date: Thu, 11 Jul 2024 09:20:43 +0200 Subject: [PATCH 78/79] Formatted files, fixed fc_label and fc_hud not resetting properly --- .../minecrafttas/mctcommon/Configuration.java | 3 +- .../mctcommon/registry/AbstractRegistry.java | 2 +- .../java/com/minecrafttas/tasmod/TASmod.java | 77 ++-- .../tasmod/commands/TabCompletionUtils.java | 2 +- .../tasmod/handlers/LoadingScreenHandler.java | 1 - .../integrated/LabelFileCommandExtension.java | 1 + .../OptionsFileCommandExtension.java | 3 +- .../playback/metadata/PlaybackMetadata.java | 3 +- .../metadata/PlaybackMetadataRegistry.java | 4 +- .../exception/PlaybackLoadException.java | 2 +- .../tasmod/util/LoggerMarkers.java | 12 +- .../com/minecrafttas/tasmod/util/Monitor.java | 19 +- .../tasmod/util/PointerNormalizer.java | 58 +-- .../minecrafttas/tasmod/util/Scheduler.java | 10 +- .../tasmod/virtual/Subtickable.java | 4 +- .../tasmod/virtual/VirtualCameraAngle.java | 72 ++-- .../tasmod/virtual/VirtualKey.java | 366 ++++++++-------- .../tasmod/virtual/VirtualKeybindings.java | 7 +- .../tasmod/virtual/VirtualKeyboard.java | 408 +++++++++--------- .../tasmod/virtual/VirtualMouse.java | 159 +++---- .../tasmod/virtual/VirtualPeripheral.java | 27 +- 21 files changed, 621 insertions(+), 619 deletions(-) diff --git a/src/main/java/com/minecrafttas/mctcommon/Configuration.java b/src/main/java/com/minecrafttas/mctcommon/Configuration.java index 6edc3e08..e8ad5c83 100644 --- a/src/main/java/com/minecrafttas/mctcommon/Configuration.java +++ b/src/main/java/com/minecrafttas/mctcommon/Configuration.java @@ -11,6 +11,7 @@ import java.util.List; import java.util.Properties; +import com.minecrafttas.mctcommon.Configuration.ConfigOptions; import com.minecrafttas.mctcommon.registry.AbstractRegistry; import com.minecrafttas.mctcommon.registry.Registerable; @@ -20,7 +21,7 @@ * @author Scribble */ -public class Configuration extends AbstractRegistry { +public class Configuration extends AbstractRegistry { private File file; diff --git a/src/main/java/com/minecrafttas/mctcommon/registry/AbstractRegistry.java b/src/main/java/com/minecrafttas/mctcommon/registry/AbstractRegistry.java index 2384d81e..292cef65 100644 --- a/src/main/java/com/minecrafttas/mctcommon/registry/AbstractRegistry.java +++ b/src/main/java/com/minecrafttas/mctcommon/registry/AbstractRegistry.java @@ -5,7 +5,7 @@ import com.minecrafttas.tasmod.TASmod; -public abstract class AbstractRegistry { +public abstract class AbstractRegistry { protected final Map REGISTRY; protected final String name; diff --git a/src/main/java/com/minecrafttas/tasmod/TASmod.java b/src/main/java/com/minecrafttas/tasmod/TASmod.java index 9fcee195..57899423 100644 --- a/src/main/java/com/minecrafttas/tasmod/TASmod.java +++ b/src/main/java/com/minecrafttas/tasmod/TASmod.java @@ -45,60 +45,58 @@ * ModContainer for TASmod * * @author Scribble - * */ -public class TASmod implements ModInitializer, EventServerInit, EventServerStop{ +public class TASmod implements ModInitializer, EventServerInit, EventServerStop { private static MinecraftServer serverInstance; - + public static final Logger LOGGER = LogManager.getLogger("TASmod"); - - public static PlaybackControllerServer playbackControllerServer=new PlaybackControllerServer();; - + + public static PlaybackControllerServer playbackControllerServer = new PlaybackControllerServer();; + public static SavestateHandlerServer savestateHandlerServer; - + public static KillTheRNGHandler ktrngHandler; - + public static TickrateChangerServer tickratechanger; - + public static TickSyncServer ticksyncServer; - + public static final Scheduler tickSchedulerServer = new Scheduler(); - + public static Server server; public static final int networkingport = 8999; public static final boolean isDevEnvironment = FabricLoaderImpl.INSTANCE.isDevelopmentEnvironment(); - + public static final StartpositionMetadataExtension startPositionMetadataExtension = new StartpositionMetadataExtension(); - + public static final TabCompletionUtils tabCompletionUtils = new TabCompletionUtils(); - + public static final CommandFileCommand commandFileCommand = new CommandFileCommand(); - + @Override public void onInitialize() { - + LOGGER.info("Initializing TASmod"); - - + // Start ticksync ticksyncServer = new TickSyncServer(); - + // Initilize KillTheRNG LOGGER.info("Testing connection with KillTheRNG"); - ktrngHandler=new KillTheRNGHandler(FabricLoaderImpl.INSTANCE.isModLoaded("killtherng")); - + ktrngHandler = new KillTheRNGHandler(FabricLoaderImpl.INSTANCE.isModLoaded("killtherng")); + // Initialize TickrateChanger tickratechanger = new TickrateChangerServer(LOGGER); - + // Register event listeners EventListenerRegistry.register(this); EventListenerRegistry.register(ticksyncServer); EventListenerRegistry.register(tickratechanger); EventListenerRegistry.register(ktrngHandler); - + // Register packet handlers LOGGER.info(LoggerMarkers.Networking, "Registering network handlers"); PacketHandlerRegistry.register(ticksyncServer); @@ -109,14 +107,14 @@ public void onInitialize() { PacketHandlerRegistry.register(tabCompletionUtils); PacketHandlerRegistry.register(commandFileCommand); } - + @Override public void onServerInit(MinecraftServer server) { LOGGER.info("Initializing server"); serverInstance = server; - + // Command handling - + CommandRegistry.registerServerCommand(new CommandTickrate(), server); CommandRegistry.registerServerCommand(new CommandRecord(), server); CommandRegistry.registerServerCommand(new CommandPlay(), server); @@ -141,10 +139,10 @@ public void onServerInit(MinecraftServer server) { savestateHandlerServer = new SavestateHandlerServer(server, LOGGER); PacketHandlerRegistry.register(savestateHandlerServer); - - if(!server.isDedicatedServer()) { - TASmod.tickratechanger.ticksPerSecond=0F; - TASmod.tickratechanger.tickrateSaved=20F; + + if (!server.isDedicatedServer()) { + TASmod.tickratechanger.ticksPerSecond = 0F; + TASmod.tickratechanger.tickrateSaved = 20F; } else { // Starting custom server instance try { @@ -154,26 +152,27 @@ public void onServerInit(MinecraftServer server) { } } } - + @Override public void onServerStop(MinecraftServer mcserver) { - serverInstance=null; - - if(mcserver.isDedicatedServer()) { + serverInstance = null; + + if (mcserver.isDedicatedServer()) { try { - if (server != null) server.close(); + if (server != null) + server.close(); } catch (IOException e) { LOGGER.error("Unable to close TASmod server: {}", e); e.printStackTrace(); } } - - if(savestateHandlerServer != null) { - PacketHandlerRegistry.unregister(savestateHandlerServer); // Unregistering the savestatehandler, as a new instance is registered in onServerStart() + + if (savestateHandlerServer != null) { + PacketHandlerRegistry.unregister(savestateHandlerServer); // Unregistering the savestatehandler, as a new instance is registered in onServerStart() savestateHandlerServer = null; } } - + public static MinecraftServer getServerInstance() { return serverInstance; } diff --git a/src/main/java/com/minecrafttas/tasmod/commands/TabCompletionUtils.java b/src/main/java/com/minecrafttas/tasmod/commands/TabCompletionUtils.java index 0966f7f8..60809b72 100644 --- a/src/main/java/com/minecrafttas/tasmod/commands/TabCompletionUtils.java +++ b/src/main/java/com/minecrafttas/tasmod/commands/TabCompletionUtils.java @@ -108,7 +108,7 @@ public boolean accept(File pathname) { } }); for (int i = 0; i < listOfFiles.length; i++) { - tab.add(listOfFiles[i].getName().replaceAll("\\.mctas", "")); + tab.add(listOfFiles[i].getName().replaceFirst("\\.mctas$", "")); } return tab; } diff --git a/src/main/java/com/minecrafttas/tasmod/handlers/LoadingScreenHandler.java b/src/main/java/com/minecrafttas/tasmod/handlers/LoadingScreenHandler.java index 92bcb00b..7d164842 100644 --- a/src/main/java/com/minecrafttas/tasmod/handlers/LoadingScreenHandler.java +++ b/src/main/java/com/minecrafttas/tasmod/handlers/LoadingScreenHandler.java @@ -16,7 +16,6 @@ * Handles logic during a loading screen to transition between states. * * @author Scribble - * */ public class LoadingScreenHandler implements EventLaunchIntegratedServer, EventClientGameLoop, EventDoneLoadingWorld { diff --git a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/LabelFileCommandExtension.java b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/LabelFileCommandExtension.java index ea1cc6dc..e0e11548 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/LabelFileCommandExtension.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/LabelFileCommandExtension.java @@ -62,6 +62,7 @@ public void onClear() { } label = new BigArrayList<>(); + labelText = ""; } public String getLabelText() { diff --git a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/OptionsFileCommandExtension.java b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/OptionsFileCommandExtension.java index 4bbffd80..af0390ee 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/OptionsFileCommandExtension.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/filecommands/integrated/OptionsFileCommandExtension.java @@ -40,7 +40,7 @@ public void onDeserialiseInlineComment(long tick, TickContainer container, Playb @Override public void onPlayback(long tick, TickContainer tickContainer) { - PlaybackFileCommandContainer containerInTick = hud.get(tick-1); + PlaybackFileCommandContainer containerInTick = hud.get(tick); if(containerInTick == null) { return; } @@ -81,6 +81,7 @@ public void onClear() { } hud = new BigArrayList<>(); + shouldRenderHud = true; } public boolean shouldRenderHud() { diff --git a/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadata.java b/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadata.java index 19536115..d20e2c4a 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadata.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadata.java @@ -7,7 +7,6 @@ import java.util.regex.Pattern; import com.minecrafttas.mctcommon.registry.Registerable; -import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata.PlaybackMetadataExtension; /** * Stores a section of
    @@ -103,7 +102,7 @@ public static PlaybackMetadata fromHashMap(String extensionName, LinkedHashMap(data)); } - public static abstract class PlaybackMetadataExtension implements com.minecrafttas.mctcommon.registry.Registerable { + public static abstract class PlaybackMetadataExtension implements Registerable { /** * Currently unused.
    diff --git a/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadataRegistry.java b/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadataRegistry.java index 4cfa74d1..a681af47 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadataRegistry.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadataRegistry.java @@ -15,11 +15,11 @@ * The default metadata includes general information such as author name, * savestate/rerecord count and category.
    *
    - * Any custom class has to implement PlaybackMetadataExtension + * Any custom class has to extend PlaybackMetadataExtension * * @author Scribble */ -public class PlaybackMetadataRegistry extends AbstractRegistry implements EventPlaybackClient.EventRecordClear{ +public class PlaybackMetadataRegistry extends AbstractRegistry implements EventPlaybackClient.EventRecordClear { public PlaybackMetadataRegistry() { super("METADATA_REGISTRY", new LinkedHashMap<>()); diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/exception/PlaybackLoadException.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/exception/PlaybackLoadException.java index b8086a1a..09bdb9b5 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/exception/PlaybackLoadException.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/exception/PlaybackLoadException.java @@ -50,6 +50,6 @@ private static String printTick(long line, long tick, int subtick) { @Override public void printStackTrace() { - TASmod.LOGGER.catching(this);; + TASmod.LOGGER.catching(this); } } diff --git a/src/main/java/com/minecrafttas/tasmod/util/LoggerMarkers.java b/src/main/java/com/minecrafttas/tasmod/util/LoggerMarkers.java index de235e6a..61fcfad0 100644 --- a/src/main/java/com/minecrafttas/tasmod/util/LoggerMarkers.java +++ b/src/main/java/com/minecrafttas/tasmod/util/LoggerMarkers.java @@ -25,18 +25,18 @@ * */ public class LoggerMarkers { - + public static final Marker Event = MarkerManager.getMarker("Event"); - + public static final Marker Savestate = MarkerManager.getMarker("Savestate"); - + public static final Marker Networking = MarkerManager.getMarker("Networking"); - + public static final Marker Tickrate = MarkerManager.getMarker("Tickrate"); public static final Marker Playback = MarkerManager.getMarker("Playback"); - + public static final Marker Keyboard = MarkerManager.getMarker("Keyboard"); - + public static final Marker Mouse = MarkerManager.getMarker("Mouse"); } diff --git a/src/main/java/com/minecrafttas/tasmod/util/Monitor.java b/src/main/java/com/minecrafttas/tasmod/util/Monitor.java index 86a3a61d..d53e5ac1 100644 --- a/src/main/java/com/minecrafttas/tasmod/util/Monitor.java +++ b/src/main/java/com/minecrafttas/tasmod/util/Monitor.java @@ -3,10 +3,9 @@ import java.lang.reflect.Field; public class Monitor { - - + private static long cooldown; - + public static void printFields(Object monitoredObject) { if (monitoredObject == null) { @@ -37,17 +36,17 @@ public static void printFields(Object monitoredObject) { out = out.concat("------------------------"); System.out.println(out); } - + public static boolean shouldPrint(long cooldownTime) { - if(cooldown<=0) { - cooldown=cooldownTime; + if (cooldown <= 0) { + cooldown = cooldownTime; return true; } else { cooldown--; return false; } } - + public static Object accessField(Object objectToAccess, String fieldname) { Field field = null; try { @@ -56,13 +55,13 @@ public static Object accessField(Object objectToAccess, String fieldname) { e.printStackTrace(); } field.setAccessible(true); - Object out=null; + Object out = null; try { - out=field.get(objectToAccess); + out = field.get(objectToAccess); } catch (IllegalArgumentException | IllegalAccessException e) { e.printStackTrace(); } return out; } - + } diff --git a/src/main/java/com/minecrafttas/tasmod/util/PointerNormalizer.java b/src/main/java/com/minecrafttas/tasmod/util/PointerNormalizer.java index 12a6d2a2..5d6f5063 100644 --- a/src/main/java/com/minecrafttas/tasmod/util/PointerNormalizer.java +++ b/src/main/java/com/minecrafttas/tasmod/util/PointerNormalizer.java @@ -38,7 +38,7 @@ public static int getNormalizedY(int pointerY) { if (mc.currentScreen instanceof GuiContainer) { out = (int) (pointerY - (scaled.getScaledHeight() / 2D)); - } else if (mc.currentScreen instanceof GuiWorldSelection|| mc.currentScreen instanceof GuiMultiplayer) { + } else if (mc.currentScreen instanceof GuiWorldSelection || mc.currentScreen instanceof GuiMultiplayer) { // TODO Figure out what to do here } else { out = (int) (pointerY - (scaled.getScaledHeight() / 4 + 72 + -16)); @@ -113,33 +113,33 @@ private static int greatestCommonDivisor(int a, int b) { * hours. */ -// private double getNormalizedXOld(double pointerX) { -// Minecraft mc = Minecraft.getMinecraft(); -// ScaledResolution scaled = new ScaledResolution(mc); -// return (double) pointerX / (double) mc.displayWidth / (4D / (double) scaled.getScaleFactor()); -// } -// -// public static double getNormalizedYOld(int pointerY) { -// Minecraft mc = Minecraft.getMinecraft(); -// ScaledResolution scaled = new ScaledResolution(mc); -// double out = (double) pointerY / (double) mc.displayHeight / (4D / (double) scaled.getScaleFactor()); -// return out; -// } -// -// public static int getCoordsXOld(double normalizedX) { -// Minecraft mc = Minecraft.getMinecraft(); -// ScaledResolution scaled = new ScaledResolution(mc); -// double guiScaled = normalizedX * (double) mc.displayWidth * (4D / (double) scaled.getScaleFactor()); -// int out = (int) Math.round(guiScaled); -// return out; -// } -// -// public static int getCoordsYOld(double normalizedY) { -// Minecraft mc = Minecraft.getMinecraft(); -// ScaledResolution scaled = new ScaledResolution(mc); -// double guiScaled = normalizedY * (double) mc.displayHeight * (4D / (double) scaled.getScaleFactor()); -// int out = (int) Math.round(guiScaled); -// return out; -// } + // private double getNormalizedXOld(double pointerX) { + // Minecraft mc = Minecraft.getMinecraft(); + // ScaledResolution scaled = new ScaledResolution(mc); + // return (double) pointerX / (double) mc.displayWidth / (4D / (double) scaled.getScaleFactor()); + // } + // + // public static double getNormalizedYOld(int pointerY) { + // Minecraft mc = Minecraft.getMinecraft(); + // ScaledResolution scaled = new ScaledResolution(mc); + // double out = (double) pointerY / (double) mc.displayHeight / (4D / (double) scaled.getScaleFactor()); + // return out; + // } + // + // public static int getCoordsXOld(double normalizedX) { + // Minecraft mc = Minecraft.getMinecraft(); + // ScaledResolution scaled = new ScaledResolution(mc); + // double guiScaled = normalizedX * (double) mc.displayWidth * (4D / (double) scaled.getScaleFactor()); + // int out = (int) Math.round(guiScaled); + // return out; + // } + // + // public static int getCoordsYOld(double normalizedY) { + // Minecraft mc = Minecraft.getMinecraft(); + // ScaledResolution scaled = new ScaledResolution(mc); + // double guiScaled = normalizedY * (double) mc.displayHeight * (4D / (double) scaled.getScaleFactor()); + // int out = (int) Math.round(guiScaled); + // return out; + // } } diff --git a/src/main/java/com/minecrafttas/tasmod/util/Scheduler.java b/src/main/java/com/minecrafttas/tasmod/util/Scheduler.java index 9e462b3a..d1997d0f 100644 --- a/src/main/java/com/minecrafttas/tasmod/util/Scheduler.java +++ b/src/main/java/com/minecrafttas/tasmod/util/Scheduler.java @@ -9,20 +9,20 @@ * @author Scribble */ public class Scheduler { - + Queue queue = new ConcurrentLinkedQueue<>(); - + public void runAllTasks() { Task task; - while((task = queue.poll()) != null) { + while ((task = queue.poll()) != null) { task.runTask(); } } - + public void add(Task task) { queue.add(task); } - + @FunctionalInterface public interface Task { public void runTask(); diff --git a/src/main/java/com/minecrafttas/tasmod/virtual/Subtickable.java b/src/main/java/com/minecrafttas/tasmod/virtual/Subtickable.java index 92c4dab9..0f463740 100644 --- a/src/main/java/com/minecrafttas/tasmod/virtual/Subtickable.java +++ b/src/main/java/com/minecrafttas/tasmod/virtual/Subtickable.java @@ -98,9 +98,9 @@ protected boolean isIgnoreFirstUpdate() { protected void resetFirstUpdate() { ignoreFirstUpdate = true; } - + public boolean isEmpty() { - if(isParent()) { + if (isParent()) { return subtickList.isEmpty(); } return true; diff --git a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualCameraAngle.java b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualCameraAngle.java index 7150e056..be4ee087 100644 --- a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualCameraAngle.java +++ b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualCameraAngle.java @@ -31,7 +31,7 @@ public class VirtualCameraAngle extends Subtickable implemen public VirtualCameraAngle() { this(null, null, new ArrayList<>(), true); } - + /** * Creates a subtick camera angle with {@link Subtickable#subtickList} uninitialized * @param pitch {@link #pitch} @@ -40,7 +40,7 @@ public VirtualCameraAngle() { public VirtualCameraAngle(Float pitch, Float yaw) { this(pitch, yaw, null); } - + /** * Creates a parent camera angle * @param pitch {@link #pitch} @@ -50,7 +50,7 @@ public VirtualCameraAngle(Float pitch, Float yaw) { public VirtualCameraAngle(Float pitch, Float yaw, boolean ignoreFirstUpdate) { this(pitch, yaw, new ArrayList<>(), ignoreFirstUpdate); } - + /** * Creates a camera angle with existing values * @param pitch {@link #pitch} @@ -60,7 +60,7 @@ public VirtualCameraAngle(Float pitch, Float yaw, boolean ignoreFirstUpdate) { public VirtualCameraAngle(Float pitch, Float yaw, List subtickList) { this(pitch, yaw, subtickList, false); } - + /** * Creates a camera angle with initialized values * @param pitch {@link VirtualCameraAngle#pitch} @@ -82,7 +82,7 @@ public VirtualCameraAngle(Float pitch, Float yaw, List subti public void updateFromEvent(float pitchDelta, float yawDelta) { updateFromEvent(pitchDelta, yawDelta, true); } - + /** * Updates the camera angle. * @param pitchDelta The difference between absolute coordinates of the pitch, is added to {@link VirtualCameraAngle#pitch} @@ -90,7 +90,7 @@ public void updateFromEvent(float pitchDelta, float yawDelta) { * @param updateSubtick If the previous camera should be added to {@link Subtickable#subtickList} */ public void updateFromEvent(float pitchDelta, float yawDelta, boolean updateSubtick) { - if(pitch==null || yaw == null) { + if (pitch == null || yaw == null) { return; } createSubtick(updateSubtick); @@ -99,22 +99,22 @@ public void updateFromEvent(float pitchDelta, float yawDelta, boolean updateSubt } public void updateFromState(Float pitch, Float yaw) { - if(this.pitch!=null && this.yaw != null) { + if (this.pitch != null && this.yaw != null) { createSubtick(true); } - if(pitch != null) { + if (pitch != null) { pitch = MathHelper.clamp(pitch, -90F, 90F); } this.pitch = pitch; this.yaw = yaw; } - + public void createSubtick(boolean updateSubtick) { - if(isParent() && !ignoreFirstUpdate() && updateSubtick) { + if (isParent() && !ignoreFirstUpdate() && updateSubtick) { addSubtick(shallowClone()); } } - + /** * Setting the absolute camera coordinates directly * @param pitch {@link #pitch} @@ -124,7 +124,7 @@ public void set(float pitch, float yaw) { this.pitch = pitch; this.yaw = yaw; } - + /** * A list of all camera states in this VirtualCameraAngle. * It consists of: {@link Subtickable#subtickList} + this @@ -136,13 +136,13 @@ public void getStates(List reference) { reference.add(this); } } - - /** - * Moves the data from another camera angle into this camera without creating a new object. - * @param camera The camera to copy from - */ + + /** + * Moves the data from another camera angle into this camera without creating a new object. + * @param camera The camera to copy from + */ public void moveFrom(VirtualCameraAngle camera) { - if(camera == null) + if (camera == null) return; this.pitch = camera.pitch; this.yaw = camera.yaw; @@ -150,20 +150,20 @@ public void moveFrom(VirtualCameraAngle camera) { this.subtickList.addAll(camera.subtickList); camera.subtickList.clear(); } - - /** - * Copies the data from another camera angle into this camera without creating a new object. - * @param camera The camera to copy from - */ + + /** + * Copies the data from another camera angle into this camera without creating a new object. + * @param camera The camera to copy from + */ public void deepCopyFrom(VirtualCameraAngle camera) { - if(camera == null || !camera.isParent()) + if (camera == null || !camera.isParent()) return; this.pitch = camera.pitch; this.yaw = camera.yaw; this.subtickList.clear(); this.subtickList.addAll(camera.subtickList); } - + /** * Sets {@link #pitch} and {@link #yaw} to null */ @@ -173,14 +173,14 @@ public void clear() { this.yaw = null; super.clear(); } - + /** * Creates a clone of this object as a subtick */ public VirtualCameraAngle shallowClone() { return new VirtualCameraAngle(pitch, yaw); } - + @Override public VirtualCameraAngle clone() { return new VirtualCameraAngle(pitch, yaw, new ArrayList<>(subtickList), isIgnoreFirstUpdate()); @@ -190,16 +190,16 @@ public VirtualCameraAngle clone() { public boolean equals(Object obj) { if (obj instanceof VirtualCameraAngle) { VirtualCameraAngle angle = (VirtualCameraAngle) obj; - if(pitch == null && angle.pitch != null) { + if (pitch == null && angle.pitch != null) { return false; } - if(yaw == null && angle.yaw != null) { + if (yaw == null && angle.yaw != null) { return false; } - if(pitch != null && !pitch.equals(angle.pitch)) { + if (pitch != null && !pitch.equals(angle.pitch)) { return false; } - if(yaw != null && !yaw.equals(angle.yaw)) + if (yaw != null && !yaw.equals(angle.yaw)) return false; return true; } @@ -208,17 +208,17 @@ public boolean equals(Object obj) { @Override public String toString() { - if(isParent()) { + if (isParent()) { return getAll().stream().map(VirtualCameraAngle::toString2).collect(Collectors.joining("\n")); } else { return toString2(); } } - + public String toString2() { return String.format("%s;%s", pitch, yaw); } - + /** * @return {@link #pitch} */ @@ -232,9 +232,9 @@ public Float getPitch() { public Float getYaw() { return yaw; } - + @Override public boolean isEmpty() { - return super.isEmpty() && (pitch == null || pitch == 0) && (yaw == null || yaw == 0) ; + return super.isEmpty() && (pitch == null || pitch == 0) && (yaw == null || yaw == 0); } } diff --git a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualKey.java b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualKey.java index 1aa0477c..53414215 100644 --- a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualKey.java +++ b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualKey.java @@ -6,194 +6,194 @@ * @author Scribble */ public enum VirtualKey { - // Keyboard - ZERO(0), - ESC(1), - KEY_1(2), - KEY_2(3), - KEY_3(4), - KEY_4(5), - KEY_5(6), - KEY_6(7), - KEY_7(8), - KEY_8(9), - KEY_9(10), - KEY_0(11), - MINUS(12), - EQUALS(13), - BACK(14), - TAB(15), - Q(16), - W(17), - E(18), - R(19), - T(20), - Y(21), - U(22), - I(23), - O(24), - P(25), - LBRACKET(26), - RBRACKET(27), - RETURN(28), - LCONTROL(29), - A(30), - S(31), - D(32), - F(33), - G(34), - H(35), - J(36), - K(37), - L(38), - SEMICOLON(39), - APOSTROPHE(40), - GRAVE(41), - LSHIFT(42), - BACKSLASH(43), - Z(44), - X(45), - C(46), - V(47), - B(48), - N(49), - M(50), - COMMA(51), - PERIOD(52), - SLASH(53), - RSHIFT(54), - MULTIPLY(55), - ALT(56), - SPACE(57), - CAPSLOCK(58), - F1(59), - F2(60), - F3(61), - F4(62), - F5(63), - F6(64), - F7(65), - F8(66), - F9(67), - F10(68), - NUMLOCK(69), - SCROLL(70), - NUMPAD7(71), - NUMPAD8(72), - NUMPAD9(73), - SUBTRACT(74), - NUMPAD4(75), - NUMPAD5(76), - NUMPAD6(77), - ADD(78), - NUMPAD1(79), - NUMPAD2(80), - NUMPAD3(81), - NUMPAD0(82), - DECIMAL(83), - F11(87), - F12(88), - F13(100), - F14(101), - F15(102), - F16(103), - F17(104), - F18(105), - KANA(112), - F19(113), - CONVERT(121), - NOCONVERT(123), - YEN(125), - NUMPADEQUALS(141), - CIRCUMFLEX(144), - AT(145), - COLON(146), - UNDERLINE(147), - KANJI(148), - STOP(149), - NUMPADENTER(156), - RCONTROL(157), - NUMPADCOMMA(179), - DIVIDE(181), - PRINT(183), - ALT_GR(184), - PAUSE(197), - HOME(199), - UP(200), - PRIOR(201), - LEFT(203), - RIGHT(205), - END(207), - DOWN(208), - NEXT(209), - INSERT(210), - DELETE(211), - WIN(219), - APPS(221), + // Keyboard + ZERO(0), + ESC(1), + KEY_1(2), + KEY_2(3), + KEY_3(4), + KEY_4(5), + KEY_5(6), + KEY_6(7), + KEY_7(8), + KEY_8(9), + KEY_9(10), + KEY_0(11), + MINUS(12), + EQUALS(13), + BACK(14), + TAB(15), + Q(16), + W(17), + E(18), + R(19), + T(20), + Y(21), + U(22), + I(23), + O(24), + P(25), + LBRACKET(26), + RBRACKET(27), + RETURN(28), + LCONTROL(29), + A(30), + S(31), + D(32), + F(33), + G(34), + H(35), + J(36), + K(37), + L(38), + SEMICOLON(39), + APOSTROPHE(40), + GRAVE(41), + LSHIFT(42), + BACKSLASH(43), + Z(44), + X(45), + C(46), + V(47), + B(48), + N(49), + M(50), + COMMA(51), + PERIOD(52), + SLASH(53), + RSHIFT(54), + MULTIPLY(55), + ALT(56), + SPACE(57), + CAPSLOCK(58), + F1(59), + F2(60), + F3(61), + F4(62), + F5(63), + F6(64), + F7(65), + F8(66), + F9(67), + F10(68), + NUMLOCK(69), + SCROLL(70), + NUMPAD7(71), + NUMPAD8(72), + NUMPAD9(73), + SUBTRACT(74), + NUMPAD4(75), + NUMPAD5(76), + NUMPAD6(77), + ADD(78), + NUMPAD1(79), + NUMPAD2(80), + NUMPAD3(81), + NUMPAD0(82), + DECIMAL(83), + F11(87), + F12(88), + F13(100), + F14(101), + F15(102), + F16(103), + F17(104), + F18(105), + KANA(112), + F19(113), + CONVERT(121), + NOCONVERT(123), + YEN(125), + NUMPADEQUALS(141), + CIRCUMFLEX(144), + AT(145), + COLON(146), + UNDERLINE(147), + KANJI(148), + STOP(149), + NUMPADENTER(156), + RCONTROL(157), + NUMPADCOMMA(179), + DIVIDE(181), + PRINT(183), + ALT_GR(184), + PAUSE(197), + HOME(199), + UP(200), + PRIOR(201), + LEFT(203), + RIGHT(205), + END(207), + DOWN(208), + NEXT(209), + INSERT(210), + DELETE(211), + WIN(219), + APPS(221), - // Mouse - MOUSEMOVED(-101), - LC(-100), - RC(-99), - MC(-98), - MBUTTON4(-97), - MBUTTON5(-96), - MBUTTON6(-95), - MBUTTON7(-94), - MBUTTON8(-93), - MBUTTON9(-92), - MBUTTON10(-91), - MBUTTON11(-90), - MBUTTON12(-89), - MBUTTON13(-88), - MBUTTON14(-87), - MBUTTON15(-86), - MBUTTON16(-85); + // Mouse + MOUSEMOVED(-101), + LC(-100), + RC(-99), + MC(-98), + MBUTTON4(-97), + MBUTTON5(-96), + MBUTTON6(-95), + MBUTTON7(-94), + MBUTTON8(-93), + MBUTTON9(-92), + MBUTTON10(-91), + MBUTTON11(-90), + MBUTTON12(-89), + MBUTTON13(-88), + MBUTTON14(-87), + MBUTTON15(-86), + MBUTTON16(-85); - private final int keycode; + private final int keycode; - private VirtualKey(int keycode) { - this.keycode = keycode; - } + private VirtualKey(int keycode) { + this.keycode = keycode; + } - public int getKeycode() { - return keycode; - } + public int getKeycode() { + return keycode; + } - public static Integer getKeycode(String keyname) { - VirtualKey key = get(keyname); - if (key != null) - return key.getKeycode(); - return null; - } - - public static String getName(int keycode) { - VirtualKey key = get(keycode); - if (key != null) - return key.name(); - return Integer.toString(keycode); - } + public static Integer getKeycode(String keyname) { + VirtualKey key = get(keyname); + if (key != null) + return key.getKeycode(); + return null; + } - public static VirtualKey get(int keycode) { - for (VirtualKey key : values()) { - if (key.getKeycode() == keycode) { - return key; - } - } - return null; - } + public static String getName(int keycode) { + VirtualKey key = get(keycode); + if (key != null) + return key.name(); + return Integer.toString(keycode); + } + + public static VirtualKey get(int keycode) { + for (VirtualKey key : values()) { + if (key.getKeycode() == keycode) { + return key; + } + } + return null; + } + + public static VirtualKey get(String keyname) { + if (keyname.isEmpty()) { + return null; + } + + for (VirtualKey key : values()) { + if (key.name().equalsIgnoreCase(keyname)) { + return key; + } + } + return null; + } - public static VirtualKey get(String keyname) { - if(keyname.isEmpty()) { - return null; - } - - for (VirtualKey key : values()) { - if (key.name().equalsIgnoreCase(keyname)) { - return key; - } - } - return null; - } - } diff --git a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualKeybindings.java b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualKeybindings.java index ca930fe8..7e65f680 100644 --- a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualKeybindings.java +++ b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualKeybindings.java @@ -38,7 +38,7 @@ public class VirtualKeybindings { /** * The standard cooldown for a keybinding in milliseconds */ - private static final long cooldown = 50*5; + private static final long cooldown = 50 * 5; /** * Stores the start time of a keybinding, used for cooldown calculation */ @@ -52,7 +52,6 @@ public class VirtualKeybindings { */ public static boolean focused = false; - /** * Checks whether the keycode is pressed, regardless of any gui screens * @@ -65,10 +64,10 @@ public static boolean isKeyDown(KeyBinding keybind) { boolean down = false; - if(mc.currentScreen instanceof GuiControls) { + if (mc.currentScreen instanceof GuiControls) { return false; } - + if (isKeyCodeAlwaysBlocked(keycode)) { down = keycode >= 0 ? Keyboard.isKeyDown(keycode) : Mouse.isButtonDown(keycode + 100); } else { diff --git a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualKeyboard.java b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualKeyboard.java index f99cba45..dbfd6da0 100644 --- a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualKeyboard.java +++ b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualKeyboard.java @@ -72,42 +72,42 @@ */ public class VirtualKeyboard extends VirtualPeripheral implements Serializable { - /** - * The list of characters that were pressed on this keyboard. - */ - private final List charList; - - /** - * A queue of characters used in {@link #getDifference(VirtualKeyboard, Queue)}.
    - * Used for distributing characters to {@link VirtualKeyboardEvent}s in an order. - */ - private final ConcurrentLinkedQueue charQueue = new ConcurrentLinkedQueue<>(); - - /** - * Creates an empty parent keyboard with all keys unpressed - */ - public VirtualKeyboard() { - this(new LinkedHashSet<>(), new ArrayList<>(), new ArrayList<>(), true); - } - - /** - * Creates a subtick keyboard with {@link VirtualPeripheral#subtickList} uninitialized - * @param pressedKeys The new list of pressed keycodes for this subtickKeyboard - * @param charList A list of characters for this subtickKeyboard - */ - public VirtualKeyboard(Set pressedKeys, List charList){ - this(pressedKeys, charList, null, false); - } - - /** - * Creates a keyboard from existing variables - * @param pressedKeys The existing list of pressed keycodes - * @param charList The existing list of characters - */ + /** + * The list of characters that were pressed on this keyboard. + */ + private final List charList; + + /** + * A queue of characters used in {@link #getDifference(VirtualKeyboard, Queue)}.
    + * Used for distributing characters to {@link VirtualKeyboardEvent}s in an order. + */ + private final ConcurrentLinkedQueue charQueue = new ConcurrentLinkedQueue<>(); + + /** + * Creates an empty parent keyboard with all keys unpressed + */ + public VirtualKeyboard() { + this(new LinkedHashSet<>(), new ArrayList<>(), new ArrayList<>(), true); + } + + /** + * Creates a subtick keyboard with {@link VirtualPeripheral#subtickList} uninitialized + * @param pressedKeys The new list of pressed keycodes for this subtickKeyboard + * @param charList A list of characters for this subtickKeyboard + */ + public VirtualKeyboard(Set pressedKeys, List charList) { + this(pressedKeys, charList, null, false); + } + + /** + * Creates a keyboard from existing variables + * @param pressedKeys The existing list of pressed keycodes + * @param charList The existing list of characters + */ public VirtualKeyboard(Set pressedKeys, List charList, boolean ignoreFirstUpdate) { this(pressedKeys, charList, null, ignoreFirstUpdate); } - + /** * Creates a keyboard from existing variables * @param pressedKeys The existing list of {@link VirtualPeripheral#pressedKeys} @@ -115,81 +115,81 @@ public VirtualKeyboard(Set pressedKeys, List charList, boole * @param subtickList {@link VirtualPeripheral#subtickList} * @param ignoreFirstUpdate The {@link VirtualPeripheral#ignoreFirstUpdate} */ - public VirtualKeyboard(Set pressedKeys, List charList, List subtickList, boolean ignoreFirstUpdate) { - super(pressedKeys, subtickList, ignoreFirstUpdate); - this.charList = charList; - } - - /** - * Updates the keyboard from an event, adds a new subtick to this keyboard.
    - *
    - * An event updates one key at a time. - * @param keycode The keycode of this key - * @param keystate The keystate of this key, true for pressed - * @param keycharacter The character that is associated with that key. Can change between keyboards or whenever shift is held in combination. - */ - public void updateFromEvent(int keycode, boolean keystate, char keycharacter, boolean repeatEventsEnabled) { - createSubtick(); - charList.clear(); + public VirtualKeyboard(Set pressedKeys, List charList, List subtickList, boolean ignoreFirstUpdate) { + super(pressedKeys, subtickList, ignoreFirstUpdate); + this.charList = charList; + } + + /** + * Updates the keyboard from an event, adds a new subtick to this keyboard.
    + *
    + * An event updates one key at a time. + * @param keycode The keycode of this key + * @param keystate The keystate of this key, true for pressed + * @param keycharacter The character that is associated with that key. Can change between keyboards or whenever shift is held in combination. + */ + public void updateFromEvent(int keycode, boolean keystate, char keycharacter, boolean repeatEventsEnabled) { + createSubtick(); + charList.clear(); if (keystate) { addChar(keycharacter, repeatEventsEnabled); } - setPressed(keycode, keystate); - } - - public void updateFromEvent(int keycode, boolean keystate, char keycharacter) { - updateFromEvent(keycode, keystate, keycharacter, false); - } - - public void updateFromEvent(VirtualKey key, boolean keystate, char keycharacter) { - updateFromEvent(key.getKeycode(), keystate, keycharacter); - } - - public void updateFromEvent(VirtualKey key, boolean keystate, char keycharacter, boolean repeatEventsEnabled) { - updateFromEvent(key.getKeycode(), keystate, keycharacter, false); - } - - /** - * Updates this keyboard from a state, and adds a new subtick.
    - *
    - * The difference to {@link #updateFromEvent(int, boolean, char)} is,
    - * that a state may update multiple pressed keys and chars at once.
    - *
    - * While update fromEvent is used when the player inputs something on the keyboard,
    - * updateFromState is used when creating a VirtualKeyboard by deserialising the TASfile,
    - * as the inputs in the TASfile are stored in states. - * - * @param keycodes An array of keycodes, that replaces {@link Subtickable#pressedKeys} - * @param chars An array of characters, that replaces {@link #charList} - * @see SerialiserFlavorBase#deserialiseKeyboard - */ - public void updateFromState(int[] keycodes, char[] chars) { - createSubtick(); - - this.pressedKeys.clear(); - for(int i : keycodes) { - this.pressedKeys.add(i); - } - - this.charList.clear(); - for(char c : chars) { - this.charList.add(c); - } - } - - @Override + setPressed(keycode, keystate); + } + + public void updateFromEvent(int keycode, boolean keystate, char keycharacter) { + updateFromEvent(keycode, keystate, keycharacter, false); + } + + public void updateFromEvent(VirtualKey key, boolean keystate, char keycharacter) { + updateFromEvent(key.getKeycode(), keystate, keycharacter); + } + + public void updateFromEvent(VirtualKey key, boolean keystate, char keycharacter, boolean repeatEventsEnabled) { + updateFromEvent(key.getKeycode(), keystate, keycharacter, false); + } + + /** + * Updates this keyboard from a state, and adds a new subtick.
    + *
    + * The difference to {@link #updateFromEvent(int, boolean, char)} is,
    + * that a state may update multiple pressed keys and chars at once.
    + *
    + * While update fromEvent is used when the player inputs something on the keyboard,
    + * updateFromState is used when creating a VirtualKeyboard by deserialising the TASfile,
    + * as the inputs in the TASfile are stored in states. + * + * @param keycodes An array of keycodes, that replaces {@link Subtickable#pressedKeys} + * @param chars An array of characters, that replaces {@link #charList} + * @see SerialiserFlavorBase#deserialiseKeyboard + */ + public void updateFromState(int[] keycodes, char[] chars) { + createSubtick(); + + this.pressedKeys.clear(); + for (int i : keycodes) { + this.pressedKeys.add(i); + } + + this.charList.clear(); + for (char c : chars) { + this.charList.add(c); + } + } + + @Override public void createSubtick() { - if(isParent() && !ignoreFirstUpdate()) { - addSubtick(shallowClone()); - } + if (isParent() && !ignoreFirstUpdate()) { + addSubtick(shallowClone()); + } + } + + @Override + public void setPressed(int keycode, boolean keystate) { + if (keycode >= 0) { // Keyboard keys always have a keycode larger or equal than 0 + super.setPressed(keycode, keystate); + } } - - @Override - public void setPressed(int keycode, boolean keystate) { - if (keycode >= 0) { // Keyboard keys always have a keycode larger or equal than 0 - super.setPressed(keycode, keystate); - } - } /** * Calculates a list of {@link VirtualKeyboardEvent}s to the next peripheral, @@ -205,7 +205,7 @@ public void setPressed(int keycode, boolean keystate) { public void getVirtualEvents(VirtualKeyboard nextKeyboard, Queue reference) { if (isParent()) { VirtualKeyboard currentSubtick = this; - for(VirtualKeyboard subtick : nextKeyboard.getAll()) { + for (VirtualKeyboard subtick : nextKeyboard.getAll()) { currentSubtick.getDifference(subtick, reference); currentSubtick = subtick; } @@ -222,10 +222,10 @@ public void getVirtualEvents(VirtualKeyboard nextKeyboard, Queue reference) { - charQueue.addAll(nextKeyboard.charList); + public void getDifference(VirtualKeyboard nextKeyboard, Queue reference) { + charQueue.addAll(nextKeyboard.charList); - /* Calculate symmetric difference of keycodes */ + /* Calculate symmetric difference of keycodes */ /* Calculate unpressed keys @@ -234,11 +234,11 @@ public void getDifference(VirtualKeyboard nextKeyboard, Queue - * Null characters will be discarded; - * @param character The character to add - */ - public void addChar(char character, boolean repeatEventsEnabled) { - if(character != Character.MIN_VALUE || repeatEventsEnabled) { - charList.add(character); - } - } - - @Override - public void clear(){ - super.clear(); - charList.clear(); - } - + while (!charQueue.isEmpty()) { + reference.add(new VirtualKeyboardEvent(lastKey, true, getOrMinChar(charQueue.poll()))); + } + + } + + private char getOrMinChar(Character charr) { + if (charr == null) { + charr = Character.MIN_VALUE; + } + return charr; + } + + /** + * Add a character to the {@link #charList}
    + * Null characters will be discarded; + * @param character The character to add + */ + public void addChar(char character, boolean repeatEventsEnabled) { + if (character != Character.MIN_VALUE || repeatEventsEnabled) { + charList.add(character); + } + } + + @Override + public void clear() { + super.clear(); + charList.clear(); + } + @Override public String toString() { if (isParent()) { @@ -310,7 +310,7 @@ public String toString() { } } - public String toString2(){ + public String toString2() { return String.format("%s;%s", super.toString(), charListToString(charList)); } @@ -328,67 +328,67 @@ private String charListToString(List charList) { * Clones this VirtualKeyboard without subticks. */ public VirtualKeyboard shallowClone() { - return new VirtualKeyboard(new HashSet<>(this.pressedKeys), new ArrayList<>(this.charList), isIgnoreFirstUpdate()); - } - + return new VirtualKeyboard(new HashSet<>(this.pressedKeys), new ArrayList<>(this.charList), isIgnoreFirstUpdate()); + } + @Override - public VirtualKeyboard clone(){ + public VirtualKeyboard clone() { return new VirtualKeyboard(new HashSet<>(this.pressedKeys), new ArrayList<>(this.charList), new ArrayList<>(subtickList), isIgnoreFirstUpdate()); } - - @Override - public void moveFrom(VirtualKeyboard keyboard) { - if(keyboard == null) - return; - super.moveFrom(keyboard); - charList.clear(); - charList.addAll(keyboard.charList); - keyboard.charList.clear(); - } - - @Override + + @Override + public void moveFrom(VirtualKeyboard keyboard) { + if (keyboard == null) + return; + super.moveFrom(keyboard); + charList.clear(); + charList.addAll(keyboard.charList); + keyboard.charList.clear(); + } + + @Override public void copyFrom(VirtualKeyboard keyboard) { - if(keyboard == null) - return; - super.copyFrom(keyboard); - charList.clear(); - charList.addAll(keyboard.charList); - } - - @Override - public void deepCopyFrom(VirtualKeyboard keyboard) { - if(keyboard == null) - return; - super.deepCopyFrom(keyboard); - charList.clear(); - charList.addAll(keyboard.charList); - } - - @Override - public boolean equals(Object obj) { - if(obj instanceof VirtualKeyboard) { - VirtualKeyboard keyboard = (VirtualKeyboard) obj; - - if(charList.size() != keyboard.charList.size()) { - return false; - } - - for (int i = 0; i < charList.size(); i++) { - if(charList.get(i)!=keyboard.charList.get(i)) { + if (keyboard == null) + return; + super.copyFrom(keyboard); + charList.clear(); + charList.addAll(keyboard.charList); + } + + @Override + public void deepCopyFrom(VirtualKeyboard keyboard) { + if (keyboard == null) + return; + super.deepCopyFrom(keyboard); + charList.clear(); + charList.addAll(keyboard.charList); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof VirtualKeyboard) { + VirtualKeyboard keyboard = (VirtualKeyboard) obj; + + if (charList.size() != keyboard.charList.size()) { + return false; + } + + for (int i = 0; i < charList.size(); i++) { + if (charList.get(i) != keyboard.charList.get(i)) { return false; } } - return super.equals(obj); - } - return super.equals(obj); - } - - /** - * @return An immutable {@link #charList} - */ - public List getCharList() { - return ImmutableList.copyOf(charList); - } + return super.equals(obj); + } + return super.equals(obj); + } + + /** + * @return An immutable {@link #charList} + */ + public List getCharList() { + return ImmutableList.copyOf(charList); + } public boolean isEmpty() { return super.isEmpty() && charList.isEmpty(); diff --git a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualMouse.java b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualMouse.java index 8398a231..3d4efab5 100644 --- a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualMouse.java +++ b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualMouse.java @@ -1,12 +1,17 @@ package com.minecrafttas.tasmod.virtual; -import com.minecrafttas.tasmod.playback.tasfile.flavor.SerialiserFlavorBase; -import com.minecrafttas.tasmod.virtual.event.VirtualMouseEvent; - import java.io.Serializable; -import java.util.*; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Queue; +import java.util.Set; import java.util.stream.Collectors; +import com.minecrafttas.tasmod.playback.tasfile.flavor.SerialiserFlavorBase; +import com.minecrafttas.tasmod.virtual.event.VirtualMouseEvent; + /** * Stores the mouse specific values in a given timeframe
    *
    @@ -38,7 +43,7 @@ public class VirtualMouse extends VirtualPeripheral implements Ser /** * Creates a mouse with no buttons pressed and no data */ - public VirtualMouse(){ + public VirtualMouse() { this(new LinkedHashSet<>(), 0, 0, 0, new ArrayList<>(), true); } @@ -84,16 +89,16 @@ public VirtualMouse(Set pressedKeys, int scrollWheel, int cursorX, int this.cursorY = cursorY; } - /** - * Updates the mouse, adds a new subtick to this mouse
    - *
    - * An event updates one key at a time. - * @param keycode The keycode of this button - * @param keystate The keystate of this button, true for pressed - * @param scrollwheel The scroll wheel for this mouse - * @param cursorX The pointer location in the x axis - * @param cursorY The pointer location in the y axis - */ + /** + * Updates the mouse, adds a new subtick to this mouse
    + *
    + * An event updates one key at a time. + * @param keycode The keycode of this button + * @param keystate The keystate of this button, true for pressed + * @param scrollwheel The scroll wheel for this mouse + * @param cursorX The pointer location in the x axis + * @param cursorY The pointer location in the y axis + */ public void updateFromEvent(int keycode, boolean keystate, int scrollwheel, int cursorX, int cursorY) { createSubtick(); setPressed(keycode, keystate); @@ -101,14 +106,14 @@ public void updateFromEvent(int keycode, boolean keystate, int scrollwheel, int this.cursorX = cursorX; this.cursorY = cursorY; } - + /** * Updates the mouse, adds a new subtick to this mouse
    - *
    - * An event updates one key at a time. + *
    + * An event updates one key at a time. * - * @param key The key - * @param keystate The keystate of this button, true for pressed + * @param key The key + * @param keystate The keystate of this button, true for pressed * @param scrollwheel The scroll wheel for this mouse * @param cursorX The pointer location in the x axis * @param cursorY The pointer location in the y axis @@ -116,31 +121,31 @@ public void updateFromEvent(int keycode, boolean keystate, int scrollwheel, int public void updateFromEvent(VirtualKey key, boolean keystate, int scrollwheel, int cursorX, int cursorY) { updateFromEvent(key.getKeycode(), keystate, scrollwheel, cursorX, cursorY); } - - /** - * Updates this mouse from a state, and adds a new subtick.
    - *
    - * The difference to {@link #updateFromEvent(int, boolean, int, Integer, Integer) updateFromEvent} is,
    - * that a state may update multiple pressed keys at once.
    - *
    - * While update fromEvent is used when the player inputs something on the mouse,
    - * updateFromState is used when creating a VirtualMouse by deserialising the TASfile,
    - * as the inputs in the TASfile are stored in states. - * - * @param keycodes An array of keycodes, that replaces {@link Subtickable#pressedKeys pressedKeys} - * @param scrollwheel The scroll wheel of this mouse state - * @param cursorX The pointer location in the x axis + + /** + * Updates this mouse from a state, and adds a new subtick.
    + *
    + * The difference to {@link #updateFromEvent(int, boolean, int, Integer, Integer) updateFromEvent} is,
    + * that a state may update multiple pressed keys at once.
    + *
    + * While update fromEvent is used when the player inputs something on the mouse,
    + * updateFromState is used when creating a VirtualMouse by deserialising the TASfile,
    + * as the inputs in the TASfile are stored in states. + * + * @param keycodes An array of keycodes, that replaces {@link Subtickable#pressedKeys pressedKeys} + * @param scrollwheel The scroll wheel of this mouse state + * @param cursorX The pointer location in the x axis * @param cursorY The pointer location in the y axis - * @see SerialiserFlavorBase#deserialiseMouse - */ + * @see SerialiserFlavorBase#deserialiseMouse + */ public void updateFromState(int[] keycodes, int scrollwheel, int cursorX, int cursorY) { createSubtick(); - + this.pressedKeys.clear(); - for(int i: keycodes) { + for (int i : keycodes) { this.pressedKeys.add(i); } - + this.scrollWheel = scrollwheel; this.cursorX = cursorX; this.cursorY = cursorY; @@ -152,10 +157,10 @@ public void createSubtick() { addSubtick(shallowClone()); } } - + @Override public void setPressed(int keycode, boolean keystate) { - if (keycode < 0) { // Mouse buttons always have a keycode smaller than 0 + if (keycode < 0) { // Mouse buttons always have a keycode smaller than 0 super.setPressed(keycode, keystate); } } @@ -175,7 +180,7 @@ public void setPressed(int keycode, boolean keystate) { public void getVirtualEvents(VirtualMouse nextMouse, Queue reference) { if (isParent()) { VirtualMouse currentSubtick = this; - for(VirtualMouse subtick : nextMouse.getAll()) { + for (VirtualMouse subtick : nextMouse.getAll()) { currentSubtick.getDifference(subtick, reference); currentSubtick = subtick; } @@ -193,12 +198,12 @@ public void getVirtualEvents(VirtualMouse nextMouse, Queue re * @param reference The queue to fill. Passed in by reference. */ public void getDifference(VirtualMouse nextMouse, Queue reference) { - + /* * Checks if pressedKeys are the same... */ - if(pressedKeys.equals(nextMouse.pressedKeys)){ - + if (pressedKeys.equals(nextMouse.pressedKeys)) { + /* * ...but scrollWheel, cursorX or cursorY are different. * Without this, the scrollWheel would only work if a mouse button is pressed at the same time. @@ -207,7 +212,7 @@ public void getDifference(VirtualMouse nextMouse, Queue refer * Otherwise, repeated usage of the scrollWheel will result in #equals being true, * which doesn't trigger the if clause like it should. */ - if(!equals(nextMouse) || scrollWheel != 0) { + if (!equals(nextMouse) || scrollWheel != 0) { reference.add(new VirtualMouseEvent(VirtualKey.MOUSEMOVED.getKeycode(), false, nextMouse.scrollWheel, nextMouse.cursorX, nextMouse.cursorY)); } return; @@ -218,21 +223,22 @@ public void getDifference(VirtualMouse nextMouse, Queue refer /* Calculate symmetric difference of keycodes */ - /* - Calculate unpressed keys - this: LC RC - next: LC MC - ------------- - RC <- unpressed - */ - for(int keycode : pressedKeys) { + /* + Calculate unpressed keys + this: LC RC + next: LC MC + ------------- + RC <- unpressed + */ + for (int keycode : pressedKeys) { if (!nextMouse.getPressedKeys().contains(keycode)) { reference.add(new VirtualMouseEvent(keycode, false, scrollWheelCopy, cursorXCopy, cursorYCopy)); scrollWheelCopy = 0; cursorXCopy = 0; cursorYCopy = 0; } - }; + } + ; /* Calculate pressed keys @@ -241,11 +247,12 @@ public void getDifference(VirtualMouse nextMouse, Queue refer ------------- MC <- pressed */ - for(int keycode : nextMouse.getPressedKeys()) { + for (int keycode : nextMouse.getPressedKeys()) { if (!this.pressedKeys.contains(keycode)) { reference.add(new VirtualMouseEvent(keycode, true, scrollWheelCopy, cursorXCopy, cursorYCopy)); } - }; + } + ; } @Override @@ -253,7 +260,7 @@ public void clear() { super.clear(); clearMouseData(); } - + /** * Resets mouse specific data to it's defaults */ @@ -262,8 +269,7 @@ private void clearMouseData() { cursorX = 0; cursorY = 0; } - - + @Override public String toString() { if (isParent()) { @@ -272,8 +278,8 @@ public String toString() { return toString2(); } } - - public String toString2(){ + + public String toString2() { return String.format("%s;%s,%s,%s", super.toString(), scrollWheel, cursorX, cursorY); } @@ -283,7 +289,7 @@ public String toString2(){ public VirtualMouse shallowClone() { return new VirtualMouse(new HashSet<>(this.pressedKeys), scrollWheel, cursorX, cursorY, null, ignoreFirstUpdate()); } - + @Override public VirtualMouse clone() { return new VirtualMouse(new HashSet<>(this.pressedKeys), scrollWheel, cursorX, cursorY, new ArrayList<>(subtickList), isIgnoreFirstUpdate()); @@ -291,68 +297,65 @@ public VirtualMouse clone() { @Override public void moveFrom(VirtualMouse mouse) { - if(mouse==null) + if (mouse == null) return; super.moveFrom(mouse); this.scrollWheel = mouse.scrollWheel; this.cursorX = mouse.cursorX; this.cursorY = mouse.cursorY; - mouse.scrollWheel=0; + mouse.scrollWheel = 0; } - + @Override public void copyFrom(VirtualMouse mouse) { - if(mouse==null) + if (mouse == null) return; super.copyFrom(mouse); this.scrollWheel = mouse.scrollWheel; this.cursorX = mouse.cursorX; this.cursorY = mouse.cursorY; } - + @Override public void deepCopyFrom(VirtualMouse mouse) { - if(mouse==null) + if (mouse == null) return; super.deepCopyFrom(mouse); this.scrollWheel = mouse.scrollWheel; this.cursorX = mouse.cursorX; this.cursorY = mouse.cursorY; } - + @Override public boolean equals(Object obj) { if (obj instanceof VirtualMouse) { VirtualMouse mouse = (VirtualMouse) obj; - return super.equals(obj) && - scrollWheel == mouse.scrollWheel && - cursorX == mouse.cursorX && - cursorY == mouse.cursorY; + return super.equals(obj) && scrollWheel == mouse.scrollWheel && cursorX == mouse.cursorX && cursorY == mouse.cursorY; } return super.equals(obj); } - + /** * @return {@link #scrollWheel} */ public int getScrollWheel() { return scrollWheel; } - + /** * @return {@link #cursorX} */ public int getCursorX() { return cursorX; } - + /** * @return {@link #cursorY} */ public int getCursorY() { return cursorY; } - + @Override public boolean isEmpty() { return super.isEmpty() && scrollWheel == 0 && cursorX == 0 && cursorY == 0; diff --git a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualPeripheral.java b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualPeripheral.java index 49f4c2b7..824bcb15 100644 --- a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualPeripheral.java +++ b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualPeripheral.java @@ -78,12 +78,13 @@ public List getCurrentPresses() { return out; } - /** - * Creates a new subtick by {@link #shallowClone() shallowCloning} this VirtualPeripheral.
    - * If {@link Subtickable#ignoreFirstUpdate} is true, no new subtick will be created.
    - */ - public void createSubtick() {} - + /** + * Creates a new subtick by {@link #shallowClone() shallowCloning} this VirtualPeripheral.
    + * If {@link Subtickable#ignoreFirstUpdate} is true, no new subtick will be created.
    + */ + public void createSubtick() { + } + @Override public String toString() { return String.join(",", getCurrentPresses()); @@ -147,13 +148,13 @@ public boolean equals(Object obj) { * @param peripheral The peripheral to move from */ protected void moveFrom(T peripheral) { - if(peripheral == null) + if (peripheral == null) return; copyFrom(peripheral); peripheral.subtickList.clear(); peripheral.resetFirstUpdate(); } - + /** * Copies the data from another virtual peripheral into this peripheral without creating a new object.
    * Does not delete the data from the other peripehral.
    @@ -162,28 +163,28 @@ protected void moveFrom(T peripheral) { * @param peripheral The peripheral to copy from */ protected void copyFrom(T peripheral) { - if(peripheral == null) + if (peripheral == null) return; this.pressedKeys.clear(); this.pressedKeys.addAll(peripheral.pressedKeys); } - + /** * Copies the data from another virtual peripheral similar to {@link #copyFrom(VirtualPeripheral) copyFrom}, but including the {@link com.minecrafttas.tasmod.virtual.Subtickable.subtickList subtickList} * @param peripheral */ protected void deepCopyFrom(T peripheral) { - if(peripheral == null || !peripheral.isParent()) + if (peripheral == null || !peripheral.isParent()) return; copyFrom(peripheral); this.subtickList.clear(); this.subtickList.addAll(peripheral.subtickList); } - + @Override public boolean isEmpty() { boolean flag = pressedKeys.isEmpty(); - if(pressedKeys.size() == 1) { + if (pressedKeys.size() == 1) { flag = pressedKeys.contains(VirtualKey.ZERO.getKeycode()) || pressedKeys.contains(VirtualKey.MOUSEMOVED.getKeycode()); } return super.isEmpty() && flag; From c7a4493c909d73adc1d2f5b56da5f10f87a0ea60 Mon Sep 17 00:00:00 2001 From: Scribble Date: Thu, 11 Jul 2024 12:56:35 +0200 Subject: [PATCH 79/79] [PlaybackSerialiser] Changed TASFile to TASfile for better consistency --- .../java/com/minecrafttas/tasmod/commands/CommandLoadTAS.java | 2 +- .../java/com/minecrafttas/tasmod/commands/CommandSaveTAS.java | 2 +- .../com/minecrafttas/tasmod/commands/TabCompletionUtils.java | 2 +- .../tasmod/playback/metadata/PlaybackMetadataRegistry.java | 4 ++-- .../tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java | 2 +- .../com/minecrafttas/tasmod/registries/TASmodAPIRegistry.java | 4 ++-- .../java/tasmod/playback/tasfile/PlaybackSerialiserTest.java | 2 +- .../tasmod/playback/tasfile/SerialiserFlavorBaseTest.java | 2 +- 8 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/minecrafttas/tasmod/commands/CommandLoadTAS.java b/src/main/java/com/minecrafttas/tasmod/commands/CommandLoadTAS.java index add5e67e..cbd8e71e 100644 --- a/src/main/java/com/minecrafttas/tasmod/commands/CommandLoadTAS.java +++ b/src/main/java/com/minecrafttas/tasmod/commands/CommandLoadTAS.java @@ -61,7 +61,7 @@ public List getTabCompletions(MinecraftServer server, ICommandSender sen List tab; if (args.length == 1) { try { - tab = TASmod.tabCompletionUtils.getTASFileList(getCommandSenderAsPlayer(sender).getName()); + tab = TASmod.tabCompletionUtils.getTASfileList(getCommandSenderAsPlayer(sender).getName()); } catch (TimeoutException e) { sender.sendMessage(new TextComponentString(TextFormatting.RED + "Failed to fetch the file list after 2 seconds, something went wrong")); TASmod.LOGGER.catching(e); diff --git a/src/main/java/com/minecrafttas/tasmod/commands/CommandSaveTAS.java b/src/main/java/com/minecrafttas/tasmod/commands/CommandSaveTAS.java index aaf4ef7a..1c4162af 100644 --- a/src/main/java/com/minecrafttas/tasmod/commands/CommandSaveTAS.java +++ b/src/main/java/com/minecrafttas/tasmod/commands/CommandSaveTAS.java @@ -74,7 +74,7 @@ public List getTabCompletions(MinecraftServer server, ICommandSender sen check = true; } try { - tab = TASmod.tabCompletionUtils.getTASFileList(getCommandSenderAsPlayer(sender).getName()); + tab = TASmod.tabCompletionUtils.getTASfileList(getCommandSenderAsPlayer(sender).getName()); } catch (TimeoutException e) { sender.sendMessage(new TextComponentString(TextFormatting.RED + "Failed to fetch the file list after 2 seconds, something went wrong")); TASmod.LOGGER.catching(e); diff --git a/src/main/java/com/minecrafttas/tasmod/commands/TabCompletionUtils.java b/src/main/java/com/minecrafttas/tasmod/commands/TabCompletionUtils.java index 60809b72..69eae109 100644 --- a/src/main/java/com/minecrafttas/tasmod/commands/TabCompletionUtils.java +++ b/src/main/java/com/minecrafttas/tasmod/commands/TabCompletionUtils.java @@ -56,7 +56,7 @@ public void onServerPacket(PacketID id, ByteBuffer buf, String username) throws } } - public List getTASFileList(String playername) throws InterruptedException, ExecutionException, TimeoutException { + public List getTASfileList(String playername) throws InterruptedException, ExecutionException, TimeoutException { fileList = new CompletableFuture<>(); try { TASmod.server.sendTo(playername, new TASmodBufferBuilder(COMMAND_TASFILELIST)); diff --git a/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadataRegistry.java b/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadataRegistry.java index a681af47..658638f4 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadataRegistry.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/metadata/PlaybackMetadataRegistry.java @@ -10,7 +10,7 @@ import com.minecrafttas.tasmod.playback.metadata.PlaybackMetadata.PlaybackMetadataExtension; /** - * Registry for registering custom metadata that is stored in the TASFile.
    + * Registry for registering custom metadata that is stored in the TASfile.
    *
    * The default metadata includes general information such as author name, * savestate/rerecord count and category.
    @@ -46,7 +46,7 @@ public void handleOnLoad(List meta) { extension.onLoad(metadata); } else { - TASmod.LOGGER.warn("The metadata extension {} was not found while loading the TASFile. Things might not be correctly loaded!", metadata.getExtensionName()); + TASmod.LOGGER.warn("The metadata extension {} was not found while loading the TASfile. Things might not be correctly loaded!", metadata.getExtensionName()); } } } diff --git a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java index b679bed3..b423b479 100644 --- a/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java +++ b/src/main/java/com/minecrafttas/tasmod/playback/tasfile/flavor/SerialiserFlavorBase.java @@ -44,7 +44,7 @@ public abstract class SerialiserFlavorBase implements Registerable { protected TickContainer previousTickContainer = null; protected String headerStart() { - return createCenteredHeading("TASFile", '#', 50); + return createCenteredHeading("TASfile", '#', 50); } /** diff --git a/src/main/java/com/minecrafttas/tasmod/registries/TASmodAPIRegistry.java b/src/main/java/com/minecrafttas/tasmod/registries/TASmodAPIRegistry.java index f76b9e55..86e68530 100644 --- a/src/main/java/com/minecrafttas/tasmod/registries/TASmodAPIRegistry.java +++ b/src/main/java/com/minecrafttas/tasmod/registries/TASmodAPIRegistry.java @@ -8,7 +8,7 @@ public class TASmodAPIRegistry { /** - * Registry for registering custom metadata that is stored in the TASFile.
    + * Registry for registering custom metadata that is stored in the TASfile.
    *
    * The default metadata includes general information such as author name, * savestate/rerecord count and category.
    @@ -21,7 +21,7 @@ public class TASmodAPIRegistry { * Registry for registering custom behavior for each tick during recording and playback.
    *
    * File commands give the opportunity to run commands on each recorded tick and each played back tick.
    - * File commands also have access to the TASFile so that data can be stored and read in/from the TASFile. + * File commands also have access to the TASfile so that data can be stored and read in/from the TASfile. * */ public static final PlaybackFileCommandsRegistry PLAYBACK_FILE_COMMAND = new PlaybackFileCommandsRegistry(); diff --git a/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java b/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java index ef3e99f8..91834091 100644 --- a/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java +++ b/src/test/java/tasmod/playback/tasfile/PlaybackSerialiserTest.java @@ -205,7 +205,7 @@ void testSerialiser() { @Test void testDeserialiser() throws PlaybackLoadException, IOException { List lines = new ArrayList<>(); - lines.add("TASFile"); + lines.add("TASfile"); lines.add("FileCommand-Extensions: tasmod_testFileExtension"); lines.add("Flavor: Test"); lines.add("----------- Test ----------"); diff --git a/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java b/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java index f0719bac..8864d879 100644 --- a/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java +++ b/src/test/java/tasmod/playback/tasfile/SerialiserFlavorBaseTest.java @@ -59,7 +59,7 @@ void testSerialiseFlavorname() { @Test void testSerialiseHeaderStart() { - assertEquals("##################### TASFile ####################", headerStart()); + assertEquals("##################### TASfile ####################", headerStart()); } /**