/** * Handle a "setBuildQueue"-message. * * @param server The <code>FreeColServer</code> handling the message. * @param player The <code>Player</code> the message applies to. * @param connection The <code>Connection</code> message was received on. * @return An update containing the new queue or an error <code>Element</code> on failure. */ public Element handle(FreeColServer server, Player player, Connection connection) { ServerPlayer serverPlayer = server.getPlayer(connection); Game game = server.getGame(); Specification spec = game.getSpecification(); Colony colony; try { colony = player.getOurFreeColGameObject(colonyId, Colony.class); } catch (Exception e) { return DOMMessage.clientError(e.getMessage()); } if (queue == null) { return DOMMessage.clientError("Empty queue"); } List<BuildableType> buildQueue = new ArrayList<BuildableType>(); for (int i = 0; i < queue.length; i++) { try { buildQueue.add(i, spec.getType(queue[i], BuildableType.class)); } catch (Exception cce) { return DOMMessage.clientError("Not a buildable type: " + queue[i]); } } // Proceed to set the build queue. return server.getInGameController().setBuildQueue(serverPlayer, colony, buildQueue); }
/** * Handle a "buildColony"-message. * * @param server The <code>FreeColServer</code> handling the request. * @param player The <code>Player</code> building the colony. * @param connection The <code>Connection</code> the message is from. * @return An update <code>Element</code> defining the new colony and updating its surrounding * tiles, or an error <code>Element</code> on failure. */ public Element handle(FreeColServer server, Player player, Connection connection) { Game game = server.getGame(); ServerPlayer serverPlayer = server.getPlayer(connection); Unit unit; try { unit = player.getFreeColGameObject(builderId, Unit.class); } catch (Exception e) { return DOMMessage.clientError(e.getMessage()); } if (!unit.canBuildColony()) { return DOMMessage.clientError("Unit " + builderId + " can not build colony."); } if (colonyName == null) { return DOMMessage.clientError("Null colony name"); } else if (Player.ASSIGN_SETTLEMENT_NAME.equals(colonyName)) {; // ok } else if (game.getSettlement(colonyName) != null) { return DOMMessage.clientError("Non-unique colony name " + colonyName); } Tile tile = unit.getTile(); if (!player.canClaimToFoundSettlement(tile)) { return DOMMessage.clientError("Can not build colony on tile: " + tile); } // Build can proceed. return server.getInGameController().buildSettlement(serverPlayer, unit, colonyName); }
/** * Handle a "deliverGift"-message. * * @param server The <code>FreeColServer</code> handling the message. * @param player The <code>Player</code> the message applies to. * @param connection The <code>Connection</code> message was received on. * @return An update containing the unit and settlement, or an error <code>Element</code> on * failure. */ public Element handle(FreeColServer server, Player player, Connection connection) { ServerPlayer serverPlayer = server.getPlayer(connection); Unit unit; try { unit = player.getFreeColGameObject(unitId, Unit.class); } catch (Exception e) { return DOMMessage.clientError(e.getMessage()); } Settlement settlement; try { settlement = unit.getAdjacentSettlementSafely(settlementId); } catch (Exception e) { return DOMMessage.clientError(e.getMessage()); } // Make sure we are trying to deliver something that is there if (goods.getLocation() != unit) { return DOMMessage.createError("server.trade.noGoods", "deliverGift of non-existent goods"); } // Proceed to deliver. return server .getInGameController() .deliverGiftToSettlement(serverPlayer, unit, settlement, goods); }
/** * Handle a "attack"-message. * * @param server The <code>FreeColServer</code> handling the message. * @param player The <code>Player</code> the message applies to. * @param connection The <code>Connection</code> message was received on. * @return An update encapsulating the attack or an error <code>Element</code> on failure. */ public Element handle(FreeColServer server, Player player, Connection connection) { ServerPlayer serverPlayer = server.getPlayer(connection); Unit unit; try { unit = serverPlayer.getOurFreeColGameObject(unitId, Unit.class); } catch (Exception e) { return DOMMessage.clientError(e.getMessage()); } Tile tile; try { tile = unit.getNeighbourTile(directionString); } catch (Exception e) { return DOMMessage.clientError(e.getMessage()); } MoveType moveType = unit.getMoveType(tile); if (moveType == MoveType.ENTER_INDIAN_SETTLEMENT_WITH_SCOUT || moveType == MoveType.ENTER_FOREIGN_COLONY_WITH_SCOUT || moveType.isAttack()) {; // OK } else { return DOMMessage.clientError( "Illegal attack move for: " + unitId + " type: " + moveType + " from: " + unit.getLocation().getId() + " to: " + tile.getId()); } Unit defender = tile.getDefendingUnit(unit); if (defender == null) { return DOMMessage.clientError( "Could not find defender" + " in tile: " + tile.getId() + " from: " + unit.getLocation().getId()); } // Proceed to attack. return server.getInGameController().combat(serverPlayer, unit, defender, null); }
/** * Create a new <code>DeliverGiftMessage</code> from a supplied element. * * @param game The <code>Game</code> this message belongs to. * @param element The <code>Element</code> to use to create the message. */ public DeliverGiftMessage(Game game, Element element) { this.unitId = element.getAttribute("unit"); this.settlementId = element.getAttribute("settlement"); this.goods = new Goods(game, DOMMessage.getChildElement(element, Goods.getXMLElementTagName())); }