Update wtapi
All checks were successful
/ deploy (push) Successful in 2m0s

No major refactoring
This commit is contained in:
Minecon724 2025-05-24 14:48:53 +02:00
commit 7927d8ba3e
Signed by: Minecon724
GPG key ID: A02E6E67AB961189
19 changed files with 152 additions and 165 deletions

2
.idea/modules.xml generated
View file

@ -2,7 +2,7 @@
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/realweather.iml" filepath="$PROJECT_DIR$/realweather.iml" />
<module fileurl="file://$PROJECT_DIR$/.idea/realweather.iml" filepath="$PROJECT_DIR$/.idea/realweather.iml" />
</modules>
</component>
</project>

13
.idea/realweather.iml generated Normal file
View file

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<module version="4">
<component name="FacetManager">
<facet type="minecraft" name="Minecraft">
<configuration>
<autoDetectTypes>
<platformType>SPIGOT</platformType>
</autoDetectTypes>
<projectReimportVersion>1</projectReimportVersion>
</configuration>
</facet>
</component>
</module>

View file

@ -46,7 +46,7 @@
<dependency>
<groupId>eu.m724</groupId>
<artifactId>wtapi</artifactId>
<version>0.8.3</version>
<version>0.9.2</version>
</dependency>
<dependency>
<groupId>eu.m724</groupId>

View file

@ -7,6 +7,7 @@ import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.logging.Logger;
import eu.m724.wtapi.provider.exception.NoSuchProviderException;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.plugin.java.JavaPlugin;
@ -26,7 +27,6 @@ import eu.m724.realweather.updater.UpdaterConfig;
import eu.m724.realweather.weather.PlayerWeatherCache;
import eu.m724.realweather.weather.WeatherConfig;
import eu.m724.realweather.weather.WeatherMaster;
import eu.m724.wtapi.provider.exception.NoSuchProviderException;
import eu.m724.wtapi.provider.exception.ProviderException;
// TODO unmess this too
@ -110,8 +110,8 @@ public class RealWeatherPlugin extends JavaPlugin {
updater = PluginUpdater.build(this, this.getFile());
//updater.init();
} catch (UserError | NoSuchProviderException e) {
logger.severe("There are errors in your config:");
logger.severe(e.getMessage());
logger.severe("There's an error in your config:");
logger.severe(" " + e.getMessage());
getServer().getPluginManager().disablePlugin(this);
return;

View file

@ -1,8 +1,5 @@
package eu.m724.realweather.commands;
import net.md_5.bungee.api.chat.*;
import net.md_5.bungee.api.chat.hover.content.Content;
import net.md_5.bungee.api.chat.hover.content.Text;
import org.bukkit.Location;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
@ -11,13 +8,11 @@ import org.bukkit.entity.Player;
import eu.m724.realweather.GlobalConstants;
import eu.m724.realweather.mapper.Mapper;
import eu.m724.realweather.weather.PlayerWeatherCache;
import eu.m724.wtapi.object.Coordinates;
import eu.m724.wtapi.object.Weather;
import net.md_5.bungee.api.ChatColor;
public class GeoCommand implements CommandExecutor {
private final PlayerWeatherCache playerWeatherCache = GlobalConstants.getPlayerWeatherCache();
//private final PlayerWeatherCache playerWeatherCache = GlobalConstants.getPlayerWeatherCache();
private final Mapper mapper = GlobalConstants.getMapper();
@Override
@ -29,14 +24,16 @@ public class GeoCommand implements CommandExecutor {
Location location = player.getLocation();
Coordinates coordinates = mapper.locationToCoordinates(location);
Weather weather = playerWeatherCache.getWeather(player);
String address = formatAddress(weather);
//Weather weather = playerWeatherCache.getWeather(player);
//String address = formatAddress(weather);
colorize(player, "");
colorize(player, "&6Geolocation: &b%f&7, %b%f &7(lat, lon)", coordinates.latitude, coordinates.longitude);
colorize(player, "&7Position: &3%f&8, %3%f &8(x, z)", location.getX(), location.getZ());
colorize(player, "&7City: &3%s", address);
colorize(player, "&6Geolocation: &b%f&7, &b%f &7(lat, lon)", coordinates.latitude(), coordinates.longitude());
colorize(player, "&7In-game Position: &3%f&8, &3%f &8(x, z)", location.getX(), location.getZ());
//colorize(player, "&7City: &3%s", address);
colorize(player, "");
} else {
sender.sendMessage("You can't run this command without arguments as console");
}
} else if (args.length >= 3) {
colorize(sender, "&cInvalid arguments, &7make sure it's &a\"/geo lat,lon\" &7or &a\"/geo x z\" &7or just &a\"/geo\"");
@ -55,12 +52,10 @@ public class GeoCommand implements CommandExecutor {
Coordinates coordinates = mapper.locationToCoordinates(location);
colorize(sender, "");
colorize(sender, "&6Position: &b%f&7, %b%f &7(x, z)", location.getX(), location.getZ());
colorize(sender, "&7Geolocation: &3%f&8, %3%f &8(lat, lon)", coordinates.latitude, coordinates.longitude);
colorize(sender, "&7Input interpreted as position, because you separated with a space");
colorize(sender, "&6In-game Position: &b%f&7, &b%f &7(x, z)", location.getX(), location.getZ());
colorize(sender, "&7Geolocation: &3%f&8, &3%f &8(lat, lon)", coordinates.latitude(), coordinates.longitude());
colorize(sender, "&7Input interpreted as position, because you separated it with a space");
colorize(sender, "");
return true;
} else {
double latitude, longitude;
@ -77,8 +72,8 @@ public class GeoCommand implements CommandExecutor {
Location location = mapper.coordinatesToLocation(null, coordinates);
colorize(sender, "");
colorize(sender, "&6Position: &b%f&7, %b%f &7(x, z)", location.getX(), location.getZ());
colorize(sender, "&7Geolocation: &3%f&8, %3%f &8(lat, lon)", coordinates.latitude, coordinates.longitude);
colorize(sender, "&6In-game Position: &b%f&7, &b%f &7(x, z)", location.getX(), location.getZ());
colorize(sender, "&7Geolocation: &3%f&8, &3%f &8(lat, lon)", coordinates.latitude(), coordinates.longitude());
colorize(sender, "&7Input interpreted as geolocation, because you separated with a comma");
colorize(sender, "");
}
@ -89,18 +84,4 @@ public class GeoCommand implements CommandExecutor {
private void colorize(CommandSender sender, String text, Object... format) {
sender.sendMessage(ChatColor.translateAlternateColorCodes('&', text.formatted(format)));
}
private String formatAddress(Weather weather) {
if (weather == null) return "Not retrieved yet";
Coordinates coordinates = weather.coordinates;
if (coordinates.country == null && coordinates.city == null)
return "Unknown";
else if (coordinates.city == null)
return "Somewhere in " + coordinates.country;
else if (coordinates.country == null)
return coordinates.city;
return coordinates.city + ", " + coordinates.country;
}
}

View file

@ -49,7 +49,7 @@ public class LocalTimeCommand implements CommandExecutor {
if (timeConfig.dynamic() && player != null && player.hasPermission("realweather.dynamic")) {
Coordinates coordinates = mapper.locationToCoordinates(player.getLocation());
long offsetTime = timeConverter.calculateZoneOffset(coordinates.longitude);
long offsetTime = timeConverter.calculateZoneOffset(coordinates.longitude());
long offsetTimeTicks = timeConverter.millisToTicks(offsetTime);
boolean negative = offsetTime < 0;

View file

@ -3,6 +3,8 @@ package eu.m724.realweather.commands;
import java.time.Instant;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import net.md_5.bungee.api.ChatColor;
import org.bukkit.command.Command;
@ -28,25 +30,24 @@ public class LocalWeatherCommand implements CommandExecutor {
if (weather != null) {
long lastUpdate = playerWeatherCache.getLastUpdate(player);
colorize(sender, "\n&e" + weather.description);
if (weather.rainSeverity != null)
colorize(sender, "&6Rain: &b%s", weather.rainSeverity.toString());
if (weather.drizzleSeverity != null)
colorize(sender, "&6Drizzle: &b%s", weather.drizzleSeverity.toString());
if (weather.sleetSeverity != null)
colorize(sender, "&6Sleet: &b%s", weather.sleetSeverity.toString());
if (weather.snowSeverity != null)
colorize(sender, "&6Snow: &b%s", weather.snowSeverity.toString());
if (weather.thunderstormSeverity != null)
colorize(sender, "&6Thunderstorm: &b%s", weather.thunderstormSeverity.toString());
if (weather.shower)
colorize(sender, "&6Shower");
colorize(sender, "&6Cloudiness: &b%f&7%%", weather.cloudiness * 100);
colorize(sender, "&6Humidity: &b%f&7%%", weather.humidity * 100);
colorize(sender, "&6Temperature: &b%f&7°C (feels like %f°C)", weather.temperature - 273.15, weather.temperatureApparent - 273.15);
colorize(sender, "&6Wind: &b%f&7m/s (gust %fm/s)", weather.windSpeed, weather.windGust);
colorize(sender, "&6Weather for: &b%f&7, &b%f &7(lat, lon)\n", weather.coordinates().latitude(), weather.coordinates().longitude());
List<String> states = new ArrayList<>(3);
if (weather.raining()) states.add("Raining");
if (weather.thundering()) states.add("Thundering");
if (weather.thundering()) states.add("Snowing");
if (!states.isEmpty()) {
colorize(sender, "&6" + String.join(", ", states));
}
colorize(sender, "&6Temperature: &b%.1f&7°C (feels like %.1f°C)", weather.temperatureCelsius(), weather.temperatureApparentCelsius());
colorize(sender, "&6Cloud cover (cloudiness): &b%.0f&7%%", weather.cloudCoverPercentage() * 100);
colorize(sender, "&6Relative humidity: &b%.0f&7%%", weather.relativeHumidityPercentage() * 100);
colorize(sender, "&6Last update: &b%s UTC\n", formatTime(lastUpdate));
} else {

View file

@ -69,8 +69,8 @@ public class Mapper {
* @return the location in {@code world}
*/
public Location coordinatesToLocation(World world, Coordinates coordinates) {
double x = coordinates.longitude * config.scaleLongitude;
double z = -coordinates.latitude * config.scaleLatitude;
double x = coordinates.longitude() * config.scaleLongitude;
double z = -coordinates.latitude() * config.scaleLatitude;
return new Location(world, x, 0, z);
}

View file

@ -0,0 +1,34 @@
package eu.m724.realweather.thunder;
import eu.m724.realweather.DebugLogger;
import eu.m724.realweather.GlobalConstants;
import eu.m724.realweather.mapper.Mapper;
import eu.m724.wtapi.provider.thunder.TimedStrike;
import org.bukkit.Location;
import org.bukkit.scheduler.BukkitRunnable;
public class StrikeTask extends BukkitRunnable {
private final Mapper mapper = GlobalConstants.getMapper();
private final TimedStrike strike;
public StrikeTask(TimedStrike strike) {
this.strike = strike;
}
@Override
public void run() {
DebugLogger.info("strike: %f %f", 2, strike.coordinates().latitude(), strike.coordinates().longitude());
mapper.getWorlds().forEach(w -> {
Location location = mapper.coordinatesToLocation(w, strike.coordinates());
DebugLogger.info("in %s that converts to: %d %d", 2, w.getName(), location.getBlockX(), location.getBlockZ());
// World#isLoaded, Chunk#isLoaded and probably others using Chunk, load the chunk and always return true
if (w.isChunkLoaded(location.getBlockX() / 16, location.getBlockZ() / 16)) {
location.setY(w.getHighestBlockYAt(location) + 1);
w.strikeLightning(location);
DebugLogger.info("spawned lightning in %s on y level %d", 2, w.getName(), location.getBlockY());
}
});
}
}

View file

@ -1,16 +1,21 @@
package eu.m724.realweather.thunder;
import eu.m724.realweather.Configs;
import eu.m724.realweather.GlobalConstants;
import eu.m724.realweather.mapper.Mapper;
import eu.m724.wtapi.provider.exception.NoSuchProviderException;
import org.bukkit.plugin.Plugin;
import eu.m724.realweather.DebugLogger;
import eu.m724.wtapi.provider.Providers;
import eu.m724.wtapi.provider.exception.NoSuchProviderException;
import eu.m724.wtapi.provider.exception.ProviderException;
import eu.m724.wtapi.provider.thunder.ThunderProvider;
public class ThunderMaster {
private final Plugin plugin = GlobalConstants.getPlugin();
private final ThunderConfig config = Configs.thunderConfig();
private final Mapper mapper = GlobalConstants.getMapper();
private ThunderProvider provider;
/**
@ -23,11 +28,11 @@ public class ThunderMaster {
return;
provider = Providers.getThunderProvider(config.provider(), null);
provider.init();
ThunderTask thunderTask = new ThunderTask(provider);
thunderTask.init();
thunderTask.runTaskTimer(plugin, 0, config.refreshPeriod());
provider.registerStrikeConsumer(strike -> new StrikeTask(strike).runTaskLaterAsynchronously(plugin, 0));
provider.start();
DebugLogger.info("thunderprovider started", 3);
DebugLogger.info("thunder loaded", 1);
}

View file

@ -1,57 +0,0 @@
package eu.m724.realweather.thunder;
import java.util.ArrayList;
import org.bukkit.Location;
import org.bukkit.scheduler.BukkitRunnable;
import eu.m724.realweather.DebugLogger;
import eu.m724.realweather.GlobalConstants;
import eu.m724.realweather.mapper.Mapper;
import eu.m724.wtapi.provider.thunder.ThunderProvider;
import eu.m724.wtapi.provider.thunder.impl.blitzortung.TimedStrike;
class ThunderTask extends BukkitRunnable {
private final ThunderProvider thunderProvider;
private final Mapper mapper = GlobalConstants.getMapper();
private final ArrayList<TimedStrike> strikes = new ArrayList<>();
public ThunderTask(ThunderProvider thunderProvider) {
this.thunderProvider = thunderProvider;
}
public void init() {
thunderProvider.registerStrikeHandler(coords -> {
strikes.add(new TimedStrike(System.currentTimeMillis() + thunderProvider.getDelay(), coords));
});
thunderProvider.start();
DebugLogger.info("thunderprovider started", 3);
}
@Override
public void run() {
DebugLogger.info("thundertask running", 3);
thunderProvider.tick();
while (!strikes.isEmpty()) {
TimedStrike strike = strikes.removeFirst();
DebugLogger.info("strike: %f %f", 2, strike.coordinates.latitude, strike.coordinates.longitude);
mapper.getWorlds().forEach(w -> {
Location location = mapper.coordinatesToLocation(w, strike.coordinates);
DebugLogger.info("in %s that converts to: %d %d", 2, w.getName(), location.getBlockX(), location.getBlockZ());
// World#isLoaded, Chunk#isLoaded and probably others using Chunk, load the chunk and always return true
if (w.isChunkLoaded(location.getBlockX() / 16, location.getBlockZ() / 16)) {
location.setY(w.getHighestBlockYAt(location) + 1);
w.strikeLightning(location);
DebugLogger.info("spawned lightning in %s on y level %d", 2, w.getName(), location.getBlockY());
}
});
}
}
}

View file

@ -27,7 +27,7 @@ public class AsyncPlayerTimeTask extends BukkitRunnable {
Coordinates coordinates = mapper.locationToCoordinates(player.getLocation());
long time = timeConverter.calculateZoneOffset(coordinates.longitude);
long time = timeConverter.calculateZoneOffset(coordinates.longitude());
long ticks = timeConverter.millisToTicks(time);
player.setPlayerTime(ticks, true);

View file

@ -17,7 +17,7 @@ public class SyncTimeUpdateTask extends BukkitRunnable {
SyncTimeUpdateTask(TimeConverter timeConverter, boolean dynamic) {
this.timeConverter = timeConverter;
this.zoneOffset = !dynamic ? timeConverter.calculateZoneOffset(mapper.getPoint().longitude) : 0;
this.zoneOffset = !dynamic ? timeConverter.calculateZoneOffset(mapper.getPoint().longitude()) : 0;
}
@Override

View file

@ -1,15 +1,15 @@
package eu.m724.realweather.weather;
import java.time.ZoneOffset;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionException;
import eu.m724.wtapi.provider.weather.WeatherQueryResult;
import org.bukkit.Server;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerTeleportEvent;
import org.bukkit.plugin.Plugin;
import org.bukkit.scheduler.BukkitRunnable;
@ -91,7 +91,7 @@ public class DynamicWeatherRetriever extends BukkitRunnable implements Listener
if (now > nextUpdate) {
coordinates = makeCoordinates(server.getOnlinePlayers());
// calculate acceptable request rate based on weather provider quota and active players
float hourly = weatherProvider.getQuotaHourly() / (float)(weatherProvider.getBulkLimit() * coordinates.coordinatesCount());
float hourly = (float) weatherProvider.getQuota().getHourlyQuota() / coordinates.coordinatesCount();
nextUpdate = now + Math.max(60000, (long) (3600000 / hourly));
DebugLogger.info("Next update in %d", 3, nextUpdate);
} else { // immediate update for those that need it right now
@ -102,28 +102,38 @@ public class DynamicWeatherRetriever extends BukkitRunnable implements Listener
}
Coordinates[] coordinatesArray = coordinates.coordinatesPlayersMap().keySet().toArray(Coordinates[]::new);
// TODO change to Collection in wtapi? but some ordered kind
CompletableFuture<Weather[]> weathersFuture =
weatherProvider.getWeatherBulk(coordinatesArray);
if (coordinatesArray.length == 0) {
DebugLogger.info("nothing to update, dynamic retriever done", 3);
return;
}
try {
Weather[] weathers = weathersFuture.join();
for (int i=0; i<weathers.length; i++) {
Weather weather = weathers[i];
for (Player player : coordinates.coordinatesPlayersMap().get(coordinatesArray[i])) {
playerWeatherCache.put(player, weather, now);
CompletableFuture<WeatherQueryResult> weathersFuture =
weatherProvider.getWeather(coordinatesArray);
AsyncWeatherUpdateEvent event =
new AsyncWeatherUpdateEvent(player, weather);
WeatherQueryResult result = weathersFuture.join();
server.getPluginManager().callEvent(event);
}
if (result.exception() != null) {
DebugLogger.info("An error occurred trying to retrieve weather data", 0);
if (DebugLogger.getDebugLevel() > 0) {
result.exception().printStackTrace();
}
return;
}
Weather[] weathers = result.weathers();
for (int i=0; i<weathers.length; i++) {
Weather weather = weathers[i];
for (Player player : coordinates.coordinatesPlayersMap().get(coordinatesArray[i])) {
playerWeatherCache.put(player, weather, weather.timestamp().toEpochSecond(ZoneOffset.UTC));
AsyncWeatherUpdateEvent event =
new AsyncWeatherUpdateEvent(player, weather);
server.getPluginManager().callEvent(event);
}
} catch (CompletionException e) { // TODO handle finer exceptions
DebugLogger.info("An error occurred trying to retrieve weather data", 0);
if (DebugLogger.getDebugLevel() > 0)
e.printStackTrace();
}
DebugLogger.info("dynamic retriever done", 3);

View file

@ -7,12 +7,10 @@ import eu.m724.realweather.mapper.Mapper;
import eu.m724.wtapi.object.Coordinates;
import eu.m724.wtapi.object.Weather;
import eu.m724.wtapi.provider.weather.WeatherProvider;
import eu.m724.wtapi.provider.weather.WeatherQueryResult;
import org.bukkit.plugin.Plugin;
import org.bukkit.scheduler.BukkitRunnable;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionException;
public class StaticWeatherRetriever extends BukkitRunnable {
private final Plugin plugin = GlobalConstants.getPlugin();
private final Mapper mapper = GlobalConstants.getMapper();
@ -26,22 +24,25 @@ public class StaticWeatherRetriever extends BukkitRunnable {
@Override
public void run() {
Coordinates point = mapper.getPoint();
CompletableFuture<Weather> weatherFuture = weatherProvider.getWeather(point);
try {
Weather weather = weatherFuture.join();
WeatherQueryResult result = weatherProvider.getWeather(point).join();
AsyncWeatherUpdateEvent event =
new AsyncWeatherUpdateEvent(null, weather);
plugin.getServer().getPluginManager().callEvent(event);
} catch (CompletionException e) { // TODO handle finer exceptions
if (result.exception() != null) {
DebugLogger.info("An error occurred trying to retrieve weather data", 0);
if (DebugLogger.getDebugLevel() > 0)
e.printStackTrace();
result.exception().printStackTrace();
return;
}
Weather weather = result.weathers()[0];
AsyncWeatherUpdateEvent event =
new AsyncWeatherUpdateEvent(null, weather);
plugin.getServer().getPluginManager().callEvent(event);
DebugLogger.info("static weather retriever is done", 3);
}
}

View file

@ -23,7 +23,7 @@ public class WeatherChanger implements Listener {
if (player != null) { // dynamic mode
DebugLogger.info("Changing weather for player %s", 2, player.getName());
if (weather.isThundering() || weather.isSnowing() || weather.isRaining()) {
if (weather.thundering() || weather.snowing() || weather.raining()) {
player.setPlayerWeather(WeatherType.DOWNFALL);
} else {
player.setPlayerWeather(WeatherType.CLEAR);
@ -32,11 +32,11 @@ public class WeatherChanger implements Listener {
DebugLogger.info("Changing weather static", 3);
mapper.getWorlds().forEach(w -> {
DebugLogger.info("Changing weather static in world %s", 2, w.getName());
if (weather.isThundering()) {
if (weather.thundering()) {
w.setClearWeatherDuration(0);
w.setWeatherDuration(120000);
w.setThunderDuration(120000);
} else if (weather.isRaining() || weather.isSnowing()) {
} else if (weather.raining() || weather.snowing()) {
w.setClearWeatherDuration(0);
w.setWeatherDuration(120000);
w.setThunderDuration(0);

View file

@ -1,6 +1,7 @@
package eu.m724.realweather.weather;
import eu.m724.realweather.Configs;
import eu.m724.wtapi.provider.exception.NoSuchProviderException;
import org.bukkit.GameRule;
import org.bukkit.plugin.Plugin;
@ -8,7 +9,6 @@ import eu.m724.realweather.DebugLogger;
import eu.m724.realweather.GlobalConstants;
import eu.m724.realweather.mapper.Mapper;
import eu.m724.wtapi.provider.Providers;
import eu.m724.wtapi.provider.exception.NoSuchProviderException;
import eu.m724.wtapi.provider.exception.ProviderException;
import eu.m724.wtapi.provider.weather.WeatherProvider;
@ -32,7 +32,7 @@ public class WeatherMaster {
if (config.dynamic()) {
DynamicWeatherRetriever retriever = new DynamicWeatherRetriever(provider);
retriever.runTaskTimerAsynchronously(plugin,0, 1000);
retriever.runTaskTimerAsynchronously(plugin,0, 200);
plugin.getServer().getPluginManager().registerEvents(retriever, plugin);
} else {
StaticWeatherRetriever retriever = new StaticWeatherRetriever(provider);

View file

@ -9,10 +9,9 @@
enabled: false
# Currently only OpenWeatherMap
provider: openweathermap
# put your OpenWeatherMap api key
apiKey: REPLACE ME
# Currently only OpenMeteo
provider: openmeteo
# No API key needed
# How this plugin affects your world:
# - static (false): weather is the same across the world

View file

@ -9,7 +9,7 @@ load: STARTUP
main: eu.m724.realweather.RealWeatherPlugin
libraries:
- org.java-websocket:Java-WebSocket:1.5.7
- org.java-websocket:Java-WebSocket:1.6.0
commands:
rwadmin: