diff --git a/src/main/java/com/bitnix/dirtsleep/DirtSleepPlugin.java b/src/main/java/com/bitnix/dirtsleep/DirtSleepPlugin.java index 19ffdda..4e1139c 100644 --- a/src/main/java/com/bitnix/dirtsleep/DirtSleepPlugin.java +++ b/src/main/java/com/bitnix/dirtsleep/DirtSleepPlugin.java @@ -1,5 +1,8 @@ package com.bitnix.dirtsleep; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.event.ClickEvent; +import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.GameMode; @@ -9,14 +12,14 @@ import org.bukkit.command.CommandSender; import org.bukkit.command.TabExecutor; import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.scheduler.BukkitTask; import java.util.*; import java.util.stream.Collectors; public final class DirtSleepPlugin extends JavaPlugin implements TabExecutor { - private final Map> dayVotes = new HashMap<>(); - private final Map> nightVotes = new HashMap<>(); + private final Map activeVotes = new HashMap<>(); @Override public void onEnable() { @@ -34,8 +37,12 @@ public final class DirtSleepPlugin extends JavaPlugin implements TabExecutor { @Override public void onDisable() { - dayVotes.clear(); - nightVotes.clear(); + for (ActiveVote vote : activeVotes.values()) { + if (vote.timeoutTask != null) { + vote.timeoutTask.cancel(); + } + } + activeVotes.clear(); } @Override @@ -46,7 +53,12 @@ public final class DirtSleepPlugin extends JavaPlugin implements TabExecutor { return true; } - handleVoteDay(player); + if (args.length == 1 && (args[0].equalsIgnoreCase("yes") || args[0].equalsIgnoreCase("no"))) { + handleResponseVote(player, VoteType.DAY, args[0].equalsIgnoreCase("yes")); + return true; + } + + startVote(player, VoteType.DAY); return true; } @@ -56,7 +68,12 @@ public final class DirtSleepPlugin extends JavaPlugin implements TabExecutor { return true; } - handleVoteNight(player); + if (args.length == 1 && (args[0].equalsIgnoreCase("yes") || args[0].equalsIgnoreCase("no"))) { + handleResponseVote(player, VoteType.NIGHT, args[0].equalsIgnoreCase("yes")); + return true; + } + + startVote(player, VoteType.NIGHT); return true; } @@ -68,8 +85,14 @@ public final class DirtSleepPlugin extends JavaPlugin implements TabExecutor { } reloadConfig(); - dayVotes.clear(); - nightVotes.clear(); + + for (ActiveVote vote : activeVotes.values()) { + if (vote.timeoutTask != null) { + vote.timeoutTask.cancel(); + } + } + activeVotes.clear(); + sender.sendMessage(message("messages.reloaded")); return true; } @@ -81,164 +104,184 @@ public final class DirtSleepPlugin extends JavaPlugin implements TabExecutor { return false; } - private void handleVoteDay(Player player) { - if (!getConfig().getBoolean("vote-day.enabled", true)) { - player.sendMessage(message("messages.disabled")); + private void startVote(Player starter, VoteType type) { + if (!getConfig().getBoolean("vote-" + type.configName + ".enabled", true)) { + starter.sendMessage(message(type == VoteType.DAY ? "messages.disabled" : "messages.night-disabled")); return; } - World world = player.getWorld(); + World world = starter.getWorld(); if (!isWorldEnabled(world)) { - player.sendMessage(message("messages.world-disabled")); + starter.sendMessage(message("messages.world-disabled")); return; } - if (!canVoteDayInWorld(world)) { - player.sendMessage(message("messages.not-night")); - clearDayVotes(world); + if (!canStartVote(world, type)) { + starter.sendMessage(message(type == VoteType.DAY ? "messages.not-night" : "messages.not-day")); return; } String worldKey = world.getName().toLowerCase(Locale.ROOT); - Set votes = dayVotes.computeIfAbsent(worldKey, k -> new HashSet<>()); - - if (votes.contains(player.getUniqueId())) { - player.sendMessage(message("messages.already-voted")); + if (activeVotes.containsKey(worldKey)) { + starter.sendMessage(message("messages.vote-already-running")); return; } - votes.add(player.getUniqueId()); + int requiredYesVotes = getRequiredVotes(world, type); + long durationSeconds = Math.max(5, getConfig().getLong("vote-session.duration-seconds", 30)); - int currentVotes = countValidVotes(world, votes); - int requiredVotes = getRequiredVotes(world); + ActiveVote activeVote = new ActiveVote(type, requiredYesVotes); + activeVote.yesVotes.add(starter.getUniqueId()); - String voteMessage = message("messages.vote-added") - .replace("%player%", player.getName()) - .replace("%votes%", String.valueOf(currentVotes)) - .replace("%required%", String.valueOf(requiredVotes)) - .replace("%remaining%", String.valueOf(Math.max(0, requiredVotes - currentVotes))); + BukkitTask task = Bukkit.getScheduler().runTaskLater(this, () -> timeoutVote(world), durationSeconds * 20L); + activeVote.timeoutTask = task; - broadcast(world, voteMessage); + activeVotes.put(worldKey, activeVote); - if (currentVotes >= requiredVotes) { - makeDay(world); - clearDayVotes(world); - clearNightVotes(world); - broadcast(world, message("messages.vote-passed")); + String startedMessage = message(type == VoteType.DAY ? "messages.vote-started-day" : "messages.vote-started-night") + .replace("%player%", starter.getName()) + .replace("%yes%", String.valueOf(activeVote.yesVotes.size())) + .replace("%no%", String.valueOf(activeVote.noVotes.size())) + .replace("%required%", String.valueOf(requiredYesVotes)); + + String clickPrompt = message("messages.click-prompt"); + + for (Player player : world.getPlayers()) { + player.sendMessage(startedMessage); + player.sendMessage(clickPrompt); + sendClickableVoteMessage(player, type); } + + checkVoteResult(world); } - private void handleVoteNight(Player player) { - if (!getConfig().getBoolean("vote-night.enabled", true)) { - player.sendMessage(message("messages.night-disabled")); - return; - } - + private void handleResponseVote(Player player, VoteType commandType, boolean yes) { World world = player.getWorld(); - - if (!isWorldEnabled(world)) { - player.sendMessage(message("messages.world-disabled")); - return; - } - - if (!canVoteNightInWorld(world)) { - player.sendMessage(message("messages.not-day")); - clearNightVotes(world); - return; - } - String worldKey = world.getName().toLowerCase(Locale.ROOT); - Set votes = nightVotes.computeIfAbsent(worldKey, k -> new HashSet<>()); + ActiveVote activeVote = activeVotes.get(worldKey); - if (votes.contains(player.getUniqueId())) { - player.sendMessage(message("messages.night-already-voted")); + if (activeVote == null) { + player.sendMessage(message("messages.no-active-vote")); return; } - votes.add(player.getUniqueId()); + if (activeVote.type != commandType) { + player.sendMessage(message("messages.wrong-vote-command")); + return; + } - int currentVotes = countValidVotes(world, votes); - int requiredVotes = getRequiredVotes(world); + activeVote.yesVotes.remove(player.getUniqueId()); + activeVote.noVotes.remove(player.getUniqueId()); - String voteMessage = message("messages.night-vote-added") - .replace("%player%", player.getName()) - .replace("%votes%", String.valueOf(currentVotes)) - .replace("%required%", String.valueOf(requiredVotes)) - .replace("%remaining%", String.valueOf(Math.max(0, requiredVotes - currentVotes))); + if (yes) { + activeVote.yesVotes.add(player.getUniqueId()); + player.sendMessage(message("messages.vote-yes-confirm")); + } else { + activeVote.noVotes.add(player.getUniqueId()); + player.sendMessage(message("messages.vote-no-confirm")); + } - broadcast(world, voteMessage); + broadcastVoteStatus(world, activeVote); + checkVoteResult(world); + } - if (currentVotes >= requiredVotes) { - makeNight(world); - clearNightVotes(world); - clearDayVotes(world); - broadcast(world, message("messages.night-vote-passed")); + private void broadcastVoteStatus(World world, ActiveVote activeVote) { + cleanupInvalidVotes(world, activeVote); + + String path = activeVote.type == VoteType.DAY ? "messages.vote-progress-day" : "messages.vote-progress-night"; + String msg = message(path) + .replace("%yes%", String.valueOf(activeVote.yesVotes.size())) + .replace("%no%", String.valueOf(activeVote.noVotes.size())) + .replace("%required%", String.valueOf(activeVote.requiredYesVotes)); + + broadcast(world, msg); + } + + private void checkVoteResult(World world) { + String worldKey = world.getName().toLowerCase(Locale.ROOT); + ActiveVote activeVote = activeVotes.get(worldKey); + if (activeVote == null) { + return; + } + + cleanupInvalidVotes(world, activeVote); + + int yesVotes = activeVote.yesVotes.size(); + int noVotes = activeVote.noVotes.size(); + int requiredYes = activeVote.requiredYesVotes; + int eligible = getEligiblePlayers(world, activeVote.type); + + if (yesVotes >= requiredYes) { + if (activeVote.type == VoteType.DAY) { + makeDay(world); + broadcast(world, message("messages.vote-passed")); + } else { + makeNight(world); + broadcast(world, message("messages.night-vote-passed")); + } + + endVote(world); + return; + } + + int remainingPossibleYes = Math.max(0, eligible - noVotes); + if (remainingPossibleYes < requiredYes) { + broadcast(world, message("messages.vote-failed")); + endVote(world); } } - private void makeDay(World world) { - world.setTime(1000); - world.setStorm(false); - world.setThundering(false); + private void timeoutVote(World world) { + String worldKey = world.getName().toLowerCase(Locale.ROOT); + ActiveVote activeVote = activeVotes.get(worldKey); + if (activeVote == null) { + return; + } + + cleanupInvalidVotes(world, activeVote); + + if (activeVote.type == VoteType.DAY) { + broadcast(world, message("messages.vote-expired")); + } else { + broadcast(world, message("messages.night-vote-expired")); + } + + endVote(world); } - private void makeNight(World world) { - world.setTime(13000); + private void endVote(World world) { + String worldKey = world.getName().toLowerCase(Locale.ROOT); + ActiveVote activeVote = activeVotes.remove(worldKey); + if (activeVote != null && activeVote.timeoutTask != null) { + activeVote.timeoutTask.cancel(); + } } - private void clearDayVotes(World world) { - dayVotes.remove(world.getName().toLowerCase(Locale.ROOT)); + private void cleanupInvalidVotes(World world, ActiveVote activeVote) { + activeVote.yesVotes.removeIf(uuid -> !isEligibleVoter(world, uuid, activeVote.type)); + activeVote.noVotes.removeIf(uuid -> !isEligibleVoter(world, uuid, activeVote.type)); } - private void clearNightVotes(World world) { - nightVotes.remove(world.getName().toLowerCase(Locale.ROOT)); - } - - private int countValidVotes(World world, Set votes) { - votes.removeIf(uuid -> { - Player p = Bukkit.getPlayer(uuid); - return p == null || !p.isOnline() || !p.getWorld().equals(world); - }); - return votes.size(); - } - - private boolean isWorldEnabled(World world) { - List worlds = getConfig().getStringList("vote-day.worlds"); - return worlds.isEmpty() || worlds.contains(world.getName()); - } - - private boolean canVoteDayInWorld(World world) { - if (world.getEnvironment() != World.Environment.NORMAL) { + private boolean isEligibleVoter(World world, UUID uuid, VoteType type) { + Player player = Bukkit.getPlayer(uuid); + if (player == null || !player.isOnline()) { + return false; + } + if (!player.getWorld().equals(world)) { + return false; + } + if (player.getGameMode() == GameMode.SPECTATOR) { return false; } - if (!getConfig().getBoolean("vote-day.only-during-night", true)) { - return true; - } - - long time = world.getTime(); - int nightStartsAt = getConfig().getInt("vote-day.night-starts-at", 12542); - return time >= nightStartsAt && time < 24000; + boolean excludeBypass = getConfig().getBoolean("vote-" + type.configName + ".exclude-bypass", true); + return !excludeBypass || !player.hasPermission("dirtsleep.bypass"); } - private boolean canVoteNightInWorld(World world) { - if (world.getEnvironment() != World.Environment.NORMAL) { - return false; - } - - if (!getConfig().getBoolean("vote-night.only-during-day", true)) { - return true; - } - - long time = world.getTime(); - int dayEndsAt = getConfig().getInt("vote-night.day-ends-at", 12542); - return time >= 0 && time < dayEndsAt; - } - - private int getRequiredVotes(World world) { + private int getEligiblePlayers(World world, VoteType type) { int eligible = 0; - boolean excludeBypass = getConfig().getBoolean("vote-day.exclude-bypass", true); + boolean excludeBypass = getConfig().getBoolean("vote-" + type.configName + ".exclude-bypass", true); for (Player player : world.getPlayers()) { if (player.getGameMode() == GameMode.SPECTATOR) { @@ -252,11 +295,40 @@ public final class DirtSleepPlugin extends JavaPlugin implements TabExecutor { eligible++; } - if (eligible <= 0) { - return 1; + return Math.max(1, eligible); + } + + private boolean isWorldEnabled(World world) { + List worlds = getConfig().getStringList("vote-day.worlds"); + return worlds.isEmpty() || worlds.contains(world.getName()); + } + + private boolean canStartVote(World world, VoteType type) { + if (world.getEnvironment() != World.Environment.NORMAL) { + return false; } - String raw = getConfig().getString("vote-day.required-votes", "50%"); + long time = world.getTime(); + + if (type == VoteType.DAY) { + if (!getConfig().getBoolean("vote-day.only-during-night", true)) { + return true; + } + int nightStartsAt = getConfig().getInt("vote-day.night-starts-at", 12542); + return time >= nightStartsAt && time < 24000; + } + + if (!getConfig().getBoolean("vote-night.only-during-day", true)) { + return true; + } + int dayEndsAt = getConfig().getInt("vote-night.day-ends-at", 12542); + return time >= 0 && time < dayEndsAt; + } + + private int getRequiredVotes(World world, VoteType type) { + int eligible = getEligiblePlayers(world, type); + + String raw = getConfig().getString("vote-" + type.configName + ".required-votes", "50%"); if (raw == null) { return 1; } @@ -281,6 +353,29 @@ public final class DirtSleepPlugin extends JavaPlugin implements TabExecutor { } } + private void makeDay(World world) { + world.setTime(1000); + world.setStorm(false); + world.setThundering(false); + } + + private void makeNight(World world) { + world.setTime(13000); + } + + private void sendClickableVoteMessage(Player player, VoteType type) { + String yesCommand = type == VoteType.DAY ? "/voteday yes" : "/votenight yes"; + String noCommand = type == VoteType.DAY ? "/voteday no" : "/votenight no"; + + Component yes = Component.text("[YES]", NamedTextColor.GREEN) + .clickEvent(ClickEvent.runCommand(yesCommand)); + Component spacer = Component.text(" ", NamedTextColor.GRAY); + Component no = Component.text("[NO]", NamedTextColor.RED) + .clickEvent(ClickEvent.runCommand(noCommand)); + + player.sendMessage(yes.append(spacer).append(no)); + } + private void broadcast(World world, String message) { for (Player player : world.getPlayers()) { player.sendMessage(message); @@ -307,6 +402,38 @@ public final class DirtSleepPlugin extends JavaPlugin implements TabExecutor { } } + if (command.getName().equalsIgnoreCase("voteday") || command.getName().equalsIgnoreCase("votenight")) { + if (args.length == 1) { + return Arrays.asList("yes", "no").stream() + .filter(s -> s.toLowerCase(Locale.ROOT).startsWith(args[0].toLowerCase(Locale.ROOT))) + .collect(Collectors.toList()); + } + } + return Collections.emptyList(); } + + private enum VoteType { + DAY("day"), + NIGHT("night"); + + private final String configName; + + VoteType(String configName) { + this.configName = configName; + } + } + + private static final class ActiveVote { + private final VoteType type; + private final int requiredYesVotes; + private final Set yesVotes = new HashSet<>(); + private final Set noVotes = new HashSet<>(); + private BukkitTask timeoutTask; + + private ActiveVote(VoteType type, int requiredYesVotes) { + this.type = type; + this.requiredYesVotes = requiredYesVotes; + } + } } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 8d5e6d8..e087ff0 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -11,7 +11,7 @@ vote-day: # Tick time where night starts night-starts-at: 12542 - # Required votes before changing to day + # Required YES votes before changing to day # Examples: "1", "2", "50%", "75%" required-votes: "50%" @@ -28,19 +28,50 @@ vote-night: # Tick time where day effectively ends for vote checks day-ends-at: 12542 + # Required YES votes before changing to night + # Examples: "1", "2", "50%", "75%" + required-votes: "50%" + + # Ignore players with this permission from vote requirement: + # dirtsleep.bypass + exclude-bypass: true + +vote-session: + # How long a vote stays open + duration-seconds: 30 + messages: prefix: "&8[&6DirtBagMC&8] &7" - vote-added: "%prefix%&e%player% &7voted for day. &f(%votes%/%required% votes, %remaining% remaining)" - vote-passed: "%prefix%&aVote passed! Skipping to day." - already-voted: "%prefix%&cYou already voted." - not-night: "%prefix%&cYou can only use this at night." - disabled: "%prefix%&cVote day is disabled." + vote-started-day: "%prefix%&e%player% &7started a vote to make it &fday&7. &aYES: &f%yes%&7/&f%required% &8| &cNO: &f%no%" + vote-started-night: "%prefix%&e%player% &7started a vote to make it &fnight&7. &aYES: &f%yes%&7/&f%required% &8| &cNO: &f%no%" - night-vote-added: "%prefix%&e%player% &7voted for night. &f(%votes%/%required% votes, %remaining% remaining)" + click-prompt: "%prefix%&7Click below to vote." + + vote-progress-day: "%prefix%&7Day vote status: &aYES: &f%yes%&7/&f%required% &8| &cNO: &f%no%" + vote-progress-night: "%prefix%&7Night vote status: &aYES: &f%yes%&7/&f%required% &8| &cNO: &f%no%" + + vote-passed: "%prefix%&aVote passed! Skipping to day." night-vote-passed: "%prefix%&aVote passed! Skipping to night." + + vote-failed: "%prefix%&cVote failed." + vote-expired: "%prefix%&cVote to make it day expired." + night-vote-expired: "%prefix%&cVote to make it night expired." + + vote-yes-confirm: "%prefix%&aYou voted YES." + vote-no-confirm: "%prefix%&cYou voted NO." + + vote-already-running: "%prefix%&cA vote is already running in this world." + no-active-vote: "%prefix%&cThere is no active vote in this world." + wrong-vote-command: "%prefix%&cUse the correct vote buttons for the current vote." + + already-voted: "%prefix%&cYou already voted." night-already-voted: "%prefix%&cYou already voted for night." - not-day: "%prefix%&cYou can only use this during the day." + + not-night: "%prefix%&cYou can only start this vote at night." + not-day: "%prefix%&cYou can only start this vote during the day." + + disabled: "%prefix%&cVote day is disabled." night-disabled: "%prefix%&cVote night is disabled." world-disabled: "%prefix%&cVote commands are disabled in this world." diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 1aea36a..092fdca 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -3,13 +3,13 @@ version: 1.0 main: com.bitnix.dirtsleep.DirtSleepPlugin api-version: '1.21' author: bitnix -description: Simple vote day plugin +description: Simple vote day/night plugin commands: voteday: - description: Vote to make it day + description: Start a vote to make it day usage: /voteday votenight: - description: Vote to make it night + description: Start a vote to make it night usage: /votenight dirtsleep: description: DirtSleep admin command diff --git a/target/DirtSleep.jar b/target/DirtSleep.jar index 2d930d8..0d390aa 100644 Binary files a/target/DirtSleep.jar and b/target/DirtSleep.jar differ diff --git a/target/classes/com/bitnix/dirtsleep/DirtSleepPlugin$ActiveVote.class b/target/classes/com/bitnix/dirtsleep/DirtSleepPlugin$ActiveVote.class new file mode 100644 index 0000000..cc627fe Binary files /dev/null and b/target/classes/com/bitnix/dirtsleep/DirtSleepPlugin$ActiveVote.class differ diff --git a/target/classes/com/bitnix/dirtsleep/DirtSleepPlugin$VoteType.class b/target/classes/com/bitnix/dirtsleep/DirtSleepPlugin$VoteType.class new file mode 100644 index 0000000..e9eccc1 Binary files /dev/null and b/target/classes/com/bitnix/dirtsleep/DirtSleepPlugin$VoteType.class differ diff --git a/target/classes/com/bitnix/dirtsleep/DirtSleepPlugin.class b/target/classes/com/bitnix/dirtsleep/DirtSleepPlugin.class index 07b996f..4024e81 100644 Binary files a/target/classes/com/bitnix/dirtsleep/DirtSleepPlugin.class and b/target/classes/com/bitnix/dirtsleep/DirtSleepPlugin.class differ diff --git a/target/classes/config.yml b/target/classes/config.yml index 8d5e6d8..e087ff0 100644 --- a/target/classes/config.yml +++ b/target/classes/config.yml @@ -11,7 +11,7 @@ vote-day: # Tick time where night starts night-starts-at: 12542 - # Required votes before changing to day + # Required YES votes before changing to day # Examples: "1", "2", "50%", "75%" required-votes: "50%" @@ -28,19 +28,50 @@ vote-night: # Tick time where day effectively ends for vote checks day-ends-at: 12542 + # Required YES votes before changing to night + # Examples: "1", "2", "50%", "75%" + required-votes: "50%" + + # Ignore players with this permission from vote requirement: + # dirtsleep.bypass + exclude-bypass: true + +vote-session: + # How long a vote stays open + duration-seconds: 30 + messages: prefix: "&8[&6DirtBagMC&8] &7" - vote-added: "%prefix%&e%player% &7voted for day. &f(%votes%/%required% votes, %remaining% remaining)" - vote-passed: "%prefix%&aVote passed! Skipping to day." - already-voted: "%prefix%&cYou already voted." - not-night: "%prefix%&cYou can only use this at night." - disabled: "%prefix%&cVote day is disabled." + vote-started-day: "%prefix%&e%player% &7started a vote to make it &fday&7. &aYES: &f%yes%&7/&f%required% &8| &cNO: &f%no%" + vote-started-night: "%prefix%&e%player% &7started a vote to make it &fnight&7. &aYES: &f%yes%&7/&f%required% &8| &cNO: &f%no%" - night-vote-added: "%prefix%&e%player% &7voted for night. &f(%votes%/%required% votes, %remaining% remaining)" + click-prompt: "%prefix%&7Click below to vote." + + vote-progress-day: "%prefix%&7Day vote status: &aYES: &f%yes%&7/&f%required% &8| &cNO: &f%no%" + vote-progress-night: "%prefix%&7Night vote status: &aYES: &f%yes%&7/&f%required% &8| &cNO: &f%no%" + + vote-passed: "%prefix%&aVote passed! Skipping to day." night-vote-passed: "%prefix%&aVote passed! Skipping to night." + + vote-failed: "%prefix%&cVote failed." + vote-expired: "%prefix%&cVote to make it day expired." + night-vote-expired: "%prefix%&cVote to make it night expired." + + vote-yes-confirm: "%prefix%&aYou voted YES." + vote-no-confirm: "%prefix%&cYou voted NO." + + vote-already-running: "%prefix%&cA vote is already running in this world." + no-active-vote: "%prefix%&cThere is no active vote in this world." + wrong-vote-command: "%prefix%&cUse the correct vote buttons for the current vote." + + already-voted: "%prefix%&cYou already voted." night-already-voted: "%prefix%&cYou already voted for night." - not-day: "%prefix%&cYou can only use this during the day." + + not-night: "%prefix%&cYou can only start this vote at night." + not-day: "%prefix%&cYou can only start this vote during the day." + + disabled: "%prefix%&cVote day is disabled." night-disabled: "%prefix%&cVote night is disabled." world-disabled: "%prefix%&cVote commands are disabled in this world." diff --git a/target/classes/plugin.yml b/target/classes/plugin.yml index 1aea36a..092fdca 100644 --- a/target/classes/plugin.yml +++ b/target/classes/plugin.yml @@ -3,13 +3,13 @@ version: 1.0 main: com.bitnix.dirtsleep.DirtSleepPlugin api-version: '1.21' author: bitnix -description: Simple vote day plugin +description: Simple vote day/night plugin commands: voteday: - description: Vote to make it day + description: Start a vote to make it day usage: /voteday votenight: - description: Vote to make it night + description: Start a vote to make it night usage: /votenight dirtsleep: description: DirtSleep admin command diff --git a/target/maven-archiver/pom.properties b/target/maven-archiver/pom.properties index 43835c6..e625be0 100644 --- a/target/maven-archiver/pom.properties +++ b/target/maven-archiver/pom.properties @@ -1,5 +1,5 @@ #Generated by Maven -#Tue Jun 09 20:09:21 EDT 2026 +#Tue Jun 09 20:37:04 EDT 2026 artifactId=DirtSleep groupId=com.bitnix version=1.0-SNAPSHOT diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst index 52b0b9a..c6bcd11 100644 --- a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -1 +1,3 @@ +com/bitnix/dirtsleep/DirtSleepPlugin$VoteType.class com/bitnix/dirtsleep/DirtSleepPlugin.class +com/bitnix/dirtsleep/DirtSleepPlugin$ActiveVote.class