From c30481277014b3dd99b71d4992b426c0ba90b290 Mon Sep 17 00:00:00 2001 From: magenoxx Date: Wed, 18 Jul 2012 13:57:54 +0400 Subject: [PATCH] Debug logging for Issue#19 --- Mage.Server.Plugins/Mage.Player.Human/pom.xml | 6 ++ .../src/mage/player/human/HumanPlayer.java | 68 +++++++++++------- Mage.Server/plugins/mage-player-human.jar | Bin 13680 -> 14358 bytes .../java/mage/server/game/GameController.java | 4 ++ .../src/main/resources/log4j.properties | 3 + 5 files changed, 55 insertions(+), 26 deletions(-) diff --git a/Mage.Server.Plugins/Mage.Player.Human/pom.xml b/Mage.Server.Plugins/Mage.Player.Human/pom.xml index 6ce52bf0b5..e49dba6464 100644 --- a/Mage.Server.Plugins/Mage.Player.Human/pom.xml +++ b/Mage.Server.Plugins/Mage.Player.Human/pom.xml @@ -20,6 +20,12 @@ mage ${project.version} + + log4j + log4j + 1.2.14 + provided + 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 f318a84dc5..637d85ae62 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 @@ -61,11 +61,11 @@ import mage.target.TargetPermanent; import mage.target.common.TargetAttackingCreature; import mage.target.common.TargetCreatureOrPlayer; import mage.target.common.TargetDefender; +import org.apache.log4j.Logger; import java.io.Serializable; import java.util.*; - /** * * @author BetaSteward_at_googlemail.com @@ -80,6 +80,8 @@ public class HumanPlayer extends PlayerImpl { protected static Choice replacementEffectChoice = new ChoiceImpl(true); private static Map staticOptions = new HashMap(); + private static final Logger log = Logger.getLogger(HumanPlayer.class); + static { filter.add(new ControllerPredicate(TargetController.YOU)); replacementEffectChoice.setMessage("Choose replacement effect"); @@ -97,10 +99,14 @@ public class HumanPlayer extends PlayerImpl { protected void waitForResponse() { response.clear(); + log.debug("Waiting response from player: " + getId()); synchronized(response) { try { response.wait(); - } catch (InterruptedException ex) { } + log.debug("Got response from player: " + getId()); + } catch (InterruptedException ex) { + ex.printStackTrace(); + } } } @@ -130,7 +136,7 @@ public class HumanPlayer extends PlayerImpl { @Override public boolean chooseMulligan(Game game) { - game.getState().setPriorityPlayerId(getId()); + updateGameStatePriority("chooseMulligan", game); game.fireAskPlayerEvent(playerId, "Do you want to take a mulligan?"); waitForBooleanResponse(); if (!abort) @@ -140,7 +146,7 @@ public class HumanPlayer extends PlayerImpl { @Override public boolean chooseUse(Outcome outcome, String message, Game game) { - game.getState().setPriorityPlayerId(getId()); + updateGameStatePriority("chooseUse", game); game.fireAskPlayerEvent(playerId, message); waitForBooleanResponse(); if (!abort) @@ -150,7 +156,7 @@ public class HumanPlayer extends PlayerImpl { @Override public int chooseEffect(List rEffects, Game game) { - game.getState().setPriorityPlayerId(getId()); + updateGameStatePriority("chooseEffect", game); replacementEffectChoice.getChoices().clear(); int count = 1; for (ReplacementEffect effect: rEffects) { @@ -178,7 +184,7 @@ public class HumanPlayer extends PlayerImpl { @Override public boolean choose(Outcome outcome, Choice choice, Game game) { - game.getState().setPriorityPlayerId(getId()); + updateGameStatePriority("choose(3)", game); while (!abort) { game.fireChooseEvent(playerId, choice); waitForResponse(); @@ -199,7 +205,7 @@ public class HumanPlayer extends PlayerImpl { @Override public boolean choose(Outcome outcome, Target target, UUID sourceId, Game game, Map options) { - game.getState().setPriorityPlayerId(getId()); + updateGameStatePriority("choose(5)", game); while (!abort) { Set cards = target.possibleTargets(null, playerId, game); game.fireSelectTargetEvent(playerId, target.getMessage(), cards, target.isRequired(), options); @@ -235,7 +241,7 @@ public class HumanPlayer extends PlayerImpl { @Override public boolean chooseTarget(Outcome outcome, Target target, Ability source, Game game) { - game.getState().setPriorityPlayerId(getId()); + updateGameStatePriority("chooseTarget", game); while (!abort) { Set possibleTargets = target.possibleTargets(source==null?null:source.getId(), playerId, game); boolean required = possibleTargets.size() == 0 ? false : target.isRequired(); @@ -275,7 +281,7 @@ public class HumanPlayer extends PlayerImpl { @Override public boolean choose(Outcome outcome, Cards cards, TargetCard target, Game game) { - game.getState().setPriorityPlayerId(getId()); + updateGameStatePriority("choose(4)", game); while (!abort) { boolean required = target.isRequired(); // if there is no cards to select from, then add possibility to cancel choosing action @@ -316,7 +322,7 @@ public class HumanPlayer extends PlayerImpl { @Override public boolean chooseTarget(Outcome outcome, Cards cards, TargetCard target, Ability source, Game game) { - game.getState().setPriorityPlayerId(getId()); + updateGameStatePriority("chooseTarget(5)", game); while (!abort) { boolean required = target.isRequired(); // if there is no cards to select from, then add possibility to cancel choosing action @@ -349,7 +355,7 @@ public class HumanPlayer extends PlayerImpl { @Override public boolean chooseTargetAmount(Outcome outcome, TargetAmount target, Ability source, Game game) { - game.getState().setPriorityPlayerId(getId()); + updateGameStatePriority("chooseTargetAmount", game); while (!abort) { game.fireSelectTargetEvent(playerId, target.getMessage() + "\n Amount remaining:" + target.getAmountRemaining(), target.possibleTargets(source==null?null:source.getId(), playerId, game), target.isRequired(), null); waitForResponse(); @@ -379,7 +385,7 @@ public class HumanPlayer extends PlayerImpl { pass(); return false; } - game.getState().setPriorityPlayerId(playerId); + updateGameStatePriority("priority", game); game.firePriorityEvent(playerId); waitForResponse(); if (response.getBoolean() != null) { @@ -414,7 +420,7 @@ public class HumanPlayer extends PlayerImpl { @Override public TriggeredAbility chooseTriggeredAbility(List abilities, Game game) { - game.getState().setPriorityPlayerId(getId()); + updateGameStatePriority("chooseTriggeredAbility", game); while (!abort) { game.fireSelectTargetEvent(playerId, "Pick triggered ability (goes to the stack first)", abilities); waitForResponse(); @@ -430,7 +436,7 @@ public class HumanPlayer extends PlayerImpl { @Override public boolean playMana(ManaCost unpaid, Game game) { - game.getState().setPriorityPlayerId(getId()); + updateGameStatePriority("playMana", game); game.firePlayManaEvent(playerId, "Pay " + unpaid.getText()); waitForResponse(); if (response.getBoolean() != null) { @@ -456,7 +462,7 @@ public class HumanPlayer extends PlayerImpl { @Override public boolean playXMana(VariableManaCost cost, ManaCosts costs, Game game) { - game.getState().setPriorityPlayerId(getId()); + updateGameStatePriority("playXMana", game); game.firePlayXManaEvent(playerId, "Pay {X}: {X}=" + cost.getAmount()); waitForResponse(); if (response.getBoolean() != null) { @@ -471,7 +477,7 @@ public class HumanPlayer extends PlayerImpl { } protected void playManaAbilities(Game game) { - game.getState().setPriorityPlayerId(getId()); + updateGameStatePriority("playManaAbilities", game); MageObject object = game.getObject(response.getUUID()); if (object == null) return; Map useableAbilities = null; @@ -486,7 +492,7 @@ public class HumanPlayer extends PlayerImpl { @Override public void selectAttackers(Game game) { - game.getState().setPriorityPlayerId(getId()); + updateGameStatePriority("selectAttackers", game); while (!abort) { if (passedAllTurns || passedTurn) { return; @@ -533,7 +539,7 @@ public class HumanPlayer extends PlayerImpl { @Override public void selectBlockers(Game game) { - game.getState().setPriorityPlayerId(getId()); + updateGameStatePriority("selectBlockers", game); while (!abort) { game.fireSelectEvent(playerId, "Select blockers"); waitForResponse(); @@ -562,7 +568,7 @@ public class HumanPlayer extends PlayerImpl { @Override public UUID chooseAttackerOrder(List attackers, Game game) { - game.getState().setPriorityPlayerId(getId()); + updateGameStatePriority("chooseAttackerOrder", game); while (!abort) { game.fireSelectTargetEvent(playerId, "Pick attacker", attackers, true); waitForResponse(); @@ -579,7 +585,7 @@ public class HumanPlayer extends PlayerImpl { @Override public UUID chooseBlockerOrder(List blockers, Game game) { - game.getState().setPriorityPlayerId(getId()); + updateGameStatePriority("chooseBlockerOrder", game); while (!abort) { game.fireSelectTargetEvent(playerId, "Pick blocker", blockers, true); waitForResponse(); @@ -594,7 +600,7 @@ public class HumanPlayer extends PlayerImpl { } protected void selectCombatGroup(UUID blockerId, Game game) { - game.getState().setPriorityPlayerId(getId()); + updateGameStatePriority("selectCombatGroup", game); TargetAttackingCreature target = new TargetAttackingCreature(); game.fireSelectTargetEvent(playerId, "Select attacker to block", target.possibleTargets(null, playerId, game), target.isRequired(), null); waitForResponse(); @@ -607,7 +613,7 @@ public class HumanPlayer extends PlayerImpl { @Override public void assignDamage(int damage, List targets, String singleTargetName, UUID sourceId, Game game) { - game.getState().setPriorityPlayerId(getId()); + updateGameStatePriority("assignDamage", game); int remainingDamage = damage; while (remainingDamage > 0) { Target target = new TargetCreatureOrPlayer(); @@ -633,7 +639,7 @@ public class HumanPlayer extends PlayerImpl { @Override public int getAmount(int min, int max, String message, Game game) { - game.getState().setPriorityPlayerId(getId()); + updateGameStatePriority("getAmount", game); game.fireGetAmountEvent(playerId, message, min, max); waitForIntegerResponse(); return response.getInteger(); @@ -655,6 +661,7 @@ public class HumanPlayer extends PlayerImpl { } protected void specialAction(Game game) { + updateGameStatePriority("specialAction", game); Map specialActions = game.getState().getSpecialActions().getControlledBy(playerId); game.fireGetChoiceEvent(playerId, name, specialActions.values()); waitForResponse(); @@ -665,7 +672,7 @@ public class HumanPlayer extends PlayerImpl { } protected void activateAbility(Map abilities, Game game) { - game.getState().setPriorityPlayerId(getId()); + updateGameStatePriority("activateAbility", game); if (abilities.size() == 1) { ActivatedAbility ability = abilities.values().iterator().next(); if (ability.getTargets().size() != 0 || !(ability.getCosts().size() == 1 && ability.getCosts().get(0) instanceof SacrificeSourceCost)) { @@ -683,7 +690,7 @@ public class HumanPlayer extends PlayerImpl { @Override public Mode chooseMode(Modes modes, Ability source, Game game) { - game.getState().setPriorityPlayerId(getId()); + updateGameStatePriority("chooseMode", game); if (modes.size() > 1) { MageObject obj = game.getObject(source.getSourceId()); Map modeMap = new HashMap(); @@ -708,7 +715,7 @@ public class HumanPlayer extends PlayerImpl { @Override public boolean choosePile(Outcome outcome, String message, List pile1, List pile2, Game game) { - game.getState().setPriorityPlayerId(getId()); + updateGameStatePriority("choosePile", game); game.fireChoosePileEvent(playerId, message, pile1, pile2); waitForBooleanResponse(); if (!abort) @@ -721,6 +728,7 @@ public class HumanPlayer extends PlayerImpl { synchronized(response) { response.setString(responseString); response.notify(); + log.debug("Got response string from player: " + getId()); } } @@ -729,6 +737,7 @@ public class HumanPlayer extends PlayerImpl { synchronized(response) { response.setUUID(responseUUID); response.notify(); + log.debug("Got response UUID from player: " + getId()); } } @@ -737,6 +746,7 @@ public class HumanPlayer extends PlayerImpl { synchronized(response) { response.setBoolean(responseBoolean); response.notify(); + log.debug("Got response boolean from player: " + getId()); } } @@ -745,6 +755,7 @@ public class HumanPlayer extends PlayerImpl { synchronized(response) { response.setInteger(responseInteger); response.notify(); + log.debug("Got response integer from player: " + getId()); } } @@ -753,6 +764,7 @@ public class HumanPlayer extends PlayerImpl { abort = true; synchronized(response) { response.notify(); + log.debug("Got cancel action from player: " + getId()); } } @@ -761,4 +773,8 @@ public class HumanPlayer extends PlayerImpl { return new HumanPlayer(this); } + protected void updateGameStatePriority(String methodName, Game game) { + log.debug("Setting game priority to " + getId() + " [" + methodName + "]"); + game.getState().setPriorityPlayerId(getId()); + } } diff --git a/Mage.Server/plugins/mage-player-human.jar b/Mage.Server/plugins/mage-player-human.jar index 5315b0e39a6dd0003f1272f53fcf2b9c8bcf6176..eb77c127bffce66760bd6eeca05ffdce8d4132b9 100644 GIT binary patch delta 12844 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 HpPByyWi3fZ delta 12009 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

*k>AGsK!gckUaq&Fa$!xHIU2^^)) z*Uy&3PV89H#4skyY0DJ6wSPZyGL)ZaQCIrabxV5>D&|h-!)k%er>ML#fOnv@qUkOT zFLvChi~lJ2-J}32Sx78L3&8f$?7qyt%xnbjW0@+rA=bldF{AbFN`Ew3Dt0E>?){wK zgR_EdaMU`l@i3eiX*-t3CsGA+AxBrB$q_HcBq?d^tUM>bz%^Q+h;dq<11`ddIJbck zAcM2dl3^b)@Ek0JO#Hl#F*5>}W+5o2Kjt)-{@mr5j*t8vP$?fh1W17T=?Fn+BG_va zqmZ@)&es7B=zY5J8jlr*Ltx!?5`y{Mf4Vug8tFyCnFjlOgzn$z6@1Tb{4I=)GY$TE zzcIu-2*Nr$3<#?JNj|<_2CtT+b+#@CY0A9@Dr)$}9{~7u*?`I}q#L9&=nZC} zuH-jt1nc4;$!~K~Ar$#*a?(w6#|2A^>QgC9G(8?PPYRhhwxU!Y?j7 zTY6La>Axg0U%69#N|Y{g|9x_MbTdWfw7iiK<$eR@sDqAal) ztaz^kXbeXuUVw9WO0cxN32Re)-Gx#UELuCRT3cAfiI#W5Mp@2Pp4*9%^|_%+dM9b7 z--*=v&*Sa~H`{#bQ=vD?E#=x-@SAmE^l$56!#m6!^Wu8J3wsF_WojBxdpGeR)*U#c zv7stC`MRb>vsZfVZU@oJs-_qd*o-L^5R6}_g=>t_g#beOIhB!BxwYt@*SnJltd`7* z^sCCiL7|MMRR8%{3eE5M^uud-oeRsW85A+iq3r9b2KpSa9A$X|vRL{cYzDI>;LPO` znoN}6t_qD!=_ft;9}7qF#!=7(k)ST}Tpl14K|4$4rXiMUTr@j}H81g87{m$|tJ`e- zWIgbXRsfZ_PPIqoWi8m(0un<}WO3HTsQR0ANrf(grN?~ZU~b3be{Xd3K^NZ|0ajIo z`B+-znX@@{%?-~7{$2JP2X1{Sy5m4~rZkWDQyFByJ-Z@&#|4J9x$ z{>uWD*98t=@))Ka*+QSt4^Vm4YWD{zJty`a0J@ow6e>%M$$eEA0$Ps-?Zea*m|s)M ziVm05DpJO8h^DnlKhb3>uIYj-L!8tFsgXMv_a*|I3}d2F6=eaV(2YRY@H@7o7t9Qi zS~bq@@b_I0JsBsG)oxj<1^t^Ur-8~Ic#hsMlP+of(*WPJK;@YQ;uA;;NvHXd?=PXB z0EyiFYxehmtBf%cUp)mZ^(Ohv%W>OQ`pT`ED$mY_b%%*4eRa@-CCgvmHh*zV4Rc`* zpDy_>Ci}nsv8g64NyU7-e@=8}D24*dCAHM+poAAifna)1hxoj{i#i@dVN8PO$BT=D zoquj9`oUs_2niBBRS5L>rJtrACEzI50g%fwJZRo&+{T(`81*NNvr-`LYWak~x!6U2AmiPfeJ_AsgRvJJv;0HRLO zx+*Ztb;6XE(Y$;~uZB*iUK-$x`kb>F^hfo!dBvIokC|94HZ6ER$pD`Q;sgMY)o#Aq zOs5FQa2@Li$t+kRr--3Huv-hI5g!=nm|=c2(qf7!5$FuLBHsEwZs|wZIW*pmrJD{M zkZYCRqaHEqn56Bo)HsomJnD|G09SBZuPoA(b+~o~zdUrtFbpFw#F@8mRAK%#1<56` zPbtF6?Y2#=VNv6AtTCje^fbistkA@A^m*=@yf0dXkOBCJwBtTGe3yB+@`4*SC6DFf zG~={sn&uZpYYrUJb7=Bjw>FMG`Kcd+T^QAj)pePNRVgD*Mdb7bPK$E)09Mz2sk8I7 zeWjnnV)DIRErFVpCo88Bze20nj2?=_4$cE4oX&m>zQefiOqMb~G~u|^2v4DcTZ1+X z07;MaSkuS~LYYK8J;P`uKQ*K>C3zjtF&D$#t)UC9wkPw2!nT{mbIy6jc1R_!uKbhW=sm_|#z>p4X1_LZ_{vnU{M8;|IILsgvb(BHf2w^Mf11 z>2cfqv)(*693tZf!KEGp>m5h})5u*LLAPG4^w8m`VDvh$=r=7M06j7IRR&T<;X6fK z2nDrR;!^y9xr{3v1utS^RlbiY6l3U)pyZ@jHAiM3M640R(R{Hf=oSsuyi|RfBf9(v z63*b(z64|at8q9vYs$hNY)X-jRs%;wyi6Re4`J2=D9I`jHCOV2Gk zSW=Rd4Y9WEC|Gv@fC{~vff~mm?ae`7%c)3!nkN^Y53XqDog_%GPVA{|{|%oW zWpI;HRUZ7HT!&UwfxZOHD8MPc`J3jP^X%rN$wxz&nt1dlKOGD(xWAmiV4S4AsQQlw{YWMAJ#)x(s1? z+8VYb!7sJw0o5mO8?{#?#7@Im!y=nHS0ZF#R}QUkT4#C?uy*v-w)v1XWp?A6b;OAr zo&MN_j7K^gqEOc}X*2*AA#I=p`e6HL(@fzSVBcSlj42O&D9pJWdrr=UHJg?x zzj4UIJ*SO8$`kVE-3ZHI?rgxmT-$PG{DhHWFWSm1lMCbKsmBB8&ja=PpdKvl*;Z5Z zOU%|b+!v&t39LkQ{ZB)Lu$V&qu#-O?2rdQxNY$KOR3@(*$u?LkF{2Vmr$^+wkGLpuah?)Ajnf0x3gY%oLJ?*LqdTXq8PB$hJvfk>V#oVA0XteosiUu*(NP-vyF`a2H)u^Sbh-9xloq z>)sZ{Oe-hMPre8Nkw!3|L_iGtZcoJQ-X*KuS)DQrOh397QQs^QZ|?7~95_;{0*d2z z(qS)%qIyYX#M_JBv&-ae5!Ehp^5x$6bS5jHtYvc6-5FOsBvq^eHN&av%Vt;`?Igu_2HhsG&b{i7v zz|%C0e#yxRJL{&z{E+f(o{Z`re#G%X1jDmC?5ug%R$PT+%G*@hD)%zF4y@oB^zeHe z#`&6wG{ozfI)&e6AI}m5%ofbMHaQ)@>34Q#8f)SU>U++X6#Eysxh0pn<8P@Qpq})4 zkV_mN1>!N0Rw3_-iM)+6yOq~IsMlYFp5EL1yiicLz|LUmY+u(7AEP3{XndS<)@Bob z$Ixt^t;SDSl--hR77EX>tX&ar@Q!fs<<561tn@Bjje6FA8rm=g*sMEzb(c8EFEp*u zW-K=^YNl;82X5^Jb~grmbW|Sp1-AvBMoB&uC^bZMOlLe;EsI@*`3GO zt76X94~pZ*6mYLnDqdHNGW;#eI{=})JTjQl$?{BoWXj50Se=qn?!5jD(F(vPAzy%oXg?+hLhvx5bRE}#d3;UT5Y;mp zq2Bn$YZQ0ych69ReaseIxuf`-qs_%(3vVjrb@QrzLI9Fo;pKWfarBS4m$f({Eud9M z*zv5%owW1*F%^Zm#TDAbAomi+G@7wSb!>)NT-qA5E@-r;bfj(-A1b74+QWfOb^OHeyw&tMDP!+=?JOb#S z!6w{Pjtm_GKlxbL+9#?g@{@Dwxb$+e3@vkQ1R%9O6CEt9Tpg6eC$>hvI5x~xZMuHr z3Y`XEk-lrg9xbFU>3oA;XwQj_$G0x)3X&SnRcr1_NEwfTozy?7aZb-p^OEd->B@u9 zwtIYE*D@g%4M^}~9x`B#z;=MvZ~&w_JX7y-e+2) ztoI%%Gh5$?om0P$MJMKzq;lo2*U+rkF?gkEro`x4luy#hn`rs4HO3B-$!>#r1<*ex zwf5sUm7*UI-Y|R3+uRYoq)s(yZOdbiVs$8OOFxf68(`8Fs*;8C&93i8I{_eS_6Cq# zxjxVeu>gK+F?zPb*~SstPl@$$C2O|#bUi)ceDmXsU*WoG+r;O zT_+N#UQ8H3->rYps3fe1Bmk(XF4=7*Fy59od2Lg;N0iOJ-a7ao4|$Fo6vufB6adt{ zf6kCb8M4IfkXI3 zqaGQ`J4&9=RL;0zeITH%693TAEY9_MTXfuOM=s%yL(n``UoSvFa=@PAjtBa_@;>kh z_Wgqt{e=j|pBUm32_g^#On6dkw>0ZdF?t(MdY^D~ZN6*@4?uzbQtW4VEylld zGBMPmo8kQdxDyX}boE?oJj~!zH|nNPG^@op>mjRs&ro<(KBMXlO8B7P<1^X`J@*e& zP@kui&&;bGT;UQWU;B15y(LP_$hf6MEG!}0>T{3-vDuDw#e^QTo68j}_Xn&1J9bZ* zHe~N{KcpKrr1#Yc>gyaDi7NM{l|JIUIR_=XEksBZfb!?Tq{9~a1GlT8X{cDszfsVXs4JZ|l5pi)w8!^Tr9i?1r^m{|e++Q!vgC zf7IGp6r}f2i_QgulMMkpxsi}p`0@;_y$Mr2DR~mJ38xQf|H>Udh|Y0PXM3Vo={><3 z8HD~$LWpbMF8o;f#Orb4id;hN2f%+DSYbfuH5<8^Qo+C&G=Z}$^#6tr7LI=dJF67h zAKxvJAAnAqeNYgPIYZkcqw82(0&`_`tsz)5c?y;^ zzNHSWZoh?X+U|_9o^j*!2g(=WilAff(6-z`PoYb5LcKXzT?jHNfJ+T8Jrl4rv zpjm9QAtn4Tt061v9Nc4F+*Y4mujs!b!0x=vQ@HIn*Fapzy>GM!D)y9T3sffgXONj)bsY^oR-v&L$(l~8w7ikwY785lMtC;w`j>J+XTZhO$g6LFb@oVB#)JV6b%LFmDi*=BLYsO^ zs3O$yd7%>9COL-xd`>?nGo`#|a^2m4tH^_bVSxX)ZTn8-?|*=R04q3{{$Kkx@Q{P^ zpCOxolK{K-FT=sa%7XcS=l;c%ISD}bf%csE|A>))CkVh2PEwNp*S`${LjIo;{}qaY z1VDj?pp-xaE`)zscw7Wv9rQpRuK!5JkqZyv>r0&p_>+t9pM)y^Gyl%?S2TD?|GW5K z?Djuc%Rh{Vp$rK E01SBnEC2ui 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 6eeb189cb2..4255417aed 100644 --- a/Mage.Server/src/main/java/mage/server/game/GameController.java +++ b/Mage.Server/src/main/java/mage/server/game/GameController.java @@ -612,6 +612,10 @@ public class GameController implements GameCallback { if (!found) { // something wrong - it may cause game freezes logger.warn("WARNING! GameController.sendMessage - couldn't find session for action execution. Player: " + player.getName()); + // log additional information + logger.warn(" action player: " + player.getName() + ", id: " + player.getId()); + Player priorityPlayer = game.getPlayer(game.getPriorityPlayerId()); + logger.warn(" priority player: " + priorityPlayer.getName() + ", id: " + priorityPlayer.getId()); } } } else { diff --git a/Mage.Server/src/main/resources/log4j.properties b/Mage.Server/src/main/resources/log4j.properties index d149a431e6..acee86f663 100644 --- a/Mage.Server/src/main/resources/log4j.properties +++ b/Mage.Server/src/main/resources/log4j.properties @@ -1,6 +1,9 @@ #default levels log4j.rootLogger=info, console, logfile +#log4j.logger.mage.player.human=DEBUG, console, logfile +#log4j.additivity.mage.player.human=false + #console log log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.layout=org.apache.log4j.PatternLayout