package org.pixelgaffer.turnierserver.codr.simulator; import java.io.File; import java.io.IOException; import java.lang.ProcessBuilder.Redirect; import java.util.UUID; import lombok.Getter; import lombok.NonNull; import lombok.RequiredArgsConstructor; import lombok.Setter; import org.pixelgaffer.turnierserver.codr.Version; import org.pixelgaffer.turnierserver.codr.utilities.ErrorLog; import org.pixelgaffer.turnierserver.codr.utilities.Paths; import org.pixelgaffer.turnierserver.gamelogic.interfaces.Ai; import org.pixelgaffer.turnierserver.gamelogic.interfaces.AiObject; @RequiredArgsConstructor public class CodrAiWrapper implements Ai { /** Das zugrundeliegende Spiel, enthält die Spiellogik. */ @NonNull @Getter private CodrGameImpl game; /** Die UUID der KI im Netzwerk. */ @Getter @NonNull private UUID uuid; /** Gibt an ob sich die KI schon verbunden hat. */ @Getter private boolean connected = false; /** Der {@link CodrAiServerConnectionHandler} dieser KI. */ @Getter private CodrAiServerConnectionHandler connectionHandler; /** Die Version der KI. */ @Getter @Setter private Version version; /** Der ID-String dieser KI. */ @Setter @Getter private String id; /** Der Index der KI in der Liste. */ @Getter @Setter private int index; /** Hier kann die Spiellogik Informationen über die KI abspeichern. */ @Getter @Setter private AiObject object; /** Der Process dieser KI. */ @Getter private Process process; public void executeAi (String propertiesFile) throws IOException { String executeCommand[] = new String[getVersion().executeArgs.length + 2]; executeCommand[0] = getVersion().executeCommand; System.arraycopy(getVersion().executeArgs, 0, executeCommand, 1, getVersion().executeArgs.length); executeCommand[executeCommand.length - 1] = propertiesFile; ProcessBuilder pb = new ProcessBuilder(executeCommand); pb.directory(new File(Paths.versionBin(getVersion()))); System.out.println(pb.directory() + "$ " + pb.command()); pb.redirectError(Redirect.INHERIT); pb.redirectOutput(Redirect.INHERIT); process = pb.start(); ErrorLog.write("Die KI " + id + " wurde aufgerufen."); } public void receiveMessage (byte message[]) { System.out.println("Empfange: " + new String(message)); game.getLogic().receiveMessage(message, this); } @Override public void sendMessage (byte[] message) throws IOException { connectionHandler.send(message); } @Override public void disconnect () throws IOException { connectionHandler.close(); getProcess().destroyForcibly(); } public void connected (@NonNull CodrAiServerConnectionHandler handler) { connectionHandler = handler; connected = true; game.aiConnected(); } }