diff --git a/build.gradle.kts b/build.gradle.kts index 2a1e2df30..15ae4e85e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -45,6 +45,7 @@ dependencies { // Junit Testing Framework testImplementation(libs.junit.api) testImplementation(libs.junit.params) + testImplementation("com.github.ReplayMod:ReplayStudio:70f59efaa3") testRuntimeOnly(libs.junit.engine) // Only here to ensure J9 module support for extensions and our classloaders testCompileOnly(libs.mockito.core) diff --git a/src/test/java/net/minestom/server/extra/ac/AntiCheatTest.java b/src/test/java/net/minestom/server/extra/ac/AntiCheatTest.java new file mode 100644 index 000000000..467c9d09a --- /dev/null +++ b/src/test/java/net/minestom/server/extra/ac/AntiCheatTest.java @@ -0,0 +1,14 @@ +package net.minestom.server.extra.ac; + +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.net.URISyntaxException; + +public class AntiCheatTest extends UtilsAC { + + @Test + public void test() throws URISyntaxException, IOException { + retrieveReplay("replay_demo.mcpr"); + } +} diff --git a/src/test/java/net/minestom/server/extra/ac/UtilsAC.java b/src/test/java/net/minestom/server/extra/ac/UtilsAC.java new file mode 100644 index 000000000..abb14eb2f --- /dev/null +++ b/src/test/java/net/minestom/server/extra/ac/UtilsAC.java @@ -0,0 +1,69 @@ +package net.minestom.server.extra.ac; + +import com.google.gson.JsonObject; +import com.replaymod.replaystudio.PacketData; +import com.replaymod.replaystudio.Studio; +import com.replaymod.replaystudio.filter.StreamFilter; +import com.replaymod.replaystudio.lib.viaversion.api.protocol.packet.State; +import com.replaymod.replaystudio.lib.viaversion.api.protocol.version.ProtocolVersion; +import com.replaymod.replaystudio.protocol.PacketTypeRegistry; +import com.replaymod.replaystudio.replay.ReplayFile; +import com.replaymod.replaystudio.replay.ZipReplayFile; +import com.replaymod.replaystudio.stream.PacketStream; +import com.replaymod.replaystudio.studio.ReplayStudio; +import net.minestom.server.MinecraftServer; + +import java.io.File; + +public class UtilsAC { + + private static final ReplayStudio STUDIO = new ReplayStudio(); + + void retrieveReplay(String name) { + try { + final File dir = new File(ClassLoader.getSystemResource(name).toURI()); + final ReplayFile replayFile = new ZipReplayFile(STUDIO, dir); + + final PacketTypeRegistry registry = PacketTypeRegistry.get(ProtocolVersion.getProtocol(MinecraftServer.PROTOCOL_VERSION), State.PLAY); + PacketStream stream = replayFile.getPacketData(registry).asPacketStream(); + stream.start(); + stream.addFilter(new ProgressFilter()); // Required for some reason + + int count = 0; + PacketData packetData; + while ((packetData = stream.next()) != null) { + // TODO how to retrieve server-bound packets? + System.out.println("packet " + packetData.getPacket().getType() + " - " + packetData.getTime()); + if (count++ >= 10) break; + } + + stream.end(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + private static final class ProgressFilter implements StreamFilter { + @Override + public String getName() { + return "progress"; + } + + @Override + public void init(Studio studio, JsonObject config) { + } + + @Override + public void onStart(PacketStream stream) { + } + + @Override + public boolean onPacket(PacketStream stream, PacketData data) { + return true; + } + + @Override + public void onEnd(PacketStream stream, long timestamp) { + } + } +} diff --git a/src/test/resources/replay_demo.mcpr b/src/test/resources/replay_demo.mcpr new file mode 100644 index 000000000..e1a36b223 Binary files /dev/null and b/src/test/resources/replay_demo.mcpr differ