src/main/java/dev/viper/weathertime/WeatherTimeSyncPlugin.java aktualisiert
This commit is contained in:
@@ -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<String> 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<Block> 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<org.bukkit.entity.Snowman> snowmen = new ArrayList<>();
|
||||
Random random = new Random();
|
||||
|
||||
List<org.bukkit.Chunk> 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));
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user