diff --git a/pom.xml b/pom.xml index 139be75c..5a479c5f 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 com.songoda skyblock - 2.3.4-DEV2 + 2.3.4-DEV3 jar UTF-8 @@ -147,9 +147,9 @@ compile - com.destroystokyo.papermc - paper - 1.15.2 + com.destroystokyo.paper + paper-api + 1.16.1-R0.1-SNAPSHOT provided @@ -161,7 +161,7 @@ org.spigotmc spigot - 1.15 + 1.16.1 provided diff --git a/src/main/java/com/songoda/skyblock/biome/BiomeManager.java b/src/main/java/com/songoda/skyblock/biome/BiomeManager.java index 633aa308..d43f3eb9 100644 --- a/src/main/java/com/songoda/skyblock/biome/BiomeManager.java +++ b/src/main/java/com/songoda/skyblock/biome/BiomeManager.java @@ -22,9 +22,8 @@ public class BiomeManager { } public void setBiome(Island island, Biome biome) { - Location location = island.getLocation(IslandWorld.Normal, IslandEnvironment.Island); - if (location == null) return; + if (island.getLocation(IslandWorld.Normal, IslandEnvironment.Island) == null) return; if(skyblock.isPaperAsync()){ // We keep it sequentially in order to use less RAM @@ -48,7 +47,13 @@ public class BiomeManager { private void setChunkBiome(Biome biome, Chunk chunk) { for(int xx = 0; xx < 16; xx++){ for(int zz = 0; zz < 16; zz++){ - chunk.getBlock(xx, 0, zz).setBiome(biome); + //if(ServerVersion.isServerVersionBelow(ServerVersion.V1_15)){ + chunk.getBlock(xx, 0, zz).setBiome(biome); + //} else { + // for(int i = 0; i<256; i+=2){ + // chunk.getBlock(xx, i, zz).setBiome(biome); + // } + //} } } } diff --git a/src/main/java/com/songoda/skyblock/command/commands/island/BiomeCommand.java b/src/main/java/com/songoda/skyblock/command/commands/island/BiomeCommand.java index ca7003c6..bee983d1 100644 --- a/src/main/java/com/songoda/skyblock/command/commands/island/BiomeCommand.java +++ b/src/main/java/com/songoda/skyblock/command/commands/island/BiomeCommand.java @@ -3,12 +3,16 @@ package com.songoda.skyblock.command.commands.island; import com.songoda.core.compatibility.CompatibleSound; import com.songoda.skyblock.command.SubCommand; import com.songoda.skyblock.config.FileManager.Config; +import com.songoda.skyblock.gui.bank.GuiBank; +import com.songoda.skyblock.gui.wip.GuiBiome; import com.songoda.skyblock.island.Island; import com.songoda.skyblock.island.IslandManager; import com.songoda.skyblock.island.IslandRole; +import com.songoda.skyblock.island.IslandWorld; import com.songoda.skyblock.menus.Biome; import com.songoda.skyblock.message.MessageManager; import com.songoda.skyblock.sound.SoundManager; +import com.songoda.skyblock.world.WorldManager; import org.bukkit.command.ConsoleCommandSender; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.entity.Player; @@ -34,7 +38,7 @@ public class BiomeCommand extends SubCommand { } else if ((island.hasRole(IslandRole.Operator, player.getUniqueId()) && skyblock.getPermissionManager().hasPermission(island,"Biome", IslandRole.Operator)) || island.hasRole(IslandRole.Owner, player.getUniqueId())) { - Biome.getInstance().open(player); + skyblock.getGuiManager().showGUI(player, new GuiBiome(skyblock, player, island, IslandWorld.Normal, null, false)); // TODO Nether and End support soundManager.playSound(player, CompatibleSound.BLOCK_CHEST_OPEN.getSound(), 1.0F, 1.0F); } else { messageManager.sendMessage(player, configLoad.getString("Command.Island.Biome.Permission.Message")); diff --git a/src/main/java/com/songoda/skyblock/config/FileManager.java b/src/main/java/com/songoda/skyblock/config/FileManager.java index a695a73c..62248fe3 100644 --- a/src/main/java/com/songoda/skyblock/config/FileManager.java +++ b/src/main/java/com/songoda/skyblock/config/FileManager.java @@ -67,7 +67,7 @@ public class FileManager { configFiles.put("language.yml", new File(skyblock.getDataFolder(), "language.yml")); configFiles.put("settings.yml", new File(skyblock.getDataFolder(), "settings.yml")); configFiles.put("upgrades.yml", new File(skyblock.getDataFolder(), "upgrades.yml")); - // configFiles.put("biomes.yml", new File(skyblock.getDataFolder(), "biomes.yml")); + configFiles.put("biomes.yml", new File(skyblock.getDataFolder(), "biomes.yml")); // configFiles.put("menus.yml", new File(skyblock.getDataFolder(), "menus.yml")); configFiles.put("generators.yml", new File(skyblock.getDataFolder(), "generators.yml")); configFiles.put("stackables.yml", new File(skyblock.getDataFolder(), "stackables.yml")); @@ -102,10 +102,10 @@ public class FileManager { } if (configFile.exists()) { - if (fileName.equals("config.yml") || fileName.equals("language.yml") || fileName.equals("worlds.yml")) { + if (fileName.equals("config.yml") || fileName.equals("language.yml") || fileName.equals("worlds.yml") || fileName.equals("biomes.yml")) { FileChecker fileChecker; - if (fileName.equals("config.yml")) { + if (fileName.equals("config.yml") || fileName.equals("biomes.yml")) { fileChecker = new FileChecker(skyblock, this, fileName, true); } else { fileChecker = new FileChecker(skyblock, this, fileName, false); diff --git a/src/main/java/com/songoda/skyblock/generator/GeneratorManager.java b/src/main/java/com/songoda/skyblock/generator/GeneratorManager.java index fc822d1e..28bd5075 100644 --- a/src/main/java/com/songoda/skyblock/generator/GeneratorManager.java +++ b/src/main/java/com/songoda/skyblock/generator/GeneratorManager.java @@ -37,10 +37,6 @@ public class GeneratorManager { if (configLoad.getString("Generators") == null) return; - CompatibleMaterial[] oreMaterials = new CompatibleMaterial[]{CompatibleMaterial.COAL, CompatibleMaterial.CHARCOAL, CompatibleMaterial.DIAMOND, - CompatibleMaterial.IRON_INGOT, CompatibleMaterial.GOLD_INGOT, CompatibleMaterial.EMERALD}; - Random rnd = new Random(); - for (String generatorList : configLoad.getConfigurationSection("Generators").getKeys(false)) { if (configLoad.getString("Generators." + generatorList + ".Name") == null) continue; @@ -55,10 +51,18 @@ public class GeneratorManager { } } } + + Random rnd = new Random(); + CompatibleMaterial icon; + if(!generatorMaterials.isEmpty()) { + icon = generatorMaterials.get(rnd.nextInt(generatorMaterials.size())).getMaterials(); + } else { + icon = CompatibleMaterial.STONE; + } generatorStorage.add(new Generator(configLoad.getString("Generators." + generatorList + ".Name"), IslandWorld.valueOf(configLoad.getString("Generators." + generatorList + ".World", "Normal")), - oreMaterials[rnd.nextInt(oreMaterials.length)], generatorMaterials, + icon, generatorMaterials, configLoad.getBoolean("Generators." + generatorList + ".Permission"))); } } diff --git a/src/main/java/com/songoda/skyblock/gui/wip/BiomeIcon.java b/src/main/java/com/songoda/skyblock/gui/wip/BiomeIcon.java index 4aaeb20e..071f3bd0 100644 --- a/src/main/java/com/songoda/skyblock/gui/wip/BiomeIcon.java +++ b/src/main/java/com/songoda/skyblock/gui/wip/BiomeIcon.java @@ -1,13 +1,18 @@ package com.songoda.skyblock.gui.wip; import com.songoda.core.compatibility.CompatibleBiome; +import com.songoda.core.compatibility.CompatibleMaterial; import com.songoda.skyblock.SkyBlock; +import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import java.io.File; +import java.util.Map; public class BiomeIcon { public final CompatibleBiome biome; @@ -19,8 +24,15 @@ public class BiomeIcon { public BiomeIcon(SkyBlock plugin, CompatibleBiome biome){ this.biome = biome; - FileConfiguration biomeConfig = plugin.getFileManager().getConfig(new File("biomes.yml")).getFileConfiguration(); - this.displayItem = null; // TODO + FileConfiguration biomeConfig = plugin.getFileManager().getConfig(new File(plugin.getDataFolder(),"biomes.yml")).getFileConfiguration(); + + CompatibleMaterial tempMat = CompatibleMaterial.getMaterial(biomeConfig.getString("Biomes." + biome.name() + ".DisplayItem.Material")); + if(tempMat == null){ + tempMat = CompatibleMaterial.STONE; + } + byte tempData = (byte) biomeConfig.getInt("Biomes." + biome.name() + ".DisplayItem.Data", 0); + + this.displayItem = CompatibleMaterial.getMaterial(tempMat.getMaterial(), tempData).getItem(); ItemMeta im = displayItem.getItemMeta(); if(im != null){ im.setDisplayName(ChatColor.translateAlternateColorCodes('&', biomeConfig.getString("Biomes." + biome.name() + ".DisplayName", biome.name()))); @@ -45,4 +57,13 @@ public class BiomeIcon { this.nether = nether; this.end = end; } + + public void enchant(){ + ItemMeta im = displayItem.getItemMeta(); + if(im != null){ + im.addEnchant(Enchantment.DURABILITY,1, true); + im.addItemFlags(ItemFlag.HIDE_ENCHANTS); + displayItem.setItemMeta(im); + } + } } diff --git a/src/main/java/com/songoda/skyblock/gui/wip/GuiBiome.java b/src/main/java/com/songoda/skyblock/gui/wip/GuiBiome.java index 02006aa7..cb97c202 100644 --- a/src/main/java/com/songoda/skyblock/gui/wip/GuiBiome.java +++ b/src/main/java/com/songoda/skyblock/gui/wip/GuiBiome.java @@ -24,6 +24,7 @@ import com.songoda.skyblock.island.IslandWorld; import com.songoda.skyblock.message.MessageManager; import com.songoda.skyblock.sound.SoundManager; import com.songoda.skyblock.utils.NumberUtil; +import org.bukkit.Bukkit; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -32,6 +33,7 @@ import org.bukkit.inventory.meta.ItemMeta; import java.io.File; import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; import java.util.Objects; @@ -46,7 +48,7 @@ public class GuiBiome extends Gui { private final boolean admin; public GuiBiome(SkyBlock plugin, Player player, Island island, IslandWorld world, Gui returnGui, boolean admin) { - super(returnGui); + super(6, returnGui); this.plugin = plugin; this.island = island; this.world = world; @@ -58,7 +60,7 @@ public class GuiBiome extends Gui { this.languageLoad = plugin.getFileManager() .getConfig(new File(plugin.getDataFolder(), "language.yml")).getFileConfiguration(); setDefaultItem(null); - setTitle(TextUtils.formatText(languageLoad.getString("Menu.Input.Title"))); + setTitle(TextUtils.formatText(languageLoad.getString("Menu.Biome.Title"))); paint(); } @@ -71,56 +73,63 @@ public class GuiBiome extends Gui { if (inventory != null) inventory.clear(); - setActionForRange(0, 0, 1, 8, null); + setActionForRange(0, 0, 5, 9, null); setButton(0, GuiUtils.createButtonItem(CompatibleMaterial.OAK_FENCE_GATE, // Exit - TextUtils.formatText(languageLoad.getString("Menu.Bans.Item.Exit.Displayname"))), (event) -> { + TextUtils.formatText(languageLoad.getString("Menu.Biome.Item.Exit.Displayname"))), (event) -> { soundManager.playSound(event.player, CompatibleSound.BLOCK_CHEST_CLOSE.getSound(), 1f, 1f); event.player.closeInventory(); }); setButton(8, GuiUtils.createButtonItem(CompatibleMaterial.OAK_FENCE_GATE, // Exit - TextUtils.formatText(languageLoad.getString("Menu.Bans.Item.Exit.Displayname"))), (event) -> { + TextUtils.formatText(languageLoad.getString("Menu.Biome.Item.Exit.Displayname"))), (event) -> { soundManager.playSound(event.player, CompatibleSound.BLOCK_CHEST_CLOSE.getSound(), 1f, 1f); event.player.closeInventory(); }); - + + setItem(4, GuiUtils.createButtonItem(CompatibleMaterial.PAINTING, // Info + TextUtils.formatText(languageLoad.getString("Menu.Biome.Item.Info.Displayname")), + TextUtils.formatText(languageLoad.getString("Menu.Biome.Item.Info.Lore") + .replace("%biome_type", island.getBiomeName())))); + for(int i=9; i<18; i++){ setItem(i, CompatibleMaterial.BLACK_STAINED_GLASS_PANE.getItem()); } List biomes = new ArrayList<>(); for(CompatibleBiome biome : CompatibleBiome.getCompatibleBiomes()) { - if(biome.isCompatible() - && player.hasPermission("fabledskyblock.biome." + biome.name().toLowerCase()) - && config.getBoolean("Island.Biome." + world.name() + "." + biome.name(), false)){ + if(biome.isCompatible()){ BiomeIcon icon = new BiomeIcon(plugin, biome); - switch(world){ - case Normal: - if(icon.normal){ - biomes.add(icon); - } - break; - case Nether: - if(icon.nether){ - biomes.add(icon); - } - break; - case End: - if(icon.end){ - biomes.add(icon); - } - break; + if(!icon.permission || player.hasPermission("fabledskyblock.biome." + biome.name().toLowerCase())){ + switch(world){ + case Normal: + if(icon.normal){ + biomes.add(icon); + } + break; + case Nether: + if(icon.nether){ + biomes.add(icon); + } + break; + case End: + if(icon.end){ + biomes.add(icon); + } + break; + } } } } if(biomes.size() > 0){ + biomes.sort(Comparator.comparing(m -> m.biome)); + this.pages = (int) Math.max(1, Math.ceil((double) biomes.size() / 27d)); if (page != 1) setButton(5, 2, GuiUtils.createButtonItem(CompatibleMaterial.ARROW, - TextUtils.formatText(languageLoad.getString("Menu.Bank.Item.Last.Displayname"))), + TextUtils.formatText(languageLoad.getString("Menu.Biome.Item.Last.Displayname"))), (event) -> { page--; paint(); @@ -128,14 +137,14 @@ public class GuiBiome extends Gui { if (page != pages) setButton(5, 6, GuiUtils.createButtonItem(CompatibleMaterial.ARROW, - TextUtils.formatText(languageLoad.getString("Menu.Bank.Item.Next.Displayname"))), + TextUtils.formatText(languageLoad.getString("Menu.Biome.Item.Next.Displayname"))), (event) -> { page++; paint(); }); - for (int i = 9; i < ((getRows()-1)*9)+9; i++) { - int current = ((page - 1) * 36) - 9; + for (int i = 18; i < ((getRows()-2)*9)+9; i++) { + int current = ((page - 1) * 27) - 18; if (current + i >= biomes.size()) { setItem(i, null); continue; @@ -143,6 +152,10 @@ public class GuiBiome extends Gui { BiomeIcon icon = biomes.get(current + i); if (icon == null) continue; + if(icon.biome.getBiome().equals(island.getBiome())){ + icon.enchant(); + } + setButton(i, icon.displayItem, event -> { if (cooldownManager.hasPlayer(CooldownType.Biome, player) && !player.hasPermission("fabledskyblock.bypass.cooldown")) { CooldownPlayer cooldownPlayer = cooldownManager.getCooldownPlayer(CooldownType.Biome, player); @@ -169,9 +182,11 @@ public class GuiBiome extends Gui { return; } cooldownManager.createPlayer(CooldownType.Biome, player); - biomeManager.setBiome(island, icon.biome.getBiome()); + Bukkit.getScheduler().runTask(plugin, () -> { + biomeManager.setBiome(island, icon.biome.getBiome()); + island.save(); + }); island.setBiome(icon.biome.getBiome()); - island.save(); soundManager.playSound(island.getLocation(IslandWorld.Normal, IslandEnvironment.Island), CompatibleSound.ENTITY_GENERIC_SPLASH.getSound(), 1.0F, 1.0F); @@ -179,10 +194,11 @@ public class GuiBiome extends Gui { if (!islandManager.isPlayerAtIsland(island, player, IslandWorld.Normal)) { soundManager.playSound(player, CompatibleSound.ENTITY_GENERIC_SPLASH.getSound(), 1.0F, 1.0F); } + paint(); }); } } else { - setItem(31, CompatibleMaterial.BARRIER.getItem()); + setItem(31, CompatibleMaterial.BARRIER.getItem()); // TODO } } } diff --git a/src/main/java/com/songoda/skyblock/island/IslandManager.java b/src/main/java/com/songoda/skyblock/island/IslandManager.java index 6422f7b1..fcf00d25 100644 --- a/src/main/java/com/songoda/skyblock/island/IslandManager.java +++ b/src/main/java/com/songoda/skyblock/island/IslandManager.java @@ -1137,29 +1137,26 @@ public class IslandManager { } } } - - Bukkit.getServer().getScheduler().runTaskAsynchronously(skyblock, () -> { - Location loc = island.getLocation(IslandWorld.Normal, IslandEnvironment.Visitor); - if (!player.getGameMode().equals(GameMode.CREATIVE) && !player.getGameMode().equals(GameMode.SPECTATOR)) { - CompletableFuture safeLoc = LocationUtil.getSafeLocation(loc); - if(safeLoc != null){ - loc = safeLoc.join(); - } - } - if(loc != null){ - PaperLib.teleportAsync(player, loc); - if(!configLoad.getBoolean("Island.Teleport.FallDamage", true)){ - player.setFallDistance(0.0F); - } - } else { - player.sendMessage(ChatColor.translateAlternateColorCodes('&', - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")) - .getFileConfiguration().getString("Command.Island.Teleport.Unsafe.Message"))); + Location loc = island.getLocation(IslandWorld.Normal, IslandEnvironment.Visitor); + if (!player.getGameMode().equals(GameMode.CREATIVE) && !player.getGameMode().equals(GameMode.SPECTATOR)) { + Location safeLoc = LocationUtil.getSafeLocation(loc); + if(safeLoc != null){ + loc = safeLoc; } + } + if(loc != null){ + PaperLib.teleportAsync(player, loc); if(!configLoad.getBoolean("Island.Teleport.FallDamage", true)){ player.setFallDistance(0.0F); } - }); + } else { + player.sendMessage(ChatColor.translateAlternateColorCodes('&', + skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")) + .getFileConfiguration().getString("Command.Island.Teleport.Unsafe.Message"))); + } + if(!configLoad.getBoolean("Island.Teleport.FallDamage", true)){ + player.setFallDistance(0.0F); + } List islandWelcomeMessage = island.getMessage(IslandMessage.Welcome); diff --git a/src/main/java/com/songoda/skyblock/listeners/Block.java b/src/main/java/com/songoda/skyblock/listeners/Block.java index e1af24ab..18f85624 100644 --- a/src/main/java/com/songoda/skyblock/listeners/Block.java +++ b/src/main/java/com/songoda/skyblock/listeners/Block.java @@ -3,6 +3,7 @@ package com.songoda.skyblock.listeners; import com.google.common.collect.Lists; import com.songoda.core.compatibility.CompatibleMaterial; import com.songoda.core.compatibility.CompatibleSound; +import com.songoda.core.compatibility.ServerVersion; import com.songoda.skyblock.SkyBlock; import com.songoda.skyblock.config.FileManager.Config; import com.songoda.skyblock.generator.Generator; @@ -215,7 +216,7 @@ public class Block implements Listener { if(!player.hasPermission("fabledskyblock.bypass.netherplace") && !islandManager.isIslandWorldUnlocked(island, IslandWorld.Nether)){ for(String s : Objects.requireNonNull(configLoad.getConfigurationSection("Island.Restrict.NetherBlocks")).getKeys(false)){ if(s.equalsIgnoreCase(block.getType().toString())){ - if(configLoad.getBoolean("Island.Restrict.NetherBlocks." + s)){ + if(configLoad.getBoolean("Island.Restrict.NetherBlocks." + s, false)){ skyblock.getMessageManager().sendMessage(player, Objects.requireNonNull(skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")) .getFileConfiguration().getString("Island.Unlock.NetherBlocksPlace.Message"))); event.setCancelled(true); @@ -326,24 +327,31 @@ public class Block implements Listener { Collection entities = block.getWorld().getNearbyEntities(block.getLocation(), 1d, 1d, 1d); if(entities.size() > 0){ for(Entity ent : entities){ + boolean witherSkeleton; - if (NMSUtil.getVersionNumber() > 10) { + if (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_11)) { witherSkeleton = ent.getType().equals(EntityType.WITHER_SKELETON); } else { witherSkeleton = ent instanceof Skeleton && ((Skeleton) ent).getSkeletonType().equals(Skeleton.SkeletonType.WITHER); } - if (ent.getType().equals(EntityType.PIG_ZOMBIE) || - ent.getType().equals(EntityType.BLAZE) || - ent.getType().equals(EntityType.MAGMA_CUBE) || - ent.getType().equals(EntityType.WITHER) || - ent.getType().equals(EntityType.GHAST) || - witherSkeleton) { - if(block.getRelative(event.getFace().getOppositeFace()).getType().equals(Material.WATER)){ - event.setCancelled(true); - event.getToBlock().getWorld().playSound(block.getLocation(), CompatibleSound.BLOCK_FIRE_EXTINGUISH.getSound(), 1f, 1f); - event.getToBlock().getWorld().playEffect(block.getLocation(), Effect.SMOKE, 1); + if((((ent instanceof Blaze || ent instanceof MagmaCube) || ent instanceof Wither) || ent instanceof Ghast) || witherSkeleton){ + event.setCancelled(true); + event.getToBlock().getWorld().playSound(block.getLocation(), CompatibleSound.BLOCK_FIRE_EXTINGUISH.getSound(), 1f, 1f); + event.getToBlock().getWorld().playEffect(block.getLocation(), Effect.SMOKE, 1); + } else { + if(ServerVersion.isServerVersionAtLeast(ServerVersion.V1_16)){ + if(((ent instanceof Piglin || ent instanceof Hoglin) || ent instanceof Strider) || ent instanceof Zoglin) { + event.setCancelled(true); + event.getToBlock().getWorld().playSound(block.getLocation(), CompatibleSound.BLOCK_FIRE_EXTINGUISH.getSound(), 1f, 1f); + event.getToBlock().getWorld().playEffect(block.getLocation(), Effect.SMOKE, 1); + } + } else { + if(ent instanceof PigZombie) { + event.setCancelled(true); + event.getToBlock().getWorld().playSound(block.getLocation(), CompatibleSound.BLOCK_FIRE_EXTINGUISH.getSound(), 1f, 1f); + event.getToBlock().getWorld().playEffect(block.getLocation(), Effect.SMOKE, 1); + } } - break; } } } diff --git a/src/main/java/com/songoda/skyblock/listeners/Move.java b/src/main/java/com/songoda/skyblock/listeners/Move.java index fbdaaaf7..df80784c 100644 --- a/src/main/java/com/songoda/skyblock/listeners/Move.java +++ b/src/main/java/com/songoda/skyblock/listeners/Move.java @@ -194,41 +194,37 @@ public class Move implements Listener { } private void teleportPlayerToIslandSpawn(Player player, IslandWorld world, Island island) { - Bukkit.getScheduler().runTaskAsynchronously(skyblock, () -> { - Location loc = null; - if (island.hasRole(IslandRole.Member, player.getUniqueId()) || island.hasRole(IslandRole.Operator, player.getUniqueId()) - || island.hasRole(IslandRole.Owner, player.getUniqueId())) { - if (!player.getGameMode().equals(GameMode.CREATIVE) && !player.getGameMode().equals(GameMode.SPECTATOR)) { - CompletableFuture safeLoc = LocationUtil.getSafeLocation(island.getLocation(world, IslandEnvironment.Main)); - if(safeLoc != null){ - loc = safeLoc.join(); - } - } else { - loc = island.getLocation(world, IslandEnvironment.Main); - LocationUtil.removeWaterFromLoc(skyblock, loc); + Location loc = null; + if (island.hasRole(IslandRole.Member, player.getUniqueId()) || island.hasRole(IslandRole.Operator, player.getUniqueId()) + || island.hasRole(IslandRole.Owner, player.getUniqueId())) { + if (!player.getGameMode().equals(GameMode.CREATIVE) && !player.getGameMode().equals(GameMode.SPECTATOR)) { + Location safeLoc = LocationUtil.getSafeLocation(island.getLocation(world, IslandEnvironment.Main)); + if(safeLoc != null){ + loc = safeLoc; } } else { - if (!player.getGameMode().equals(GameMode.CREATIVE) && !player.getGameMode().equals(GameMode.SPECTATOR)) { - CompletableFuture safeLoc = LocationUtil.getSafeLocation(island.getLocation(world, IslandEnvironment.Visitor)); - if(safeLoc != null){ - loc = safeLoc.join(); - } - } else { - loc = island.getLocation(world, IslandEnvironment.Visitor); - } + loc = island.getLocation(world, IslandEnvironment.Main); + LocationUtil.removeWaterFromLoc(skyblock, loc); } - Location finalLoc = loc; - Bukkit.getScheduler().runTask(skyblock, () -> { - if(finalLoc != null){ - PaperLib.teleportAsync(player, finalLoc); - } else { - LocationUtil.teleportPlayerToSpawn(player); - player.sendMessage(ChatColor.translateAlternateColorCodes('&', - skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")) - .getFileConfiguration().getString("Command.Island.Teleport.Unsafe.Message"))); + } else { + if (!player.getGameMode().equals(GameMode.CREATIVE) && !player.getGameMode().equals(GameMode.SPECTATOR)) { + Location safeLoc = LocationUtil.getSafeLocation(island.getLocation(world, IslandEnvironment.Visitor)); + if(safeLoc != null){ + loc = safeLoc; } - }); - }); + } else { + loc = island.getLocation(world, IslandEnvironment.Visitor); + } + } + Location finalLoc = loc; + if(finalLoc != null){ + PaperLib.teleportAsync(player, finalLoc); + } else { + LocationUtil.teleportPlayerToSpawn(player); + player.sendMessage(ChatColor.translateAlternateColorCodes('&', + skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "language.yml")) + .getFileConfiguration().getString("Command.Island.Teleport.Unsafe.Message"))); + } } private void teleportPlayerToIslandSpawn(Player player, Island island) { diff --git a/src/main/java/com/songoda/skyblock/listeners/Portal.java b/src/main/java/com/songoda/skyblock/listeners/Portal.java index 3874091e..4657f983 100644 --- a/src/main/java/com/songoda/skyblock/listeners/Portal.java +++ b/src/main/java/com/songoda/skyblock/listeners/Portal.java @@ -164,20 +164,18 @@ public class Portal implements Listener { private void teleportPlayerToWorld(Player player, SoundManager soundManager, Island island, IslandEnvironment spawnEnvironment, Tick tick, IslandWorld toWorld) { IslandWorld toWorldF = toWorld; - Bukkit.getScheduler().runTaskLaterAsynchronously(skyblock, () -> { + Bukkit.getScheduler().runTaskLater(skyblock, () -> { Location loc = island.getLocation(toWorldF, spawnEnvironment); - CompletableFuture tempSafeLoc = LocationUtil.getSafeLocation(loc); + Location tempSafeLoc = LocationUtil.getSafeLocation(loc); Location safeLoc = null; if(tempSafeLoc != null) { - safeLoc = tempSafeLoc.join(); + safeLoc = tempSafeLoc; } if(safeLoc != null){ loc = safeLoc; } Location finalLoc = loc; - Bukkit.getScheduler().runTask(skyblock, () -> { - PaperLib.teleportAsync(player, finalLoc); - }); + PaperLib.teleportAsync(player, finalLoc); }, 1L); soundManager.playSound(player, CompatibleSound.ENTITY_ENDERMAN_TELEPORT.getSound(), 1.0F, 1.0F); player.setFallDistance(0.0F); diff --git a/src/main/java/com/songoda/skyblock/permission/permissions/listening/FirePermission.java b/src/main/java/com/songoda/skyblock/permission/permissions/listening/FirePermission.java index c67880dc..3cdadb2d 100644 --- a/src/main/java/com/songoda/skyblock/permission/permissions/listening/FirePermission.java +++ b/src/main/java/com/songoda/skyblock/permission/permissions/listening/FirePermission.java @@ -8,7 +8,9 @@ import com.songoda.skyblock.permission.PermissionHandler; import com.songoda.skyblock.permission.PermissionType; import org.bukkit.block.Block; import org.bukkit.entity.Player; +import org.bukkit.entity.Projectile; import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockIgniteEvent; import org.bukkit.event.player.PlayerInteractEvent; public class FirePermission extends ListeningPermission { @@ -29,7 +31,21 @@ public class FirePermission extends ListeningPermission { Player player = event.getPlayer(); - if (CompatibleMaterial.getMaterial(player.getTargetBlock(null, 5)) == CompatibleMaterial.FIRE) + if (CompatibleMaterial.getMaterial(player.getTargetBlock(null, 5)).equals(CompatibleMaterial.FIRE)) cancelAndMessage(event, player, plugin, messageManager); } + + @PermissionHandler + public void onProjectileHit(BlockIgniteEvent event) { + Player player = null; + if(event.getPlayer() != null){ + player = event.getPlayer(); + } else if(event.getIgnitingEntity() instanceof Projectile && ((Projectile) event.getIgnitingEntity()).getShooter() instanceof Player) { + player = (Player) ((Projectile) event.getIgnitingEntity()).getShooter(); + } + + if(player != null) { + cancelAndMessage(event, player, plugin, messageManager); + } + } } diff --git a/src/main/java/com/songoda/skyblock/permission/permissions/listening/PortalPermission.java b/src/main/java/com/songoda/skyblock/permission/permissions/listening/PortalPermission.java index 65769a12..c5fb8811 100644 --- a/src/main/java/com/songoda/skyblock/permission/permissions/listening/PortalPermission.java +++ b/src/main/java/com/songoda/skyblock/permission/permissions/listening/PortalPermission.java @@ -70,22 +70,20 @@ public class PortalPermission extends ListeningPermission { } } - private CompletableFuture getToLocation(Location from, Player player) { - return CompletableFuture.supplyAsync(() -> { - IslandManager islandManager = plugin.getIslandManager(); - Island island = islandManager.getIslandAtLocation(from); - Location to = island.getLocation(IslandWorld.Normal, IslandEnvironment.Main); - if(island.hasRole(IslandRole.Visitor, player.getUniqueId())){ - CompletableFuture safeLoc = LocationUtil.getSafeLocation(island.getLocation(IslandWorld.Normal, IslandEnvironment.Visitor)); - if(safeLoc != null) { - to = safeLoc.join(); - } - if(to == null){ - to = LocationUtil.getSpawnLocation(); - } + private Location getToLocation(Location from, Player player) { + IslandManager islandManager = plugin.getIslandManager(); + Island island = islandManager.getIslandAtLocation(from); + Location to = island.getLocation(IslandWorld.Normal, IslandEnvironment.Main); + if(island.hasRole(IslandRole.Visitor, player.getUniqueId())){ + Location safeLoc = LocationUtil.getSafeLocation(island.getLocation(IslandWorld.Normal, IslandEnvironment.Visitor)); + if(safeLoc != null) { + to = safeLoc; } - return to; - }); + if(to == null){ + to = LocationUtil.getSpawnLocation(); + } + } + return to; } } diff --git a/src/main/java/com/songoda/skyblock/tasks/MobNetherWaterTask.java b/src/main/java/com/songoda/skyblock/tasks/MobNetherWaterTask.java index ac22f427..f3897214 100644 --- a/src/main/java/com/songoda/skyblock/tasks/MobNetherWaterTask.java +++ b/src/main/java/com/songoda/skyblock/tasks/MobNetherWaterTask.java @@ -1,6 +1,7 @@ package com.songoda.skyblock.tasks; import com.songoda.core.compatibility.CompatibleSound; +import com.songoda.core.compatibility.ServerVersion; import com.songoda.core.utils.TextUtils; import com.songoda.skyblock.SkyBlock; import com.songoda.skyblock.config.FileManager; @@ -19,10 +20,7 @@ import org.bukkit.*; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.entity.Entity; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.Player; -import org.bukkit.entity.Skeleton; +import org.bukkit.entity.*; import org.bukkit.scheduler.BukkitRunnable; import java.io.File; @@ -57,20 +55,29 @@ public class MobNetherWaterTask extends BukkitRunnable { if(plugin.getWorldManager().isIslandWorld(world) && plugin.getWorldManager().getIslandWorld(world).equals(IslandWorld.Nether)){ for(Entity ent : world.getEntities()) { boolean witherSkeleton; - if (NMSUtil.getVersionNumber() > 10) { + if (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_11)) { witherSkeleton = ent.getType().equals(EntityType.WITHER_SKELETON); } else { witherSkeleton = ent instanceof Skeleton && ((Skeleton) ent).getSkeletonType().equals(Skeleton.SkeletonType.WITHER); } - if (ent.getType().equals(EntityType.PIG_ZOMBIE) || - ent.getType().equals(EntityType.BLAZE) || - ent.getType().equals(EntityType.MAGMA_CUBE) || - ent.getType().equals(EntityType.WITHER) || - ent.getType().equals(EntityType.GHAST) || - witherSkeleton) { + if((((ent instanceof Blaze || ent instanceof MagmaCube) || ent instanceof Wither) || ent instanceof Ghast) || witherSkeleton){ Block block = ent.getLocation().getBlock(); removeWater(world, block); removeWater(world, block.getRelative(BlockFace.UP)); + } else { + if(ServerVersion.isServerVersionAtLeast(ServerVersion.V1_16)){ + if(((ent instanceof Piglin || ent instanceof Hoglin) || ent instanceof Strider) || ent instanceof Zoglin) { + Block block = ent.getLocation().getBlock(); + removeWater(world, block); + removeWater(world, block.getRelative(BlockFace.UP)); + } + } else { + if(ent instanceof PigZombie) { + Block block = ent.getLocation().getBlock(); + removeWater(world, block); + removeWater(world, block.getRelative(BlockFace.UP)); + } + } } } } diff --git a/src/main/java/com/songoda/skyblock/utils/world/LocationUtil.java b/src/main/java/com/songoda/skyblock/utils/world/LocationUtil.java index 0b2abe20..4b1ecbd4 100644 --- a/src/main/java/com/songoda/skyblock/utils/world/LocationUtil.java +++ b/src/main/java/com/songoda/skyblock/utils/world/LocationUtil.java @@ -42,31 +42,29 @@ public final class LocationUtil { } } - public static @Nullable CompletableFuture getSafeLocation(Location loc){ - return CompletableFuture.supplyAsync(() -> { - boolean found = false; - Location locChecked = null; - if(loc != null && loc.getWorld() != null){ - locChecked = loc.clone(); - loc.getWorld().loadChunk(loc.getWorld().getChunkAt(loc)); - for(int i=loc.getBlockY(); i>=0 && !found; i--){ - locChecked = locChecked.subtract(0d, 1d, 0d); + public static @Nullable Location getSafeLocation(Location loc){ + boolean found = false; + Location locChecked = null; + if(loc != null && loc.getWorld() != null){ + locChecked = loc.clone(); + loc.getWorld().loadChunk(loc.getWorld().getChunkAt(loc)); + for(int i=loc.getBlockY(); i>=0 && !found; i--){ + locChecked = locChecked.subtract(0d, 1d, 0d); + found = checkBlock(locChecked); + } + if(!found){ + for(int i=loc.getBlockY(); i<256 && !found; i++){ + locChecked = locChecked.add(0d, 1d, 0d); found = checkBlock(locChecked); } - if(!found){ - for(int i=loc.getBlockY(); i<256 && !found; i++){ - locChecked = locChecked.add(0d, 1d, 0d); - found = checkBlock(locChecked); - } - } - if (found) { - locChecked = locChecked.add(0d,1d,0d); - } else { - locChecked = null; - } } - return locChecked; - }); + if (found) { + locChecked = locChecked.add(0d,1d,0d); + } else { + locChecked = null; + } + } + return locChecked; } public static @Nonnull Location getDefinitiveLocation(Location loc){ diff --git a/src/main/java/com/songoda/skyblock/utils/world/block/BlockData.java b/src/main/java/com/songoda/skyblock/utils/world/block/BlockData.java index 02c81bd8..544ca768 100644 --- a/src/main/java/com/songoda/skyblock/utils/world/block/BlockData.java +++ b/src/main/java/com/songoda/skyblock/utils/world/block/BlockData.java @@ -34,6 +34,7 @@ public class BlockData { private String skullOwner = "Notch"; private String skullType = SkullType.PLAYER.toString(); private String facing; + private int charges = 0; private Map inventory = new HashMap<>(); @@ -313,4 +314,12 @@ public class BlockData { public void setExactTeleport(boolean exactTeleport) { this.exactTeleport = exactTeleport; } + + public int getCharges() { + return charges; + } + + public void setCharges(int charges) { + this.charges = charges; + } } diff --git a/src/main/java/com/songoda/skyblock/utils/world/block/BlockStateType.java b/src/main/java/com/songoda/skyblock/utils/world/block/BlockStateType.java index ebfb6f2e..52d6da1c 100644 --- a/src/main/java/com/songoda/skyblock/utils/world/block/BlockStateType.java +++ b/src/main/java/com/songoda/skyblock/utils/world/block/BlockStateType.java @@ -3,6 +3,6 @@ package com.songoda.skyblock.utils.world.block; public enum BlockStateType { NORMAL, BANNER, BEACON, BREWINGSTAND, COMMANDBLOCK, CHEST, DISPENSER, DROPPER, HOPPER, SHULKERBOX, CREATURESPAWNER, - ENDGATEWAY, FURNACE, JUKEBOX, SIGN, SKULL, DOUBLECHEST, BARREL + ENDGATEWAY, FURNACE, JUKEBOX, SIGN, SKULL, DOUBLECHEST, BARREL, RESPAWN_ANCHOR } \ No newline at end of file diff --git a/src/main/java/com/songoda/skyblock/utils/world/block/BlockUtil.java b/src/main/java/com/songoda/skyblock/utils/world/block/BlockUtil.java index a65b70ce..2a74d19a 100644 --- a/src/main/java/com/songoda/skyblock/utils/world/block/BlockUtil.java +++ b/src/main/java/com/songoda/skyblock/utils/world/block/BlockUtil.java @@ -9,6 +9,7 @@ import org.bukkit.*; import org.bukkit.block.*; import org.bukkit.block.banner.Pattern; import org.bukkit.block.banner.PatternType; +import org.bukkit.block.data.type.RespawnAnchor; import org.bukkit.entity.EntityType; import org.bukkit.inventory.ItemStack; import org.bukkit.material.MaterialData; @@ -212,6 +213,14 @@ public final class BlockUtil extends BlockUtils { blockData.setStateType(BlockStateType.BARREL.toString()); } + + if(ServerVersion.isServerVersionAtLeast(ServerVersion.V1_16)){ + if (blockState instanceof RespawnAnchor) { + RespawnAnchor respawnAnchor = (RespawnAnchor) blockState; + blockData.setCharges(respawnAnchor.getCharges()); + blockData.setStateType(BlockStateType.RESPAWN_ANCHOR.toString()); + } + } } } } @@ -284,7 +293,7 @@ public final class BlockUtil extends BlockUtils { BlockState state = block.getState(); - if (blockTypeState == BlockStateType.BANNER) { + if (blockTypeState.equals(BlockStateType.BANNER)) { Banner banner = (Banner) state; banner.setBaseColor(DyeColor.valueOf(blockData.getBaseColor().toUpperCase())); @@ -293,7 +302,7 @@ public final class BlockUtil extends BlockUtils { banner.addPattern(new Pattern(DyeColor.valueOf(pattern[1].toUpperCase()), PatternType.valueOf(pattern[0].toUpperCase()))); } state.update(); - } else if (blockTypeState == BlockStateType.BEACON) { + } else if (blockTypeState.equals(BlockStateType.BEACON)) { Beacon beacon = (Beacon) state; String[] potionEffect = blockData.getPotionEffect().split(":"); if (!potionEffect[0].equals("null")) { @@ -304,17 +313,17 @@ public final class BlockUtil extends BlockUtils { beacon.setSecondaryEffect(PotionEffectType.getByName(potionEffect[1].toUpperCase())); } state.update(); - } else if (blockTypeState == BlockStateType.BREWINGSTAND && ServerVersion.isServerVersionAtLeast(ServerVersion.V1_12)) { + } else if (blockTypeState.equals(BlockStateType.BREWINGSTAND) && ServerVersion.isServerVersionAtLeast(ServerVersion.V1_12)) { BrewingStand brewingStand = (BrewingStand) state; brewingStand.setBrewingTime(blockData.getBrewingTime()); brewingStand.setFuelLevel(blockData.getFuelLevel()); state.update(); - } else if (blockTypeState == BlockStateType.COMMANDBLOCK) { + } else if (blockTypeState.equals(BlockStateType.COMMANDBLOCK)) { CommandBlock commandBlock = (CommandBlock) state; commandBlock.setCommand(blockData.getCommand()); commandBlock.setName(blockData.getCommandBlockName()); state.update(); - } else if (blockTypeState == BlockStateType.CHEST) { + } else if (blockTypeState.equals(BlockStateType.CHEST)) { Chest chest = (Chest) state; for (Integer slotList : blockData.getInventory().keySet()) { @@ -323,7 +332,7 @@ public final class BlockUtil extends BlockUtils { chest.getInventory().setItem(slotList, is); } } - } else if (blockTypeState == BlockStateType.DISPENSER) { + } else if (blockTypeState.equals(BlockStateType.DISPENSER)) { Dispenser dispenser = (Dispenser) state; for (Integer slotList : blockData.getInventory().keySet()) { @@ -332,7 +341,7 @@ public final class BlockUtil extends BlockUtils { dispenser.getInventory().setItem(slotList, is); } } - } else if (blockTypeState == BlockStateType.DROPPER) { + } else if (blockTypeState.equals(BlockStateType.DROPPER)) { Dropper dropper = (Dropper) state; for (Integer slotList : blockData.getInventory().keySet()) { @@ -341,7 +350,7 @@ public final class BlockUtil extends BlockUtils { dropper.getInventory().setItem(slotList, is); } } - } else if (blockTypeState == BlockStateType.HOPPER) { + } else if (blockTypeState.equals(BlockStateType.HOPPER)) { Hopper hopper = (Hopper) state; for (Integer slotList : blockData.getInventory().keySet()) { @@ -350,7 +359,7 @@ public final class BlockUtil extends BlockUtils { hopper.getInventory().setItem(slotList, is); } } - } else if (blockTypeState == BlockStateType.CREATURESPAWNER) { + } else if (blockTypeState.equals(BlockStateType.CREATURESPAWNER)) { CreatureSpawner creatureSpawner = (CreatureSpawner) state; if (blockData.getEntity() != null) { @@ -359,7 +368,7 @@ public final class BlockUtil extends BlockUtils { creatureSpawner.setDelay(blockData.getDelay()); state.update(); - } else if (blockTypeState == BlockStateType.FURNACE) { + } else if (blockTypeState.equals(BlockStateType.FURNACE)) { Furnace furnace = (Furnace) state; furnace.setBurnTime(blockData.getBurnTime()); furnace.setCookTime(blockData.getCookTime()); @@ -372,21 +381,21 @@ public final class BlockUtil extends BlockUtils { furnace.getInventory().setItem(slotList, is); } } - } else if (blockTypeState == BlockStateType.JUKEBOX) { + } else if (blockTypeState.equals(BlockStateType.JUKEBOX)) { Jukebox jukebox = (Jukebox) state; if (blockData.getPlaying() != null) { jukebox.setPlaying(Material.valueOf(blockData.getPlaying().toUpperCase())); } state.update(); - } else if (blockTypeState == BlockStateType.SIGN) { + } else if (blockTypeState.equals(BlockStateType.SIGN)) { Sign sign = (Sign) state; for (int i = 0; i < blockData.getSignLines().length; i++) { sign.setLine(i, ChatColor.translateAlternateColorCodes('&', blockData.getSignLines()[i])); } state.update(); - } else if (blockTypeState == BlockStateType.SKULL) { + } else if (blockTypeState.equals(BlockStateType.SKULL)) { Skull skull = (Skull) state; skull.setRotation(BlockFace.valueOf(blockData.getRotateFace().toUpperCase())); @@ -400,7 +409,7 @@ public final class BlockUtil extends BlockUtils { state.update(); } else { if (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_9)) { - if (blockTypeState == BlockStateType.ENDGATEWAY) { + if (blockTypeState.equals(BlockStateType.ENDGATEWAY)) { EndGateway endGateway = (EndGateway) state; endGateway.setExactTeleport(blockData.isExactTeleport()); @@ -416,7 +425,7 @@ public final class BlockUtil extends BlockUtils { } if (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_11)) { - if (blockTypeState == BlockStateType.SHULKERBOX) { + if (blockTypeState.equals(BlockStateType.SHULKERBOX)) { ShulkerBox shulkerBox = (ShulkerBox) state; for (Integer slotList : blockData.getInventory().keySet()) { @@ -427,7 +436,7 @@ public final class BlockUtil extends BlockUtils { } } if(ServerVersion.isServerVersionAtLeast(ServerVersion.V1_14)){ - if (blockTypeState == BlockStateType.BARREL) { + if (blockTypeState.equals(BlockStateType.BARREL)) { Barrel barrel = (Barrel) state; for (Integer slotList : blockData.getInventory().keySet()) { @@ -438,6 +447,14 @@ public final class BlockUtil extends BlockUtils { } } } + + if(ServerVersion.isServerVersionAtLeast(ServerVersion.V1_16)){ + if (blockTypeState.equals(BlockStateType.RESPAWN_ANCHOR)) { + RespawnAnchor respawnAnchor = (RespawnAnchor) state; + respawnAnchor.setCharges(blockData.getCharges()); + state.update(); + } + } } } } diff --git a/src/main/java/com/songoda/skyblock/utils/world/entity/EntityUtil.java b/src/main/java/com/songoda/skyblock/utils/world/entity/EntityUtil.java index ea550a4f..eb555348 100644 --- a/src/main/java/com/songoda/skyblock/utils/world/entity/EntityUtil.java +++ b/src/main/java/com/songoda/skyblock/utils/world/entity/EntityUtil.java @@ -1,6 +1,7 @@ package com.songoda.skyblock.utils.world.entity; import com.songoda.core.compatibility.CompatibleMaterial; +import com.songoda.core.compatibility.ServerVersion; import com.songoda.skyblock.utils.item.ItemStackUtil; import com.songoda.skyblock.utils.version.NMSUtil; import com.songoda.skyblock.utils.world.block.BlockDegreesType; @@ -496,43 +497,4 @@ public final class EntityUtil { } } } - - public static boolean isMonster(EntityType type) { - if (NMSUtil.getVersionNumber() > 10) { - if(type.equals(EntityType.WITHER_SKELETON)) return true; // TODO In < 11 we have SkeletonType.Wither - } - switch (type) { // TODO Check server versions - case BAT: - case BLAZE: - case CAVE_SPIDER: - case COD: - case CREEPER: - case DROWNED: - case ELDER_GUARDIAN: - case ENDERMAN: - case ENDERMITE: - case EVOKER: - case GHAST: - case HUSK: - case ILLUSIONER: - case MAGMA_CUBE: - case PHANTOM: - case PIG_ZOMBIE: - case RAVAGER: - case SILVERFISH: - case SKELETON: - case SLIME: - case SPIDER: - case STRAY: - case VEX: - case VINDICATOR: - case WITCH: - case WITHER: - case ZOMBIE: - case ZOMBIE_VILLAGER: - return true; - default: - return false; - } - } } diff --git a/src/main/resources/biomes.yml b/src/main/resources/biomes.yml index d4a01b8f..9947bfb6 100644 --- a/src/main/resources/biomes.yml +++ b/src/main/resources/biomes.yml @@ -1,497 +1,567 @@ +# All the Minecraft Biomes +# Use "Data" only on pre - 1.13 +# Normal: true means that the biome is available in the Overworld. +# Nether and The End will come in future updates. + Biomes: BADLANDS: - DisplayName: 'Badlands' - DiplayItem: + DisplayName: '&6Badlands' + DisplayItem: Material: WHITE_TERRACOTTA Data: 0 Permission: true Normal: true - Nether: false - End: false BADLANDS_PLATEAU: - DisplayName: 'Badlands Plateau' - DiplayItem: + DisplayName: '&6Badlands Plateau' + DisplayItem: Material: RED_TERRACOTTA Data: 14 Permission: true Normal: true - Nether: false - End: false BAMBOO_JUNGLE: - DisplayName: 'Bamboo Jungle' - DiplayItem: + DisplayName: '&6Bamboo Jungle' + DisplayItem: Material: BAMBOO Data: 0 Permission: true Normal: true - Nether: false - End: false BAMBOO_JUNGLE_HILLS: - DisplayName: 'Bamboo Jungle Hills' - DiplayItem: - Material: BAMBOO + DisplayName: '&6Bamboo Jungle Hills' + DisplayItem: + Material: SCAFFOLDING Data: 0 Permission: true Normal: true - Nether: false - End: false BASALT_DELTAS: - DisplayName: 'Basalt Deltas' - DiplayItem: + DisplayName: '&6Basalt Deltas' + DisplayItem: Material: BASALT Data: 0 Permission: true Normal: false - Nether: true - End: false BEACH: - DisplayName: 'Beach' + DisplayName: '&6Beach' + DisplayItem: + Material: SAND + Data: 0 Permission: true Normal: true - Nether: false - End: false BIRCH_FOREST: - DisplayName: 'Birch Forest' + DisplayName: '&6Birch Forest' + DisplayItem: + Material: BIRCH_SAPLING + Data: 0 Permission: true Normal: true - Nether: false - End: false BIRCH_FOREST_HILLS: - DisplayName: 'Birch Forest Hills' + DisplayName: '&6Birch Forest Hills' + DisplayItem: + Material: BIRCH_LEAVES + Data: 0 Permission: true Normal: true - Nether: false - End: false COLD_OCEAN: - DisplayName: 'Cold Ocean' + DisplayName: '&6Cold Ocean' + DisplayItem: + Material: SEAGRASS + Data: 0 Permission: true Normal: true - Nether: false - End: false CRIMSON_FOREST: - DisplayName: 'Crimson Forest' + DisplayName: '&6Crimson Forest' + DisplayItem: + Material: WEEPING_VINES + Data: 0 Permission: true Normal: false - Nether: true - End: false DARK_FOREST: - DisplayName: 'Dark Forest' + DisplayName: '&6Dark Forest' + DisplayItem: + Material: DARK_OAK_SAPLING + Data: 0 Permission: true Normal: true - Nether: false - End: false DARK_FOREST_HILLS: - DisplayName: 'Dark Forest Hills' + DisplayName: '&6Dark Forest Hills' + DisplayItem: + Material: DARK_OAK_LEAVES + Data: 0 Permission: true Normal: true - Nether: false - End: false DEEP_COLD_OCEAN: - DisplayName: 'Deep Cold Ocean' + DisplayName: '&6Deep Cold Ocean' + DisplayItem: + Material: COD + Data: 0 Permission: true Normal: true - Nether: false - End: false DEEP_FROZEN_OCEAN: - DisplayName: 'Deep Frozen Ocean' + DisplayName: '&6Deep Frozen Ocean' + DisplayItem: + Material: ICE + Data: 0 Permission: true Normal: true - Nether: false - End: false DEEP_LUKEWARM_OCEAN: - DisplayName: 'Deep Lukewarm Ocean' + DisplayName: '&6Deep Lukewarm Ocean' + DisplayItem: + Material: PUFFERFISH + Data: 0 Permission: true Normal: true - Nether: false - End: false DEEP_OCEAN: - DisplayName: 'Deep Ocean' + DisplayName: '&6Deep Ocean' + DisplayItem: + Material: GRAVEL + Data: 0 Permission: true Normal: true - Nether: false - End: false DEEP_WARM_OCEAN: - DisplayName: 'Deep Warm Ocean' + DisplayName: '&6Deep Warm Ocean' + DisplayItem: + Material: TROPICAL_FISH + Data: 0 Permission: true Normal: true - Nether: false - End: false DESERT: - DisplayName: 'Desert' + DisplayName: '&6Desert' + DisplayItem: + Material: CACTUS + Data: 0 Permission: true Normal: true - Nether: false - End: false DESERT_HILLS: - DisplayName: 'Desert Hills' + DisplayName: '&6Desert Hills' + DisplayItem: + Material: RED_SAND + Data: 0 Permission: true Normal: true - Nether: false - End: false DESERT_LAKES: - DisplayName: 'Desert Lakes' + DisplayName: '&6Desert Lakes' + DisplayItem: + Material: SANDSTONE + Data: 0 Permission: true Normal: true - Nether: false - End: false END_BARRENS: - DisplayName: 'End Barrens' + DisplayName: '&6End Barrens' + DisplayItem: + Material: END_STONE + Data: 0 Permission: true Normal: false - Nether: false - End: end END_HIGHLANDS: - DisplayName: 'End HighLands' + DisplayName: '&6End HighLands' + DisplayItem: + Material: END_STONE_BRICKS + Data: 0 Permission: true Normal: false - Nether: false - End: true END_MIDLANDS: - DisplayName: 'End Midlands' + DisplayName: '&6End Midlands' + DisplayItem: + Material: PURPUR_BLOCK + Data: 0 Permission: true Normal: false - Nether: false - End: end ERODED_BADLANDS: - DisplayName: 'Eroded Badlands' + DisplayName: '&6Eroded Badlands' + DisplayItem: + Material: PINK_TERRACOTTA + Data: 0 Permission: true Normal: true - Nether: false - End: false FLOWER_FOREST: - DisplayName: 'Flower Forest' + DisplayName: '&6Flower Forest' + DisplayItem: + Material: SUNFLOWER + Data: 0 Permission: true Normal: true - Nether: false - End: false FOREST: - DisplayName: 'Forest' + DisplayName: '&6Forest' + DisplayItem: + Material: APPLE + Data: 0 Permission: true Normal: true - Nether: false - End: false FROZEN_OCEAN: - DisplayName: 'Frozen Ocean' + DisplayName: '&6Frozen Ocean' + DisplayItem: + Material: ICE + Data: 0 Permission: true Normal: true - Nether: false - End: false FROZEN_RIVER: - DisplayName: 'Frozen River' + DisplayName: '&6Frozen River' + DisplayItem: + Material: COD + Data: 0 Permission: true Normal: true - Nether: false - End: false GIANT_SPRUCE_TAIGA: - DisplayName: 'Giant Spruce Taiga' + DisplayName: '&6Giant Spruce Taiga' + DisplayItem: + Material: SPRUCE_LOG + Data: 0 Permission: true Normal: true - Nether: false - End: false GIANT_SPRUCE_TAIGA_HILLS: - DisplayName: 'Giant Spruce Taiga Hills' + DisplayName: '&6Giant Spruce Taiga Hills' + DisplayItem: + Material: SPRUCE_LEAVES + Data: 0 Permission: true Normal: true - Nether: false - End: false GIANT_TREE_TAIGA: DisplayName: 'Giant Tree Taiga' + DisplayItem: + Material: SPRUCE_SAPLING + Data: 0 Permission: true Normal: true - Nether: false - End: false GIANT_TREE_TAIGA_HILLS: - DisplayName: 'Giant Tree Taiga Hills' + DisplayName: '&6Giant Tree Taiga Hills' + DisplayItem: + Material: SPRUCE_WOOD + Data: 0 Permission: true Normal: true - Nether: false - End: false GRAVELLY_MOUNTAINS: - DisplayName: 'Gravelly Mountains' + DisplayName: '&6Gravelly Mountains' + DisplayItem: + Material: GRAVEL + Data: 0 Permission: true Normal: true - Nether: false - End: false ICE_SPIKES: - DisplayName: 'Ice Spikes' + DisplayName: '&6Ice Spikes' + DisplayItem: + Material: PACKED_ICE + Data: 0 Permission: true Normal: true - Nether: false - End: false JUNGLE: - DisplayName: 'Jungle' + DisplayName: '&6Jungle' + DisplayItem: + Material: VINES + Data: 0 Permission: true Normal: true - Nether: false - End: false JUNGLE_EDGE: - DisplayName: 'Jungle Edge' + DisplayName: '&6Jungle Edge' + DisplayItem: + Material: JUNGLE_TREE_LOG + Data: 0 Permission: true Normal: true - Nether: false - End: false JUNGLE_HILLS: - DisplayName: 'Jungle Hills' + DisplayName: '&6Jungle Hills' + DisplayItem: + Material: JUNGLE_TREE_SAPLING + Data: 0 Permission: true Normal: true - Nether: false - End: false LUKEWARM_OCEAN: - DisplayName: 'Lukewarm Ocean' + DisplayName: '&6Lukewarm Ocean' + DisplayItem: + Material: KELP + Data: 0 Permission: true Normal: true - Nether: false - End: false MODIFIED_BADLANDS_PLATEAU: - DisplayName: 'Modified Badlands Plateau' + DisplayName: '&6Modified Badlands Plateau' + DisplayItem: + Material: STONE + Data: 0 Permission: true - Normal: true - Nether: false - End: false + Normal: false MODIFIED_GRAVELLY_MOUNTAINS: - DisplayName: 'Modified Gravelly Mountains' + DisplayName: '&6Modified Gravelly Mountains' + DisplayItem: + Material: STONE + Data: 0 Permission: true - Normal: true - Nether: false - End: false + Normal: false MODIFIED_JUNGLE: - DisplayName: 'Modified Jungle' + DisplayName: '&6Modified Jungle' + DisplayItem: + Material: STONE + Data: 0 Permission: true - Normal: true - Nether: false - End: false + Normal: false MODIFIED_JUNGLE_EDGE: - DisplayName: 'Modified Jungle Edge' + DisplayName: '&6Modified Jungle Edge' + DisplayItem: + Material: STONE + Data: 0 Permission: true - Normal: true - Nether: false - End: false + Normal: false MODIFIED_WOODED_BADLANDS_PLATEAU: - DisplayName: 'Modified Wooden Badlands Plateau' + DisplayName: '&6Modified Wooden Badlands Plateau' + DisplayItem: + Material: STONE + Data: 0 Permission: true - Normal: true - Nether: false - End: false + Normal: false MOUNTAINS: - DisplayName: 'Mountains' + DisplayName: '&6Mountains' + DisplayItem: + Material: STONE + Data: 0 Permission: true Normal: true - Nether: false - End: false MOUNTAIN_EDGE: - DisplayName: 'Mountain Edge' + DisplayName: '&6Mountain Edge' + DisplayItem: + Material: DIORITE + Data: 0 Permission: true Normal: true - Nether: false - End: false MUSHROOM_FIELDS: - DisplayName: 'Mushroom Fields' + DisplayName: '&6Mushroom Fields' + DisplayItem: + Material: RED_MUSHROOM + Data: 0 Permission: true Normal: true - Nether: false - End: false MUSHROOM_FIELD_SHORE: - DisplayName: 'Mushroom Field Shore' + DisplayName: '&6Mushroom Field Shore' + DisplayItem: + Material: BROWN_MUSHROOM + Data: 0 Permission: true Normal: true - Nether: false - End: false # PRE-1.16 NETHER: - DisplayName: 'Nether' + DisplayName: '&6Nether' + DisplayItem: + Material: NETHERRACK + Data: 0 Permission: true Normal: false - Nether: true - End: false NETHER_WASTES: - DisplayName: 'Nether Wastes' + DisplayName: '&6Nether Wastes' + DisplayItem: + Material: NETHER_WART + Data: 0 Permission: true Normal: false - Nether: true - End: false OCEAN: - DisplayName: 'Ocean' + DisplayName: '&6Ocean' + DisplayItem: + Material: SEA_LANTERN + Data: 0 Permission: true Normal: true - Nether: false - End: false PLAINS: - DisplayName: 'Plains' + DisplayName: '&6Plains' + DisplayItem: + Material: GRASS_BLOCK + Data: 0 Permission: true Normal: true - Nether: false - End: false RIVER: - DisplayName: 'River' + DisplayName: '&6River' + DisplayItem: + Material: SUGAR_CANE + Data: 0 Permission: true Normal: true - Nether: false - End: false SAVANNA: - DisplayName: 'Savanna' + DisplayName: '&6Savanna' + DisplayItem: + Material: GRASS + Data: 0 Permission: true Normal: true - Nether: false - End: false SAVANNA_PLATEAU: - DisplayName: 'Savanna Plateau' + DisplayName: '&6Savanna Plateau' + DisplayItem: + Material: STONE + Data: 0 Permission: true - Normal: true - Nether: false - End: false + Normal: false SHATTERED_SAVANNA: - DisplayName: 'Shattered Savanna' + DisplayName: '&6Shattered Savanna' + DisplayItem: + Material: STONE + Data: 0 Permission: true - Normal: true - Nether: false - End: false + Normal: false SHATTERED_SAVANNA_PLATEAU: - DisplayName: 'Shattered Savanna Plateau' + DisplayName: '&6Shattered Savanna Plateau' + DisplayItem: + Material: STONE + Data: 0 Permission: true - Normal: true - Nether: false - End: false + Normal: false SMALL_END_ISLANDS: - DisplayName: 'Small End Island' + DisplayName: '&6Small End Island' + DisplayItem: + Material: PURPUR_PILLAR + Data: 0 Permission: true Normal: false - Nether: false - End: true SNOWY_BEACH: - DisplayName: 'Snowy Beach' + DisplayName: '&6Snowy Beach' + DisplayItem: + Material: RABBIT_FOOT + Data: 0 Permission: true Normal: true - Nether: false - End: false SNOWY_MOUNTAINS: - DisplayName: 'Snowy Mountains' + DisplayName: '&6Snowy Mountains' + DisplayItem: + Material: SNOW_BLOCK + Data: 0 Permission: true Normal: true - Nether: false - End: false SNOWY_TAIGA: - DisplayName: 'Snowy Taiga' + DisplayName: '&6Snowy Taiga' + DisplayItem: + Material: SPRUCE_SAPLING + Data: 0 Permission: true Normal: true - Nether: false - End: false SNOWY_TAIGA_HILLS: - DisplayName: 'Snowy Taiga Hills' + DisplayName: '&6Snowy Taiga Hills' + DisplayItem: + Material: SNOWBALL + Data: 0 Permission: true Normal: true - Nether: false - End: false SNOWY_TAIGA_MOUNTAINS: - DisplayName: 'Snowy Taiga Mountains' + DisplayName: '&6Snowy Taiga Mountains' + DisplayItem: + Material: SWEET_BERRIES + Data: 0 Permission: true Normal: true - Nether: false - End: false SNOWY_TUNDRA: - DisplayName: 'Snowy Tundra' + DisplayName: '&6Snowy Tundra' + DisplayItem: + Material: SNOW + Data: 0 Permission: true Normal: true - Nether: false - End: false SOUL_SAND_VALLEY: - DisplayName: 'Soul Sand Valley' + DisplayName: '&6Soul Sand Valley' + DisplayItem: + Material: SOULSAND + Data: 0 Permission: true Normal: false - Nether: true - End: false STONE_SHORE: - DisplayName: 'Stone Shore' + DisplayName: '&6Stone Shore' + DisplayItem: + Material: CLAY + Data: 0 Permission: true Normal: true - Nether: false - End: false SUNFLOWER_PLAINS: - DisplayName: 'Sunflower Plains' + DisplayName: '&6Sunflower Plains' + DisplayItem: + Material: SUNFLOWER + Data: 0 Permission: true Normal: true - Nether: false - End: false SWAMP: - DisplayName: 'Swamp' + DisplayName: '&6Swamp' + DisplayItem: + Material: LILYPAD + Data: 0 Permission: true Normal: true - Nether: false - End: false SWAMP_HILLS: - DisplayName: 'Swamp Hills' + DisplayName: '&6Swamp Hills' + DisplayItem: + Material: SLIME_BLOCK + Data: 0 Permission: true Normal: true - Nether: false - End: false TAIGA: - DisplayName: 'Taiga' + DisplayName: '&6Taiga' + DisplayItem: + Material: SPRUCE_WOOD + Data: 0 Permission: true Normal: true - Nether: false - End: false TAIGA_HILLS: - DisplayName: 'Taiga Hills' + DisplayName: '&6Taiga Hills' + DisplayItem: + Material: STONE + Data: 0 Permission: true - Normal: true - Nether: false - End: false + Normal: false TAIGA_MOUNTAINS: - DisplayName: 'Taiga Mountains' + DisplayName: '&6Taiga Mountains' + DisplayItem: + Material: STONE + Data: 0 Permission: true - Normal: true - Nether: false - End: false + Normal: false TALL_BIRCH_FOREST: - DisplayName: 'Tall Birch Forest' + DisplayName: '&6Tall Birch Forest' + DisplayItem: + Material: BIRCH_LOG + Data: 0 Permission: true Normal: true - Nether: false - End: false TALL_BIRCH_HILLS: - DisplayName: 'Tall Birch Hills' + DisplayName: '&6Tall Birch Hills' + DisplayItem: + Material: BIRCH_PLANKS + Data: 0 Permission: true Normal: true - Nether: false - End: false THE_END: - DisplayName: 'The End' + DisplayName: '&6The End' + DisplayItem: + Material: CHORUS_FRUIT + Data: 0 Permission: true Normal: false - Nether: false - End: true THE_VOID: - DisplayName: 'The Void' + DisplayName: '&6The Void' + DisplayItem: + Material: BEDROCK + Data: 0 Permission: true Normal: false - Nether: false - End: false WARM_OCEAN: - DisplayName: 'Warm Ocean' + DisplayName: '&6Warm Ocean' + DisplayItem: + Material: BRAIN_CORAL + Data: 0 Permission: true Normal: true - Nether: false - End: false WARPED_FOREST: - DisplayName: 'Warped Forest' + DisplayName: '&6Warped Forest' + DisplayItem: + Material: WARPED_STEM + Data: 0 Permission: true Normal: false - Nether: true - End: false WOODED_BADLANDS_PLATEAU: - DisplayName: 'Wooded Badlands Plateau' + DisplayName: '&6Wooded Badlands Plateau' + DisplayItem: + Material: STONE + Data: 0 Permission: true - Normal: true - Nether: false - End: false + Normal: false WOODED_HILLS: - DisplayName: 'Wooded Hills' + DisplayName: '&6Wooded Hills' + DisplayItem: + Material: STONE + Data: 0 Permission: true - Normal: true - Nether: false - End: false + Normal: false WOODED_MOUNTAINS: - DisplayName: 'Wooded Mountains' + DisplayName: '&6Wooded Mountains' + DisplayItem: + Material: STONE + Data: 0 Permission: true - Normal: true - Nether: false - End: false \ No newline at end of file + Normal: false \ No newline at end of file diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index e192acda..cb9a5d86 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -182,10 +182,6 @@ Island: Type: Plains Cooldown: Time: 900 - # If the Nether/End biomes should be allowed in the overworld - AllowOtherWorldlyBiomes: - Nether: true - End: true Weather: Default: # The weather and time will operate the same weather and time as the world. @@ -355,6 +351,7 @@ Island: BlazeImmuneToWaterInNether: false Restrict: # Blocks that can be placed only if the island has nether unlocked + # You may add/remove as many as you want NetherBlocks: NETHERRACK: true SOUL_SAND: true @@ -377,7 +374,63 @@ Island: NETHER_WART_BLOCK: true WITHER_SKELETON_SKULL: true WITHER_ROSE: true + CRIMSON_NYLIUM: true + WARPED_NYLIUM: true + CRIMSON_PLANKS: true + WARPED_PLANKS: true + NETHER_GOLD_ORE: true + CRIMSTON_STEM: true + WARPED_STEM: true + STRIPPED_CRIMSON_STEM: true + STRIPPED_WARPED_STEM: true + STRIPPED_CRIMSON_HYPHAE: true + STRIPPED_WARPED_HYPHAE: true + CRIMSON_HYPHAE: true + WARPED_HYPHAE: true + CRIMSON_FUNGUS: true + WARPED_FUNGUS: true + CRIMSON_ROOTS: true + WARPED_ROOTS: true + NETHER_SPROUTS: true + WEEPING_VINES: true + TWISTING_VINES: true + SOUL_OIL: true + BASALT: true + POLISHED_BASALT: true + SOUL_TORCH: true + CRIMSON_TRAPDOOR: true + WARPED_TRAPDOOR: true + CHAIN: true + CRIMSON_FENCE_GATE: true + WARPED_FENCE_GATE: true + CRACKED_NETHER_BRICKS: true + BLACKSTONE_WALL: true + POLISHED_BLACKSTONE_WALL: true + POLISHED_BLACKSTONE_BRICK_WALL: true + CRIMSON_BUTTON: true + WARPED_BUTTON: true + POLISHED_BLACKSTONE_BUTTON: true + SOUL_CAMPFIRE: true + SHROOMLIGHT: true + LODESTONE: true + NETHERITE_BLOCK: true + ANCIENT_DEBRIS: true + CRYING_OBSIDIAN: true + BLACKSTONE: true + BLACKSTONE_SLAB: true + BLACKSTONE_STAIRS: true + GLIDED_BLACKSTONE: true + POLISHED_BLACKSTONE: true + POLISHED_BLACKSTONE_SLAB: true + POLISHED_BLACKSTONE_STAIRS: true + CHISELED_POLISHED_BLACKSTONE: true + POLISHED_BLACKSTONE_BRICKS: true + POLISHED_BLACKSTONE_BRICK_SLAB: true + POLISHED_BLACKSTONE_BRICK_STAIRS: true + CRACKED_POLISHED_BLACKSTONE_BRICKS: true + RESPAWN_ANCHOR: true # Blocks that can be placed only if the island has The End unlocked + # You may add/remove as many as you want EndBlocks: END_STONE: true END_STONE_BRICKS: true diff --git a/src/main/resources/language.yml b/src/main/resources/language.yml index 92928327..ae0437b4 100644 --- a/src/main/resources/language.yml +++ b/src/main/resources/language.yml @@ -2574,8 +2574,6 @@ Menu: Item: Exit: Displayname: '&cExit Biome Selection' - Barrier: - Displayname: '&cSelect a Biome' Info: Displayname: '&bCurrent Biome' Lore: @@ -2589,6 +2587,10 @@ Menu: Lore: - '&7Click to Set!' Displayname: '&aBiome: &e%biome_type' + Next: + Displayname: '&aNext Page >' + Previous: + Displayname: '&a< Previous Page' Title: '&8Select a Biome' Information: Categories: diff --git a/src/main/resources/stackables.yml b/src/main/resources/stackables.yml index 77198f3a..a65bb44a 100644 --- a/src/main/resources/stackables.yml +++ b/src/main/resources/stackables.yml @@ -3,3 +3,4 @@ Stackables: - IRON_BLOCK - GOLD_BLOCK - EMERALD_BLOCK + - NETHERITE_BLOCK