Bonjour !
Je code un plugin de KitPvP qui permet de charger des kits depuis un fichier kits.yml.
J'ai déjà ouvert un topic concernant les enchantements, pour l'instant qui ne fonctionne pas.
Pour cela, j'ai crée différents objets en java : un objet Armor, un objet Consumables et un dernier objet Weapons. Chacun de ces objets sont des listes d'ItemStack, excepté l'armor, dont j'attribue directement les valeurs : ItemStack helmet, chestplate, leggings et boots. Voici les classes de ces 3 objets :
Bon, ensuite, depuis un kits.yml, je charge directement mes données dans les listes du plugin. Le fichier ressemble à ceci (Je n'ai pas mis le kit en entier, juste quelque éléments histoire de tester) :
Et je charge les données dans le plugin avec la classe suivante (là ca se complique déjà un peu) :
(Concernant les potions, je les insères grâce aux ID, mais ça n'a pas l'air de fonctionner).
Donc ensuite je crée mon objet Kits kitToLoad avec tous les éléments défini dans la méthode et je le charge dans une ArrayList.
Maintenant viens enfin la partie intéréssante : l'équipement du joueur avec le kit.
Le code ne fonctionne pas, je vous exlique mes tentatives après le code :
(Oui dans mes objets je ne les aient pas mis mais il y a des Getter et des Setter pour chaque éléments).
Bon ce code est bourré de Sysout pour du débeuguage. C'est la ligne if (kit.getKitName().toString() == kitName) qui foire. Si je la laisse, le code n'entre pas dans le if même si la condition est bonne (je suis que c'est bien "archer" qui est vérifié). Voici les sysout avec le if :
Donc c'est bien archer qui est vérifié, ce doit être le kitname qui déconne. mais je ne vois pas où.
Quand j'enlève le if, je n'obtient qu'une armure en fer, non enchantée. Dans les logs, toujours aucune erreur.
Donc je n'obtient que l'armure (dans le bon matériaux ça ça va) mais sans enchantements. Pour l'épée en pierre et la potion, je ne reçois rien. Ce doit être une erreur dans les HashMap et les ArrayList mais je ne vois pas où.
Sauriez-vous donc pourquoi je ne reçois ni les enchantements, ni les consomables ni les enchantes ?
Voilà !
En espérant avoir donné suffisament de détails et de précisions. Sinon je vous donnerai ce qui vous manque
Merci d'avance !
AlexFatta
Je code un plugin de KitPvP qui permet de charger des kits depuis un fichier kits.yml.
J'ai déjà ouvert un topic concernant les enchantements, pour l'instant qui ne fonctionne pas.
Pour cela, j'ai crée différents objets en java : un objet Armor, un objet Consumables et un dernier objet Weapons. Chacun de ces objets sont des listes d'ItemStack, excepté l'armor, dont j'attribue directement les valeurs : ItemStack helmet, chestplate, leggings et boots. Voici les classes de ces 3 objets :
Code:
//Armor
import org.bukkit.inventory.ItemStack;
public class Armor {
private ItemStack helmet, chestplate, leggings, boots;
public Armor() {
}
public Armor (ItemStack helmet, ItemStack chestplate, ItemStack leggings, ItemStack boots) {
this.helmet = helmet;
this.chestplate = chestplate;
this.leggings = leggings;
this.boots = boots;
}
Code:
//Consumables
package fr.alexfatta.kitpvp.kitManager.kitObjects;
import java.util.HashMap;
import org.bukkit.inventory.ItemStack;
public class Consumables {
private ItemStack potion1, potion2, potion3, food;
private int potions_slot, food_slot;
private static HashMap<ItemStack, Integer> mapConsumables = new HashMap<>();
public Consumables(){
}
public Consumables(HashMap<ItemStack, Integer> listOfConsumables) {
Consumables.mapConsumables = listOfConsumables;
}
public Consumables(ItemStack potion1, Integer potions_slot, HashMap<ItemStack, Integer> listOfConsumables) {
this.potion1 = potion1;
this.setPotions_slot(potions_slot);
Consumables.mapConsumables = listOfConsumables;
}
public Consumables(ItemStack potion1, ItemStack potion2, Integer potions_slot, HashMap<ItemStack, Integer> listOfConsumables) {
this.potion1 = potion1;
this.potion2 = potion2;
this.setPotions_slot(potions_slot);
Consumables.mapConsumables = listOfConsumables;
}
public Consumables(ItemStack potion1, ItemStack potion2, ItemStack potion3, Integer potions_slot, HashMap<ItemStack, Integer> listOfConsumables) {
this.potion1 = potion1;
this.potion2 = potion2;
this.potion3 = potion3;
this.setPotions_slot(potions_slot);
Consumables.mapConsumables = listOfConsumables;
}
Code:
//Weapons
import java.util.ArrayList;
import org.bukkit.inventory.ItemStack;
public class Weapons {
private static ArrayList<ItemStack> listWeapons = new ArrayList<>();
public Weapons() {
}
public Weapons(ArrayList<ItemStack> mapWeapons) {
Weapons.listWeapons = mapWeapons;
}
Bon, ensuite, depuis un kits.yml, je charge directement mes données dans les listes du plugin. Le fichier ressemble à ceci (Je n'ai pas mis le kit en entier, juste quelque éléments histoire de tester) :
Code:
kits:
archer:
Helmet:
name: Helmet
type: IRON_HELMET
enchants: PROTECTION_ENVIRONMENTAL,1; PROTECTION_PROJECTILE,2
Chestplate:
name: Chestplate
type: IRON_CHESTPLATE
enchants: PROTECTION_ENVIRONMENTAL,1; PROTECTION_PROJECTILE,2
Leggings:
name: Leggings
type: IRON_LEGGINGS
enchants: PROTECTION_ENVIRONMENTAL
Boots:
name: Boots
type: IRON_BOOTS
enchants: PROTECTION_ENVIRONMENTAL
Potions:
name: '&4Example of potion'
type: 8197
enchants: PROTECTION_ENVIRONMENTAL
slot (Only if this element IS NOT an armor piece || number between 0 and 35): 1
number (consumables like food or potions only): 2
Sword:
name: Example of Sword
type: STONE_SWORD
enchants: DAMAGE_ALL,4
Et je charge les données dans le plugin avec la classe suivante (là ca se complique déjà un peu) :
(Concernant les potions, je les insères grâce aux ID, mais ça n'a pas l'air de fonctionner).
Code:
package fr.alexfatta.kitpvp.kitManager;
import java.util.ArrayList;
import java.util.HashMap;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import fr.alexfatta.kitpvp.Main;
import fr.alexfatta.kitpvp.fileManager.FileManager;
import fr.alexfatta.kitpvp.kitManager.kitObjects.Armor;
import fr.alexfatta.kitpvp.kitManager.kitObjects.Consumables;
import fr.alexfatta.kitpvp.kitManager.kitObjects.Weapons;
import fr.alexfatta.kitpvp.kitManager.listConsumables.ListConsumables;
import fr.alexfatta.kitpvp.kitManager.listWeapons.ListOfWeapons;
/*
*kits
* Example_of_kits:
Helmet:
name: 'Helmet'
type: IRON_HELMET
enchants: PROTECTION_ENVIRONMENTAL, 1; PROTECTION_PROJECTILE, 2
slot (Only if this element IS NOT an armor piece || number between 0 and 35): 0
number (consumables like food or potions only): 0
*/
public class LoadKits {
private static ArrayList<Kits> loadedKits = new ArrayList<>();
private static Main main;
public static void loadKit() {
//On récupère le nom et la section du Kit à charger
for (String kitName : FileManager.getKits().getConfigurationSection("kits").getValues(false).keySet()) {
int totalPotionNumber = 1;
int totalWeaponNumber = 0;
Armor armor = new Armor();
HashMap<ItemStack, Integer> mapConsumables = new HashMap<>();
ArrayList<ItemStack> mapWeapons = new ArrayList<>();
Consumables consumables = new Consumables(mapConsumables);
Weapons weapons = new Weapons();
//On récupère l'élément à charger du kit en chargement
for (String elementName : FileManager.getKits().getConfigurationSection("kits." + kitName).getValues(false).keySet()) {
//On définit le type, le slot et le nombre d'item.
final String itemName = FileManager.getKits().getString("kits." + kitName + "." + elementName + ".name").replace('&', '§');
final String type = FileManager.getKits().getString("kits." + kitName + "." + elementName + ".type");
final int slot = FileManager.getKits().getInt("kits." + kitName + "." + elementName + ".slot (Only if this element IS NOT an armor piece || number between 0 and 35)");
final int numberOfItem = FileManager.getKits().getInt("kits." + kitName + "." + elementName + ".number (consumables like food or potions only)");
//C'est une arme, un consommable ou une armure
if (FileManager.getKits().get("kits." + kitName + "." + elementName + ".type") instanceof String) {
ItemStack element = new ItemStack(Material.getMaterial(FileManager.getKits().getString("kits." + kitName + "." + elementName + ".type")));
//On vient définir element sur l'une des pièces d'armure
switch (elementName) {
case "Helmet":
ItemStack helmet = new ItemStack(Material.getMaterial(FileManager.getKits().getString("kits." + kitName + "." + elementName + ".type")));
armor.setHelmet(helmet);
break;
case "Chestplate":
ItemStack chestplate = new ItemStack(Material.getMaterial(FileManager.getKits().getString("kits." + kitName + "." + elementName + ".type")));
armor.setChestplate(chestplate);
break;
case "Leggings":
ItemStack leggings = new ItemStack(Material.getMaterial(FileManager.getKits().getString("kits." + kitName + "." + elementName + ".type")));
armor.setLeggings(leggings);
break;
case "Boots":
ItemStack boots = new ItemStack(Material.getMaterial(FileManager.getKits().getString("kits." + kitName + "." + elementName + ".type")));
armor.setBoots(boots);
break;
default:
break;
}
//Verification si l'objet est un consommables.
for (Material m : ListConsumables.getConsumables()) {
if (m.equals(Material.getMaterial(type))) {
ItemStack ISToAddConsumables = new ItemStack(Material.getMaterial(type), numberOfItem);
mapConsumables.put(ISToAddConsumables, slot);
}
}
Consumables.setMapConsumables(mapConsumables);
//Verification si l'objet est une arme
for (Material m : ListOfWeapons.getWeaponsList()) {
if (m.equals(Material.getMaterial(type))) {
ItemStack ISToAddWeapon = new ItemStack(Material.getMaterial(type), numberOfItem);
mapWeapons.add(ISToAddWeapon);
totalWeaponNumber += 1;
}
}
Weapons.setListWeapons(mapWeapons);
//Enchantements
try {
String enchantements = FileManager.getKits().getString("kits." + kitName + "." + elementName + ".enchants");
String strEnchant[] = enchantements.split(";");
final ItemMeta meta = element.getItemMeta();
meta.setDisplayName(itemName);
for (String enchant : strEnchant) {
String strPower[] = enchant.split(",");
Enchantment objEnch = Enchantment.getByName(strPower[0]);
final int power;
if (strPower.length == 2) {
power = Integer.parseInt(strPower[1]);
} else {
power = 1;
}
meta.addEnchant(objEnch, power, true);
}
element.setItemMeta(meta);
} catch (NullPointerException e) {
e.printStackTrace();
}
} //Fin du String
//C'est une potion
else if (FileManager.getKits().get("kits." + kitName + "." + elementName + ".type") instanceof Integer) {
int potionID = FileManager.getKits().getInt("kits." + kitName + "." + elementName + ".type");
int slotOfPotion = FileManager.getKits().getInt("kits." + kitName + "." + elementName + ".slot (Only if this element IS NOT an armor piece || number between 0 and 35)");
int numberOfPotion = FileManager.getKits().getInt("kits." + kitName + "." + elementName + ".number (consumables like food or potions only)");
ItemStack potion = new ItemStack(Material.POTION, numberOfPotion, (short) potionID);
switch (totalPotionNumber) {
case 1:
consumables.setPotion1(potion);
totalPotionNumber += 1;
break;
case 2:
consumables.setPotion2(potion);
totalPotionNumber += 1;
break;
case 3:
consumables.setPotion3(potion);
totalPotionNumber += 1;
break;
default:
numberOfPotion = 1;
break;
}
consumables.setPotions_slot(slotOfPotion);
//Créer les objets Armor, consommable et weapons
//Puis créer l'objet kit
} //Fin de l'Integer
} //Fin de la boucle elementName
//Coder la partie des armes
Kits kitToLoad = new Kits(armor, weapons, totalWeaponNumber, totalPotionNumber, consumables, kitName);
loadedKits.add(kitToLoad);
ConsoleCommandSender sender = Bukkit.getServer().getConsoleSender();
sender.sendMessage(ChatColor.GREEN + "Kit " + ChatColor.YELLOW + kitToLoad.getKitName() + ChatColor.GREEN + " saved with success !");
} //Fin de la boucle kitName
}
public static Main getMain() {
return main;
}
public static void setMain(Main main) {
LoadKits.main = main;
}
public static ArrayList<Kits> getLoadedKits() {
return loadedKits;
}
public void setLoadedKits(ArrayList<Kits> loadedKits) {
LoadKits.loadedKits = loadedKits;
}
}
Donc ensuite je crée mon objet Kits kitToLoad avec tous les éléments défini dans la méthode et je le charge dans une ArrayList.
Maintenant viens enfin la partie intéréssante : l'équipement du joueur avec le kit.
Le code ne fonctionne pas, je vous exlique mes tentatives après le code :
Code:
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import fr.alexfatta.kitpvp.kitManager.kitObjects.Consumables;
import fr.alexfatta.kitpvp.kitManager.kitObjects.Weapons;
public class EquipPlayerWithKit {
public static void equipKit (String kitName, Player player) {
System.out.println("Début de l'équipement");
int slotNumber = 0;
int i = 0;
while (i < LoadKits.getLoadedKits().size()) {
System.out.println("Boucle while " + i);
//ajouter une sécurité pour le nom du kit
Kits kit = LoadKits.getLoadedKits().get(i);
System.out.println(kit.getKitName());
if (kit.getKitName().toString() == kitName) {
System.out.println("Entrer if");
//Armor
player.getInventory().setHelmet(kit.getHelmet());
player.getInventory().setChestplate(kit.getChestplate());
player.getInventory().setLeggings(kit.getLeggings());
player.getInventory().setBoots(kit.getBoots());
//Armes
for (int j = 0; j < Weapons.getListWeapons().size(); j++) {
player.getInventory().setItem(j, Weapons.getListWeapons().get(j));
slotNumber += 1;
}
//Consommables
for (ItemStack isConsumables : Consumables.getMapConsumables().keySet()) {
player.getInventory().setItem(slotNumber, isConsumables);
slotNumber += 1;
}
player.sendMessage(ChatColor.GRAY + "Kit " + kit.getKitName() + " recu avec succès !");
}
i++;
}
}
}
(Oui dans mes objets je ne les aient pas mis mais il y a des Getter et des Setter pour chaque éléments).
Bon ce code est bourré de Sysout pour du débeuguage. C'est la ligne if (kit.getKitName().toString() == kitName) qui foire. Si je la laisse, le code n'entre pas dans le if même si la condition est bonne (je suis que c'est bien "archer" qui est vérifié). Voici les sysout avec le if :
Code:
[14:55:08 INFO]: Début de l'équipement
[14:55:08 INFO]: Boucle while 0
[14:55:08 INFO]: Example_of_kits
[14:55:08 INFO]: Boucle while 1
[14:55:08 INFO]: archer
Donc c'est bien archer qui est vérifié, ce doit être le kitname qui déconne. mais je ne vois pas où.
Quand j'enlève le if, je n'obtient qu'une armure en fer, non enchantée. Dans les logs, toujours aucune erreur.
Donc je n'obtient que l'armure (dans le bon matériaux ça ça va) mais sans enchantements. Pour l'épée en pierre et la potion, je ne reçois rien. Ce doit être une erreur dans les HashMap et les ArrayList mais je ne vois pas où.
Sauriez-vous donc pourquoi je ne reçois ni les enchantements, ni les consomables ni les enchantes ?
Voilà !
En espérant avoir donné suffisament de détails et de précisions. Sinon je vous donnerai ce qui vous manque

Merci d'avance !
AlexFatta