use of com.faforever.server.entity.Game in project faf-java-server by FAForever.
the class GameService method getPlayerTeamId.
private Optional<Integer> getPlayerTeamId(Player player) {
Optional<Game> gameOptional = Optional.ofNullable(player.getCurrentGame());
if (!gameOptional.isPresent()) {
return Optional.empty();
}
Game game = gameOptional.get();
return Optional.ofNullable((Integer) game.getPlayerOptions().get(player.getId()).get(OPTION_TEAM));
}
use of com.faforever.server.entity.Game in project faf-java-server by FAForever.
the class GameService method endGameIfArmyResultsComplete.
/**
* Checks whether a game has ended and, if so, calls {@link #onGameEnded(Game)}. As the game doesn't yet send a clear
* "game ended" command yet, a game is considered as ended when the following conditions are met: <ol><li>Every
* connected player reported an army outcome for all armies</li> <li>Every survivor reported a score for all armies
* (defeated players do not send scores)</li></ol>(human and AI).
*/
// TODO simplify once https://github.com/FAForever/fa/issues/2378 is implemented
private void endGameIfArmyResultsComplete(Game game) {
List<Integer> armies = Streams.concat(game.getPlayerOptions().values().stream(), game.getAiOptions().values().stream()).filter(options -> options.containsKey(OPTION_ARMY)).map(options -> (Integer) options.get(OPTION_ARMY)).collect(Collectors.toList());
Map<Integer, Player> connectedPlayers = game.getConnectedPlayers();
Map<Integer, Map<Integer, ArmyResult>> reportedArmyOutcomes = game.getReportedArmyResults();
for (Integer playerId : connectedPlayers.keySet()) {
Map<Integer, ArmyResult> reportedOutcomes = reportedArmyOutcomes.get(playerId);
if (reportedOutcomes == null) {
return;
}
if (!areArmyOutcomesComplete(armies, playerId, reportedOutcomes)) {
return;
}
}
onGameEnded(game);
}
use of com.faforever.server.entity.Game in project faf-java-server by FAForever.
the class GameService method disconnectPlayerFromGame.
/**
* Tells all peers of the player with the specified ID to drop their connections to him/her.
*/
public void disconnectPlayerFromGame(Player requester, int playerId) {
Optional<Player> optional = playerService.getOnlinePlayer(playerId);
if (!optional.isPresent()) {
log.warn("User '{}' tried to disconnect unknown player '{}' from game", requester, playerId);
return;
}
Player player = optional.get();
Game game = player.getCurrentGame();
if (game == null) {
log.warn("User '{}' tried to disconnect player '{}' from game, but no game is associated", requester, player);
return;
}
Collection<? extends ConnectionAware> receivers = game.getConnectedPlayers().values().stream().filter(item -> !Objects.equals(item.getId(), playerId)).collect(Collectors.toList());
clientService.disconnectPlayerFromGame(playerId, receivers);
log.info("User '{}' disconnected player '{}' from game '{}'", requester, player, game);
}
use of com.faforever.server.entity.Game in project faf-java-server by FAForever.
the class GameService method updatePlayerGameState.
/**
* Updates the game state of a player's game.
*/
@Transactional
public void updatePlayerGameState(PlayerGameState newState, Player player) {
Game game = player.getCurrentGame();
Requests.verify(game != null, ErrorCode.NOT_IN_A_GAME);
PlayerGameState oldState = player.getGameState();
log.debug("Player '{}' updated his game state from '{}' to '{}' (game: '{}')", player, oldState, newState, game);
Requests.verify(PlayerGameState.canTransition(oldState, newState), ErrorCode.INVALID_PLAYER_GAME_STATE_TRANSITION, oldState, newState);
changePlayerGameState(player, newState);
switch(newState) {
case LOBBY:
onLobbyEntered(player, game);
break;
case LAUNCHING:
onGameLaunching(player, game);
break;
case ENDED:
onPlayerGameEnded(player, game);
break;
case CLOSED:
onPlayerGameClosed(player, game);
break;
case IDLE:
log.warn("Ignoring state '{}' from player '{}' for game '{}' (should be handled by the client)", newState, player, game);
break;
default:
throw new ProgrammingError("Uncovered state: " + newState);
}
}
use of com.faforever.server.entity.Game in project faf-java-server by FAForever.
the class GameService method updateGameOption.
/**
* Updates an option value of the game that is currently being hosted by the specified host. If the specified player
* is not currently hosting a game, this method does nothing.
*/
public void updateGameOption(Player reporter, String key, Object value) {
Game game = reporter.getCurrentGame();
if (game == null) {
// Since this is called repeatedly, throwing exceptions here would not be a good idea
log.debug("Received game option for player w/o game: {}", reporter);
return;
}
Requests.verify(Objects.equals(reporter.getCurrentGame().getHost(), reporter), ErrorCode.HOST_ONLY_OPTION, key);
log.trace("Updating option for game '{}': '{}' = '{}'", game, key, value);
game.getOptions().put(key, value);
if (VictoryCondition.GAME_OPTION_NAME.equals(key)) {
game.setVictoryCondition(VictoryCondition.fromString((String) value));
} else if (OPTION_SLOTS.equals(key)) {
game.setMaxPlayers((int) value);
} else if (OPTION_SCENARIO_FILE.equals(value)) {
game.setMapName(((String) value).replace("//", "/").replace("\\", "/").split("/")[2]);
} else if (OPTION_TITLE.equals(value)) {
game.setTitle((String) value);
}
markDirty(game, DEFAULT_MIN_DELAY, DEFAULT_MAX_DELAY);
}
Aggregations