Compare commits
2 Commits
Author | SHA1 | Date | |
---|---|---|---|
6edf8f9157 | |||
6aecea0489 |
@@ -1,122 +1,127 @@
|
||||
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");
|
||||
}
|
||||
}
|
||||
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.ItemMeta;
|
||||
import org.bukkit.inventory.meta.SkullMeta;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class TeamGUI {
|
||||
|
||||
// Zeilenpositionen für Ränge
|
||||
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);
|
||||
|
||||
// Hintergrund-Glas setzen
|
||||
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) {
|
||||
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 aus config
|
||||
String rankDisplay = cfg.getString("rank-settings." + rank + ".display", rank);
|
||||
String rankPrefix = cfg.getString("rank-settings." + rank + ".prefix", "");
|
||||
|
||||
// Name + Prefix
|
||||
String displayName = (rankPrefix == null ? "" : rankPrefix + " ") + "&b" + name;
|
||||
meta.setDisplayName(Utils.color(displayName.trim()));
|
||||
|
||||
List<String> lore = new ArrayList<>();
|
||||
|
||||
// Rang
|
||||
String rankLine = Utils.replace(LangManager.get("tooltip_rank"), "%rank%", rankDisplay);
|
||||
lore.add(Utils.color(rankLine));
|
||||
|
||||
// Online-/Offline-Status aus config
|
||||
String statusOnline = cfg.getString("status.online", "&a🟢 Online");
|
||||
String statusOffline = cfg.getString("status.offline", "&c🔴 Offline");
|
||||
boolean isOnline = off.isOnline();
|
||||
String statusLine = isOnline ? statusOnline : statusOffline;
|
||||
lore.add(Utils.color("&7Status: " + statusLine));
|
||||
|
||||
// Join-Datum, falls vorhanden
|
||||
String iso = DataManager.getData().getString("JoinDates." + name, "");
|
||||
if (iso != null && !iso.isEmpty()) {
|
||||
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;
|
||||
}
|
||||
|
||||
public static String getGuiTitle() {
|
||||
return Main.getInstance().getConfig().getString("gui.title", "&8» &bTeam Übersicht");
|
||||
}
|
||||
}
|
||||
|
@@ -1,60 +1,64 @@
|
||||
# ---------- GUI ----------
|
||||
gui:
|
||||
size: 54 # feste Größe
|
||||
title: "&8» &bTeam Übersicht"
|
||||
background: GRAY_STAINED_GLASS_PANE
|
||||
|
||||
# ---------- Ranks ----------
|
||||
# Reihenfolge der Ränge (nur Namen, die in rank-settings definiert sind)
|
||||
ranks:
|
||||
- Owner
|
||||
- Admin
|
||||
- Moderator
|
||||
- Supporter
|
||||
|
||||
# Pro Rang Darstellung (display = wie der Rang im GUI angezeigt wird, prefix = optional am Spielernamen)
|
||||
# Du kannst hier &-Farbcodes benutzen, z.B. &c für rot, &6 für gold, &e gelb etc.
|
||||
rank-settings:
|
||||
Owner:
|
||||
display: "&cOwner"
|
||||
prefix: "&c[Owner]"
|
||||
Admin:
|
||||
display: "&6Admin"
|
||||
prefix: "&6[Admin]"
|
||||
Moderator:
|
||||
display: "&eModerator"
|
||||
prefix: "&e[Mod]"
|
||||
Supporter:
|
||||
display: "&bSupporter"
|
||||
prefix: "&b[Supp]"
|
||||
|
||||
# ---------- Admin GUI Buttons ----------
|
||||
admin-buttons:
|
||||
- key: edit_ranks
|
||||
material: PAPER
|
||||
slot: 11
|
||||
title: "&aRänge bearbeiten"
|
||||
lore:
|
||||
- "&7Bearbeite 'ranks' in config.yml"
|
||||
- "&7und benutze &e/team settings -> Plugin neu laden"
|
||||
- key: reload
|
||||
material: BARRIER
|
||||
slot: 13
|
||||
title: "&cPlugin neu laden"
|
||||
lore:
|
||||
- "&7Lädt Config, Lang & Daten neu"
|
||||
- key: backup
|
||||
material: CHEST
|
||||
slot: 15
|
||||
title: "&eBackup erstellen"
|
||||
lore:
|
||||
- "&7Erstellt eine Sicherung von data.yml"
|
||||
|
||||
# ---------- Backup Settings ----------
|
||||
backup:
|
||||
enabled: true
|
||||
folder: backups
|
||||
keep: 10 # wie viele Backups behalten werden
|
||||
|
||||
# ---------- Misc ----------
|
||||
storeJoinDate: true
|
||||
# ---------- GUI ----------
|
||||
gui:
|
||||
size: 54 # feste Größe
|
||||
title: "&8» &bTeam Übersicht"
|
||||
background: GRAY_STAINED_GLASS_PANE
|
||||
|
||||
status:
|
||||
online: "&a🟢 Online"
|
||||
offline: "&c🔴 Offline"
|
||||
|
||||
# ---------- Ranks ----------
|
||||
# Reihenfolge der Ränge (nur Namen, die in rank-settings definiert sind)
|
||||
ranks:
|
||||
- Owner
|
||||
- Admin
|
||||
- Moderator
|
||||
- Supporter
|
||||
|
||||
# Pro Rang Darstellung (display = wie der Rang im GUI angezeigt wird, prefix = optional am Spielernamen)
|
||||
# Du kannst hier &-Farbcodes benutzen, z.B. &c für rot, &6 für gold, &e gelb etc.
|
||||
rank-settings:
|
||||
Owner:
|
||||
display: "&cOwner"
|
||||
prefix: "&c[Owner]"
|
||||
Admin:
|
||||
display: "&6Admin"
|
||||
prefix: "&6[Admin]"
|
||||
Moderator:
|
||||
display: "&eModerator"
|
||||
prefix: "&e[Mod]"
|
||||
Supporter:
|
||||
display: "&bSupporter"
|
||||
prefix: "&b[Supp]"
|
||||
|
||||
# ---------- Admin GUI Buttons ----------
|
||||
admin-buttons:
|
||||
- key: edit_ranks
|
||||
material: PAPER
|
||||
slot: 11
|
||||
title: "&aRänge bearbeiten"
|
||||
lore:
|
||||
- "&7Bearbeite 'ranks' in config.yml"
|
||||
- "&7und benutze &e/team settings -> Plugin neu laden"
|
||||
- key: reload
|
||||
material: BARRIER
|
||||
slot: 13
|
||||
title: "&cPlugin neu laden"
|
||||
lore:
|
||||
- "&7Lädt Config, Lang & Daten neu"
|
||||
- key: backup
|
||||
material: CHEST
|
||||
slot: 15
|
||||
title: "&eBackup erstellen"
|
||||
lore:
|
||||
- "&7Erstellt eine Sicherung von data.yml"
|
||||
|
||||
# ---------- Backup Settings ----------
|
||||
backup:
|
||||
enabled: true
|
||||
folder: backups
|
||||
keep: 10 # wie viele Backups behalten werden
|
||||
|
||||
# ---------- Misc ----------
|
||||
storeJoinDate: true
|
||||
|
Reference in New Issue
Block a user