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
This commit is contained in:
loki 2026-02-25 13:10:10 +01:00
parent 56bf11822e
commit 1b1d363f3b
6 changed files with 103 additions and 0 deletions

View file

@ -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);

View file

@ -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);
}
}

View file

@ -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");
}
}

View file

@ -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 =-

View file

@ -258,3 +258,8 @@ other:
material: "elytra"
name: "&#00D4FF<bold>Flying"
lore: "&#A0A0A0Parkour with elytra!"
modes:
elytra:
name: "&#00D4FF<bold>Elytra"
description: "&#A0A0A0Fly through rings!||&#A0A0A0Use fireworks to boost"

View file

@ -257,3 +257,8 @@ other:
material: "elytra"
name: "&#00D4FF<bold>Полёт"
lore: "&#A0A0A0Паркур с элитрами!"
modes:
elytra:
name: "&#00D4FF<bold>Элитры"
description: "&#A0A0A0Летайте через кольца!||&#A0A0A0Используйте фейерверки для ускорения"