Résolu Problème avec les HashMap

Bizu

Bucheron
21 Juillet 2020
22
0
13
24
Coucou !
J'ai récemment décidé de faire un plugin de /report mais je me heurte à un problème concernant les HashMap :
J'ai créer une HashMap<UUID, String> qui stocke donc l'uuid d'un joueur et pour le récupérer il faut le String correspondant.
J'ai créer un item qui a pour DisplayName ( donc un String ) le pseudo d'un joueur que j'aimerais récupérer pour récupérer l'UUID du joueur le seul souci c'est que je ne sais pas comment faire étant donné que le code ci-dessous me retourne une NPE ( hash correspond à la HashMap )
Je ne sais pas si j'ai très bien été compris sur ce que je voulais faire, n'hésitez pas à me demander si vous avez une question !
Player player = Bukkit.getPlayer(Report.hash.get(event.getCurrentItem().getItemMeta().getDisplayName()));
event.getWhoClicked().teleport(player);
event.getWhoClicked().closeInventory();
 

Alex Fatta

Commandant de la Flotte et de la Horde
13 Août 2014
1 391
1
191
187
Bonjour !

Je n'ai pas codé depuis longtemps, mais il me semble dans ce cas qu'il te faudrait faire l'inverse : HashMap<String,UUID> puisque le fonctionnement même d'une liste de valeur, c'est le schéma <CLÉ, VALEUR>.

Exemple :

Joueur1 - XXXX-YYYY-ZZZZ
Joueur2 - YYYY-XXXX-ZZZZ

Dans ton cas, tu demandes à ta Map de te retourner un String en lui donnant...un string. Essaies en inversant les 2 valeurs et je pense que tu devrait déjà avoir un autre résultat ;)

AlexFatta
 

Bizu

Bucheron
21 Juillet 2020
22
0
13
24
Re-Coucou ! Alors oui j'y ai déjà pensé étant donné que je ne connais pas bien les HashMap mais non, cela retourne toujours une NPE...
J'y réfléchis mais je trouve cela bizarre
 

ShE3py

Enbogueuse
Support
26 Septembre 2015
4 087
157
456
247
21
Mìlhüsa
Bonjour,

Comme l'a dit Alex, les types de Map<K, V> correspond d'abord à la clef (Key) puis à la valeur (Value), mais du coup tu devrais avoir une erreur si tu essayes de Map#get(V) parce que la fonction n'existe pas.

J'ai créer une HashMap<UUID, String> qui stocke donc l'uuid d'un joueur et pour le récupérer il faut le String correspondant.
Le String correspondant à quoi ?

Si tu veux simplement récupérer l'UUID d'un joueur à partir de son nom, il te suffit de passer par Bukkit :
Java:
String playerName = ...;
UUID playerId = Bukkit.getOfflinePlayer(playerName).getUniqueID();

Bizu a dit:
Java:
Player player = Bukkit.getPlayer(Report.hash.get(event.getCurrentItem().getItemMeta().getDisplayName()));
cela retourne toujours une NPE...
Selon le type de l'évènement event, event#getCurrentItem() peut être null, et ItemStack#getItemMeta() sera forcément un jour null, car tous les items n'ont pas forcément d'ItemMeta.
Bref sans la fonction entière l'on ne peut pas affirmer grand-chose sur l'état des variables.

Cordialement,
ShE3py
 

Bizu

Bucheron
21 Juillet 2020
22
0
13
24
Coucou ShE3py !
Alors je n'ai pas très bien compris comment ça " sans la fonction entière l'on ne peut pas affirmer grand-chose " ? Je n'ai pas fait de fonctions seulement une HashMap, et si par là tu entends le code voici donc :
if (event.getClickedInventory().getName().equalsIgnoreCase(ChatColor.RED + "Reports")) {

if (event.getCurrentItem().getItemMeta().hasDisplayName() && event.getClick().isLeftClick()) {
event.getWhoClicked().sendMessage("§a Téléportation au joueur fautif");

Player player = Bukkit.getPlayer(Report.hash.get(event.getCurrentItem().getItemMeta().getDisplayName()));
event.getWhoClicked().teleport(player);
event.getWhoClicked().closeInventory();
Et ce que je souhaite faire c'est très simple : Stocker suite à une commande le pseudo d'un joueur ( hash.put(target.getName(),target.getUniqueId()); ) target qui correspond à un joueur visé, puis récupérer l'UUID du joueur pour l'utiliser ensuite dans mon InventoryClickEvent

J'avais du mal expliqué mon premier message...
 

ShE3py

Enbogueuse
Support
26 Septembre 2015
4 087
157
456
247
21
Mìlhüsa
Alors je n'ai pas très bien compris comment ça " sans la fonction entière l'on ne peut pas affirmer grand-chose " ?
Tu as une variable event, mais je n'ai aucune idée de son type. Je suppose InventoryClickEvent vu que c'est le seul évènement avec une méthode #getClickedInventory().

Je n'ai pas fait de fonctions seulement une HashMap, et si par là tu entends le code voici donc :
Java:
if (event.getClickedInventory().getName().equalsIgnoreCase(ChatColor.RED + "Reports")) {

if (event.getCurrentItem().getItemMeta().hasDisplayName() && event.getClick().isLeftClick()) {
event.getWhoClicked().sendMessage("§a Téléportation au joueur fautif");

Player player = Bukkit.getPlayer(Report.hash.get(event.getCurrentItem().getItemMeta().getDisplayName()));
event.getWhoClicked().teleport(player);
event.getWhoClicked().closeInventory();
Ton code est forcément écrit dans une fonction, encore une fois je suppose qu'elle ressemble à cela :
Java:
@EventHandler
public void onInventoryClick(InventoryClickEvent event) {
    // ...
}
Mais ce n'est pas à moi d'extrapoler les lignes qui manquent.

Et ce que je souhaite faire c'est très simple : Stocker suite à une commande le pseudo d'un joueur ( hash.put(target.getName(),target.getUniqueId()); ) target qui correspond à un joueur visé, puis récupérer l'UUID du joueur pour l'utiliser ensuite dans mon InventoryClickEvent
Les joueurs peuvent changer de nom, donc tu ne dois pas récupérer son UUID à partir de son nom mais son nom à partir de son UUID.
Bukkit propose déjà des fonctions pour faire cela, tu n'as pas besoin d'utiliser une hashmap en plus.

P.S.: Insère ton code entre balises [code=java][/code] (via le bouton « Plus d'options » de la barre d'outils, puis « Code </> ») et non dans des tableaux 1x1.
 

Bizu

Bucheron
21 Juillet 2020
22
0
13
24
Re Coucou ! Alors pour commencer je pensais que ça s'appelais une method et non une fonction ( merci de m'avoir appris cela )
Et la question que je me pose c'est comment faire pour récupérer l'UUID du joueur ?
Les joueurs peuvent changer de nom, donc tu ne dois pas récupérer son UUID à partir de son nom mais son nom à partir de son UUID.
Bukkit propose déjà des fonctions pour faire cela, tu n'as pas besoin d'utiliser une hashmap en plus.
Car je veux dire ok je peux faire un Bukkit.getPlayer(UUID) mais comment je récupère l'UUID du joueur qui a effectué la commande ? Je suis obligé de passer par une HashMap, non ?
 

ShE3py

Enbogueuse
Support
26 Septembre 2015
4 087
157
456
247
21
Mìlhüsa
je pensais que ça s'appelais une méthode et non une fonction
Une méthode est une fonction liée à un objet ; c'est juste un hyponyme de fonction, mais cela reste une fonction.
Java:
public static void fonction(int a, int b) {
    return a + b;
}

public void méthode() {
    return this.c;
}
Tu peux utiliser une fonction sans passer par un objet (return Math.cos(1) — calcule le cosinus), mais tu ne peux pas utiliser une méthode sans objet (return Block.getX() — tu ne peux pas récupérer une coordonnée sans avoir un point bien particulier — « renvoie la X » ne marche pas — quelle X ?).

Mais tu peux facilement convertir une méthode en fonction :
Java:
public static void getX(Point point) {
    return point.x;
}
L'on préfère faire point.getX() au lieu de getX(point), comme l'on préfère faire cos(1) au lieu de 1.cos(), mais ce n'est qu'une question de notation.
TL;DR: Les méthodes et les fonctions sont des fonctions ; même si dans ce cas-là « méthode » est plus précis, je préfère utiliser le nom utilisé en mathématiques niveau collège/lycée ; « méthode » est plus niveau post-bac.

Car je veux dire ok je peux faire un Bukkit.getPlayer(UUID) mais comment je récupère l'UUID du joueur qui a effectué la commande ? Je suis obligé de passer par une HashMap, non ?
Tu peux utiliser une HashMap, mais celle-ci est déjà contenue dans le serveur — c'est redondant d'en créer une seconde alors qu'il y en a déjà une.

Si tu veux simplement récupérer l'UUID d'un joueur à partir de son nom, il te suffit de passer par Bukkit :
Java:
String playerName = ...;
UUID playerId = Bukkit.getOfflinePlayer(playerName).getUniqueID();

Ou si tu es dans une commande, tu as normalement un paramètre CommandSender sender, et il te suffit de convertir celui-ci en joueur :
Java:
if(sender instanceof Player) {
    UUID playerId = ((Player) sender).getUniqueId();
}
 

Bizu

Bucheron
21 Juillet 2020
22
0
13
24
Merci de ces informations, mais je pense que tu ( je me permet le tutoiement ) a mal compris quelque chose :

Je veux stocker un Joueur qui a éxécuté une commande PUIS le récupérer dans un event, c'est à dire que je ne peux pas faire
String playerName = ...;
étant donné que je ne connais pas le pseudo du joueur :/ c'est pour ça que je souhaitais faire une Hashmap
 

ShE3py

Enbogueuse
Support
26 Septembre 2015
4 087
157
456
247
21
Mìlhüsa
Tu peux récupérer le joueur depuis un évènement, je peux te dire comment t'y prendre si tu me donnes le nom de l'évènement en question.