diff --git a/.classpath b/.classpath index 317536e..cea07fc 100644 --- a/.classpath +++ b/.classpath @@ -2,7 +2,11 @@ - + + + + + @@ -10,5 +14,6 @@ + diff --git a/lib/worldguard-5.9.jar b/lib/worldguard-5.9.jar new file mode 100644 index 0000000..54d7124 Binary files /dev/null and b/lib/worldguard-5.9.jar differ diff --git a/make_jar.jardesc b/make_jar.jardesc index d258baf..1887591 100644 --- a/make_jar.jardesc +++ b/make_jar.jardesc @@ -1,6 +1,6 @@ - + diff --git a/resources/config.yml b/resources/config.yml index 16b9463..d71553e 100644 --- a/resources/config.yml +++ b/resources/config.yml @@ -26,3 +26,10 @@ chatAnalysis: maxViolationLevel: 20 nbSecondForOneVLDown: 10 + + + +cubos: +# séparé avec des point-virgules + worlds: Survival + diff --git a/resources/plugin.yml b/resources/plugin.yml index 6a9d833..ee55195 100644 --- a/resources/plugin.yml +++ b/resources/plugin.yml @@ -1,6 +1,6 @@ name: PandacraftUtils main: net.mc_pandacraft.java.plugin.pandacraftutils.PandacraftUtils -version: 2.8 +version: 2.9 @@ -50,6 +50,10 @@ commands: description: Gère la file d'attente de joueurs qui ont besoin de l'assitance du staff usage: /staff [annuler|] permission: pandacraft.staff + cubo: + description: Gère les protections de la map Survie + usage: /cubo + permission: pandacraft.cubo @@ -92,6 +96,12 @@ permissions: pandacraft.staff: description: Utiliser la commande staff default: true + + pandacraft.cubo: + description: Utiliser la commande cubo + default: true + pandacraft.cubo.staff: + description: Donne le droit de gérer tout les cubos des joueurs pandacraft.afk: description: Utiliser la commande afk diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/ConfigManager.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/ConfigManager.java index 7fdeb9b..a1c7e6c 100644 --- a/src/net/mc_pandacraft/java/plugin/pandacraftutils/ConfigManager.java +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/ConfigManager.java @@ -2,6 +2,7 @@ package net.mc_pandacraft.java.plugin.pandacraftutils; import java.io.File; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -28,6 +29,8 @@ public class ConfigManager { } public synchronized static void reloadConfig() { + if (instance != null) + PandacraftUtils.getInstance().reloadConfig(); instance = null; } @@ -76,7 +79,7 @@ public class ConfigManager { ChatAnalysis_maxViolationLevel = configFile.getInt("chatAnalysis.maxViolationLevel"); ChatAnalysis_nbSecondForOneVLDown = configFile.getInt("chatAnalysis.nbSecondForOneVLDown"); - + CuboCommand_worlds = Arrays.asList(configFile.getString("cubos.worlds").split(";")); initChatAnalysisBadWord(); @@ -223,4 +226,19 @@ public class ConfigManager { } + + + + + + + + public List CuboCommand_worlds = new ArrayList(); + + + + + + + } diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/PandacraftUtils.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/PandacraftUtils.java index a31aabd..224764a 100644 --- a/src/net/mc_pandacraft/java/plugin/pandacraftutils/PandacraftUtils.java +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/PandacraftUtils.java @@ -18,6 +18,7 @@ import net.mc_pandacraft.java.plugin.pandacraftutils.simple_commands.setblock.Co import net.mc_pandacraft.java.plugin.pandacraftutils.simple_commands.speed_message.CommandSpeedMessage; import net.mc_pandacraft.java.plugin.pandacraftutils.simple_commands.staff_player_help.CommandStaff; import net.mc_pandacraft.java.plugin.pandacraftutils.spawntime.SpawnTimeManager; +import net.mc_pandacraft.java.plugin.pandacraftutils.survival_cuboid.CommandCubo; import net.mc_pandacraft.java.plugin.pandacraftutils.survival_cuboid.CommandWandSelection; import net.mc_pandacraft.java.plugin.pandacraftutils.system_analyzer.CommandSystem; import net.mc_pandacraft.java.util.mysql.DBConnection; @@ -40,6 +41,7 @@ public class PandacraftUtils extends JavaPlugin { public CommandSpeedMessage commandSpeedMessage; public CommandWandSelection commandWandSelection; public CommandStaff commandStaff; + public CommandCubo commandCubo; public CommandAliasManager commandAliasManager; public SpawnTimeManager spawnTimeManager; @@ -77,6 +79,7 @@ public class PandacraftUtils extends JavaPlugin { commandSpeedMessage = new CommandSpeedMessage(this); // messages rapides commandWandSelection = new CommandWandSelection(this); commandStaff = new CommandStaff(this); + commandCubo = new CommandCubo(this); commandAliasManager = new CommandAliasManager(this); spawnTimeManager = new SpawnTimeManager(this); @@ -109,6 +112,8 @@ public class PandacraftUtils extends JavaPlugin { serverPingListener = null; + ConfigManager.reloadConfig(); + try { databaseConnection.getConnection().close(); } catch (SQLException e) { } } diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/plugin_interface/EssentialsInterface.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/plugin_interface/EssentialsInterface.java index 7a01a2d..e2ba0c7 100644 --- a/src/net/mc_pandacraft/java/plugin/pandacraftutils/plugin_interface/EssentialsInterface.java +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/plugin_interface/EssentialsInterface.java @@ -5,31 +5,50 @@ import net.mc_pandacraft.java.plugin.pandacraftutils.PandacraftUtils; import org.bukkit.entity.Player; import com.earth2me.essentials.Essentials; +import com.earth2me.essentials.User; public class EssentialsInterface { + + public static Essentials getPlugin() { + try { + return (Essentials) PandacraftUtils.getInstance().getServer().getPluginManager().getPlugin("Essentials"); + } catch (Exception e) { return null; } + } + public static User getPlayer(Player p) { + try { + return getPlugin().getUser(p); + } catch (Exception e) { } + return null; + } public static boolean isPlayerVanished(Player p) { try { - return ((Essentials)PandacraftUtils.getInstance().getServer().getPluginManager().getPlugin("Essentials")).getUser(p).isVanished(); + return getPlayer(p).isVanished(); } catch (Exception e) { } return false; } public static boolean canPlayerSeeVanishedPlayer(Player p, Player hiddenP) { try { - Essentials ess = (Essentials)PandacraftUtils.getInstance().getServer().getPluginManager().getPlugin("Essentials"); - - return ess.getUser(p).canSee(hiddenP); + return getPlugin().getUser(p).canSee(hiddenP); } catch (Exception e) { } return true; } public static boolean isPlayerMuted(Player p) { try { - return ((Essentials)PandacraftUtils.getInstance().getServer().getPluginManager().getPlugin("Essentials")).getUser(p).isMuted(); + return getPlugin().getUser(p).isMuted(); } catch (Exception e) { } return false; } + + + public static double getPlayerMoney(Player p) { + try { + return getPlugin().getUser(p).getMoney().doubleValue(); + } catch (Exception e) { } + return Double.NaN; + } } diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/plugin_interface/WorldEditInterface.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/plugin_interface/WorldEditInterface.java new file mode 100644 index 0000000..1e14bf7 --- /dev/null +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/plugin_interface/WorldEditInterface.java @@ -0,0 +1,33 @@ +package net.mc_pandacraft.java.plugin.pandacraftutils.plugin_interface; + +import net.mc_pandacraft.java.plugin.pandacraftutils.PandacraftUtils; + +import org.bukkit.entity.Player; + +import com.sk89q.worldedit.bukkit.WorldEditPlugin; +import com.sk89q.worldedit.bukkit.selections.CuboidSelection; +import com.sk89q.worldedit.bukkit.selections.Selection; + +public class WorldEditInterface { + + public static WorldEditPlugin getPlugin() { + try { + return (WorldEditPlugin) PandacraftUtils.getInstance().getServer().getPluginManager().getPlugin("WorldEdit"); + } catch (Exception e) { return null; } + } + + + + public static CuboidSelection getPlayerCuboSelection(Player p) { + WorldEditPlugin wePlugin = getPlugin(); + if (wePlugin == null) return null; + Selection sel = wePlugin.getSelection(p); + if (sel == null) return null; + // on garde que les cuboïdes (pas les autres formes) + if (!(sel instanceof CuboidSelection)) + return null; + return (CuboidSelection) sel; + + } + +} diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/survival_cuboid/CommandCubo.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/survival_cuboid/CommandCubo.java new file mode 100644 index 0000000..cb2e48f --- /dev/null +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/survival_cuboid/CommandCubo.java @@ -0,0 +1,794 @@ +package net.mc_pandacraft.java.plugin.pandacraftutils.survival_cuboid; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Random; +import java.util.Set; + +import net.mc_pandacraft.java.plugin.pandacraftutils.ConfigManager; +import net.mc_pandacraft.java.plugin.pandacraftutils.PandacraftUtils; +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.util.StringUtil; + +import org.bukkit.ChatColor; +import org.bukkit.World; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +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 implements CommandExecutor { + + private PandacraftUtils plugin; + + private WorldGuardPlugin wgPlugin; + + private String regex_cubo_id = "cubo[0-9]+-[0-9A-Za-z_]+-[0-9A-Za-z_]+"; + + public CommandCubo(PandacraftUtils pl) { + plugin = pl; + + + Plugin wg = plugin.getServer().getPluginManager().getPlugin("WorldGuard"); + + // WorldGuard may not be loaded + if (wg == null || !(wg instanceof WorldGuardPlugin)) { + try { throw new Exception("Impossible de récupérer l'instance du plugin WorldGuard"); + } catch (Exception e) { e.printStackTrace(); } + } + + wgPlugin = (WorldGuardPlugin) wg; + + } + + + + + + @Override + public boolean onCommand(CommandSender sender, Command command, + String label, String[] args) { + + if (args.length == 0 || !(sender instanceof Player)) + { + showHelp(sender); + return true; + } + + // la commande contient au moins un paramètre et la personne qui fait la commande est un Joueur + Player player = (Player) sender; + + // on vérifie que le joueur se trouve bien dans un monde dans lequel on peut cubo + if (!ConfigManager.getInstance().CuboCommand_worlds.contains(player.getWorld().getName())) + { + player.sendMessage(ChatColor.RED+"Les cubos ne se font pas sur cette map"); + return false; + } + + + if (args[0].equalsIgnoreCase("devis")) + { + 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 (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; + } + + + // on cherche si on traite un autre joueur + Player player_cubo; + if (!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 + Collection regions = wgPlugin.getRegionManager(selection.getWorld()).getRegions().values(); + boolean intersect = true; + List intersect_region = null; + try { + intersect_region = ((ProtectedRegion)cubo).getIntersectingRegions(Arrays.asList(regions.toArray(new ProtectedRegion[1]))); + 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 (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); + + int volume_actuel_cubo = getPlayerActualBlockCount(player_cubo, selection.getWorld()); + int volume_apres_cubo = volume_actuel_cubo + cubo.volume(); + double prix_actuel_cubo = getVolumePrice(volume_actuel_cubo); + double prix_apres_cubo = 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) + { + String nom_cubo = args[1]; + + if (!nom_cubo.matches("[0-9a-zA-Z_]+")) + { + player.sendMessage(ChatColor.RED+"Le nom du cubo n'est pas valide : il doit contenir des lettres/chiffres et tiret du bas "+ChatColor.GRAY+"_"); + return true; + } + + + 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 (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; + } + + // on cherche si on traite un autre joueur + Player player_cubo; + if (!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 + Collection regions = wgPlugin.getRegionManager(selection.getWorld()).getRegions().values(); + boolean intersect = true; + List intersect_region = null; + try { + intersect_region = ((ProtectedRegion)cubo).getIntersectingRegions(Arrays.asList(regions.toArray(new ProtectedRegion[1]))); + 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; + } + + + // on vérifie si le joueur peut payer + double actual_money = EssentialsInterface.getPlayerMoney(player_cubo); + + int volume_actuel_cubo = getPlayerActualBlockCount(player_cubo, selection.getWorld()); + int volume_apres_cubo = volume_actuel_cubo + cubo.volume(); + double prix_actuel_cubo = getVolumePrice(volume_actuel_cubo); + double prix_apres_cubo = 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); + 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(); + + + return true; + + + + } + + + + + + + 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 (hasStaffPermission(player) && args.length >= 3) + player_cubo = args[2]; + + + List cubos = 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 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 = getPlayerActualBlockCount(proprio_cubo, player.getWorld()); + int new_volume_cubo = actu_volume_cubo - inside_cubo.volume(); + double money_win = getVolumePrice(actu_volume_cubo) - 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"); + + + return true; + } + + + + + 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()) && !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-azA-Z_]{2,16}")) + { + 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"); + + 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()) && !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-azA-Z_]{2,16}")) + { + 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"); + + + return true; + } + + + + + if (args[0].equalsIgnoreCase("donner") && 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()) && !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.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()); + player.sendMessage(player.getDisplayName()+ChatColor.GREEN+" viens de vous donner la parcelle "+ChatColor.GRAY+inside_cubo.getId()); + + + return true; + } + + + + + + // on arrive ici si aucune des sous commandes correspond à celle tapée + sender.sendMessage(ChatColor.RED+"Mauvaise utilisation de la commande "+ChatColor.GRAY+"/cubo"+ChatColor.RED+". Faites "+ChatColor.GRAY+"/cubo"+ChatColor.RED+" pour connaitre l'utilisation"); + return false; + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + public void showHelp(CommandSender sender) { + + String[] messages = null; + if ((sender instanceof Player) && hasStaffPermission((Player)sender)) + { // pour le staff connecté + String[] m = { + ChatColor.GOLD+"----- Assistant de protection en Survie -----", + ChatColor.GRAY+"/cubo devis [Pseudo]"+ChatColor.GOLD+" pour calculer le prix du cubo et estimer sa faisabilité. Précisez le pseudo si ce n'est pas pour vous", + ChatColor.GRAY+"/cubo creer [Pseudo]"+ChatColor.GOLD+" pour créer le cubo. Précisez le pseudo si ce n'est pas pour vous", + ChatColor.GRAY+"/cubo info"+ChatColor.GOLD+" pour afficher les infos du cubo dans lequel vous êtes", + ChatColor.GRAY+"/cubo selectionner"+ChatColor.GOLD+" pour faire une sélection WorldEdit du cubo dans lequel vous êtes", + 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 donner "+ChatColor.GOLD+" pour donner le cubo dans lequel vous êtes à un joueur", + ChatColor.GOLD+"------------------------------------------" + }; + messages = m; + } + else if (sender instanceof Player) + { // pour les joueurs + String[] m = { + ChatColor.GOLD+"----- Assistant de protection en Survie -----", + ChatColor.GRAY+"/cubo devis"+ChatColor.GOLD+" pour calculer le prix du cubo et estimer sa faisabilité", + ChatColor.GRAY+"/cubo creer "+ChatColor.GOLD+" pour créer le cubo si il est faisable.", + ChatColor.GRAY+"/cubo info"+ChatColor.GOLD+" pour afficher les infos du cubo dans lequel vous êtes", + ChatColor.GRAY+"/cubo selectionner"+ChatColor.GOLD+" pour faire une sélection WorldEdit du cubo dans lequel vous êtes", + 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 donner "+ChatColor.GOLD+" pour donner le cubo dans lequel vous êtes à un joueur", + ChatColor.GOLD+"------------------------------------------" + }; + messages = m; + } + else + { // pour la console et le reste (pas les joueurs) + String[] m = { + ChatColor.GOLD+"----- Assistant de protection en Survie -----", + ChatColor.GOLD+"Vous devez être connecté pour exécuter les commandes de cubo", + ChatColor.GOLD+"---------------------------------------------" + }; + messages = m; + } + sender.sendMessage(messages); + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /** + * @param p le joueur + * @param w le monde + * @return tout les cubos d'un joueur donné sur un monde donné + */ + public List getPlayerCubo(Player p, World w) { + return getPlayerCubo(p.getName(), w); + } + + + /** + * @param p le pseudo du joueur + * @param w le monde + * @return tout les cubos d'un joueur donné sur un monde donné + */ + public List getPlayerCubo(String p, World w) { + + Map regions = wgPlugin.getRegionManager(w).getRegions(); + List playerRegions = new ArrayList(); + + for (Map.Entry region : regions.entrySet()) { + // on ne prend en charge que les cuboides + if (!(region instanceof ProtectedCuboidRegion)) + continue; + // on garde les régions gérés par la commande + if (!region.getKey().matches(regex_cubo_id)) + continue; + + if (!region.getValue().isOwner(p)) + continue; + playerRegions.add((ProtectedCuboidRegion)region.getValue()); + } + return playerRegions; + } + + /** + * + * @param p le joueur + * @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) { + return getPlayerActualBlockCount(p.getName(), w); + } + + /** + * + * @param p le joueur + * @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(); + } + return nb; + } + + /** + * + * @param nb le volume + * @return le prix pour le volume donné + */ + public double getVolumePrice(int nb) { + if (nb <= 2000) + return 0; + + if (nb<= 100000) + return nb-2000D; + + return Math.pow(((nb-2000D)/98000D),1.5)*98000; + } + + + + public boolean hasStaffPermission(Player p) { + return p.hasPermission("pandacraft.cubo.staff"); + } + + +} diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/survival_cuboid/CommandWandSelection.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/survival_cuboid/CommandWandSelection.java index 01c0e03..fd8988a 100644 --- a/src/net/mc_pandacraft/java/plugin/pandacraftutils/survival_cuboid/CommandWandSelection.java +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/survival_cuboid/CommandWandSelection.java @@ -7,6 +7,7 @@ import java.util.Map; import java.util.Map.Entry; import net.mc_pandacraft.java.plugin.pandacraftutils.PandacraftUtils; +import net.mc_pandacraft.java.plugin.pandacraftutils.plugin_interface.WorldEditInterface; import net.mc_pandacraft.java.util.bukkit.protocol.ParticleEffect; import org.bukkit.ChatColor; @@ -21,9 +22,7 @@ import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.scheduler.BukkitRunnable; -import com.sk89q.worldedit.bukkit.WorldEditPlugin; import com.sk89q.worldedit.bukkit.selections.CuboidSelection; -import com.sk89q.worldedit.bukkit.selections.Selection; public class CommandWandSelection extends BukkitRunnable implements CommandExecutor, Listener { @@ -151,7 +150,7 @@ public class CommandWandSelection extends BukkitRunnable implements CommandExecu if (p == null || !p.isOnline()) continue; - CuboidSelection cubo = getPlayerCuboSelection(p); + CuboidSelection cubo = WorldEditInterface.getPlayerCuboSelection(p); // le joueur doit être dans le même monde que sa propre sélection if (cubo != null && cubo.getWorld() == p.getWorld()) @@ -163,7 +162,7 @@ public class CommandWandSelection extends BukkitRunnable implements CommandExecu for (Player po : pl.getValue()){ if (po == null || !po.isOnline()) continue; - cubo = getPlayerCuboSelection(po); + cubo = WorldEditInterface.getPlayerCuboSelection(po); if (cubo != null && cubo.getWorld() == p.getWorld()) drawCuboid(cubo, p, false); @@ -180,19 +179,6 @@ public class CommandWandSelection extends BukkitRunnable implements CommandExecu - private CuboidSelection getPlayerCuboSelection(Player p) { - WorldEditPlugin wePlugin = (WorldEditPlugin) plugin.getServer().getPluginManager().getPlugin("WorldEdit"); - if (wePlugin == null) return null; - Selection sel = wePlugin.getSelection(p); - if (sel == null) return null; - // on garde que les cuboïdes (pas les autres formes) - if (!(sel instanceof CuboidSelection)) - return null; - return (CuboidSelection) sel; - - } - - private void drawCuboid(CuboidSelection cubo, Player p, boolean self) {