Plugin inventaire setItem(Spawner)

DidouSandy

Bucheron
27 Novembre 2018
4
1
12
36
Bonjour,

Je suis en train de créer un inventaire mais j'ai un problème pour le spawner, comment faire pour que ce soit un spawner à vache, mouton, autres... :

Code:
Inventory inv = Bukkit.createInventory(null, 27,"§8MAGASIN MARQUIS"); 
inv.setItem(11, getItem(Material.SPAWNER,"Spawner vache","Prix : 50 000€"));

public ItemStack getItem(Material material, String customName, String prix) {
     
       ItemStack it = new ItemStack(material,1);
       ItemMeta itM = it.getItemMeta();
       itM.setDisplayName(customName);
       itM.setLore(Arrays.asList(prix));
       itM.addItemFlags(ItemFlag.HIDE_ATTRIBUTES);
       it.setItemMeta(itM);
     
return it;
     
   }

Merci de votre aide !

Peut être en ajoutant dans ma méthode :

Code:
((CreatureSpawner) itM).setSpawnedType(EntityType.COW);

Je ne pourrais tester que ce soir ma méthode.
Mais je ne suis vraiment pas sur de moi..
 
Dernière édition par un modérateur:

DidouSandy

Bucheron
27 Novembre 2018
4
1
12
36
J'ai une erreur :(

Code:
Caused by: java.lang.ClassCastException: org.bukkit.craftbukkit.v1_13_R2.inventory.CraftMetaBlockState cannot be cast to org.bukkit.block.CreatureSpawner

Je n'ai plus d'erreurs mais j'ai toujours un spawner à cochon jamais l'entité demandé, il y a personne pour m'aider ?

Code:
ItemStack it = new ItemStack(Material.SPAWNER,1);
                                       BlockStateMeta bsm = (BlockStateMeta) it.getItemMeta();
                                       BlockState bs = bsm.getBlockState();
                                       ((CreatureSpawner) bs).setSpawnedType(EntityType.GHAST);
                                       bsm.setBlockState(bs);
                                       bsm.setDisplayName("Spawner ghast");
                                       bsm.addItemFlags(ItemFlag.HIDE_ATTRIBUTES);
                                       it.setItemMeta(bsm);
                                      
                                       player.getInventory().addItem(it);
 
Dernière édition par un modérateur:

DiscowZombie

Développeur
Staff
Modérateur
Support
2 Mars 2017
2 659
1
931
298
Alsace
www.discowzombie.fr
Salut,

enfaite ton code est presque bon à l'exception que tu n'as pas lu la documentation et ça c'est vraiment dommage... car tu aurais tout de suite trouvé la solution.

Le code qui fonctionne est celui-là, je te l’explique juste en dessous !
Code:
        ItemStack item = new ItemStack(Material.SPAWNER, 1);
        BlockStateMeta blockStateMeta = (BlockStateMeta) item.getItemMeta();
        BlockState blockState = blockStateMeta.getBlockState();
        CreatureSpawner spawner = (CreatureSpawner) blockState;

        spawner.setSpawnedType(EntityType.BLAZE);

        blockStateMeta.setBlockState(blockState);
        item.setItemMeta(blockStateMeta);

La seule différence avec ton code est le :
Code:
        blockStateMeta.setBlockState(blockState);

En effet, je ne le sors pas de mon chapeau, je suis juste aller lire la documentation grâce à mon IDE et j'ai vu ça :
/**
* Returns the currently attached block state for this
* item or creates a new one if one doesn't exist.
*
* The state is a copy, it must be set back (or to another
* item) with {@link #setBlockState(org.bukkit.block.BlockState)}
*
* return the attached state or a new state
*/

Comme indiqué (ligne 3), l’orque l'on fait
Code:
blockStateMeta.getBlockState()
on travaille sur une copie et non sur l’objet directement. Par conséquent, il ne faut pas oublier de faire un
Code:
.setBlockState()
sinon nos modifications n'ont servi à rien ! C'est le même fonctionnement pour l'ItemMeta ! ;)

J'espère que c’est plus clair pour toi !


PS: Je me suis permis de mettre en forme tes messages, c'était plutôt illisible.