aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorsowgro <tpoke.ferrari@gmail.com>2024-07-05 02:21:13 -0400
committersowgro <tpoke.ferrari@gmail.com>2024-07-05 02:21:13 -0400
commit59fcef47d9ee1379d0fb0e0228521f269d9d3761 (patch)
tree87f01e0cc8f22367a1fff141a28a0564cf1f9605 /src
downloadPlayersSleepingPercentage-59fcef47d9ee1379d0fb0e0228521f269d9d3761.tar.gz
PlayersSleepingPercentage-59fcef47d9ee1379d0fb0e0228521f269d9d3761.tar.bz2
PlayersSleepingPercentage-59fcef47d9ee1379d0fb0e0228521f269d9d3761.zip
First commit
Diffstat (limited to 'src')
-rw-r--r--src/main/java/net/sowgro/psp/Command.java52
-rw-r--r--src/main/java/net/sowgro/psp/PlayersSleepingPercentage.java18
-rw-r--r--src/main/java/net/sowgro/psp/SleepListener.java64
-rw-r--r--src/main/resources/config.yml2
-rw-r--r--src/main/resources/plugin.yml15
5 files changed, 151 insertions, 0 deletions
diff --git a/src/main/java/net/sowgro/psp/Command.java b/src/main/java/net/sowgro/psp/Command.java
new file mode 100644
index 0000000..83e0933
--- /dev/null
+++ b/src/main/java/net/sowgro/psp/Command.java
@@ -0,0 +1,52 @@
+package net.sowgro.psp;
+
+import org.bukkit.ChatColor;
+import org.bukkit.command.CommandExecutor;
+import org.bukkit.command.CommandSender;
+import org.bukkit.command.TabCompleter;
+
+import java.util.Collections;
+import java.util.List;
+
+import static net.sowgro.psp.PlayersSleepingPercentage.plugin;
+
+
+public class Command implements CommandExecutor, TabCompleter {
+ @Override
+ public boolean onCommand(CommandSender sender, org.bukkit.command.Command command, String label, String[] args) {
+
+ if (!sender.hasPermission("playersSleepingPercentage")) {
+ sender.sendMessage(ChatColor.RED + "You do not have permission to execute this command!");
+ return true;
+ }
+
+ if (args.length < 1 || args[0] == null || args[0].isEmpty()) {
+ sender.sendMessage(ChatColor.RED + "Invalid argument!");
+ return false;
+ }
+
+ int val;
+ try {
+ val = Integer.parseInt(args[0]);
+ }
+ catch (NumberFormatException e) {
+ sender.sendMessage(ChatColor.RED + "Input was not a number!");
+ return false;
+ }
+
+ if (val < 0 || val > 100) {
+ sender.sendMessage(ChatColor.RED + "Input must be between 0 and 100 inclusive!");
+ return false;
+ }
+
+ plugin.getConfig().set("PlayersSleepingPercentage", val);
+ sender.sendMessage(ChatColor.GREEN + "Set to " + val);
+ return true;
+ }
+
+
+ @Override
+ public List<String> onTabComplete(CommandSender sender, org.bukkit.command.Command command, String label, String[] args) {
+ return Collections.emptyList();
+ }
+}
diff --git a/src/main/java/net/sowgro/psp/PlayersSleepingPercentage.java b/src/main/java/net/sowgro/psp/PlayersSleepingPercentage.java
new file mode 100644
index 0000000..dd29eeb
--- /dev/null
+++ b/src/main/java/net/sowgro/psp/PlayersSleepingPercentage.java
@@ -0,0 +1,18 @@
+package net.sowgro.psp;
+
+import org.bukkit.plugin.java.JavaPlugin;
+
+import java.util.Objects;
+
+public class PlayersSleepingPercentage extends JavaPlugin {
+
+ public static PlayersSleepingPercentage plugin;
+
+ @Override
+ public void onEnable() {
+ plugin = this;
+ saveDefaultConfig();
+ getServer().getPluginManager().registerEvents(new SleepListener(), this);
+ Objects.requireNonNull(plugin.getCommand("playersSleepingPercentage")).setExecutor(new Command());
+ }
+}
diff --git a/src/main/java/net/sowgro/psp/SleepListener.java b/src/main/java/net/sowgro/psp/SleepListener.java
new file mode 100644
index 0000000..175f49a
--- /dev/null
+++ b/src/main/java/net/sowgro/psp/SleepListener.java
@@ -0,0 +1,64 @@
+package net.sowgro.psp;
+
+import org.bukkit.Bukkit;
+import org.bukkit.World;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.player.PlayerBedEnterEvent;
+import org.bukkit.entity.Player;
+import org.bukkit.event.player.PlayerBedLeaveEvent;
+
+import java.util.HashMap;
+
+import static net.sowgro.psp.PlayersSleepingPercentage.plugin;
+
+public class SleepListener implements Listener {
+
+ private final HashMap<World, Integer> eventIDs = new HashMap<>();
+
+ @EventHandler
+ public void onPlayerBedEnter(PlayerBedEnterEvent event) {
+
+ // check that the player successfully entered the bed
+ if (event.getBedEnterResult() != PlayerBedEnterEvent.BedEnterResult.OK) {
+ return;
+ }
+
+ World world = event.getPlayer().getWorld();
+
+ if (enoughPlayersToSleep(world, 1) && eventIDs.get(world) == null) {
+ eventIDs.put(world, Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(plugin, () -> {
+ world.setTime(0);
+ world.setStorm(false);
+ world.setThundering(false);
+ eventIDs.remove(world);
+ }, 100L)); // Delay in server ticks before running the task, to ensure it happens after the player is in bed.
+ }
+ }
+
+ @EventHandler
+ public void onPlayerBedLeave(PlayerBedLeaveEvent event) {
+
+ World world = event.getPlayer().getWorld();
+
+ if (!enoughPlayersToSleep(world, -1) && eventIDs.get(world) != null) {
+ Bukkit.getServer().getScheduler().cancelTask(eventIDs.get(world));
+ eventIDs.remove(world);
+ }
+ }
+
+ /**
+ * Decides if there are enough players sleeping to satisfy the percentage in the config
+ * @param world The world to check players in
+ * @param playersSleeping Used to offset the number of players counted as sleeping. The player who just entered/left a bed is not recognized as sleeping so 1 / -1 is passed in after those events
+ * @return True if there are enough players sleeping
+ */
+ private boolean enoughPlayersToSleep(World world, int playersSleeping) {
+ for (Player p : world.getPlayers()) {
+ if (p.isSleeping()) { playersSleeping++; }
+ }
+ double currentPercent = ((double) playersSleeping / world.getPlayers().size()) * 100;
+ double configPercent = plugin.getConfig().getInt("PlayersSleepingPercentage", 100);
+ return currentPercent >= configPercent;
+ }
+}
diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml
new file mode 100644
index 0000000..17cdd58
--- /dev/null
+++ b/src/main/resources/config.yml
@@ -0,0 +1,2 @@
+# The percentage of players required to skip the night
+PlayersSleepingPercentage: 50 \ No newline at end of file
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
new file mode 100644
index 0000000..de81710
--- /dev/null
+++ b/src/main/resources/plugin.yml
@@ -0,0 +1,15 @@
+name: PlayersSleepingPercentage
+version: '${project.version}'
+main: net.sowgro.psp.PlayersSleepingPercentage
+api-version: '1.16'
+
+commands:
+ playersSleepingPercentage:
+ description: Set the percentage of players required to sleep
+ usage: "§cUsage: /playersSleepingPercentage <percentage>"
+ permission: playersSleepingPercentage
+
+permissions:
+ playersSleepingPercentage:
+ default: op
+ description: Allows you to set the percentage of players required to sleep