Repository: ServerOpenMC/PluginV2
Pull request #256: Ajout du pourcentage pour sleep
Author: login: gab4000
Labels: name: :package: Feature
description: Ajout d'une fonctionnalité
Created: 2025-04-20T09:32:10Z | Merged: 2025-04-20T09:53:53Z

## Pour que votre Pull Request soit accepté, il vous faut :
* Votre code suit-il le [Code de Conduite](https://github.com/ServerOpenMC/PluginV2/blob/master/CODE_OF_CONDUCT.md) ? : oui
* Avez-vous supprimé au maximum les imports non utilisés ? : oui
* Fournissez un Profileur (/spark profiler) lorsque vous éxécuter vos commandes, méthodes :

* Les Issues corrigé(e)s/en commun : #221 

## Étape nécessaire afin que la PR soit fini
- [x] Changement de l'organisation des fichiers
- [x] Ajout du % pour dormir (g repris celui de la v1)

## Decrivez vos changements
*Clairement et avec des screenshots si nécessaires*
- Organisation des fichiers améliorée (CommandManager et ListenerManager désormais a la racine *core*)
- % pour dormir de la v1


Diff:
diff --git a/src/main/java/fr/openmc/core/commands/CommandsManager.java b/src/main/java/fr/openmc/core/CommandsManager.java
similarity index 96%
rename from src/main/java/fr/openmc/core/commands/CommandsManager.java
rename to src/main/java/fr/openmc/core/CommandsManager.java
index 64f438266..c2b8199d5 100644
--- a/src/main/java/fr/openmc/core/commands/CommandsManager.java
+++ b/src/main/java/fr/openmc/core/CommandsManager.java
@@ -1,6 +1,5 @@
-package fr.openmc.core.commands;
+package fr.openmc.core;
 
-import fr.openmc.core.OMCPlugin;
 import fr.openmc.core.commands.debug.ChronometerCommand;
 import fr.openmc.core.commands.debug.CooldownCommand;
 import fr.openmc.core.commands.fun.Playtime;
diff --git a/src/main/java/fr/openmc/core/listeners/ListenersManager.java b/src/main/java/fr/openmc/core/ListenersManager.java
similarity index 85%
rename from src/main/java/fr/openmc/core/listeners/ListenersManager.java
rename to src/main/java/fr/openmc/core/ListenersManager.java
index 52494239d..9460712b3 100644
--- a/src/main/java/fr/openmc/core/listeners/ListenersManager.java
+++ b/src/main/java/fr/openmc/core/ListenersManager.java
@@ -1,7 +1,7 @@
-package fr.openmc.core.listeners;
+package fr.openmc.core;
 
-import fr.openmc.core.OMCPlugin;
 import fr.openmc.core.features.mailboxes.MailboxListener;
+import fr.openmc.core.listeners.*;
 import org.bukkit.Bukkit;
 import org.bukkit.Server;
 import org.bukkit.event.Listener;
@@ -18,7 +18,8 @@ public ListenersManager() {
                 new ChronometerListener(),
                 new CubeListener(OMCPlugin.getInstance()),
                 new RespawnListener(),
-                new AsyncChatListener(OMCPlugin.getInstance())
+                new AsyncChatListener(OMCPlugin.getInstance()),
+                new SleepListener()
         );
     }
 
diff --git a/src/main/java/fr/openmc/core/OMCPlugin.java b/src/main/java/fr/openmc/core/OMCPlugin.java
index 7e6d4c51a..e7f8deee4 100644
--- a/src/main/java/fr/openmc/core/OMCPlugin.java
+++ b/src/main/java/fr/openmc/core/OMCPlugin.java
@@ -1,7 +1,6 @@
 package fr.openmc.core;
 
 import dev.xernas.menulib.MenuLib;
-import fr.openmc.core.commands.CommandsManager;
 import fr.openmc.core.features.scoreboards.ScoreboardManager;
 import fr.openmc.core.features.city.CityManager;
 import fr.openmc.core.features.city.mascots.MascotsManager;
@@ -17,7 +16,6 @@
 import fr.openmc.core.features.scoreboards.TabList;
 import fr.openmc.core.features.tpa.TPAManager;
 import fr.openmc.core.listeners.CubeListener;
-import fr.openmc.core.listeners.ListenersManager;
 import fr.openmc.core.utils.LuckPermsAPI;
 import fr.openmc.core.utils.PapiAPI;
 import fr.openmc.core.utils.WorldGuardApi;
diff --git a/src/main/java/fr/openmc/core/features/city/CityManager.java b/src/main/java/fr/openmc/core/features/city/CityManager.java
index 3420dbfcc..28686eaad 100644
--- a/src/main/java/fr/openmc/core/features/city/CityManager.java
+++ b/src/main/java/fr/openmc/core/features/city/CityManager.java
@@ -6,7 +6,7 @@
 import fr.openmc.core.features.city.mascots.MascotsManager;
 import com.sk89q.worldedit.math.BlockVector2;
 import fr.openmc.core.OMCPlugin;
-import fr.openmc.core.commands.CommandsManager;
+import fr.openmc.core.CommandsManager;
 import fr.openmc.core.features.city.commands.*;
 import fr.openmc.core.features.city.listeners.*;
 import fr.openmc.core.utils.chronometer.Chronometer;
diff --git a/src/main/java/fr/openmc/core/features/contest/managers/ContestManager.java b/src/main/java/fr/openmc/core/features/contest/managers/ContestManager.java
index be8374086..5617e65ac 100644
--- a/src/main/java/fr/openmc/core/features/contest/managers/ContestManager.java
+++ b/src/main/java/fr/openmc/core/features/contest/managers/ContestManager.java
@@ -10,7 +10,7 @@
 import java.time.DayOfWeek;
 
 import fr.openmc.core.OMCPlugin;
-import fr.openmc.core.commands.CommandsManager;
+import fr.openmc.core.CommandsManager;
 import fr.openmc.core.features.contest.ContestData;
 import fr.openmc.core.features.contest.ContestPlayer;
 import fr.openmc.core.features.contest.commands.ContestCommand;
diff --git a/src/main/java/fr/openmc/core/features/economy/BankManager.java b/src/main/java/fr/openmc/core/features/economy/BankManager.java
index b8d0420c8..7a6b23f79 100644
--- a/src/main/java/fr/openmc/core/features/economy/BankManager.java
+++ b/src/main/java/fr/openmc/core/features/economy/BankManager.java
@@ -5,11 +5,9 @@
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.time.DayOfWeek;
-import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.temporal.ChronoUnit;
 import java.time.temporal.TemporalAdjusters;
-import java.util.Calendar;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.UUID;
@@ -18,7 +16,7 @@
 import org.bukkit.entity.Player;
 
 import fr.openmc.core.OMCPlugin;
-import fr.openmc.core.commands.CommandsManager;
+import fr.openmc.core.CommandsManager;
 import fr.openmc.core.features.city.CityManager;
 import fr.openmc.core.features.economy.commands.BankCommands;
 import fr.openmc.core.utils.InputUtils;
diff --git a/src/main/java/fr/openmc/core/features/economy/EconomyManager.java b/src/main/java/fr/openmc/core/features/economy/EconomyManager.java
index 063d8874c..ed4ea293a 100644
--- a/src/main/java/fr/openmc/core/features/economy/EconomyManager.java
+++ b/src/main/java/fr/openmc/core/features/economy/EconomyManager.java
@@ -8,7 +8,7 @@
 import java.util.Map;
 import java.util.UUID;
 
-import fr.openmc.core.commands.CommandsManager;
+import fr.openmc.core.CommandsManager;
 import fr.openmc.core.features.economy.commands.Baltop;
 import fr.openmc.core.features.economy.commands.History;
 import fr.openmc.core.features.economy.commands.Money;
diff --git a/src/main/java/fr/openmc/core/features/friend/FriendManager.java b/src/main/java/fr/openmc/core/features/friend/FriendManager.java
index d888ffe83..ceeeaf08a 100644
--- a/src/main/java/fr/openmc/core/features/friend/FriendManager.java
+++ b/src/main/java/fr/openmc/core/features/friend/FriendManager.java
@@ -1,7 +1,7 @@
 package fr.openmc.core.features.friend;
 
 import fr.openmc.core.OMCPlugin;
-import fr.openmc.core.commands.CommandsManager;
+import fr.openmc.core.CommandsManager;
 import lombok.Getter;
 import org.bukkit.Bukkit;
 
diff --git a/src/main/java/fr/openmc/core/features/homes/HomesManager.java b/src/main/java/fr/openmc/core/features/homes/HomesManager.java
index 8e85f5531..5f18e67cf 100644
--- a/src/main/java/fr/openmc/core/features/homes/HomesManager.java
+++ b/src/main/java/fr/openmc/core/features/homes/HomesManager.java
@@ -1,7 +1,7 @@
 package fr.openmc.core.features.homes;
 
 import fr.openmc.core.OMCPlugin;
-import fr.openmc.core.commands.CommandsManager;
+import fr.openmc.core.CommandsManager;
 import fr.openmc.core.features.homes.command.*;
 import fr.openmc.core.features.homes.utils.HomeUtil;
 import fr.openmc.core.features.homes.world.DisabledWorldHome;
diff --git a/src/main/java/fr/openmc/core/features/scoreboards/ScoreboardManager.java b/src/main/java/fr/openmc/core/features/scoreboards/ScoreboardManager.java
index 6c22e7677..7d3af51a2 100644
--- a/src/main/java/fr/openmc/core/features/scoreboards/ScoreboardManager.java
+++ b/src/main/java/fr/openmc/core/features/scoreboards/ScoreboardManager.java
@@ -1,7 +1,7 @@
 package fr.openmc.core.features.scoreboards;
 
 import fr.openmc.core.OMCPlugin;
-import fr.openmc.core.commands.CommandsManager;
+import fr.openmc.core.CommandsManager;
 import fr.openmc.core.features.city.City;
 import fr.openmc.core.features.city.CityManager;
 import fr.openmc.core.features.contest.ContestData;
diff --git a/src/main/java/fr/openmc/core/features/tpa/TPAManager.java b/src/main/java/fr/openmc/core/features/tpa/TPAManager.java
index 22389e28b..6fd6c481e 100644
--- a/src/main/java/fr/openmc/core/features/tpa/TPAManager.java
+++ b/src/main/java/fr/openmc/core/features/tpa/TPAManager.java
@@ -1,7 +1,7 @@
 package fr.openmc.core.features.tpa;
 
 import fr.openmc.core.OMCPlugin;
-import fr.openmc.core.commands.CommandsManager;
+import fr.openmc.core.CommandsManager;
 import fr.openmc.core.features.tpa.commands.TPACommand;
 import fr.openmc.core.features.tpa.commands.TPAcceptCommand;
 import fr.openmc.core.features.tpa.commands.TPCancelCommand;
diff --git a/src/main/java/fr/openmc/core/listeners/SleepListener.java b/src/main/java/fr/openmc/core/listeners/SleepListener.java
new file mode 100644
index 000000000..5d29606b4
--- /dev/null
+++ b/src/main/java/fr/openmc/core/listeners/SleepListener.java
@@ -0,0 +1,57 @@
+package fr.openmc.core.listeners;
+
+import org.bukkit.GameRule;
+import org.bukkit.World;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.player.PlayerChangedWorldEvent;
+import org.bukkit.event.player.PlayerJoinEvent;
+import org.bukkit.event.player.PlayerQuitEvent;
+
+import java.util.NavigableMap;
+import java.util.TreeMap;
+
+public class SleepListener implements Listener {
+	
+	private static final NavigableMap<Integer, Integer> PLAYER_THRESHOLDS = new TreeMap<>();
+	static {
+		PLAYER_THRESHOLDS.put(4, 51);
+		PLAYER_THRESHOLDS.put(10, 43);
+		PLAYER_THRESHOLDS.put(20, 31);
+		PLAYER_THRESHOLDS.put(27, 26);
+		PLAYER_THRESHOLDS.put(35, 23);
+		PLAYER_THRESHOLDS.put(39, 21);
+		PLAYER_THRESHOLDS.put(45, 18);
+		PLAYER_THRESHOLDS.put(57, 16);
+		PLAYER_THRESHOLDS.put(61, 15);
+		PLAYER_THRESHOLDS.put(65, 14);
+		PLAYER_THRESHOLDS.put(70, 13);
+		PLAYER_THRESHOLDS.put(76, 12);
+		PLAYER_THRESHOLDS.put(91, 11);
+		PLAYER_THRESHOLDS.put(101, 10);
+	}
+	
+	@EventHandler
+	public void onPlayerJoin(PlayerJoinEvent event) {
+		World world = event.getPlayer().getWorld();
+		world.setGameRule(GameRule.PLAYERS_SLEEPING_PERCENTAGE, getPercentage(world.getPlayers().size() + 1));
+	}
+	
+	@EventHandler
+	public void onQuit(PlayerQuitEvent event) {
+		World world = event.getPlayer().getWorld();
+		world.setGameRule(GameRule.PLAYERS_SLEEPING_PERCENTAGE, getPercentage(world.getPlayers().size() - 1));
+	}
+	
+	@EventHandler
+	public void onChangeWorld(PlayerChangedWorldEvent event) {
+		World oldWorld = event.getFrom();
+		World newWorld = event.getPlayer().getWorld();
+		oldWorld.setGameRule(GameRule.PLAYERS_SLEEPING_PERCENTAGE, getPercentage(oldWorld.getPlayers().size()));
+		newWorld.setGameRule(GameRule.PLAYERS_SLEEPING_PERCENTAGE, getPercentage(newWorld.getPlayers().size()));
+	}
+	
+	private int getPercentage(int players) {
+		return PLAYER_THRESHOLDS.ceilingKey(players);
+	}
+}
diff --git a/src/main/java/fr/openmc/core/utils/customitems/CustomItemRegistry.java b/src/main/java/fr/openmc/core/utils/customitems/CustomItemRegistry.java
index d90a39435..9f35b8aa3 100644
--- a/src/main/java/fr/openmc/core/utils/customitems/CustomItemRegistry.java
+++ b/src/main/java/fr/openmc/core/utils/customitems/CustomItemRegistry.java
@@ -1,6 +1,6 @@
 package fr.openmc.core.utils.customitems;
 
-import fr.openmc.core.commands.CommandsManager;
+import fr.openmc.core.CommandsManager;
 import io.papermc.paper.persistence.PersistentDataContainerView;
 import org.bukkit.Bukkit;
 import org.bukkit.NamespacedKey;


Reviews:
user: login: iambibi
state: CHANGES_REQUESTED
author_association: MEMBER
submitted_at: 2025-04-20T09:41:24Z
user: login: ltuffery
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-20T09:45:28Z
user: login: iambibi
state: APPROVED
author_association: MEMBER
submitted_at: 2025-04-20T09:53:41Z

Review comments:
diff_hunk: @@ -0,0 +1,66 @@
+package fr.openmc.core.listeners;
+
+import org.bukkit.GameRule;
+import org.bukkit.World;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.player.PlayerChangedWorldEvent;
+import org.bukkit.event.player.PlayerJoinEvent;
+import org.bukkit.event.player.PlayerQuitEvent;
+
+public class SleepListener implements Listener {
+	
+	@EventHandler
+	public void onPlayerJoin(PlayerJoinEvent event) {
+		World world = event.getPlayer().getWorld();
+		world.setGameRule(GameRule.PLAYERS_SLEEPING_PERCENTAGE, getPercentage(world.getPlayers().size() + 1));
+	}
+	
+	@EventHandler
+	public void onQuit(PlayerQuitEvent event) {
+		World world = event.getPlayer().getWorld();
+		world.setGameRule(GameRule.PLAYERS_SLEEPING_PERCENTAGE, getPercentage(world.getPlayers().size() - 1));
+	}
+	
+	@EventHandler
+	public void onChangeWorld(PlayerChangedWorldEvent event) {
+		World oldWorld = event.getFrom();
+		World newWorld = event.getPlayer().getWorld();
+		oldWorld.setGameRule(GameRule.PLAYERS_SLEEPING_PERCENTAGE, getPercentage(oldWorld.getPlayers().size()));
+		newWorld.setGameRule(GameRule.PLAYERS_SLEEPING_PERCENTAGE, getPercentage(newWorld.getPlayers().size()));
+	}
+	
+	private int getPercentage(int players) {
path: src/main/java/fr/openmc/core/listeners/SleepListener.java
user: login: iambibi
body: Fait un truc du style

```
private static final Map<Integer, String> RANKS = Map.of(
            10000, "Dictateur en ",
            2500, "Colonel en ",
            2000, "Addict en ",
            1500, "Dieu en ",
            1000, "Légende en ",
            750, "Sénior en ",
            500, "Pro en ",
            250, "Semi-Pro en ",
            100, "Amateur en ",
            0, "Noob en "
    );

```
```
public String getTitleWithPoints(int points) {
        for (Map.Entry<Integer, String> entry : RANKS.entrySet()) {
            if (points >= entry.getKey()) {
                return entry.getValue();
            }
        }
        return "";
    }
```
created_at: 2025-04-20T09:41:18Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,66 @@
+package fr.openmc.core.listeners;
+
+import org.bukkit.GameRule;
+import org.bukkit.World;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.player.PlayerChangedWorldEvent;
+import org.bukkit.event.player.PlayerJoinEvent;
+import org.bukkit.event.player.PlayerQuitEvent;
+
+public class SleepListener implements Listener {
+	
+	@EventHandler
+	public void onPlayerJoin(PlayerJoinEvent event) {
+		World world = event.getPlayer().getWorld();
+		world.setGameRule(GameRule.PLAYERS_SLEEPING_PERCENTAGE, getPercentage(world.getPlayers().size() + 1));
+	}
+	
+	@EventHandler
+	public void onQuit(PlayerQuitEvent event) {
+		World world = event.getPlayer().getWorld();
+		world.setGameRule(GameRule.PLAYERS_SLEEPING_PERCENTAGE, getPercentage(world.getPlayers().size() - 1));
+	}
+	
+	@EventHandler
+	public void onChangeWorld(PlayerChangedWorldEvent event) {
+		World oldWorld = event.getFrom();
+		World newWorld = event.getPlayer().getWorld();
+		oldWorld.setGameRule(GameRule.PLAYERS_SLEEPING_PERCENTAGE, getPercentage(oldWorld.getPlayers().size()));
+		newWorld.setGameRule(GameRule.PLAYERS_SLEEPING_PERCENTAGE, getPercentage(newWorld.getPlayers().size()));
+	}
+	
+	private int getPercentage(int players) {
path: src/main/java/fr/openmc/core/listeners/SleepListener.java
user: login: ltuffery
body: en plus jolie

```java
private static final NavigableMap<Integer, Integer> PLAYER_THRESHOLDS = new TreeMap<>();

static {
    PLAYER_THRESHOLDS.put(4, 51);
    PLAYER_THRESHOLDS.put(10, 43);
    PLAYER_THRESHOLDS.put(20, 31);
    PLAYER_THRESHOLDS.put(27, 26);
    PLAYER_THRESHOLDS.put(35, 23);
    PLAYER_THRESHOLDS.put(39, 21);
    PLAYER_THRESHOLDS.put(45, 18);
    PLAYER_THRESHOLDS.put(57, 16);
    PLAYER_THRESHOLDS.put(61, 15);
    PLAYER_THRESHOLDS.put(65, 14);
    PLAYER_THRESHOLDS.put(70, 13);
    PLAYER_THRESHOLDS.put(76, 12);
    PLAYER_THRESHOLDS.put(91, 11);
    PLAYER_THRESHOLDS.put(101, 10);
}

public int getPercentage(int players) {
    return PLAYER_THRESHOLDS.ceilingEntry(players)
                            .getValue();
}
```
created_at: 2025-04-20T09:45:28Z
author_association: CONTRIBUTOR

PR comments:
user: login: ltuffery
created_at: 2025-04-20T09:34:41Z
body: Pourquoi le faire si on peut déjà mettre une gamerule avec un pourcentage ?
author_association: CONTRIBUTOR
user: login: gab4000
created_at: 2025-04-20T09:36:19Z
body: > Pourquoi le faire si on peut déjà mettre une gamerule avec un pourcentage ?

Ca se modifie en fonction du nombre de joueurs en ligne
author_association: CONTRIBUTOR
user: login: ltuffery
created_at: 2025-04-20T09:39:33Z
body: > > Pourquoi le faire si on peut déjà mettre une gamerule avec un pourcentage ?
> 
> Ca se modifie en fonction du nombre de joueurs en ligne

Oui, justement, pourquoi faire varier ce nombre et ne pas laisser seulement 50 % ou 20 % des joueurs dormir ?
author_association: CONTRIBUTOR
user: login: gab4000
created_at: 2025-04-20T09:41:35Z
body: > Oui, justement, pourquoi faire varier ce nombre et ne pas laisser seulement 50 % ou 20 % des joueurs dormir ?

parce que euh... jsp c pas moi qui ai codé la feature dans la v1
author_association: CONTRIBUTOR
user: login: iambibi
created_at: 2025-04-20T09:47:05Z
body: > > > Pourquoi le faire si on peut déjà mettre une gamerule avec un pourcentage ?
> > 
> > 
> > Ca se modifie en fonction du nombre de joueurs en ligne
> 
> Oui, justement, pourquoi faire varier ce nombre et ne pas laisser seulement 50 % ou 20 % des joueurs dormir ?

la plus part des joueurs avait bien apprécier le systeme la, il ne s'en plaignait pas
author_association: MEMBER