Dateien nach "src/main/java/de/mviper/adventskalender" hochladen

This commit is contained in:
2025-12-21 19:10:05 +00:00
parent 6b51cf8c04
commit 3b6bbd8321
9 changed files with 607 additions and 0 deletions

View File

@@ -0,0 +1,56 @@
package de.mviper.adventskalender;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.Material;
public class AdminCommand implements CommandExecutor {
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (args.length == 1 && args[0].equalsIgnoreCase("reload")) {
Adventskalender.getInstance().reloadConfig();
LanguageManager.setup();
sender.sendMessage(LanguageManager.getString("messages.admin.reload_success"));
return true;
}
if (args.length == 3 && args[0].equalsIgnoreCase("open")) {
Player target = Bukkit.getPlayer(args[1]);
if (target == null) {
sender.sendMessage(LanguageManager.getString("messages.admin.player_not_found").replace("%player%", args[1]));
return true;
}
try {
int day = Integer.parseInt(args[2]);
if (day < 1 || day > 24) {
sender.sendMessage(LanguageManager.getString("messages.admin.invalid_day"));
return true;
}
if (target.getInventory().firstEmpty() == -1) {
target.getWorld().dropItemNaturally(target.getLocation(), AdventInventory.getRewardItem(day));
} else {
target.getInventory().addItem(AdventInventory.getRewardItem(day));
}
CalendarData.setClaimed(target, day);
sender.sendMessage(LanguageManager.getString("messages.admin.open_success").replace("%player%", target.getName()).replace("%day%", String.valueOf(day)));
target.sendMessage(LanguageManager.getString("messages.reward_received").replace("%day%", String.valueOf(day)));
} catch (NumberFormatException e) {
sender.sendMessage(LanguageManager.getString("messages.admin.invalid_day"));
}
return true;
}
sender.sendMessage("§cUsage: /adventskalender admin reload");
sender.sendMessage("§cUsage: /adventskalender admin open <player> <day>");
return true;
}
}

View File

@@ -0,0 +1,62 @@
package de.mviper.adventskalender;
import me.clip.placeholderapi.expansion.PlaceholderExpansion;
import org.bukkit.entity.Player;
import java.time.LocalDate;
import java.time.Month;
public class AdventCalendarExpansion extends PlaceholderExpansion {
@Override
public String getIdentifier() {
// Der Identifier ist jetzt nur noch "ak"
return "ak";
}
@Override
public String getAuthor() {
return "mviper";
}
@Override
public String getVersion() {
return "1.1.0";
}
@Override
public boolean canRegister() {
return true;
}
@Override
public String onPlaceholderRequest(Player player, String identifier) {
if (player == null) {
return "";
}
// Die Platzhalter sind jetzt viel kürzer
switch (identifier) {
case "c": // Geöffnet (claimed)
return String.valueOf(CalendarData.getClaimedCount(player));
case "n": // Nächstes (next)
for (int day = 1; day <= 24; day++) {
if (!CalendarData.hasClaimed(player, day)) {
return String.valueOf(day);
}
}
return "None";
case "d": // Tage (days)
LocalDate today = LocalDate.now();
LocalDate christmas = LocalDate.of(today.getYear(), Month.DECEMBER, 25);
if (today.isAfter(christmas)) {
christmas = christmas.plusYears(1);
}
return String.valueOf((int) java.time.temporal.ChronoUnit.DAYS.between(today, christmas));
default:
return null;
}
}
}

View File

@@ -0,0 +1,87 @@
package de.mviper.adventskalender;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
public class AdventCommand implements CommandExecutor {
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
// --- Admin-Befehle (/ak admin ...) ---
if (args.length >= 1 && args[0].equalsIgnoreCase("admin")) {
// Prüfen, ob der Spieler die Admin-Berechtigung hat
if (!sender.hasPermission("adventskalender.admin")) {
sender.sendMessage(LanguageManager.getString("messages.no_permission"));
return true;
}
// /ak admin reload
if (args.length == 2 && args[1].equalsIgnoreCase("reload")) {
Adventskalender.getInstance().reloadConfig();
LanguageManager.setup();
sender.sendMessage(LanguageManager.getString("messages.admin.reload_success"));
return true;
}
// /ak admin open <player> <day>
if (args.length == 4 && args[1].equalsIgnoreCase("open")) {
Player target = Bukkit.getPlayer(args[2]);
if (target == null) {
sender.sendMessage(LanguageManager.getString("messages.admin.player_not_found").replace("%player%", args[2]));
return true;
}
try {
int day = Integer.parseInt(args[3]);
if (day < 1 || day > 24) {
sender.sendMessage(LanguageManager.getString("messages.admin.invalid_day"));
return true;
}
ItemStack reward = AdventInventory.getRewardItem(day);
if (reward != null && reward.getType() != Material.AIR) {
if (target.getInventory().firstEmpty() == -1) {
target.getWorld().dropItemNaturally(target.getLocation(), reward);
} else {
target.getInventory().addItem(reward);
}
}
CalendarData.setClaimed(target, day);
sender.sendMessage(LanguageManager.getString("messages.admin.open_success").replace("%player%", target.getName()).replace("%day%", String.valueOf(day)));
target.sendMessage(LanguageManager.getString("messages.reward_received").replace("%day%", String.valueOf(day)));
} catch (NumberFormatException e) {
sender.sendMessage(LanguageManager.getString("messages.admin.invalid_day"));
}
return true;
}
// Falsche Nutzung der Admin-Befehle
sender.sendMessage("§cUsage: /ak admin reload");
sender.sendMessage("§cUsage: /ak admin open <player> <day>");
return true;
}
// --- Hauptbefehl (/ak) ---
if (!(sender instanceof Player)) {
sender.sendMessage(LanguageManager.getString("messages.only_player"));
return true;
}
Player player = (Player) sender;
if (!player.hasPermission("adventskalender.use")) {
player.sendMessage(LanguageManager.getString("messages.no_permission"));
return true;
}
AdventInventory.openCalendar(player);
return true;
}
}

View File

@@ -0,0 +1,120 @@
package de.mviper.adventskalender;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import java.time.LocalDate;
import java.time.Month;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class AdventInventory {
public static void openCalendar(org.bukkit.entity.Player player) {
// KORREKTUR: Wir lesen den Titel direkt aus der Sprachdatei.
// Der Pfad "gui.title" entspricht der Struktur in deiner messages_de.yml
String title = LanguageManager.getString("gui.title");
Inventory inv = Bukkit.createInventory(null, 54, title);
for (int i = 0; i < 24; i++) {
int day = i + 1;
ItemStack item = getCalendarItem(player, day);
inv.setItem(i, item);
}
ItemStack filler = new ItemStack(Material.GRAY_STAINED_GLASS_PANE);
ItemMeta fillerMeta = filler.getItemMeta();
fillerMeta.setDisplayName(" ");
filler.setItemMeta(fillerMeta);
for (int i = 24; i < 54; i++) {
inv.setItem(i, filler);
}
player.openInventory(inv);
}
public static ItemStack getCalendarItem(org.bukkit.entity.Player player, int day) {
LocalDate today = LocalDate.now();
String prefix = LanguageManager.getString("prefix");
if (today.getMonth() != Month.DECEMBER || today.getDayOfMonth() < day) {
ItemStack item = new ItemStack(Material.BARRIER);
ItemMeta meta = item.getItemMeta();
meta.setDisplayName(prefix + "§cTag " + day);
List<String> lore = new ArrayList<>();
lore.add(prefix + "§7Noch nicht verfügbar.");
lore.add(prefix + "§7Komme am " + day + ". Dezember wieder.");
meta.setLore(lore);
item.setItemMeta(meta);
return item;
}
if (CalendarData.hasClaimed(player, day)) {
ItemStack item = new ItemStack(Material.GREEN_STAINED_GLASS_PANE);
ItemMeta meta = item.getItemMeta();
meta.setDisplayName(prefix + "§aTag " + day + " - Geöffnet");
List<String> lore = new ArrayList<>();
lore.add(prefix + LanguageManager.getString("messages.day_already_claimed"));
meta.setLore(lore);
item.setItemMeta(meta);
return item;
}
ItemStack item = new ItemStack(Material.CHEST);
ItemMeta meta = item.getItemMeta();
meta.setDisplayName(prefix + "§eTag " + day + " - Noch zu holen!");
List<String> lore = new ArrayList<>();
lore.add(prefix + "§7Klicke, um dein Geschenk zu erhalten.");
meta.setLore(lore);
item.setItemMeta(meta);
return item;
}
public static ItemStack getRewardItem(int day) {
String path = "rewards." + day;
if (!Adventskalender.getInstance().getConfig().contains(path)) {
return new ItemStack(Material.AIR);
}
String materialName = Adventskalender.getInstance().getConfig().getString(path + ".material");
int amount = Adventskalender.getInstance().getConfig().getInt(path + ".amount");
String key = Adventskalender.getInstance().getConfig().getString(path + ".key");
Material material = Material.getMaterial(materialName);
if (material == null) {
Adventskalender.getInstance().getLogger().warning("Material '" + materialName + "' für Tag " + day + " nicht gefunden!");
return new ItemStack(Material.BARRIER);
}
ItemStack item = new ItemStack(material, amount);
ItemMeta meta = item.getItemMeta();
String namePath = key + ".name";
String lorePath = key + ".lore";
meta.setDisplayName(LanguageManager.getString(namePath));
meta.setLore(LanguageManager.getStringList(lorePath));
List<Map<?, ?>> enchantmentList = Adventskalender.getInstance().getConfig().getMapList(path + ".enchantments");
if (enchantmentList != null) {
for (Map<?, ?> enchantmentMap : enchantmentList) {
String enchantName = (String) enchantmentMap.get("type");
int level = (int) enchantmentMap.get("level");
Enchantment enchantment = Enchantment.getByName(enchantName);
if (enchantment != null) {
meta.addEnchant(enchantment, level, true);
}
}
}
meta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES);
item.setItemMeta(meta);
return item;
}
}

View File

@@ -0,0 +1,58 @@
package de.mviper.adventskalender;
import org.bukkit.*;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.ItemStack;
import java.time.LocalDate;
import java.time.Month;
public class AdventListener implements Listener {
@EventHandler
public void onInventoryClick(InventoryClickEvent event) {
// KORREKTUR: Wir verwenden den gleichen Schlüssel wie in der AdventInventory.java,
// um den Titel zu laden. So sind beide Titel identisch.
String translatedTitle = LanguageManager.getString("gui.title");
if (event.getView().getTitle().equals(translatedTitle)) {
event.setCancelled(true); // Diese Zeile wird jetzt wieder ausgeführt!
if (!(event.getWhoClicked() instanceof Player)) return;
Player player = (Player) event.getWhoClicked();
int slot = event.getSlot();
if (slot < 0 || slot > 23) return;
int day = slot + 1;
LocalDate today = LocalDate.now();
if (today.getMonth() == Month.DECEMBER && today.getDayOfMonth() >= day && !CalendarData.hasClaimed(player, day)) {
ItemStack reward = AdventInventory.getRewardItem(day);
if (reward != null && reward.getType() != Material.AIR) {
if (player.getInventory().firstEmpty() == -1) {
player.getWorld().dropItemNaturally(player.getLocation(), reward);
player.sendMessage(LanguageManager.getString("messages.inventory_full"));
} else {
player.getInventory().addItem(reward);
}
player.sendMessage(LanguageManager.getString("messages.reward_received").replace("%day%", String.valueOf(day)));
player.playSound(player.getLocation(), Sound.ENTITY_PLAYER_LEVELUP, 1.0f, 1.0f);
player.spawnParticle(Particle.VILLAGER_HAPPY, player.getLocation().add(0, 1, 0), 20, 0.5, 0.5, 0.5, 0);
}
CalendarData.setClaimed(player, day);
ItemStack newItem = AdventInventory.getCalendarItem(player, day);
event.getInventory().setItem(slot, newItem);
} else {
player.sendMessage(LanguageManager.getString("messages.day_not_available"));
player.playSound(player.getLocation(), Sound.ENTITY_VILLAGER_NO, 1.0f, 1.0f);
}
}
}
}

View File

@@ -0,0 +1,40 @@
package de.mviper.adventskalender;
import org.bukkit.Bukkit;
import org.bukkit.plugin.java.JavaPlugin;
public final class Adventskalender extends JavaPlugin {
private static Adventskalender instance;
@Override
public void onEnable() {
instance = this;
saveDefaultConfig();
LanguageManager.setup();
CalendarData.setup();
getCommand("adventskalender").setExecutor(new AdventCommand());
getServer().getPluginManager().registerEvents(new AdventListener(), this);
// Prüfen, ob PlaceholderAPI vorhanden ist und unsere neue Erweiterung registrieren
if (Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null) {
// HIER IST DIE ÄNDERUNG: Wir erstellen eine Instanz der neuen Klasse
new AdventCalendarExpansion().register();
getLogger().info("PlaceholderAPI expansion registered.");
} else {
getLogger().warning("PlaceholderAPI not found. Placeholders will not work.");
}
getLogger().info("Adventskalender-Plugin wurde erfolgreich aktiviert!");
}
@Override
public void onDisable() {
getLogger().info("Adventskalender-Plugin wurde deaktiviert.");
}
public static Adventskalender getInstance() {
return instance;
}
}

View File

@@ -0,0 +1,68 @@
package de.mviper.adventskalender;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import java.io.File;
import java.io.IOException;
import java.util.List;
public class CalendarData {
private static File file;
private static FileConfiguration customFile;
public static void setup() {
file = new File(Adventskalender.getInstance().getDataFolder(), "calendar.yml");
if (!file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
Adventskalender.getInstance().getLogger().severe("Konnte calendar.yml nicht erstellen: " + e.getMessage());
}
}
customFile = YamlConfiguration.loadConfiguration(file);
}
public static void save() {
try {
customFile.save(file);
} catch (IOException e) {
Adventskalender.getInstance().getLogger().severe("Konnte calendar.yml nicht speichern: " + e.getMessage());
}
}
public static boolean hasClaimed(Player player, int day) {
boolean isGlobal = Adventskalender.getInstance().getConfig().getBoolean("calendar.use_global_calendar");
if (isGlobal) {
List<Integer> claimedDays = customFile.getIntegerList("global_claimed_days");
return claimedDays.contains(day);
} else {
List<Integer> claimedDays = customFile.getIntegerList(player.getUniqueId().toString());
return claimedDays.contains(day);
}
}
public static void setClaimed(Player player, int day) {
boolean isGlobal = Adventskalender.getInstance().getConfig().getBoolean("calendar.use_global_calendar");
if (isGlobal) {
List<Integer> claimedDays = customFile.getIntegerList("global_claimed_days");
claimedDays.add(day);
customFile.set("global_claimed_days", claimedDays);
} else {
List<Integer> claimedDays = customFile.getIntegerList(player.getUniqueId().toString());
claimedDays.add(day);
customFile.set(player.getUniqueId().toString(), claimedDays);
}
save();
}
public static int getClaimedCount(Player player) {
if (Adventskalender.getInstance().getConfig().getBoolean("calendar.use_global_calendar")) {
return customFile.getIntegerList("global_claimed_days").size();
} else {
return customFile.getIntegerList(player.getUniqueId().toString()).size();
}
}
}

View File

@@ -0,0 +1,41 @@
package de.mviper.adventskalender;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import java.io.File;
import java.util.List;
public class LanguageManager {
private static FileConfiguration languageConfig;
public static void setup() {
String lang = Adventskalender.getInstance().getConfig().getString("general.language", "de");
File languageFile = new File(Adventskalender.getInstance().getDataFolder(), "messages_" + lang + ".yml");
if (!languageFile.exists()) {
Adventskalender.getInstance().saveResource("messages_" + lang + ".yml", false);
}
languageConfig = YamlConfiguration.loadConfiguration(languageFile);
}
public static String getString(String path) {
if (languageConfig.contains(path)) {
return format(languageConfig.getString(path));
}
return "§cLanguage key not found: " + path;
}
public static List<String> getStringList(String path) {
if (languageConfig.contains(path)) {
return languageConfig.getStringList(path).stream().map(LanguageManager::format).toList();
}
return List.of("§cLanguage key list not found: " + path);
}
private static String format(String message) {
return org.bukkit.ChatColor.translateAlternateColorCodes('&', message);
}
}

View File

@@ -0,0 +1,75 @@
package de.mviper.adventskalender;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
/**
* Verwaltet die Spielerdaten in einer separaten YAML-Datei.
* Speichert, welcher Spieler an welchem Tag sein Geschenk bereits geholt hat.
*/
public class PlayerData {
private static File file;
private static FileConfiguration customFile;
/**
* Erstellt die playerdata.yml-Datei, falls sie nicht existiert.
*/
public static void setup() {
file = new File(Adventskalender.getInstance().getDataFolder(), "playerdata.yml");
if (!file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
Adventskalender.getInstance().getLogger().severe("Konnte playerdata.yml nicht erstellen: " + e.getMessage());
}
}
customFile = YamlConfiguration.loadConfiguration(file);
}
public static FileConfiguration get() {
return customFile;
}
public static void save() {
try {
customFile.save(file);
} catch (IOException e) {
Adventskalender.getInstance().getLogger().severe("Konnte playerdata.yml nicht speichern: " + e.getMessage());
}
}
public static void reload() {
customFile = YamlConfiguration.loadConfiguration(file);
}
/**
* Prüft, ob ein Spieler ein Geschenk für einen bestimmten Tag bereits geholt hat.
* @param uuid Die UUID des Spielers
* @param day Der Tag (1-24)
* @return true, wenn bereits geholt, sonst false
*/
public static boolean hasClaimed(UUID uuid, int day) {
// Wir speichern eine Liste der geöffneten Tage für jeden Spieler
List<Integer> claimedDays = customFile.getIntegerList(uuid.toString());
return claimedDays.contains(day);
}
/**
* Markiert einen Tag für einen Spieler als geholt.
* @param uuid Die UUID des Spielers
* @param day Der Tag (1-24)
*/
public static void setClaimed(UUID uuid, int day) {
List<Integer> claimedDays = customFile.getIntegerList(uuid.toString());
claimedDays.add(day);
customFile.set(uuid.toString(), claimedDays);
save();
}
}