package fr.lyrgard.hexScape.server.listener; import com.google.common.eventbus.Subscribe; import fr.lyrgard.hexScape.bus.CoreMessageBus; import fr.lyrgard.hexScape.message.MarkerPlacedMessage; import fr.lyrgard.hexScape.message.MarkerRemovedMessage; import fr.lyrgard.hexScape.message.MarkerRevealedMessage; import fr.lyrgard.hexScape.message.PlaceMarkerMessage; import fr.lyrgard.hexScape.message.RemoveMarkerMessage; import fr.lyrgard.hexScape.message.RevealMarkerMessage; import fr.lyrgard.hexScape.model.IdGenerator; import fr.lyrgard.hexScape.model.Universe; import fr.lyrgard.hexScape.model.card.CardInstance; import fr.lyrgard.hexScape.model.game.Game; import fr.lyrgard.hexScape.model.marker.UnknownTypeMarkerInstance; import fr.lyrgard.hexScape.model.player.Player; import fr.lyrgard.hexScape.model.player.User; import fr.lyrgard.hexscape.server.network.ServerNetwork; public class MarkerMessageListener { private static MarkerMessageListener instance; public static void start() { if (instance == null) { instance = new MarkerMessageListener(); CoreMessageBus.register(instance); } } private MarkerMessageListener() { } @Subscribe public void onPlaceMarker(PlaceMarkerMessage message) { String userId = message.getSessionUserId(); String cardId = message.getCardId(); String markerTypeId = message.getMarkerTypeId(); String hiddenMarkerTypeId = message.getHiddenMarkerTypeId(); int number = message.getNumber(); boolean stackable = message.isStackable(); User user = Universe.getInstance().getUsersByIds().get(userId); if (user != null && user.getGame() != null) { if (user != null && user.getGame() != null && user.getPlayer() != null) { for (Player owner : user.getGame().getPlayers()) { if (owner.getArmy() != null) { CardInstance card = owner.getArmy().getCard(cardId); if (card != null) { UnknownTypeMarkerInstance markerInfo = (UnknownTypeMarkerInstance)card.getMarkerByType(markerTypeId); String markerId = null; if (stackable && markerInfo != null) { markerId = markerInfo.getId(); markerInfo.setNumber(markerInfo.getNumber() + number); } else { markerId = IdGenerator.getInstance().getNewMarkerId(); markerInfo = new UnknownTypeMarkerInstance(markerId, markerTypeId, hiddenMarkerTypeId, number); card.addMarker(markerInfo); } MarkerPlacedMessage resultMessageForEmitter = new MarkerPlacedMessage(owner.getId(), cardId, markerId, markerTypeId, hiddenMarkerTypeId, number); ServerNetwork.getInstance().sendMessageToUser(resultMessageForEmitter, userId); // Hide the hiddenMarkerTypeId for others players MarkerPlacedMessage resultMessageForOthers = new MarkerPlacedMessage(owner.getId(), cardId, markerId, markerTypeId, null, number); ServerNetwork.getInstance().sendMessageToGameExceptUser(resultMessageForOthers, user.getGame().getId(), userId); return; } } } } } } @Subscribe public void onRemoveMarker(RemoveMarkerMessage message) { String userId = message.getSessionUserId(); String cardId = message.getCardId(); String markerId = message.getMarkerId(); int number = message.getNumber(); User user = Universe.getInstance().getUsersByIds().get(userId); if (user != null && user.getGame() != null) { Game game = user.getGame(); for (Player owner : user.getGame().getPlayers()) { if (owner.getArmy() != null) { CardInstance card = owner.getArmy().getCard(cardId); if (card != null) { UnknownTypeMarkerInstance markerInfo = (UnknownTypeMarkerInstance)card.getMarker(markerId); if (markerInfo != null) { markerInfo.setNumber(markerInfo.getNumber() - number); if (markerInfo.getNumber() <= 0) { card.getMarkers().remove(markerInfo); } MarkerRemovedMessage resultMessage = new MarkerRemovedMessage(user.getPlayerId(), cardId, markerId, number); ServerNetwork.getInstance().sendMessageToGame(resultMessage, game.getId()); return; } } } } } } @Subscribe public void onRevealMarker(RevealMarkerMessage message) { String userId = message.getSessionUserId(); String cardId = message.getCardId(); String markerId = message.getMarkerId(); User user = Universe.getInstance().getUsersByIds().get(userId); if (user != null && user.getGame() != null && user.getPlayer() != null) { Game game = user.getGame(); for (Player owner : user.getGame().getPlayers()) { if (owner.getArmy() != null) { CardInstance card = owner.getArmy().getCard(cardId); if (card != null) { UnknownTypeMarkerInstance markerInfo = (UnknownTypeMarkerInstance)card.getMarker(markerId); if (markerInfo != null) { if (markerInfo.getHiddenMarkerTypeId() != null) { String hiddenMarkerTypeId = markerInfo.getHiddenMarkerTypeId(); markerInfo.setMarkerDefinitionId(hiddenMarkerTypeId); markerInfo.setHiddenMarkerTypeId(null); MarkerRevealedMessage resultMessage = new MarkerRevealedMessage(user.getPlayerId(), cardId, markerId, hiddenMarkerTypeId); ServerNetwork.getInstance().sendMessageToGame(resultMessage, game.getId()); return; } } } } } } } }