Plusieurs questions/problèmes
-
-
C’est parce-que j’ai trop modifié le code de BrokenSwing, quand tu mets une liste en itération (ici c’est via le for), on ne peut pas la modifier or le spawnEntity la modifie, donc il faut que tu crées une nouvelle liste avant le for, puis, dans le for, à la place du spawnEntity, tu ajoute l’entité à la liste. Puis après ce for tu fais un autre for cette fois ci avec ta liste à la place de loadedEntityList, et à cette endroit tu fais spawn l’entité (prends exemple sur le code de BrokenSwing).
Envoyé de mon RAINBOW LITE 4G en utilisant Tapatalk
-
C’est pour ça que j’avais créer une liste qui ajoute les entités après avoir parcourue la première
@Aymeric, en fait j’ai fait le code vite fait, et en 1.9 ils ont mis des getters, d’où le getPosition, getWorld, etc … Le crash viens de ton code, quand tu ajoutes l’entité au monde tu la rajoute à la liste que tu est en train de parcourir, il ne faut pas ajouter ou enlever des éléments d’une liste que l’on parcourt, le setDead ne pose pas problème car l’entité sera supprimée seulement au tick d’après, il faut créer une liste d’entité que l’on ajoute après avoir parcourue la premièreEDIT : Bah c’est bon, t’avais compris en fait
-
@BrokenSwing oui quand j’ai enlevé ton deuxième for j’avais pas pensé à ça, mais de toute façon dans le code que t’avais fait ou tu get le code à chaque ligne, il n’y avait pas d’itération (mais maintenant je pense que ça aurait tout fais bug en changeant la taille de la liste sans le second for).
Envoyé de mon RAINBOW LITE 4G en utilisant Tapatalk
-
Salut
J’ai fais comme ça : ```java
@SubscribeEvent
public void apocalypseMobReplace(EntityJoinWorldEvent event)
{
if(ThisisHalloween.apocalypse)
{
final List <entity>spawnEntity = new ArrayList<entity>();
for(Object o : event.world.loadedEntityList)
{
if(event.entity instanceof EntityWolf)
{
EntityWerewolf werewolf = new EntityWerewolf(event.world);
double x = event.entity.posX;
double y = event.entity.posY;
double z = event.entity.posZ;
float rotateX = event.entity.rotationPitch;
float rotateY = event.entity.rotationYaw;event.entity.setDead();
werewolf.setPositionAndRotation(x, y, z, rotateX, rotateY);
spawnEntity.add(werewolf);
}
}
for(int e = 0; spawnEntity.size() > e; e++)
{
event.world.spawnEntityInWorld(spawnEntity.get(e));
}
}
}Résultats : quand ce n'est pas l'apocalypse, je fais spawner un loup, j'active l'apocalypse toujours rien ne se passe. En revanche, quand c'est l'apocalypse et que je fais spawner un loup, il se transforme bien (plus de message d'erreur dans les logs) mais … . En fait juste avant que je fasse spawner, je regarde les débugs, 0 entité. Mais quand je fais spawner, ça met u nombre complétement aléatoire de loup-garou (308, 497, et mon préféré 3806). Mais je ne comprend pas du tout pourquoi ça fait ça Voilà ce que ça fait : :::  Ici, tout les loup-garou sont exactement au même endroit. Mais dès que je fonce dans le toupeau, ...  ::: C'est quand même assez bizarre, bien que marrant sur le coup où ça arrive Merci d'avance</entity></entity> -
Parce que c’est pas comme ça qu’il fallait faire, tu as d’un côté un morceau de code qui doit s’exécuter lorsque l’apocalypse démarre avec le code que tu viens de faire, qui ne va s’exécuter qu’une seule fois, pour changer tout les loups en loup-garous, puis via l’event tu gère les nouveaux loups qui spawns, j’avais dit de ne pas mettre ce code dans l’event. Dans l’event il faut que tu regardes si l’entitée qui spawn est un loup est dans ce cas tu le remplace par un loup-garou, tu n’as pas besoin de boucle
-
J’ai réussi à remplacer les loups déjà existant en loup-garou. Il suffisait d’utiliser l’évent LivingEvent. Ca marche bien maintenant
J’ai essayer ce que tu m’as dit mais je n’arrivais pas à initialiser entity. J’ai fait ```java
Entity entity =Pour les autres problèmes, j'aimerais ne mettre que de l'orage sans la pluie. Or, quand il y a de l'orage, il pleut aussi. Pour l'herbe, je pense abandonné et ne faire qu'un ressource pack (texture pack pour les nostalgique :heart: ) -
Pour l’event, je suppose que tu a fais que la boucle est parcourue à chaque LivingEvent, ce qui n’est pas une bonne idée, pour résoudre ça, mets une boolean dans la classe d’event, puis avant ta boucle, tu mets un
if(taBoolean != LaClasseOuTaLaVariableApocalypse.apocalypse) ``` puis à la fin de la fonction tu fais ```java taBoolean = LaClasseOuTaLaVariableApocalypse.apocalypse; ```, ceci va permettre d’exécuter le code uniquement quand l'apocalypse a été déclenchée (ou arrêtée). Et pour l'event EntityJoinWorldEvent, tu as juste à mettre ce qu'il y a à l'intérieur du for, en changeant "spawnEntity.add(werewolf);" par "event.world.spawnEntityInWorld(wereWolf);" cette fois-ci. -
J’ai déjà fait la variable. Voilà ce que j’ai mis :
@SubscribeEvent public void apocalypseMobReplace(LivingEvent event) { if(ThisisHalloween.apocalypse) { if(event.entity instanceof EntityWolf) { World world = Minecraft.getMinecraft().theWorld; EntityWerewolf werewolf = new EntityWerewolf(world); double x = event.entity.posX; double y = event.entity.posY; double z = event.entity.posZ; float rotateX = event.entity.rotationPitch; float rotateY = event.entity.rotationYaw; event.entity.setDead(); werewolf.setPositionAndRotation(x, y, z, rotateX, rotateY); world.spawnEntityInWorld(werewolf); } } else { // Apocalypse == disable == false Random rand = new Random(); int n = rand.nextInt(3); switch(n) { case 1 : if(event.entity instanceof EntityWerewolf) { event.entity.setDead(); } break; case 2 : if(event.entity instanceof EntityWerewolf) { World world = Minecraft.getMinecraft().theWorld; EntityWolf wolf = new EntityWolf(world); double x = event.entity.posX; double y = event.entity.posY; double z = event.entity.posZ; float rotateX = event.entity.rotationPitch; float rotateY = event.entity.rotationYaw; event.entity.setDead(); wolf.setPositionAndRotation(x, y, z, rotateX, rotateY); world.spawnEntityInWorld(wolf); } } } }Par contre, je viens de voir un bug étrange : je fais spawner des loups quand l’apocalypse est désactiver ils marchent bien. Quand j’active l’apocalypse, ils se changent en loup-garou, mais ils ne bougent pas, quand on les tape ca fait rien et on ne peux pas les pousser. Comme si c’est juste une image et non une entité. Au départ, je m’étais dis que c’étais un énorme lag, mais je peux taper d’autre mob. Même en les faisant spawner par leur oeufs ils marchent bien. C’est pareil pour l’effet inverse (quand je fais spawner des loup-garou, marche bien mais quand je désactive l’apocalypse, ils se transforment en loups qui ne bougent pas, …). Etrange
-
C’est un problème de synchronisation client-serveur : fais attention à toujours faire spawner les mobs côté serveur.
PS : tu n’as toujours pas changé l’emplacement de la variable pour l’apocalypse, le problème peut venir de là donc fait attention à modifier cette valeur (en attendant de passer par un autre système) côté serveur, voir même la mettre en SideOnly
-
Je ne comprend pas pourquoi ça ne marche pas si je le laisse dans la classe principale. Il y a que deux méthodes qui peuvent changer la variable : faire la commande /halloween apocalypse enable ou entrer dans la dimension Frightful. Et les deux sont cotés serveur
-
Dans ton event, vérifie que le code est exécuté côté serveur
-
J’utilise l’event LivingEvent, logiquement ça serait uniquement côté serveur (à moins que je me trompe ? ) mais je peux quand même mettre un sideOnly au cas où
Sinon, je viens de penser, pour le code : ```java
World world = Minecraft.getMinecraft().theWorld; -
Tu n’as peut être pas de World dans l’event mais tu as une entité et grâce à elle tu peux accéder au World et ensuite faire if(!world.isRemote)
-
En effet, la classe Minecraft.getMinecraft() n’est que client.
-
Salut
Désolé pour le temps de la réponse
Il spawn bien côté serveur maintenant, tout marche bien côté mob. Le seul problème, c’est qu’il ne bouge pas les jambes quand il marche. Mais je sais à peu près où c’est.
Merci
Par contre, vous savez comment faire pour mettre de l’orage (donc la foudre + le ciel foncé) mais sans qu’il ne pleuvent ? Parce que à chaque fois que y’a de l’orage il pleut aussi. J’avais pensé à regarder du côté de cheval squelette (et surtout de son spawn) mais le problème c’est qu’il ne spawn pas en 1.8.
Avez vous une idée ?Merci d’avance
PS : Voilà le code pour le mob si d’éventuelles personnes en ont besoin :
@SubscribeEvent public void apocalypseMobReplace(LivingEvent event) { World world = event.entity.worldObj; if(!world.isRemote) { if(ThisisHalloween.apocalypse) { if(event.entity instanceof EntityWolf) { EntityWerewolf werewolf = new EntityWerewolf(world); double x = event.entity.posX; double y = event.entity.posY; double z = event.entity.posZ; float rotateX = event.entity.rotationPitch; float rotateY = event.entity.rotationYaw; event.entity.setDead(); werewolf.setPositionAndRotation(x, y, z, rotateX, rotateY); world.spawnEntityInWorld(werewolf); } } else { // Apocalypse == disable == false Random rand = new Random(); int n = rand.nextInt(3); switch(n) { case 1 : if(event.entity instanceof EntityWerewolf) { event.entity.setDead(); break; } case 2 : if(event.entity instanceof EntityWerewolf) { EntityWolf wolf = new EntityWolf(world); double x = event.entity.posX; double y = event.entity.posY; double z = event.entity.posZ; float rotateX = event.entity.rotationPitch; float rotateY = event.entity.rotationYaw; event.entity.setDead(); wolf.setPositionAndRotation(x, y, z, rotateX, rotateY); world.spawnEntityInWorld(wolf); break; } } } } }EDIT : J’ai modifié le code, le loup buguait : parfois il spawnait côté serveur parfois côté client. Mais j’ai corrigé
EDIT n°2 : J’ai aussi un problème quand je veux désactiver les dégâts de feu pour les zombies et skeletons. Je voudrais qu’ils soient immunisées contre le feu, mais je n’y arrive pas. ```java
@SubscribeEvent
public void vanillaMobs(LivingHurtEvent event)
{
World world = event.entity.worldObj;
EntityZombie zombie = new EntityZombie(world);
EntitySkeleton skeleton = new EntitySkeleton(world);if(!world.isRemote)
{
if(thisishalloween.ThisisHalloween.apocalypse)
{
world.spawnEntityInWorld(zombie);
world.spawnEntityInWorld(skeleton);
if(event.entity instanceof EntityZombie || event.entity instanceof EntitySkeleton)
{
if(event.source != null && event.source == DamageSource.onFire )
{
System.out.println(“onFire”);
}
}
}
}J'ai testé de mettre : ```java event.ammount = 0; event.entity.fireResistance = -1; event.entity.setFire(0); event.entity.isImmuneToFire(); event.entity.isEntityInvulnerable(DamageSource.onFire); event.entity.extinguish(); event.entity.attackEntityFrom(DamageSource.onFire, 0); ``` un par un, de tout mettre en même temps, mais rien ne marche. Pourtant, les conditions marchent toutes bien puisque les logs affichent onFire. Du coup, je sais pas comment les immuniser contre le feu. Merci d'avance PS : d'ailleurs j'ai une question concernant le forum : pourquoi l'indentation n'est sauvegardée seulement que quelques fois ? Quand je colle un code java et que c'est bien indenté, parfois ça aligne tout. Je crois ne pas être le seul, ça arrive à d'autre personne aussi. -
@SubscribeEvent public void vanillaMobs(LivingHurtEvent event) { World world = event.entity.worldObj; if(!world.isRemote) { if(thisishalloween.ThisisHalloween.apocalypse) { if(event.entity instanceof EntityZombie || event.entity instanceof EntitySkeleton) { if(event.source != null && event.source == DamageSource.onFire ) { event.setCancel(true); } } } } }@‘Axaurus’:
PS : d’ailleurs j’ai une question concernant le forum : pourquoi l’indentation n’est sauvegardée seulement que quelques fois ? Quand je colle un code java et que c’est bien indenté, parfois ça aligne tout. Je crois ne pas être le seul, ça arrive à d’autre personne aussi.
J’ai jamais eu ce souci. Tu fais comment pour ajouter ton code ?
-
C’est pas à cause de l’éditeur ? Il y avait un problème, l’éditeur de message mettez sans dessus-dessous le message quand on éditais le message avec l’aide des balises de formatage (il me semble)
-
J’ai le même souci et c’est long de remettre en ordre la code, quand on copie le code qui est dans une balise java, l’indentation est foute en l’air, les numéros de ligne restent et lorsqu’on les efface, cela efface le retour à la ligne que l’on est obligé de remettre.
-
Oui copier depuis une balise java vers une nouvelle réponse ça fait n’importe quoi. Il faut passer en mode édition de code. (ctrl + shift + s ou cliquer sur l’icône en haut à tout à gauche).
Mais copier du code d’eclipse vers le forum normalement il n’y a pas de soucis.