Custom mob spawn

RedHeadEmile

Codeur Java qui code en Java
6 Novembre 2015
121
1
130
Bonjour/Bonsoir,
J'aimerais savoir si on pouvait faire une mob spawner (donc avec CreatureSpawner block) d'une entité custom ? (car le block.setSpawnedType ne permet de mettre qu'une entité)
 

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,

Qu'as-tu comme code ?
Je n'ai jamais fait joujou avec les mobs spawner, mais j'ai trouvé ça: https://github.com/vemacs/Essential...om/earth2me/essentials/utils/SpawnerUtil.java
Il semblerait qu'il te suffise d'avoir qqch comme ça:
PHP:
public static getMobSpawner(EntityType type) {
    ItemStack is = new ItemStack(Material.MOB_SPAWNER, 1);
    ItemMeta meta = is.getItemMeta();
    if(meta instanceof BlockStateMeta) {
        BlockStateMeta bsm = (BlockStateMeta) is.getItemMeta();
        BlockState bs = bsm.getBlockState();
        ((CreatureSpawner) bs).setSpawnedType(type);
        bsm.setBlockState(bs);
        is.setItemMeta(bsm);
    } else {
        is.getData().setData((byte) type.ordinal());
    }

   return is;
}


Cordialement,
Detobel36
 

RedHeadEmile

Codeur Java qui code en Java
6 Novembre 2015
121
1
130
Actuellement, je suis sur ça :
Code:
            Block b = ((Player) sender).getLocation().getBlock();
            b.setType(Material.MOB_SPAWNER);
           
            ((CreatureSpawner) b.getState()).setSpawnedType(EntityType.<type>);
C'est a dire pas grand chose, moi, ce que j'aimerais, c'est pouvoir mettre (example:) un zombie avec un casque en diamant avec une épée sharpness 10, ce genre de chose..
 

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,

Ha ok...
Je vois deux solutions (je n'en ai testé aucune et il y en a surement d'autres):
  1. Via du NMS (je te laisse faire une recherche sur ce que c'est)
    Tu va créer un nouveau EntityType (en faisant un héritage de l'entityType qui t'intéresse (le Zombie par exemple)). Il te suffira de définir que ce nouvel objet EntityType définit un zombie avec les paramètres se trouvant dans la config ou tout simplement de manière fixe dans le plugin
  2. Via les events et une base de donnée:
    Ici on reste dans du développement classique spigot/bukkit. Le but est d'utiliser l'event "SpawnerSpawnEvent" qui est appelé lorsqu'un mob spawn grâce à un spawner.
    Il te suffit, lorsque le joueur pose cet spawner (ou que tu le summon) de détecter (avec le nom ou le lore qu'il avait) quel type de spawner c'était (donc on enregistre le type de spawner dans les metadata de l'itemstack) et d'enregistrer les coordonnées de ce spawner dans une base de donnée (soit SQL, soit un fichier, soit... ce que tu veux :p ).
    Il te suffira donc, lorsque l'event se produit, de faire un "event.getSpawner()" pour avoir la location du spawner, voir si cette location se trouve dans ta base de donnée et quel type de mob il faut faire spawner. Si ce n'est pas dans ta base de donnée, tu laisses le spawn par défaut.

La méthode 1 à l'avantage de devoir stocker moins de choses mais n'est pas cool à dev (sauf si on aime le NMS xD).
La seconde méthode est plus classique mais est un peu moins "jolie" niveau développement (même si c'est subjectif :p ). Il y a quand même le désavantage avec cette solution (la 2 donc) de devoir stocker beaucoup d'information et de prendre plusieurs cas en compte (destruction du spawner, comment avoir ce spawner (renommer, ...), que faire si un joueur essaye le renommer (anvil)).


Cordialement,
Detobel36