Encore quelques problèmes. Attaque de mobs, impossible de se lever et autres ..
-
Ah oui c’est vrai, j’ai complètement oublié. Désolé
Du coup, j’ai mis la condition si le monde n’est pas remote, y’a pas d’erreur mais il ne neige toujours pas. Du coup, il faudrait passer par autre chose pour mettre la neige en même temps que l’effet. Mais je sais pas quoi -
event.getEntityPlayer().worldObj.getWorldInfo(); ça ne va pas ?
-
Bah en fait c’est bizarre. J’ai mis ton code, et quand je me couche et que je me lève en appuyant sur le bouton, il neige. Mais quand j’attend que le jour arrive, il ne neige pas. Ce qu’il y a de plus bizarre, c’est les logs. J’ai mis ça : ```java
WorldInfo worldinfo = event.getEntityPlayer().worldObj.getWorldInfo();
System.out.println(worldinfo);
worldinfo.setRainTime(12536);
worldinfo.setThunderTime(0);
worldinfo.setRaining(true);
worldinfo.setThundering(false);
System.out.println(worldinfo.isRaining());
System.out.println(worldinfo.getRainTime());Et les logs me donnent ça : ``` [15:53:02] [Server thread/INFO] [STDOUT]: [This_is_Christmas.CommonEventHandler:MagicOfChristmasEffectActivator:88]: net.minecraft.world.storage.WorldInfo@5883e379 true 12536 [15:53:02] [Client thread/INFO]: [CHAT] msg.christmas.effect [15:53:02] [Client thread/INFO] [STDOUT]: [This_is_Christmas.CommonEventHandler:MagicOfChristmasEffectActivator:88]: net.minecraft.world.storage.WorldInfo@1ad39c66 true 12536 [15:53:02] [Client thread/INFO]: [CHAT] msg.christmas.effect ```Pourtant, y'a tout pour qu'il neige et même les logs le disent. Je ne pense pas, mais est-ce que ça serait parce que le code s'exécute deux fois ? -
Je sais où est le problème.
Quand on dort et qu’il neige ou pleut, la pluie / la neige s’arrête.
Le code qui gère ça s’exécute donc après ton code, ce qui désactive ta neige. -
Ah ouais, c’est vrai …
Mais du coup, y’aurait pas un moyen d’annuler ça ? -
Aucune idée.
-
J’ai trouvé où ça remet à zéro le temps. Dans la classe WorldServer, dans la fonction wakeAllPlayers, ça appelle une fonction de la même classe qui, à son tour appelle cette fonction dans la classe WorldProvider :
public void resetRainAndThunder() { worldObj.worldInfo.setRainTime(0); worldObj.worldInfo.setRaining(false); worldObj.worldInfo.setThunderTime(0); worldObj.worldInfo.setThundering(false); } ``` Du coup, je me demande si ça serait possible d'annuler l'appelle de cette fonction, ou alors de modifier les valeurs. J'avais essayé de cancel l'event PlayerWakeUp pour ensuite mettre le jour manuellement, mais on peut pas le cancel. Une idée ? -
Sans modification du byte code (via un coremod) tu ne pourra pas changer la fonction (ni ses valeurs ni le fait qu’elle soit appelé)
Une solution que je vois (mais pas super propre) est de changer la valeur d’une variable int qui serait dans la classe de tes évent, et ensuite via l’évent WorldTickEvent décrémenter cette variable et activer la neige lorsqu’elle arrive à 0.
-
Salut
Pourquoi dit tu que ce n’est pas très propre ?
Sinon voilà ce que j’ai fait :int timer = 5; […] @SubscribeEvent public void SnowTimer(WorldTickEvent event) { if(timer == 4) { WorldInfo worldinfo = event.world.getWorldInfo(); worldinfo.setRainTime(12532); worldinfo.setThunderTime(0); worldinfo.setRaining(true); worldinfo.setThundering(false); } if(timer <= 4) { timer++; } }Et dans l’obtention de mon effet (en gros, quand le jouer se lève) :```java
timer = 0;Ca marche bien. Mais j'ai un autre problème (que j'avais déjà avant). Je sais pas si on pourra y faire grand chose mais quand j'obtient l'effet, je fais afficher un message par ```java public void MagicOfChristmasEffect(EntityPlayer player) { ChristmasPotion potion = ChristmasPotion.MagicOfChristmasEffect; PotionEffect potioneffect = new PotionEffect(potion, 12536, 0, false, true); TextComponentTranslation textcomponenttranslation = new TextComponentTranslation("msg.christmas.effect"); textcomponenttranslation.getStyle().setColor(TextFormatting.RED); player.addPotionEffect(potioneffect); player.addChatMessage(textcomponenttranslation); } ```Et le problème, c'est que le message s'affiche deux fois. Mais cette fonction n'est appelée qu'une seule fois, quand le joueur se lève. Une idée pour régler ? Merci d'avance -
Tu as essayé avec if(!player.worldObj.isRemote()) ?
Je dis que ce n’est pas très propre car la solution nécessite une fonction qui est exécuté à chaque tick pour faire quelque chose seulement a un moment donné et non à chaque fois.
-
Salut
Mais avec ce que j’ai fait, ce n’est exécuté qu’à un moment donné, tant que ma variable n’atteint pas 5. Je comprend, mais c’est (sans doute) la seule solution (en tout cas pour l’instant).
Sinon, pour la condition ça marche. Je le savais qu’il faut mettre cette condition mais à chaque fois, j’y pense jamais.
Je vais essayé d’y penser les autres fois, mais c’est pas gagné. Je sais pas pourquoi, j’arrive à faire/penser des trucs compliqué de tête (par exemple, hier un ami m’a demandé 91*500) mais des trucs aussi simple que ça, j’y arrive pas. Mais bon, je vais arrêté le HS, c’est de la psychologie, plus du codageEn tout cas, merci à toi
Tout marche bien