2 Commits
1.0.0 ... 1.0.3

2 changed files with 191 additions and 182 deletions

View File

@@ -1,122 +1,127 @@
package me.viper.teamplugin.gui; package me.viper.teamplugin.gui;
import me.viper.teamplugin.Main; import me.viper.teamplugin.Main;
import me.viper.teamplugin.manager.DataManager; import me.viper.teamplugin.manager.DataManager;
import me.viper.teamplugin.manager.LangManager; import me.viper.teamplugin.manager.LangManager;
import me.viper.teamplugin.util.Utils; import me.viper.teamplugin.util.Utils;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.SkullMeta; import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.SkullMeta;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
public class TeamGUI { public class TeamGUI {
// rows mapping: we will place ranks on rows 1..4 (slots 9-17, 18-26, 27-35, 36-44) // Zeilenpositionen für Ränge
private static final int[] rows = {1, 2, 3, 4}; private static final int[] rows = {1, 2, 3, 4};
public static void openTeamGUI(Player player) { public static void openTeamGUI(Player player) {
FileConfiguration cfg = Main.getInstance().getConfig(); FileConfiguration cfg = Main.getInstance().getConfig();
FileConfiguration data = DataManager.getData(); FileConfiguration data = DataManager.getData();
int size = cfg.getInt("gui.size", 54); int size = cfg.getInt("gui.size", 54);
String title = Utils.color(cfg.getString("gui.title", "&8» &bTeam Übersicht")); String title = Utils.color(cfg.getString("gui.title", "&8» &bTeam Übersicht"));
Inventory inv = Bukkit.createInventory(null, size, title); Inventory inv = Bukkit.createInventory(null, size, title);
// background filler // Hintergrund-Glas setzen
Material bgMat = Material.valueOf(cfg.getString("gui.background", "GRAY_STAINED_GLASS_PANE")); Material bgMat = Material.valueOf(cfg.getString("gui.background", "GRAY_STAINED_GLASS_PANE"));
ItemStack filler = new ItemStack(bgMat); ItemStack filler = new ItemStack(bgMat);
ItemMeta fm = filler.getItemMeta(); ItemMeta fm = filler.getItemMeta();
if (fm != null) { if (fm != null) {
fm.setDisplayName(" "); fm.setDisplayName(" ");
filler.setItemMeta(fm); filler.setItemMeta(fm);
} }
for (int i = 0; i < inv.getSize(); i++) inv.setItem(i, filler); for (int i = 0; i < inv.getSize(); i++) inv.setItem(i, filler);
List<String> ranks = cfg.getStringList("ranks"); List<String> ranks = cfg.getStringList("ranks");
for (int i = 0; i < ranks.size() && i < rows.length; i++) { for (int i = 0; i < ranks.size() && i < rows.length; i++) {
String rank = ranks.get(i); String rank = ranks.get(i);
List<String> members = data.getStringList("Team." + rank); List<String> members = data.getStringList("Team." + rank);
if (members == null) members = new ArrayList<>(); if (members == null) members = new ArrayList<>();
int rowStart = rows[i] * 9; int rowStart = rows[i] * 9;
int count = Math.min(members.size(), 9); int count = Math.min(members.size(), 9);
if (count == 0) { if (count == 0) {
// show placeholder in middle ItemStack empty = createInfoItem("§7Kein/e " + rank, List.of("§7Keine Mitglieder"));
ItemStack empty = createInfoItem("§7Kein/e " + rank, List.of("§7Keine Mitglieder")); inv.setItem(rowStart + 4, empty);
inv.setItem(rowStart + 4, empty); continue;
continue; }
}
int startOffset = (9 - count) / 2;
int startOffset = (9 - count) / 2; for (int j = 0; j < count; j++) {
for (int j = 0; j < count; j++) { String name = members.get(j);
String name = members.get(j); int slot = rowStart + startOffset + j;
int slot = rowStart + startOffset + j; if (slot >= 0 && slot < inv.getSize()) {
if (slot >= 0 && slot < inv.getSize()) { inv.setItem(slot, createPlayerHead(name, rank));
inv.setItem(slot, createPlayerHead(name, rank)); }
} }
} }
}
player.openInventory(inv);
player.openInventory(inv); }
}
private static ItemStack createPlayerHead(String name, String rank) {
private static ItemStack createPlayerHead(String name, String rank) { FileConfiguration cfg = Main.getInstance().getConfig();
FileConfiguration cfg = Main.getInstance().getConfig();
ItemStack skull = new ItemStack(Material.PLAYER_HEAD);
ItemStack skull = new ItemStack(Material.PLAYER_HEAD); SkullMeta meta = (SkullMeta) skull.getItemMeta();
SkullMeta meta = (SkullMeta) skull.getItemMeta(); if (meta != null) {
if (meta != null) { OfflinePlayer off = Bukkit.getOfflinePlayer(name);
OfflinePlayer off = Bukkit.getOfflinePlayer(name); meta.setOwningPlayer(off);
meta.setOwningPlayer(off);
// Rank aus config
// rank display & prefix aus config String rankDisplay = cfg.getString("rank-settings." + rank + ".display", rank);
String rankDisplay = cfg.getString("rank-settings." + rank + ".display", rank); String rankPrefix = cfg.getString("rank-settings." + rank + ".prefix", "");
String rankPrefix = cfg.getString("rank-settings." + rank + ".prefix", "");
// Name + Prefix
// Anzeige-Name: optional Prefix (farbcodes erlauben) + Spielername (in blau) String displayName = (rankPrefix == null ? "" : rankPrefix + " ") + "&b" + name;
String displayName = (rankPrefix == null ? "" : rankPrefix + " ") + "&b" + name; meta.setDisplayName(Utils.color(displayName.trim()));
meta.setDisplayName(Utils.color(displayName.trim()));
List<String> lore = new ArrayList<>();
List<String> lore = new ArrayList<>();
// Rang-Zeile (farbig, aus config display nutzen) // Rang
String rankLine = Utils.replace(LangManager.get("tooltip_rank"), "%rank%", rankDisplay); String rankLine = Utils.replace(LangManager.get("tooltip_rank"), "%rank%", rankDisplay);
lore.add(Utils.color(rankLine)); lore.add(Utils.color(rankLine));
// Join-Datum falls vorhanden // Online-/Offline-Status aus config
String iso = DataManager.getData().getString("JoinDates." + name, ""); String statusOnline = cfg.getString("status.online", "&a🟢 Online");
String joinLine = Utils.replace(LangManager.get("tooltip_joined"), "%joindate%", Utils.prettifyIso(iso)); String statusOffline = cfg.getString("status.offline", "&c🔴 Offline");
lore.add(Utils.color(joinLine)); boolean isOnline = off.isOnline();
String statusLine = isOnline ? statusOnline : statusOffline;
meta.setLore(lore); lore.add(Utils.color("&7Status: " + statusLine));
skull.setItemMeta(meta);
} // Join-Datum, falls vorhanden
return skull; String iso = DataManager.getData().getString("JoinDates." + name, "");
} if (iso != null && !iso.isEmpty()) {
String joinLine = Utils.replace(LangManager.get("tooltip_joined"), "%joindate%", Utils.prettifyIso(iso));
private static ItemStack createInfoItem(String name, List<String> lore) { lore.add(Utils.color(joinLine));
ItemStack item = new ItemStack(Material.PAPER); }
ItemMeta m = item.getItemMeta();
if (m != null) { meta.setLore(lore);
m.setDisplayName(Utils.color(name)); skull.setItemMeta(meta);
m.setLore(lore.stream().map(Utils::color).toList()); }
item.setItemMeta(m); return skull;
} }
return item;
} private static ItemStack createInfoItem(String name, List<String> lore) {
ItemStack item = new ItemStack(Material.PAPER);
/** ItemMeta m = item.getItemMeta();
* Liefert den (ungefärbten) GUI-Titel aus der config (z.B. "&8» &bTeam Übersicht"). if (m != null) {
* Listener sollte Utils.color(...) darauf anwenden bevor er mit e.getView().getTitle() vergleicht. m.setDisplayName(Utils.color(name));
*/ m.setLore(lore.stream().map(Utils::color).toList());
public static String getGuiTitle() { item.setItemMeta(m);
return Main.getInstance().getConfig().getString("gui.title", "&8» &bTeam Übersicht"); }
} return item;
} }
public static String getGuiTitle() {
return Main.getInstance().getConfig().getString("gui.title", "&8» &bTeam Übersicht");
}
}

View File

@@ -1,60 +1,64 @@
# ---------- GUI ---------- # ---------- GUI ----------
gui: gui:
size: 54 # feste Größe size: 54 # feste Größe
title: "&8» &bTeam Übersicht" title: "&8» &bTeam Übersicht"
background: GRAY_STAINED_GLASS_PANE background: GRAY_STAINED_GLASS_PANE
# ---------- Ranks ---------- status:
# Reihenfolge der Ränge (nur Namen, die in rank-settings definiert sind) online: "&a🟢 Online"
ranks: offline: "&c🔴 Offline"
- Owner
- Admin # ---------- Ranks ----------
- Moderator # Reihenfolge der Ränge (nur Namen, die in rank-settings definiert sind)
- Supporter ranks:
- Owner
# Pro Rang Darstellung (display = wie der Rang im GUI angezeigt wird, prefix = optional am Spielernamen) - Admin
# Du kannst hier &-Farbcodes benutzen, z.B. &c für rot, &6 für gold, &e gelb etc. - Moderator
rank-settings: - Supporter
Owner:
display: "&cOwner" # Pro Rang Darstellung (display = wie der Rang im GUI angezeigt wird, prefix = optional am Spielernamen)
prefix: "&c[Owner]" # Du kannst hier &-Farbcodes benutzen, z.B. &c für rot, &6 für gold, &e gelb etc.
Admin: rank-settings:
display: "&6Admin" Owner:
prefix: "&6[Admin]" display: "&cOwner"
Moderator: prefix: "&c[Owner]"
display: "&eModerator" Admin:
prefix: "&e[Mod]" display: "&6Admin"
Supporter: prefix: "&6[Admin]"
display: "&bSupporter" Moderator:
prefix: "&b[Supp]" display: "&eModerator"
prefix: "&e[Mod]"
# ---------- Admin GUI Buttons ---------- Supporter:
admin-buttons: display: "&bSupporter"
- key: edit_ranks prefix: "&b[Supp]"
material: PAPER
slot: 11 # ---------- Admin GUI Buttons ----------
title: "&aRänge bearbeiten" admin-buttons:
lore: - key: edit_ranks
- "&7Bearbeite 'ranks' in config.yml" material: PAPER
- "&7und benutze &e/team settings -> Plugin neu laden" slot: 11
- key: reload title: "&aRänge bearbeiten"
material: BARRIER lore:
slot: 13 - "&7Bearbeite 'ranks' in config.yml"
title: "&cPlugin neu laden" - "&7und benutze &e/team settings -> Plugin neu laden"
lore: - key: reload
- "&7Lädt Config, Lang & Daten neu" material: BARRIER
- key: backup slot: 13
material: CHEST title: "&cPlugin neu laden"
slot: 15 lore:
title: "&eBackup erstellen" - "&7Lädt Config, Lang & Daten neu"
lore: - key: backup
- "&7Erstellt eine Sicherung von data.yml" material: CHEST
slot: 15
# ---------- Backup Settings ---------- title: "&eBackup erstellen"
backup: lore:
enabled: true - "&7Erstellt eine Sicherung von data.yml"
folder: backups
keep: 10 # wie viele Backups behalten werden # ---------- Backup Settings ----------
backup:
# ---------- Misc ---------- enabled: true
storeJoinDate: true folder: backups
keep: 10 # wie viele Backups behalten werden
# ---------- Misc ----------
storeJoinDate: true