Search in sources :

Example 1 with ServerGame

use of games.strategy.engine.framework.ServerGame in project triplea by triplea-game.

the class HeadlessGameServer method getStatus.

String getStatus() {
    String message = "Server Start Date: " + startDate;
    final ServerGame game = getIGame();
    if (game != null) {
        message += "\nIs currently running: " + game.isGameSequenceRunning() + "\nIs GameOver: " + game.isGameOver() + "\nGame: " + game.getData().getGameName() + "\nRound: " + game.getData().getSequence().getRound() + "\nPlayers: " + game.getPlayerManager().toString();
    } else {
        message += "\nCurrently Waiting To Start A Game";
    }
    return message;
}
Also used : ServerGame(games.strategy.engine.framework.ServerGame)

Example 2 with ServerGame

use of games.strategy.engine.framework.ServerGame in project triplea by triplea-game.

the class LocalLauncher method launchInNewThread.

@Override
protected void launchInNewThread(final Component parent) {
    Exception exceptionLoadingGame = null;
    ServerGame game = null;
    try {
        gameData.doPreGameStartDataModifications(playerListing);
        final Messengers messengers = new Messengers(new HeadlessServerMessenger());
        final Set<IGamePlayer> gamePlayers = gameData.getGameLoader().createPlayers(playerListing.getLocalPlayerTypes());
        game = new ServerGame(gameData, gamePlayers, new HashMap<>(), messengers);
        game.setRandomSource(randomSource);
        // for debugging, we can use a scripted random source
        if (ScriptedRandomSource.useScriptedRandom()) {
            game.setRandomSource(new ScriptedRandomSource());
        }
        gameData.getGameLoader().startGame(game, gamePlayers, headless);
    } catch (final MapNotFoundException e) {
        exceptionLoadingGame = e;
    } catch (final Exception ex) {
        ClientLogger.logQuietly("Failed to start game", ex);
        exceptionLoadingGame = ex;
    } finally {
        gameLoadingWindow.doneWait();
    }
    try {
        if (exceptionLoadingGame == null) {
            game.startGame();
        }
    } finally {
        // todo(kg), this does not occur on the swing thread, and this notifies setupPanel observers
        // having an oddball issue with the zip stream being closed while parsing to load default game. might be caused
        // by closing of stream while unloading map resources.
        Interruptibles.sleep(100);
        gameSelectorModel.loadDefaultGameNewThread();
        SwingUtilities.invokeLater(() -> JOptionPane.getFrameForComponent(parent).setVisible(true));
    }
}
Also used : IGamePlayer(games.strategy.engine.gamePlayer.IGamePlayer) Messengers(games.strategy.net.Messengers) ServerGame(games.strategy.engine.framework.ServerGame) HashMap(java.util.HashMap) HeadlessServerMessenger(games.strategy.net.HeadlessServerMessenger) ScriptedRandomSource(games.strategy.engine.random.ScriptedRandomSource)

Example 3 with ServerGame

use of games.strategy.engine.framework.ServerGame in project triplea by triplea-game.

the class TripleAFrame method leaveGame.

@Override
public void leaveGame() {
    final int selectedOption = EventThreadJOptionPane.showConfirmDialog(this, "Are you sure you want to leave the current game?\nUnsaved game data will be lost.", "Leave Game", JOptionPane.YES_NO_OPTION, getUiContext().getCountDownLatchHandler());
    if (selectedOption != JOptionPane.OK_OPTION) {
        return;
    }
    if (game instanceof ServerGame) {
        ((ServerGame) game).stopGame();
    } else {
        game.getMessenger().shutDown();
        ((ClientGame) game).shutDown();
        // an ugly hack, we need a better
        // way to get the main frame
        GameRunner.clientLeftGame();
    }
}
Also used : ServerGame(games.strategy.engine.framework.ServerGame) ClientGame(games.strategy.engine.framework.ClientGame) Point(java.awt.Point)

Example 4 with ServerGame

use of games.strategy.engine.framework.ServerGame in project triplea by triplea-game.

the class HeadlessGameServer method remoteStopGame.

public String remoteStopGame(final String hashedPassword, final String salt) {
    final String password = System.getProperty(LOBBY_GAME_SUPPORT_PASSWORD, "");
    if (password.equals(GameRunner.NO_REMOTE_REQUESTS_ALLOWED)) {
        return "Host not accepting remote requests!";
    }
    final String localPassword = System.getProperty(LOBBY_GAME_SUPPORT_PASSWORD, "");
    if (hashPassword(localPassword, salt).equals(hashedPassword)) {
        final ServerGame serverGame = game;
        if (serverGame != null) {
            new Thread(() -> {
                System.out.println("Remote Stop Game Initiated.");
                try {
                    serverGame.saveGame(new File(ClientSetting.SAVE_GAMES_FOLDER_PATH.value(), SaveGameFileChooser.getAutoSaveFileName()));
                } catch (final Exception e) {
                    logger.log(Level.SEVERE, "Failed to save game", e);
                }
                serverGame.stopGame();
            }).start();
        }
        return null;
    }
    System.out.println("Attempted remote stop game with invalid password.");
    return "Invalid password!";
}
Also used : ServerGame(games.strategy.engine.framework.ServerGame) File(java.io.File)

Example 5 with ServerGame

use of games.strategy.engine.framework.ServerGame in project triplea by triplea-game.

the class ServerLauncher method launchInNewThread.

@Override
protected void launchInNewThread(final Component parent) {
    try {
        // the order of this stuff does matter
        serverModel.setServerLauncher(this);
        serverReady = new ServerReady(clientCount);
        if (inGameLobbyWatcher != null) {
            inGameLobbyWatcher.setGameStatus(GameDescription.GameStatus.LAUNCHING, null);
        }
        serverModel.allowRemoveConnections();
        ui = parent;
        if (headless) {
            HeadlessGameServer.log("Game Status: Launching");
        }
        remoteMessenger.registerRemote(serverReady, ClientModel.CLIENT_READY_CHANNEL);
        gameData.doPreGameStartDataModifications(playerListing);
        abortLaunch = testShouldWeAbort();
        final byte[] gameDataAsBytes = gameData.toBytes();
        final Set<IGamePlayer> localPlayerSet = gameData.getGameLoader().createPlayers(playerListing.getLocalPlayerTypes());
        final Messengers messengers = new Messengers(messenger, remoteMessenger, channelMessenger);
        serverGame = new ServerGame(gameData, localPlayerSet, remotePlayers, messengers);
        serverGame.setInGameLobbyWatcher(inGameLobbyWatcher);
        if (headless) {
            HeadlessGameServer.setServerGame(serverGame);
        }
        // tell the clients to start,
        // later we will wait for them to all
        // signal that they are ready.
        ((IClientChannel) channelMessenger.getChannelBroadcastor(IClientChannel.CHANNEL_NAME)).doneSelectingPlayers(gameDataAsBytes, serverGame.getPlayerManager().getPlayerMapping());
        final boolean useSecureRandomSource = !remotePlayers.isEmpty();
        if (useSecureRandomSource) {
            // server game.
            // try to find an opponent to be the other side of the crypto random source.
            final PlayerID remotePlayer = serverGame.getPlayerManager().getRemoteOpponent(messenger.getLocalNode(), gameData);
            final CryptoRandomSource randomSource = new CryptoRandomSource(remotePlayer, serverGame);
            serverGame.setRandomSource(randomSource);
        }
        try {
            gameData.getGameLoader().startGame(serverGame, localPlayerSet, headless);
        } catch (final Exception e) {
            ClientLogger.logError("Failed to launch", e);
            abortLaunch = true;
            if (gameLoadingWindow != null) {
                gameLoadingWindow.doneWait();
            }
        }
        if (headless) {
            HeadlessGameServer.log("Game Successfully Loaded. " + (abortLaunch ? "Aborting Launch." : "Starting Game."));
        }
        if (abortLaunch) {
            serverReady.countDownAll();
        }
        if (!serverReady.await(ClientSetting.SERVER_START_GAME_SYNC_WAIT_TIME.intValue(), TimeUnit.SECONDS)) {
            System.out.println("Waiting for clients to be ready timed out!");
            abortLaunch = true;
        }
        remoteMessenger.unregisterRemote(ClientModel.CLIENT_READY_CHANNEL);
        new Thread(() -> {
            try {
                isLaunching = false;
                abortLaunch = testShouldWeAbort();
                if (!abortLaunch) {
                    if (useSecureRandomSource) {
                        warmUpCryptoRandomSource();
                    }
                    if (gameLoadingWindow != null) {
                        gameLoadingWindow.doneWait();
                    }
                    if (headless) {
                        HeadlessGameServer.log("Starting Game Delegates.");
                    }
                    serverGame.startGame();
                } else {
                    stopGame();
                    if (!headless) {
                        SwingUtilities.invokeLater(() -> JOptionPane.showMessageDialog(ui, "Problem during startup, game aborted."));
                    } else {
                        System.out.println("Problem during startup, game aborted.");
                    }
                }
            } catch (final MessengerException me) {
                // if just connection lost, no need to scare the user with some giant stack trace
                if (me instanceof ConnectionLostException) {
                    System.out.println("Game Player disconnection: " + me.getMessage());
                } else {
                    me.printStackTrace(System.out);
                }
                // wait for the connection handler to notice, and shut us down
                try {
                    // we are already aborting the launch
                    if (!abortLaunch) {
                        if (!errorLatch.await(ClientSetting.SERVER_OBSERVER_JOIN_WAIT_TIME.intValue(), TimeUnit.SECONDS)) {
                            System.err.println("Waiting on error latch timed out!");
                        }
                    }
                } catch (final InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
                stopGame();
            } catch (final Exception e) {
                e.printStackTrace(System.err);
                if (headless) {
                    System.out.println(DebugUtils.getThreadDumps());
                    HeadlessGameServer.sendChat("If this is a repeatable issue or error, please make a copy of this savegame " + "and contact a Mod and/or file a bug report.");
                }
                stopGame();
            }
            // having an oddball issue with the zip stream being closed while parsing to load default game. might be
            // caused by closing of stream while unloading map resources.
            Interruptibles.sleep(200);
            // either game ended, or aborted, or a player left or disconnected
            if (headless) {
                try {
                    System.out.println("Game ended, going back to waiting.");
                    // if we do not do this, we can get into an infinite loop of launching a game,
                    // then crashing out, then launching, etc.
                    serverModel.setAllPlayersToNullNodes();
                    final File f1 = new File(ClientSetting.SAVE_GAMES_FOLDER_PATH.value(), SaveGameFileChooser.getAutoSaveFileName());
                    if (f1.exists()) {
                        gameSelectorModel.load(f1, null);
                    } else {
                        gameSelectorModel.resetGameDataToNull();
                    }
                } catch (final Exception e1) {
                    ClientLogger.logQuietly("Failed to load game", e1);
                    gameSelectorModel.resetGameDataToNull();
                }
            } else {
                gameSelectorModel.loadDefaultGameNewThread();
            }
            if (parent != null) {
                SwingUtilities.invokeLater(() -> JOptionPane.getFrameForComponent(parent).setVisible(true));
            }
            serverModel.setServerLauncher(null);
            serverModel.newGame();
            if (inGameLobbyWatcher != null) {
                inGameLobbyWatcher.setGameStatus(GameDescription.GameStatus.WAITING_FOR_PLAYERS, null);
            }
            if (headless) {
                // tell headless server to wait for new connections:
                HeadlessGameServer.waitForUsersHeadlessInstance();
                HeadlessGameServer.log("Game Status: Waiting For Players");
            }
        }, "Triplea, start server game").start();
    } finally {
        if (gameLoadingWindow != null) {
            gameLoadingWindow.doneWait();
        }
        if (inGameLobbyWatcher != null) {
            inGameLobbyWatcher.setGameStatus(GameDescription.GameStatus.IN_PROGRESS, serverGame);
        }
        if (headless) {
            HeadlessGameServer.log("Game Status: In Progress");
        }
    }
}
Also used : IGamePlayer(games.strategy.engine.gamePlayer.IGamePlayer) PlayerID(games.strategy.engine.data.PlayerID) ConnectionLostException(games.strategy.engine.message.ConnectionLostException) Messengers(games.strategy.net.Messengers) ServerGame(games.strategy.engine.framework.ServerGame) MessengerException(games.strategy.engine.message.MessengerException) MessengerException(games.strategy.engine.message.MessengerException) ConnectionLostException(games.strategy.engine.message.ConnectionLostException) CryptoRandomSource(games.strategy.engine.random.CryptoRandomSource) IClientChannel(games.strategy.engine.framework.startup.mc.IClientChannel) File(java.io.File)

Aggregations

ServerGame (games.strategy.engine.framework.ServerGame)6 IGamePlayer (games.strategy.engine.gamePlayer.IGamePlayer)2 Messengers (games.strategy.net.Messengers)2 File (java.io.File)2 PlayerID (games.strategy.engine.data.PlayerID)1 ClientGame (games.strategy.engine.framework.ClientGame)1 LocalPlayers (games.strategy.engine.framework.LocalPlayers)1 IClientChannel (games.strategy.engine.framework.startup.mc.IClientChannel)1 ConnectionLostException (games.strategy.engine.message.ConnectionLostException)1 MessengerException (games.strategy.engine.message.MessengerException)1 CryptoRandomSource (games.strategy.engine.random.CryptoRandomSource)1 ScriptedRandomSource (games.strategy.engine.random.ScriptedRandomSource)1 HeadlessServerMessenger (games.strategy.net.HeadlessServerMessenger)1 DefaultSoundChannel (games.strategy.sound.DefaultSoundChannel)1 HeadlessSoundChannel (games.strategy.sound.HeadlessSoundChannel)1 EditDelegate (games.strategy.triplea.delegate.EditDelegate)1 HeadlessUiContext (games.strategy.triplea.ui.HeadlessUiContext)1 TripleAFrame (games.strategy.triplea.ui.TripleAFrame)1 UiContext (games.strategy.triplea.ui.UiContext)1 HeadlessDisplay (games.strategy.triplea.ui.display.HeadlessDisplay)1