package fr.lyrgard.hexScape.listener;
import java.util.concurrent.Callable;
import com.google.common.eventbus.Subscribe;
import fr.lyrgard.hexScape.HexScapeCore;
import fr.lyrgard.hexScape.bus.CoreMessageBus;
import fr.lyrgard.hexScape.bus.GuiMessageBus;
import fr.lyrgard.hexScape.message.ErrorMessage;
import fr.lyrgard.hexScape.message.PieceMovedMessage;
import fr.lyrgard.hexScape.message.PiecePlacedMessage;
import fr.lyrgard.hexScape.message.PieceRemovedMessage;
import fr.lyrgard.hexScape.message.PieceSelectedMessage;
import fr.lyrgard.hexScape.message.PieceUnselectedMessage;
import fr.lyrgard.hexScape.message.PlacePieceMessage;
import fr.lyrgard.hexScape.model.CurrentUserInfo;
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.map.Direction;
import fr.lyrgard.hexScape.model.piece.PieceInstance;
import fr.lyrgard.hexScape.model.player.Player;
import fr.lyrgard.hexScape.service.MapManager;
import fr.lyrgard.hexScape.service.PieceManager;
import fr.lyrgard.hexscape.client.network.ClientNetwork;
public class PieceMessageListener extends AbstractMessageListener {
private static PieceMessageListener INSTANCE = new PieceMessageListener();
public static void start() {
CoreMessageBus.register(INSTANCE);
}
private PieceMessageListener() {
}
@Subscribe public void onPlacePieceMessage(PlacePieceMessage message) {
final String playerId = message.getPlayerId();
final String pieceModelId = message.getPieceModelId();
final String cardInstanceId = message.getCardInstanceId();
String gameId = CurrentUserInfo.getInstance().getGameId();
Game game = Universe.getInstance().getGamesByGameIds().get(gameId);
if (game == null) {
CoreMessageBus.post(new ErrorMessage(playerId, "Unable to find game " + gameId));
return;
}
for (Player player : game.getPlayers()) {
if (player != null && player.getArmy() != null) {
final CardInstance card = player.getArmy().getCard(cardInstanceId);
if (card != null) {
HexScapeCore.getInstance().getHexScapeJme3Application().enqueue(new Callable<Void>() {
public Void call() throws Exception {
String pieceId = IdGenerator.getInstance().getNewPieceId();
PieceInstance piece = new PieceInstance(pieceId, pieceModelId, card);
HexScapeCore.getInstance().getMapManager().beginPlacingPiece(new PieceManager(piece));
card.addPiece(piece);
return null;
}
});
}
}
}
}
@Subscribe public void onPiecePlaced(PiecePlacedMessage message) {
final String playerId = message.getPlayerId();
final String pieceModelId = message.getModelId();
final String pieceId = message.getPieceId();
final String cardInstanceId = message.getCardInstanceId();
final int x = message.getX();
final int y = message.getY();
final int z = message.getZ();
final Direction direction = message.getDirection();
if (playerId.equals(CurrentUserInfo.getInstance().getPlayerId())) {
// coming from ourself, advertise the placement
if (HexScapeCore.getInstance().isOnline()) {
ClientNetwork.getInstance().send(message);
}
} else {
// coming from another player, place the piece
String gameId = CurrentUserInfo.getInstance().getGameId();
Game game = Universe.getInstance().getGamesByGameIds().get(gameId);
if (game == null) {
CoreMessageBus.post(new ErrorMessage(playerId, "Unable to find game " + gameId));
return;
}
CardInstance cardInstance = game.getCard(cardInstanceId);
if (cardInstance != null) {
PieceInstance piece = new PieceInstance(pieceId, pieceModelId, cardInstance);
piece.setDirection(direction);
final PieceManager pieceManager = new PieceManager(piece);
pieceManager.rotate(direction);
cardInstance.addPiece(piece);
HexScapeCore.getInstance().getHexScapeJme3Application().enqueue(new Callable<Void>() {
@Override
public Void call() throws Exception {
HexScapeCore.getInstance().getMapManager().placePiece(pieceManager, x, y, z, direction);
pieceManager.select(playerId);
return null;
}
});
}
}
GuiMessageBus.post(message);
}
@Subscribe public void onPieceMoved(PieceMovedMessage message) {
final String playerId = message.getPlayerId();
final String pieceId = message.getPieceId();
final int x = message.getX();
final int y = message.getY();
final int z = message.getZ();
final Direction direction = message.getDirection();
if (playerId.equals(CurrentUserInfo.getInstance().getPlayerId())) {
// coming from ourself, advertise the placement
if (HexScapeCore.getInstance().isOnline()) {
ClientNetwork.getInstance().send(message);
}
} else {
// coming from another player, place the piece
final MapManager mapManager = HexScapeCore.getInstance().getMapManager();
if (mapManager != null) {
final PieceManager pieceManager = mapManager.getPieceManagersByPieceIds().get(pieceId);
if (pieceManager != null) {
HexScapeCore.getInstance().getHexScapeJme3Application().enqueue(new Callable<Void>() {
@Override
public Void call() throws Exception {
mapManager.placePiece(pieceManager, x, y, z, direction);
return null;
}
});
}
}
}
GuiMessageBus.post(message);
}
@Subscribe public void onPieceRemoved(final PieceRemovedMessage message) {
final String playerId = message.getPlayerId();
final String pieceId = message.getPieceId();
if (playerId.equals(CurrentUserInfo.getInstance().getPlayerId())) {
// coming from ourself, advertise the removing
if (HexScapeCore.getInstance().isOnline()) {
ClientNetwork.getInstance().send(message);
}
GuiMessageBus.post(message);
} else {
// coming from another player, delete the piece
final MapManager mapManager = HexScapeCore.getInstance().getMapManager();
if (mapManager != null) {
final PieceManager pieceManager = mapManager.getPieceManagersByPieceIds().get(pieceId);
if (pieceManager != null) {
HexScapeCore.getInstance().getHexScapeJme3Application().enqueue(new Callable<Void>() {
@Override
public Void call() throws Exception {
mapManager.removePiece(pieceManager);
GuiMessageBus.post(message);
return null;
}
});
}
}
}
}
@Subscribe public void onPieceSelected(PieceSelectedMessage message) {
final String playerId = message.getPlayerId();
final String pieceId = message.getPieceId();
if (playerId.equals(CurrentUserInfo.getInstance().getPlayerId())) {
// coming from ourself, advertise the placement
if (HexScapeCore.getInstance().isOnline()) {
ClientNetwork.getInstance().send(message);
}
} else {
// coming from another player, delete the piece
MapManager mapManager = HexScapeCore.getInstance().getMapManager();
if (mapManager != null) {
final PieceManager pieceManager = mapManager.getPieceManagersByPieceIds().get(pieceId);
if (pieceManager != null) {
HexScapeCore.getInstance().getHexScapeJme3Application().enqueue(new Callable<Void>() {
@Override
public Void call() throws Exception {
pieceManager.select(playerId);
return null;
}
});
}
}
}
GuiMessageBus.post(message);
}
@Subscribe public void onPieceUnselected(PieceUnselectedMessage message) {
final String playerId = message.getPlayerId();
final String pieceId = message.getPieceId();
if (playerId.equals(CurrentUserInfo.getInstance().getPlayerId())) {
// coming from ourself, advertise the placement
if (HexScapeCore.getInstance().isOnline()) {
ClientNetwork.getInstance().send(message);
}
} else {
// coming from another player, delete the piece
MapManager mapManager = HexScapeCore.getInstance().getMapManager();
if (mapManager != null) {
final PieceManager pieceManager = mapManager.getPieceManagersByPieceIds().get(pieceId);
if (pieceManager != null) {
HexScapeCore.getInstance().getHexScapeJme3Application().enqueue(new Callable<Void>() {
@Override
public Void call() throws Exception {
pieceManager.unselect(playerId);
return null;
}
});
}
}
}
GuiMessageBus.post(message);
}
}