@Override protected String execute(Player player, Map<String, Object> params, Session session) throws Exception { long lastUpdate = (Long) params.get("update"); Ally ally = player.getAlly(); if (ally == null) throw new IllegalOperationException("Vous n'appartanez à aucune alliance."); Player kicked = DataAccess.getPlayerById((Integer) params.get("id")); if (kicked == null) throw new IllegalOperationException("Ce joueur n'existe pas"); if (kicked.getIdAlly() != player.getIdAlly()) throw new IllegalOperationException("Ce joueur ne fait pas partie de votre alliance."); if (player.getAllyRank() < ally.getRequiredRank(Ally.RIGHT_KICK, kicked.getAllyRank())) throw new IllegalOperationException( "Vous n'avez pas les droits nécessaires pour éjecter ce membre."); List<Player> members = ally.getMembers(); // Quitte les canaux de discussion de l'alliance ChatManager.getInstance().leaveAllyChannels(kicked); synchronized (kicked.getLock()) { kicked = DataAccess.getEditable(kicked); kicked.setAllyRank(0); kicked.setIdAlly(0); kicked.setLastAllyIn(Utilities.now()); kicked.save(); } // Vérifie les liens entre flottes des membres de l'alliance synchronized (members) { for (Player member : members) FleetTools.checkLinks(member); } // TODO bmoyet Event : Ajoutez un événement pour le kick // DataAccess.save(new Event()); // Met à jour l'influence de l'alliance ally.updateInfluences(); // Mise à jour des secteurs consultés pour les joueurs de l'alliance, // afin que le membre éjecté soit pris en compte, au besoin UpdateTools.queueAreaUpdate(ally.getMembers()); UpdateTools.queueAllyUpdate(kicked.getId(), 0, false); UpdateTools.queueChatChannelsUpdate(kicked.getId(), false); UpdateTools.queueAreaUpdate(kicked); return UpdateTools.formatUpdates( player, Update.getAllyUpdate(lastUpdate), Update.getAreaUpdate()); }
@Override protected String execute(Player player, Map<String, Object> params, Session session) throws Exception { // Flotte qui construit la balise Fleet fleet = FleetTools.getFleetByIdWithChecks((Integer) params.get("fleet"), player.getId()); String password = (String) params.get("password"); // Vérifie que la flotte a du mouvement if (fleet.getMovement() == 0) throw new IllegalOperationException("La flotte n'a pas " + "suffisament de mouvement."); // Cherche la station spatiale construite sur la case de la flotte List<SpaceStation> spaceStations = DataAccess.getSpaceStationsByArea(fleet.getIdCurrentArea()); int fleetX = fleet.getCurrentX(); int fleetY = fleet.getCurrentY(); synchronized (spaceStations) { for (SpaceStation spaceStation : spaceStations) { int dx = spaceStation.getX() - fleetX; int dy = spaceStation.getY() - fleetY; double radius = GameConstants.SPACE_STATION_RADIUS; if (dx * dx + dy * dy <= radius * radius) { String treaty = Treaty.NEUTRAL; if (player.getIdAlly() != 0) treaty = spaceStation.getAlly().getTreatyWithAlly(player.getIdAlly()); if (treaty.equals(Treaty.ENEMY) || (treaty.equals(Treaty.ALLY) && player.getAllyRank() >= player.getAlly().getRequiredRank(Ally.RIGHT_MANAGE_STATIONS)) || (treaty.equals(Treaty.NEUTRAL) && fleet.getSkillLevel(Skill.SKILL_PIRATE) >= 0)) { boolean newEvent = false; List<Update> updates = new ArrayList<Update>(); // Endommage ou détruit la station if (treaty.equals(Treaty.ALLY) || spaceStation.getHull() <= fleet.getPowerLevel()) { if (treaty.equals(Treaty.ALLY) && (password == null || !player.getPassword().equals(Utilities.encryptPassword(password)))) throw new IllegalOperationException("Mot de passe invalide."); spaceStation.delete(); spaceStation.getArea().getSector().updateInfluences(); newEvent = true; if (treaty.equals(Treaty.ALLY)) { Event event = new Event( Event.EVENT_STATION_SELF_DESTRUCT, Event.TARGET_ALLY, spaceStation.getIdAlly(), spaceStation.getIdArea(), spaceStation.getX(), spaceStation.getY(), spaceStation.getName(), String.valueOf(player.getLogin())); event.save(); } else { Event event = new Event( Event.EVENT_STATION_LOST, Event.TARGET_ALLY, spaceStation.getIdAlly(), spaceStation.getIdArea(), spaceStation.getX(), spaceStation.getY(), spaceStation.getName()); event.save(); } Effect effect = new Effect( Effect.TYPE_STATION_DESTRUCTION, fleet.getCurrentX(), fleet.getCurrentY(), fleet.getIdCurrentArea()); UpdateTools.queueEffectUpdate(effect, player.getId(), false); updates.add(Update.getEffectUpdate(effect)); } else { double coefBefore = spaceStation.getHull() / (double) SpaceStation.HULL_LEVELS[spaceStation.getLevel()]; synchronized (spaceStation.getLock()) { spaceStation = DataAccess.getEditable(spaceStation); spaceStation.setHull(spaceStation.getHull() - fleet.getPowerLevel()); spaceStation.save(); } double coefAfter = spaceStation.getHull() / (double) SpaceStation.HULL_LEVELS[spaceStation.getLevel()]; if (coefBefore != 1 && (int) (coefBefore * 5) != (int) (coefAfter * 5)) { newEvent = true; Event event = new Event( Event.EVENT_STATION_UNDER_ATTACK, Event.TARGET_ALLY, spaceStation.getIdAlly(), spaceStation.getIdArea(), spaceStation.getX(), spaceStation.getY(), spaceStation.getName(), String.valueOf(coefAfter)); event.save(); } } synchronized (fleet.getLock()) { fleet = DataAccess.getEditable(fleet); fleet.doAction( Fleet.CURRENT_ACTION_ATTACK_STRUCTURE, Utilities.now() + GameConstants.DESTROY_SPACE_STATION_MOVEMENT_RELOAD); fleet.save(); } // Mises à jour if (newEvent) UpdateTools.queueNewEventUpdate(spaceStation.getAlly().getMembers(), false); UpdateTools.queueAreaUpdate(fleet.getIdCurrentArea(), player.getId()); updates.add(Update.getPlayerFleetUpdate(fleet.getId())); updates.add(Update.getAreaUpdate()); return UpdateTools.formatUpdates(player, updates); } else { throw new IllegalOperationException( "Vous ne pouvez pas saboter cette station spatiale."); } } } } throw new IllegalOperationException("Pas de station spatiale à cet endroit."); }