From fd1c7c5c14650808391cbb5730d7542c37809113 Mon Sep 17 00:00:00 2001 From: SuperRonanCraft Date: Wed, 12 Aug 2020 13:35:47 -0400 Subject: [PATCH] 2.12.1 - Chunk async support on older servers Reason for this change is that in previous versions on MC the spigot api would load a chunk prior to finding the tallest block in the world. So a full recode on the random location has been issued, first generating a random x/z coordinates, then loading that locations chunk, grabbing the tallest block making sure its a valid block, and then checking for griefprevention/worldguard, and then teleporting the player if its valid, else loop again until it finds a valid location, or cancel if there are too many attempts. --- pom.xml | 2 +- .../player/commands/types/CmdInfo.java | 4 +- .../BetterRTP/player/rtp/RTP.java | 289 +++++++++--------- .../BetterRTP/player/rtp/RTPDelay.java | 3 +- .../BetterRTP/references/worlds/Custom.java | 23 +- .../BetterRTP/references/worlds/Default.java | 3 +- .../references/worlds/PlayerWorld.java | 74 ++++- .../BetterRTP/references/worlds/RTPWorld.java | 4 +- src/main/resources/plugin.yml | 2 +- 9 files changed, 244 insertions(+), 160 deletions(-) diff --git a/pom.xml b/pom.xml index 66d46dc..470a97a 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ me.SuperRonanCraft BetterRTP - 2.12.0 + 2.12.1 1.8 diff --git a/src/main/java/me/SuperRonanCraft/BetterRTP/player/commands/types/CmdInfo.java b/src/main/java/me/SuperRonanCraft/BetterRTP/player/commands/types/CmdInfo.java index 9687005..aaf0324 100644 --- a/src/main/java/me/SuperRonanCraft/BetterRTP/player/commands/types/CmdInfo.java +++ b/src/main/java/me/SuperRonanCraft/BetterRTP/player/commands/types/CmdInfo.java @@ -86,14 +86,14 @@ public class CmdInfo implements RTPCommand { else { info.add("&7- &6WorldType: &f" + pl.getRTP().world_type.getOrDefault(w.getName(), RTP_WORLD_TYPE.NORMAL).name()); info.add("&7- &6Overriden: &cFalse"); - RTPWorld _rtpworld = pl.getRTP().Default; + RTPWorld _rtpworld = pl.getRTP().defaultWorld; for (RTPWorld __rtpworld : pl.getRTP().customWorlds.values()) { if (__rtpworld.getWorld().equals(w.getName())) { _rtpworld = __rtpworld; break; } } - if (_rtpworld == pl.getRTP().Default) + if (_rtpworld == pl.getRTP().defaultWorld) info.add("&7- &6Custom: &cFalse"); else info.add("&7- &6Custom: &bTrue"); diff --git a/src/main/java/me/SuperRonanCraft/BetterRTP/player/rtp/RTP.java b/src/main/java/me/SuperRonanCraft/BetterRTP/player/rtp/RTP.java index 4b64694..b70e150 100644 --- a/src/main/java/me/SuperRonanCraft/BetterRTP/player/rtp/RTP.java +++ b/src/main/java/me/SuperRonanCraft/BetterRTP/player/rtp/RTP.java @@ -4,14 +4,12 @@ import com.sk89q.worldguard.bukkit.RegionContainer; import com.sk89q.worldguard.bukkit.WGBukkit; import com.sk89q.worldguard.bukkit.WorldGuardPlugin; import com.sk89q.worldguard.protection.managers.RegionManager; +import io.papermc.lib.PaperLib; import me.SuperRonanCraft.BetterRTP.Main; import me.SuperRonanCraft.BetterRTP.references.file.FileBasics; import me.SuperRonanCraft.BetterRTP.references.worlds.*; import me.ryanhamshire.GriefPrevention.GriefPrevention; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.World; -import org.bukkit.WorldBorder; +import org.bukkit.*; import org.bukkit.block.Block; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -21,6 +19,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Random; +import java.util.concurrent.CompletableFuture; public class RTP { @@ -28,7 +27,7 @@ public class RTP { //Cache public HashMap customWorlds = new HashMap<>(); public HashMap overriden = new HashMap<>(); - public Default Default = new Default(); + public Default defaultWorld = new Default(); private Random rn = new Random(); private List disabledWorlds, blockList; private int maxAttempts, delayTime; @@ -40,7 +39,7 @@ public class RTP { } public void load() { - Default.setup(); + defaultWorld.setup(); FileBasics.FILETYPE config = getPl().getFiles().getType(FileBasics.FILETYPE.CONFIG); disabledWorlds = config.getStringList("DisabledWorlds"); maxAttempts = config.getInt("Settings.MaxAttempts"); @@ -122,38 +121,42 @@ public class RTP { return disabledWorlds; } - public void start(Player p, CommandSender sendi, String worl, List biomes, boolean delay) { + public void start(Player p, CommandSender sendi, String worldName, List biomes, boolean delay) { // Check overrides - String world = worl; - if (world == null) - world = p.getWorld().getName(); - if (overriden.containsKey(world)) - world = overriden.get(world); + if (worldName == null) + worldName = p.getWorld().getName(); + if (overriden.containsKey(worldName)) + worldName = overriden.get(worldName); // Not forced and has 'betterrtp.world.' - if (sendi == p && !getPl().getPerms().getAWorld(sendi, world)) { + if (sendi == p && !getPl().getPerms().getAWorld(sendi, worldName)) { getPl().getCmd().cooldowns.remove(p.getUniqueId()); - getPl().getText().getNoPermissionWorld(p, world); + getPl().getText().getNoPermissionWorld(p, worldName); return; } // Check disabled worlds - if (disabledWorlds.contains(world)) { - getPl().getText().getDisabledWorld(sendi, world); + if (disabledWorlds.contains(worldName)) { + getPl().getText().getDisabledWorld(sendi, worldName); getPl().getCmd().cooldowns.remove(p.getUniqueId()); return; } - // Check if nulled - if (Bukkit.getWorld(world) == null) { - getPl().getText().getNotExist(sendi, world); + // Check if nulled or world doesnt exist + if (Bukkit.getWorld(worldName) == null) { + getPl().getText().getNotExist(sendi, worldName); getPl().getCmd().cooldowns.remove(p.getUniqueId()); return; } - PlayerWorld pWorld = new PlayerWorld(p, world); + PlayerWorld pWorld = new PlayerWorld(p, Bukkit.getWorld(worldName)); // Set all methods - if (customWorlds.containsKey(world)) { - RTPWorld cWorld = customWorlds.get(pWorld.getWorld()); + if (customWorlds.containsKey(worldName)) { + RTPWorld cWorld = customWorlds.get(pWorld.getWorld().getName()); pWorld.setup(cWorld, cWorld.getPrice(), biomes); } else - pWorld.setup(Default, Default.getPrice(), biomes); + pWorld.setup(defaultWorld, defaultWorld.getPrice(), biomes); + //World type + RTP_WORLD_TYPE world_type = RTP_WORLD_TYPE.NORMAL; //World rtp type + if (this.world_type.containsKey(worldName)) + world_type = this.world_type.get(worldName); + pWorld.setWorldtype(world_type); // Check world price if (!getPl().getEco().charge(p, pWorld.getPrice())) { getPl().getText().getFailedPrice(p, pWorld.getPrice()); @@ -165,20 +168,45 @@ public class RTP { if (getPl().getSettings().delayEnabled && delay) { new RTPDelay(sendi, pWorld, delayTime, cancelOnMove, cancelOnDamage); } else - tp(sendi, pWorld); + findSafeLocation(sendi, pWorld); } - void tp(CommandSender sendi, PlayerWorld pWorld) { - new BukkitRunnable(){ - @Override - public void run() { - Location loc = randomLoc(pWorld); - if (loc != null) - teleport.sendPlayer(sendi, pWorld.getPlayer(), loc, pWorld.getPrice(), pWorld.getAttempts()); +// void findSafeLocation(CommandSender sendi, PlayerWorld pWorld) { +// new BukkitRunnable(){ +// @Override +// public void run() { +// f +// if (loc != null) +// teleport.sendPlayer(sendi, pWorld.getPlayer(), loc, pWorld.getPrice(), pWorld.getAttempts()); +// else +// metMax(sendi, pWorld.getPlayer(), pWorld.getPrice()); +// } +// }.runTaskAsynchronously(getPl()); +// } + + void findSafeLocation(CommandSender sendi, PlayerWorld pWorld) { + if (pWorld.getAttempts() >= maxAttempts) //Cancel out, too many tried + metMax(sendi, pWorld.getPlayer(), pWorld.getPrice()); + else { //Try again to find a safe location + Location loc = pWorld.generateRandomXZ(defaultWorld, rn.nextInt(4)); //randomLoc(pWorld); + CompletableFuture chunk = PaperLib.getChunkAtAsync(pWorld.getWorld(), loc.getBlockX(), loc.getBlockZ()); + chunk.thenAccept(result -> { + Location tpLoc; + float yaw = pWorld.getPlayer().getLocation().getYaw(); + float pitch = pWorld.getPlayer().getLocation().getPitch(); + switch (pWorld.getWorldtype()) { //Get a Y position and check for bad blocks + case NETHER: + tpLoc = getLocAtNether(loc.getBlockX(), loc.getBlockZ(), pWorld.getWorld(), yaw, pitch, pWorld); break; + case NORMAL: + default: + tpLoc = getLocAtNormal(loc.getBlockX(), loc.getBlockZ(), pWorld.getWorld(), yaw, pitch, pWorld); + } + if (tpLoc != null && checkDepends(tpLoc)) + teleport.sendPlayer(sendi, pWorld.getPlayer(), tpLoc, pWorld.getPrice(), pWorld.getAttempts()); else - metMax(sendi, pWorld.getPlayer(), pWorld.getPrice()); - } - }.runTaskAsynchronously(getPl()); + findSafeLocation(sendi, pWorld); + }); + } } // Compressed code for MaxAttempts being met @@ -193,82 +221,69 @@ public class RTP { } //Get a random location depending the world type - private Location randomLoc(PlayerWorld pWorld) { - int borderRad = pWorld.getMaxRad(); - int minVal = pWorld.getMinRad(); - int CenterX = pWorld.getCenterX(); - int CenterZ = pWorld.getCenterZ(); - int quadrant = rn.nextInt(4); - Player p = pWorld.getPlayer(); - World world = Bukkit.getWorld(pWorld.getWorld()); - if (pWorld.getUseWorldborder()) { - WorldBorder border = world.getWorldBorder(); - borderRad = (int) border.getSize() / 2; - CenterX = border.getCenter().getBlockX(); - CenterZ = border.getCenter().getBlockZ(); - } - float yaw = p.getLocation().getYaw(), pitch = p.getLocation().getPitch(); - RTP_WORLD_TYPE world_type = RTP_WORLD_TYPE.NORMAL; //World rtp type - /*try { - //1.13+ - normal = !world.getBiome(0, 0).equals(Biome.valueOf("NETHER"))); - } catch (Exception e) { - //1.8-1.12 - try { - normal = !world.getBiome(0, 0).equals(Biome.valueOf("HELL")); - } catch (Exception e1) { - normal = true; - } - }*/ - if (this.world_type.containsKey(world.getName())) - world_type = this.world_type.get(world.getName()); - for (int i = 0; i <= maxAttempts; i++) { - // Get the y-coords from up top, then check if it's SAFE! - Location loc = null; - if (borderRad <= minVal) { - minVal = Default.getMinRad(); - if (borderRad <= minVal) - minVal = 0; - } - switch (world_type) { - case NETHER: - loc = nether(borderRad, minVal, CenterX, CenterZ, quadrant, world, pWorld, yaw, pitch); break; - default: - loc = normal(borderRad, minVal, CenterX, CenterZ, quadrant, world, pWorld, yaw, pitch); - } - pWorld.addAttempt(); - if (loc != null && checkDepends(loc)) - return loc; - quadrant = rn.nextInt(4); - } - return null; - } - - //NORMAL - private Location normal(int borderRad, int minVal, int CenterX, int CenterZ, int quadrant, World world, - PlayerWorld pWorld, Float yaw, Float pitch) { - int x, x2, z, z2; - Location loc; - // Will Check is CenterZ is negative or positive, then set 2 x's - // up for choosing up next - z = rn.nextInt(borderRad - minVal) + CenterZ + minVal; - z2 = -(rn.nextInt(borderRad - minVal) - CenterZ - minVal); - // Will Check is CenterZ is negative or positive, then set 2 z's - // up for choosing up next - x = rn.nextInt(borderRad - minVal) + CenterX + minVal; - x2 = -rn.nextInt(borderRad - minVal) + CenterX - minVal; - switch (quadrant) { - case 0: // Positive X and Z - loc = getLocAtNormal(x, z, world, yaw, pitch, pWorld); break; - case 1: // Negative X and Z - loc = getLocAtNormal(x2, z2, world, yaw, pitch, pWorld); break; - case 2: // Negative X and Positive Z - loc = getLocAtNormal(x2, z, world, yaw, pitch, pWorld); break; - default: // Positive X and Negative Z - loc = getLocAtNormal(x, z2, world, yaw, pitch, pWorld); - } - return loc; - } +// private Location randomLoc(PlayerWorld pWorld) { +// int borderRad = pWorld.getMaxRad(); +// int minVal = pWorld.getMinRad(); +// int CenterX = pWorld.getCenterX(); +// int CenterZ = pWorld.getCenterZ(); +// int quadrant = rn.nextInt(4); +// Player p = pWorld.getPlayer(); +// World world = pWorld.getWorld(); +// if (pWorld.getUseWorldborder()) { +// WorldBorder border = world.getWorldBorder(); +// borderRad = (int) border.getSize() / 2; +// CenterX = border.getCenter().getBlockX(); +// CenterZ = border.getCenter().getBlockZ(); +// } +// float yaw = p.getLocation().getYaw(), pitch = p.getLocation().getPitch(); +// RTP_WORLD_TYPE world_type = pWorld.getWorldtype(); +// //for (int i = 0; i <= maxAttempts; i++) { +// // Get the y-coords from up top, then check if it's SAFE! +// Location loc = null; +// if (borderRad <= minVal) { +// minVal = defaultWorld.getMinRad(); +// if (borderRad <= minVal) +// minVal = 0; +// } +// switch (world_type) { +// case NETHER: +// loc = nether(borderRad, minVal, CenterX, CenterZ, quadrant, world, pWorld, yaw, pitch); break; +// default: +// loc = normal(borderRad, minVal, CenterX, CenterZ, quadrant, world, pWorld, yaw, pitch); +// } +// pWorld.addAttempt(); +// //if (loc != null && checkDepends(loc)) +// return loc; +// // quadrant = rn.nextInt(4); +// //} +// //return null; +// } +// +// //NORMAL +// private Location normal(int borderRad, int minVal, int CenterX, int CenterZ, int quadrant, World world, +// PlayerWorld pWorld, Float yaw, Float pitch) { +// int x, x2, z, z2; +// Location loc; +// // Will Check is CenterZ is negative or positive, then set 2 x's +// // up for choosing up next +// z = rn.nextInt(borderRad - minVal) + CenterZ + minVal; +// z2 = -(rn.nextInt(borderRad - minVal) - CenterZ - minVal); +// // Will Check is CenterZ is negative or positive, then set 2 z's +// // up for choosing up next +// x = rn.nextInt(borderRad - minVal) + CenterX + minVal; +// x2 = -rn.nextInt(borderRad - minVal) + CenterX - minVal; +// switch (quadrant) { +// case 0: // Positive X and Z +// loc = getLocAtNormal(x, z, world, yaw, pitch, pWorld); break; +// case 1: // Negative X and Z +// loc = getLocAtNormal(x2, z2, world, yaw, pitch, pWorld); break; +// case 2: // Negative X and Positive Z +// loc = getLocAtNormal(x2, z, world, yaw, pitch, pWorld); break; +// default: // Positive X and Negative Z +// loc = getLocAtNormal(x, z2, world, yaw, pitch, pWorld); +// } +// return loc; +// } private Location getLocAtNormal(int x, int z, World world, Float yaw, Float pitch, PlayerWorld pWorld) { Block b = world.getHighestBlockAt(x, z); @@ -287,31 +302,31 @@ public class RTP { return null; } - //NETHER - private Location nether(int borderRad, int minVal, int CenterX, int CenterZ, int quadrant, World world, - PlayerWorld pWorld, Float yaw, Float pitch) { - int x, x2, z, z2; - Location loc; - // Will Check is CenterZ is negative or positive, then set 2 x's - // up for choosing up next - z = rn.nextInt((borderRad) - minVal) + CenterZ + minVal; - z2 = -(rn.nextInt(borderRad - minVal) - CenterZ - minVal); - // Will Check is CenterZ is negative or positive, then set 2 z's - // up for choosing up next - x = rn.nextInt(borderRad - minVal) + CenterX + minVal; - x2 = -rn.nextInt(borderRad - minVal) + CenterX - minVal; - switch (quadrant) { - case 0: // Positive X and Z - loc = getLocAtNether(x, z, world, yaw, pitch, pWorld); break; - case 1: // Negative X and Z - loc = getLocAtNether(x2, z2, world, yaw, pitch, pWorld); break; - case 2: // Negative X and Positive Z - loc = getLocAtNether(x2, z, world, yaw, pitch, pWorld); break; - default: // Positive X and Negative Z - loc = getLocAtNether(x, z2, world, yaw, pitch, pWorld); - } - return loc; - } +// //NETHER +// private Location nether(int borderRad, int minVal, int CenterX, int CenterZ, int quadrant, World world, +// PlayerWorld pWorld, Float yaw, Float pitch) { +// int x, x2, z, z2; +// Location loc; +// // Will Check is CenterZ is negative or positive, then set 2 x's +// // up for choosing up next +// z = rn.nextInt((borderRad) - minVal) + CenterZ + minVal; +// z2 = -(rn.nextInt(borderRad - minVal) - CenterZ - minVal); +// // Will Check is CenterZ is negative or positive, then set 2 z's +// // up for choosing up next +// x = rn.nextInt(borderRad - minVal) + CenterX + minVal; +// x2 = -rn.nextInt(borderRad - minVal) + CenterX - minVal; +// switch (quadrant) { +// case 0: // Positive X and Z +// loc = getLocAtNether(x, z, world, yaw, pitch, pWorld); break; +// case 1: // Negative X and Z +// loc = getLocAtNether(x2, z2, world, yaw, pitch, pWorld); break; +// case 2: // Negative X and Positive Z +// loc = getLocAtNether(x2, z, world, yaw, pitch, pWorld); break; +// default: // Positive X and Negative Z +// loc = getLocAtNether(x, z2, world, yaw, pitch, pWorld); +// } +// return loc; +// } private Location getLocAtNether(int x, int z, World world, Float yaw, Float pitch, PlayerWorld pWorld) { //System.out.println("-----------"); @@ -356,14 +371,14 @@ public class RTP { } // Bad blocks, or bad biome - private boolean badBlock(String block, int x, int z, String world, List biomes) { + private boolean badBlock(String block, int x, int z, World world, List biomes) { for (String currentBlock : blockList) //Check Block if (currentBlock.toUpperCase().equals(block)) return true; //Check Biomes if (biomes == null || biomes.isEmpty()) return false; - String biomeCurrent = Bukkit.getWorld(world).getBiome(x, z).name(); + String biomeCurrent = world.getBiome(x, z).name(); for (String biome : biomes) if (biomeCurrent.toUpperCase().contains(biome.toUpperCase())) return false; diff --git a/src/main/java/me/SuperRonanCraft/BetterRTP/player/rtp/RTPDelay.java b/src/main/java/me/SuperRonanCraft/BetterRTP/player/rtp/RTPDelay.java index 5a13882..cf39783 100644 --- a/src/main/java/me/SuperRonanCraft/BetterRTP/player/rtp/RTPDelay.java +++ b/src/main/java/me/SuperRonanCraft/BetterRTP/player/rtp/RTPDelay.java @@ -3,7 +3,6 @@ package me.SuperRonanCraft.BetterRTP.player.rtp; import me.SuperRonanCraft.BetterRTP.references.worlds.PlayerWorld; import me.SuperRonanCraft.BetterRTP.Main; import org.bukkit.Bukkit; -import org.bukkit.Sound; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -92,7 +91,7 @@ class RTPDelay implements Listener { HandlerList.unregisterAll(cls); if (getPl().getCmd().rtping.containsKey(pWorld.getPlayer().getUniqueId())) { try { - getPl().getRTP().tp(sendi, pWorld); + getPl().getRTP().findSafeLocation(sendi, pWorld); } catch (NullPointerException e) { if (pWorld.getPrice() > 0) getPl().getEco().unCharge(pWorld.getPlayer(), pWorld.getPrice()); diff --git a/src/main/java/me/SuperRonanCraft/BetterRTP/references/worlds/Custom.java b/src/main/java/me/SuperRonanCraft/BetterRTP/references/worlds/Custom.java index 438236d..af38bdb 100644 --- a/src/main/java/me/SuperRonanCraft/BetterRTP/references/worlds/Custom.java +++ b/src/main/java/me/SuperRonanCraft/BetterRTP/references/worlds/Custom.java @@ -3,6 +3,7 @@ package me.SuperRonanCraft.BetterRTP.references.worlds; import me.SuperRonanCraft.BetterRTP.Main; import me.SuperRonanCraft.BetterRTP.references.file.FileBasics; import org.bukkit.Bukkit; +import org.bukkit.World; import java.util.ArrayList; import java.util.List; @@ -31,34 +32,34 @@ public class Custom implements RTPWorld { continue; if (test.get("UseWorldBorder") != null) { if (test.get("UseWorldBorder").getClass() == Boolean.class) - useWorldborder = Boolean.valueOf(test.get("UseWorldBorder").toString()); + useWorldborder = Boolean.parseBoolean(test.get("UseWorldBorder").toString()); } if (test.get("CenterX") != null) { if (test.get("CenterX").getClass() == Integer.class) - CenterX = Integer.valueOf((test.get("CenterX")).toString()); + CenterX = Integer.parseInt((test.get("CenterX")).toString()); } if (test.get("CenterZ") != null) { if (test.get("CenterZ").getClass() == Integer.class) - CenterZ = Integer.valueOf((test.get("CenterZ")).toString()); + CenterZ = Integer.parseInt((test.get("CenterZ")).toString()); } if (test.get("MaxRadius") != null) { if (test.get("MaxRadius").getClass() == Integer.class) - maxBorderRad = Integer.valueOf((test.get("MaxRadius")).toString()); + maxBorderRad = Integer.parseInt((test.get("MaxRadius")).toString()); if (maxBorderRad <= 0) { Main.getInstance().getText().sms(Bukkit.getConsoleSender(), "WARNING! Custom world '" + world + "' Maximum radius of '" + maxBorderRad + "' is not allowed! Set to default value!"); - maxBorderRad = Main.getInstance().getRTP().Default.getMaxRad(); + maxBorderRad = Main.getInstance().getRTP().defaultWorld.getMaxRad(); } } if (test.get("MinRadius") != null) { if (test.get("MinRadius").getClass() == Integer.class) - minBorderRad = Integer.valueOf((test.get("MinRadius")).toString()); + minBorderRad = Integer.parseInt((test.get("MinRadius")).toString()); if (minBorderRad < 0 || minBorderRad >= maxBorderRad) { Main.getInstance().getText().sms(Bukkit.getConsoleSender(), "WARNING! Custom world '" + world + "' Minimum radius of '" + minBorderRad + "' is not allowed! Set to default value!"); - minBorderRad = Main.getInstance().getRTP().Default.getMinRad(); + minBorderRad = Main.getInstance().getRTP().defaultWorld.getMinRad(); if (minBorderRad >= maxBorderRad) - maxBorderRad = Main.getInstance().getRTP().Default.getMaxRad(); + maxBorderRad = Main.getInstance().getRTP().defaultWorld.getMaxRad(); } } if (test.get("Biomes") != null) { @@ -100,7 +101,7 @@ public class Custom implements RTPWorld { price = Integer.valueOf((test.get("Price")).toString()); } } else - price = Main.getInstance().getRTP().Default.getPrice(); + price = Main.getInstance().getRTP().defaultWorld.getPrice(); //Other this.Biomes = config.getStringList(pre + world + ".Biomes"); } @@ -141,7 +142,7 @@ public class Custom implements RTPWorld { } @Override - public String getWorld() { - return world; + public World getWorld() { + return Bukkit.getWorld(world); } } diff --git a/src/main/java/me/SuperRonanCraft/BetterRTP/references/worlds/Default.java b/src/main/java/me/SuperRonanCraft/BetterRTP/references/worlds/Default.java index 7f47c53..42921cb 100644 --- a/src/main/java/me/SuperRonanCraft/BetterRTP/references/worlds/Default.java +++ b/src/main/java/me/SuperRonanCraft/BetterRTP/references/worlds/Default.java @@ -4,6 +4,7 @@ package me.SuperRonanCraft.BetterRTP.references.worlds; import me.SuperRonanCraft.BetterRTP.Main; import me.SuperRonanCraft.BetterRTP.references.file.FileBasics; import org.bukkit.Bukkit; +import org.bukkit.World; import java.util.HashMap; import java.util.List; @@ -78,7 +79,7 @@ public class Default implements RTPWorld { } @Override - public String getWorld() { + public World getWorld() { return null; } } diff --git a/src/main/java/me/SuperRonanCraft/BetterRTP/references/worlds/PlayerWorld.java b/src/main/java/me/SuperRonanCraft/BetterRTP/references/worlds/PlayerWorld.java index fd3e9bf..2004d47 100644 --- a/src/main/java/me/SuperRonanCraft/BetterRTP/references/worlds/PlayerWorld.java +++ b/src/main/java/me/SuperRonanCraft/BetterRTP/references/worlds/PlayerWorld.java @@ -1,18 +1,23 @@ package me.SuperRonanCraft.BetterRTP.references.worlds; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.WorldBorder; import org.bukkit.entity.Player; import java.util.ArrayList; import java.util.List; +import java.util.Random; public class PlayerWorld implements RTPWorld { private boolean useWorldborder; private int CenterX, CenterZ, maxBorderRad, minBorderRad, price, attempts; private List Biomes; private Player p; - private String world; + private World world; + private RTP_WORLD_TYPE world_type; - public PlayerWorld(Player p, String world) { + public PlayerWorld(Player p, World world) { this.p = p; this.world = world; } @@ -34,7 +39,59 @@ public class PlayerWorld implements RTPWorld { return p; } - public String getWorld() { + public Location generateRandomXZ(Default defaultWorld, int quadrant) { + int borderRad = getMaxRad(); + int minVal = getMinRad(); + int CenterX = getCenterX(); + int CenterZ = getCenterZ(); + //int quadrant = rn.nextInt(4); + Player p = getPlayer(); + World world = getWorld(); + if (getUseWorldborder()) { + WorldBorder border = world.getWorldBorder(); + borderRad = (int) border.getSize() / 2; + CenterX = border.getCenter().getBlockX(); + CenterZ = border.getCenter().getBlockZ(); + } + float yaw = p.getLocation().getYaw(), pitch = p.getLocation().getPitch(); + RTP_WORLD_TYPE world_type = this.world_type; //World rtp type + //for (int i = 0; i <= maxAttempts; i++) { + // Get the y-coords from up top, then check if it's SAFE! + if (borderRad <= minVal) { + minVal = defaultWorld.getMinRad(); + if (borderRad <= minVal) + minVal = 0; + } + // Will Check is CenterZ is negative or positive, then set 2 x's + // up for choosing up next + ////z = rn.nextInt(borderRad - minVal) + CenterZ + minVal; + ////z2 = -(rn.nextInt(borderRad - minVal) - CenterZ - minVal); + // Will Check is CenterZ is negative or positive, then set 2 z's + // up for choosing up next + ////x = rn.nextInt(borderRad - minVal) + CenterX + minVal; + ////x2 = -rn.nextInt(borderRad - minVal) + CenterX - minVal; + int x = borderRad - minVal; + int z = borderRad - minVal; + switch (quadrant) { + case 0: // Positive X and Z + x = new Random().nextInt(x) + CenterX + minVal; + z = new Random().nextInt(z) + CenterZ + minVal; break; + case 1: // Negative X and Z + x = -new Random().nextInt(x) + CenterX - minVal; + z = -(new Random().nextInt(z) + CenterZ + minVal); break; + case 2: // Negative X and Positive Z + x = -new Random().nextInt(x) + CenterX - minVal; + z = new Random().nextInt(z) + CenterZ + minVal; break; + default: // Positive X and Negative Z + x = new Random().nextInt(x) + CenterX + minVal; + z = -(new Random().nextInt(z) + CenterZ + minVal); break; + } + addAttempt(); + return new Location(world, x, 0, z); + } + + @Override + public World getWorld() { return world; } @@ -104,6 +161,15 @@ public class PlayerWorld implements RTPWorld { } private void setBiomes(List biomes) { - Biomes = biomes; + this.Biomes = biomes; + } + + //Custom World type + public void setWorldtype(RTP_WORLD_TYPE type) { + this.world_type = type; + } + + public RTP_WORLD_TYPE getWorldtype() { + return this.world_type; } } diff --git a/src/main/java/me/SuperRonanCraft/BetterRTP/references/worlds/RTPWorld.java b/src/main/java/me/SuperRonanCraft/BetterRTP/references/worlds/RTPWorld.java index 785ae52..113e5a6 100644 --- a/src/main/java/me/SuperRonanCraft/BetterRTP/references/worlds/RTPWorld.java +++ b/src/main/java/me/SuperRonanCraft/BetterRTP/references/worlds/RTPWorld.java @@ -1,5 +1,7 @@ package me.SuperRonanCraft.BetterRTP.references.worlds; +import org.bukkit.World; + import java.util.List; public interface RTPWorld { @@ -18,5 +20,5 @@ public interface RTPWorld { List getBiomes(); - String getWorld(); + World getWorld(); } diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 33b7eec..2c0dce2 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,5 +1,5 @@ main: me.SuperRonanCraft.BetterRTP.Main -version: '2.12.0' +version: '2.12.1' name: BetterRTP author: SuperRonanCraft softdepend: [Vault, WorldGuard, GriefPrevention, Factions]