From ce1d46971e18b25b1498488ae465b60d0acd558c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A4seToatz?= Date: Mon, 15 Jul 2024 22:58:11 +0200 Subject: [PATCH] Added configs --- .../kasetoatz/weathervote/WeatherVote.java | 85 +------------------ .../weathervote/commands/Commands.java | 26 ++++++ .../kasetoatz/weathervote/config/Config.java | 80 +++++++++++++++++ .../weathervote/votes/VoteResponse.java | 30 +++++++ .../kasetoatz/weathervote/votes/Votes.java | 69 +++++++++++++++ .../weathervote/weather/Weather.java | 79 +++++++++++++++++ 6 files changed, 288 insertions(+), 81 deletions(-) create mode 100644 src/main/java/com/kasetoatz/weathervote/commands/Commands.java create mode 100644 src/main/java/com/kasetoatz/weathervote/config/Config.java create mode 100644 src/main/java/com/kasetoatz/weathervote/votes/VoteResponse.java create mode 100644 src/main/java/com/kasetoatz/weathervote/votes/Votes.java create mode 100644 src/main/java/com/kasetoatz/weathervote/weather/Weather.java diff --git a/src/main/java/com/kasetoatz/weathervote/WeatherVote.java b/src/main/java/com/kasetoatz/weathervote/WeatherVote.java index e61032d..885e1c4 100644 --- a/src/main/java/com/kasetoatz/weathervote/WeatherVote.java +++ b/src/main/java/com/kasetoatz/weathervote/WeatherVote.java @@ -1,90 +1,13 @@ package com.kasetoatz.weathervote; -import com.kasetoatz.weathervote.enums.WeatherType; +import com.kasetoatz.weathervote.commands.Commands; +import com.kasetoatz.weathervote.config.Config; import net.fabricmc.api.ModInitializer; -import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; -import net.minecraft.server.command.CommandManager; -import net.minecraft.server.command.ServerCommandSource; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.text.Text; - -import java.util.HashSet; -import java.util.logging.Logger; public class WeatherVote implements ModInitializer { - private final HashSet clearVotes = new HashSet<>(); - private final HashSet rainVotes = new HashSet<>(); - private final HashSet thunderVotes = new HashSet<>(); - private static final Logger LOGGER = Logger.getLogger("WeatherVote"); - @Override public void onInitialize() { - CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> dispatcher.register(CommandManager.literal("weathervote") - .then(CommandManager.literal("clear").executes(context -> { - this.update(context.getSource(), WeatherType.CLEAR); - return 1; - })) - .then(CommandManager.literal("rain").executes(context -> { - this.update(context.getSource(), WeatherType.RAIN); - return 1; - })) - .then(CommandManager.literal("thunder").executes(context -> { - this.update(context.getSource(), WeatherType.THUNDER); - return 1; - })) - )); - } - - private void update(ServerCommandSource source, WeatherType weather) - { - clearVotes.remove(source.getPlayer()); - rainVotes.remove(source.getPlayer()); - thunderVotes.remove(source.getPlayer()); - switch (weather) - { - case CLEAR: - clearVotes.add(source.getPlayer()); - if (clearVotes.size() >= source.getServer().getCurrentPlayerCount() / 2) - { - source.getServer().sendMessage(Text.literal("Weather vote complete. Changing weather to clear.")); - source.getWorld().setWeather(6000, 0, false, false); - this.resetVotes(); - return; - } - source.sendFeedback(() -> Text.literal("You voted for clear weather. (" + clearVotes.size() + " / " + Math.round((float)source.getServer().getCurrentPlayerCount() / 2) + " required votes."), false); - LOGGER.info(source.getName() + " voted for clear weather."); - break; - case RAIN: - rainVotes.add(source.getPlayer()); - if (rainVotes.size() >= source.getServer().getCurrentPlayerCount() / 2) - { - source.getServer().sendMessage(Text.literal("Weather vote complete. Changing weather to rain.")); - source.getWorld().setWeather(0, 6000, true, false); - this.resetVotes(); - return; - } - source.sendFeedback(() -> Text.literal("You voted for rain. (" + rainVotes.size() + " / " + Math.round((float)source.getServer().getCurrentPlayerCount() / 2) + " required votes."), false); - LOGGER.info(source.getName() + " voted for rain."); - break; - case THUNDER: - thunderVotes.add(source.getPlayer()); - if (thunderVotes.size() >= source.getServer().getCurrentPlayerCount() / 2) - { - source.getServer().sendMessage(Text.literal("Weather vote complete. Changing weather to thunder.")); - source.getWorld().setWeather(0, 6000, true, true); - this.resetVotes(); - return; - } - source.sendFeedback(() -> Text.literal("You voted for thunder. (" + thunderVotes.size() + " / " + Math.round((float)source.getServer().getCurrentPlayerCount() / 2) + " required votes."), false); - LOGGER.info(source.getName() + " voted for thunder."); - break; - } - } - - private void resetVotes() - { - clearVotes.clear(); - rainVotes.clear(); - thunderVotes.clear(); + Config.load(); + Commands.registerCommands(); } } diff --git a/src/main/java/com/kasetoatz/weathervote/commands/Commands.java b/src/main/java/com/kasetoatz/weathervote/commands/Commands.java new file mode 100644 index 0000000..598f69c --- /dev/null +++ b/src/main/java/com/kasetoatz/weathervote/commands/Commands.java @@ -0,0 +1,26 @@ +package com.kasetoatz.weathervote.commands; + +import com.kasetoatz.weathervote.votes.Votes; +import com.kasetoatz.weathervote.weather.Weather; +import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; +import net.minecraft.server.command.CommandManager; + +public class Commands { + public static void registerCommands() + { + CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> dispatcher.register(CommandManager.literal("weathervote") + .then(CommandManager.literal("clear").executes(context -> { + Weather.update(Votes.voteClear(context.getSource())); + return 1; + })) + .then(CommandManager.literal("rain").executes(context -> { + Weather.update(Votes.voteRain(context.getSource())); + return 1; + })) + .then(CommandManager.literal("thunder").executes(context -> { + Weather.update(Votes.voteThunder(context.getSource())); + return 1; + })) + )); + } +} diff --git a/src/main/java/com/kasetoatz/weathervote/config/Config.java b/src/main/java/com/kasetoatz/weathervote/config/Config.java new file mode 100644 index 0000000..dcf9630 --- /dev/null +++ b/src/main/java/com/kasetoatz/weathervote/config/Config.java @@ -0,0 +1,80 @@ +package com.kasetoatz.weathervote.config; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonObject; +import net.minecraft.client.MinecraftClient; +import net.minecraft.util.crash.CrashException; +import net.minecraft.util.crash.CrashReport; + +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; + +public class Config { + public static boolean enabled = true; + public static int votingPercentage = 50; + public static String completedVoteMessage = "§2[WeatherVote]§r Voting passed. Changing weather to $weather"; + public static String voteMessage = "§2[WeatherVote]§r $name voted for $weather. ($current/$required) required votes."; + public static String disabledMessage = "§cVoting is currently disabled."; + + private static final File config = new File(MinecraftClient.getInstance().runDirectory, "config/weathervote.json"); + private static final Gson gson = new GsonBuilder().setPrettyPrinting().create(); + + public static void load() + { + if (!config.exists()) + { + save(); + return; + } + try (FileReader reader = new FileReader(config)) + { + JsonObject json = gson.fromJson(reader, JsonObject.class); + if (json.has("enabled")) + { + enabled = json.get("enabled").getAsBoolean(); + } + if (json.has("votingPercentage")) + { + votingPercentage = json.get("votingPercentage").getAsInt(); + } + if (json.has("completedVoteMessage")) + { + completedVoteMessage = json.get("completedVoteMessage").getAsString(); + } + if (json.has("voteMessage")) + { + voteMessage = json.get("voteMessage").getAsString(); + } + if (json.has("disabledMessage")) + { + disabledMessage = json.get("disabledMessage").getAsString(); + } + save(); + } + catch (IOException exc) + { + throw new CrashException(CrashReport.create(exc, "Loading config file.")); + } + } + + public static void save() + { + JsonObject json = new JsonObject(); + json.addProperty("enabled", enabled); + json.addProperty("votingPercentage", votingPercentage); + json.addProperty("completedVoteMessage", completedVoteMessage); + json.addProperty("voteMessage", voteMessage); + json.addProperty("disabledMessage", disabledMessage); + try (FileWriter writer = new FileWriter(config)) + { + gson.toJson(json, writer); + } + catch (IOException exc) + { + throw new CrashException(CrashReport.create(exc, "Saving config file.")); + } + } +} diff --git a/src/main/java/com/kasetoatz/weathervote/votes/VoteResponse.java b/src/main/java/com/kasetoatz/weathervote/votes/VoteResponse.java new file mode 100644 index 0000000..eb99374 --- /dev/null +++ b/src/main/java/com/kasetoatz/weathervote/votes/VoteResponse.java @@ -0,0 +1,30 @@ +package com.kasetoatz.weathervote.votes; + +import com.kasetoatz.weathervote.WeatherVote; +import com.kasetoatz.weathervote.enums.WeatherType; +import net.minecraft.server.command.ServerCommandSource; + +public class VoteResponse { + private final ServerCommandSource source; + private final WeatherType weather; + private final boolean votePassed; + + public VoteResponse(ServerCommandSource source, WeatherType weather, boolean votePassed) + { + this.source = source; + this.weather = weather; + this.votePassed = votePassed; + } + + public ServerCommandSource getSource() { + return source; + } + + public WeatherType getWeather() { + return weather; + } + + public boolean hasVotePassed() { + return votePassed; + } +} diff --git a/src/main/java/com/kasetoatz/weathervote/votes/Votes.java b/src/main/java/com/kasetoatz/weathervote/votes/Votes.java new file mode 100644 index 0000000..a2888a5 --- /dev/null +++ b/src/main/java/com/kasetoatz/weathervote/votes/Votes.java @@ -0,0 +1,69 @@ +package com.kasetoatz.weathervote.votes; + +import com.kasetoatz.weathervote.config.Config; +import com.kasetoatz.weathervote.enums.WeatherType; +import net.minecraft.server.command.ServerCommandSource; +import net.minecraft.server.network.ServerPlayerEntity; + +import java.util.HashSet; + +public class Votes { + private static final HashSet clearVotes = new HashSet<>(); + private static final HashSet rainVotes = new HashSet<>(); + private static final HashSet thunderVotes = new HashSet<>(); + + private static void removeVote(ServerPlayerEntity player) + { + clearVotes.remove(player); + rainVotes.remove(player); + thunderVotes.remove(player); + } + + public static VoteResponse voteClear(ServerCommandSource source) + { + removeVote(source.getPlayer()); + clearVotes.add(source.getPlayer()); + return new VoteResponse(source, WeatherType.CLEAR, clearVotes.size() >= requiredVotes(source)); + } + + public static int clearSize() + { + return clearVotes.size(); + } + + public static VoteResponse voteRain(ServerCommandSource source) + { + removeVote(source.getPlayer()); + rainVotes.add(source.getPlayer()); + return new VoteResponse(source, WeatherType.RAIN, rainVotes.size() >= requiredVotes(source)); + } + + public static int rainSize() + { + return rainVotes.size(); + } + + public static VoteResponse voteThunder(ServerCommandSource source) + { + removeVote(source.getPlayer()); + thunderVotes.add(source.getPlayer()); + return new VoteResponse(source, WeatherType.THUNDER, thunderVotes.size() >= requiredVotes(source)); + } + + public static int thunderSize() + { + return thunderVotes.size(); + } + + public static void removeVotes() + { + clearVotes.clear(); + rainVotes.clear(); + thunderVotes.clear(); + } + + public static int requiredVotes(ServerCommandSource source) + { + return Math.round((float)source.getServer().getCurrentPlayerCount() / (100.f / Config.votingPercentage)); + } +} diff --git a/src/main/java/com/kasetoatz/weathervote/weather/Weather.java b/src/main/java/com/kasetoatz/weathervote/weather/Weather.java new file mode 100644 index 0000000..856ece5 --- /dev/null +++ b/src/main/java/com/kasetoatz/weathervote/weather/Weather.java @@ -0,0 +1,79 @@ +package com.kasetoatz.weathervote.weather; + +import com.kasetoatz.weathervote.config.Config; +import com.kasetoatz.weathervote.enums.WeatherType; +import com.kasetoatz.weathervote.votes.VoteResponse; +import com.kasetoatz.weathervote.votes.Votes; +import net.minecraft.server.command.ServerCommandSource; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.text.Text; + +public class Weather { + public static void update(VoteResponse vote) + { + if (!Config.enabled) + { + vote.getSource().sendFeedback(() -> Text.of(Config.disabledMessage), false); + } + else if (vote.hasVotePassed()) + { + Votes.removeVotes(); + setWeather(vote.getSource(), vote.getWeather()); + } + else + { + incompleteVote(vote.getSource(), vote.getWeather()); + } + } + + private static void setWeather(ServerCommandSource source, WeatherType weather) + { + switch (weather) + { + case CLEAR: + broadcastVote(source, "clear", -1); + source.getWorld().setWeather(6000, 0, false, false); + break; + case RAIN: + broadcastVote(source, "rain", -1); + source.getWorld().setWeather(0, 6000, true, false); + break; + case THUNDER: + broadcastVote(source, "thunder", -1); + source.getWorld().setWeather(0, 6000, true, true); + break; + } + } + + private static void incompleteVote(ServerCommandSource source, WeatherType weather) + { + switch (weather) + { + case CLEAR: + broadcastVote(source, "clear weather", Votes.clearSize()); + break; + case RAIN: + broadcastVote(source, "rain", Votes.rainSize()); + break; + case THUNDER: + broadcastVote(source, "thunder", Votes.thunderSize()); + break; + } + } + + private static void broadcastVote(ServerCommandSource source, String weather, int currentVotes) + { + if (source.getPlayer() != null) + { + for (ServerPlayerEntity player : source.getServer().getPlayerManager().getPlayerList()) + { + String message = (currentVotes == -1) ? Config.completedVoteMessage : Config.voteMessage; + message = message.replace("$name", source.getPlayer().getName().getString()); + message = message.replace("$weather", weather); + message = message.replace("$current", String.valueOf(currentVotes)); + message = message.replace("$required", String.valueOf(Votes.requiredVotes(source))); + player.sendMessage(Text.of(message)); + } + } + } +}