diff options
author | sowgro <tpoke.ferrari@gmail.com> | 2024-07-05 02:21:13 -0400 |
---|---|---|
committer | sowgro <tpoke.ferrari@gmail.com> | 2024-07-05 02:21:13 -0400 |
commit | 59fcef47d9ee1379d0fb0e0228521f269d9d3761 (patch) | |
tree | 87f01e0cc8f22367a1fff141a28a0564cf1f9605 /src | |
download | PlayersSleepingPercentage-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.java | 52 | ||||
-rw-r--r-- | src/main/java/net/sowgro/psp/PlayersSleepingPercentage.java | 18 | ||||
-rw-r--r-- | src/main/java/net/sowgro/psp/SleepListener.java | 64 | ||||
-rw-r--r-- | src/main/resources/config.yml | 2 | ||||
-rw-r--r-- | src/main/resources/plugin.yml | 15 |
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 |