diff --git a/config.yml b/config.yml index 2173eba..378ad82 100644 --- a/config.yml +++ b/config.yml @@ -16,16 +16,18 @@ values: # How often (in seconds) to check if a player is in a bed (increase for slower servers) check: 1 - # Percent of players that need to sleep to skip night (must be 0.0 to 1.0) - percent: 0.5 + # Percent of players that need to sleep to skip night (must be between 0 to 100) + percent: 50 features: # Toggle night skipping feature. Configure amount of players needed to skip above (percent) - skipNight: true + skip: true # Clear weather when skipping night clearWeather: true # Toggle exclusion of operators/players with permission "harbor.bypass" from sleep count bypass: false + # Toggle exclusion of players in creative and spectator mode + ignoreCreative: true # Prevent all players from entering a bed block: false # Display debug information in console diff --git a/src/main/java/mykyta/Harbor/Config.java b/src/main/java/mykyta/Harbor/Config.java index 4ec20c8..b8ae263 100644 --- a/src/main/java/mykyta/Harbor/Config.java +++ b/src/main/java/mykyta/Harbor/Config.java @@ -67,4 +67,18 @@ public class Config { return 0; } } + + /** + * Fetches a double from the configuration + * @param location Configuration location of the double + */ + public double getDouble(String location) { + try { + return Double.parseDouble(harbor.getConfig().getString(location)); + } + catch (Exception e) { + error(e); + return 0.0; + } + } } \ No newline at end of file diff --git a/src/main/java/mykyta/Harbor/Events/BedEnter.java b/src/main/java/mykyta/Harbor/Events/BedEnter.java index ab883c6..c0262ba 100644 --- a/src/main/java/mykyta/Harbor/Events/BedEnter.java +++ b/src/main/java/mykyta/Harbor/Events/BedEnter.java @@ -1,8 +1,12 @@ package mykyta.Harbor.Events; +import java.util.ArrayList; + import org.bukkit.Bukkit; import org.bukkit.ChatColor; +import org.bukkit.GameMode; import org.bukkit.World; +import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; @@ -28,19 +32,46 @@ public class BedEnter implements Listener { if (event.getBedEnterResult() == BedEnterResult.OK) { World world = event.getPlayer().getWorld(); - // Increment the sleeping count - if (!config.getBoolean("features.bypass") || !event.getPlayer().hasPermission("harbor.bypass")) { + // Create list of players included in sleep count + ArrayList players = new ArrayList(); + world.getPlayers().stream().filter(p -> util.isSurvival(event.getPlayer())).forEach(p -> { + if (true) { + players.add(p); + } + }); + + System.out.println(players); + System.out.println("Included players: " + players.size()); + + // Increment the sleeping count TODO bypass stuff + if (players.contains(event.getPlayer())) { util.increment(world); + + // Send a chat message when a player is sleeping + if (config.getBoolean("messages.chat.chat") && (config.getString("messages.chat.sleeping").length() != 0)) { + Bukkit.getServer().broadcastMessage(ChatColor.translateAlternateColorCodes('&', config.getString("messages.chat.sleeping") + .replace("[sleeping]", String.valueOf(util.fetch(world)))) + .replace("[online]", String.valueOf(world.getPlayers().size())) + .replace("[player]", event.getPlayer().getName()) + .replace("[needed]", String.valueOf(Math.max(0, (int) Math.ceil(world.getPlayers().size() * (config.getDouble("values.percent") / 100) - util.fetch(world)))))); + } } else if (config.getString("messages.chat.bypass").length() != 0) event.getPlayer().sendMessage(ChatColor.translateAlternateColorCodes('&', config.getString("messages.chat.bypass"))); - // Send a chat message - if (config.getBoolean("messages.chat.chat") && (config.getString("messages.chat.sleeping").length() != 0)) { - Bukkit.getServer().broadcastMessage(ChatColor.translateAlternateColorCodes('&', config.getString("messages.chat.sleeping") - .replace("[sleeping]", String.valueOf(util.fetch(world)))) - .replace("[online]", String.valueOf(world.getPlayers().size())) - .replace("[player]", event.getPlayer().getName()) - .replace("[needed]", String.valueOf(Math.max(0, Math.round(world.getPlayers().size() * Float.parseFloat(config.getString("values.percent")) - util.fetch(world)))))); + // Skip night if threshold is reached + if (config.getBoolean("features.skip") && (util.fetch(world) >= (int) Math.ceil(world.getPlayers().size() * (config.getDouble("values.percent") / 100) - util.fetch(world)))) { + Bukkit.getServer().getWorld(event.getPlayer().getWorld().getName()).setTime(1000L); + + // Clear weather when it turns day + if (config.getBoolean("features.clearWeather")) { + event.getPlayer().getWorld().setStorm(false); + event.getPlayer().getWorld().setThundering(false); + } + + // Send a chat message when night is skipped + if (config.getBoolean("messages.chat.chat") && (config.getString("messages.chat.skipped").length() != 0)) { + Bukkit.getServer().broadcastMessage(ChatColor.translateAlternateColorCodes('&', config.getString("messages.chat.skipped"))); + } } } } diff --git a/src/main/java/mykyta/Harbor/Events/BedLeave.java b/src/main/java/mykyta/Harbor/Events/BedLeave.java index 3846451..b924b17 100644 --- a/src/main/java/mykyta/Harbor/Events/BedLeave.java +++ b/src/main/java/mykyta/Harbor/Events/BedLeave.java @@ -1,8 +1,11 @@ package mykyta.Harbor.Events; +import java.util.ArrayList; + import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.World; +import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; @@ -18,14 +21,22 @@ public class BedLeave implements Listener { Config config = new Config(); World world = event.getPlayer().getWorld(); - // Decrement the sleeping count - if (!config.getBoolean("features.bypass") || !event.getPlayer().hasPermission("harbor.bypass")) { + // Create list of players included in sleep count + ArrayList players = new ArrayList(); + world.getPlayers().stream().filter(p -> util.isSurvival(event.getPlayer())).forEach(p -> { + if (true) { + players.add(p); + } + }); + + // Decrement the sleeping count TODO bypass stuff + if (players.contains(event.getPlayer())) { util.decrement(world); } else if (config.getString("messages.chat.bypass").length() != 0) event.getPlayer().sendMessage(ChatColor.translateAlternateColorCodes('&', config.getString("messages.chat.bypass"))); - // Send a chat message - if (config.getBoolean("messages.chat.chat") && (config.getString("messages.chat.sleeping").length() != 0)) { + // Send a chat message when player gets out of bed (if it's not day) + if (config.getBoolean("messages.chat.chat") && (config.getString("messages.chat.sleeping").length() != 0) && Bukkit.getServer().getWorld(world.getName()).getTime() < 1000L) { Bukkit.getServer().broadcastMessage(ChatColor.translateAlternateColorCodes('&', config.getString("messages.chat.left") .replace("[sleeping]", String.valueOf(util.fetch(world)))) .replace("[online]", String.valueOf(world.getPlayers().size())) diff --git a/src/main/java/mykyta/Harbor/Util.java b/src/main/java/mykyta/Harbor/Util.java index 46d73c3..25985f1 100644 --- a/src/main/java/mykyta/Harbor/Util.java +++ b/src/main/java/mykyta/Harbor/Util.java @@ -4,6 +4,7 @@ import java.util.HashMap; import java.util.logging.Logger; import org.bukkit.Bukkit; +import org.bukkit.GameMode; import org.bukkit.World; import org.bukkit.entity.Player; @@ -94,4 +95,13 @@ public class Util { .replace("[online]", String.valueOf(world.getPlayers().size())) .replace("[needed]", String.valueOf(Math.max(0, Math.round(world.getPlayers().size() * Float.parseFloat(config.getString("values.percent")) - (sleeping.get(world)).intValue()))))); } + + /** + * Returns true if player is in survival mode + * @param player Target player + */ + public boolean isSurvival(Player player) { + if (player.getGameMode() == GameMode.SURVIVAL) return true; + else return false; + } } \ No newline at end of file