From 1b1d363f3bc511e5829158386180b304f37e6cc9 Mon Sep 17 00:00:00 2001 From: loki Date: Wed, 25 Feb 2026 13:10:10 +0100 Subject: [PATCH] Add Elytra Parkour Mode (basic implementation) - Created ElytraMode class with leaderboard support - Auto-gives elytra and fireworks on mode start - Added elytra mode config options - Added Russian and English localization - Integrated into mode selection menu - TODO: Ring generation, boost system, collision detection --- .../java/dev/loki/loparkour/LoParkour.java | 2 + .../dev/loki/loparkour/mode/ElytraMode.java | 73 +++++++++++++++++++ .../java/dev/loki/loparkour/mode/Modes.java | 2 + src/main/resources/config.yml | 16 ++++ src/main/resources/locales/en.yml | 5 ++ src/main/resources/locales/ru.yml | 5 ++ 6 files changed, 103 insertions(+) create mode 100644 src/main/java/dev/loki/loparkour/mode/ElytraMode.java diff --git a/src/main/java/dev/loki/loparkour/LoParkour.java b/src/main/java/dev/loki/loparkour/LoParkour.java index aaf1452..ed4a7a4 100644 --- a/src/main/java/dev/loki/loparkour/LoParkour.java +++ b/src/main/java/dev/loki/loparkour/LoParkour.java @@ -7,6 +7,7 @@ import dev.loki.loparkour.config.Option; import dev.loki.loparkour.hook.HoloHook; import dev.loki.loparkour.hook.PAPIHook; import dev.loki.loparkour.mode.DefaultMode; +import dev.loki.loparkour.mode.ElytraMode; import dev.loki.loparkour.mode.GravityShiftMode; import dev.loki.loparkour.mode.HardcoreMode; import dev.loki.loparkour.mode.Modes; @@ -106,6 +107,7 @@ public final class LoParkour extends ViPlugin { Registry.register(new SpeedrunMode()); Registry.register(new GravityShiftMode()); Registry.register(new HardcoreMode()); + Registry.register(new ElytraMode()); Modes.init(); Menu.init(this); diff --git a/src/main/java/dev/loki/loparkour/mode/ElytraMode.java b/src/main/java/dev/loki/loparkour/mode/ElytraMode.java new file mode 100644 index 0000000..4fefc3d --- /dev/null +++ b/src/main/java/dev/loki/loparkour/mode/ElytraMode.java @@ -0,0 +1,73 @@ +package dev.loki.loparkour.mode; + +import dev.loki.loparkour.config.Config; +import dev.loki.loparkour.config.Locales; +import dev.loki.loparkour.generator.ParkourGenerator; +import dev.loki.loparkour.leaderboard.Leaderboard; +import dev.loki.loparkour.player.ParkourPlayer; +import dev.loki.loparkour.session.Session; +import dev.efnilite.vilib.inventory.item.Item; +import org.bukkit.GameMode; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * Elytra Parkour Mode - Flying parkour with rings and boost + */ +public class ElytraMode implements Mode { + + private final Leaderboard leaderboard = new Leaderboard(getName(), Leaderboard.Sort.SCORE); + + @Override + @NotNull + public String getName() { + return "elytra"; + } + + @Override + @Nullable + public Item getItem(String locale) { + return Locales.getItem(locale, "modes.elytra"); + } + + @Override + @NotNull + public Leaderboard getLeaderboard() { + return leaderboard; + } + + @Override + public void create(Player player) { + if (!Config.CONFIG.getBoolean("joining")) { + player.sendMessage("§cJoining is currently disabled."); + return; + } + + ParkourPlayer pp = ParkourPlayer.getPlayer(player); + if (pp != null && pp.session.generator != null && pp.session.generator.getMode() instanceof ElytraMode) { + return; + } + + player.closeInventory(); + + // Create session with elytra setup + Session.create(session -> { + ParkourGenerator generator = new ParkourGenerator(session); + + // Give elytra and fireworks to all players in session + for (ParkourPlayer parkourPlayer : session.getPlayers()) { + Player p = parkourPlayer.player; + p.setGameMode(GameMode.ADVENTURE); + p.getInventory().setChestplate(new ItemStack(Material.ELYTRA)); + + int fireworks = Config.CONFIG.getInt("modes.elytra.starting-fireworks"); + p.getInventory().addItem(new ItemStack(Material.FIREWORK_ROCKET, fireworks)); + } + + return generator; + }, null, null, player); + } +} diff --git a/src/main/java/dev/loki/loparkour/mode/Modes.java b/src/main/java/dev/loki/loparkour/mode/Modes.java index 55a6173..41e38d6 100644 --- a/src/main/java/dev/loki/loparkour/mode/Modes.java +++ b/src/main/java/dev/loki/loparkour/mode/Modes.java @@ -9,6 +9,7 @@ public class Modes { public static SpeedrunMode SPEEDRUN; public static GravityShiftMode GRAVITY_SHIFT; public static HardcoreMode HARDCORE; + public static ElytraMode ELYTRA; public static void init() { DEFAULT = (DefaultMode) Registry.getMode("default"); @@ -16,5 +17,6 @@ public class Modes { SPEEDRUN = (SpeedrunMode) Registry.getMode("speedrun"); GRAVITY_SHIFT = (GravityShiftMode) Registry.getMode("gravity-shift"); HARDCORE = (HardcoreMode) Registry.getMode("hardcore"); + ELYTRA = (ElytraMode) Registry.getMode("elytra"); } } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 0509b6e..ee41d19 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -343,6 +343,22 @@ modes: # Reset all rewards on fall reset-rewards: true + # -= Elytra mode =- + elytra: + # Enable elytra mode + enabled: true + # Distance between rings + ring-distance-min: 20 + ring-distance-max: 40 + # Ring size (radius) + ring-size: 5 + # Firework boost power + boost-power: 1.5 + # Firework cooldown in seconds + firework-cooldown: 3 + # Starting fireworks amount + starting-fireworks: 64 + # -= Scoring options =- diff --git a/src/main/resources/locales/en.yml b/src/main/resources/locales/en.yml index d8f7c86..5e1b788 100644 --- a/src/main/resources/locales/en.yml +++ b/src/main/resources/locales/en.yml @@ -258,3 +258,8 @@ other: material: "elytra" name: "�D4FFFlying" lore: "&#A0A0A0Parkour with elytra!" + +modes: + elytra: + name: "�D4FFElytra" + description: "&#A0A0A0Fly through rings!||&#A0A0A0Use fireworks to boost" diff --git a/src/main/resources/locales/ru.yml b/src/main/resources/locales/ru.yml index 2494e0f..b949581 100644 --- a/src/main/resources/locales/ru.yml +++ b/src/main/resources/locales/ru.yml @@ -257,3 +257,8 @@ other: material: "elytra" name: "�D4FFПолёт" lore: "&#A0A0A0Паркур с элитрами!" + +modes: + elytra: + name: "�D4FFЭлитры" + description: "&#A0A0A0Летайте через кольца!||&#A0A0A0Используйте фейерверки для ускорения"