diff --git a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java index 50374941eaa..9ecd38a37e7 100644 --- a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java +++ b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java @@ -881,9 +881,9 @@ public class ComputerPlayer> extends PlayerImpl i } @Override - public UUID chooseBlockerOrder(Cards blockers, Game game) { + public UUID chooseBlockerOrder(List blockers, Game game) { //TODO: improve this - return blockers.iterator().next(); + return blockers.iterator().next().getId(); } @Override diff --git a/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java b/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java index ef7d60621ca..2c2d1efc6eb 100644 --- a/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java +++ b/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java @@ -459,14 +459,14 @@ public class HumanPlayer extends PlayerImpl { } @Override - public UUID chooseBlockerOrder(Cards blockers, Game game) { + public UUID chooseBlockerOrder(List blockers, Game game) { while (!abort) { game.fireSelectTargetEvent(playerId, "Pick blocker", blockers, true); waitForResponse(); if (response.getUUID() != null) { - for (Card card: blockers.getCards(game)) { - if (card.getId().equals(response.getUUID())) - return card.getId(); + for (Permanent perm: blockers) { + if (perm.getId().equals(response.getUUID())) + return perm.getId(); } } } diff --git a/Mage.Server/plugins/mage-player-ai.jar b/Mage.Server/plugins/mage-player-ai.jar index 1a451360d7f..fb9826add21 100644 Binary files a/Mage.Server/plugins/mage-player-ai.jar and b/Mage.Server/plugins/mage-player-ai.jar differ diff --git a/Mage.Server/plugins/mage-player-human.jar b/Mage.Server/plugins/mage-player-human.jar index 9dd67a86378..f4adf9b3704 100644 Binary files a/Mage.Server/plugins/mage-player-human.jar and b/Mage.Server/plugins/mage-player-human.jar differ diff --git a/Mage.Server/src/main/java/mage/server/game/GameController.java b/Mage.Server/src/main/java/mage/server/game/GameController.java index dcbd414069e..b83e52fb4b7 100644 --- a/Mage.Server/src/main/java/mage/server/game/GameController.java +++ b/Mage.Server/src/main/java/mage/server/game/GameController.java @@ -61,6 +61,7 @@ import mage.game.GameException; import mage.game.events.Listener; import mage.game.events.PlayerQueryEvent; import mage.game.events.TableEvent; +import mage.game.permanent.Permanent; import mage.players.Player; import mage.server.ChatManager; import mage.server.util.ThreadExecutor; @@ -138,7 +139,7 @@ public class GameController implements GameCallback { ask(event.getPlayerId(), event.getMessage()); break; case PICK_TARGET: - target(event.getPlayerId(), event.getMessage(), event.getCards(), event.getTargets(), event.isRequired(), event.getOptions()); + target(event.getPlayerId(), event.getMessage(), event.getCards(), event.getPerms(), event.getTargets(), event.isRequired(), event.getOptions()); break; case PICK_ABILITY: target(event.getPlayerId(), event.getMessage(), event.getAbilities(), event.isRequired(), event.getOptions()); @@ -356,10 +357,17 @@ public class GameController implements GameCallback { informOthers(playerId); } - private synchronized void target(UUID playerId, String question, Cards cards, Set targets, boolean required, Map options) throws MageException { + private synchronized void target(UUID playerId, String question, Cards cards, List perms, Set targets, boolean required, Map options) throws MageException { if (gameSessions.containsKey(playerId)) { if (cards != null) gameSessions.get(playerId).target(question, new CardsView(cards.getCards(game)), targets, required, getGameView(playerId), options); + else if (perms != null) { + CardsView permsView = new CardsView(); + for (Permanent perm: perms) { + permsView.put(perm.getId(), new PermanentView(perm, game.getCard(perm.getId()))); + } + gameSessions.get(playerId).target(question, permsView, targets, required, getGameView(playerId), options); + } else gameSessions.get(playerId).target(question, new CardsView(), targets, required, getGameView(playerId), options); } diff --git a/Mage/src/mage/game/Game.java b/Mage/src/mage/game/Game.java index ed35457bc4d..01be8de434f 100644 --- a/Mage/src/mage/game/Game.java +++ b/Mage/src/mage/game/Game.java @@ -121,6 +121,7 @@ public interface Game extends MageItem, Serializable { public void fireSelectTargetEvent(UUID playerId, String message, Set targets, boolean required, Map options); public void fireSelectTargetEvent(UUID playerId, String message, Cards cards, boolean required); public void fireSelectTargetEvent(UUID playerId, String message, TriggeredAbilities abilities, boolean required); + public void fireSelectTargetEvent(UUID playerId, String message, List perms, boolean required); public void fireSelectEvent(UUID playerId, String message); public void fireLookAtCardsEvent(UUID playerId, String message, Cards cards); public void firePriorityEvent(UUID playerId); diff --git a/Mage/src/mage/game/GameImpl.java b/Mage/src/mage/game/GameImpl.java index ee3fb259b12..2f72153a357 100644 --- a/Mage/src/mage/game/GameImpl.java +++ b/Mage/src/mage/game/GameImpl.java @@ -800,10 +800,10 @@ public abstract class GameImpl> implements Game, Serializa playerQueryEventSource.target(playerId, message, abilities, required); } -// @Override -// public void fireRevealCardsEvent(String message, Cards cards) { -// tableEventSource.fireTableEvent(EventType.REVEAL, message, cards, this); -// } + @Override + public void fireSelectTargetEvent(UUID playerId, String message, List perms, boolean required) { + playerQueryEventSource.target(playerId, message, perms, required); + } @Override public void fireLookAtCardsEvent(UUID playerId, String message, Cards cards) { diff --git a/Mage/src/mage/game/combat/CombatGroup.java b/Mage/src/mage/game/combat/CombatGroup.java index 954ec6c4e47..178d08cd295 100644 --- a/Mage/src/mage/game/combat/CombatGroup.java +++ b/Mage/src/mage/game/combat/CombatGroup.java @@ -300,11 +300,11 @@ public class CombatGroup implements Serializable, Copyable { break; } else { - Cards blockerCards = new CardsImpl(); + List blockerPerms = new ArrayList(); for (UUID blockerId: blockerList) { - blockerCards.add(game.getCard(blockerId)); + blockerPerms.add(game.getPermanent(blockerId)); } - UUID blockerId = player.chooseBlockerOrder(blockerCards, game); + UUID blockerId = player.chooseBlockerOrder(blockerPerms, game); blockerOrder.add(blockerId); blockerList.remove(blockerId); } diff --git a/Mage/src/mage/game/events/PlayerQueryEvent.java b/Mage/src/mage/game/events/PlayerQueryEvent.java index 406d005a738..a06615f7dbe 100644 --- a/Mage/src/mage/game/events/PlayerQueryEvent.java +++ b/Mage/src/mage/game/events/PlayerQueryEvent.java @@ -37,6 +37,7 @@ import mage.abilities.TriggeredAbilities; import mage.cards.Card; import mage.cards.Cards; import mage.cards.decks.Deck; +import mage.game.permanent.Permanent; /** * @@ -50,6 +51,7 @@ public class PlayerQueryEvent extends EventObject implements ExternalEvent, Seri private String message; private Collection abilities; + private List perms; private Set choices; private Set targets; private Cards cards; @@ -99,6 +101,15 @@ public class PlayerQueryEvent extends EventObject implements ExternalEvent, Seri this.max = time; } + private PlayerQueryEvent(UUID playerId, String message, QueryType queryType, List perms, boolean required) { + super(playerId); + this.queryType = queryType; + this.message = message; + this.playerId = playerId; + this.perms = perms; + this.required = required; + } + public static PlayerQueryEvent askEvent(UUID playerId, String message) { return new PlayerQueryEvent(playerId, message, null, null, null, null, QueryType.ASK, 0, 0, false); } @@ -126,6 +137,10 @@ public class PlayerQueryEvent extends EventObject implements ExternalEvent, Seri return new PlayerQueryEvent(playerId, message, abilities, null, null, null, QueryType.PICK_ABILITY, 0, 0, required); } + public static PlayerQueryEvent targetEvent(UUID playerId, String message, List perms, boolean required) { + return new PlayerQueryEvent(playerId, message, QueryType.PICK_TARGET, perms, required); + } + public static PlayerQueryEvent selectEvent(UUID playerId, String message) { return new PlayerQueryEvent(playerId, message, null, null, null, null, QueryType.SELECT, 0, 0, false); } @@ -187,6 +202,10 @@ public class PlayerQueryEvent extends EventObject implements ExternalEvent, Seri return cards; } + public List getPerms() { + return perms; + } + public List getBooster() { return booster; } diff --git a/Mage/src/mage/game/events/PlayerQueryEventSource.java b/Mage/src/mage/game/events/PlayerQueryEventSource.java index 61e0e0f0b63..9301f140147 100644 --- a/Mage/src/mage/game/events/PlayerQueryEventSource.java +++ b/Mage/src/mage/game/events/PlayerQueryEventSource.java @@ -36,6 +36,7 @@ import mage.abilities.TriggeredAbilities; import mage.cards.Card; import mage.cards.Cards; import mage.cards.decks.Deck; +import mage.game.permanent.Permanent; /** * @@ -82,6 +83,10 @@ public class PlayerQueryEventSource implements EventSource, Se dispatcher.fireEvent(PlayerQueryEvent.targetEvent(playerId, message, abilities, required)); } + public void target(UUID playerId, String message, List perms, boolean required) { + dispatcher.fireEvent(PlayerQueryEvent.targetEvent(playerId, message, perms, required)); + } + public void playMana(UUID playerId, String message) { dispatcher.fireEvent(PlayerQueryEvent.playManaEvent(playerId, message)); } diff --git a/Mage/src/mage/players/Player.java b/Mage/src/mage/players/Player.java index 160630a609d..625a6fdb3d2 100644 --- a/Mage/src/mage/players/Player.java +++ b/Mage/src/mage/players/Player.java @@ -158,7 +158,7 @@ public interface Player extends MageItem, Copyable { public abstract TriggeredAbility chooseTriggeredAbility(TriggeredAbilities abilities, Game game); public abstract void selectAttackers(Game game); public abstract void selectBlockers(Game game); - public abstract UUID chooseBlockerOrder(Cards blockers, Game game); + public abstract UUID chooseBlockerOrder(List blockers, Game game); public abstract void assignDamage(int damage, List targets, UUID sourceId, Game game); public abstract int getAmount(int min, int max, String message, Game game); public abstract void sideboard(Match match, Deck deck);