From 79dbfca2ffad991d3f25e6d89d2a52bd4b2bac7b Mon Sep 17 00:00:00 2001 From: BetaSteward Date: Mon, 17 May 2010 03:19:39 +0000 Subject: [PATCH] changes to support multiplayer --- Mage.Server/config/config.xml | 9 ++--- Mage.Server/nbproject/project.properties | 7 ++-- Mage.Server/nbproject/project.xml | 8 +++++ Mage.Server/plugins/Mage.Game.FreeForAll.jar | Bin 0 -> 4525 bytes .../plugins/Mage.Game.TwoPlayerDuel.jar | Bin 2641 -> 3663 bytes Mage.Server/plugins/Mage.Player.AI.jar | Bin 53154 -> 53183 bytes Mage.Server/plugins/Mage.Player.Human.jar | Bin 17843 -> 18066 bytes Mage.Server/src/mage/server/Main.java | 19 ++++++++-- Mage.Server/src/mage/server/ServerImpl.java | 24 +++++++++---- .../src/mage/server/game/GameFactory.java | 33 ++++++++++++------ .../src/mage/server/game/GamesRoom.java | 7 ++-- .../src/mage/server/game/GamesRoomImpl.java | 9 ++--- .../src/mage/server/game/PlayerFactory.java | 7 ++-- .../src/mage/server/game/TableController.java | 22 +++++++++--- .../src/mage/server/game/TableManager.java | 12 +++++-- .../src/mage/server/util/ConfigSettings.java | 9 ++--- .../src/mage/server/util/resources/config.xml | 11 +++--- .../xml-resources/jaxb/Config/Config.xsd | 26 ++++++++------ 18 files changed, 144 insertions(+), 59 deletions(-) create mode 100644 Mage.Server/plugins/Mage.Game.FreeForAll.jar diff --git a/Mage.Server/config/config.xml b/Mage.Server/config/config.xml index 6d52fdb1ced..8514f0a0b7d 100644 --- a/Mage.Server/config/config.xml +++ b/Mage.Server/config/config.xml @@ -3,13 +3,14 @@ - - + + - + + - + diff --git a/Mage.Server/nbproject/project.properties b/Mage.Server/nbproject/project.properties index c0fae92fc55..5fb1ef044d2 100644 --- a/Mage.Server/nbproject/project.properties +++ b/Mage.Server/nbproject/project.properties @@ -26,7 +26,8 @@ jar.compress=false javac.classpath=\ ${reference.Mage.jar}:\ ${reference.Mage_Common.jar}:\ - ${reference.Mage_Sets.jar} + ${reference.Mage_Sets.jar}:\ + ${reference.Mage_Player_AI.jar} # Space-separated list of extra javac options javac.compilerargs= javac.deprecation=false @@ -59,9 +60,11 @@ platform.active=default_platform project.license=bsd project.Mage=../Mage project.Mage_Common=../Mage.Common +project.Mage_Player_AI=../Mage.Player.AI project.Mage_Sets=../Mage.Sets reference.Mage.jar=${project.Mage}/dist/Mage.jar reference.Mage_Common.jar=${project.Mage_Common}/dist/Mage.Common.jar +reference.Mage_Player_AI.jar=${project.Mage_Player_AI}/dist/Mage.Player.AI.jar reference.Mage_Sets.jar=${project.Mage_Sets}/dist/Mage.Sets.jar run-sys-prop.java.endorsed.dirs=${jaxbwiz.endorsed.dirs} run.classpath=\ @@ -74,4 +77,4 @@ run.test.classpath=\ source.encoding=UTF-8 src.dir=src test.src.dir=test -app.version=0.2 +app.version=0.3 diff --git a/Mage.Server/nbproject/project.xml b/Mage.Server/nbproject/project.xml index 820483a2e49..85a76cd19b5 100644 --- a/Mage.Server/nbproject/project.xml +++ b/Mage.Server/nbproject/project.xml @@ -33,6 +33,14 @@ clean jar + + Mage_Player_AI + jar + + jar + clean + jar + Mage_Sets jar diff --git a/Mage.Server/plugins/Mage.Game.FreeForAll.jar b/Mage.Server/plugins/Mage.Game.FreeForAll.jar new file mode 100644 index 0000000000000000000000000000000000000000..12b0257bce54708852d01b2d3a0275feb8bbd1f1 GIT binary patch literal 4525 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 literal 2641 zcmai0U2_vv7=AV%-DbNjrD@BTNJNx=C7~2S+5(2QfwV~*O(}w(r|FU|rkk+Y6nm$? zKyUR*W^}yaLT4P9s^fUgl`~%Z6Z`|th(2d`n=cD)CgqPS_qDC6RV#AL5FXB)yXHsV)zsDD0jCcZv76&oqk ztys=1+LhW)%`vuWv5Zwrj8eNSYPEP?IGfY4vbmnjiIS1HE9_paS8ICQ8C;kiZ&5S( zY!#UmSEVGjI`yJQ9~}Qi1?2yDo8IdEO1><14Eq{UiK2Aw$LJ+mf|b2c|$IwR9w{%!9_Wl(=d;P9;9)t2iK92&7z8>9`qyIgB+GstfCWFT89it?JUO*!|4A!pO9DL9gC z2HY0NjDnt$;mDX)cdBF=92w2t726_N7FH=)aBR~mQK^?owB}`ig!Cn&K&3RxLQtSr znVWfA+%GsrRY7#bBdI%PIeFtoW`1V$wt_xUbj)qTBgt$i= z)7h7hx#*Tw4O>#_bY-PltyqTT(7%)ab)dyo)~q=Us>_2b81mBNO>0TdK`I2yQ_M&U zFyk1ua4I&}B9*4K);N6b;r88NZvB8xw$Mr4*_OGRsmn7e-c<1xO%%+MC7im=1fTog zfc7C$pcN{0yJ)0Mw?f*so@Z%W=orEQ-WVs&yE+ z!>DzXa8tpdXA~=IytyJvHnUYNv#gq)NGGV(6zpvnGrn1xq!gzd1jy_jVI zwXn!-V09Sx>Y~hA8uC-`o`{w8yGGG*%QpGesWg7=~ttI;k{Gq?#EuxgsPjOwrqUNr0~S@2!eUXchd;}pqXp=JnyXqaQ3Hs4&@H>XK%l{UMZN%q+15yk?)F6kC_t--Ew z10=hGQH+sG?%D6`<>zwoCq!;NhL$63&m-u&=vA;B-$kE-FA(S8fP!DqKOH&}+QmTy z<8GJ-C;aIy1_HSG?LWUw$ejzh5f6LJ=*AK)W^sXEwCh-LeLKgsQEvS>Ca68c+KD6K zW@xeD@1pN-H?AUyGxT(l+_HQ;$yrKdrVb$ZH-=P9sW_MXi^A6^4B$K!FSw)E^Gix# zF!=175ViR9j}6 rf?R)jUYhU2PF&|r#xo_I9cjb0e-qq$O@1ldCDp_HO;Nc!B4_^s$-yIU diff --git a/Mage.Server/plugins/Mage.Player.AI.jar b/Mage.Server/plugins/Mage.Player.AI.jar index b39acf58bd49715c08da9bc2437859d8a5b131dc..dd2678c0f3b0407bc0feee740542370af5f87d53 100644 GIT binary patch delta 17750 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 aIQK}ZTKSxrqQ=%*&J9PB<3a~z&Ho2Ob5VBy delta 17573 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 wMB#5-g6Ntj206au0KUKk`K2*II>u~wyE3Bo}X zt%`~`)QTFlT3aiMh1xn+TSuz4)>aEtYaJNm{cGRka^tH{zK?zO*?X_`ui;#gRqCWJ5%lXRG@J5zKvRflORKV63zx-m0|SvXT?vjdnD#9UOXlJDutyad^R`61L` zK@baZmd+L>aCUYG=ippDSF5j!byyO@|DaCSmNo~m49j(xq=PeHMF{6%rM^znp+10B z3egZmBUXoSKGx{4)AD8ItQWagVSeFGrw9D}W zUA{t>e;7pb<+xHUyh`JHbqE_UIDjAN=0;uFq_b;+_%SxCiWU!Bg0c|TCdh->sw>-c z@B`Sc&+9zw2+Cr$;(C2f*2Nn<>l&JDL4eO0MyD5O5aJv~dE5t1!+=^W~yDfy< z!?Qb7dUp_aVvlaz6~x`RCy0CTQ_aYI8pEII#{D{5sl#3m52(G2JUs5<7ZCAxdOz&u;g^u)*|iPJ>SivT+_1EMU0uVHI>_{5A353n=s+lU z+N#=Rb^R+F8`d_}HZ-lx|K{Ox|I*PT{3`j?bDAJug}4){Ab9`uiP&4=%ojm?X*a;@z0D^lkb{MO=k_&wk8ypI zThoOnO;?lZ=ceb!r{PtPv7VZq*PL!LJd(E0(@;5mM=`^eM;+#w7uOF$y zD9>bBlTCD!ZhBgi!(%3wAvV3#&^(jxnF3OLPF;Q7lBS&6rl#5@E9=&*wWg3K@u4ZQ zrr4Btrqr6=rjM1s%ReCg;q=1NzSi`UN31*}`>pA320)V9v@EV~3@ed;%V&^M|44eK zZ&OnIWf@uV1NCHyTe>5obMqi3*$l>~w7cDgRgLQ!nk)ifsD>D}@%JqRcr0y z74<8cR@ANS@4su4^O+el)icwqnU1d3%+T=6M20o9(8HQDkqgQ4-!)nORhbn9o|)aQ z=G%+j-;bbppaf2tE)AT_jF9EFOcp0l(tBm#PT_)w0EDr{-MIb zHP`X2o5XXRBA!%AXBjW)GEw@-R2eAKWCwRj!!mNc+`uN$s;FQD#f3%#lo)%dc^@)1F58Olr7IZg-mU+i>pSS~rP3B^hEo z+3m@l0#Eixl_z%{BTlRqX`5fO`BZz-N*|Tv(uXDXQAs%$U4q(nZ1Y z97IezL@u{~E{}0bxv4qSESZ@5IL3(DAMX@gNq~tWIpOUHf|1AN7w&*@dW}3mk#Jgd z@0Z;Bl`51cIs3Id#c{hI>Rq17}2obf*z_k_~$ppu40e zYbT#PFJPzZPu2`3Z$?q+crsun(>_-ol(Xa^GNqL%epogzmDe$iJDIPWn6do~{Ob(& zTMY0~hWAr>3i0v`y2yTH%5Ni%+$5JRm>mmf1Y*z0t5Ua{d!5p@XQQ( zg~9!U%$Gk#Y!X@24$s*u+*Oh;VsKw|!Ce#;T#tqv7v9AouTg~yue`%BYFRC0qlvrG zzo7rZC>!2lpL?5zzr&t(h=lqx6a6kb-+SynA2=I^P`HAX_$Nj%R*I#cydiHAhYBNh zEo5Zhc6Kdv))*I#L`t5JB2V5aJtoF*{}A;nsb>wCyGTi$O>~iuSmPf{q5M+@$YJ*A zBg8u@XUHcGKU_wY5v)qu_nyP5jKU(F2PJa#eff(+z`&(T6`@cPIDXDz{DKVnlGcAE z<#LSdIWASSZibv>e?Jw4R2@O8mcKFv8tv*RBocU3d?G`^3xM1m|pCuu;UT!!0vWnAUSrlF>n&e9cE=a z@4_qXybGmD>I>vfP;C*T$YvLrUati4n*hK^}#XmO6ka()df;v_9UolKsGUR~7Hbcs7b z+fT?K4{;|MH4pJ$O0Eg#mPG`;`fAj9_(G~t9%W_5vX!O!Zx8P=PwDM$OIXIjTP~fk zB8qWY5qq-`Y%@0tAyCWjU7Pzxeh3);w&B9mGA&k?KLdAGt=5O&@%xrW~fiPb-cxT;=$NT#VxjsA!c zO;J3%P=dIK{JKO&;!<*JJsZqr%xyE9%N0>}G)C-bWLJL9rKquuXYF=SyS#-I?r9R@ z#S|WA=H2B3{9d68Ta=5rpHz|ISB)$_N8=o>@T*x=8zc!ok~D0T9Bgvf;g+G7h47s_ zmkmzu+^U}!;#2&f$LOsXX>Au{cP9qYk)cR_r;2X=2OV%)h_i(_*AizdakhO6PNu7+ z|AW)5BTjeph~QjZ9_`N#;#^Oh8;G-$I5&O^P8OTzfAObhN1Pnww&9G6irFp1xRn^Y zh;bV+ZvPgHUda1z82KGAc=6liFz&AykgG(J1F{uQ$hNVW{4MJVd1!1Ve`b6F&+)mC&*U%1 zW_I}Hv$bhdmw5Lp=cdXs{SDNAwsMSn_o@cC=g6wz?%7l|D)K9+|9I8Z#Ew6I`klvD r=ID~$5jXTDmc9Njq-pK{cK=|)Xn$)}sy}0FC;$5KY4HoHbnAZs8w4t> delta 5287 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 Xhxtouvi playerTypes) throws MageException { + public TableView createTable(UUID sessionId, UUID roomId, String gameType, String deckType, List playerTypes, MultiplayerAttackOption attackOption, RangeOfInfluence range) throws MageException { try { - TableView table = GamesRoomManager.getInstance().getRoom(roomId).createTable(sessionId, gameType, deckType, playerTypes); + TableView table = GamesRoomManager.getInstance().getRoom(roomId).createTable(sessionId, gameType, deckType, playerTypes, attackOption, range); logger.info("Table " + table.getTableId() + " created"); return table; } @@ -139,7 +141,7 @@ public class ServerImpl extends RemoteServer implements Server { } @Override - public Collection getTables(UUID roomId) throws MageException { + public List getTables(UUID roomId) throws MageException { try { return GamesRoomManager.getInstance().getRoom(roomId).getTables(); } @@ -244,6 +246,16 @@ public class ServerImpl extends RemoteServer implements Server { return false; } + @Override + public void swapSeats(UUID sessionId, UUID roomId, UUID tableId, int seatNum1, int seatNum2) throws RemoteException, MageException { + try { + TableManager.getInstance().swapSeats(tableId, sessionId, seatNum1, seatNum2); + } + catch (Exception ex) { + handleException(ex); + } + } + @Override public void leaveTable(UUID sessionId, UUID roomId, UUID tableId) throws MageException { try { @@ -419,9 +431,9 @@ public class ServerImpl extends RemoteServer implements Server { } @Override - public String[] getGameTypes() throws MageException { + public List getGameTypes() throws MageException { try { - return GameFactory.getInstance().getGameTypes().toArray(new String[0]); + return GameFactory.getInstance().getGameTypes(); } catch (Exception ex) { handleException(ex); diff --git a/Mage.Server/src/mage/server/game/GameFactory.java b/Mage.Server/src/mage/server/game/GameFactory.java index 4326928702d..6af3d534bd4 100644 --- a/Mage.Server/src/mage/server/game/GameFactory.java +++ b/Mage.Server/src/mage/server/game/GameFactory.java @@ -29,14 +29,19 @@ package mage.server.game; import java.lang.reflect.Constructor; +import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; +import java.util.List; import java.util.Map; -import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; +import mage.Constants.MultiplayerAttackOption; +import mage.Constants.RangeOfInfluence; import mage.game.Game; -import mage.server.Main; import mage.util.Logging; +import mage.game.GameType; +import mage.view.GameTypeView; /** * @@ -47,7 +52,10 @@ public class GameFactory { private final static GameFactory INSTANCE = new GameFactory(); private final static Logger logger = Logging.getLogger(GameFactory.class.getName()); - private Map gameTypes = new HashMap(); + private Map> games = new HashMap>(); + private Map gameTypes = new HashMap(); + private List gameTypeViews = new ArrayList(); + public static GameFactory getInstance() { return INSTANCE; @@ -55,13 +63,13 @@ public class GameFactory { private GameFactory() {} - public Game createGame(String gameType) { + public Game createGame(String gameType, MultiplayerAttackOption attackOption, RangeOfInfluence range) { Game game; - Constructor con; + Constructor con; try { - con = gameTypes.get(gameType).getConstructor(new Class[]{}); - game = (Game)con.newInstance(new Object[] {}); + con = games.get(gameType).getConstructor(new Class[]{MultiplayerAttackOption.class, RangeOfInfluence.class}); + game = con.newInstance(new Object[] {attackOption, range}); } catch (Exception ex) { logger.log(Level.SEVERE, null, ex); return null; @@ -71,13 +79,16 @@ public class GameFactory { return game; } - public Set getGameTypes() { - return gameTypes.keySet(); + public List getGameTypes() { + return gameTypeViews; } - public void addGameType(String name, Class gameType) { - if (gameType != null) + public void addGameType(String name, GameType gameType, Class game) { + if (game != null) { + this.games.put(name, game); this.gameTypes.put(name, gameType); + this.gameTypeViews.add(new GameTypeView(gameType)); + } } } diff --git a/Mage.Server/src/mage/server/game/GamesRoom.java b/Mage.Server/src/mage/server/game/GamesRoom.java index cdf6887cfa6..d7022b0d034 100644 --- a/Mage.Server/src/mage/server/game/GamesRoom.java +++ b/Mage.Server/src/mage/server/game/GamesRoom.java @@ -28,9 +28,10 @@ package mage.server.game; -import java.util.Collection; import java.util.List; import java.util.UUID; +import mage.Constants.MultiplayerAttackOption; +import mage.Constants.RangeOfInfluence; import mage.cards.decks.DeckCardLists; import mage.game.GameException; import mage.view.TableView; @@ -41,9 +42,9 @@ import mage.view.TableView; */ public interface GamesRoom extends Room { - public Collection getTables(); + public List getTables(); public boolean joinTable(UUID sessionId, UUID tableId, int seatNum, String name, DeckCardLists deckList) throws GameException; - public TableView createTable(UUID sessionId, String gameType, String deckType, List playerTypes); + public TableView createTable(UUID sessionId, String gameType, String deckType, List playerTypes, MultiplayerAttackOption attackOption, RangeOfInfluence range); public void removeTable(UUID sessionId, UUID tableId); public TableView getTable(UUID tableId); public void leaveTable(UUID sessionId, UUID tableId); diff --git a/Mage.Server/src/mage/server/game/GamesRoomImpl.java b/Mage.Server/src/mage/server/game/GamesRoomImpl.java index 2e1660b2778..ad87a33b98d 100644 --- a/Mage.Server/src/mage/server/game/GamesRoomImpl.java +++ b/Mage.Server/src/mage/server/game/GamesRoomImpl.java @@ -31,11 +31,12 @@ package mage.server.game; import mage.game.Table; import java.io.Serializable; import java.util.ArrayList; -import java.util.Collection; import java.util.List; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Logger; +import mage.Constants.MultiplayerAttackOption; +import mage.Constants.RangeOfInfluence; import mage.cards.decks.DeckCardLists; import mage.game.GameException; import mage.util.Logging; @@ -52,7 +53,7 @@ public class GamesRoomImpl extends RoomImpl implements GamesRoom, Serializable { private ConcurrentHashMap tables = new ConcurrentHashMap(); @Override - public Collection getTables() { + public List getTables() { ArrayList tableList = new ArrayList(); for (Table table: tables.values()) { tableList.add(new TableView(table)); @@ -70,8 +71,8 @@ public class GamesRoomImpl extends RoomImpl implements GamesRoom, Serializable { } @Override - public TableView createTable(UUID sessionId, String gameType, String deckType, List playerTypes) { - Table table = TableManager.getInstance().createTable(sessionId, gameType, deckType, playerTypes); + public TableView createTable(UUID sessionId, String gameType, String deckType, List playerTypes, MultiplayerAttackOption attackOption, RangeOfInfluence range) { + Table table = TableManager.getInstance().createTable(sessionId, gameType, deckType, playerTypes, attackOption, range); tables.put(table.getId(), table); return new TableView(table); } diff --git a/Mage.Server/src/mage/server/game/PlayerFactory.java b/Mage.Server/src/mage/server/game/PlayerFactory.java index 8c21882dbb8..15dcbef50c7 100644 --- a/Mage.Server/src/mage/server/game/PlayerFactory.java +++ b/Mage.Server/src/mage/server/game/PlayerFactory.java @@ -34,6 +34,7 @@ import java.util.Map; import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; +import mage.Constants.RangeOfInfluence; import mage.cards.decks.Deck; import mage.players.Player; import mage.util.Logging; @@ -55,12 +56,12 @@ public class PlayerFactory { private PlayerFactory() {} - public Player createPlayer(String playerType, String name, Deck deck) { + public Player createPlayer(String playerType, String name, Deck deck, RangeOfInfluence range) { Player player; Constructor con; try { - con = playerTypes.get(playerType).getConstructor(new Class[]{String.class, Deck.class}); - player = (Player)con.newInstance(new Object[] {name, deck}); + con = playerTypes.get(playerType).getConstructor(new Class[]{String.class, Deck.class, RangeOfInfluence.class}); + player = (Player)con.newInstance(new Object[] {name, deck, range}); } catch (Exception ex) { logger.log(Level.SEVERE, null, ex); return null; diff --git a/Mage.Server/src/mage/server/game/TableController.java b/Mage.Server/src/mage/server/game/TableController.java index dafec435a28..efd1ad37b02 100644 --- a/Mage.Server/src/mage/server/game/TableController.java +++ b/Mage.Server/src/mage/server/game/TableController.java @@ -47,6 +47,8 @@ import java.util.logging.Level; import java.util.logging.Logger; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; +import mage.Constants.MultiplayerAttackOption; +import mage.Constants.RangeOfInfluence; import mage.Constants.TableState; import mage.cards.decks.Deck; import mage.cards.decks.DeckCardLists; @@ -76,10 +78,10 @@ public class TableController { private Game game; private ConcurrentHashMap sessionPlayerMap = new ConcurrentHashMap(); - public TableController(UUID sessionId, String gameType, String deckType, List playerTypes) { + public TableController(UUID sessionId, String gameType, String deckType, List playerTypes, MultiplayerAttackOption attackOption, RangeOfInfluence range) { this.sessionId = sessionId; chatId = ChatManager.getInstance().createChatSession(); - game = GameFactory.getInstance().createGame(gameType); + game = GameFactory.getInstance().createGame(gameType, attackOption, range); gameId = game.getId(); table = new Table(gameType, DeckValidatorFactory.getInstance().createDeckValidator(deckType), playerTypes); } @@ -134,9 +136,8 @@ public class TableController { } private Player createPlayer(String name, Deck deck, String playerType) { - Player player = PlayerFactory.getInstance().createPlayer(playerType, name, deck); + Player player = PlayerFactory.getInstance().createPlayer(playerType, name, deck, game.getRangeOfInfluence()); logger.info("Player created " + player.getId()); -// player.setDeck(deck); return player; } @@ -167,6 +168,19 @@ public class TableController { game = null; } + public void swapSeats(int seatNum1, int seatNum2) { + if (table.getState() == TableState.STARTING) { + if (seatNum1 >= 0 && seatNum2 >= 0 && seatNum1 < table.getSeats().length && seatNum2 < table.getSeats().length) { + Player swapPlayer = table.getSeats()[seatNum1].getPlayer(); + String swapType = table.getSeats()[seatNum1].getPlayerType(); + table.getSeats()[seatNum1].setPlayer(table.getSeats()[seatNum2].getPlayer()); + table.getSeats()[seatNum1].setPlayerType(table.getSeats()[seatNum2].getPlayerType()); + table.getSeats()[seatNum2].setPlayer(swapPlayer); + table.getSeats()[seatNum2].setPlayerType(swapType); + } + } + } + private void saveGame() { try { //use buffering diff --git a/Mage.Server/src/mage/server/game/TableManager.java b/Mage.Server/src/mage/server/game/TableManager.java index a993482cc1f..effb5d9ebba 100644 --- a/Mage.Server/src/mage/server/game/TableManager.java +++ b/Mage.Server/src/mage/server/game/TableManager.java @@ -34,6 +34,8 @@ import java.util.List; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Logger; +import mage.Constants.MultiplayerAttackOption; +import mage.Constants.RangeOfInfluence; import mage.cards.decks.DeckCardLists; import mage.game.GameException; import mage.util.Logging; @@ -54,8 +56,8 @@ public class TableManager { return INSTANCE; } - public Table createTable(UUID sessionId, String gameType, String deckType, List playerTypes) { - TableController tableController = new TableController(sessionId, gameType, deckType, playerTypes); + public Table createTable(UUID sessionId, String gameType, String deckType, List playerTypes, MultiplayerAttackOption attackOption, RangeOfInfluence range) { + TableController tableController = new TableController(sessionId, gameType, deckType, playerTypes, attackOption, range); controllers.put(tableController.getTable().getId(), tableController); tables.put(tableController.getTable().getId(), tableController.getTable()); return tableController.getTable(); @@ -117,4 +119,10 @@ public class TableManager { public GameReplay createReplay(UUID tableId) { return controllers.get(tableId).createReplay(); } + + public void swapSeats(UUID tableId, UUID sessionId, int seatNum1, int seatNum2) { + if (isTableOwner(tableId, sessionId)) { + controllers.get(tableId).swapSeats(seatNum1, seatNum2); + } + } } diff --git a/Mage.Server/src/mage/server/util/ConfigSettings.java b/Mage.Server/src/mage/server/util/ConfigSettings.java index c5c1e098de1..d0aba9c981c 100644 --- a/Mage.Server/src/mage/server/util/ConfigSettings.java +++ b/Mage.Server/src/mage/server/util/ConfigSettings.java @@ -37,6 +37,7 @@ import javax.xml.bind.JAXBException; import javax.xml.bind.Unmarshaller; import mage.server.util.config.Config; import mage.server.util.config.Plugin; +import mage.server.util.config.GamePlugin; import mage.util.Logging; /** * @@ -84,15 +85,15 @@ public class ConfigSettings { } public List getPlayerTypes() { - return config.getPlayerTypes().getPlugin(); + return config.getPlayerTypes().getPlayerType(); } - public List getGameTypes() { - return config.getGameTypes().getPlugin(); + public List getGameTypes() { + return config.getGameTypes().getGameType(); } public List getDeckTypes() { - return config.getDeckTypes().getPlugin(); + return config.getDeckTypes().getDeckType(); } } diff --git a/Mage.Server/src/mage/server/util/resources/config.xml b/Mage.Server/src/mage/server/util/resources/config.xml index 5b6dbf522bb..7f2a10247f7 100644 --- a/Mage.Server/src/mage/server/util/resources/config.xml +++ b/Mage.Server/src/mage/server/util/resources/config.xml @@ -1,12 +1,15 @@ - + - - + + - + + + + diff --git a/Mage.Server/xml-resources/jaxb/Config/Config.xsd b/Mage.Server/xml-resources/jaxb/Config/Config.xsd index 20c7319deaf..142e7f1a74a 100644 --- a/Mage.Server/xml-resources/jaxb/Config/Config.xsd +++ b/Mage.Server/xml-resources/jaxb/Config/Config.xsd @@ -23,18 +23,24 @@ - - - - - - - + + + + + + + + + + + + + - + @@ -42,7 +48,7 @@ - + @@ -50,7 +56,7 @@ - +