Dateien nach "src/main/java/me/viper/teamplugin/gui" hochladen
This commit is contained in:
104
src/main/java/me/viper/teamplugin/gui/BackupGUI.java
Normal file
104
src/main/java/me/viper/teamplugin/gui/BackupGUI.java
Normal file
@@ -0,0 +1,104 @@
|
||||
package me.viper.teamplugin.gui;
|
||||
|
||||
import me.viper.teamplugin.manager.BackupManager;
|
||||
import me.viper.teamplugin.manager.DataManager;
|
||||
import me.viper.teamplugin.manager.LangManager;
|
||||
import me.viper.teamplugin.util.Utils;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class BackupGUI {
|
||||
|
||||
/**
|
||||
* Öffnet das Backup-Auswahl-GUI.
|
||||
*/
|
||||
public static void openBackupGUI(Player player) {
|
||||
List<String> backups = BackupManager.listBackups();
|
||||
int size = 54; // feste GUI Größe
|
||||
String title = Utils.color(getGuiTitle());
|
||||
Inventory inv = Bukkit.createInventory(null, size, title);
|
||||
|
||||
// Hintergrund-Filler
|
||||
ItemStack filler = new ItemStack(Material.GRAY_STAINED_GLASS_PANE);
|
||||
ItemMeta fm = filler.getItemMeta();
|
||||
if (fm != null) {
|
||||
fm.setDisplayName(" ");
|
||||
filler.setItemMeta(fm);
|
||||
}
|
||||
for (int i = 0; i < inv.getSize(); i++) inv.setItem(i, filler);
|
||||
|
||||
if (backups.isEmpty()) {
|
||||
ItemStack empty = new ItemStack(Material.PAPER);
|
||||
ItemMeta meta = empty.getItemMeta();
|
||||
if (meta != null) {
|
||||
meta.setDisplayName(Utils.color("§7Keine Backups vorhanden"));
|
||||
meta.setLore(List.of(Utils.color("§7Erstelle zuerst ein Backup")));
|
||||
empty.setItemMeta(meta);
|
||||
}
|
||||
inv.setItem(22, empty); // mittig
|
||||
} else {
|
||||
int slot = 10; // mittig starten
|
||||
for (String backup : backups) {
|
||||
ItemStack item = new ItemStack(Material.PAPER);
|
||||
ItemMeta meta = item.getItemMeta();
|
||||
if (meta != null) {
|
||||
meta.setDisplayName("§b" + backup); // sichtbar: Name mit Farbe
|
||||
List<String> lore = new ArrayList<>();
|
||||
lore.add(Utils.color("§7Klicke um dieses Backup wiederherzustellen"));
|
||||
lore.add(Utils.color("§7Datei: §e" + backup));
|
||||
meta.setLore(lore);
|
||||
item.setItemMeta(meta);
|
||||
}
|
||||
|
||||
if (slot >= inv.getSize()) break;
|
||||
inv.setItem(slot, item);
|
||||
slot++;
|
||||
// rücke in die Mitte der nächsten Reihe, sofern nötig
|
||||
if (slot % 9 == 8) slot += 2;
|
||||
}
|
||||
}
|
||||
|
||||
player.openInventory(inv);
|
||||
}
|
||||
|
||||
/**
|
||||
* Wird vom InventoryListener aufgerufen, wenn im Backup-GUI geklickt wurde.
|
||||
*/
|
||||
public static void handleClick(InventoryClickEvent e) {
|
||||
e.setCancelled(true); // Items nicht entnehmbar
|
||||
if (e.getCurrentItem() == null || e.getCurrentItem().getType() == Material.AIR) return;
|
||||
ItemMeta meta = e.getCurrentItem().getItemMeta();
|
||||
if (meta == null || meta.getDisplayName() == null) return;
|
||||
|
||||
String display = meta.getDisplayName();
|
||||
// Erwartete Form: "§b<data-backup-...>.yml"
|
||||
String filename = display.replace("§b", "").trim();
|
||||
|
||||
boolean ok = BackupManager.restoreBackup(filename);
|
||||
if (ok) {
|
||||
e.getWhoClicked().sendMessage(
|
||||
Utils.replace(LangManager.get("backup_restore_success"), "%file%", filename)
|
||||
);
|
||||
// DataManager hat reload intern (BackupManager ruft DataManager.reloadData() / oder DataManager.restoreBackup)
|
||||
} else {
|
||||
e.getWhoClicked().sendMessage(
|
||||
Utils.replace(LangManager.get("backup_not_found"), "%file%", filename)
|
||||
);
|
||||
}
|
||||
|
||||
e.getWhoClicked().closeInventory();
|
||||
}
|
||||
|
||||
public static String getGuiTitle() {
|
||||
// Verwende einen separaten Text (ohne %prefix%), damit der Titel eindeutig ist
|
||||
return LangManager.get("backups_list_title");
|
||||
}
|
||||
}
|
131
src/main/java/me/viper/teamplugin/gui/SettingsGUI.java
Normal file
131
src/main/java/me/viper/teamplugin/gui/SettingsGUI.java
Normal file
@@ -0,0 +1,131 @@
|
||||
package me.viper.teamplugin.gui;
|
||||
|
||||
import me.viper.teamplugin.Main;
|
||||
import me.viper.teamplugin.manager.BackupManager;
|
||||
import me.viper.teamplugin.manager.DataManager;
|
||||
import me.viper.teamplugin.manager.LangManager;
|
||||
import me.viper.teamplugin.util.Utils;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.configuration.file.FileConfiguration;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Settings GUI - zeigt Buttons, die in der config unter "admin-buttons" definiert sind.
|
||||
* Der "backup"-Button öffnet nun die Backup-Auswahl-GUI (BackupGUI).
|
||||
*/
|
||||
public class SettingsGUI {
|
||||
|
||||
public static void openSettings(Player player) {
|
||||
FileConfiguration cfg = Main.getInstance().getConfig();
|
||||
String title = Utils.color(getGuiTitle());
|
||||
Inventory inv = Bukkit.createInventory(null, 27, title);
|
||||
|
||||
// read admin-buttons from config
|
||||
List<?> buttons = cfg.getList("admin-buttons");
|
||||
if (buttons != null) {
|
||||
for (Object o : buttons) {
|
||||
if (!(o instanceof Map)) continue;
|
||||
Map<?, ?> map = (Map<?, ?>) o;
|
||||
String material = (String) map.get("material");
|
||||
int slot = (int) map.get("slot");
|
||||
String titleBtn = Utils.color((String) map.get("title"));
|
||||
@SuppressWarnings("unchecked")
|
||||
List<String> lore = (List<String>) map.get("lore");
|
||||
|
||||
Material mat;
|
||||
try {
|
||||
mat = Material.valueOf(material);
|
||||
} catch (Exception e) {
|
||||
mat = Material.PAPER;
|
||||
}
|
||||
|
||||
ItemStack item = new ItemStack(mat);
|
||||
ItemMeta meta = item.getItemMeta();
|
||||
if (meta != null) {
|
||||
meta.setDisplayName(titleBtn);
|
||||
if (lore != null) meta.setLore(lore.stream().map(Utils::color).toList());
|
||||
item.setItemMeta(meta);
|
||||
}
|
||||
|
||||
if (slot >= 0 && slot < inv.getSize()) inv.setItem(slot, item);
|
||||
}
|
||||
}
|
||||
|
||||
player.openInventory(inv);
|
||||
}
|
||||
|
||||
public static void handleClick(InventoryClickEvent e) {
|
||||
if (!e.getView().getTitle().equals(Utils.color(getGuiTitle()))) return;
|
||||
e.setCancelled(true);
|
||||
if (e.getCurrentItem() == null || !e.getCurrentItem().hasItemMeta()) return;
|
||||
|
||||
Player p = (Player) e.getWhoClicked();
|
||||
String title = e.getCurrentItem().getItemMeta().getDisplayName();
|
||||
|
||||
// match by configured keys: check title strings
|
||||
FileConfiguration cfg = Main.getInstance().getConfig();
|
||||
List<?> buttons = cfg.getList("admin-buttons");
|
||||
if (buttons != null) {
|
||||
for (Object o : buttons) {
|
||||
if (!(o instanceof Map)) continue;
|
||||
Map<?, ?> map = (Map<?, ?>) o;
|
||||
String key = (String) map.get("key");
|
||||
String titleBtn = Utils.color((String) map.get("title"));
|
||||
|
||||
if (title.equals(titleBtn)) {
|
||||
// execute action depending on key
|
||||
switch (key) {
|
||||
case "edit_ranks" -> {
|
||||
p.closeInventory();
|
||||
p.sendMessage(Utils.color(LangManager.get("prefix")) + "§aBearbeite die Ränge in config.yml und führe dann /team settings -> Plugin neu laden aus.");
|
||||
}
|
||||
case "reload" -> {
|
||||
Main.getInstance().reloadConfig();
|
||||
LangManager.setup();
|
||||
DataManager.reloadData();
|
||||
LangManager.save();
|
||||
DataManager.save();
|
||||
p.sendMessage(Utils.color(LangManager.get("plugin_reloaded")));
|
||||
p.closeInventory();
|
||||
}
|
||||
case "backup" -> {
|
||||
// Öffne die Backup-Auswahl-GUI statt nur ein Backup zu erstellen
|
||||
p.closeInventory();
|
||||
BackupGUI.openBackupGUI(p);
|
||||
}
|
||||
case "restore" -> {
|
||||
// Falls du einen separaten "restore" Button hast: öffne ebenfalls die Backup-GUI
|
||||
p.closeInventory();
|
||||
BackupGUI.openBackupGUI(p);
|
||||
}
|
||||
case "backup_now" -> {
|
||||
// optional: falls du einen Button willst, der direkt ein Backup erstellt
|
||||
String f = BackupManager.createBackup();
|
||||
if (f != null) p.sendMessage(Utils.replace(LangManager.get("backup_created"), "%file%", f));
|
||||
else p.sendMessage(Utils.color(LangManager.get("prefix")) + "§cBackup fehlgeschlagen.");
|
||||
p.closeInventory();
|
||||
}
|
||||
default -> {
|
||||
p.sendMessage(Utils.color(LangManager.get("prefix")) + "§cUnbekannter Button: " + key);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Liefert den GUI-Titel (ungefärbt) für das Settings-GUI.
|
||||
*/
|
||||
public static String getGuiTitle() {
|
||||
return LangManager.get("settings_gui_title");
|
||||
}
|
||||
}
|
122
src/main/java/me/viper/teamplugin/gui/TeamGUI.java
Normal file
122
src/main/java/me/viper/teamplugin/gui/TeamGUI.java
Normal file
@@ -0,0 +1,122 @@
|
||||
package me.viper.teamplugin.gui;
|
||||
|
||||
import me.viper.teamplugin.Main;
|
||||
import me.viper.teamplugin.manager.DataManager;
|
||||
import me.viper.teamplugin.manager.LangManager;
|
||||
import me.viper.teamplugin.util.Utils;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.bukkit.configuration.file.FileConfiguration;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.SkullMeta;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class TeamGUI {
|
||||
|
||||
// rows mapping: we will place ranks on rows 1..4 (slots 9-17, 18-26, 27-35, 36-44)
|
||||
private static final int[] rows = {1, 2, 3, 4};
|
||||
|
||||
public static void openTeamGUI(Player player) {
|
||||
FileConfiguration cfg = Main.getInstance().getConfig();
|
||||
FileConfiguration data = DataManager.getData();
|
||||
|
||||
int size = cfg.getInt("gui.size", 54);
|
||||
String title = Utils.color(cfg.getString("gui.title", "&8» &bTeam Übersicht"));
|
||||
Inventory inv = Bukkit.createInventory(null, size, title);
|
||||
|
||||
// background filler
|
||||
Material bgMat = Material.valueOf(cfg.getString("gui.background", "GRAY_STAINED_GLASS_PANE"));
|
||||
ItemStack filler = new ItemStack(bgMat);
|
||||
ItemMeta fm = filler.getItemMeta();
|
||||
if (fm != null) {
|
||||
fm.setDisplayName(" ");
|
||||
filler.setItemMeta(fm);
|
||||
}
|
||||
for (int i = 0; i < inv.getSize(); i++) inv.setItem(i, filler);
|
||||
|
||||
List<String> ranks = cfg.getStringList("ranks");
|
||||
for (int i = 0; i < ranks.size() && i < rows.length; i++) {
|
||||
String rank = ranks.get(i);
|
||||
List<String> members = data.getStringList("Team." + rank);
|
||||
if (members == null) members = new ArrayList<>();
|
||||
|
||||
int rowStart = rows[i] * 9;
|
||||
int count = Math.min(members.size(), 9);
|
||||
if (count == 0) {
|
||||
// show placeholder in middle
|
||||
ItemStack empty = createInfoItem("§7Kein/e " + rank, List.of("§7Keine Mitglieder"));
|
||||
inv.setItem(rowStart + 4, empty);
|
||||
continue;
|
||||
}
|
||||
|
||||
int startOffset = (9 - count) / 2;
|
||||
for (int j = 0; j < count; j++) {
|
||||
String name = members.get(j);
|
||||
int slot = rowStart + startOffset + j;
|
||||
if (slot >= 0 && slot < inv.getSize()) {
|
||||
inv.setItem(slot, createPlayerHead(name, rank));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
player.openInventory(inv);
|
||||
}
|
||||
|
||||
private static ItemStack createPlayerHead(String name, String rank) {
|
||||
FileConfiguration cfg = Main.getInstance().getConfig();
|
||||
|
||||
ItemStack skull = new ItemStack(Material.PLAYER_HEAD);
|
||||
SkullMeta meta = (SkullMeta) skull.getItemMeta();
|
||||
if (meta != null) {
|
||||
OfflinePlayer off = Bukkit.getOfflinePlayer(name);
|
||||
meta.setOwningPlayer(off);
|
||||
|
||||
// rank display & prefix aus config
|
||||
String rankDisplay = cfg.getString("rank-settings." + rank + ".display", rank);
|
||||
String rankPrefix = cfg.getString("rank-settings." + rank + ".prefix", "");
|
||||
|
||||
// Anzeige-Name: optional Prefix (farbcodes erlauben) + Spielername (in blau)
|
||||
String displayName = (rankPrefix == null ? "" : rankPrefix + " ") + "&b" + name;
|
||||
meta.setDisplayName(Utils.color(displayName.trim()));
|
||||
|
||||
List<String> lore = new ArrayList<>();
|
||||
// Rang-Zeile (farbig, aus config display nutzen)
|
||||
String rankLine = Utils.replace(LangManager.get("tooltip_rank"), "%rank%", rankDisplay);
|
||||
lore.add(Utils.color(rankLine));
|
||||
|
||||
// Join-Datum falls vorhanden
|
||||
String iso = DataManager.getData().getString("JoinDates." + name, "");
|
||||
String joinLine = Utils.replace(LangManager.get("tooltip_joined"), "%joindate%", Utils.prettifyIso(iso));
|
||||
lore.add(Utils.color(joinLine));
|
||||
|
||||
meta.setLore(lore);
|
||||
skull.setItemMeta(meta);
|
||||
}
|
||||
return skull;
|
||||
}
|
||||
|
||||
private static ItemStack createInfoItem(String name, List<String> lore) {
|
||||
ItemStack item = new ItemStack(Material.PAPER);
|
||||
ItemMeta m = item.getItemMeta();
|
||||
if (m != null) {
|
||||
m.setDisplayName(Utils.color(name));
|
||||
m.setLore(lore.stream().map(Utils::color).toList());
|
||||
item.setItemMeta(m);
|
||||
}
|
||||
return item;
|
||||
}
|
||||
|
||||
/**
|
||||
* Liefert den (ungefärbten) GUI-Titel aus der config (z.B. "&8» &bTeam Übersicht").
|
||||
* Listener sollte Utils.color(...) darauf anwenden bevor er mit e.getView().getTitle() vergleicht.
|
||||
*/
|
||||
public static String getGuiTitle() {
|
||||
return Main.getInstance().getConfig().getString("gui.title", "&8» &bTeam Übersicht");
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user