Check in witch region a player is (No WorldGuard)

Discussion in 'Spigot Plugin Development' started by ItsChristian, May 29, 2017.

  1. How can I create regions and check in what region the player is via command.

    Have this so far (But with many regions it gets laggy)

    Code (Text):
    package me.christian.MTRM.settings;

    import java.io.File;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.UUID;

    import org.bukkit.Bukkit;
    import org.bukkit.GameMode;
    import org.bukkit.Location;
    import org.bukkit.Material;
    import org.bukkit.OfflinePlayer;
    import org.bukkit.configuration.file.FileConfiguration;
    import org.bukkit.configuration.file.YamlConfiguration;
    import org.bukkit.entity.Player;
    import org.bukkit.material.Door;

    import me.christian.MTRM.settings.plotSettings.Permission;

    public class plotData {

        public static void set(int PlotNummer, Location l1, Location l2) {
            File plotData = new File(
                    Bukkit.getServer().getPluginManager().getPlugin("MineTopia_Region_Manager").getDataFolder(),
                    File.separator + "Plots");
            File f = new File(plotData, File.separator + "Plot " + PlotNummer + ".yml");
            FileConfiguration PlotData = YamlConfiguration.loadConfiguration(f);

            PlotData.set("Plot", null);
            PlotData.set("subPlot", null);

            PlotData.set("Plot." + 1 + ".x1", l1.getBlockX());
            PlotData.set("Plot." + 1 + ".z1", l1.getBlockZ());
            PlotData.set("Plot." + 1 + ".x2", l2.getBlockX());
            PlotData.set("Plot." + 1 + ".z2", l2.getBlockZ());

            try {
                PlotData.save(f);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        public static void add(int PlotNummer, Location l1, Location l2) {
            File plotData = new File(
                    Bukkit.getServer().getPluginManager().getPlugin("MineTopia_Region_Manager").getDataFolder(),
                    File.separator + "Plots");
            File f = new File(plotData, File.separator + "Plot " + PlotNummer + ".yml");
            FileConfiguration PlotData = YamlConfiguration.loadConfiguration(f);

            int i = 1;
            boolean can = false;

            while (!can) {
                if (PlotData.contains("Plot." + i))
                    i++;
                else
                    can = true;
            }

            PlotData.set("Plot." + i + ".x1", l1.getBlockX());
            PlotData.set("Plot." + i + ".z1", l1.getBlockZ());
            PlotData.set("Plot." + i + ".x2", l2.getBlockX());
            PlotData.set("Plot." + i + ".z2", l2.getBlockZ());

            try {
                PlotData.save(f);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        public static void setSub(int PlotNummer, int subNummer, Location l1, Location l2) {
            File plotData = new File(
                    Bukkit.getServer().getPluginManager().getPlugin("MineTopia_Region_Manager").getDataFolder(),
                    File.separator + "Plots");
            File f = new File(plotData, File.separator + "Plot " + PlotNummer + ".yml");
            FileConfiguration PlotData = YamlConfiguration.loadConfiguration(f);

            PlotData.set("subPlot." + subNummer, null);

            PlotData.set("subPlot." + subNummer + "." + 1 + ".x1", l1.getBlockX());
            PlotData.set("subPlot." + subNummer + "." + 1 + ".y1", l1.getBlockY());
            PlotData.set("subPlot." + subNummer + "." + 1 + ".z1", l1.getBlockZ());
            PlotData.set("subPlot." + subNummer + "." + 1 + ".x2", l2.getBlockX());
            PlotData.set("subPlot." + subNummer + "." + 1 + ".y2", l2.getBlockY());
            PlotData.set("subPlot." + subNummer + "." + 1 + ".z2", l2.getBlockZ());

            try {
                PlotData.save(f);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        public static void addSub(int PlotNummer, int subNummer, Location l1, Location l2) {
            File plotData = new File(
                    Bukkit.getServer().getPluginManager().getPlugin("MineTopia_Region_Manager").getDataFolder(),
                    File.separator + "Plots");
            File f = new File(plotData, File.separator + "Plot " + PlotNummer + ".yml");
            FileConfiguration PlotData = YamlConfiguration.loadConfiguration(f);

            int i = 1;
            boolean can = false;

            while (!can) {
                if (PlotData.contains("subPlot." + i))
                    i++;
                else
                    can = true;
            }

            PlotData.set("subPlot." + subNummer + "." + i + ".x1", l1.getBlockX());
            PlotData.set("subPlot." + subNummer + "." + i + ".y1", l1.getBlockY());
            PlotData.set("subPlot." + subNummer + "." + i + ".z1", l1.getBlockZ());
            PlotData.set("subPlot." + subNummer + "." + i + ".x2", l2.getBlockX());
            PlotData.set("subPlot." + subNummer + "." + i + ".y2", l2.getBlockY());
            PlotData.set("subPlot." + subNummer + "." + i + ".z2", l2.getBlockZ());

            try {
                PlotData.save(f);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        public static int getNummer(Location loc) {
            int results = 0;

            File plotData = new File(
                    Bukkit.getServer().getPluginManager().getPlugin("MineTopia_Region_Manager").getDataFolder(),
                    File.separator + "Plots");

            File[] files = new File(plotData, File.separator).listFiles();

            if (files == null)
                return results;

            for (File file : files) {
                if (file.isFile()) {
                    setNew(file);
                    if (onPlot(file, loc))
                        results = Integer.parseInt(file.getName().replaceAll(".yml", "").replaceAll("Plot ", ""));
                }
            }

            return results;
        }

        private static boolean onPlot(File file, Location loc) {
            FileConfiguration plot = YamlConfiguration.loadConfiguration(file);
            for (int i = 1; plot.contains("Plot." + i + ".x1"); i++)
                if ((plot.getInt("Plot." + i + ".x1") <= loc.getBlockX()
                        && plot.getInt("Plot." + i + ".z1") <= loc.getBlockZ())
                        && (plot.getInt("Plot." + i + ".x2") >= loc.getBlockX()
                                && plot.getInt("Plot." + i + ".z2") >= loc.getBlockZ()))
                    return true;
            return false;
        }

        public static int getSubNummer(Location loc) {
            File plotData = new File(
                    Bukkit.getServer().getPluginManager().getPlugin("MineTopia_Region_Manager").getDataFolder(),
                    File.separator + "Plots");
            File file = new File(plotData, File.separator + "Plot " + getNummer(loc) + ".yml");
            FileConfiguration plot = YamlConfiguration.loadConfiguration(file);

            int results = 0;

            for (int i = 1; plot.contains("subPlot." + i); i++)
                for (int j = 1; plot.contains("subPlot." + i + "." + j); j++)
                    if ((plot.getInt("subPlot." + i + "." + j + ".x1") <= loc.getBlockX()
                            && plot.getInt("subPlot." + i + "." + j + ".y1") <= loc.getBlockY()
                            && plot.getInt("subPlot." + i + "." + j + ".z1") <= loc.getBlockZ())
                            && (plot.getInt("subPlot." + i + "." + j + ".x2") >= loc.getBlockX()
                                    && plot.getInt("subPlot." + i + "." + j + ".y2") >= loc.getBlockY()
                                    && plot.getInt("subPlot." + i + "." + j + ".z2") >= loc.getBlockZ()))
                        results = i;
            return results;
        }

        public static boolean isPlot(Location loc) {
            if (getNummer(loc) == 0)
                return false;
            return true;
        }

        public static OfflinePlayer getOwner(Location loc) {
            File plotData = new File(
                    Bukkit.getServer().getPluginManager().getPlugin("MineTopia_Region_Manager").getDataFolder(),
                    File.separator + "Plots");
            File f = new File(plotData, File.separator + "Plot " + getNummer(loc) + ".yml");
            FileConfiguration PlotData = YamlConfiguration.loadConfiguration(f);

            if (getSubNummer(loc) == 0) {
                if (PlotData.get("Plot.Eigenaar") == null)
                    return null;

                return Bukkit.getOfflinePlayer(UUID.fromString(PlotData.getString("Plot.Eigenaar")));
            } else {
                if (PlotData.get("subPlot." + getSubNummer(loc) + ".Eigenaar") == null)
                    return null;

                return Bukkit.getOfflinePlayer(
                        UUID.fromString(PlotData.getString("subPlot." + getSubNummer(loc) + ".Eigenaar")));
            }
        }

        public static List<OfflinePlayer> getMembers(Location loc) {
            File plotData = new File(
                    Bukkit.getServer().getPluginManager().getPlugin("MineTopia_Region_Manager").getDataFolder(),
                    File.separator + "Plots");
            File f = new File(plotData, File.separator + "Plot " + getNummer(loc) + ".yml");
            FileConfiguration PlotData = YamlConfiguration.loadConfiguration(f);

            List<OfflinePlayer> members = new ArrayList<OfflinePlayer>();

            if (getSubNummer(loc) == 0) {
                if (PlotData.getStringList("Plot.MedeEigenaren") == null)
                    return members;

                for (String player : PlotData.getStringList("Plot.MedeEigenaren"))
                    members.add(Bukkit.getOfflinePlayer(UUID.fromString(player)));
            } else {
                if (PlotData.getStringList("subPlot." + getSubNummer(loc) + ".MedeEigenaren") == null)
                    return members;

                for (String player : PlotData.getStringList("subPlot." + getSubNummer(loc) + ".MedeEigenaren"))
                    members.add(Bukkit.getOfflinePlayer(UUID.fromString(player)));
            }

            return members;
        }

        public static void setOwner(Location loc, OfflinePlayer player) {
            File plotData = new File(
                    Bukkit.getServer().getPluginManager().getPlugin("MineTopia_Region_Manager").getDataFolder(),
                    File.separator + "Plots");
            File f = new File(plotData, File.separator + "Plot " + getNummer(loc) + ".yml");
            FileConfiguration PlotData = YamlConfiguration.loadConfiguration(f);

            if (getSubNummer(loc) == 0)
                PlotData.set("Plot.Eigenaar", player.getUniqueId().toString());
            else
                PlotData.set("subPlot." + getSubNummer(loc) + ".Eigenaar", player.getUniqueId().toString());

            try {
                PlotData.save(f);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        public static void setOwner(Location loc) {
            File plotData = new File(
                    Bukkit.getServer().getPluginManager().getPlugin("MineTopia_Region_Manager").getDataFolder(),
                    File.separator + "Plots");
            File f = new File(plotData, File.separator + "Plot " + getNummer(loc) + ".yml");
            FileConfiguration PlotData = YamlConfiguration.loadConfiguration(f);

            if (getSubNummer(loc) == 0)
                PlotData.set("Plot.Eigenaar", null);
            else
                PlotData.set("subPlot." + getSubNummer(loc) + ".Eigenaar", null);

            try {
                PlotData.save(f);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        public static void addMember(Location loc, OfflinePlayer player) {
            File plotData = new File(
                    Bukkit.getServer().getPluginManager().getPlugin("MineTopia_Region_Manager").getDataFolder(),
                    File.separator + "Plots");
            File f = new File(plotData, File.separator + "Plot " + getNummer(loc) + ".yml");
            FileConfiguration PlotData = YamlConfiguration.loadConfiguration(f);

            List<String> members = new ArrayList<String>();
            if (getSubNummer(loc) == 0) {
                for (String pl : PlotData.getStringList("Plot.MedeEigenaren"))
                    members.add(Bukkit.getOfflinePlayer(UUID.fromString(pl)).getUniqueId().toString());

                members.add(player.getUniqueId().toString());

                PlotData.set("Plot.MedeEigenaren", members);
            } else {
                for (String pl : PlotData.getStringList("subPlot.MedeEigenaren"))
                    members.add(Bukkit.getOfflinePlayer(UUID.fromString(pl)).getUniqueId().toString());

                members.add(player.getUniqueId().toString());

                PlotData.set("subPlot." + getSubNummer(loc) + ".MedeEigenaren", members);
            }
            try {
                PlotData.save(f);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        public static void removeMember(Location loc, OfflinePlayer player) {
            File plotData = new File(
                    Bukkit.getServer().getPluginManager().getPlugin("MineTopia_Region_Manager").getDataFolder(),
                    File.separator + "Plots");
            File f = new File(plotData, File.separator + "Plot " + getNummer(loc) + ".yml");
            FileConfiguration PlotData = YamlConfiguration.loadConfiguration(f);

            List<String> members = new ArrayList<String>();

            if (getSubNummer(loc) == 0) {
                for (String pl : PlotData.getStringList("Plot.MedeEigenaren"))
                    members.add(Bukkit.getOfflinePlayer(UUID.fromString(pl)).getUniqueId().toString());

                members.remove(player.getUniqueId().toString());

                PlotData.set("Plot.MedeEigenaren", members);
            } else {
                for (String pl : PlotData.getStringList("subPlot." + getSubNummer(loc) + ".MedeEigenaren"))
                    members.add(Bukkit.getOfflinePlayer(UUID.fromString(pl)).getUniqueId().toString());

                members.remove(player.getUniqueId().toString());

                PlotData.set("subPlot." + getSubNummer(loc) + ".MedeEigenaren", members);
            }

            try {
                PlotData.save(f);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        public static boolean canDo(Location loc, Player player, Material mat) {
            if (player.isOp() && player.getGameMode().equals(GameMode.CREATIVE))
                return true;

            if (getNummer(loc) == 0)
                return true;

            if (getOwner(loc) == null)
                return false;
           
            Material[] Blacklist = { Material.TRAP_DOOR, Material.IRON_TRAPDOOR, Material.TRAPPED_CHEST,
                    Material.STONE_BUTTON, Material.WOOD_BUTTON, Material.LEVER, Material.ACACIA_DOOR, Material.BIRCH_DOOR,
                    Material.DARK_OAK_DOOR, Material.JUNGLE_DOOR, Material.SPRUCE_DOOR, Material.FENCE_GATE,
                    Material.BIRCH_FENCE_GATE, Material.DARK_OAK_FENCE_GATE, Material.JUNGLE_FENCE_GATE,
                    Material.SPRUCE_FENCE_GATE, Material.CHEST, Material.HOPPER };

            boolean black = false;
            for (Material m : Blacklist)
                if (m.equals(mat))
                    black = true;

            if (!black)
                return true;

            if (loc.getBlock().getState().getData() instanceof Door) {
                Door door = (Door) loc.getBlock().getState().getData();

                if (door.isTopHalf())
                    loc.add(0, -1, 0);
            }

            if (plotSettings.getPermission(loc).equals(Permission.Iedereen))
                return true;

            if (plotSettings.getPermission(loc).equals(Permission.Member)
                    && (getOwner(loc).equals(player) || getMembers(loc).contains(player)))
                return true;

            if (plotSettings.getPermission(loc).equals(Permission.Owner) && getOwner(loc).equals(player))
                return true;

            return false;
        }

        public static boolean canDo(Location loc, Player player) {
            if (player.isOp())
                return true;

            if (getNummer(loc) == 0)
                return true;

            if (getOwner(loc) == null)
                return false;

            if (getMembers(loc).contains(player) || getOwner(loc).equals(player))
                return true;

            return false;
        }

        public static void setBlock(Location loc, Material mat, Permission perm) {
            File Data = new File(
                    Bukkit.getServer().getPluginManager().getPlugin("MineTopia_Region_Manager").getDataFolder(),
                    File.separator + "BlockConfig");
            File f = new File(Data, File.separator + "Plot " + getNummer(loc) + ".yml");
            FileConfiguration PlotData = YamlConfiguration.loadConfiguration(f);

            int i = 0;
            for (i++; PlotData.contains(i + ""); i++) {
                if (PlotData.getInt(i + ".x") == loc.getBlockX() && PlotData.getInt(i + ".z") == loc.getBlockZ()
                        && PlotData.getInt(i + ".z") == loc.getBlockZ()) {
                    PlotData.set(i + ".Perm", perm.toString());

                    try {
                        PlotData.save(f);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    return;
                }
            }
            PlotData.set(i + ".x", loc.getBlockX());
            PlotData.set(i + ".y", loc.getBlockY());
            PlotData.set(i + ".z", loc.getBlockZ());
            PlotData.set(i + ".Type", mat.toString());
            PlotData.set(i + ".Perm", perm.toString());

            try {
                PlotData.save(f);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        public static void removeBlock(Location loc, Material mat) {
            File plotData = new File(
                    Bukkit.getServer().getPluginManager().getPlugin("MineTopia_Region_Manager").getDataFolder(),
                    File.separator + "BlockConfig");
            File f = new File(plotData, File.separator + "Plot " + getNummer(loc) + ".yml");
            FileConfiguration PlotData = YamlConfiguration.loadConfiguration(f);

            int x = loc.getBlockX();
            int y = loc.getBlockY();
            int z = loc.getBlockZ();

            if (loc.getBlock().getState().getData() instanceof Door) {
                Door door = (Door) loc.getBlock().getState().getData();

                if (door.isTopHalf())
                    loc.add(0, -1, 0);
            }

            for (int i = 1; PlotData.contains(i + ""); i++)
                if (PlotData.getInt(i + ".x") == x && PlotData.getInt(i + ".y") == y && PlotData.getInt(i + ".z") == z)
                    PlotData.set(i + "", null);

            try {
                PlotData.save(f);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        public static boolean isBlock(Location Plotloc) {
            File plotData = new File(
                    Bukkit.getServer().getPluginManager().getPlugin("MineTopia_Region_Manager").getDataFolder(),
                    File.separator + "BlockConfig");
            File f = new File(plotData, File.separator + "Plot " + getNummer(Plotloc) + ".yml");
            FileConfiguration PlotData = YamlConfiguration.loadConfiguration(f);

            boolean is = false;

            for (int i = 1; PlotData.contains(i + ""); i++) {
                int x = PlotData.getInt(i + ".x");
                int y = PlotData.getInt(i + ".y");
                int z = PlotData.getInt(i + ".z");

                if (PlotData.getInt(i + ".x") == x && PlotData.getInt(i + ".y") == y && PlotData.getInt(i + ".z") == z) {
                    is = true;
                    break;
                }
            }

            return is;
        }

        public static void setNew(File file) {
            FileConfiguration PlotData = YamlConfiguration.loadConfiguration(file);
            int j = 1;

            for (int i = 1; PlotData.contains("Plot.loc" + i + ".x"); i += 2, j++) {
                PlotData.set("Plot." + j + ".x1", PlotData.getInt("Plot.loc" + i + ".x"));
                PlotData.set("Plot." + j + ".z1", PlotData.getInt("Plot.loc" + i + ".z"));
                PlotData.set("Plot." + j + ".x2", PlotData.getInt("Plot.loc" + (i + 1) + ".x"));
                PlotData.set("Plot." + j + ".z2", PlotData.getInt("Plot.loc" + (i + 1) + ".z"));

                PlotData.set("Plot.loc" + i, null);
                PlotData.set("Plot.loc" + (i + 1), null);
            }

            try {
                PlotData.save(file);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
     
     
  2. ScarabCoder

    ScarabCoder Retired Resource Staff
    Retired

    That's kind of a lot of code to read through, but assuming you want to know if one location is inside two others:

    Code (Text):
    Location loc;
    Location l1;
    Location l2;

    //Get the minimum and maximum axises
    int x1 = Math.min(l1.getX(), l2.getX());
    int y1 = Math.min(l1.getY(), l2.getY());
    int z1 = Math.min(l1.getZ(), l2.getZ());

    int x2 = Math.max(l1.getX(), l2.getX());
    int y2 = Math.max(l1.getY(), l2.getY());
    int z2 = Math.max(l1.getZ(), l2.getZ());

    if(loc.getX() >= x1 && loc.getX() <= x2 &&
        loc.getY() >= y1 && loc.getY() <= y2 &&
        loc.getZ() >= z1 && loc.getZ() <= z2){
            //Inside
    }
     
  3. Yes but then a no laggy way to go trough more then 100 regions to test if you are in one of them.
     
  4. ScarabCoder

    ScarabCoder Retired Resource Staff
    Retired

    Even with many locations, it shouldn't cause lag by itself. Maybe you can tell me what you're trying to do if the player is in the location, and when you're checking?

    You could give each region a list of players that are in it, then update the list on PlayerMoveEvent if they move in or out (event.getTo, event.getFrom).
     
  5. I'll check the code 100 Times because I made it like a year ago so it could be totely wrong