From 10c3a40677ab3ac002a6e3dac313507a381b94d6 Mon Sep 17 00:00:00 2001 From: Marc Baloup Date: Sat, 28 Feb 2015 05:15:04 -0500 Subject: [PATCH] =?UTF-8?q?R=C3=A9organisation=20du=20code=20du=20gestionn?= =?UTF-8?q?aire=20de=20cubo=20+=20remplacement=20de=20/cubo=20donner=20par?= =?UTF-8?q?=20/cubo=20vendre=20et=20/cubo=20acheter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- make_jar.jardesc | 2 +- resources/plugin.yml | 2 +- .../commands/AbstractCommandExecutor.java | 9 + .../pandacraftutils/commands/CommandCubo.java | 1267 ++++++++++------- .../protection/SurvivalCuboManager.java | 302 +++- 5 files changed, 1029 insertions(+), 553 deletions(-) diff --git a/make_jar.jardesc b/make_jar.jardesc index 217a928..91fbdfa 100644 --- a/make_jar.jardesc +++ b/make_jar.jardesc @@ -1,6 +1,6 @@ - + diff --git a/resources/plugin.yml b/resources/plugin.yml index 0c2d291..51ecf1e 100644 --- a/resources/plugin.yml +++ b/resources/plugin.yml @@ -1,6 +1,6 @@ name: PandacraftUtils main: net.mc_pandacraft.java.plugin.pandacraftutils.PandacraftUtils -version: 3.13 +version: 3.14 diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/AbstractCommandExecutor.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/AbstractCommandExecutor.java index b317bce..69797ec 100644 --- a/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/AbstractCommandExecutor.java +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/AbstractCommandExecutor.java @@ -33,4 +33,13 @@ import net.mc_pandacraft.java.plugin.pandacraftutils.PandacraftUtils; String[] args); + + + public boolean isValidPlayerName(String name) { + return name.matches("[0-9a-zA-Z_]{2,16}"); + } + + + + } diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandCubo.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandCubo.java index 8d77e39..07135cc 100644 --- a/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandCubo.java +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandCubo.java @@ -3,30 +3,20 @@ package net.mc_pandacraft.java.plugin.pandacraftutils.commands; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; -import java.util.Random; -import java.util.Set; -import net.mc_pandacraft.java.plugin.pandacraftutils.config.ConfigManager; +import net.mc_pandacraft.java.plugin.pandacraftutils.modules.protection.SurvivalCuboManager.Cubo; +import net.mc_pandacraft.java.plugin.pandacraftutils.modules.protection.SurvivalCuboManager.StatsAchatCubo; import net.mc_pandacraft.java.plugin.pandacraftutils.plugin_interface.EssentialsInterface; import net.mc_pandacraft.java.plugin.pandacraftutils.plugin_interface.WorldEditInterface; -import net.mc_pandacraft.java.plugin.pandacraftutils.plugin_interface.WorldGuardInterface; import net.mc_pandacraft.java.util.StringUtil; import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.bukkit.util.Vector; -import com.sk89q.worldedit.Vector; -import com.sk89q.worldedit.bukkit.WorldEditPlugin; import com.sk89q.worldedit.bukkit.selections.CuboidSelection; -import com.sk89q.worldedit.bukkit.selections.Selection; -import com.sk89q.worldguard.bukkit.WorldGuardPlugin; -import com.sk89q.worldguard.domains.DefaultDomain; -import com.sk89q.worldguard.protection.UnsupportedIntersectionException; -import com.sk89q.worldguard.protection.databases.ProtectionDatabaseException; -import com.sk89q.worldguard.protection.regions.ProtectedCuboidRegion; -import com.sk89q.worldguard.protection.regions.ProtectedRegion; public class CommandCubo extends AbstractCommandExecutor { @@ -41,8 +31,6 @@ public class CommandCubo extends AbstractCommandExecutor { public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - WorldGuardPlugin wgPlugin = WorldGuardInterface.getPlugin(); - if (args.length == 0 || !(sender instanceof Player)) { showHelp(sender); @@ -53,13 +41,36 @@ public class CommandCubo extends AbstractCommandExecutor { Player player = (Player) sender; // on vérifie que le joueur se trouve bien dans un monde dans lequel on peut cubo - if (!ConfigManager.getInstance().defaultConfig.cubos_worlds.contains(player.getWorld().getName())) + if (!plugin.survivalCuboManager.isInCuboWorld(player.getWorld())) { player.sendMessage(ChatColor.RED+"Les cubos ne se font pas sur cette map"); return true; } + + + + + + + + + if (args[0].equalsIgnoreCase("convert")) + { + + onCommandConvertir(player); + + return true; + } + + + + + + + + if (args[0].equalsIgnoreCase("devis")) { CuboidSelection selection = WorldEditInterface.getPlayerCuboSelection(player); @@ -69,99 +80,47 @@ public class CommandCubo extends AbstractCommandExecutor { return true; } - if (plugin.survivalCuboManager.hasStaffPermission(player) && args.length >= 2 && plugin.getServer().getPlayer(args[1]) == null) - { // un joueur est indiqué mais il n'est pas connecté - player.sendMessage(ChatColor.RED+"Le joueur concerné n'est pas en ligne"); - return true; - } - + Player player_cubo = player; // on cherche si on traite un autre joueur - Player player_cubo; - if (!plugin.survivalCuboManager.hasStaffPermission(player) || args.length < 2 || (player_cubo = plugin.getServer().getPlayer(args[1])) == null) - player_cubo = player; - - player.sendMessage(ChatColor.GOLD+"----- Devis pour la création d'un cubo -----"); - if (player != player_cubo) - player_cubo.sendMessage(ChatColor.GOLD+"----- Devis pour la création d'un cubo -----"); - - // vérifie si la sélection interfère avec un cubo existant - // on crée un cubo factice (qui ne sera pas enregistré) - ProtectedCuboidRegion cubo = new ProtectedCuboidRegion("null", selection.getNativeMinimumPoint().toBlockVector(), selection.getNativeMaximumPoint().toBlockVector()); - // on récupère les cubos de la map pour les comparer - List regions = new ArrayList(wgPlugin.getRegionManager(selection.getWorld()).getRegions().values()); - boolean intersect = true; - for (ProtectedRegion reg : regions.toArray(new ProtectedRegion[regions.size()])) { - if (reg.getPriority() < 0) - regions.remove(reg); - } - List intersect_region = null; - try { - intersect_region = ((ProtectedRegion)cubo).getIntersectingRegions(regions); - if (intersect_region.size()==0) intersect = false; - } catch (UnsupportedIntersectionException e) { } - - if (intersect) - { - player.sendMessage(ChatColor.RED+"La sélection rentre en contact avec au moins un cubo existant"); - if (player != player_cubo) - player_cubo.sendMessage(ChatColor.RED+"La sélection rentre en contact avec au moins un cubo existant"); - if (intersect_region != null) - { - for(ProtectedRegion region : intersect_region) - { - player.sendMessage(ChatColor.RED+"- "+ChatColor.GRAY+region.getId()); - } + if (plugin.survivalCuboManager.hasStaffPermission(player) && args.length >= 2) { + Player p = plugin.getServer().getPlayerExact(args[1]); + if (p != null && p.isOnline()) { + player_cubo = p; + } + else { + player.sendMessage(ChatColor.RED+"Le joueur que vous avez indiqué n'est pas en ligne"); + return true; } } - - if (player != player_cubo) - { - player.sendMessage(ChatColor.GOLD+"Pour le joueur "+ChatColor.RESET+player_cubo.getDisplayName()); - player_cubo.sendMessage(ChatColor.GOLD+"Devis fait par "+ChatColor.RESET+player.getDisplayName()); - - } - // on vérifie si le joueur peut payer - double actual_money = EssentialsInterface.getPlayerMoney(player_cubo); + onCommandDevis(player, selection, player_cubo, player_cubo.equals(player)); - int volume_actuel_cubo = plugin.survivalCuboManager.getPlayerActualBlockCount(player_cubo, selection.getWorld()); - int volume_apres_cubo = volume_actuel_cubo + cubo.volume(); - double prix_actuel_cubo = plugin.survivalCuboManager.getVolumePrice(volume_actuel_cubo); - double prix_apres_cubo = plugin.survivalCuboManager.getVolumePrice(volume_apres_cubo); - double prix_a_payer = prix_apres_cubo - prix_actuel_cubo; - - player.sendMessage(ChatColor.GOLD+"Solde actuel : "+StringUtil.formatDouble(actual_money)); - player.sendMessage(ChatColor.GOLD+"Prix à payer : "+StringUtil.formatDouble(prix_a_payer)); - player.sendMessage(ChatColor.GOLD+"Solde futur : "+StringUtil.formatDouble(actual_money - prix_a_payer)); - - if (player != player_cubo) - { - player_cubo.sendMessage(ChatColor.GOLD+"Solde actuel : "+StringUtil.formatDouble(actual_money)); - player_cubo.sendMessage(ChatColor.GOLD+"Prix à payer : "+StringUtil.formatDouble(prix_a_payer)); - player_cubo.sendMessage(ChatColor.GOLD+"Futur solde : "+StringUtil.formatDouble(actual_money - prix_a_payer)); - } - if (actual_money - prix_a_payer < 0) - { - // le joueur ne peut pas payer - if (player == player_cubo) - player.sendMessage(ChatColor.RED+"Vous ne pouvez pas payer"); - else - { - - player.sendMessage(player_cubo.getDisplayName()+ChatColor.RED+" ne peut pas payer"); - player_cubo.sendMessage(ChatColor.RED+"Vous ne pouvez pas payer"); - } - - - } return true; } + + + + + + + + if (args[0].equalsIgnoreCase("creer") && args.length >= 2) { + + + CuboidSelection selection = WorldEditInterface.getPlayerCuboSelection(player); + if (selection == null) + { + player.sendMessage(ChatColor.RED+"Vous devez faire une sélection WorldEdit : faites "+ChatColor.GRAY+"//wand"); + return true; + } + + String nom_cubo = args[1]; if (!nom_cubo.matches("[0-9a-zA-Z_]+")) @@ -171,118 +130,22 @@ public class CommandCubo extends AbstractCommandExecutor { } - CuboidSelection selection = WorldEditInterface.getPlayerCuboSelection(player); - if (selection == null) - { - player.sendMessage(ChatColor.RED+"Vous devez faire une sélection WorldEdit : faites "+ChatColor.GRAY+"//wand"); - return true; - } - if (plugin.survivalCuboManager.hasStaffPermission(player) && args.length >= 3 && plugin.getServer().getPlayer(args[2]) == null) - { // un joueur est indiqué mais il n'est pas connecté - player.sendMessage(ChatColor.RED+"Le joueur concerné n'est pas en ligne"); - return true; - } + Player player_cubo = player; // on cherche si on traite un autre joueur - Player player_cubo; - if (!plugin.survivalCuboManager.hasStaffPermission(player) || args.length < 3 || (player_cubo = plugin.getServer().getPlayer(args[2])) == null) - player_cubo = player; - - player.sendMessage(ChatColor.GOLD+"----- Création d'un cubo -----"); - if (player != player_cubo) - { - player.sendMessage(ChatColor.GOLD+"Pour le joueur "+ChatColor.RESET+player_cubo.getDisplayName()); - - player_cubo.sendMessage(ChatColor.GOLD+"----- Création d'un cubo -----"); - player_cubo.sendMessage(ChatColor.GOLD+"Protection faite par "+ChatColor.RESET+player.getDisplayName()); - - } - - // vérifie si la sélection interfère avec un cubo existant - - // on crée le cubo - String id_cubo; - do - id_cubo = "cubo"+(new Random()).nextInt(1000000000)+"-"+player_cubo.getName()+"-"+nom_cubo; - while(wgPlugin.getRegionManager(selection.getWorld()).hasRegion(id_cubo)); - ProtectedCuboidRegion cubo = new ProtectedCuboidRegion(id_cubo, selection.getNativeMinimumPoint().toBlockVector(), selection.getNativeMaximumPoint().toBlockVector()); - DefaultDomain owners = new DefaultDomain(); - owners.addPlayer(player_cubo.getName()); - cubo.setOwners(owners); - - - // on récupère les cubos de la map pour les comparer - - List regions = new ArrayList(wgPlugin.getRegionManager(selection.getWorld()).getRegions().values()); - boolean intersect = true; - for (ProtectedRegion reg : regions.toArray(new ProtectedRegion[regions.size()])) { - if (reg.getPriority() < 0) - regions.remove(reg); - } - List intersect_region = null; - try { - intersect_region = ((ProtectedRegion)cubo).getIntersectingRegions(regions); - if (intersect_region.size()==0) intersect = false; - } catch (UnsupportedIntersectionException e) { } - - if (intersect) - { - player.sendMessage(ChatColor.RED+"La protection ne peut pas se faire"); - player.sendMessage(ChatColor.RED+"Faites "+ChatColor.GRAY+"/cubo devis"+ChatColor.RED+" pour en connaitre la raison"); - if (player != player_cubo) - player_cubo.sendMessage(ChatColor.RED+"La protection ne peut pas se faire"); - return true; + if (plugin.survivalCuboManager.hasStaffPermission(player) && args.length >= 3) { + Player p = plugin.getServer().getPlayerExact(args[2]); + if (p != null && p.isOnline()) { + player_cubo = p; + } + else { + player.sendMessage(ChatColor.RED+"Le joueur que vous avez indiqué n'est pas en ligne"); + return true; + } } - // on vérifie si le joueur peut payer - double actual_money = EssentialsInterface.getPlayerMoney(player_cubo); - - int volume_actuel_cubo = plugin.survivalCuboManager.getPlayerActualBlockCount(player_cubo, selection.getWorld()); - int volume_apres_cubo = volume_actuel_cubo + cubo.volume(); - double prix_actuel_cubo = plugin.survivalCuboManager.getVolumePrice(volume_actuel_cubo); - double prix_apres_cubo = plugin.survivalCuboManager.getVolumePrice(volume_apres_cubo); - double prix_a_payer = prix_apres_cubo - prix_actuel_cubo; - - - if (actual_money - prix_a_payer < 0) - { - // le joueur ne peut pas payer - - player.sendMessage(ChatColor.RED+"La protection ne peut pas se faire"); - player.sendMessage(ChatColor.RED+"Faites "+ChatColor.GRAY+"/cubo devis"+ChatColor.RED+" pour en connaitre la raison"); - if (player != player_cubo) - player_cubo.sendMessage(ChatColor.RED+"La protection ne peut pas se faire"); - - return true; - } - - - player_cubo.sendMessage(ChatColor.GOLD+"Ancien solde : "+StringUtil.formatDouble(actual_money)); - player_cubo.sendMessage(ChatColor.GOLD+"Prix à payer : "+StringUtil.formatDouble(prix_a_payer)); - player_cubo.sendMessage(ChatColor.GOLD+"Nouveau solde : "+StringUtil.formatDouble(actual_money - prix_a_payer)); - player_cubo.sendMessage(ChatColor.GREEN+"L'argent est automatiquement retiré de votre compte"); - if (player != player_cubo) - player.sendMessage(ChatColor.GREEN+"L'argent est automatiquement retiré du compte de "+ChatColor.RESET+player_cubo.getDisplayName()); - - - - - // on crée le cubo : - wgPlugin.getRegionManager(selection.getWorld()).addRegion(cubo); - try { - wgPlugin.getRegionManager(selection.getWorld()).save(); - } catch (ProtectionDatabaseException e) { - e.printStackTrace(); - } - - player.sendMessage(ChatColor.GREEN+"La protection "+ChatColor.GRAY+cubo.getId()+ChatColor.GREEN+" a bien été réalisée"); - if (player != player_cubo) - player_cubo.sendMessage(ChatColor.GREEN+"La protection "+ChatColor.GRAY+cubo.getId()+ChatColor.GREEN+" a bien été réalisée"); - - // on retire l'argent - EssentialsInterface.getPlayer(player_cubo).setMoney(new BigDecimal(actual_money - prix_a_payer)); - EssentialsInterface.getPlayer(player_cubo).save(); + onCommandCreer(player, selection, player_cubo, player_cubo.equals(player), nom_cubo); return true; @@ -296,61 +159,71 @@ public class CommandCubo extends AbstractCommandExecutor { + + + + if (args[0].equalsIgnoreCase("liste")) { int num_page = 1; - try { - if (args.length >= 2) - num_page = Integer.parseInt(args[1]); - } catch (NumberFormatException e) { } - - // on cherche si on traite un autre joueur String player_cubo = player.getName(); - if (plugin.survivalCuboManager.hasStaffPermission(player) && args.length >= 3) - player_cubo = args[2]; + /* + * Format possible pour la commande : + * /cubo liste (implicitement : la page 1, pour le joueur lui-même) + * /cubo liste 2 (implicitement : pour le joueur lui-même) + * /cubo liste toto (implicitement : la page 1) + * /cubo liste toto 4 + */ - List cubos = plugin.survivalCuboManager.getPlayerCubo(player_cubo, player.getWorld()); - - int nb_page = (int)Math.ceil(cubos.size()/5D); - if (num_page > nb_page) num_page = nb_page; - if (num_page < 1) num_page = 1; - - player.sendMessage(ChatColor.GOLD+"----- Liste des cubos de "+ChatColor.GRAY+player_cubo+ChatColor.GOLD+" -----"); - if (cubos.size() == 0) - player.sendMessage(ChatColor.GOLD+"Aucun cubo à afficher"); - - for (int i=(num_page-1)*5; i= 3 && plugin.survivalCuboManager.hasStaffPermission(player)) { + player_cubo = args[1]; + try { + num_page = Integer.parseInt(args[1]); + } catch (NumberFormatException e) { + player.sendMessage("Le troisième paramètre doit être un nombre entier"); + } } - player.sendMessage(ChatColor.GOLD+"Page "+num_page+"/"+nb_page+" : "+ChatColor.GRAY+"/cubo liste "+player_cubo); + + onCommandListe(player, player_cubo, num_page); + return true; } + + + + + + + + + /* * Dans la suite des sous-commandes, on a besoin de la protection dans le quel se trouve le joueur * * Si ce cubo n'existe pas, le reste des sous-commandes n'est pas exécutable */ - - - - - - // on parcours les cubos dans lesquels on se trouve, on garde le premier valide, si il existe - ProtectedCuboidRegion inside_cubo = null; - for(ProtectedRegion cubo : wgPlugin.getRegionManager(player.getWorld()).getApplicableRegions(player.getLocation())) + Cubo inside_cubo = plugin.survivalCuboManager.getCuboFromLocation(player.getLocation()); + if (inside_cubo == null) { - if (!(cubo instanceof ProtectedCuboidRegion)) continue; - if (!cubo.getId().matches(plugin.survivalCuboManager.regex_cubo_id)) continue; - inside_cubo = (ProtectedCuboidRegion) cubo; - break; + player.sendMessage(ChatColor.RED+"Vous ne vous trouvez dans aucun cubo"); + return true; } @@ -361,102 +234,80 @@ public class CommandCubo extends AbstractCommandExecutor { - if (args[0].equalsIgnoreCase("info")) - { - if (inside_cubo == null) - { - player.sendMessage(ChatColor.RED+"Vous ne vous trouvez dans aucun cubo"); - return true; - } - - int dim_x = Math.abs(inside_cubo.getMinimumPoint().getBlockX() - inside_cubo.getMaximumPoint().getBlockX()) + 1; - int dim_y = Math.abs(inside_cubo.getMinimumPoint().getBlockY() - inside_cubo.getMaximumPoint().getBlockY()) + 1; - int dim_z = Math.abs(inside_cubo.getMinimumPoint().getBlockZ() - inside_cubo.getMaximumPoint().getBlockZ()) + 1; - Vector midpoint = Vector.getMidpoint(inside_cubo.getMinimumPoint(), inside_cubo.getMaximumPoint()); - String proprio = inside_cubo.getOwners().toUserFriendlyString(); - String membres = inside_cubo.getMembers().toUserFriendlyString(); - - player.sendMessage(ChatColor.GOLD+"----- Information sur la protection -----"); - player.sendMessage(ChatColor.GOLD+"Identifiant : "+ChatColor.GRAY+inside_cubo.getId()); - player.sendMessage(ChatColor.GOLD+"Dimensions : "+ChatColor.GRAY+"x="+dim_x+" y="+dim_y+" z="+dim_z); - player.sendMessage(ChatColor.GOLD+"Localisation : "+ChatColor.GRAY+"x="+midpoint.getBlockX()+" y="+midpoint.getBlockY()+" z="+midpoint.getBlockZ()); - player.sendMessage(ChatColor.GOLD+"Volume : "+ChatColor.GRAY+inside_cubo.volume()); - player.sendMessage(ChatColor.GOLD+"Propriétaire : "+ChatColor.GRAY+proprio); - player.sendMessage(ChatColor.GOLD+"Usagers : "+ChatColor.GRAY+membres); - + + + if (args[0].equalsIgnoreCase("info")) { + onCommandInfo(player, inside_cubo); return true; } - if (args[0].equalsIgnoreCase("selectionner")) - { - if (inside_cubo == null) - { - player.sendMessage(ChatColor.RED+"Vous ne vous trouvez dans aucun cubo"); - return true; - } - if (!inside_cubo.isOwner(player.getName()) && !plugin.survivalCuboManager.hasStaffPermission(player)) - { - player.sendMessage(ChatColor.RED+"Vous n'avez pas la permission de faire cette action pour ce cubo"); + + + + + + + + + if (args[0].equalsIgnoreCase("acheter")) { + if (!inside_cubo.forSale()) { + player.sendMessage(ChatColor.RED+"Ce cubo n'est pas à vendre."); return true; } - WorldEditPlugin wePlugin = WorldEditInterface.getPlugin(); - Selection sel = new CuboidSelection(player.getWorld(), inside_cubo.getMinimumPoint(), inside_cubo.getMaximumPoint()); - wePlugin.setSelection(player, sel); + if (!inside_cubo.possibleBuyer(player.getName())) { + player.sendMessage(ChatColor.RED+"Ce cubo ne vous est pas destiné."); + return true; + } + + onCommandAcheter(player, inside_cubo); return true; } + + + + + + /* + * Dans la suite de la commande. Il s'agit d'appliquer des modifications sur + * le cubo dans lequel on se trouve. Il faut donc vérifier si on en a les droits + */ + + if (!canDoActionOnCubo(inside_cubo, player)) + { + player.sendMessage(ChatColor.RED+"Vous n'avez pas la permission de faire cette action pour ce cubo"); + return true; + } + + + + + + + + + + + if (args[0].equalsIgnoreCase("selectionner")) + { + WorldEditInterface.getPlugin().setSelection(player, inside_cubo.getWESelection()); + return true; + } + + + + + + + + + if (args[0].equalsIgnoreCase("supprimer") && args.length == 1) { - if (inside_cubo == null) - { - player.sendMessage(ChatColor.RED+"Vous ne vous trouvez dans aucun cubo"); - return true; - } - if (!inside_cubo.isOwner(player.getName()) && !plugin.survivalCuboManager.hasStaffPermission(player)) - { - player.sendMessage(ChatColor.RED+"Vous n'avez pas la permission de faire cette action pour ce cubo"); - return true; - } - - Set player_name = inside_cubo.getOwners().getPlayers(); - if (player_name == null || player_name.isEmpty()) - { - player.sendMessage(ChatColor.RED+"Ce cubo n'a aucun propriétaire"); - return true; - } - String proprio_cubo = player_name.toArray(new String[1])[0]; - - double actu_money = EssentialsInterface.getPlugin().getUser(proprio_cubo).getMoney().doubleValue(); - - int actu_volume_cubo = plugin.survivalCuboManager.getPlayerActualBlockCount(proprio_cubo, player.getWorld()); - int new_volume_cubo = actu_volume_cubo - inside_cubo.volume(); - double money_win = plugin.survivalCuboManager.getVolumePrice(actu_volume_cubo) - - plugin.survivalCuboManager.getVolumePrice(new_volume_cubo); - - - wgPlugin.getRegionManager(player.getWorld()).removeRegion(inside_cubo.getId()); - EssentialsInterface.getPlugin().getUser(proprio_cubo).setMoney(new BigDecimal(actu_money + money_win)); - - Player player_cubo = plugin.getServer().getPlayerExact(proprio_cubo); - - player.sendMessage(ChatColor.GREEN+"Le cubo "+ChatColor.GRAY+inside_cubo.getId()+ChatColor.GREEN+" a été supprimé"); - if (player_cubo != null && player_cubo != player) - { - player_cubo.sendMessage(ChatColor.GREEN+"Le cubo "+ChatColor.GRAY+inside_cubo.getId()+ChatColor.GREEN+" a été supprimé"); - } - - if (player_cubo != player) - { // le joueur gère le cubo d'un autre joueur (en ligne ou non) - player.sendMessage(ChatColor.GREEN+"L'argent a été restauré sur le compte de "+ChatColor.GRAY+((player_cubo == null)?proprio_cubo:player_cubo.getName())); - if (player_cubo != null) - player_cubo.sendMessage(ChatColor.GREEN+"L'argent a été restauré sur votre compte"); - } - else // le joueur gère son propre cubo - player.sendMessage(ChatColor.GREEN+"L'argent a été restauré sur votre compte"); - + onCommandSupprimer(player, inside_cubo); return true; } @@ -464,264 +315,69 @@ public class CommandCubo extends AbstractCommandExecutor { + + + + + if (args[0].equalsIgnoreCase("ajouter") && args.length >= 2) { - - if (inside_cubo == null) - { - player.sendMessage(ChatColor.RED+"Vous ne vous trouvez dans aucun cubo"); - return true; - } - if (!inside_cubo.isOwner(player.getName()) && !plugin.survivalCuboManager.hasStaffPermission(player)) - { - player.sendMessage(ChatColor.RED+"Vous n'avez pas la permission de faire cette action pour ce cubo"); - return true; - } - - String new_user = args[1]; - if (!new_user.matches("[0-9a-zA-Z_]{2,16}")) + if (!isValidPlayerName(new_user)) { player.sendMessage(ChatColor.RED+"Le pseudo indiqué n'est pas valide"); return true; } - - - inside_cubo.getMembers().addPlayer(new_user); - try { - wgPlugin.getRegionManager(player.getWorld()).save(); - } catch (ProtectionDatabaseException e) { - e.printStackTrace(); - } - - player.sendMessage(ChatColor.GREEN+"Vous venez d'ajouter "+ChatColor.GRAY+new_user+ChatColor.GREEN+" dans le cubo"); - + onCommandAjouter(player, inside_cubo, new_user); return true; } + + + + + if (args[0].equalsIgnoreCase("enlever") && args.length >= 2) { - - if (inside_cubo == null) - { - player.sendMessage(ChatColor.RED+"Vous ne vous trouvez dans aucun cubo"); - return true; - } - if (!inside_cubo.isOwner(player.getName()) && !plugin.survivalCuboManager.hasStaffPermission(player)) - { - player.sendMessage(ChatColor.RED+"Vous n'avez pas la permission de faire cette action pour ce cubo"); - return true; - } - - String old_user = args[1]; - if (!old_user.matches("[0-9a-zA-Z_]{2,16}")) + if (!isValidPlayerName(old_user)) { player.sendMessage(ChatColor.RED+"Le pseudo indiqué n'est pas valide"); return true; } - - inside_cubo.getMembers().removePlayer(old_user); - try { - wgPlugin.getRegionManager(player.getWorld()).save(); - } catch (ProtectionDatabaseException e) { - e.printStackTrace(); - } - player.sendMessage(ChatColor.GREEN+"Vous venez de retirer "+ChatColor.GRAY+old_user+ChatColor.GREEN+" du cubo"); - - + onCommandEnlever(player, inside_cubo, old_user); return true; } - if (args[0].equalsIgnoreCase("donner") && args.length >= 2) + + + + if (args[0].equalsIgnoreCase("vendre") && args.length >= 2) { - if (inside_cubo == null) - { - player.sendMessage(ChatColor.RED+"Vous ne vous trouvez dans aucun cubo"); - return true; - } - if (!inside_cubo.isOwner(player.getName()) && !plugin.survivalCuboManager.hasStaffPermission(player)) - { - player.sendMessage(ChatColor.RED+"Vous n'avez pas la permission de faire cette action pour ce cubo"); - return true; - } - - - String new_user = args[1]; - - if (plugin.getServer().getPlayer(new_user) == null) + Player new_proprio = plugin.getServer().getPlayer(args[1]); + if (new_proprio == null) { player.sendMessage(ChatColor.RED+"Le joueur indiqué n'est pas connecté"); return true; } - Player new_proprio = plugin.getServer().getPlayer(new_user); - - - inside_cubo.setOwners(new DefaultDomain()); - inside_cubo.getOwners().addPlayer(new_proprio.getName()); - inside_cubo.setMembers(new DefaultDomain()); - try { - wgPlugin.getRegionManager(player.getWorld()).save(); - } catch (ProtectionDatabaseException e) { - e.printStackTrace(); - } - - player.sendMessage(ChatColor.GREEN+"Vous venez de donner la parcelle courante à "+ChatColor.RESET+new_proprio.getDisplayName()); - new_proprio.sendMessage(player.getDisplayName()+ChatColor.GREEN+" viens de vous donner la parcelle "+ChatColor.GRAY+inside_cubo.getId()); - + onCommandVendre(player, inside_cubo, new_proprio); return true; } - - - if (args[0].equalsIgnoreCase("convert")) - { - - if (!plugin.survivalCuboManager.hasStaffPermission(player)) - { - player.sendMessage(ChatColor.RED+"Vous n'avez pas la permission de faire cette action"); - return true; - } - - plugin.getLogger().info(ChatColor.BOLD+"Conversion des protections de la map survie en cours..."); - - List regions_to_convert = new ArrayList(wgPlugin.getRegionManager(player.getWorld()).getRegions().values()); - - int nb_converted = 0; - int nb_new_converted = 0; - int nb_concerned = regions_to_convert.size(); - - - for (ProtectedRegion region_to_convert : regions_to_convert) - { - // on vérifie si c'est un cuboide (ne doit pas être un autre type de protection) - if (!(region_to_convert instanceof ProtectedCuboidRegion)) - { - nb_concerned--; - continue; - } - - if (region_to_convert.getPriority() < 0) - { - nb_concerned--; - continue; - } - - - // on ignore les cubos dans le bon format - if (region_to_convert.getId().matches(plugin.survivalCuboManager.regex_cubo_id)) - { - nb_converted++; - continue; - } - - // on cherche le propriétaire - String id = region_to_convert.getId(); - Set owners = region_to_convert.getOwners().getPlayers(); - - - if (owners.size() == 0){ - plugin.getLogger().warning("cubo conversion : "+region_to_convert.getId()+" has no owner"); - continue; - } - - DefaultDomain real_owners = new DefaultDomain(); - DefaultDomain real_members = new DefaultDomain(); - - for (String p : owners) - { - if (id.toLowerCase().contains(p.toLowerCase())) - real_owners.addPlayer(p); - else - real_members.addPlayer(p); - } - - if (real_owners.size() == 0 && owners.size() == 1) - real_owners.addPlayer(owners.toArray(new String[1])[0]); - - if (real_owners.size() == 0 && owners.size() > 1){ - plugin.getLogger().warning("cubo conversion : "+region_to_convert.getId()+" : has multiple owner but nobody is in region ID"); - continue; - } - if (real_owners.size() > 1){ - plugin.getLogger().warning("cubo conversion : "+region_to_convert.getId()+" : has multiple owner in region ID"); - continue; - } - - String unique_owner = real_owners.getPlayers().toArray(new String[1])[0]; - String cubo_name = id.replace(unique_owner, "").trim(); - if (!cubo_name.matches("[0-9a-zA-Z_]+")){ - plugin.getLogger().warning("cubo conversion : "+region_to_convert.getId()+" : new name '"+cubo_name+"' is not a valid name"); - continue; - } - - // on vérifie les intersections - try { - List regions_to_compare_with = new ArrayList(regions_to_convert); - regions_to_compare_with.remove(region_to_convert); - // on ne prends pas en compte les régions donc la priorité est négative (villes groupement de cubos) - for (ProtectedRegion reg : regions_to_convert) { - if (reg.getPriority() < 0) - regions_to_compare_with.remove(reg); - } - int nb_inter = region_to_convert.getIntersectingRegions(regions_to_compare_with).size(); - if (nb_inter > 0) - { - plugin.getLogger().warning("cubo conversion : "+region_to_convert.getId()+" intersect with "+nb_inter+" other(s) regions"); - continue; - } - } catch (UnsupportedIntersectionException e) { - plugin.getLogger().warning("cubo conversion : "+region_to_convert.getId()+" throw a UnsupportedIntersectionException"); - continue; - } - - - // création du cubo quiva remplacer l'ancien - String id_cubo; - do - id_cubo = "cubo"+(new Random()).nextInt(1000000000)+"-"+unique_owner+"-"+cubo_name; - while(wgPlugin.getRegionManager(player.getWorld()).hasRegion(id_cubo)); - - ProtectedCuboidRegion new_region = new ProtectedCuboidRegion(id_cubo, region_to_convert.getMinimumPoint(), region_to_convert.getMaximumPoint()); - new_region.setMembers(real_members); - new_region.setOwners(real_owners); - new_region.setFlags(region_to_convert.getFlags()); - new_region.setPriority(region_to_convert.getPriority()); - - wgPlugin.getRegionManager(player.getWorld()).removeRegion(region_to_convert.getId()); - wgPlugin.getRegionManager(player.getWorld()).addRegion(new_region); - - try { - wgPlugin.getRegionManager(player.getWorld()).save(); - } catch (ProtectionDatabaseException e) { - e.printStackTrace(); - } - - - nb_converted++; - nb_new_converted++; - } - - plugin.getLogger().info(ChatColor.GREEN+""+nb_converted+"/"+nb_concerned+" régions converties ("+nb_new_converted+" nouvelles)"); - player.sendMessage(ChatColor.GREEN+""+nb_converted+"/"+nb_concerned+" régions converties ("+nb_new_converted+" nouvelles). Voir la console pour les régions non converties"); - - return true; - } - @@ -781,7 +437,7 @@ public class CommandCubo extends AbstractCommandExecutor { ChatColor.GRAY+"/cubo supprimer"+ChatColor.GOLD+" pour supprimer le cubo dans lequel vous êtes", ChatColor.GRAY+"/cubo ajouter "+ChatColor.GOLD+" pour ajouter un usager dans le cubo dans lequel vous êtes", ChatColor.GRAY+"/cubo enlever "+ChatColor.GOLD+" pour enlever un usager du cubo dans lequel vous êtes", - ChatColor.GRAY+"/cubo liste [Pseudo]"+ChatColor.GOLD+" pour lister vos cubos. Précisez le pseudo si vous voulez lister les cubos d'un autre joueur", + ChatColor.GRAY+"/cubo liste [Pseudo] [Page=1]"+ChatColor.GOLD+" pour lister vos cubos. Précisez le pseudo si vous voulez lister les cubos d'un autre joueur", ChatColor.GRAY+"/cubo donner "+ChatColor.GOLD+" pour donner le cubo dans lequel vous êtes à un joueur", ChatColor.GOLD+"------------------------------------------" }; @@ -798,7 +454,7 @@ public class CommandCubo extends AbstractCommandExecutor { ChatColor.GRAY+"/cubo supprimer"+ChatColor.GOLD+" pour supprimer le cubo dans lequel vous êtes", ChatColor.GRAY+"/cubo ajouter "+ChatColor.GOLD+" pour ajouter un usager dans le cubo dans lequel vous êtes", ChatColor.GRAY+"/cubo enlever "+ChatColor.GOLD+" pour enlever un usager du cubo dans lequel vous êtes", - ChatColor.GRAY+"/cubo liste "+ChatColor.GOLD+" pour lister vos cubos", + ChatColor.GRAY+"/cubo liste [Page]"+ChatColor.GOLD+" pour lister vos cubos", ChatColor.GRAY+"/cubo donner "+ChatColor.GOLD+" pour donner le cubo dans lequel vous êtes à un joueur", ChatColor.GOLD+"------------------------------------------" }; @@ -816,6 +472,74 @@ public class CommandCubo extends AbstractCommandExecutor { sender.sendMessage(messages); } + + + + + + + + + private void onCommandDevis(Player commandSender, CuboidSelection selection, Player newOwner, boolean ownerIsCommandSender) { + + sendMessageToPlayers(ChatColor.GOLD+"----- Devis pour la création d'un cubo -----", commandSender, newOwner); + + if (!ownerIsCommandSender) + { + commandSender.sendMessage(ChatColor.GOLD+"Pour le joueur "+ChatColor.RESET+newOwner.getDisplayName()); + newOwner.sendMessage(ChatColor.GOLD+"Le devis est fait par "+ChatColor.RESET+commandSender.getDisplayName()); + } + + + + + // vérifie si la sélection interfère avec un cubo existant + List intersected_region = plugin.survivalCuboManager.getCuboNameIntersectedBySelection(selection); + if (intersected_region.size() > 0) + { + commandSender.sendMessage(ChatColor.RED+"La sélection rentre en contact avec au moins un cubo existant"); + if (commandSender != newOwner) + newOwner.sendMessage(ChatColor.RED+"La sélection rentre en contact avec au moins un cubo existant"); + + for(String region_name : intersected_region) + { + commandSender.sendMessage(ChatColor.RED+"- "+ChatColor.GRAY+region_name); + } + } + + + // on vérifie si le joueur peut payer + StatsAchatCubo achatCubo = plugin.survivalCuboManager.getStatsAchatCubo(selection, newOwner); + + sendMessageToPlayers(ChatColor.GOLD+"Prix du cubo concerné par ce devis : "+ChatColor.GRAY+StringUtil.formatDouble(achatCubo.valeurCuboCree), commandSender, newOwner); + + if (achatCubo.soldeCompteApresCreation >= 0) { + // le joueur peut payer + if (ownerIsCommandSender) { + commandSender.sendMessage(ChatColor.GOLD+"Votre argent avant la création du cubo : "+ChatColor.GRAY+StringUtil.formatDouble(achatCubo.soldeCompteActuel)); + commandSender.sendMessage(ChatColor.GOLD+"Votre argent après la création du cubo : "+ChatColor.GRAY+StringUtil.formatDouble(achatCubo.soldeCompteApresCreation)); + } + else { + commandSender.sendMessage(ChatColor.GOLD+"Son argent après la création du cubo : "+ChatColor.GRAY+StringUtil.formatDouble(achatCubo.soldeCompteApresCreation)); + newOwner.sendMessage(ChatColor.GOLD+"Votre argent avant la création du cubo : "+ChatColor.GRAY+StringUtil.formatDouble(achatCubo.soldeCompteActuel)); + newOwner.sendMessage(ChatColor.GOLD+"Votre argent après la création du cubo : "+ChatColor.GRAY+StringUtil.formatDouble(achatCubo.soldeCompteApresCreation)); + } + } + else { + // le joueur ne peut pas payer + if (ownerIsCommandSender) { + commandSender.sendMessage(ChatColor.RED+"Vous n'avez pas assez d'argent sur votre compte !"); + commandSender.sendMessage(ChatColor.RED+"Il vous manque encore : "+ChatColor.GRAY+StringUtil.formatDouble( - achatCubo.soldeCompteApresCreation)); + } + else { + commandSender.sendMessage(ChatColor.RED+"Le joueur n'a pas assez d'argent sur son compte !"); + commandSender.sendMessage(ChatColor.RED+"Il lui manque encore : "+ChatColor.GRAY+StringUtil.formatDouble( - achatCubo.soldeCompteApresCreation)); + newOwner.sendMessage(ChatColor.RED+"Vous n'avez pas assez d'argent sur votre compte !"); + newOwner.sendMessage(ChatColor.RED+"Il vous manque encore : "+ChatColor.GRAY+StringUtil.formatDouble( - achatCubo.soldeCompteApresCreation)); + } + } + + } @@ -826,4 +550,467 @@ public class CommandCubo extends AbstractCommandExecutor { + private void onCommandCreer(Player commandSender, CuboidSelection selection, Player newOwner, boolean ownerIsCommandSender, String cuboName) { + + commandSender.sendMessage(ChatColor.GOLD+"----- Création d'un cubo -----"); + if (!ownerIsCommandSender) { + commandSender.sendMessage(ChatColor.GOLD+"Pour le joueur "+ChatColor.RESET+newOwner.getDisplayName()); + } + + + + + // vérifie si la sélection interfère avec un cubo existant + if (plugin.survivalCuboManager.getCuboNameIntersectedBySelection(selection).size() > 0) { + commandSender.sendMessage(ChatColor.RED+"La protection ne peut pas se faire"); + commandSender.sendMessage(ChatColor.RED+"Faites "+ChatColor.GRAY+"/cubo devis"+ChatColor.RED+" pour plus de détails"); + return; + } + + + // on vérifie si le joueur peut payer + StatsAchatCubo achatCubo = plugin.survivalCuboManager.getStatsAchatCubo(selection, newOwner); + + if (achatCubo.soldeCompteApresCreation < 0) { + // le joueur ne peut pas payer + commandSender.sendMessage(ChatColor.RED+"La protection ne peut pas se faire"); + commandSender.sendMessage(ChatColor.RED+"Faites "+ChatColor.GRAY+"/cubo devis"+ChatColor.RED+" pour plus de détails"); + return; + } + + + // on peut créer le cubo maintenant + Cubo cubo = plugin.survivalCuboManager.addCubo(selection, newOwner.getName(), cuboName); + + + + // on retire l'argent + EssentialsInterface.getPlayer(newOwner).setMoney(new BigDecimal(achatCubo.soldeCompteApresCreation)); + EssentialsInterface.getPlayer(newOwner).save(); + + + // affichage des messages de réussite + if (!ownerIsCommandSender) { + newOwner.sendMessage(ChatColor.GOLD+"---------- Création d'un cubo ----------"); + newOwner.sendMessage(ChatColor.GOLD+"Protection faite par "+ChatColor.RESET+commandSender.getDisplayName()); + } + + sendMessageToPlayers(ChatColor.GREEN+"Le cubo a été créé avec succès", commandSender, newOwner); + sendMessageToPlayers(ChatColor.GOLD+"Identifiant du cubo : "+ChatColor.GRAY+cubo.getId(), commandSender, newOwner); + sendMessageToPlayers(ChatColor.GOLD+"Prix du cubo : "+ChatColor.GRAY+StringUtil.formatDouble(achatCubo.valeurCuboCree), commandSender, newOwner); + + + newOwner.sendMessage(ChatColor.GREEN+"L'argent est automatiquement retiré de votre compte !"); + if (commandSender != newOwner) + commandSender.sendMessage(ChatColor.GREEN+"L'argent est automatiquement retiré du compte de "+ChatColor.RESET+newOwner.getDisplayName()); + + + newOwner.sendMessage(ChatColor.GOLD+"Argent qui vous reste : "+ChatColor.GRAY+StringUtil.formatDouble(achatCubo.soldeCompteApresCreation)); + + + + } + + + + + + + + + + + private void onCommandListe(Player commandSender, String owner, int page) { + List cubos = plugin.survivalCuboManager.getPlayerCubo(owner, commandSender.getWorld()); + + int nb_page = (int)Math.ceil(cubos.size()/5D); + if (page > nb_page) page = nb_page; + if (page < 1) page = 1; + + commandSender.sendMessage(ChatColor.GOLD+"----- Liste des cubos de "+ChatColor.GRAY+owner+ChatColor.GOLD+" -----"); + if (cubos.size() == 0) + commandSender.sendMessage(ChatColor.GOLD+"Aucun cubo à afficher"); + + for (int i=(page-1)*5; i regions_to_convert = new ArrayList(wgPlugin.getRegionManager(player.getWorld()).getRegions().values()); + + int nb_converted = 0; + int nb_new_converted = 0; + int nb_concerned = regions_to_convert.size(); + + + for (ProtectedRegion region_to_convert : regions_to_convert) + { + // on vérifie si c'est un cuboide (ne doit pas être un autre type de protection) + if (!(region_to_convert instanceof ProtectedCuboidRegion)) + { + nb_concerned--; + continue; + } + + if (region_to_convert.getPriority() < 0) + { + nb_concerned--; + continue; + } + + + // on ignore les cubos dans le bon format + if (region_to_convert.getId().matches(plugin.survivalCuboManager.regex_cubo_id)) + { + nb_converted++; + continue; + } + + // on cherche le propriétaire + String id = region_to_convert.getId(); + Set owners = region_to_convert.getOwners().getPlayers(); + + + if (owners.size() == 0){ + plugin.getLogger().warning("cubo conversion : "+region_to_convert.getId()+" has no owner"); + continue; + } + + DefaultDomain real_owners = new DefaultDomain(); + DefaultDomain real_members = new DefaultDomain(); + + for (String p : owners) + { + if (id.toLowerCase().contains(p.toLowerCase())) + real_owners.addPlayer(p); + else + real_members.addPlayer(p); + } + + if (real_owners.size() == 0 && owners.size() == 1) + real_owners.addPlayer(owners.toArray(new String[1])[0]); + + if (real_owners.size() == 0 && owners.size() > 1){ + plugin.getLogger().warning("cubo conversion : "+region_to_convert.getId()+" : has multiple owner but nobody is in region ID"); + continue; + } + if (real_owners.size() > 1){ + plugin.getLogger().warning("cubo conversion : "+region_to_convert.getId()+" : has multiple owner in region ID"); + continue; + } + + String unique_owner = real_owners.getPlayers().toArray(new String[1])[0]; + String cubo_name = id.replace(unique_owner, "").trim(); + if (!cubo_name.matches("[0-9a-zA-Z_]+")){ + plugin.getLogger().warning("cubo conversion : "+region_to_convert.getId()+" : new name '"+cubo_name+"' is not a valid name"); + continue; + } + + // on vérifie les intersections + try { + List regions_to_compare_with = new ArrayList(regions_to_convert); + regions_to_compare_with.remove(region_to_convert); + // on ne prends pas en compte les régions donc la priorité est négative (villes groupement de cubos) + for (ProtectedRegion reg : regions_to_convert) { + if (reg.getPriority() < 0) + regions_to_compare_with.remove(reg); + } + int nb_inter = region_to_convert.getIntersectingRegions(regions_to_compare_with).size(); + if (nb_inter > 0) + { + plugin.getLogger().warning("cubo conversion : "+region_to_convert.getId()+" intersect with "+nb_inter+" other(s) regions"); + continue; + } + } catch (UnsupportedIntersectionException e) { + plugin.getLogger().warning("cubo conversion : "+region_to_convert.getId()+" throw a UnsupportedIntersectionException"); + continue; + } + + + // création du cubo quiva remplacer l'ancien + String id_cubo; + do + id_cubo = "cubo"+(new Random()).nextInt(1000000000)+"-"+unique_owner+"-"+cubo_name; + while(wgPlugin.getRegionManager(player.getWorld()).hasRegion(id_cubo)); + + ProtectedCuboidRegion new_region = new ProtectedCuboidRegion(id_cubo, region_to_convert.getMinimumPoint(), region_to_convert.getMaximumPoint()); + new_region.setMembers(real_members); + new_region.setOwners(real_owners); + new_region.setFlags(region_to_convert.getFlags()); + new_region.setPriority(region_to_convert.getPriority()); + + wgPlugin.getRegionManager(player.getWorld()).removeRegion(region_to_convert.getId()); + wgPlugin.getRegionManager(player.getWorld()).addRegion(new_region); + + try { + wgPlugin.getRegionManager(player.getWorld()).save(); + } catch (ProtectionDatabaseException e) { + e.printStackTrace(); + } + + + nb_converted++; + nb_new_converted++; + } + + plugin.getLogger().info(ChatColor.GREEN+""+nb_converted+"/"+nb_concerned+" régions converties ("+nb_new_converted+" nouvelles)"); + player.sendMessage(ChatColor.GREEN+""+nb_converted+"/"+nb_concerned+" régions converties ("+nb_new_converted+" nouvelles). Voir la console pour les régions non converties"); + // */ + } + + + + + + + + + + + + + + + private boolean canDoActionOnCubo(Cubo c, Player p) { + return c.isOwner(p.getName()) || plugin.survivalCuboManager.hasStaffPermission(p); + } + + + + + /** + * Envoi un message à plusieurs joueur en faisant attention qu'un joueur ne recoive pas + * plusieurs fois le message dans le cas où il serait référencé plusieurs fois dans les + * paramètres + * @param m le message à envoyer. IllegalArgumentException si ce paramètre est vide. + * @param pls les joueurs auquels il faut envoyer un message. Les joueurs null sont ignorés + */ + private void sendMessageToPlayers(String m, Player... pls) { + if (m == null) throw new IllegalArgumentException("le message ne doit pas être null"); + ArrayList players = new ArrayList(); + for (Player p : pls) { + if (p == null) continue; + if (players.contains(p)) continue; + p.sendMessage(m); + players.add(p); + } + + } + + + + + private double gagnerArgentVenteCubo(Cubo c) { + if (c.forSale()) return 0; + double actu_money = EssentialsInterface.getPlugin().getUser(c.getOwnerName()).getMoney().doubleValue(); + + long actu_volume_cubo = plugin.survivalCuboManager.getPlayerActualBlockCount(c.getOwnerName(), plugin.getServer().getWorld(c.getWorldName())); + long new_volume_cubo = actu_volume_cubo - c.getVolume(); + double money_win = plugin.survivalCuboManager.getVolumePrice(actu_volume_cubo) + - plugin.survivalCuboManager.getVolumePrice(new_volume_cubo); + + EssentialsInterface.getPlugin().getUser(c.getOwnerName()).setMoney(new BigDecimal(actu_money + money_win)); + + return money_win; + } + + + + } diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/modules/protection/SurvivalCuboManager.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/modules/protection/SurvivalCuboManager.java index 6a150df..99ce04f 100644 --- a/src/net/mc_pandacraft/java/plugin/pandacraftutils/modules/protection/SurvivalCuboManager.java +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/modules/protection/SurvivalCuboManager.java @@ -1,20 +1,33 @@ package net.mc_pandacraft.java.plugin.pandacraftutils.modules.protection; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Random; +import java.util.Set; +import net.mc_pandacraft.java.plugin.pandacraftutils.PandacraftUtils; +import net.mc_pandacraft.java.plugin.pandacraftutils.config.ConfigManager; +import net.mc_pandacraft.java.plugin.pandacraftutils.plugin_interface.EssentialsInterface; import net.mc_pandacraft.java.plugin.pandacraftutils.plugin_interface.WorldGuardInterface; +import org.bukkit.Location; import org.bukkit.World; import org.bukkit.entity.Player; +import org.bukkit.util.Vector; +import com.sk89q.worldedit.bukkit.selections.CuboidSelection; import com.sk89q.worldguard.bukkit.WorldGuardPlugin; +import com.sk89q.worldguard.domains.DefaultDomain; +import com.sk89q.worldguard.protection.UnsupportedIntersectionException; +import com.sk89q.worldguard.protection.databases.ProtectionDatabaseException; import com.sk89q.worldguard.protection.regions.ProtectedCuboidRegion; import com.sk89q.worldguard.protection.regions.ProtectedRegion; public class SurvivalCuboManager { public WorldGuardPlugin wgPlugin = WorldGuardInterface.getPlugin(); + public PandacraftUtils plugin = PandacraftUtils.getInstance(); public final String regex_cubo_id = "cubo[0-9]+-[0-9A-Za-z_]+-[0-9A-Za-z_]+"; @@ -28,7 +41,7 @@ public class SurvivalCuboManager { * @param w le monde * @return tout les cubos d'un joueur donné sur un monde donné */ - public List getPlayerCubo(Player p, World w) { + public List getPlayerCubo(Player p, World w) { return getPlayerCubo(p.getName(), w); } @@ -38,10 +51,10 @@ public class SurvivalCuboManager { * @param w le monde * @return tout les cubos d'un joueur donné sur un monde donné */ - public List getPlayerCubo(String p, World w) { + public List getPlayerCubo(String p, World w) { Map regions = wgPlugin.getRegionManager(w).getRegions(); - List playerRegions = new ArrayList(); + List playerRegions = new ArrayList(); for (Map.Entry region : regions.entrySet()) { // on ne prend en charge que les cuboides @@ -52,7 +65,7 @@ public class SurvivalCuboManager { continue; if (!region.getValue().isOwner(p)) continue; - playerRegions.add((ProtectedCuboidRegion)region.getValue()); + playerRegions.add(new Cubo((ProtectedCuboidRegion)region.getValue(), w.getName())); } return playerRegions; } @@ -63,7 +76,7 @@ public class SurvivalCuboManager { * @param w le monde * @return le volume total des cubos d'un joueur donné sur un monde donné */ - public int getPlayerActualBlockCount(Player p, World w) { + public long getPlayerActualBlockCount(Player p, World w) { return getPlayerActualBlockCount(p.getName(), w); } @@ -73,11 +86,11 @@ public class SurvivalCuboManager { * @param w le monde * @return le volume total des cubos d'un joueur donné sur un monde donné */ - public int getPlayerActualBlockCount(String p, World w) { - List regions = getPlayerCubo(p, w); - int nb = 0; - for (ProtectedCuboidRegion region : regions){ - nb += region.volume(); + public long getPlayerActualBlockCount(String p, World w) { + List regions = getPlayerCubo(p, w); + long nb = 0; + for (Cubo region : regions){ + nb += region.getVolume(); } return nb; } @@ -87,7 +100,7 @@ public class SurvivalCuboManager { * @param nb le volume * @return le prix pour le volume donné */ - public double getVolumePrice(int nb) { + public double getVolumePrice(long nb) { if (nb <= 2000) return 0; @@ -103,5 +116,272 @@ public class SurvivalCuboManager { return p.hasPermission("pandacraft.cubo.staff"); } + + + + + public void saveRegionManager(World w) { + try { + wgPlugin.getRegionManager(w).save(); + } catch (ProtectionDatabaseException e) { + e.printStackTrace(); + } + } + + + + + + + public Cubo getCuboFromLocation(Location l) { + + if (!isInCuboWorld(l.getWorld())) return null; + + for(ProtectedRegion cubo : wgPlugin.getRegionManager(l.getWorld()).getApplicableRegions(l)) + { + if (!(cubo instanceof ProtectedCuboidRegion)) continue; + if (!cubo.getId().matches(regex_cubo_id)) continue; + return new Cubo( (ProtectedCuboidRegion) cubo, l.getWorld().getName()); + + } + return null; + } + + + + + + public boolean isInCuboWorld(String w) { + return ConfigManager.getInstance().defaultConfig.cubos_worlds.contains(w); + } + public boolean isInCuboWorld(World w) { return isInCuboWorld(w.getName()); } + + + + + + + + + + + + /** + * + * @param selection la sélection WorldEdit concerné par cette vérification + * @return la liste des identifiants des régions qui interfèrent avec la sélection passé en paramètre. S'il y en a aucun, retourne une liste vide. + */ + public List getCuboNameIntersectedBySelection(CuboidSelection selection) { + // on crée un cubo factice (qui ne sera pas enregistré) + ProtectedCuboidRegion cubo = new ProtectedCuboidRegion("null", selection.getNativeMinimumPoint().toBlockVector(), selection.getNativeMaximumPoint().toBlockVector()); + // on récupère les régions de la map pour les comparer + List regions = new ArrayList(wgPlugin.getRegionManager(selection.getWorld()).getRegions().values()); + + for (ProtectedRegion reg : regions.toArray(new ProtectedRegion[regions.size()])) { + if (reg.getPriority() < 0) + regions.remove(reg); + } + List intersected_str = new ArrayList(); + List intersect_region = new ArrayList(); + try { + intersect_region = ((ProtectedRegion)cubo).getIntersectingRegions(regions); + } catch (UnsupportedIntersectionException e) { } + + // on extrait les ID des régions intersecté + for (ProtectedRegion r : intersect_region) { + intersected_str.add(r.getId()); + } + return intersected_str; + } + + + + + + + + public Cubo addCubo(CuboidSelection selection, String ownerName, String nom_cubo) { + + if (!isInCuboWorld(selection.getWorld())) + return null; + if (ownerName == null || !ownerName.matches("[0-9A-Za-z_]{2;16}")) + return null; + if (nom_cubo == null || !nom_cubo.matches("[0-9A-Za-z_]+")) + return null; + + String id_cubo; + do + id_cubo = "cubo"+(new Random()).nextInt(1000000000)+"-"+ownerName+"-"+nom_cubo; + while(wgPlugin.getRegionManager(selection.getWorld()).hasRegion(id_cubo)); + ProtectedCuboidRegion cubo = new ProtectedCuboidRegion(id_cubo, selection.getNativeMinimumPoint().toBlockVector(), selection.getNativeMaximumPoint().toBlockVector()); + DefaultDomain owners = new DefaultDomain(); + owners.addPlayer(ownerName); + cubo.setOwners(owners); + + wgPlugin.getRegionManager(selection.getWorld()).addRegion(cubo); + + plugin.survivalCuboManager.saveRegionManager(selection.getWorld()); + + return new Cubo(cubo, selection.getWorld().getName()); + } + + + + + public void removeCubo(Cubo c) { + wgPlugin.getRegionManager(plugin.getServer().getWorld(c.getWorldName())).removeRegion(c.getId()); + + plugin.survivalCuboManager.saveRegionManager(plugin.getServer().getWorld(c.getWorldName())); + } + + + + + + + + + + + public class Cubo { + private ProtectedCuboidRegion wgCubo; + private String world; + + public Cubo(ProtectedCuboidRegion cubo, String w) { + if (!cubo.getId().matches(regex_cubo_id)) + throw new IllegalArgumentException("La commande /cubo ne gère pas la protection '"+cubo.getId()+"'"); + wgCubo = cubo; + world = w; + } + + + public int getVolume() { return wgCubo.volume(); } + public String getId() { return wgCubo.getId(); } + public String getWorldName() { return world; } + + + + public Vector getMinimumPoint() { return new Vector(wgCubo.getMinimumPoint().getX(), wgCubo.getMinimumPoint().getY(), wgCubo.getMinimumPoint().getZ()); } + public Vector getMaximumPoint() { return new Vector(wgCubo.getMaximumPoint().getX(), wgCubo.getMaximumPoint().getY(), wgCubo.getMaximumPoint().getZ()); } + + public Vector getSize() { + return new Vector(Math.abs(getMinimumPoint().getBlockX() - getMaximumPoint().getBlockX()) + 1, + Math.abs(getMinimumPoint().getBlockY() - getMaximumPoint().getBlockY()) + 1, + Math.abs(getMinimumPoint().getBlockZ() - getMaximumPoint().getBlockZ()) + 1); + } + + public CuboidSelection getWESelection() { + return new CuboidSelection(plugin.getServer().getWorld(world), wgCubo.getMinimumPoint(), wgCubo.getMaximumPoint()); + } + + + + public boolean isOwner(Player p) { return isOwner(p.getName()); } + public boolean isOwner(String p) { return getOwnerName().equals(p); } + public String getOwnerName() { + if (forSale()) return ""; + Set pls = wgCubo.getOwners().getPlayers(); + for (String p : pls) + return p; + throw new RuntimeException("getOwnerName() devrait retourner au moins un Pseudo pour la protection '"+wgCubo.getId()+"'"); + } + + public Set getMembersNames() { + if (forSale()) return new HashSet(); + return wgCubo.getMembers().getPlayers(); + } + + public String getUserFriendlyMembersNames() { + if (forSale()) return ""; + return wgCubo.getMembers().toUserFriendlyString(); + } + + public void addMember(String p) { + if (forSale()) return; + wgCubo.getMembers().addPlayer(p); + } + public void removeMember(String p) { + if (forSale()) return; + wgCubo.getMembers().removePlayer(p); + } + + + public void remove() { + removeCubo(this); + } + + public void sellTo(String p) { + if (forSale()) return; + wgCubo.setMembers(new DefaultDomain()); + wgCubo.getMembers().addPlayer(p); + wgCubo.getMembers().addPlayer(getOwnerName()); + wgCubo.setOwners(new DefaultDomain()); + } + + public boolean forSale() { + return wgCubo.getOwners().size() == 0; + } + + public boolean buy(String p) { + if (!forSale()) return false; + if (!wgCubo.getMembers().contains(p)) return false; + + + wgCubo.setMembers(new DefaultDomain()); + wgCubo.setOwners(new DefaultDomain()); + wgCubo.getOwners().addPlayer(p); + + return true; + } + + public boolean possibleBuyer(String p) { + if (!forSale()) return false; + return wgCubo.getMembers().contains(p); + } + + } + + + + + + public StatsAchatCubo getStatsAchatCubo(CuboidSelection selection, Player p) { + return new StatsAchatCubo(selection, p); + } + + public class StatsAchatCubo { + public final long volumeTotalCubosActuel; + public final double valeurTotaleCubosActuel; + public final double soldeCompteActuel; + + public final int volumeCuboCree; + public final double valeurCuboCree; + + public final long volumeTotalCubosApresCreation; + public final double valeurTotaleCubosApresCreation; + public final double soldeCompteApresCreation; + + private StatsAchatCubo(CuboidSelection selection, Player p) { + soldeCompteActuel = EssentialsInterface.getPlayerMoney(p); + + volumeTotalCubosActuel = plugin.survivalCuboManager.getPlayerActualBlockCount(p, selection.getWorld()); + volumeCuboCree = selection.getArea(); + volumeTotalCubosApresCreation = volumeTotalCubosActuel + volumeCuboCree; + valeurTotaleCubosActuel = plugin.survivalCuboManager.getVolumePrice(volumeTotalCubosActuel); + valeurTotaleCubosApresCreation = plugin.survivalCuboManager.getVolumePrice(volumeTotalCubosApresCreation); + valeurCuboCree = valeurTotaleCubosApresCreation - valeurTotaleCubosActuel; + + soldeCompteApresCreation = soldeCompteActuel - valeurCuboCree; + + } + + + } + + + + + + }