add support for real-world and custom sunrise/sunset times (closes #2)

This commit is contained in:
Jack
2024-06-27 18:13:37 -04:00
parent c605b60903
commit 4c4f861645
5 changed files with 221 additions and 20 deletions

View File

@@ -1,10 +1,13 @@
package io.github.jack1424.realtimeweather;
import io.github.jack1424.realtimeweather.requests.*;
import org.bstats.bukkit.Metrics;
import org.bstats.charts.SimplePie;
import org.bukkit.World;
import org.bukkit.plugin.java.JavaPlugin;
import javax.naming.ConfigurationException;
import java.time.LocalTime;
import java.util.Calendar;
import java.util.logging.Logger;
@@ -60,6 +63,12 @@ public final class RealTimeWeather extends JavaPlugin {
debug("Enabling time zone sync...");
debug("Syncing time with " + config.getTimeZone().getDisplayName());
if (config.getSunriseSunset().equals("real"))
debug("Syncing sunrise/sunset with " + config.getSunriseSunsetLatitude() + " " + config.getSunriseSunsetLongitude());
if (config.getSunriseSunset().equals("custom"))
debug("Using custom sunrise/sunset times. Sunrise: " + config.getSunriseCustomTime() + ", Sunset: " + config.getSunsetCustomTime());
for (World world : getServer().getWorlds())
if (world.getEnvironment().equals(World.Environment.NORMAL))
world.setGameRuleValue("doDaylightCycle", "false");
@@ -69,14 +78,35 @@ public final class RealTimeWeather extends JavaPlugin {
Calendar cal = Calendar.getInstance(config.getTimeZone());
for (World world : getServer().getWorlds())
if (world.getEnvironment().equals(World.Environment.NORMAL))
world.setTime((1000 * cal.get(Calendar.HOUR_OF_DAY)) + (16 * (cal.get(Calendar.MINUTE) + 1)) - 6000);
if (config.getSunriseSunset().equals("real")) {
SunriseSunsetRequestObject sunriseSunset;
try {
sunriseSunset = new SunriseSunsetRequestObject(config.getTimeZone(), config.getWeatherLatitude(), config.getWeatherLongitude());
world.setTime(calculateWorldTime(cal, sunriseSunset.getSunriseTime(), sunriseSunset.getSunsetTime()));
} catch (Exception e) {
logger.severe(e.getMessage());
logger.severe("Error getting sunrise/sunset times, using default sunrise/sunset times");
try {
config.setSunriseSunset("default");
} catch (ConfigurationException ex) {
throw new RuntimeException(ex);
}
world.setTime(calculateWorldTime(cal, "5:02:27 AM", "6:36:36 PM"));
return;
}
} else if (config.getSunriseSunset().equals("custom"))
world.setTime(calculateWorldTime(cal, config.getSunriseCustomTime(), config.getSunsetCustomTime()));
else
world.setTime(calculateWorldTime(cal, "5:02:27 AM", "6:36:36 PM"));
}
}, 0L, config.getTimeSyncInterval());
}
private void setupWeather() {
try {
new RequestObject(config.getAPIKey(), config.getLat(), config.getLon());
new WeatherRequestObject(config.getAPIKey(), config.getWeatherLatitude(), config.getWeatherLongitude());
} catch (Exception e) {
logger.severe(e.getMessage());
logger.severe("Disabling weather sync...");
@@ -95,7 +125,7 @@ public final class RealTimeWeather extends JavaPlugin {
debug("Syncing weather...");
try {
RequestObject request = new RequestObject(config.getAPIKey(), config.getLat(), config.getLon());
WeatherRequestObject request = new WeatherRequestObject(config.getAPIKey(), config.getWeatherLatitude(), config.getWeatherLongitude());
debug("Setting weather (Rain: " + request.isRaining() + ", Thunder: " + request.isThundering() + ")...");
for (World world : getServer().getWorlds())
@@ -112,6 +142,31 @@ public final class RealTimeWeather extends JavaPlugin {
debug("Weather sync enabled");
}
private long calculateWorldTime(Calendar cal, String sunriseTime, String sunsetTime) {
String[] sunriseTimeSplit = sunriseTime.split(":");
String[] sunsetTimeSplit = sunsetTime.split(":");
long sunriseMinutes = Long.parseLong(sunriseTimeSplit[0]) * 60 + Long.parseLong(sunriseTimeSplit[1]) + Long.parseLong(sunriseTimeSplit[2].substring(0, 2)) / 60;
long sunsetMinutes = Long.parseLong(sunsetTimeSplit[0]) * 60 + Long.parseLong(sunsetTimeSplit[1]) + Long.parseLong(sunsetTimeSplit[2].substring(0, 2)) / 60;
if (sunriseTimeSplit[2].substring(3).equalsIgnoreCase("PM"))
sunriseMinutes += 720;
if (sunsetTimeSplit[2].substring(3).equalsIgnoreCase("PM"))
sunsetMinutes += 720;
LocalTime currentTime = LocalTime.of(cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE));
int currentMinutes = currentTime.getHour() * 60 + currentTime.getMinute();
if (currentMinutes >= sunriseMinutes && currentMinutes < sunsetMinutes) {
return ((currentMinutes - sunriseMinutes) / (sunsetMinutes - sunriseMinutes) * 13569) + 23041;
} else {
if (currentMinutes < sunriseMinutes) {
currentMinutes += 1440;
}
return ((currentMinutes - sunsetMinutes) / (1440 - sunsetMinutes + sunriseMinutes) * 13569) + 12610;
}
}
public Configurator getConfigurator() {
return config;
}