Obtenir tous les joueurs dans une liste.



  • Bonjour,
    J'aimerai obtenir, côté Server, une liste contenant tous les joueurs. Pour ce faire, je me suis inspiré du code de l'EntityElderGuardian et ça donne ça :

    private List <entityplayermp>getAllPlayers (){
    
        return Minecraft.getMinecraft().world.getPlayers (EntityPlayerMP.class, new Predicate <entityplayermp>(){
    
            public boolean apply (EntityPlayerMP player){
                return true; // because I want all players
            }
        });
    }
    

    Le problème c'est que cette méthode me retourne une liste vide. Pouvez-vous m'aider ?
    Merci.</entityplayermp></entityplayermp>



  • Salut,
    on m'avais conseiller de faire comme ceci :

    String[] playerOnline = FMLServerHandler.instance().getServer().getOnlinePlayerNames(); //Get all players online.
    for(String st : playerOnline)
           {
    
          }
    

    Vois si tu peux adapter pour faire ce que tu souhaites 🙂


  • Administrateurs

    Salut,
    Utilises ServerUtils.mcServer.getPlayerList().getPlayers()



  • @'Fifou_BE':

    on m'avais conseiller de faire comme ceci :

    String[] playerOnline = FMLServerHandler.instance().getServer().getOnlinePlayerNames(); //Get all players online.
    for(String st : playerOnline)
          {
    
         }
    

    Ça lance un NPE en solo.
    @'robin4002':

    Utilises ServerUtils.mcServer.getPlayerList().getPlayers()

    L'IDE ne reconnait pas la classe ServerUtils (il ne me propose pas de l'importer).


  • Administrateurs

    Sachant que donnes des classes de mes mods, un peu normal.

    FMLServerHandler.instance().getServer().getPlayerList().getPlayers()

    Par contre idem ça ne fonctionnera surement pas en solo.
    Si tu as besoin de la liste de joueur en solo, il y a une variable dans le worldclient il me semble.



  • Pour récupérer les joueurs côté Client :

    
    List <entityplayer>players = Minecraft.getMinecraft().world.playerEntities;
    
    

    Une petite astuce : à la place de

    
    new Predicate <entityplayermp>(){
       public boolean apply (EntityPlayerMP player){
          return true; // because I want all players
       }    
    }
    
    

    tu peux mettre

    
    Predicates.alwaysTrue()
    
    

    ;)</entityplayermp></entityplayer>



  • Ok merci pour vos réponses.
    J'ai été retardé par un bug donc je reviendrais vous voir quand ça sera bon.


  • Rédacteurs

    Utilisez FMLCommonHandler au lieu de FMLServerHandler, vous n'aurez peut-être pas de crash en solo



  • Bon, je suis de retour !
    @'BrokenSwing':

    Utilisez FMLCommonHandler au lieu de FMLServerHandler, vous n'aurez peut-être pas de crash en solo

    L'instance du FMLCommonHandler ne possède pas de méthode getServer().

    Je rappelle que je veux obtenir la liste des joueurs côté server mais sur n'importe quel application (server ou client). Du coup j'ai fait comme ça :

    private List <entityplayermp>getAllPlayers (){
    
        if (DBSynchronizer.proxy instanceof ClientProxy){
            return FMLClientHandler.instance().getServer().getPlayerList().getPlayers();
        }else{
            return FMLServerHandler.instance().getServer().getPlayerList().getPlayers();
        }
    }
    

    Merci pour vos réponses, ça fonctionne parfaitement maintenant !</entityplayermp>


  • Rédacteurs

    Et ```java
    FMLCommonHandler.instance().getMinecraftServerInstance()



  • @'BrokenSwing':

    Et ```java
    FMLCommonHandler.instance().getMinecraftServerInstance()

    Ha oui, au temps pour moi !
    Ça fonctionne tout aussi bien, c'est plus propre et ça m'évite de créer des proxies (dont je n'avais pas besoin auparavant).

    Merci encore.


  • Administrateurs

    @'TheRedColossus':

    Bon, je suis de retour !
    @'BrokenSwing':

    Utilisez FMLCommonHandler au lieu de FMLServerHandler, vous n'aurez peut-être pas de crash en solo

    L'instance du FMLCommonHandler ne possède pas de méthode getServer().

    Je rappelle que je veux obtenir la liste des joueurs côté server mais sur n'importe quel application (server ou client). Du coup j'ai fait comme ça :

    private List <entityplayermp>getAllPlayers (){
       
        if (DBSynchronizer.proxy instanceof ClientProxy){
            return FMLClientHandler.instance().getServer().getPlayerList().getPlayers();
        }else{
            return FMLServerHandler.instance().getServer().getPlayerList().getPlayers();
        }
    }
    

    Merci pour vos réponses, ça fonctionne parfaitement maintenant !</entityplayermp>

    Juste une remarque, si tu as vraiment besoin de faire quelque chose du genre pour les proxy, fais une méthode non static get <ce que="" tu="" veux="">dans le proxy serveur et dans le client, dans le serveur proxy tu implémente le code serveur et dans le client le code client.
    Ensuite pour faire appelle à la fonction tu passes par ClassePrincipale.proxy.get<ce que="" tu="" veux="">()
    Beaucoup plus propre qu'un instanceof comme ça.</ce></ce>



  • Oui c'est ce que j'avais fait juste après quand je m'étais rendu compte que le instanceof + classes proxies vides c'était vraiment pas propre, mais bon, passer par le FMLCommonHandler c'est encore plus propre.