Refill chests

LEZIKO

Architecte en herbe
2 Novembre 2021
93
2
69
19
Bonjour/ Bonsoir,

Je viens demander de l'aide car j'ai un petit soucis j'ai fais des coffres avec des items randoms mais ne pouvant pas enregistrer des blocks dans la config.yml je suis bloqué et à chaque reload faut re set les coffres, je met ci-dessous ce que j'ai fait, merci d'avance pour votre aide :)

public static void RandomItems(){


for(Chunk chunk : Bukkit.getWorld("sw1").getLoadedChunks()){

for(BlockState bs : chunk.getTileEntities()){

Chest chest = (Chest) bs.getBlock().getState();
Inventory chestinv = chest.getInventory();
chestinv.clear();

Random swrd = new Random();
int swordlist = swrd.nextInt(3);

Random equipement = new Random();
int equipe = equipement.nextInt(15);

Random equipement2 = new Random();
int equipe2 = equipement2.nextInt(15);

Random block = new Random();
int blockk = equipement.nextInt(blocks.size() - 1);

Random food = new Random();
int foodlist = food.nextInt(foodliste.size() - 1);

Random t1 = new Random();
int t1list = t1.nextInt(tier1.size() - 1);

Random t11 = new Random();
int t11list = t11.nextInt(tier1.size() - 1);

Random t111 = new Random();
int t111list = t111.nextInt(tier1.size() - 1);

Random t1111 = new Random();
int t1111list = t1111.nextInt(tier1.size() - 1);

Random t2 = new Random();
int t2list = t2.nextInt(tier2.size() - 1);

Random t22 = new Random();
int t22list = t22.nextInt(tier2.size() - 1);

Random t222 = new Random();
int t222list = t222.nextInt(tier2.size() - 1);

Random t2222 = new Random();
int t2222list = t2222.nextInt(tier2.size() - 1);

Random t22222 = new Random();
int t22222list = t22222.nextInt(tier2.size() - 1);

Random t222222 = new Random();
int t222222list = t222222.nextInt(tier2.size() - 1);

Random t2222222 = new Random();
int t2222222list = t2222222.nextInt(tier2.size() - 1);

Random rand = new Random();
int n = rand.nextInt(44) + 1;

Random rd1 = new Random();
Random rd2 = new Random();
Random rd3 = new Random();
Random rd4 = new Random();
Random rd5 = new Random();
Random rd6 = new Random();
Random rd7 = new Random();
Random rd8 = new Random();
Random rd9 = new Random();

int invMax = chestinv.getSize() - 1;
int Randomslot1 = rd1.nextInt(invMax);
int Randomslot2 = rd2.nextInt(invMax);
int Randomslot3 = rd3.nextInt(invMax);
int Randomslot4 = rd4.nextInt(invMax);
int Randomslot5 = rd5.nextInt(invMax);
int Randomslot6 = rd6.nextInt(invMax);
int Randomslot7 = rd7.nextInt(invMax);
int Randomslot8 = rd8.nextInt(invMax);
int Randomslot9 = rd9.nextInt(invMax);



if(main.getConfig().getList("Level1").contains(bs.getBlock().getLocation())){


chestinv.setItem(Randomslot1, swords.get(swordlist));
chestinv.setItem(Randomslot2, equip.get(equipe));
chestinv.setItem(Randomslot3, equip.get(equipe2));
chestinv.setItem(Randomslot4, blocks.get(blockk));
chestinv.setItem(Randomslot5, foodliste.get(foodlist));


chestinv.setItem(Randomslot6, tier1.get(t1list));
chestinv.setItem(Randomslot7, tier1.get(t11list));
chestinv.setItem(Randomslot8, tier1.get(t111list));
chestinv.setItem(Randomslot9, tier1.get(t1111list));


}else if(main.getConfig().getList("Level2").contains(bs.getBlock().getLocation())){

chestinv.setItem(Randomslot1, tier2.get(t2list));
chestinv.setItem(Randomslot2, tier2.get(t22list));
chestinv.setItem(Randomslot3, tier2.get(t222list));
chestinv.setItem(Randomslot4, tier2.get(t2222list));
chestinv.setItem(Randomslot5, tier2.get(t22222list));
chestinv.setItem(Randomslot6, tier2.get(t222222list));
chestinv.setItem(Randomslot7, tier2.get(t2222222list));
chestinv.setItem(Randomslot8, blocks.get(blockk));
chestinv.setItem(Randomslot9, foodliste.get(foodlist));


}

}

}

}

Cordialement,

LEZIKO
 

Detobel36

Créateur de plugins (PhoenixRebirth)
Support
17 Août 2012
10 530
24
2 247
347
27
Bruxelles - Belgique
www.phoenix-rebirth.fr
Salut,

Bon, tout d'abord, la prochaine fois que tu envoies du code. Fait le en utilisant des balises "code".

Ensuite, pas besoin de faire un "new Random" à chaque fois. Tu peux utiliser le même (c'est même mieux).

Enfin, il faudrait que tu nous décrives ton problème... La tu nous dit:
ne pouvant pas enregistrer des blocks dans la config.yml
Pourquoi ? Qu'est-ce qui te bloque ? Tu as une erreur ?
à chaque reload faut re set les coffres
C'est à dire ? Tu reload et ? Le contenu des coffres ne peut pas être supprimé... C'est pas possible ça.

Enfin, dans ton code tu as des variables qu'on ne connait pas... C'est compliqué de t'aider du coup.
(typiquement "swords", "equip", "tier1"...).

Je pense que ton code peut être simplifié...
Java:
public class TaClasse {

    private static final Random random = new Random();

    public static void RandomItems() {

        for (final Chunk chunk : Bukkit.getWorld("sw1").getLoadedChunks()) {
            for (final BlockState bs : chunk.getTileEntities()) {
                if (bs.getBlock().getState() instanceof Chest) {
                    final Chest chest = (Chest) bs.getBlock().getState();
                    final Inventory chestinv = chest.getInventory();
                    chestinv.clear();

                    int invMax = chestinv.getSize() - 1;
                    if (main.getConfig().getList("Level1").contains(bs.getBlock().getLocation())) {
                        final List<List<ItemStack>> listItems = Arras.asList(swords, equip, equip, blocks, foodliste, tier1, tier1, tier1, tier1);

                        for (final List<ItemStack> item : listItems) {
                            final int randomSlot = random.nextInt(invMax);
                            chestinv.setItem(randomSlot, item.get(random.nextInt(item.size())));
                        }

                    } else if(main.getConfig().getList("Level2").contains(bs.getBlock().getLocation())) {
                        final List<List<ItemStack>> listItems = Arras.asList(tier2, tier2, tier2, tier2, tier2, tier2, tier2, blocks, foodliste);

                        for (final List<ItemStack> item : listItems) {
                            final int randomSlot = random.nextInt(invMax);
                            chestinv.setItem(randomSlot, item.get(random.nextInt(item.size())));
                        }
                    }
                }
            }
        }

    }
    
}


Cordialement,
Detobel36
 

LEZIKO

Architecte en herbe
2 Novembre 2021
93
2
69
19
Hello !

Merci pour ta réponse et désolé pour mes erreurs, enfaite le problème et que quand la config se reload ça me met une erreur " Cannot load plugins/ArmaWars/config.yml org.bukkit.configuration.InvalidConfigurationException: could not determine a constructor for the tag tag:yaml.org,2002:org.bukkit.craftbukkit.v1_16_R3.block.CraftBlock", pour ce qui est du random j'ai sûrement mal fait les choses mais au début quand je n'en mettais qu'un, il me mettait toujours le même random alors je ne savais pas trop quoi faire, pour la config avec cette erreur il me supprime tout ce qui est dans la config donc tous les spawns également voilà pourquoi je voulais demander de l'aide enfaite à chaque reload fallait que je re set les coffres.

Cordialement,

LEZIKO
 

ShE3py

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

Un coffre contient des items et non des blocs, alors c'est déjà une erreur de logique de vouloir sauvegarder un ItemStack en Block parce que tu perdras à coup sûr des données (nom custom, enchantement, ...).

Quant à l'erreur d'exécution, peux-tu décrire ce que tu veux faire ? Tu nous donnes des variables swords / equip / foodliste / blocks / tier1 / tier2 sans nous dire ce qu'elles sont censées contenir, je suppose que tu souhaites mettre une certaine quantité d'objets appartenant à une certaine catégorie ?

Cordialement,
ShE3py
 

LEZIKO

Architecte en herbe
2 Novembre 2021
93
2
69
19
Bonjour,

Un coffre contient des items et non des blocs, alors c'est déjà une erreur de logique de vouloir sauvegarder un ItemStack en Block parce que tu perdras à coup sûr des données (nom custom, enchantement, ...).

Quant à l'erreur d'exécution, peux-tu décrire ce que tu veux faire ? Tu nous donnes des variables swords / equip / foodliste / blocks / tier1 / tier2 sans nous dire ce qu'elles sont censées contenir, je suppose que tu souhaites mettre une certaine quantité d'objets appartenant à une certaine catégorie ?

Cordialement,
ShE3py
hello !

Enfaite, je voulais en faisant clique droit avec un baton sur un coffre l'ajouter dans une liste (level 1 / level 2) pour qu'après tous les coffres se remplissent des items comme tu l'as compris dans les catégories swords/equip... donc je stockait les deux listes dans la config mais ça ne se sauvegarder pas du coup à cause de l'erreur

Je ne sais pas si j'ai été clair xD,

Cordialement,

LEZIKO
 

ShE3py

Enbogueuse
Support
26 Septembre 2015
4 087
157
455
247
21
Mìlhüsa
Donc tu ne veux pas vraiment sauvegarder le bloc en lui-même mais plutôt ses coordonnées pour pouvoir y accéder plus tard ; tu ne peux pas sauvegarder le bloc car celui-ci doit être unique, s'il te laissait faire et qu'il se retrouverait avec deux blocs différents aux mêmes coordonnées parce que depuis que ton fichier de configuration a été sauvegardé le monde a changé, ça serait un peu embêtant.

De plus, au lieu de copier-coller ton code pour chaque catégorie, ce serait mieux d'abstraire ça dans une énumération :
Java:
public enum LootCategory {
   SWORDS,
   FOOD;
}

Et de stocker tous tes items dans un tableau associatif :
Java:
Map<LootCategory, List<ItemStack>> items = new EnumMap<>(LootCategory.class);

Enfin, en prenant plusieurs nombres aléatoirement pour les indices des slots, tu risques très fortement de te retrouver avec 2+ fois le même indice. L'idée est de passer par une liste auxiliaire et de mélanger aléatoirement celle-ci à la place.
Java:
// liste de tous les slots de 0 à 35
List<Integer> slots = Arrays.asList(IntStream.range(0, 36).boxed().toArray(Integer[]::new)); // mutable + RandomAccess

// on mélange la liste
Collections.shuffle(slots);

// on prend le premier indice dans la liste mélangée
inventory.setItem(slots.get(0), new ItemStack(Material.WHITE_WOOL));
 
Dernière édition:

LEZIKO

Architecte en herbe
2 Novembre 2021
93
2
69
19
Donc tu ne veux pas vraiment sauvegarder le bloc en lui-même mais plutôt ses coordonnées pour pouvoir y accéder plus tard ; tu ne peux pas sauvegarder le bloc car celui-ci doit être unique, s'il te laissait faire et qu'il se retrouverait avec deux blocs différents aux mêmes coordonnées parce que depuis que ton fichier de configuration a été supprimé, ça serait un peu embêtant.

De plus, au lieu de copier-coller ton code pour chaque catégorie, ce serait mieux d'abstraire ça dans une énumération :
Java:
public enum LootCategory {
   SWORDS,
   FOOD;
}

Et de stocker tous tes items dans un tableau associatif :
Java:
Map<LootCategory, List<ItemStack>> items = new EnumMap<>(LootCategory.class);

Enfin, en prenant plusieurs nombres aléatoirement pour les indices des slots risque, tu risques très fortement de te retrouver avec 2+ fois le même indice. L'idée est de passer par une liste auxiliaire et de mélanger aléatoirement celle-ci à la place.
Java:
// liste de tous les slots de 0 à 35
List<Integer> slots = Arrays.asList(IntStream.range(0, 36).boxed().toArray(Integer[]::new)); // mutable + RandomAccess

// on mélange la liste
Collections.shuffle(slots);

// on prend le premier indice dans la liste mélangée
inventory.setItem(slots.get(0), new ItemStack(Material.WHITE_WOOL));
en effet ça a fonctionné ! merci !