diff --git a/.gradle/8.8/checksums/checksums.lock b/.gradle/8.8/checksums/checksums.lock index d707e65..f26bc97 100644 Binary files a/.gradle/8.8/checksums/checksums.lock and b/.gradle/8.8/checksums/checksums.lock differ diff --git a/.gradle/8.8/checksums/md5-checksums.bin b/.gradle/8.8/checksums/md5-checksums.bin index 6612955..92c1a3d 100644 Binary files a/.gradle/8.8/checksums/md5-checksums.bin and b/.gradle/8.8/checksums/md5-checksums.bin differ diff --git a/.gradle/8.8/checksums/sha1-checksums.bin b/.gradle/8.8/checksums/sha1-checksums.bin index 55d6fe4..507c471 100644 Binary files a/.gradle/8.8/checksums/sha1-checksums.bin and b/.gradle/8.8/checksums/sha1-checksums.bin differ diff --git a/.gradle/8.8/executionHistory/executionHistory.bin b/.gradle/8.8/executionHistory/executionHistory.bin index fdf434f..631a88e 100644 Binary files a/.gradle/8.8/executionHistory/executionHistory.bin and b/.gradle/8.8/executionHistory/executionHistory.bin differ diff --git a/.gradle/8.8/executionHistory/executionHistory.lock b/.gradle/8.8/executionHistory/executionHistory.lock index c3af91f..be3ec18 100644 Binary files a/.gradle/8.8/executionHistory/executionHistory.lock and b/.gradle/8.8/executionHistory/executionHistory.lock differ diff --git a/.gradle/8.8/fileHashes/fileHashes.bin b/.gradle/8.8/fileHashes/fileHashes.bin index c6651b4..d6089bb 100644 Binary files a/.gradle/8.8/fileHashes/fileHashes.bin and b/.gradle/8.8/fileHashes/fileHashes.bin differ diff --git a/.gradle/8.8/fileHashes/fileHashes.lock b/.gradle/8.8/fileHashes/fileHashes.lock index 4db083b..14072ef 100644 Binary files a/.gradle/8.8/fileHashes/fileHashes.lock and b/.gradle/8.8/fileHashes/fileHashes.lock differ diff --git a/.gradle/8.8/fileHashes/resourceHashesCache.bin b/.gradle/8.8/fileHashes/resourceHashesCache.bin index cc403ae..de90632 100644 Binary files a/.gradle/8.8/fileHashes/resourceHashesCache.bin and b/.gradle/8.8/fileHashes/resourceHashesCache.bin differ diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock index a9f5f70..b9de57e 100644 Binary files a/.gradle/buildOutputCleanup/buildOutputCleanup.lock and b/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ diff --git a/.gradle/buildOutputCleanup/outputFiles.bin b/.gradle/buildOutputCleanup/outputFiles.bin index f94c30a..0de6a50 100644 Binary files a/.gradle/buildOutputCleanup/outputFiles.bin and b/.gradle/buildOutputCleanup/outputFiles.bin differ diff --git a/.gradle/file-system.probe b/.gradle/file-system.probe index 553cc35..c818345 100644 Binary files a/.gradle/file-system.probe and b/.gradle/file-system.probe differ diff --git a/.gradle/loom-cache/launch.cfg b/.gradle/loom-cache/launch.cfg index 2b92f91..d703da8 100644 --- a/.gradle/loom-cache/launch.cfg +++ b/.gradle/loom-cache/launch.cfg @@ -1,10 +1,10 @@ commonProperties fabric.development=true - fabric.remapClasspathFile=/home/astatin3/Documents/GitHub/no-more-render/.gradle/loom-cache/remapClasspath.txt - log4j.configurationFile=/home/astatin3/Documents/GitHub/no-more-render/.gradle/loom-cache/log4j.xml + fabric.remapClasspathFile=/home/astatin3/GitHub/no-more-render/.gradle/loom-cache/remapClasspath.txt + log4j.configurationFile=/home/astatin3/GitHub/no-more-render/.gradle/loom-cache/log4j.xml log4j2.formatMsgNoLookups=true fabric.gameJarPath=/home/astatin3/.gradle/caches/fabric-loom/minecraftMaven/net/minecraft/minecraft-common/1.21-net.fabricmc.yarn.1_21.1.21+build.2-v2/minecraft-common-1.21-net.fabricmc.yarn.1_21.1.21+build.2-v2.jar - fabric.classPathGroups=/home/astatin3/Documents/GitHub/no-more-render/build/classes/java/main:/home/astatin3/Documents/GitHub/no-more-render/build/resources/main:/home/astatin3/Documents/GitHub/no-more-render/build/classes/java/client:/home/astatin3/Documents/GitHub/no-more-render/build/resources/client + fabric.classPathGroups=/home/astatin3/GitHub/no-more-render/build/classes/java/main:/home/astatin3/GitHub/no-more-render/build/resources/main:/home/astatin3/GitHub/no-more-render/build/classes/java/client:/home/astatin3/GitHub/no-more-render/build/resources/client fabric.log.disableAnsi=false clientArgs --assetIndex diff --git a/.idea/modules.xml b/.idea/modules.xml index 0e2509d..87936d8 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -2,6 +2,7 @@ + diff --git a/.idea/modules/no-more-render.main.iml b/.idea/modules/no-more-render.main.iml index e7cab93..01580e3 100644 --- a/.idea/modules/no-more-render.main.iml +++ b/.idea/modules/no-more-render.main.iml @@ -6,16 +6,13 @@ FABRIC MIXIN + MCP 1 - - - - + \ No newline at end of file diff --git a/.idea/modules/no-more-render.test.iml b/.idea/modules/no-more-render.test.iml index bf0cfc1..01580e3 100644 --- a/.idea/modules/no-more-render.test.iml +++ b/.idea/modules/no-more-render.test.iml @@ -6,12 +6,13 @@ FABRIC MIXIN + MCP 1 - \ No newline at end of file diff --git a/.idea/runConfigurations/Minecraft_Client.xml b/.idea/runConfigurations/Minecraft_Client.xml index 8032c16..f5242d4 100644 --- a/.idea/runConfigurations/Minecraft_Client.xml +++ b/.idea/runConfigurations/Minecraft_Client.xml @@ -1,14 +1,14 @@ - - \ No newline at end of file diff --git a/.idea/runConfigurations/Minecraft_Server.xml b/.idea/runConfigurations/Minecraft_Server.xml index 9432063..e305f57 100644 --- a/.idea/runConfigurations/Minecraft_Server.xml +++ b/.idea/runConfigurations/Minecraft_Server.xml @@ -12,5 +12,5 @@ - + \ No newline at end of file diff --git a/README.md b/README.md index cc1d6c4..f417bd2 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,22 @@ # no-more-render A Fabric mod that removes Minecraft's window rendering code, to create a headless CLI version + +## Usage +This mod runs a tcp server locally that allows for a command line interface +The mod runs on the port 65000, and increments this value by 1 if it cannot access that port. +You can connect to it via running `ncat localhost 65000` or other similar command +### Comamnds: +``` +listelements/elems - List widgets on the screen +clickelement/celem - Click an element on the screen +writeelement/welem - Write text into a compatable element + +key - Press and release a key +keydown - Press a key +keyup - Release a key + +connect :[Port] - Forcibly connect to a server + +quit/exit - Close the game +``` diff --git a/src/client/java/com/astatin3/nomorerender/mixin/client/HeadlessMinecraftClient.java b/src/client/java/com/astatin3/nomorerender/mixin/client/HeadlessMinecraftClient.java index 68baa33..980fa49 100644 --- a/src/client/java/com/astatin3/nomorerender/mixin/client/HeadlessMinecraftClient.java +++ b/src/client/java/com/astatin3/nomorerender/mixin/client/HeadlessMinecraftClient.java @@ -7,10 +7,14 @@ import net.minecraft.client.gl.WindowFramebuffer; import net.minecraft.client.gui.Drawable; import net.minecraft.client.gui.Element; import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.screen.multiplayer.ConnectScreen; import net.minecraft.client.gui.screen.world.WorldListWidget; import net.minecraft.client.gui.widget.*; +import net.minecraft.client.render.GameRenderer; import org.jetbrains.annotations.Nullable; import org.lwjgl.glfw.GLFW; +import net.minecraft.client.network.ServerAddress; +import net.minecraft.client.network.ServerInfo; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -20,6 +24,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.io.*; +import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; @@ -41,11 +46,20 @@ public class HeadlessMinecraftClient { @Shadow private Thread thread; + + @Unique final MinecraftClient self = (MinecraftClient)(Object)this; + @Inject(method = "", at = @At("TAIL")) private void onGameLoaded(RunArgs args, CallbackInfo ci) { // AddonTemplate.LOG.info("Hello from ExampleMixin!"); System.out.println("#########################################"); + System.out.println("#########################################"); + System.out.println("(no-more-render) This client is running a mod that disables Minecraft from opening a window!"); + System.out.println("#########################################"); + System.out.println("#########################################"); + startCommandThread(); + self.gameRenderer.onResized(10, 10); } @@ -53,9 +67,19 @@ public class HeadlessMinecraftClient { Thread commandThread = new Thread(() -> { // BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); String line; + int i = 0; try { - ServerSocket serverSocket = new ServerSocket(65000); - System.out.println("Server is listening on port " + 65000); + ServerSocket serverSocket; + while(true){ + try { + serverSocket = new ServerSocket(65000+i, 50, InetAddress.getByName("127.0.0.1")); + System.out.println("Server is listening on port " + (65000+i)); + break; + } catch (java.net.BindException e){ + System.out.println("port " + (65000+i) + " failed, trying another"); + i++; + } + } while (true) { Socket socket = serverSocket.accept(); @@ -90,10 +114,8 @@ public class HeadlessMinecraftClient { commandThread.start(); } - @Unique final MinecraftClient self = (MinecraftClient)(Object)this; - - private void parseCommand(String command) { + if(command == null) return; String[] split = command.split(" "); try { switch (split[0].toLowerCase()) { @@ -101,9 +123,6 @@ public class HeadlessMinecraftClient { case "exit": self.stop(); break; - case "tick": - self.tick(); - break; case "listelements": case "elems": listElements(); @@ -131,6 +150,23 @@ public class HeadlessMinecraftClient { simulateKeyUp(split[1]); } break; + + case "connect": + if (split.length == 1) + writer.println("You must specify a server address!"); + if (split.length > 3) + writer.println("Too many arguments!"); + else { + + int port = 25565; + + if (split.length == 3) + port = Integer.parseInt(split[2]); + + writer.println("Connecting to: " + split[1] + ":" + port); + connect_to_serv(new ServerAddress(split[1], port)); + } + break; default: writer.println("Unknown command: " + command); } @@ -311,4 +347,11 @@ public class HeadlessMinecraftClient { return GLFW.GLFW_KEY_UNKNOWN; } + + public void connect_to_serv(ServerAddress addr){ + self.execute(() -> { + ConnectScreen.connect(self.currentScreen, self, addr, new ServerInfo("Test", addr.getAddress(), ServerInfo.ServerType.OTHER), true, null); + }); + } + }