From d20ec19e147d247fc2779213e85eb1b0841b567e Mon Sep 17 00:00:00 2001 From: User Date: Thu, 18 Sep 2025 00:33:37 +0200 Subject: [PATCH 1/4] Serves Train Models --- .../eu/cronmoth/createtrainwebapi/ApiServer.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/main/java/eu/cronmoth/createtrainwebapi/ApiServer.java b/src/main/java/eu/cronmoth/createtrainwebapi/ApiServer.java index 1557acd..055e8d2 100644 --- a/src/main/java/eu/cronmoth/createtrainwebapi/ApiServer.java +++ b/src/main/java/eu/cronmoth/createtrainwebapi/ApiServer.java @@ -5,11 +5,14 @@ import io.undertow.server.HttpHandler; import io.undertow.server.HttpServerExchange; import io.undertow.server.handlers.PathHandler; +import io.undertow.server.handlers.resource.FileResourceManager; +import io.undertow.server.handlers.resource.ResourceHandler; import io.undertow.server.handlers.sse.ServerSentEventConnectionCallback; import io.undertow.server.handlers.sse.ServerSentEventHandler; import io.undertow.util.Headers; import io.undertow.util.HttpString; +import java.io.File; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; @@ -64,7 +67,20 @@ public void connected(io.undertow.server.handlers.sse.ServerSentEventConnection } } ); + FileResourceManager resourceManager = new FileResourceManager(new File("bluemap/train_models/"), 100); + ResourceHandler resourceHandler = new ResourceHandler(resourceManager) + .setDirectoryListingEnabled(false) + .setWelcomeFiles("index.html"); + HttpHandler trainModelHandler = new HttpHandler() { + @Override + public void handleRequest(HttpServerExchange exchange) throws Exception { + exchange.getResponseHeaders().put(new HttpString("Access-Control-Allow-Origin"), "*"); + resourceHandler.handleRequest(exchange); + } + }; + + pathHandler.addPrefixPath("/trainModels", trainModelHandler); server = Undertow.builder() .addHttpListener(port, host) .setHandler(pathHandler) From fbae67cf41ee5c35abee83555d711f2e98a04d0f Mon Sep 17 00:00:00 2001 From: User Date: Thu, 18 Sep 2025 01:54:41 +0200 Subject: [PATCH 2/4] Bluemapfolder optional --- build.gradle | 4 -- .../cronmoth/createtrainwebapi/ApiServer.java | 61 ++++++++----------- 2 files changed, 26 insertions(+), 39 deletions(-) diff --git a/build.gradle b/build.gradle index 24ea96c..cb5870d 100644 --- a/build.gradle +++ b/build.gradle @@ -255,8 +255,4 @@ idea { } tasks.withType(Jar).configureEach { zip64 = true -} - -tasks.withType(com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar).configureEach { - zip64 = true } \ No newline at end of file diff --git a/src/main/java/eu/cronmoth/createtrainwebapi/ApiServer.java b/src/main/java/eu/cronmoth/createtrainwebapi/ApiServer.java index 055e8d2..283af5e 100644 --- a/src/main/java/eu/cronmoth/createtrainwebapi/ApiServer.java +++ b/src/main/java/eu/cronmoth/createtrainwebapi/ApiServer.java @@ -40,52 +40,43 @@ public void start(String host, int port) { ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(4); pathHandler.addExactPath("/trainsLive", - new HttpHandler() { - @Override - public void handleRequest(HttpServerExchange exchange) throws Exception { - exchange.getResponseHeaders().put(new HttpString("Access-Control-Allow-Origin"), "*"); - exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "text/event-stream"); - new ServerSentEventHandler( - new ServerSentEventConnectionCallback() { - @Override - public void connected(io.undertow.server.handlers.sse.ServerSentEventConnection connection, String lastEventId) { - ScheduledFuture future = scheduler.scheduleAtFixedRate(() -> { - if (connection.isOpen()) { - try { - String update = mapper.writeValueAsString(TrackInformation.GetTrainData()); - connection.send(update); - } catch (Exception e) { - e.printStackTrace(); - } - } - }, 0, 200, TimeUnit.MILLISECONDS); - - connection.addCloseTask(conn -> future.cancel(false)); + exchange -> { + exchange.getResponseHeaders().put(new HttpString("Access-Control-Allow-Origin"), "*"); + exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "text/event-stream"); + new ServerSentEventHandler( + (connection, lastEventId) -> { + ScheduledFuture future = scheduler.scheduleAtFixedRate(() -> { + if (connection.isOpen()) { + try { + String update = mapper.writeValueAsString(TrackInformation.GetTrainData()); + connection.send(update); + } catch (Exception e) { + e.printStackTrace(); + } } - } - ).handleRequest(exchange); - } + }, 0, 200, TimeUnit.MILLISECONDS); + + connection.addCloseTask(conn -> future.cancel(false)); + } + ).handleRequest(exchange); } ); - FileResourceManager resourceManager = new FileResourceManager(new File("bluemap/train_models/"), 100); - ResourceHandler resourceHandler = new ResourceHandler(resourceManager) - .setDirectoryListingEnabled(false) - .setWelcomeFiles("index.html"); - HttpHandler trainModelHandler = new HttpHandler() { - @Override - public void handleRequest(HttpServerExchange exchange) throws Exception { + if (new File("bluemap/train_models/").exists()) { + FileResourceManager resourceManager = new FileResourceManager(new File("bluemap/train_models/"), 100); + ResourceHandler resourceHandler = new ResourceHandler(resourceManager) + .setDirectoryListingEnabled(false); + HttpHandler trainModelHandler = exchange -> { exchange.getResponseHeaders().put(new HttpString("Access-Control-Allow-Origin"), "*"); resourceHandler.handleRequest(exchange); - } - }; + }; - pathHandler.addPrefixPath("/trainModels", trainModelHandler); + pathHandler.addPrefixPath("/trainModels", trainModelHandler); + } server = Undertow.builder() .addHttpListener(port, host) .setHandler(pathHandler) .build(); - server.start(); } public void stop() { From 1133dbab7b26b51e8507e588f5d1339c994e61d8 Mon Sep 17 00:00:00 2001 From: User Date: Thu, 18 Sep 2025 13:17:51 +0200 Subject: [PATCH 3/4] build gradle --- .gitignore | 1 + build.gradle | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 31d2550..46497be 100644 --- a/.gitignore +++ b/.gitignore @@ -20,6 +20,7 @@ build # other eclipse run +run-WebServer runs run-data diff --git a/build.gradle b/build.gradle index cb5870d..47ef722 100644 --- a/build.gradle +++ b/build.gradle @@ -1,3 +1,5 @@ +import net.neoforged.moddevgradle.dsl.RunModel + plugins { id 'java-library' id 'maven-publish' @@ -48,13 +50,14 @@ neoForge { runs { client { client() - + gameDirectory = project.file("run-WebServer") // Comma-separated list of namespaces to load gametests from. Empty = all namespaces. systemProperty 'neoforge.enabledGameTestNamespaces', project.mod_id } server { server() + gameDirectory = project.file("run-WebServer") programArgument '--nogui' systemProperty 'neoforge.enabledGameTestNamespaces', project.mod_id } From 1115d56d582977f8ca348b11bb2bb1cbff29d892 Mon Sep 17 00:00:00 2001 From: User Date: Thu, 25 Sep 2025 12:29:52 +0200 Subject: [PATCH 4/4] assembly direction added --- .../createtrainwebapi/model/TrainCarData.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/main/java/eu/cronmoth/createtrainwebapi/model/TrainCarData.java b/src/main/java/eu/cronmoth/createtrainwebapi/model/TrainCarData.java index fb8effc..ffd640c 100644 --- a/src/main/java/eu/cronmoth/createtrainwebapi/model/TrainCarData.java +++ b/src/main/java/eu/cronmoth/createtrainwebapi/model/TrainCarData.java @@ -1,11 +1,17 @@ package eu.cronmoth.createtrainwebapi.model; import com.simibubi.create.content.trains.entity.Carriage; +import com.simibubi.create.content.trains.entity.CarriageContraption; +import com.simibubi.create.content.trains.entity.CarriageContraptionEntity; import com.simibubi.create.content.trains.graph.TrackNode; +import net.minecraft.nbt.CompoundTag; + +import java.lang.reflect.Field; public class TrainCarData { public int id; public double positionOnTrack; + public String assemblyDirection; //public double length; public NodeData node1; public NodeData node2; @@ -16,5 +22,16 @@ public TrainCarData(Carriage carriage) { //length = carriage.getLeadingPoint().position - positionOnTrack; node1= new NodeData(carriage.getLeadingPoint().node1); node2= new NodeData(carriage.getLeadingPoint().node2); + + try { + Field f = Carriage.class.getDeclaredField("serialisedEntity"); + f.setAccessible(true); + CompoundTag serialisedEntity = (CompoundTag) f.get(carriage); + CompoundTag contraptionTag = serialisedEntity.getCompound("Contraption"); + assemblyDirection = contraptionTag.getString("AssemblyDirection"); + } catch (IllegalAccessException | NoSuchFieldException e) { + throw new RuntimeException(e); + } + } } \ No newline at end of file