diff --git a/src/main/java/forge/FThreads.java b/src/main/java/forge/FThreads.java index 0576a25ece8..deabc24c83a 100644 --- a/src/main/java/forge/FThreads.java +++ b/src/main/java/forge/FThreads.java @@ -106,8 +106,17 @@ public class FThreads { public static void invokeInNewThread(final Runnable proc, boolean lockUI) { Runnable toRun = proc; final InputQueue iq = Singletons.getControl().getMatch().getInput(); + //final GameState game = Singletons.getControl().getMatch().getCurrentGame(); + //final InputQueue iq = game.getMatch().getInput(); if( lockUI ) { - // checkEDT("FThreads.invokeInNewthread", true) + +// StackTraceElement[] trace = Thread.currentThread().getStackTrace(); +// System.out.printf("%s > Invoke in new thread during %s called from %s%n", FThreads.isEDT() ? "EDT" : "TRD", game.getPhaseHandler().getPhase(), trace[2].toString()); +// if( trace[2].toString().contains("InputBase.stop")) +// for(StackTraceElement se : trace) { +// System.out.println(se.toString()); +// } + iq.lock(); toRun = new Runnable() { @Override diff --git a/src/main/java/forge/card/spellability/HumanPlaySpellAbility.java b/src/main/java/forge/card/spellability/HumanPlaySpellAbility.java index a22a1e48295..95cd86d8608 100644 --- a/src/main/java/forge/card/spellability/HumanPlaySpellAbility.java +++ b/src/main/java/forge/card/spellability/HumanPlaySpellAbility.java @@ -63,6 +63,7 @@ public class HumanPlaySpellAbility { // freeze Stack. No abilities should go onto the stack while I'm filling requirements. game.getStack().freezeStack(); + game.getMatch().getInput().lock(); // Announce things like how many times you want to Multikick or the value of X if (!this.announceRequirements()) { @@ -88,6 +89,7 @@ public class HumanPlaySpellAbility { } beingTargeted = beingTargeted.getSubAbility(); } while (beingTargeted != null); + } // Payment @@ -101,19 +103,21 @@ public class HumanPlaySpellAbility { rollbackAbility(fromZone, zonePosition); return; } + else { + game.getMatch().getInput().unlock(); + if (isFree || this.payment.isFullyPaid()) { + if (skipStack) { + AbilityUtils.resolve(this.ability, false); + } else { + this.enusureAbilityHasDescription(this.ability); + this.ability.getActivatingPlayer().getManaPool().clearManaPaid(this.ability, false); + game.getStack().addAndUnfreeze(this.ability); + } - else if (isFree || this.payment.isFullyPaid()) { - if (skipStack) { - AbilityUtils.resolve(this.ability, false); - } else { - this.enusureAbilityHasDescription(this.ability); - this.ability.getActivatingPlayer().getManaPool().clearManaPaid(this.ability, false); - game.getStack().addAndUnfreeze(this.ability); + // no worries here. The same thread must resolve, and by this moment ability will have been resolved already + clearTargets(ability); + game.getAction().checkStateEffects(); } - - // no worries here. The same thread must resolve, and by this moment ability will have been resolved already - clearTargets(ability); - game.getAction().checkStateEffects(); } } @@ -145,6 +149,7 @@ public class HumanPlaySpellAbility { this.ability.resetOnceResolved(); this.payment.refundPayment(); game.getStack().clearFrozen(); + game.getMatch().getInput().unlock(); // Singletons.getModel().getGame().getStack().removeFromFrozenStack(this.ability); } diff --git a/src/main/java/forge/game/zone/MagicStack.java b/src/main/java/forge/game/zone/MagicStack.java index 0df46b808a2..92db2192206 100644 --- a/src/main/java/forge/game/zone/MagicStack.java +++ b/src/main/java/forge/game/zone/MagicStack.java @@ -936,8 +936,9 @@ public class MagicStack extends MyObservable implements Iterable activePlayerSAs = new ArrayList(); + final List activePlayerSAs = new ArrayList(); for (int i = 0; i < this.getSimultaneousStackEntryList().size(); i++) { SpellAbility sa = this.getSimultaneousStackEntryList().get(i); Player activator = sa.getActivatingPlayer();