Spawner une entité Minecraft

Nairolf_

Nairolf
15 Juillet 2020
66
4
35
24
www.youtube.com
Bonjour,
Je suis actuellement en train de développer un jeu pour mon serveur Minecraft.
Je ne vais pas dire le but du jeu pour l’instant, mais j’ai besoin de faire spawner un poulpe (en Java).
En gros, je veux que mon poulpe spawn, soit renommé, et qu’il n’ai pas d’IA.
J’aimerai aussi comment exécuter des commandes dessus. Par example, si il est frappé, je veux qu’il revienne à sa position d’origine, et que si il meurt, il fait une autre commande.
Seul problème, je sais pas comment faire.
Sans ça, je ne peux pas continue mon plugin.
Merci de votre aide,
Cordialement,
Nairolf
 
Dernière édition:

ShE3py

Enbogueuse
Support
26 Septembre 2015
4 139
163
464
247
21
Mìlhüsa
Bonsoir,

Il suffit de passer par World#spawn(Location, Class<T>, Consumer<T>): T ;
Java:
World world = Bukkit.getWorld("world");
if(world == null)
   throw new NullPointerException();

world.spawn(new Location(world, 0, 0, 0), Squid.class, squid -> {
   squid.setCustomName("§cMon superbe poulpe");
   squid.setAI(false);
   squid.addScoreboardTag("monplugin_supersquid");
   
   // le tag doit être unique, donc préfixe-le bien de ton plugin pour éviter les collisions
   // rq: la fonction rentounera `false` si la limite des 1024 tags est atteinte OU que le tag est déjà présent
});

Pour ensuite vérifier s'il s'agit d'un mob custom, l'idée est simplement de lui rajouter un tag unique.
Java:
@EventHandler
public void onEntityDamage(EntityDamageEvent e) {
   if(e.getEntity().getScoreboardTags().contains("monplugin_supersquid")) {
      // c'est notre poulpe
      e.setCancelled(true);
   }
   
   // rq: je suis sous Spigot 1.14, ils ont peut-être rajouté un accès direct Entity#hasScoreboardTag(String)
}

Cordialement,
ShE3py
 

Nairolf_

Nairolf
15 Juillet 2020
66
4
35
24
www.youtube.com
Bonsoir,
Excusez moi de la réponse tardive (je ne suis pas enormement disponible en ce moment, désole) :fou:
Le code marche très bien, mais je fait face a un problème, getScoreBoardTags() ne marche malheureusement pas. Le problème vient de la version de Spigot, je suis sous 1.8.8, et cela n'existe pas encore. J'ai eu le même problème sur setAi(false), mais je me suis débrouille avec ça (si ça peut aider quelqu'un):
void noAI(Entity bukkitEntity) { net.minecraft.server.v1_8_R3.Entity nmsEntity = ((CraftEntity) bukkitEntity).getHandle(); NBTTagCompound tag = nmsEntity.getNBTTag(); if (tag == null) { tag = new NBTTagCompound(); } nmsEntity.c(tag); tag.setInt("NoAI", 1); nmsEntity.f(tag); }

Quel est l'equivalent de addScoreBoardTags() et getScoreBoardTags() en 1.8
Merci de votre aide :merci
Bien cordialement
Nairolf
 
Dernière édition:

ShE3py

Enbogueuse
Support
26 Septembre 2015
4 139
163
464
247
21
Mìlhüsa
A priori tu peux aussi passer par les métadonnées.
Java:
squid.setMetadata("monplugin_supersquid", new FixedMetadataValue(plugin, 0 /* la valeur n'a pas d'importance */));
squid.hasMetadata("monplugin_supersquid");

Ça marche aussi pour les blocs et les mondes, pas les items par contre.