package de.towerdefence.server.match; import de.towerdefence.server.player.Player; import de.towerdefence.server.server.channels.match.money.PlayerMoneyCallback; import de.towerdefence.server.server.channels.match.placing.Tower; import org.springframework.stereotype.Service; import java.util.HashMap; import java.util.Map; import java.util.Optional; import java.util.concurrent.*; @Service public class MatchService { private final Map playerMatches = new HashMap<>(); private final Map> moneyTasks = new HashMap<>(); private static final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); public void createMatch(String matchId, Player player1, Player player2) { Match match = new Match(matchId, player1, player2); playerMatches.put(player1, match); playerMatches.put(player2, match); } public Match get(Player player) { return playerMatches.get(player); } /** * @return opponent */ public Player placeTower(Player player, int x, int y) throws InvalidPlacementException{ return playerMatches.get(player).addTower(player, new Tower(), x, y); } public void playerConnected(Player player, PlayerMoneyCallback callback) { Match match = playerMatches.get(player); Optional currentMoney = match.getPlayerMoney(player); if (currentMoney.isEmpty()) { return; } match.setPlayerMoneyCallback(player, callback); callback.call(player, currentMoney.get()); boolean matchStarted =match.setPlayerConnected(player); if (!matchStarted) { return; } ScheduledFuture moneyTask = scheduler.scheduleAtFixedRate( () -> { match.addMoney(3); match.getPlayer1MoneyCallback().call(match.getPlayer1(), match.getPlayer1Money()); match.getPlayer2MoneyCallback().call(match.getPlayer2(), match.getPlayer2Money()); }, 5, 5, TimeUnit.SECONDS ); moneyTasks.put(match, moneyTask); } }