diff --git a/pom.xml b/pom.xml index 27fb51ec..8b1d5158 100644 --- a/pom.xml +++ b/pom.xml @@ -29,29 +29,39 @@ jitpack.io https://jitpack.io + + placeholderapi + http://repo.extendedclip.com/content/repositories/placeholderapi/ + + + me.clip + placeholderapi + 2.10.9 + org.spigotmc - spigot-api-v1164 + spigot-api 1.16.4-R0.1-SNAPSHOT system ${project.basedir}/libs/spigot-1.16.4.jar - - com.github.MilkBowl - VaultAPI - 1.7 - provided - org.spigotmc - spigot-api-v1163 + spigot-api-v163 1.16.3-R0.1-SNAPSHOT system ${project.basedir}/libs/spigot-1.16.3.jar + + com.github.MilkBowl + VaultAPI + 1.7 + system + ${project.basedir}/libs/Vault.jar + com.comphenix.protocol ProtocolLib diff --git a/src/main/java/dev/efnilite/witp/ParkourPlayer.java b/src/main/java/dev/efnilite/witp/ParkourPlayer.java index 13a15ea5..f8fddb65 100644 --- a/src/main/java/dev/efnilite/witp/ParkourPlayer.java +++ b/src/main/java/dev/efnilite/witp/ParkourPlayer.java @@ -94,7 +94,7 @@ public ParkourPlayer(@NotNull Player player, int highScore, String time, String player.setPlayerTime(getTime(time), false); WITP.getDivider().generate(this); - if (showDeathMsg) { + if (showDeathMsg && ParkourGenerator.Configurable.SCOREBOARD) { updateScoreboard(); } if (player.isOp() && WITP.isOutdated) { @@ -196,7 +196,7 @@ public void menu() { InventoryBuilder builder3 = new InventoryBuilder(this, 3, "Time").open(); if (WITP.getConfiguration().getFile("config").getBoolean("styles.enabled")) { - builder.setItem(10, new ItemBuilder(Material.END_STONE, "&a&lParkour style") + builder.setItem(9, new ItemBuilder(Material.END_STONE, "&a&lParkour style") .setLore("&7The style of your parkour.", "&7(which blocks will be used)", "", "&7Currently: &a" + style).build(), (t, e) -> { List styles = Util.getNode(WITP.getConfiguration().getFile("config"), "styles.list"); if (styles == null) { @@ -226,7 +226,7 @@ public void menu() { builder2.build(); }); } - builder.setItem(11, new ItemBuilder(Material.GLASS, "&a&lLead") + builder.setItem(10, new ItemBuilder(Material.GLASS, "&a&lLead") .setLore("&7How many blocks will", "&7be generated ahead of you.", "", "&7Currently: &a" + blockLead + " blocks").build(), (t, e) -> { for (int i = 10; i < 17; i++) { builder1.setItem(i, new ItemBuilder(Material.PAPER, "&b&l" + (i - 9) + " block(s)").build(), (t2, e2) -> { @@ -239,7 +239,7 @@ public void menu() { builder1.setItem(26, new ItemBuilder(Material.ARROW, "&c&lClose").build(), (t2, e2) -> player.closeInventory()); builder1.build(); }); - builder.setItem(12, new ItemBuilder(Material.CLOCK, "&a&lTime") + builder.setItem(11, new ItemBuilder(Material.CLOCK, "&a&lTime") .setLore("&7The time of day.", "", "&7Currently: &a" + time.toLowerCase()).build(), (t, e) -> { List times = Arrays.asList("Day", "Noon", "Dawn", "Night", "Midnight"); int i = 11; @@ -261,7 +261,7 @@ public void menu() { Material difficulty = useDifficulty ? Material.GREEN_WOOL : Material.RED_WOOL; String difficultyString = Boolean.toString(useDifficulty); String difficultyValue = Util.normalizeBoolean(Util.colorBoolean(difficultyString)); - builder.setItem(13, new ItemBuilder(difficulty, "&a&lUse difficulty") + builder.setItem(12, new ItemBuilder(difficulty, "&a&lUse difficulty") .setLore("&7If enabled having a higher score will mean", "&7the parkour becomes more difficult.", "", "&7Currently: " + difficultyValue).build(), (t2, e2) -> { useDifficulty = !useDifficulty; @@ -304,7 +304,7 @@ public void menu() { String specialString = Boolean.toString(useSpecial); String specialValue = Util.normalizeBoolean(Util.colorBoolean(specialString)); builder.setItem(16, new ItemBuilder(special, "&a&lUse special blocks") - .setLore("&7If enabled uses special blocks.", "", + .setLore("&7If enabled uses special blocks like ice and slabs.", "", "&7Currently: " + specialValue).build(), (t2, e2) -> { useSpecial = !useSpecial; send("&7You changed your usage of special blocks to " + @@ -312,18 +312,18 @@ public void menu() { saveStats(); player.closeInventory(); }); -// Material structures = useStructures ? Material.GREEN_WOOL : Material.RED_WOOL; -// String structuresString = Boolean.toString(useStructures); -// String structuresValue = Util.normalizeBoolean(Util.colorBoolean(useStructures)); -// builder.setItem(15, new ItemBuilder(structures, "&a&lUse structures") -// .setLore("&7If enabled static structures", "&7will appear throughout the parkour.", "", -// "&7Currently: " + structuresValue).build(), (t2, e2) -> { -// useStructures = !useStructures; -// send("&7You changed your changed your usage of structures to " + - // Util.normalizeBoolean(Util.colorBoolean(Util.reverseBoolean(structuresString)))); -// saveStats(); -// player.closeInventory(); -// }); + Material structures = useStructure ? Material.GREEN_WOOL : Material.RED_WOOL; + String structuresString = Boolean.toString(useStructure); + String structuresValue = Util.normalizeBoolean(Util.colorBoolean(structuresString)); + builder.setItem(17, new ItemBuilder(structures, "&a&lUse structures") + .setLore("&7If enabled static structures", "&7will appear throughout the parkour.", "", + "&7Currently: " + structuresValue).build(), (t2, e2) -> { + useStructure = !useStructure; + send("&7You changed your usage of structures to " + + Util.normalizeBoolean(Util.colorBoolean(Util.reverseBoolean(structuresString)))); + saveStats(); + player.closeInventory(); + }); builder.setItem(26, new ItemBuilder(Material.BARRIER, "&4&lQuit").build(), (t2, e2) -> { try { ParkourPlayer.unregister(this, true); diff --git a/src/main/java/dev/efnilite/witp/WITP.java b/src/main/java/dev/efnilite/witp/WITP.java index 2e099ceb..2989786a 100644 --- a/src/main/java/dev/efnilite/witp/WITP.java +++ b/src/main/java/dev/efnilite/witp/WITP.java @@ -3,6 +3,7 @@ import dev.efnilite.witp.command.MainCommand; import dev.efnilite.witp.generator.ParkourGenerator; import dev.efnilite.witp.generator.subarea.SubareaDivider; +import dev.efnilite.witp.hook.PlaceholderHook; import dev.efnilite.witp.util.Configuration; import dev.efnilite.witp.util.Util; import dev.efnilite.witp.util.Verbose; @@ -68,6 +69,9 @@ public void onEnable() { if (configuration.getFile("config").getBoolean("metrics")) { new Metrics(this, 9272); } + if (getServer().getPluginManager().getPlugin("PlaceholderAPI") != null) { + new PlaceholderHook().register(); + } ParkourGenerator.Configurable.init(); this.getServer().getPluginManager().registerEvents(this, this); @@ -80,7 +84,7 @@ public void onEnable() { public void run() { checker.check(); } - }, 20 * 60 * 20); + }, 30 * 60 * 20); } private void addCommand(String name, BukkitCommand wrapper) { diff --git a/src/main/java/dev/efnilite/witp/generator/ParkourGenerator.java b/src/main/java/dev/efnilite/witp/generator/ParkourGenerator.java index 38565bcf..9c9205e7 100644 --- a/src/main/java/dev/efnilite/witp/generator/ParkourGenerator.java +++ b/src/main/java/dev/efnilite/witp/generator/ParkourGenerator.java @@ -87,7 +87,7 @@ public ParkourGenerator(ParkourPlayer player) { this.borderOffset = Configurable.BORDER_SIZE / 2.0; this.stopped = false; this.player = player; - this.structureCooldown = 30; + this.structureCooldown = 20; this.lastSpawn = player.getPlayer().getLocation().clone(); this.lastPlayer = lastSpawn.clone(); this.distanceChances = new HashMap<>(); @@ -131,10 +131,10 @@ public void run() { // Structure deletion check if (structureBlocks.contains(current) && current.getType() == Material.RED_WOOL && !deleteStructure) { score += 10; - if (player.showDeathMsg) { + if (player.showDeathMsg && Configurable.SCOREBOARD) { player.updateScoreboard(); } - structureCooldown = 30; + structureCooldown = 20; generateNext(player.blockLead); deleteStructure = true; return; @@ -150,16 +150,18 @@ public void run() { totalScore++; // Rewards - if (Configurable.REWARDS && totalScore % Configurable.REWARDS_INTERVAL == 0 && Configurable.REWARDS_COMMAND != null) { - Bukkit.dispatchCommand(Bukkit.getServer().getConsoleSender(), Configurable.REWARDS_COMMAND); - player.send(Configurable.REWARDS_MESSAGE); + if (Configurable.REWARDS && totalScore % Configurable.REWARDS_INTERVAL == 0) { + if (Configurable.REWARDS_COMMAND != null) { + Bukkit.dispatchCommand(Bukkit.getServer().getConsoleSender(), Configurable.REWARDS_COMMAND); + } if (Configurable.REWARDS_MONEY != 0) { Util.depositPlayer(player.getPlayer(), Configurable.REWARDS_MONEY); } + player.send(Configurable.REWARDS_MESSAGE); } new PlayerScoreEvent(player).call(); - if (player.showDeathMsg) { + if (player.showDeathMsg && Configurable.SCOREBOARD) { player.updateScoreboard(); } List locations = new ArrayList<>(buildLog.keySet()); @@ -185,7 +187,7 @@ public void run() { } time = stopwatch.toString(); player.getPlayer().setSaturation(20); - if (player.showDeathMsg) { + if (player.showDeathMsg && Configurable.SCOREBOARD) { player.updateScoreboard(); } } @@ -209,7 +211,7 @@ public void reset(boolean regenerate) { for (String s : buildLog.keySet()) { Util.parseLocation(s).getBlock().setType(Material.AIR); } - structureCooldown = 30; + structureCooldown = 20; buildLog.clear(); player.getPlayer().teleport(playerSpawn); if (player.showDeathMsg) { @@ -412,7 +414,6 @@ public void generateNext() { List possible = getPossible(gap - height, height); if (possible.size() == 0) { lastSpawn = local; - generateNext(); return; } @@ -436,17 +437,30 @@ public void generateNext() { List files = Arrays.asList(folder.listFiles((dir, name) -> name.contains("parkour-"))); File structure = files.get(random.nextInt(files.size() - 1)); - structureCooldown = 30; + structureCooldown = 20; int gapStructure = distanceChances.get(random.nextInt(distanceChances.size())) + 1; + + Location local2 = lastSpawn.clone(); List possibleStructure = getPossible(gapStructure, 0); if (possibleStructure.size() == 0) { + lastSpawn = local2; return; } Block chosenStructure = possibleStructure.get(random.nextInt(possibleStructure.size())); StructureData data = WITP.getVersionManager().placeAt(structure, chosenStructure.getLocation(), heading); - structureBlocks = new ArrayList<>(data.blocks); + structureBlocks = data.blocks; lastSpawn = data.end.clone(); + + // if something during the pasting was set to air + List locations = new ArrayList<>(buildLog.keySet()); + int index = buildLog.get(Util.toString(lastPlayer, false)); + for (int i = 0; i < index; i++) { + Block block = Util.parseLocation(locations.get(i)).getBlock(); + if (!structureBlocks.contains(block) && block.getType() == Material.AIR) { + block.setType(player.randomMaterial()); + } + } break; } @@ -540,10 +554,6 @@ public boolean isNearBorder(Vector vector) { return Math.abs(borderOffset - Math.abs(vector.getX())) < 25 || Math.abs(borderOffset - Math.abs(vector.getZ())) < 25; } - public boolean isNearIsland(Vector vector) { - return vector.distance(playerSpawn.toVector()) < 50; - } - /** * Class for variables required in generating without accessing the file a lot (constants) */ @@ -581,6 +591,8 @@ public static class Configurable { public static int SOUND_PITCH; public static Particle PARTICLE_TYPE; + public static boolean SCOREBOARD; + // Advanced settings public static double BORDER_SIZE; public static int GENERATOR_CHECK; @@ -629,6 +641,8 @@ public static void init() { REWARDS_MESSAGE = null; } + SCOREBOARD = config.getBoolean("scoreboard.enabled"); + SOUND_TYPE = Sound.valueOf(config.getString("particles.sound-type").toUpperCase()); SOUND_PITCH = config.getInt("particles.sound-pitch"); PARTICLE_TYPE = Particle.valueOf(config.getString("particles.particle-type").toUpperCase()); diff --git a/src/main/java/dev/efnilite/witp/hook/PlaceholderHook.java b/src/main/java/dev/efnilite/witp/hook/PlaceholderHook.java new file mode 100644 index 00000000..6955499b --- /dev/null +++ b/src/main/java/dev/efnilite/witp/hook/PlaceholderHook.java @@ -0,0 +1,72 @@ +package dev.efnilite.witp.hook; + +import dev.efnilite.witp.ParkourPlayer; +import dev.efnilite.witp.WITP; +import me.clip.placeholderapi.expansion.PlaceholderExpansion; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +public class PlaceholderHook extends PlaceholderExpansion { + + @Override + public @NotNull String getIdentifier() { + return "witp"; + } + + @Override + public @NotNull String getAuthor() { + return "Efnilite"; + } + + @Override + public boolean canRegister(){ + return true; + } + + + @Override + public boolean persist(){ + return true; + } + + @Override + public @NotNull String getVersion() { + return WITP.getInstance().getDescription().getVersion(); + } + + @Override + public String onPlaceholderRequest(Player player, @NotNull String params) { + if (player == null) { + return "player doesn't exist"; + } + ParkourPlayer pp = ParkourPlayer.getPlayer(player); + if (pp == null) { + return "player is not registered"; + } + + switch (params) { + case "highscore": + case "high_score": + return Integer.toString(pp.highScore); + case "score": + case "current_score": + return Integer.toString(pp.getGenerator().score); + case "time": + case "current_time": + return pp.getGenerator().time; + case "version": + case "ver": + return WITP.getInstance().getDescription().getVersion(); + case "blocklead": + case "lead": + return Integer.toString(pp.blockLead); + case "style": + return pp.style; + case "time_pref": + case "time_preference": + return pp.time; + } + + return null; + } +} diff --git a/src/main/java/dev/efnilite/witp/util/Configuration.java b/src/main/java/dev/efnilite/witp/util/Configuration.java index 07e0fb72..4604dfad 100644 --- a/src/main/java/dev/efnilite/witp/util/Configuration.java +++ b/src/main/java/dev/efnilite/witp/util/Configuration.java @@ -53,7 +53,7 @@ public Configuration(Plugin plugin) { * Downloads the structures */ private void structures() { - if (!(new File(plugin.getDataFolder().toString() + "/structures/spawn-island.nbt").exists())) { + if (!(new File(plugin.getDataFolder().toString() + "/structures/parkour-1.nbt").exists())) { String[] schematics = new String[] {"spawn-island.nbt"}; File folder = new File(plugin.getDataFolder().toString() + "/structures"); folder.mkdirs(); diff --git a/src/main/java/dev/efnilite/witp/version/VersionManager_v1_16_R2.java b/src/main/java/dev/efnilite/witp/version/VersionManager_v1_16_R2.java index c9edb8ef..c21d6a62 100644 --- a/src/main/java/dev/efnilite/witp/version/VersionManager_v1_16_R2.java +++ b/src/main/java/dev/efnilite/witp/version/VersionManager_v1_16_R2.java @@ -5,10 +5,12 @@ import dev.efnilite.witp.util.Verbose; import net.minecraft.server.v1_16_R2.*; import org.bukkit.Location; +import org.bukkit.block.Block; import org.bukkit.craftbukkit.v1_16_R2.CraftWorld; import org.bukkit.craftbukkit.v1_16_R2.entity.CraftPlayer; import org.bukkit.entity.Player; import org.bukkit.util.Vector; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.File; @@ -62,6 +64,26 @@ public void pasteStructure(File file, Location to) { } } + // gets the appropriate rotation fo the schematic for the heading + private EnumBlockRotation getRotation(@NotNull Vector heading) { + if (heading.getBlockZ() != 0) { // north/south + switch (heading.getBlockZ()) { + case 1: // south + return EnumBlockRotation.CLOCKWISE_180; + case -1: // north + return EnumBlockRotation.NONE; + } + } else if (heading.getBlockX() != 0) { // east/west + switch (heading.getBlockX()) { + case 1: // east + return EnumBlockRotation.CLOCKWISE_90; + case -1: // west + return EnumBlockRotation.COUNTERCLOCKWISE_90; + } + } + return EnumBlockRotation.COUNTERCLOCKWISE_90; + } + // todo holy shit please fix this @Override public @Nullable ParkourGenerator.StructureData placeAt(File file, Location to, Vector heading) { @@ -71,8 +93,8 @@ public void pasteStructure(File file, Location to) { structure.b(NBTCompressedStreamTools.a(new FileInputStream(file))); World world = ((CraftWorld) to.getWorld()).getHandle(); - DefinedStructureInfo info = new DefinedStructureInfo().a(EnumBlockMirror.NONE).a(EnumBlockRotation.NONE) - .a(false).a((ChunkCoordIntPair) null).c(false).a(ThreadLocalRandom.current()); + DefinedStructureInfo info = new DefinedStructureInfo().a(EnumBlockMirror.NONE).a(getRotation(heading)) + .a(true).a((ChunkCoordIntPair) null).c(true).a(ThreadLocalRandom.current()); StructureBoundingBox box = structure.b(info, new BlockPosition(to.getBlockX(), to.getBlockY(), to.getBlockZ())); Location pos1 = new Location(to.getWorld(), box.a, box.b, box.c); // box coords to bukkit Location pos2 = new Location(to.getWorld(), box.d, box.e, box.f); // box coords to bukkit @@ -89,29 +111,32 @@ public void pasteStructure(File file, Location to) { List beginBlock = structure.a(pos, info, Blocks.LIME_WOOL); Vector beginPos = null; for (DefinedStructure.BlockInfo blockInfo : beginBlock) { - beginPos = new Vector(blockInfo.a.getX(), blockInfo.a.getY(), blockInfo.a.getZ()).clone().subtract(base); + BlockPosition position = blockInfo.a; + beginPos = new Vector(position.getX(), position.getY(), position.getZ()).subtract(base); } if (beginPos == null) { Verbose.error("There is no lime wool (start of parkour) in structure " + file.getName()); return null; } - List endBlock = structure.a(pos, info, Blocks.RED_WOOL); + max.subtract(beginPos); // the max values of everything, but offset so it matches where the schematic gets pasted + min.subtract(beginPos); // the min values of everything, but also offset + to = to.subtract(beginPos); // where the structure gets pasted from (top left corner) + structure.a((WorldAccess) world, new BlockPosition(to.getX(), to.getY(), to.getZ()), info, ThreadLocalRandom.current()); + + List blocks = Util.getBlocks(max.clone(), min.clone()); Location endPos = null; - for (DefinedStructure.BlockInfo blockinfo : endBlock) { - endPos = new Location(to.getWorld(), blockinfo.a.getX(), blockinfo.a.getY(), blockinfo.a.getZ()); + for (Block block : blocks) { + if (block.getType() == org.bukkit.Material.RED_WOOL) { + endPos = block.getLocation(); + } } if (endPos == null) { Verbose.error("There is no red wool (end of parkour) in structure " + file.getName()); return null; } - Vector location = to.clone().subtract(beginPos).toVector(); - structure.a((WorldAccess) world, new BlockPosition(location.getX(), location.getY(), location.getZ()), info, ThreadLocalRandom.current()); - - Location loc = base.toLocation(to.getWorld()); - Vector vector = new Vector(deltaX + 1, max.subtract(min).getBlockY() + 1, deltaZ + 1); - return new ParkourGenerator.StructureData(endPos.clone(), Util.getBlocks(loc, loc.clone().add(vector))); + return new ParkourGenerator.StructureData(endPos.clone(), blocks); } catch (IOException e) { e.printStackTrace(); return null; diff --git a/src/main/java/dev/efnilite/witp/version/VersionManager_v1_16_R3.java b/src/main/java/dev/efnilite/witp/version/VersionManager_v1_16_R3.java index 24a3f311..5ff3f081 100644 --- a/src/main/java/dev/efnilite/witp/version/VersionManager_v1_16_R3.java +++ b/src/main/java/dev/efnilite/witp/version/VersionManager_v1_16_R3.java @@ -94,7 +94,7 @@ private EnumBlockRotation getRotation(@NotNull Vector heading) { World world = ((CraftWorld) to.getWorld()).getHandle(); DefinedStructureInfo info = new DefinedStructureInfo().a(EnumBlockMirror.NONE).a(getRotation(heading)) - .a(false).a((ChunkCoordIntPair) null).c(false).a(ThreadLocalRandom.current()); + .a(true).a((ChunkCoordIntPair) null).c(true).a(ThreadLocalRandom.current()); StructureBoundingBox box = structure.b(info, new BlockPosition(to.getBlockX(), to.getBlockY(), to.getBlockZ())); Location pos1 = new Location(to.getWorld(), box.a, box.b, box.c); // box coords to bukkit Location pos2 = new Location(to.getWorld(), box.d, box.e, box.f); // box coords to bukkit @@ -124,10 +124,7 @@ private EnumBlockRotation getRotation(@NotNull Vector heading) { to = to.subtract(beginPos); // where the structure gets pasted from (top left corner) structure.a((WorldAccess) world, new BlockPosition(to.getX(), to.getY(), to.getZ()), info, ThreadLocalRandom.current()); - Verbose.info(min.toString()); - Verbose.info(max.toString()); - - List blocks = Util.getBlocks(max, min); + List blocks = Util.getBlocks(max.clone(), min.clone()); Location endPos = null; for (Block block : blocks) { if (block.getType() == org.bukkit.Material.RED_WOOL) { diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 668d72ef..b8d30fe2 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -22,11 +22,11 @@ metrics: true # If this is set to true it will display extra data when stuff happens (useful for developers) verbose: false -# Options about Bungeecord +# Options about Bungeecord/autojoining bungeecord: # Enabling this will make players who join the server (that's running this plugin) automatically join the game on that server - # If this is disabled, you have to use /witp join to join and /witp leave to leave. + # !! If this is disabled, you have to use /witp join to join and /witp leave to leave. !! enabled: true # The server the players will be returned to after the game is done @@ -63,18 +63,25 @@ styles: blue: [blue_wool, blue_stained_glass, blue_concrete, blue_terracotta] light blue: [light_blue_wool, light_blue_stained_glass, light_blue_concrete, light_blue_terracotta] green: [green_wool, green_stained_glass, green_concrete, green_terracotta] + lime: [lime_wool, lime_stained_glass, lime_concrete, lime_terracotta] + cyan: [cyan_wool, cyan_stained_glass, cyan_concrete, cyan_terracotta] + purple: [purple_wool, purple_stained_glass, purple_concrete, purple_terracotta] yellow: [yellow_wool, yellow_stained_glass, yellow_concrete, yellow_terracotta] gray: [gray_wool, gray_stained_glass, gray_concrete, gray_terracotta] end: [end_stone, end_stone_bricks, purpur_block, purpur_pillar] - nether: [netherrack, nether_bricks, red_nether_bricks, chiseled_nether_bricks, nether_wart_block, nether_gold_ore, netherite_block] + nether: [netherrack, nether_bricks, red_nether_bricks, chiseled_nether_bricks, nether_wart_block, nether_gold_ore, netherite_block, basalt] quartz: [smooth_quartz, chiseled_quartz_block, quartz_block, quartz_bricks, quartz_pillar] ocean: [prismarine, prismarine_bricks, dark_prismarine, sea_lantern] redstone: [observer, dispenser, redstone_block, piston, sticky_piston, redstone_lamp, target] overworld: [grass_block, stone, cobblestone, oak_log] + ores: [diamond_ore, gold_ore, iron_ore, coal_ore, nether_gold_ore, lapis_ore, redstone_ore, emerald_ore, nether_quartz_ore] + wood: [oak_planks, spruce_planks, jungle_planks, acacia_planks, birch_planks, dark_oak_planks, oak_log, spruce_log, jungle_log, birch_log, acacia_log, dark_oak_log] # How the scoreboard looks # Placeholders: %score%, %time% scoreboard: + enabled: true + title: '&c&lInfinite Parkour' lines: - '&a' diff --git a/src/main/resources/generation.yml b/src/main/resources/generation.yml index c9a9faa2..7dc96d7d 100644 --- a/src/main/resources/generation.yml +++ b/src/main/resources/generation.yml @@ -6,7 +6,8 @@ generation: normal-jump: # The chance for normal jumps to appear (in %) - chance: 70 + # When compared to structures.chance and special.chance this should be 100%, but it can go over + chance: 88 # The chances of different types of block jumps # if 'normal-jump' is selected to be the next parkour section @@ -37,7 +38,7 @@ generation: structures: # The chance for structures to appear (in %) - chance: 20 + chance: 2 settings: diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 67dde7b0..eae68b90 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,9 +1,10 @@ name: 'WITP' description: 'Automatically generating, infinitely long parkour plugin. The sky, and your time, is the limit. The further you go, the harder it gets. Should be a walk in the park, right?' author: Efnilite, Ice_Pancake -version: 1.4a +version: 1.5 api-version: 1.16 main: dev.efnilite.witp.WITP +softdepend: [Vault, PlaceholderAPI] commands: witp: aliases: [parkour]