From 4e0195f7abc740898cca4e4d2c6a1d34c7757624 Mon Sep 17 00:00:00 2001 From: M_Viper Date: Mon, 11 Aug 2025 15:34:20 +0000 Subject: [PATCH] src/main/java/dev/viper/weathertime/WeatherTimeSyncPlugin.java aktualisiert --- .../weathertime/WeatherTimeSyncPlugin.java | 172 +++++++++++++++++- 1 file changed, 171 insertions(+), 1 deletion(-) diff --git a/src/main/java/dev/viper/weathertime/WeatherTimeSyncPlugin.java b/src/main/java/dev/viper/weathertime/WeatherTimeSyncPlugin.java index ac431ec..7b2f60b 100644 --- a/src/main/java/dev/viper/weathertime/WeatherTimeSyncPlugin.java +++ b/src/main/java/dev/viper/weathertime/WeatherTimeSyncPlugin.java @@ -23,6 +23,12 @@ import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.scheduler.BukkitRunnable; import org.json.JSONArray; import org.json.JSONObject; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.block.Block; + + import java.io.File; import java.io.IOException; @@ -32,6 +38,10 @@ import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.util.*; +// <--- NEU: Einbinden der Hilfsklassen (keine Änderung am bestehenden Code) +import dev.viper.weathertime.MetricsManager; +import dev.viper.weathertime.UpdateChecker; + public class WeatherTimeSyncPlugin extends JavaPlugin implements Listener { private String apiKey; @@ -47,6 +57,13 @@ public class WeatherTimeSyncPlugin extends JavaPlugin implements Listener { private final Set processedLocations = new HashSet<>(); private FileConfiguration langConfig; + // NEU: bStats & Updater-Felder + private MetricsManager metricsManager; + private UpdateChecker updateChecker; + + // Variable, um die aktuell bekannte neue Version zu speichern + private String latestVersion = null; + @Override public void onEnable() { saveDefaultConfig(); @@ -54,11 +71,41 @@ public class WeatherTimeSyncPlugin extends JavaPlugin implements Listener { loadConfig(); audiences = BukkitAudiences.create(this); + // bStats initialisieren + metricsManager = new MetricsManager(this); + + // Spigot UpdateChecker initialisieren (Resource-ID) + updateChecker = new UpdateChecker(this, 127846); + updateChecker.getLatestVersion(version -> { + // Version bereinigen: nur Zahlen und Punkte + String cleanVersion = version.replaceAll("[^0-9.]", "").trim(); + String currentVersion = getDescription().getVersion(); + + // Nur dann melden, wenn cleanVersion wirklich neuer ist + if (isVersionNewer(currentVersion, cleanVersion)) { + latestVersion = cleanVersion; // Neue Version merken + + // Konsolen-Info + getLogger().info("Neue Version verfügbar: " + cleanVersion + " (aktuell: " + currentVersion + ")"); + getLogger().info("Download: https://www.spigotmc.org/resources/127846/"); + + // Ingame-Info an alle aktuell online Operatoren + for (Player player : Bukkit.getOnlinePlayers()) { + if (player.isOp()) { + player.sendMessage("§aEine neue Version von §eRealTimeWeather §aist verfügbar: §e" + + cleanVersion + " §7(aktuell: " + currentVersion + ")"); + player.sendMessage("§eDownload: §bhttps://www.spigotmc.org/resources/127846/"); + } + } + } + }); + Objects.requireNonNull(getCommand("wetter")).setExecutor(new WetterCommand()); Objects.requireNonNull(getCommand("weatherforecast")).setExecutor(new WeatherForecastCommand()); Objects.requireNonNull(getCommand("toggleweather")).setExecutor(new ToggleWeatherCommand()); getServer().getPluginManager().registerEvents(this, this); + getServer().getPluginManager().registerEvents(new UpdateNotifyListener(), this); setDoDaylightCycleForWorlds(); startWeatherUpdateTask(); @@ -66,6 +113,41 @@ public class WeatherTimeSyncPlugin extends JavaPlugin implements Listener { initializePlayerDisplays(); } + // Methode zum Versionsvergleich, damit nur wirklich neuere Versionen gemeldet werden + private boolean isVersionNewer(String current, String latest) { + String[] curParts = current.split("\\."); + String[] latParts = latest.split("\\."); + int length = Math.max(curParts.length, latParts.length); + + for (int i = 0; i < length; i++) { + int curNum = i < curParts.length ? Integer.parseInt(curParts[i]) : 0; + int latNum = i < latParts.length ? Integer.parseInt(latParts[i]) : 0; + + if (latNum > curNum) { + return true; // neuere Version gefunden + } + if (latNum < curNum) { + return false; // keine neuere Version + } + } + return false; // Versionen sind gleich + } + + // Event Listener für Join-Nachricht + public class UpdateNotifyListener implements Listener { + + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) { + Player player = event.getPlayer(); + if (player.isOp() && latestVersion != null) { + String currentVersion = getDescription().getVersion(); + player.sendMessage("§aEine neue Version von §eRealTimeWeather §aist verfügbar: §e" + + latestVersion + " §7(aktuell: " + currentVersion + ")"); + player.sendMessage("§eDownload: §bhttps://www.spigotmc.org/resources/127846/"); + } + } + } + @Override public void onDisable() { if (weatherUpdateTask != null) weatherUpdateTask.cancel(); @@ -226,6 +308,13 @@ public class WeatherTimeSyncPlugin extends JavaPlugin implements Listener { case "snow": world.setStorm(true); world.setThundering(false); + + // ---- FAKE-SCHNEE ---- + spawnTemporarySnowInWorld(world, WeatherTimeSyncPlugin.this); + + // ---- Schneemänner, temporär spawnen (z.B. 25 Stück) ---- + spawnTemporarySnowmen(world, 25, WeatherTimeSyncPlugin.this); + break; default: world.setStorm(false); @@ -234,12 +323,93 @@ public class WeatherTimeSyncPlugin extends JavaPlugin implements Listener { } } }.runTask(this); + } catch (Exception e) { getLogger().warning("Fehler beim Abrufen von Wetter/Zeit für Welt " + world.getName() + ": " + e.getMessage()); } } } + /** + * Fake-Schnee auf allen aktuell geladenen Chunks platzieren + */ + private void spawnTemporarySnowInWorld(World world, JavaPlugin plugin) { + List snowBlocks = new ArrayList<>(); + + for (org.bukkit.Chunk chunk : world.getLoadedChunks()) { + int chunkX = chunk.getX() << 4; + int chunkZ = chunk.getZ() << 4; + + for (int x = 0; x < 16; x++) { + for (int z = 0; z < 16; z++) { + if (Math.random() > 0.7) continue; + int worldX = chunkX + x; + int worldZ = chunkZ + z; + int worldY = world.getHighestBlockYAt(worldX, worldZ); + + Block ground = world.getBlockAt(worldX, worldY - 1, worldZ); + Block above = world.getBlockAt(worldX, worldY, worldZ); + + if (ground.getType().isSolid() && above.getType() == Material.AIR) { + above.setType(Material.SNOW); + snowBlocks.add(above); + } + } + } + } + + // Schnee entfernen + new BukkitRunnable() { + @Override + public void run() { + for (Block b : snowBlocks) { + if (b.getType() == Material.SNOW) { + b.setType(Material.AIR); + } + } + } + }.runTaskLater(plugin, 180 * 20L); // 3 Minuten bleibt der Schnee liegen + } + + /** + * Spawn temporärer Schneemänner in geladenen Chunks + */ + private void spawnTemporarySnowmen(World world, int count, JavaPlugin plugin) { + List snowmen = new ArrayList<>(); + Random random = new Random(); + + List loadedChunks = Arrays.asList(world.getLoadedChunks()); + + for (int i = 0; i < count; i++) { + if (loadedChunks.isEmpty()) break; + org.bukkit.Chunk chunk = loadedChunks.get(random.nextInt(loadedChunks.size())); + + int chunkX = chunk.getX() << 4; + int chunkZ = chunk.getZ() << 4; + int x = chunkX + random.nextInt(16); + int z = chunkZ + random.nextInt(16); + int y = world.getHighestBlockYAt(x, z); + + if (world.getBlockAt(x, y - 1, z).getType().isSolid()) { + org.bukkit.entity.Snowman snowman = (org.bukkit.entity.Snowman) + world.spawnEntity(new org.bukkit.Location(world, x + 0.5, y, z + 0.5), + org.bukkit.entity.EntityType.SNOW_GOLEM); + snowmen.add(snowman); + } + } + + // Schneemänner nach 30 Sekunden wieder entfernen + new BukkitRunnable() { + @Override + public void run() { + for (org.bukkit.entity.Snowman s : snowmen) { + if (!s.isDead()) s.remove(); + } + } + }.runTaskLater(plugin, 180 * 20L); + } + + private void syncMinecraftTime(World world, ZonedDateTime dateTime) { int hour = dateTime.getHour(); int minute = dateTime.getMinute(); @@ -351,7 +521,7 @@ public class WeatherTimeSyncPlugin extends JavaPlugin implements Listener { new WeatherForecastCommand().onCommand(player, null, "weatherforecast", new String[]{}); } else if (clickedItem.getType() == Material.OAK_SIGN) { player.closeInventory(); - String infoMessage = "RealTimeWeather Plugin\nVersion: 1.0\nAutor: M_Viper\nGetestete Minecraft-Version: 1.21.1 - 1.21.8"; + String infoMessage = "RealTimeWeather Plugin\nVersion: 1.2\nAutor: M_Viper\nGetestete Minecraft-Version: 1.21.1 - 1.21.8"; audiences.player(player).sendMessage(Component.text(infoMessage, NamedTextColor.AQUA)); } }