fix and migrate 70%
This commit is contained in:
parent
8705cad578
commit
d1dcf6ab57
138 changed files with 3736 additions and 4735 deletions
101
src/main/java/dev/loki/loparkour/menu/LPMenu.java
Normal file
101
src/main/java/dev/loki/loparkour/menu/LPMenu.java
Normal file
|
|
@ -0,0 +1,101 @@
|
|||
package dev.loki.loparkour.menu;
|
||||
|
||||
import dev.loki.loparkour.config.Locales;
|
||||
import dev.loki.loparkour.config.Option;
|
||||
import dev.loki.loparkour.util.ColorUtil;
|
||||
import dev.lolib.gui.InventoryGUI;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Base class for all LoParkour menus.
|
||||
*
|
||||
* Real LoLib API:
|
||||
* InventoryGUI.create().title(String).rows(n).fill(item).setItem(slot, item, Consumer<InventoryClickEvent>).open(player)
|
||||
* ScrollableGUI.create().title(String).rows(n).addItem(item, Consumer<InventoryClickEvent>).scrollUpButton(item,slot).scrollDownButton(item,slot).open(player)
|
||||
*
|
||||
* cancelAllClicks = true by default — items cannot be taken out automatically.
|
||||
* Handlers receive Consumer<InventoryClickEvent>, event is already cancelled before handler runs.
|
||||
*/
|
||||
public abstract class LPMenu {
|
||||
|
||||
public abstract void open(@NotNull Player player);
|
||||
|
||||
protected String locale(@NotNull Player player) {
|
||||
var user = dev.loki.loparkour.player.ParkourUser.getUser(player);
|
||||
return user != null ? user.locale : Option.OPTIONS_DEFAULTS.get(ParkourOption.LANG);
|
||||
}
|
||||
|
||||
protected ItemStack filler() {
|
||||
ItemStack item = new ItemStack(Material.GRAY_STAINED_GLASS_PANE);
|
||||
ItemMeta meta = item.getItemMeta();
|
||||
if (meta != null) {
|
||||
meta.setDisplayName(" ");
|
||||
item.setItemMeta(meta);
|
||||
}
|
||||
return item;
|
||||
}
|
||||
|
||||
protected ItemStack backItem() {
|
||||
ItemStack item = new ItemStack(Material.RED_DYE);
|
||||
ItemMeta meta = item.getItemMeta();
|
||||
if (meta != null) {
|
||||
meta.setDisplayName(ColorUtil.color("<#DE1F1F><bold>«"));
|
||||
item.setItemMeta(meta);
|
||||
}
|
||||
return item;
|
||||
}
|
||||
|
||||
protected ItemStack nextItem() {
|
||||
ItemStack item = new ItemStack(Material.LIME_DYE);
|
||||
ItemMeta meta = item.getItemMeta();
|
||||
if (meta != null) {
|
||||
meta.setDisplayName(ColorUtil.color("<#0DCB07><bold>»"));
|
||||
item.setItemMeta(meta);
|
||||
}
|
||||
return item;
|
||||
}
|
||||
|
||||
protected ItemStack closeButton(@NotNull Player player) {
|
||||
return localeItem(player, "other.close");
|
||||
}
|
||||
|
||||
protected ItemStack localeItem(@NotNull Player player, @NotNull String key) {
|
||||
return Locales.getItem(player, key).build();
|
||||
}
|
||||
|
||||
protected ItemStack localeItem(@NotNull Player player, @NotNull String key, String... replace) {
|
||||
return Locales.getItem(player, key, replace).build();
|
||||
}
|
||||
|
||||
protected ItemStack localeItem(@NotNull String locale, @NotNull String key) {
|
||||
return Locales.getItem(locale, key).build();
|
||||
}
|
||||
|
||||
protected ItemStack localeItem(@NotNull String locale, @NotNull String key, String... replace) {
|
||||
return Locales.getItem(locale, key, replace).build();
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a base GUI filled with filler items.
|
||||
* Uses .fill() — only fills empty slots, so setItem calls after this override correctly.
|
||||
*/
|
||||
protected InventoryGUI baseGui(String title, int rows) {
|
||||
return InventoryGUI.create()
|
||||
.title(ColorUtil.color(title))
|
||||
.rows(rows)
|
||||
.fill(filler());
|
||||
}
|
||||
|
||||
protected int[] distributeEvenly(int count, int start, int end) {
|
||||
int[] result = new int[count];
|
||||
if (count == 0) return result;
|
||||
for (int i = 0; i < count; i++) {
|
||||
result[i] = start + Math.round((float) i * (end - start) / Math.max(count - 1, 1));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
|
@ -2,28 +2,57 @@ package dev.loki.loparkour.menu;
|
|||
|
||||
import dev.loki.loparkour.config.Config;
|
||||
import dev.loki.loparkour.config.Locales;
|
||||
import dev.loki.loparkour.player.ParkourPlayer;
|
||||
import dev.loki.loparkour.player.ParkourUser;
|
||||
import dev.loki.loparkour.util.ColorUtil;
|
||||
import dev.lolib.gui.InventoryGUI;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public class MainMenu extends DynamicMenu {
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
// TODO: Migrate to LoLib GUI system
|
||||
/*
|
||||
public MainMenu() {
|
||||
registerMainItem(1, 0, (player, user) -> Locales.getItem(player, "play.item").click(event -> Menus.PLAY.open(event.getPlayer())), player -> ParkourOption.PLAY.mayPerform(player) && Config.CONFIG.getBoolean("joining"));
|
||||
registerMainItem(1, 1, (player, user) -> Locales.getItem(player, "community.item").click(event -> Menus.COMMUNITY.open(event.getPlayer())), ParkourOption.COMMUNITY::mayPerform);
|
||||
registerMainItem(1, 2, (player, user) -> Locales.getItem(player, "settings.item").click(event -> Menus.SETTINGS.open(event.getPlayer())), player -> ParkourOption.SETTINGS.mayPerform(player) && ParkourUser.isUser(player));
|
||||
registerMainItem(1, 3, (player, user) -> Locales.getItem(player, "lobby.item").click(event -> Menus.LOBBY.open(event.getPlayer())), player -> ParkourOption.LOBBY.mayPerform(player) && ParkourUser.isUser(player));
|
||||
registerMainItem(1, 4, (player, user) -> Locales.getItem(player, "other.quit").click(event -> ParkourPlayer.leave(player)), player -> ParkourOption.QUIT.mayPerform(player) && ParkourUser.isUser(player));
|
||||
public class MainMenu extends LPMenu {
|
||||
|
||||
@Override
|
||||
public void open(@NotNull Player player) {
|
||||
String locale = locale(player);
|
||||
String title = Locales.getString(locale, "main.name");
|
||||
|
||||
List<ItemStack> visibleItems = new ArrayList<>();
|
||||
List<Runnable> actions = new ArrayList<>();
|
||||
|
||||
if (ParkourOption.PLAY.mayPerform(player) && Config.CONFIG.getBoolean("joining")) {
|
||||
visibleItems.add(localeItem(player, "play.item"));
|
||||
actions.add(() -> Menus.PLAY.open(player));
|
||||
}
|
||||
if (ParkourOption.COMMUNITY.mayPerform(player)) {
|
||||
visibleItems.add(localeItem(player, "community.item"));
|
||||
actions.add(() -> Menus.COMMUNITY.open(player));
|
||||
}
|
||||
if (ParkourOption.SETTINGS.mayPerform(player) && ParkourUser.isUser(player)) {
|
||||
visibleItems.add(localeItem(player, "settings.item"));
|
||||
actions.add(() -> Menus.SETTINGS.open(player));
|
||||
}
|
||||
if (ParkourOption.LOBBY.mayPerform(player) && ParkourUser.isUser(player)) {
|
||||
visibleItems.add(localeItem(player, "lobby.item"));
|
||||
actions.add(() -> Menus.LOBBY.open(player));
|
||||
}
|
||||
if (ParkourOption.QUIT.mayPerform(player) && ParkourUser.isUser(player)) {
|
||||
visibleItems.add(localeItem(player, "other.quit"));
|
||||
actions.add(() -> ParkourUser.leave(player));
|
||||
}
|
||||
|
||||
int count = visibleItems.size();
|
||||
int[] slots = distributeEvenly(count, 9, 17);
|
||||
|
||||
InventoryGUI gui = baseGui(title, 3);
|
||||
|
||||
for (int i = 0; i < count; i++) {
|
||||
final int idx = i;
|
||||
gui = gui.setItem(slots[i], visibleItems.get(i), e -> actions.get(idx).run());
|
||||
}
|
||||
|
||||
gui.open(player);
|
||||
}
|
||||
*/
|
||||
|
||||
// TODO: Migrate to LoLib GUI system
|
||||
/*
|
||||
public void open(Player player) {
|
||||
display(player, new Menu(3, Locales.getString(player, "main.name"))
|
||||
.distributeRowsEvenly());
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,29 +1,22 @@
|
|||
package dev.loki.loparkour.menu.community;
|
||||
|
||||
import dev.loki.loparkour.config.Locales;
|
||||
import dev.loki.loparkour.menu.DynamicMenu;
|
||||
import dev.loki.loparkour.menu.LPMenu;
|
||||
import dev.loki.loparkour.menu.Menus;
|
||||
import dev.loki.loparkour.menu.ParkourOption;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* The menu for all community-related things
|
||||
*/
|
||||
public class CommunityMenu extends DynamicMenu {
|
||||
public class CommunityMenu extends LPMenu {
|
||||
|
||||
// TODO: Migrate to LoLib GUI system
|
||||
/*
|
||||
public CommunityMenu() {
|
||||
registerMainItem(1, 1, (player, user) -> Locales.getItem(player, "community.leaderboards.item").click(event -> Menus.LEADERBOARDS.open(event.getPlayer())), ParkourOption.LEADERBOARDS::mayPerform);
|
||||
registerMainItem(2, 10, (player, user) -> Locales.getItem(player, "other.close").click(event -> event.getPlayer().closeInventory()), player -> true);
|
||||
@Override
|
||||
public void open(@NotNull Player player) {
|
||||
String title = Locales.getString(locale(player), "community.name");
|
||||
|
||||
baseGui(title, 3)
|
||||
.setItem(13, localeItem(player, "community.leaderboards.item"),
|
||||
e -> { if (ParkourOption.LEADERBOARDS.mayPerform(player)) Menus.LEADERBOARDS.open(player); })
|
||||
.setItem(22, closeButton(player), e -> player.closeInventory())
|
||||
.open(player);
|
||||
}
|
||||
*/
|
||||
|
||||
// TODO: Migrate to LoLib GUI system
|
||||
/*
|
||||
public void open(Player player) {
|
||||
display(player, new Menu(3, Locales.getString(player, "community.name"))
|
||||
.distributeRowsEvenly());
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,55 +2,55 @@ package dev.loki.loparkour.menu.community;
|
|||
|
||||
import dev.loki.loparkour.api.Registry;
|
||||
import dev.loki.loparkour.config.Locales;
|
||||
import dev.loki.loparkour.config.Option;
|
||||
import dev.loki.loparkour.leaderboard.Leaderboard;
|
||||
import dev.loki.loparkour.menu.LPMenu;
|
||||
import dev.loki.loparkour.menu.Menus;
|
||||
import dev.loki.loparkour.menu.ParkourOption;
|
||||
import dev.loki.loparkour.mode.Mode;
|
||||
import dev.loki.loparkour.player.ParkourUser;
|
||||
import org.bukkit.Material;
|
||||
import dev.loki.loparkour.util.ColorUtil;
|
||||
import dev.lolib.gui.ScrollableGUI;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Leaderboards menu
|
||||
*/
|
||||
public class LeaderboardsMenu {
|
||||
public class LeaderboardsMenu extends LPMenu {
|
||||
|
||||
// TODO: Migrate to LoLib GUI system
|
||||
/*
|
||||
public void open(Player player) {
|
||||
ParkourUser user = ParkourUser.getUser(player);
|
||||
String locale = user == null ? Option.OPTIONS_DEFAULTS.get(ParkourOption.LANG) : user.locale;
|
||||
@Override
|
||||
public void open(@NotNull Player player) {
|
||||
String locale = locale(player);
|
||||
String title = Locales.getString(locale, ParkourOption.LEADERBOARDS.path + ".name");
|
||||
|
||||
PagedMenu menu = new PagedMenu(3, Locales.getString(player, "%s.name".formatted(ParkourOption.LEADERBOARDS.path)));
|
||||
List<Mode> modes = new ArrayList<>();
|
||||
List<ItemStack> items = new ArrayList<>();
|
||||
|
||||
Mode latest = null;
|
||||
List<MenuItem> items = new ArrayList<>();
|
||||
for (Mode mode : Registry.getModes()) {
|
||||
Leaderboard leaderboard = mode.getLeaderboard();
|
||||
Item item = mode.getItem(locale);
|
||||
|
||||
if (leaderboard == null || item == null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
items.add(item.clone().click(event -> Menus.SINGLE_LEADERBOARD.open(player, mode, leaderboard.sort)));
|
||||
latest = mode;
|
||||
if (mode.getLeaderboard() == null) continue;
|
||||
var item = mode.getItem(locale);
|
||||
if (item == null) continue;
|
||||
modes.add(mode);
|
||||
items.add(item.build());
|
||||
}
|
||||
|
||||
if (items.size() == 1) {
|
||||
Menus.SINGLE_LEADERBOARD.open(player, latest, Leaderboard.Sort.SCORE);
|
||||
if (modes.size() == 1) {
|
||||
Menus.SINGLE_LEADERBOARD.open(player, modes.get(0), Leaderboard.Sort.SCORE);
|
||||
return;
|
||||
}
|
||||
// menu.displayRows(0, 1)
|
||||
// .addToDisplay(items)
|
||||
// .nextPage(26, new Item(Material.LIME_DYE, "<#0DCB07><bold>»").click(event -> menu.page(1)))
|
||||
// .prevPage(18, new Item(Material.RED_DYE, "<#DE1F1F><bold>«").click(event -> menu.page(-1)))
|
||||
// .item(22, Locales.getItem(player, "other.close").click(event -> Menus.COMMUNITY.open(event.getPlayer())))
|
||||
// .open(player);
|
||||
|
||||
ScrollableGUI gui = ScrollableGUI.create()
|
||||
.title(ColorUtil.color(title))
|
||||
.rows(3)
|
||||
.scrollUpButton(backItem(), 0)
|
||||
.scrollDownButton(nextItem(), 8);
|
||||
|
||||
for (int i = 0; i < items.size(); i++) {
|
||||
final Mode mode = modes.get(i);
|
||||
gui = gui.addItem(items.get(i),
|
||||
e -> Menus.SINGLE_LEADERBOARD.open(player, mode, Leaderboard.Sort.SCORE));
|
||||
}
|
||||
|
||||
gui.open(player);
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,116 +1,84 @@
|
|||
package dev.loki.loparkour.menu.community;
|
||||
|
||||
import dev.loki.loparkour.LoParkour;
|
||||
import dev.loki.loparkour.api.Registry;
|
||||
import dev.loki.loparkour.config.Locales;
|
||||
import dev.loki.loparkour.config.Option;
|
||||
import dev.loki.loparkour.leaderboard.Leaderboard;
|
||||
import dev.loki.loparkour.leaderboard.Score;
|
||||
import dev.loki.loparkour.menu.Menus;
|
||||
import dev.loki.loparkour.menu.LPMenu;
|
||||
import dev.loki.loparkour.menu.ParkourOption;
|
||||
import dev.loki.loparkour.mode.Mode;
|
||||
import dev.loki.loparkour.player.ParkourUser;
|
||||
import org.bukkit.Bukkit;
|
||||
import dev.loki.loparkour.util.ColorUtil;
|
||||
import dev.lolib.gui.ScrollableGUI;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
import org.bukkit.inventory.meta.SkullMeta;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* Menu for a single leaderboard
|
||||
*/
|
||||
public class SingleLeaderboardMenu {
|
||||
public class SingleLeaderboardMenu extends LPMenu {
|
||||
|
||||
// TODO: Migrate to LoLib GUI system
|
||||
/*
|
||||
public void open(Player player, Mode mode, Leaderboard.Sort sort) {
|
||||
public void open(@NotNull Player player, @NotNull Mode mode, @NotNull Leaderboard.Sort sort) {
|
||||
Leaderboard leaderboard = mode.getLeaderboard();
|
||||
if (leaderboard == null) return;
|
||||
|
||||
if (leaderboard == null) {
|
||||
return;
|
||||
String locale = locale(player);
|
||||
String title = Locales.getString(locale, ParkourOption.LEADERBOARDS.path + ".name");
|
||||
|
||||
List<ItemStack> items = new ArrayList<>();
|
||||
int rank = 0;
|
||||
|
||||
for (Map.Entry<UUID, Score> entry : leaderboard.sort(sort).entrySet()) {
|
||||
rank++;
|
||||
Score score = entry.getValue();
|
||||
if (score == null) continue;
|
||||
|
||||
ItemStack skull = new ItemStack(Material.PLAYER_HEAD);
|
||||
if (rank <= 20 && !ParkourUser.isBedrockPlayer(player)) {
|
||||
OfflinePlayer op = org.bukkit.Bukkit.getOfflinePlayer(entry.getKey());
|
||||
if (op.getName() != null && !op.getName().startsWith(".")) {
|
||||
SkullMeta meta = (SkullMeta) skull.getItemMeta();
|
||||
if (meta != null) { meta.setOwningPlayer(op); skull.setItemMeta(meta); }
|
||||
}
|
||||
}
|
||||
|
||||
var base = Locales.getItem(locale, ParkourOption.LEADERBOARDS.path + ".head");
|
||||
int r = rank;
|
||||
base.modifyName(n -> n.replace("%r", String.valueOf(r))
|
||||
.replace("%s", String.valueOf(score.score()))
|
||||
.replace("%p", score.name())
|
||||
.replace("%t", score.time())
|
||||
.replace("%d", score.difficulty()))
|
||||
.modifyLore(l -> l.replace("%r", String.valueOf(r))
|
||||
.replace("%s", String.valueOf(score.score()))
|
||||
.replace("%p", score.name())
|
||||
.replace("%t", score.time())
|
||||
.replace("%d", score.difficulty()));
|
||||
ItemMeta built = base.build().getItemMeta();
|
||||
if (built != null) skull.setItemMeta(built);
|
||||
|
||||
items.add(skull);
|
||||
}
|
||||
// init vars
|
||||
// var user = ParkourUser.getUser(player);
|
||||
// var locale = user == null ? Option.OPTIONS_DEFAULTS.get(ParkourOption.LANG) : user.locale;
|
||||
// var menu = new PagedMenu(3, Locales.getString(player, "%s.name".formatted(ParkourOption.LEADERBOARDS.path)));
|
||||
// var items = new ArrayList<MenuItem>();
|
||||
// var base = Locales.getItem(player, "%s.head".formatted(ParkourOption.LEADERBOARDS.path));
|
||||
// for (Map.Entry<UUID, Score> entry : leaderboard.sort(sort).entrySet()) {
|
||||
// int rank = items.size() + 1;
|
||||
// var uuid = entry.getKey();
|
||||
// var score = entry.getValue();
|
||||
// if (score == null) {
|
||||
// continue;
|
||||
// }
|
||||
// Item item = base.clone().material(Material.PLAYER_HEAD)
|
||||
// .modifyName(name -> name.replace("%r", Integer.toString(rank))
|
||||
// .replace("%s", Integer.toString(score.score()))
|
||||
// .replace("%p", score.name())
|
||||
// .replace("%t", score.time())
|
||||
// .replace("%d", score.difficulty()))
|
||||
// .modifyLore(line -> line.replace("%r", Integer.toString(rank))
|
||||
// .replace("%s", Integer.toString(score.score()))
|
||||
// .replace("%p", score.name())
|
||||
// .replace("%t", score.time())
|
||||
// .replace("%d", score.difficulty()));
|
||||
// Player head gathering
|
||||
// ItemStack stack = item.build();
|
||||
// if there are more than 36 players, don't show the heads to avoid server crashing
|
||||
// and bedrock has no player skull support
|
||||
// if (rank <= 20 && !ParkourUser.isBedrockPlayer(player)) {
|
||||
// OfflinePlayer op = Bukkit.getOfflinePlayer(uuid);
|
||||
// if (op.getName() != null && !op.getName().startsWith(".")) { // bedrock players' names with geyser start with a .
|
||||
// SkullMeta meta = (SkullMeta) stack.getItemMeta();
|
||||
// if (meta != null) {
|
||||
// SkullSetter.setPlayerHead(op, meta);
|
||||
// item.meta(meta);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// if (uuid.equals(player.getUniqueId())) {
|
||||
// menu.item(21, item.clone());
|
||||
// }
|
||||
// items.add(item);
|
||||
// }
|
||||
// List<String> values = Locales.getStringList(locale, "%s.sort.values".formatted(ParkourOption.LEADERBOARDS.path));
|
||||
// if (values.size() != 3) {
|
||||
// LoParkour.logging().stack("Error while trying to get locales for sort values: not enough sort values present",
|
||||
// "check your %s locale file".formatted(locale), new IllegalArgumentException());
|
||||
// }
|
||||
// String name = switch (sort) {
|
||||
// case SCORE -> values.get(0);
|
||||
// case TIME -> values.get(1);
|
||||
// case DIFFICULTY -> values.get(2);
|
||||
// };
|
||||
// get next sorting type
|
||||
// var next = switch (sort) {
|
||||
// case SCORE -> Leaderboard.Sort.TIME;
|
||||
// case TIME -> Leaderboard.Sort.DIFFICULTY;
|
||||
// default -> Leaderboard.Sort.SCORE;
|
||||
// };
|
||||
// menu.displayRows(0, 1)
|
||||
// .addToDisplay(items)
|
||||
// .nextPage(26, new Item(Material.LIME_DYE, "<#0DCB07><bold>»").click(event -> menu.page(1)))
|
||||
// .prevPage(18, new Item(Material.RED_DYE, "<#DE1F1F><bold>«").click(event -> menu.page(-1)))
|
||||
// .item(22, Locales.getItem(player, ParkourOption.LEADERBOARDS.path + ".sort", name.toLowerCase()).click(event -> open(player, mode, next)))
|
||||
// .item(23, Locales.getItem(player, "other.close").click(event -> {
|
||||
// List<Mode> modes = Registry.getModes()
|
||||
// .stream()
|
||||
// .filter(m -> m.getLeaderboard() != null && m.getItem(locale) != null)
|
||||
// .toList();
|
||||
// if (modes.size() == 1) {
|
||||
// Menus.COMMUNITY.open(player);
|
||||
// return;
|
||||
// }
|
||||
// Menus.LEADERBOARDS.open(event.getPlayer());
|
||||
// }))
|
||||
// .open(player);
|
||||
|
||||
ScrollableGUI gui = ScrollableGUI.create()
|
||||
.title(ColorUtil.color(title))
|
||||
.rows(3)
|
||||
.scrollUpButton(backItem(), 0)
|
||||
.scrollDownButton(nextItem(), 8);
|
||||
|
||||
for (ItemStack item : items) {
|
||||
gui = gui.addItem(item, e -> { /* view only */ });
|
||||
}
|
||||
|
||||
gui.open(player);
|
||||
}
|
||||
*/
|
||||
|
||||
@Override
|
||||
public void open(@NotNull Player player) { /* use open(player, mode, sort) */ }
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,83 +1,77 @@
|
|||
package dev.loki.loparkour.menu.lobby;
|
||||
|
||||
import dev.loki.loparkour.config.Locales;
|
||||
import dev.loki.loparkour.menu.DynamicMenu;
|
||||
import dev.loki.loparkour.menu.LPMenu;
|
||||
import dev.loki.loparkour.menu.Menus;
|
||||
import dev.loki.loparkour.menu.ParkourOption;
|
||||
import dev.loki.loparkour.player.ParkourPlayer;
|
||||
import dev.loki.loparkour.player.ParkourUser;
|
||||
import dev.loki.loparkour.session.Session;
|
||||
import dev.loki.loparkour.util.ColorUtil;
|
||||
import dev.lolib.gui.InventoryGUI;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class LobbyMenu extends DynamicMenu {
|
||||
public class LobbyMenu extends LPMenu {
|
||||
|
||||
// TODO: Migrate to LoLib GUI system
|
||||
/*
|
||||
public LobbyMenu() {
|
||||
registerMainItem(1, 0, (player, user) -> Locales.getItem(player, "lobby.player_management.item").click(event -> Menus.PLAYER_MANAGEMENT.open(player)), player -> {
|
||||
ParkourUser user = ParkourUser.getUser(player);
|
||||
@Override
|
||||
public void open(@NotNull Player player) {
|
||||
ParkourUser user = ParkourUser.getUser(player);
|
||||
if (user == null) return;
|
||||
|
||||
return ParkourOption.PLAYER_MANAGEMENT.mayPerform(player) && user instanceof ParkourPlayer && user.session.getPlayers().get(0) == user;
|
||||
});
|
||||
String locale = user.locale;
|
||||
String title = Locales.getString(locale, "lobby.name");
|
||||
|
||||
registerMainItem(1, 1, (player, user) -> {
|
||||
if (user == null) {
|
||||
return null;
|
||||
}
|
||||
boolean isHost = !user.session.getPlayers().isEmpty()
|
||||
&& user.session.getPlayers().get(0) == user;
|
||||
|
||||
List<String> values = Locales.getStringList(user.locale, "lobby.visibility.values");
|
||||
InventoryGUI gui = baseGui(title, 3);
|
||||
|
||||
return new SliderItem().initial(switch (user.session.getVisibility()) {
|
||||
case PUBLIC -> 0;
|
||||
case ID_ONLY -> 1;
|
||||
case PRIVATE -> 2;
|
||||
}).add(0, Locales.getItem(player, "lobby.visibility").modifyLore(lore -> lore.replace("%s", values.get(2))), event -> { // public
|
||||
ParkourUser u = ParkourUser.getUser(event.getPlayer());
|
||||
if (ParkourOption.PLAYER_MANAGEMENT.mayPerform(player) && isHost) {
|
||||
gui = gui.setItem(11, localeItem(player, "lobby.player_management.item"),
|
||||
e -> Menus.PLAYER_MANAGEMENT.open(player));
|
||||
}
|
||||
|
||||
if (u != null) {
|
||||
u.session.setVisibility(Session.Visibility.PUBLIC);
|
||||
}
|
||||
|
||||
return true;
|
||||
}).add(1, Locales.getItem(player, "lobby.visibility").modifyLore(lore -> lore.replace("%s", values.get(1))), event -> { // id only
|
||||
ParkourUser u = ParkourUser.getUser(event.getPlayer());
|
||||
|
||||
if (u != null) {
|
||||
u.session.setVisibility(Session.Visibility.ID_ONLY);
|
||||
}
|
||||
|
||||
return true;
|
||||
}).add(2, Locales.getItem(player, "lobby.visibility").modifyLore(lore -> lore.replace("%s", values.get(0))), event -> { // private
|
||||
ParkourUser u = ParkourUser.getUser(event.getPlayer());
|
||||
|
||||
if (u != null) {
|
||||
u.session.setVisibility(Session.Visibility.PRIVATE);
|
||||
}
|
||||
|
||||
return true;
|
||||
if (ParkourOption.VISIBILITY.mayPerform(player) && isHost) {
|
||||
gui = gui.setItem(13, visibilityItem(user), e -> {
|
||||
Session.Visibility next = switch (user.session.getVisibility()) {
|
||||
case PUBLIC -> Session.Visibility.ID_ONLY;
|
||||
case ID_ONLY -> Session.Visibility.PRIVATE;
|
||||
case PRIVATE -> Session.Visibility.PUBLIC;
|
||||
};
|
||||
user.session.setVisibility(next);
|
||||
open(player);
|
||||
});
|
||||
}, player -> {
|
||||
ParkourUser user = ParkourUser.getUser(player);
|
||||
}
|
||||
|
||||
return ParkourOption.VISIBILITY.mayPerform(player) && user instanceof ParkourPlayer && user.session.getPlayers().get(0) == user;
|
||||
});
|
||||
|
||||
registerMainItem(2, 10, (player, user) -> Locales.getItem(player, "other.close").click(event -> event.getPlayer().closeInventory()), player -> true);
|
||||
gui.setItem(22, closeButton(player), e -> player.closeInventory())
|
||||
.open(player);
|
||||
}
|
||||
*/
|
||||
|
||||
/**
|
||||
* Opens the main menu.
|
||||
*
|
||||
* @param player The player to open the menu to
|
||||
*/
|
||||
// TODO: Migrate to LoLib GUI system
|
||||
/*
|
||||
public void open(Player player) {
|
||||
display(player, new Menu(3, Locales.getString(player, "lobby.name"))
|
||||
.distributeRowsEvenly());
|
||||
private ItemStack visibilityItem(ParkourUser user) {
|
||||
String locale = user.locale;
|
||||
List<String> values = Locales.getStringList(locale, "lobby.visibility.values");
|
||||
String label = switch (user.session.getVisibility()) {
|
||||
case PUBLIC -> values.size() > 2 ? values.get(2) : "Public";
|
||||
case ID_ONLY -> values.size() > 1 ? values.get(1) : "ID Only";
|
||||
case PRIVATE -> !values.isEmpty() ? values.get(0) : "Private";
|
||||
};
|
||||
Material mat = switch (user.session.getVisibility()) {
|
||||
case PUBLIC -> Material.LIME_STAINED_GLASS_PANE;
|
||||
case ID_ONLY -> Material.YELLOW_STAINED_GLASS_PANE;
|
||||
case PRIVATE -> Material.RED_STAINED_GLASS_PANE;
|
||||
};
|
||||
ItemStack item = new ItemStack(mat);
|
||||
ItemMeta meta = item.getItemMeta();
|
||||
if (meta != null) {
|
||||
meta.setDisplayName(ColorUtil.color(
|
||||
Locales.getString(locale, "lobby.visibility") + " §7» §f" + label));
|
||||
item.setItemMeta(meta);
|
||||
}
|
||||
return item;
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,116 +1,78 @@
|
|||
package dev.loki.loparkour.menu.lobby;
|
||||
|
||||
import dev.loki.loparkour.config.Locales;
|
||||
import dev.loki.loparkour.menu.LPMenu;
|
||||
import dev.loki.loparkour.menu.Menus;
|
||||
import dev.loki.loparkour.mode.Modes;
|
||||
import dev.loki.loparkour.player.ParkourPlayer;
|
||||
import dev.loki.loparkour.player.ParkourUser;
|
||||
import dev.loki.loparkour.session.Session;
|
||||
import dev.loki.loparkour.util.ColorUtil;
|
||||
import dev.lolib.gui.InventoryGUI;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.inventory.ClickType;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
import org.bukkit.inventory.meta.SkullMeta;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Menu for managing players
|
||||
*/
|
||||
public class PlayerManagementMenu {
|
||||
public class PlayerManagementMenu extends LPMenu {
|
||||
|
||||
// TODO: Migrate to LoLib GUI system
|
||||
/*
|
||||
public void open(Player p) {
|
||||
if (p == null) {
|
||||
return;
|
||||
}
|
||||
// ParkourPlayer viewer = ParkourPlayer.getPlayer(p);
|
||||
// if (viewer == null) {
|
||||
// return;
|
||||
// }
|
||||
// Session session = viewer.session;
|
||||
// PagedMenu menu = new PagedMenu(3, Locales.getString(viewer.locale, "lobby.player_management.name"));
|
||||
// add(menu, viewer, session.getPlayers().stream().map(player -> (ParkourUser) player).toList());
|
||||
// add(menu, viewer, session.getSpectators().stream().map(player -> (ParkourUser) player).toList());
|
||||
// menu.displayRows(0, 1)
|
||||
// .prevPage(18, new Item(Material.RED_DYE, "<#DE1F1F><bold>«").click(event -> menu.page(-1)))
|
||||
// .nextPage(26, new Item(Material.LIME_DYE, "<#0DCB07><bold>»").click(event -> menu.page(1)))
|
||||
// .item(22, Locales.getItem(viewer.locale, "other.close").click(event -> Menus.LOBBY.open(event.getPlayer())))
|
||||
// .open(p);
|
||||
}
|
||||
*/
|
||||
@Override
|
||||
public void open(@NotNull Player player) {
|
||||
ParkourPlayer viewer = ParkourPlayer.getPlayer(player);
|
||||
if (viewer == null) return;
|
||||
|
||||
// TODO: Migrate to LoLib GUI system
|
||||
/*
|
||||
private void add(PagedMenu menu, ParkourUser viewer, Collection<ParkourUser> users) {
|
||||
Session session = viewer.session;
|
||||
var session = viewer.session;
|
||||
String locale = viewer.locale;
|
||||
String title = Locales.getString(locale, "lobby.player_management.name");
|
||||
|
||||
for (ParkourUser other : users) {
|
||||
if (other == viewer) {
|
||||
continue;
|
||||
List<ParkourUser> others = new ArrayList<>();
|
||||
others.addAll(session.getPlayers().stream().filter(p -> p != viewer).toList());
|
||||
others.addAll(session.getSpectators());
|
||||
|
||||
InventoryGUI gui = baseGui(title, 3)
|
||||
.setItem(22, closeButton(player), e -> Menus.LOBBY.open(player));
|
||||
|
||||
for (int i = 0; i < Math.min(others.size(), 7); i++) {
|
||||
final int idx = i;
|
||||
final ParkourUser other = others.get(i);
|
||||
|
||||
ItemStack skull = new ItemStack(Material.PLAYER_HEAD);
|
||||
if (!ParkourUser.isBedrockPlayer(other.player)
|
||||
&& other.getName() != null && !other.getName().startsWith(".")) {
|
||||
SkullMeta meta = (SkullMeta) skull.getItemMeta();
|
||||
if (meta != null) { meta.setOwningPlayer(other.player); skull.setItemMeta(meta); }
|
||||
}
|
||||
|
||||
Item item = Locales.getItem(viewer.locale, "lobby.player_management.head", other.getName());
|
||||
item.material(Material.PLAYER_HEAD);
|
||||
|
||||
boolean muted = session.isMuted(other);
|
||||
|
||||
List<String> lore = new ArrayList<>();
|
||||
if (muted) {
|
||||
// add top
|
||||
lore.addAll(List.of(Locales.getString(viewer.locale, "lobby.player_management.head.top").split("\\|\\|")));
|
||||
ItemMeta displayMeta = skull.getItemMeta();
|
||||
if (displayMeta != null) {
|
||||
displayMeta.setDisplayName(ColorUtil.color("<yellow>" + other.getName() + (muted ? " §c[muted]" : "")));
|
||||
displayMeta.setLore(List.of(
|
||||
ColorUtil.color("§7Left-click §fto kick"),
|
||||
ColorUtil.color("§7Right-click §f" + (muted ? "to unmute" : "to mute"))
|
||||
));
|
||||
skull.setItemMeta(displayMeta);
|
||||
}
|
||||
|
||||
// add bottom
|
||||
lore.addAll(List.of(Locales.getString(viewer.locale, "lobby.player_management.head.bottom").split("\\|\\|")));
|
||||
|
||||
// Player head gathering
|
||||
item.material(Material.PLAYER_HEAD).lore(lore).click(event -> {
|
||||
ClickType click = event.event().getClick();
|
||||
|
||||
switch (click) {
|
||||
case LEFT -> {
|
||||
Modes.DEFAULT.create(other.player);
|
||||
|
||||
other.sendTranslated("lobby.player_management.kicked");
|
||||
|
||||
viewer.sendTranslated("lobby.player_management.advice");
|
||||
open(viewer.player);
|
||||
}
|
||||
case RIGHT -> {
|
||||
session.toggleMute(other);
|
||||
|
||||
if (!muted) {
|
||||
other.sendTranslated("lobby.player_management.muted");
|
||||
} else {
|
||||
other.sendTranslated("lobby.player_management.unmuted");
|
||||
}
|
||||
|
||||
open(viewer.player);
|
||||
}
|
||||
gui = gui.setItem(10 + idx, skull, e -> {
|
||||
if (e.getClick() == ClickType.LEFT) {
|
||||
Modes.DEFAULT.create(other.player);
|
||||
other.sendTranslated("lobby.player_management.kicked");
|
||||
viewer.sendTranslated("lobby.player_management.advice");
|
||||
} else if (e.getClick() == ClickType.RIGHT) {
|
||||
session.toggleMute(other);
|
||||
boolean nowMuted = session.isMuted(other);
|
||||
other.sendTranslated(nowMuted ? "lobby.player_management.muted" : "lobby.player_management.unmuted");
|
||||
}
|
||||
open(player);
|
||||
});
|
||||
|
||||
ItemStack stack = item.build(); // Updating meta requires building
|
||||
stack.setType(Material.PLAYER_HEAD);
|
||||
|
||||
// bedrock has no player skull support
|
||||
if (menu.getTotalToDisplay().size() <= 36 && !ParkourUser.isBedrockPlayer(other.player)) {
|
||||
if (other.getName() != null && !other.getName().startsWith(".")) { // bedrock players' names with geyser start with a .
|
||||
SkullMeta meta = (SkullMeta) stack.getItemMeta();
|
||||
|
||||
if (meta != null) {
|
||||
SkullSetter.setPlayerHead(other.player, meta);
|
||||
item.meta(meta);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
menu.addToDisplay(List.of(item));
|
||||
}
|
||||
|
||||
gui.open(player);
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,43 +1,25 @@
|
|||
package dev.loki.loparkour.menu.play;
|
||||
|
||||
import dev.loki.loparkour.config.Locales;
|
||||
import dev.loki.loparkour.menu.DynamicMenu;
|
||||
import dev.loki.loparkour.menu.LPMenu;
|
||||
import dev.loki.loparkour.menu.Menus;
|
||||
import dev.loki.loparkour.menu.ParkourOption;
|
||||
import org.bukkit.Bukkit;
|
||||
import dev.lolib.gui.InventoryGUI;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* The menu where players can join modes
|
||||
*/
|
||||
public class PlayMenu extends DynamicMenu {
|
||||
public class PlayMenu extends LPMenu {
|
||||
|
||||
// TODO: Migrate to LoLib GUI system
|
||||
/*
|
||||
public PlayMenu() {
|
||||
registerMainItem(1, 0, (player, user) -> Locales.getItem(player, "play.single.item")
|
||||
.click(event -> Menus.SINGLE.open(event.getPlayer())),
|
||||
ParkourOption.SINGLE::mayPerform);
|
||||
@Override
|
||||
public void open(@NotNull Player player) {
|
||||
String title = Locales.getString(locale(player), "play.name");
|
||||
|
||||
registerMainItem(1, 1, (player, user) -> Locales.getItem(player, "other.iep")
|
||||
.click(event -> event.getPlayer().performCommand("iep play")),
|
||||
player -> Bukkit.getPluginManager().isPluginEnabled("IEP"));
|
||||
|
||||
registerMainItem(1, 6, (player, user) -> Locales.getItem(player, "play.spectator.item")
|
||||
.click(event -> Menus.SPECTATOR.open(event.getPlayer())),
|
||||
ParkourOption.SPECTATOR::mayPerform);
|
||||
|
||||
registerMainItem(2, 0, (player, user) -> Locales.getItem(player, "other.close")
|
||||
.click(event -> event.getPlayer().closeInventory()),
|
||||
player -> true);
|
||||
baseGui(title, 3)
|
||||
.setItem(11, localeItem(player, "play.single.item"),
|
||||
e -> { if (ParkourOption.SINGLE.mayPerform(player)) Menus.SINGLE.open(player); })
|
||||
.setItem(15, localeItem(player, "play.spectator.item"),
|
||||
e -> { if (ParkourOption.SPECTATOR.mayPerform(player)) Menus.SPECTATOR.open(player); })
|
||||
.setItem(22, closeButton(player), e -> player.closeInventory())
|
||||
.open(player);
|
||||
}
|
||||
*/
|
||||
|
||||
// TODO: Migrate to LoLib GUI system
|
||||
/*
|
||||
public void open(Player player) {
|
||||
display(player, new Menu(3, Locales.getString(player, "play.name"))
|
||||
.distributeRowsEvenly());
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,65 +3,66 @@ package dev.loki.loparkour.menu.play;
|
|||
import dev.loki.loparkour.api.Registry;
|
||||
import dev.loki.loparkour.config.Config;
|
||||
import dev.loki.loparkour.config.Locales;
|
||||
import dev.loki.loparkour.config.Option;
|
||||
import dev.loki.loparkour.menu.Menus;
|
||||
import dev.loki.loparkour.menu.ParkourOption;
|
||||
import dev.loki.loparkour.menu.LPMenu;
|
||||
import dev.loki.loparkour.mode.Mode;
|
||||
import dev.loki.loparkour.mode.MultiMode;
|
||||
import dev.loki.loparkour.player.ParkourUser;
|
||||
import org.bukkit.Material;
|
||||
import dev.loki.loparkour.util.ColorUtil;
|
||||
import dev.lolib.gui.ScrollableGUI;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.time.Duration;
|
||||
import java.time.Instant;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* The menu to select single player modes
|
||||
*/
|
||||
public class SingleMenu {
|
||||
public class SingleMenu extends LPMenu {
|
||||
|
||||
// TODO: Migrate to LoLib GUI system
|
||||
/*
|
||||
public void open(Player player) {
|
||||
ParkourUser user = ParkourUser.getUser(player);
|
||||
String locale = user == null ? Option.OPTIONS_DEFAULTS.get(ParkourOption.LANG) : user.locale;
|
||||
@Override
|
||||
public void open(@NotNull Player player) {
|
||||
String locale = locale(player);
|
||||
|
||||
List<Mode> modes = Registry.getModes();
|
||||
List<Mode> availableModes = new ArrayList<>();
|
||||
List<ItemStack> items = new ArrayList<>();
|
||||
|
||||
List<MenuItem> items = new ArrayList<>();
|
||||
List<Mode> modeSet = new ArrayList<>();
|
||||
for (Mode mode : modes) {
|
||||
boolean permissions = Config.CONFIG.getBoolean("permissions.enabled") && !player.hasPermission("LoParkour.gamemode." + mode.getName());
|
||||
|
||||
Item item = mode.getItem(locale);
|
||||
|
||||
if (permissions || mode instanceof MultiMode || item == null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
modeSet.add(mode);
|
||||
|
||||
items.add(item.clone().click(event -> {
|
||||
if (user == null || Duration.between(user.joined, Instant.now()).toSeconds() > 3) {
|
||||
mode.create(player);
|
||||
}
|
||||
}));
|
||||
for (Mode mode : Registry.getModes()) {
|
||||
boolean blocked = Config.CONFIG.getBoolean("permissions.enabled")
|
||||
&& !player.hasPermission("LoParkour.gamemode." + mode.getName());
|
||||
if (blocked || mode instanceof MultiMode) continue;
|
||||
var item = mode.getItem(locale);
|
||||
if (item == null) continue;
|
||||
availableModes.add(mode);
|
||||
items.add(item.build());
|
||||
}
|
||||
|
||||
if (modeSet.size() == 1) {
|
||||
modeSet.get(0).create(player);
|
||||
if (availableModes.size() == 1) {
|
||||
availableModes.get(0).create(player);
|
||||
return;
|
||||
}
|
||||
// PagedMenu mode = new PagedMenu(3, Locales.getString(player, "play.single.name"));
|
||||
// mode.displayRows(0, 1)
|
||||
// .addToDisplay(items)
|
||||
// .nextPage(26, new Item(Material.LIME_DYE, "<#0DCB07><bold>»").click(event -> mode.page(1)))
|
||||
// .prevPage(18, new Item(Material.RED_DYE, "<#DE1F1F><bold>«").click(event -> mode.page(-1)))
|
||||
// .item(22, Locales.getItem(player, "other.close").click(event -> Menus.PLAY.open(event.getPlayer())))
|
||||
// .open(player);
|
||||
}
|
||||
*/
|
||||
|
||||
String title = Locales.getString(locale, "play.single.name");
|
||||
|
||||
ScrollableGUI gui = ScrollableGUI.create()
|
||||
.title(ColorUtil.color(title))
|
||||
.rows(3)
|
||||
.scrollUpButton(backItem(), 0)
|
||||
.scrollDownButton(nextItem(), 8);
|
||||
|
||||
for (int i = 0; i < items.size(); i++) {
|
||||
final Mode mode = availableModes.get(i);
|
||||
gui = gui.addItem(items.get(i), e -> {
|
||||
// Prevent multiple clicks - check if player is already in parkour
|
||||
if (ParkourUser.getUser(player) != null) {
|
||||
return; // Already in parkour, ignore click
|
||||
}
|
||||
|
||||
player.closeInventory();
|
||||
mode.create(player);
|
||||
});
|
||||
}
|
||||
|
||||
gui.open(player);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,83 +1,60 @@
|
|||
package dev.loki.loparkour.menu.play;
|
||||
|
||||
import dev.loki.loparkour.config.Locales;
|
||||
import dev.loki.loparkour.config.Option;
|
||||
import dev.loki.loparkour.menu.Menus;
|
||||
import dev.loki.loparkour.menu.ParkourOption;
|
||||
import dev.loki.loparkour.menu.LPMenu;
|
||||
import dev.loki.loparkour.mode.Modes;
|
||||
import dev.loki.loparkour.player.ParkourUser;
|
||||
import dev.loki.loparkour.session.Session;
|
||||
import dev.loki.loparkour.util.ColorUtil;
|
||||
import dev.loki.loparkour.world.Divider;
|
||||
import dev.lolib.gui.ScrollableGUI;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.SkullMeta;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* The menu to select other players to spectate
|
||||
*/
|
||||
public class SpectatorMenu {
|
||||
public class SpectatorMenu extends LPMenu {
|
||||
|
||||
// TODO: Migrate to LoLib GUI system
|
||||
/*
|
||||
public void open(Player player) {
|
||||
@Override
|
||||
public void open(@NotNull Player player) {
|
||||
String locale = locale(player);
|
||||
ParkourUser user = ParkourUser.getUser(player);
|
||||
String locale = user == null ? Option.OPTIONS_DEFAULTS.get(ParkourOption.LANG) : user.locale;
|
||||
String title = Locales.getString(locale, "play.spectator.name");
|
||||
|
||||
PagedMenu spectator = new PagedMenu(3, Locales.getString(player, "play.spectator.name"));
|
||||
|
||||
List<MenuItem> display = new ArrayList<>();
|
||||
List<Session> sessions = new ArrayList<>();
|
||||
List<ItemStack> items = new ArrayList<>();
|
||||
|
||||
for (Session session : Divider.sections.keySet()) {
|
||||
if (!session.isAcceptingSpectators()) { // only showcase sessions with spectators enabled
|
||||
continue;
|
||||
}
|
||||
|
||||
if (user != null && session == user.session) { // don't let player join their own session
|
||||
continue;
|
||||
}
|
||||
|
||||
if (session.getPlayers().isEmpty()) { // weird but possible
|
||||
continue;
|
||||
}
|
||||
if (!session.isAcceptingSpectators()) continue;
|
||||
if (user != null && session == user.session) continue;
|
||||
if (session.getPlayers().isEmpty()) continue;
|
||||
|
||||
var pp = session.getPlayers().get(0);
|
||||
|
||||
Item item = Locales.getItem(locale, "play.spectator.head", pp.getName());
|
||||
// Player head gathering
|
||||
item.material(Material.PLAYER_HEAD);
|
||||
|
||||
ItemStack stack = item.build(); // Updating meta requires building
|
||||
stack.setType(Material.PLAYER_HEAD);
|
||||
|
||||
// bedrock has no player skull support
|
||||
if (!ParkourUser.isBedrockPlayer(player)) {
|
||||
if (pp.getName() != null && !pp.getName().startsWith(".")) { // bedrock players' names with geyser start with a .
|
||||
SkullMeta meta = (SkullMeta) stack.getItemMeta();
|
||||
|
||||
if (meta != null) {
|
||||
SkullSetter.setPlayerHead(pp.player, meta);
|
||||
item.meta(meta);
|
||||
}
|
||||
}
|
||||
ItemStack skull = new ItemStack(Material.PLAYER_HEAD);
|
||||
if (!ParkourUser.isBedrockPlayer(player)
|
||||
&& pp.getName() != null && !pp.getName().startsWith(".")) {
|
||||
SkullMeta meta = (SkullMeta) skull.getItemMeta();
|
||||
if (meta != null) { meta.setOwningPlayer(pp.player); skull.setItemMeta(meta); }
|
||||
}
|
||||
|
||||
item.click(event -> Modes.SPECTATOR.create(player, session));
|
||||
|
||||
display.add(item);
|
||||
sessions.add(session);
|
||||
items.add(skull);
|
||||
}
|
||||
|
||||
spectator.displayRows(0, 1)
|
||||
.addToDisplay(display)
|
||||
.nextPage(26, new Item(Material.LIME_DYE, "<#0DCB07><bold>»").click(event -> spectator.page(1)))
|
||||
.prevPage(18, new Item(Material.RED_DYE, "<#DE1F1F><bold>«").click(event -> spectator.page(-1)))
|
||||
.item(22, Locales.getItem(player, "other.close").click(event -> Menus.PLAY.open(event.getPlayer())))
|
||||
.open(player);
|
||||
ScrollableGUI gui = ScrollableGUI.create()
|
||||
.title(ColorUtil.color(title))
|
||||
.rows(3)
|
||||
.scrollUpButton(backItem(), 0)
|
||||
.scrollDownButton(nextItem(), 8);
|
||||
|
||||
for (int i = 0; i < items.size(); i++) {
|
||||
final Session session = sessions.get(i);
|
||||
gui = gui.addItem(items.get(i), e -> Modes.SPECTATOR.create(player, session));
|
||||
}
|
||||
|
||||
gui.open(player);
|
||||
}
|
||||
*/
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,42 +1,55 @@
|
|||
package dev.loki.loparkour.menu.settings;
|
||||
|
||||
import dev.loki.loparkour.config.Locales;
|
||||
import dev.loki.loparkour.menu.LPMenu;
|
||||
import dev.loki.loparkour.menu.Menus;
|
||||
import dev.loki.loparkour.player.ParkourPlayer;
|
||||
import dev.loki.loparkour.util.ColorUtil;
|
||||
import dev.lolib.gui.InventoryGUI;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class LangMenu {
|
||||
public class LangMenu extends LPMenu {
|
||||
|
||||
/**
|
||||
* Opens the language menu
|
||||
*
|
||||
* @param user The ParkourPlayer instance
|
||||
*/
|
||||
// TODO: Migrate to LoLib GUI system
|
||||
/*
|
||||
public void open(ParkourPlayer user) {
|
||||
if (user == null) {
|
||||
return;
|
||||
}
|
||||
// PagedMenu style = new PagedMenu(3, Locales.getString(user.locale, "settings.lang.name"));
|
||||
// List<MenuItem> items = new ArrayList<>();
|
||||
// for (String lang : Locales.locales.keySet()) {
|
||||
// Item item = new Item(Material.PAPER, "<#238681><bold>" + Locales.getString(lang, "name"));
|
||||
// items.add(item.click(event -> {
|
||||
// user.locale = lang;
|
||||
// user._locale = lang;
|
||||
// Menus.SETTINGS.open(event.getPlayer());
|
||||
// }));
|
||||
// }
|
||||
// style.displayRows(0, 1).addToDisplay(items)
|
||||
// .nextPage(26, new Item(Material.LIME_DYE, "<#0DCB07><bold>»").click(event -> style.page(1)))
|
||||
// .prevPage(18, new Item(Material.RED_DYE, "<#DE1F1F><bold>«").click(event -> style.page(-1)))
|
||||
// .item(22, Locales.getItem(user.locale, "other.close").click(event -> Menus.SETTINGS.open(event.getPlayer())))
|
||||
// .open(user.player);
|
||||
public void open(@NotNull ParkourPlayer user) {
|
||||
if (user == null) return;
|
||||
open(user.player);
|
||||
}
|
||||
*/
|
||||
|
||||
@Override
|
||||
public void open(@NotNull Player player) {
|
||||
ParkourPlayer pp = ParkourPlayer.getPlayer(player);
|
||||
if (pp == null) return;
|
||||
|
||||
String locale = pp.locale;
|
||||
String title = Locales.getString(locale, "settings.lang.name");
|
||||
|
||||
List<String> langs = new ArrayList<>(Locales.locales.keySet());
|
||||
|
||||
InventoryGUI gui = baseGui(title, 3);
|
||||
|
||||
for (int i = 0; i < Math.min(langs.size(), 7); i++) {
|
||||
final String lang = langs.get(i);
|
||||
String langName = Locales.getString(lang, "name");
|
||||
ItemStack item = new ItemStack(Material.PAPER);
|
||||
ItemMeta meta = item.getItemMeta();
|
||||
if (meta != null) {
|
||||
meta.setDisplayName(ColorUtil.color("𺑙&l" + langName));
|
||||
item.setItemMeta(meta);
|
||||
}
|
||||
gui = gui.setItem(10 + i, item, e -> {
|
||||
pp.locale = lang;
|
||||
pp._locale = lang;
|
||||
Menus.SETTINGS.open(player);
|
||||
});
|
||||
}
|
||||
|
||||
gui.open(player);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,351 +1,138 @@
|
|||
package dev.loki.loparkour.menu.settings;
|
||||
|
||||
import dev.loki.loparkour.LoParkour;
|
||||
import dev.loki.loparkour.api.Registry;
|
||||
import dev.loki.loparkour.config.Config;
|
||||
import dev.loki.loparkour.config.Locales;
|
||||
import dev.loki.loparkour.config.Option;
|
||||
import dev.loki.loparkour.menu.DynamicMenu;
|
||||
import dev.loki.loparkour.menu.LPMenu;
|
||||
import dev.loki.loparkour.menu.Menus;
|
||||
import dev.loki.loparkour.menu.ParkourOption;
|
||||
import dev.loki.loparkour.player.ParkourPlayer;
|
||||
import dev.loki.loparkour.player.ParkourUser;
|
||||
import dev.loki.loparkour.style.RandomStyle;
|
||||
import dev.loki.loparkour.style.Style;
|
||||
import org.bukkit.ChatColor;
|
||||
import dev.loki.loparkour.util.ColorUtil;
|
||||
import dev.lolib.gui.InventoryGUI;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Handles all menu-related activities
|
||||
*
|
||||
* @author loki
|
||||
* @since v3.0.0
|
||||
*/
|
||||
public class ParkourSettingsMenu extends DynamicMenu {
|
||||
public class ParkourSettingsMenu extends LPMenu {
|
||||
|
||||
// TODO: Migrate to LoLib GUI system
|
||||
/*
|
||||
public ParkourSettingsMenu(ParkourOption... disabled) {
|
||||
|
||||
// ---------- top row ----------
|
||||
|
||||
// styles
|
||||
registerMainItem(1, 0, (p, user) -> Locales.getItem(p, ParkourOption.STYLES.path + ".item", user instanceof ParkourPlayer player ? player.style : null).click(event -> {
|
||||
if (!(user instanceof ParkourPlayer player)) {
|
||||
return;
|
||||
}
|
||||
|
||||
openStyleMenu(player);
|
||||
}), player -> checkOptions(player, ParkourOption.STYLES, disabled));
|
||||
|
||||
// leads
|
||||
registerMainItem(1, 1, (p, user) -> {
|
||||
Item displayItem = Locales.getItem(p, ParkourOption.LEADS.path);
|
||||
|
||||
if (!(user instanceof ParkourPlayer player)) {
|
||||
return displayItem;
|
||||
}
|
||||
|
||||
List<Integer> leads = Option.POSSIBLE_LEADS;
|
||||
|
||||
SliderItem item = new SliderItem().initial(leads.indexOf(player.blockLead)); // initial value of the player
|
||||
|
||||
int slot = 0;
|
||||
for (int value : leads) {
|
||||
item.add(slot, displayItem.clone()
|
||||
.amount(value)
|
||||
.modifyLore(line -> line.replace("%s", Integer.toString(value))),
|
||||
event2 -> handleSettingChange(player, () -> player.blockLead = value));
|
||||
slot++;
|
||||
}
|
||||
return item;
|
||||
}, player -> checkOptions(player, ParkourOption.LEADS, disabled));
|
||||
|
||||
// schematics
|
||||
registerMainItem(1, 8, (p, user) -> {
|
||||
Item item = Locales.getItem(p, ParkourOption.SCHEMATICS.path);
|
||||
|
||||
if (!(user instanceof ParkourPlayer player)) {
|
||||
return item;
|
||||
}
|
||||
|
||||
List<Double> difficulties = List.of(0.0, 0.25, 0.5, 0.75, 1.0);
|
||||
List<String> values = Locales.getStringList(user.locale, "%s.values".formatted(ParkourOption.SCHEMATICS.path));
|
||||
|
||||
if (!difficulties.contains(player.schematicDifficulty)) {
|
||||
player.schematicDifficulty = difficulties.get(0);
|
||||
}
|
||||
|
||||
return new SliderItem()
|
||||
.initial(difficulties.indexOf(player.schematicDifficulty))
|
||||
.add(0, item.clone()
|
||||
.material(Material.RED_STAINED_GLASS_PANE)
|
||||
.modifyLore(line -> line.replace("%s", values.get(0))),
|
||||
event -> handleScoreSettingChange(player, event, () -> player.schematicDifficulty = 0.0))
|
||||
.add(1, item.clone()
|
||||
.material(Material.LIME_STAINED_GLASS_PANE)
|
||||
.modifyLore(line -> line.replace("%s", values.get(1))),
|
||||
event -> handleScoreSettingChange(player, event, () -> player.schematicDifficulty = 0.25))
|
||||
.add(2, item.clone()
|
||||
.material(Material.YELLOW_STAINED_GLASS_PANE)
|
||||
.modifyLore(line -> line.replace("%s", values.get(2))),
|
||||
event -> handleScoreSettingChange(player, event, () -> player.schematicDifficulty = 0.5))
|
||||
.add(3, item.clone()
|
||||
.material(Material.ORANGE_STAINED_GLASS_PANE)
|
||||
.modifyLore(line -> line.replace("%s", values.get(3))),
|
||||
event -> handleScoreSettingChange(player, event, () -> player.schematicDifficulty = 0.75))
|
||||
.add(4, item.clone()
|
||||
.material(Material.SKELETON_SKULL)
|
||||
.modifyLore(line -> line.replace("%s", values.get(4))),
|
||||
event -> handleScoreSettingChange(player, event, () -> player.schematicDifficulty = 1.0));
|
||||
}, player -> checkOptions(player, ParkourOption.SCHEMATICS, disabled));
|
||||
|
||||
// time
|
||||
registerMainItem(1, 9, (p, user) -> {
|
||||
Item item = Locales.getItem(p, ParkourOption.TIME.path);
|
||||
|
||||
if (!(user instanceof ParkourPlayer player)) {
|
||||
return item;
|
||||
}
|
||||
|
||||
// Tick times start at 6:00 and total is 24.000.
|
||||
// Source: https://minecraft.fandom.com/wiki/Daylight_cycle?file=Day_Night_Clock_24h.png
|
||||
List<Integer> times = Arrays.asList(0, 6000, 12000, 18000); // 00:00 -> 6:00 -> 12:00 -> 18:00
|
||||
|
||||
var format = Config.CONFIG.getInt("options.time.format");
|
||||
|
||||
return new SliderItem()
|
||||
.initial(times.indexOf(player.selectedTime))
|
||||
.add(0, item.clone()
|
||||
.modifyLore(line -> line.replace("%s", format == 12 ? "12:00 AM" : "00:00")),
|
||||
event -> handleSettingChange(player, () -> player.selectedTime = 0))
|
||||
.add(1, item.clone()
|
||||
.modifyLore(line -> line.replace("%s", format == 12 ? "6:00 AM" : "6:00")),
|
||||
event -> handleSettingChange(player, () -> player.selectedTime = 6000))
|
||||
.add(2, item.clone()
|
||||
.modifyLore(line -> line.replace("%s", format == 12 ? "12:00 PM" : "12:00")),
|
||||
event -> handleSettingChange(player, () -> player.selectedTime = 12000))
|
||||
.add(3, item.clone()
|
||||
.modifyLore(line -> line.replace("%s", format == 12 ? "6:00 PM" : "18:00")),
|
||||
event -> handleSettingChange(player, () -> player.selectedTime = 18000));
|
||||
}, player -> checkOptions(player, ParkourOption.TIME, disabled));
|
||||
|
||||
// ---------- bottom row ----------
|
||||
|
||||
// show scoreboard
|
||||
registerMainItem(2, 0, (p, user) -> {
|
||||
Item item = Locales.getItem(p, ParkourOption.SCOREBOARD.path);
|
||||
|
||||
if (!(user instanceof ParkourPlayer player)) {
|
||||
return item;
|
||||
}
|
||||
|
||||
return new SliderItem()
|
||||
.initial(player.showScoreboard ? 0 : 1)
|
||||
.add(0, item.clone()
|
||||
.material(Material.LIME_STAINED_GLASS_PANE)
|
||||
.modifyName(name -> "<#0DCB07><bold>" + ChatColor.stripColor(name))
|
||||
.modifyLore(line -> line.replace("%s", getBooleanSymbol(user, true))),
|
||||
event -> handleSettingChange(player, () -> {
|
||||
player.showScoreboard = true;
|
||||
player.board = new FastBoard(p);
|
||||
}))
|
||||
.add(1, item.clone()
|
||||
.material(Material.RED_STAINED_GLASS_PANE)
|
||||
.modifyName(name -> "<red><bold>" + ChatColor.stripColor(name))
|
||||
.modifyLore(line -> line.replace("%s", getBooleanSymbol(user, false))),
|
||||
event -> handleSettingChange(player, () -> {
|
||||
player.showScoreboard = false;
|
||||
if (player.board != null && !player.board.isDeleted()) {
|
||||
player.board.delete();
|
||||
}
|
||||
}));
|
||||
}, player -> checkOptions(player, ParkourOption.SCOREBOARD, disabled) && Boolean.parseBoolean(Option.OPTIONS_DEFAULTS.get(ParkourOption.SCOREBOARD)));
|
||||
|
||||
// show fall message
|
||||
registerMainItem(2, 1, (p, user) -> {
|
||||
Item item = Locales.getItem(p, ParkourOption.FALL_MESSAGE.path + ".item");
|
||||
|
||||
if (!(user instanceof ParkourPlayer player)) {
|
||||
return item;
|
||||
}
|
||||
|
||||
return new SliderItem()
|
||||
.initial(player.showFallMessage ? 0 : 1)
|
||||
.add(0, item.clone()
|
||||
.material(Material.LIME_STAINED_GLASS_PANE)
|
||||
.modifyName(name -> "<#0DCB07><bold>" + ChatColor.stripColor(name))
|
||||
.modifyLore(line -> line.replace("%s", getBooleanSymbol(user, true))),
|
||||
event -> handleSettingChange(player, () -> player.showFallMessage = true))
|
||||
.add(1, item.clone()
|
||||
.material(Material.RED_STAINED_GLASS_PANE)
|
||||
.modifyName(name -> "<red><bold>" + ChatColor.stripColor(name))
|
||||
.modifyLore(line -> line.replace("%s", getBooleanSymbol(user, false))),
|
||||
event -> handleSettingChange(player, () -> player.showFallMessage = false));
|
||||
}, player -> checkOptions(player, ParkourOption.FALL_MESSAGE, disabled));
|
||||
|
||||
// show sound
|
||||
registerMainItem(2, 2, (p, user) -> {
|
||||
Item item = Locales.getItem(p, ParkourOption.PARTICLES.path);
|
||||
|
||||
if (!(user instanceof ParkourPlayer player)) {
|
||||
return item;
|
||||
}
|
||||
|
||||
return new SliderItem()
|
||||
.initial(player.particles ? 0 : 1)
|
||||
.add(0, item.clone().material(Material.LIME_STAINED_GLASS_PANE)
|
||||
.modifyName(name -> "<#0DCB07><bold>" + ChatColor.stripColor(name))
|
||||
.modifyLore(line -> line.replace("%s", getBooleanSymbol(user, true))),
|
||||
event -> handleSettingChange(player, () -> player.particles = true))
|
||||
.add(1, item.clone()
|
||||
.material(Material.RED_STAINED_GLASS_PANE)
|
||||
.modifyName(name -> "<red><bold>" + ChatColor.stripColor(name))
|
||||
.modifyLore(line -> line.replace("%s", getBooleanSymbol(user, false))),
|
||||
event -> handleSettingChange(player, () -> player.particles = false));
|
||||
}, player -> checkOptions(player, ParkourOption.PARTICLES, disabled));
|
||||
|
||||
// show sound
|
||||
registerMainItem(2, 3, (p, user) -> {
|
||||
Item item = Locales.getItem(p, ParkourOption.SOUND.path);
|
||||
|
||||
if (!(user instanceof ParkourPlayer player)) {
|
||||
return item;
|
||||
}
|
||||
|
||||
return new SliderItem()
|
||||
.initial(player.sound ? 0 : 1)
|
||||
.add(0, item.clone()
|
||||
.material(Material.LIME_STAINED_GLASS_PANE)
|
||||
.modifyName(name -> "<#0DCB07><bold>" + ChatColor.stripColor(name))
|
||||
.modifyLore(line -> line.replace("%s", getBooleanSymbol(user, true))),
|
||||
event -> handleSettingChange(player, () -> player.sound = true))
|
||||
.add(1, item.clone()
|
||||
.material(Material.RED_STAINED_GLASS_PANE)
|
||||
.modifyName(name -> "<red><bold>" + ChatColor.stripColor(name))
|
||||
.modifyLore(line -> line.replace("%s", getBooleanSymbol(user, false))),
|
||||
event -> handleSettingChange(player, () -> player.sound = false));
|
||||
}, player -> checkOptions(player, ParkourOption.SOUND, disabled));
|
||||
|
||||
// show special blocks
|
||||
registerMainItem(2, 4, (p, user) -> {
|
||||
Item item = Locales.getItem(p, ParkourOption.SPECIAL_BLOCKS.path);
|
||||
|
||||
if (!(user instanceof ParkourPlayer player)) {
|
||||
return item;
|
||||
}
|
||||
|
||||
return new SliderItem()
|
||||
.initial(player.useSpecialBlocks ? 0 : 1)
|
||||
.add(0, item.clone()
|
||||
.material(Material.LIME_STAINED_GLASS_PANE)
|
||||
.modifyName(name -> "<#0DCB07><bold>" + ChatColor.stripColor(name))
|
||||
.modifyLore(line -> line.replace("%s", getBooleanSymbol(user, true))),
|
||||
event -> handleScoreSettingChange(player, event, () -> player.useSpecialBlocks = true))
|
||||
.add(1, item.clone()
|
||||
.material(Material.RED_STAINED_GLASS_PANE)
|
||||
.modifyName(name -> "<red><bold>" + ChatColor.stripColor(name))
|
||||
.modifyLore(line -> line.replace("%s", getBooleanSymbol(user, false))),
|
||||
event -> handleScoreSettingChange(player, event, () -> player.useSpecialBlocks = false));
|
||||
}, player -> checkOptions(player, ParkourOption.SPECIAL_BLOCKS, disabled));
|
||||
|
||||
// Always allow closing of the menu
|
||||
registerMainItem(3, 10,
|
||||
(player, user) -> Locales.getItem(player, "other.close")
|
||||
.click(event -> Menus.SETTINGS.open(event.getPlayer())),
|
||||
player -> true);
|
||||
public void open(@NotNull ParkourPlayer user) {
|
||||
if (user == null) return;
|
||||
open(user.player);
|
||||
}
|
||||
*/
|
||||
|
||||
/**
|
||||
* Shows the main menu to a valid ParkourPlayer instance
|
||||
*
|
||||
* @param user The ParkourPlayer
|
||||
*/
|
||||
// TODO: Migrate to LoLib GUI system
|
||||
/*
|
||||
public void open(ParkourPlayer user) {
|
||||
display(user.player, new Menu(4, Locales.getString(user.locale, "settings.name"))
|
||||
.distributeRowEvenly(0, 1, 2, 3)
|
||||
.item(27, Locales.getItem(user.locale, "other.close").click(event -> Menus.SETTINGS.open(event.getPlayer()))));
|
||||
@Override
|
||||
public void open(@NotNull Player player) {
|
||||
ParkourPlayer pp = ParkourPlayer.getPlayer(player);
|
||||
if (pp == null) return;
|
||||
|
||||
String locale = pp.locale;
|
||||
String title = Locales.getString(locale, "settings.name");
|
||||
|
||||
baseGui(title, 4)
|
||||
.setItem(10, toggleItem(locale, "particles", pp.particles), e -> {
|
||||
pp.particles = !pp.particles;
|
||||
pp.updateGeneratorSettings(pp.session.generator);
|
||||
open(pp);
|
||||
})
|
||||
.setItem(11, toggleItem(locale, "sound", pp.sound), e -> {
|
||||
pp.sound = !pp.sound;
|
||||
pp.updateGeneratorSettings(pp.session.generator);
|
||||
open(pp);
|
||||
})
|
||||
.setItem(12, toggleItem(locale, "special_blocks", pp.useSpecialBlocks), e -> {
|
||||
if (pp.session.generator.score == 0) {
|
||||
pp.useSpecialBlocks = !pp.useSpecialBlocks;
|
||||
pp.updateGeneratorSettings(pp.session.generator);
|
||||
}
|
||||
open(pp);
|
||||
})
|
||||
.setItem(13, toggleItem(locale, "fall_message", pp.showFallMessage), e -> {
|
||||
pp.showFallMessage = !pp.showFallMessage;
|
||||
pp.updateGeneratorSettings(pp.session.generator);
|
||||
open(pp);
|
||||
})
|
||||
.setItem(14, toggleItem(locale, "scoreboard", pp.showScoreboard), e -> {
|
||||
pp.showScoreboard = !pp.showScoreboard;
|
||||
pp.updateGeneratorSettings(pp.session.generator);
|
||||
open(pp);
|
||||
})
|
||||
.setItem(19, localeItem(player, "settings.parkour_settings.styles.item"),
|
||||
e -> openStyleMenu(pp))
|
||||
.setItem(20, schemDiffItem(pp), e -> {
|
||||
if (pp.session.generator.score == 0) {
|
||||
List<Double> diffs = List.of(0.0, 0.25, 0.5, 0.75, 1.0);
|
||||
int idx = diffs.indexOf(pp.schematicDifficulty);
|
||||
pp.schematicDifficulty = diffs.get((idx + 1) % diffs.size());
|
||||
pp.updateGeneratorSettings(pp.session.generator);
|
||||
}
|
||||
open(pp);
|
||||
})
|
||||
.setItem(31, closeButton(player), e -> Menus.SETTINGS.open(player))
|
||||
.open(player);
|
||||
}
|
||||
*/
|
||||
|
||||
/**
|
||||
* Opens the style menu
|
||||
*
|
||||
* @param player The ParkourPlayer instance
|
||||
*/
|
||||
// TODO: Migrate to LoLib GUI system
|
||||
/*
|
||||
public void openStyleMenu(ParkourPlayer player) {
|
||||
// init menu
|
||||
PagedMenu menu = new PagedMenu(3, Locales.getString(player.locale, ParkourOption.STYLES.path + ".name"));
|
||||
private ItemStack toggleItem(String locale, String key, boolean value) {
|
||||
Material mat = value ? Material.LIME_STAINED_GLASS_PANE : Material.RED_STAINED_GLASS_PANE;
|
||||
String symbol = Locales.getString(locale, "settings.parkour_settings." + (value ? "enabled" : "disabled"));
|
||||
String label = Locales.getString(locale, "settings.parkour_settings." + key + ".item");
|
||||
ItemStack item = new ItemStack(mat);
|
||||
ItemMeta meta = item.getItemMeta();
|
||||
if (meta != null) {
|
||||
meta.setDisplayName(ColorUtil.color(label + " §7[" + symbol + "§7]"));
|
||||
item.setItemMeta(meta);
|
||||
}
|
||||
return item;
|
||||
}
|
||||
|
||||
List<MenuItem> items = new ArrayList<>();
|
||||
private ItemStack schemDiffItem(ParkourPlayer pp) {
|
||||
List<Double> diffs = List.of(0.0, 0.25, 0.5, 0.75, 1.0);
|
||||
List<String> values = Locales.getStringList(pp.locale, "settings.parkour_settings.schematics.values");
|
||||
int idx = Math.max(0, diffs.indexOf(pp.schematicDifficulty));
|
||||
String label = idx < values.size() ? values.get(idx) : String.valueOf(pp.schematicDifficulty);
|
||||
Material[] mats = {Material.RED_STAINED_GLASS_PANE, Material.LIME_STAINED_GLASS_PANE,
|
||||
Material.YELLOW_STAINED_GLASS_PANE, Material.ORANGE_STAINED_GLASS_PANE, Material.SKELETON_SKULL};
|
||||
ItemStack item = new ItemStack(idx < mats.length ? mats[idx] : Material.PAPER);
|
||||
ItemMeta meta = item.getItemMeta();
|
||||
if (meta != null) {
|
||||
meta.setDisplayName(ColorUtil.color("§eSchematics §7» §f" + label));
|
||||
item.setItemMeta(meta);
|
||||
}
|
||||
return item;
|
||||
}
|
||||
|
||||
private void openStyleMenu(ParkourPlayer pp) {
|
||||
Player player = pp.player;
|
||||
String locale = pp.locale;
|
||||
String title = Locales.getString(locale, "settings.parkour_settings.styles.name");
|
||||
|
||||
List<Style> styles = new ArrayList<>();
|
||||
InventoryGUI gui = baseGui(title, 3);
|
||||
|
||||
int slot = 10;
|
||||
for (Style style : Registry.getStyles()) {
|
||||
var name = style.getName();
|
||||
if (slot > 16) break;
|
||||
String name = style.getName();
|
||||
String perm = ParkourOption.STYLES.permission + "." + name.toLowerCase().replace(" ", ".");
|
||||
if (Config.CONFIG.getBoolean("permissions.per-style") && !player.hasPermission(perm)) continue;
|
||||
|
||||
var perm = "%s.%s".formatted(ParkourOption.STYLES.permission, name.toLowerCase());
|
||||
if (Config.CONFIG.getBoolean("permissions.per-style") && !player.player.hasPermission(perm.replace(" ", "."))) {
|
||||
continue;
|
||||
}
|
||||
ItemStack item = new ItemStack(style.getNext());
|
||||
ItemMeta meta = item.getItemMeta();
|
||||
if (meta != null) { meta.setDisplayName(ColorUtil.color("&#A020F0" + name)); item.setItemMeta(meta); }
|
||||
|
||||
var category = style instanceof RandomStyle ? "random" : "incremental";
|
||||
|
||||
items.add(Locales.getItem(player.player, ParkourOption.STYLES.path + ".style_item", name, category)
|
||||
.material(style.getNext())
|
||||
.click(event -> {
|
||||
player.style = name;
|
||||
player.updateGeneratorSettings(player.session.generator);
|
||||
open(player);
|
||||
}));
|
||||
final Style s = style;
|
||||
gui = gui.setItem(slot++, item, e -> {
|
||||
pp.style = s.getName();
|
||||
pp.updateGeneratorSettings(pp.session.generator);
|
||||
open(pp);
|
||||
});
|
||||
}
|
||||
|
||||
menu.displayRows(0, 1)
|
||||
.addToDisplay(items)
|
||||
.nextPage(26, new Item(Material.LIME_DYE, "<#0DCB07><bold>»").click(event -> menu.page(1)))
|
||||
.prevPage(18, new Item(Material.RED_DYE, "<#DE1F1F><bold>«").click(event -> menu.page(-1)))
|
||||
.item(22, Locales.getItem(player.locale, "other.close").click(event -> open(player)))
|
||||
.open(player.player);
|
||||
}
|
||||
*/
|
||||
|
||||
// TODO: Migrate to LoLib GUI system
|
||||
/*
|
||||
private boolean handleSettingChange(ParkourPlayer player, Runnable onAllowed) {
|
||||
onAllowed.run();
|
||||
player.updateGeneratorSettings(player.session.generator);
|
||||
return true;
|
||||
}
|
||||
*/
|
||||
|
||||
// TODO: Migrate to LoLib GUI system
|
||||
/*
|
||||
private boolean handleScoreSettingChange(ParkourPlayer player, MenuClickEvent event, Runnable onAllowed) {
|
||||
if (player.session.generator.score == 0) {
|
||||
return handleSettingChange(player, onAllowed);
|
||||
}
|
||||
|
||||
event.menu().item(event.slot(), new TimedItem(Locales.getItem(player.locale, "settings.parkour_settings.items.no_change").click((event1) -> {}), event, LoParkour.getPlugin()).stay(5 * 20));
|
||||
event.menu().updateItem(event.slot());
|
||||
return false;
|
||||
|
||||
}
|
||||
*/
|
||||
|
||||
// replaces true/false with a checkmark and cross
|
||||
private String getBooleanSymbol(ParkourUser user, boolean value) {
|
||||
return value ? Locales.getString(user.player, "settings.parkour_settings.enabled") : Locales.getString(user.player, "settings.parkour_settings.disabled");
|
||||
}
|
||||
|
||||
// check if option is allowed to be displayed
|
||||
private boolean checkOptions(Player player, ParkourOption option, ParkourOption[] disabled) {
|
||||
return !Arrays.asList(disabled).contains(option) && option.mayPerform(player);
|
||||
gui.open(player);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,79 +1,40 @@
|
|||
package dev.loki.loparkour.menu.settings;
|
||||
|
||||
import dev.loki.loparkour.config.Locales;
|
||||
import dev.loki.loparkour.menu.DynamicMenu;
|
||||
import dev.loki.loparkour.menu.LPMenu;
|
||||
import dev.loki.loparkour.menu.Menus;
|
||||
import dev.loki.loparkour.menu.ParkourOption;
|
||||
import dev.loki.loparkour.player.ParkourPlayer;
|
||||
import dev.loki.loparkour.player.ParkourUser;
|
||||
import dev.loki.loparkour.session.Session;
|
||||
import dev.lolib.gui.InventoryGUI;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.List;
|
||||
public class SettingsMenu extends LPMenu {
|
||||
|
||||
/**
|
||||
* The menu for settings
|
||||
*/
|
||||
public class SettingsMenu extends DynamicMenu {
|
||||
@Override
|
||||
public void open(@NotNull Player player) {
|
||||
String locale = locale(player);
|
||||
String title = Locales.getString(locale, "settings.name");
|
||||
|
||||
// TODO: Migrate to LoLib GUI system
|
||||
/*
|
||||
public SettingsMenu() {
|
||||
registerMainItem(1, 0, (player, user) -> Locales.getItem(player, "settings.parkour_settings.item").click(event -> {
|
||||
ParkourPlayer pp = ParkourPlayer.getPlayer(event.getPlayer());
|
||||
InventoryGUI gui = baseGui(title, 3);
|
||||
|
||||
if (pp != null) {
|
||||
pp.session.generator.menu(pp);
|
||||
}
|
||||
}), player -> ParkourOption.PARKOUR_SETTINGS.mayPerform(player) && ParkourPlayer.isPlayer(player));
|
||||
|
||||
registerMainItem(1, 1, (player, user) -> Locales.getItem(player, "settings.lang.item", user != null ? Locales.getString(user.locale, "name") : "?").click(event -> Menus.LANG.open(ParkourPlayer.getPlayer(event.getPlayer()))), player -> ParkourOption.LANG.mayPerform(player) && ParkourUser.isUser(player));
|
||||
|
||||
registerMainItem(1, 2, (player, user) -> {
|
||||
// user has to be not-null to see this item
|
||||
assert user != null;
|
||||
|
||||
List<String> values = Locales.getStringList(user.locale, "settings.chat.values");
|
||||
|
||||
return new SliderItem().initial(switch (user.chatType) {
|
||||
case LOBBY_ONLY -> 0;
|
||||
case PLAYERS_ONLY -> 1;
|
||||
case PUBLIC -> 2;
|
||||
}).add(0, Locales.getItem(player, "settings.chat").modifyLore(lore -> lore.replace("%s", values.get(0))), event -> { // lobby only
|
||||
ParkourUser u = ParkourUser.getUser(event.getPlayer());
|
||||
|
||||
if (u != null) {
|
||||
u.chatType = Session.ChatType.LOBBY_ONLY;
|
||||
}
|
||||
|
||||
return true;
|
||||
}).add(1, Locales.getItem(player, "settings.chat").modifyLore(lore -> lore.replace("%s", values.get(1))), event -> { // players only
|
||||
ParkourUser u = ParkourUser.getUser(event.getPlayer());
|
||||
|
||||
if (u != null) {
|
||||
u.chatType = Session.ChatType.PLAYERS_ONLY;
|
||||
}
|
||||
|
||||
return true;
|
||||
}).add(2, Locales.getItem(player, "settings.chat").modifyLore(lore -> lore.replace("%s", values.get(2))), event -> { // public
|
||||
ParkourUser u = ParkourUser.getUser(event.getPlayer());
|
||||
|
||||
if (u != null) {
|
||||
u.chatType = Session.ChatType.PUBLIC;
|
||||
}
|
||||
|
||||
return true;
|
||||
if (ParkourOption.PARKOUR_SETTINGS.mayPerform(player) && ParkourPlayer.isPlayer(player)) {
|
||||
gui = gui.setItem(11, localeItem(player, "settings.parkour_settings.item"), e -> {
|
||||
ParkourPlayer pp = ParkourPlayer.getPlayer(player);
|
||||
if (pp != null) pp.session.generator.menu(pp);
|
||||
});
|
||||
}, player -> ParkourOption.CHAT.mayPerform(player) && ParkourUser.isUser(player));
|
||||
}
|
||||
|
||||
registerMainItem(2, 0, (player, user) -> Locales.getItem(player, "other.close").click(event -> event.getPlayer().closeInventory()), player -> true);
|
||||
}
|
||||
*/
|
||||
if (ParkourOption.LANG.mayPerform(player) && ParkourUser.isUser(player)) {
|
||||
String langName = Locales.getString(locale, "name");
|
||||
gui = gui.setItem(13, localeItem(locale, "settings.lang.item", langName), e -> {
|
||||
ParkourPlayer pp = ParkourPlayer.getPlayer(player);
|
||||
if (pp != null) Menus.LANG.open(pp);
|
||||
});
|
||||
}
|
||||
|
||||
// TODO: Migrate to LoLib GUI system
|
||||
/*
|
||||
public void open(Player player) {
|
||||
display(player, new Menu(3, Locales.getString(player, "settings.name")).distributeRowsEvenly());
|
||||
gui.setItem(22, closeButton(player), e -> player.closeInventory())
|
||||
.open(player);
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue