Augmeter ses stats de déplacment dans l'eau + Touche personalisée
-
Bon, je reprend ce topic, car faut VRAIMENT que je corrige ce crash, car si quelqu’un appuie malencontreusement sur la touche Alt sans avoir le pantalon et être dans l’eau, c’est le crash garanti !
Bon alors ce que je voudrais, c’est lorsqu’on appuie sur la touche ( UN FOIS, pas qu’un reste appuyer ), on remonte d’un coup ( Sortie des airbags ), puis on remonte douceument tant qu’on est dans l’eau ( L’air contenue dans les sacs nous font remonter )
Code actuel :
@SubscribeEvent public void onEvent(KeyInputEvent event) { // Si vous remplacez isPressed() par getIsKeyPressed() // Le chat sera inondé à chaque fois que vous presserez la touche if(keyAirBag.isPressed()) { keyTestTyped(FMLClientHandler.instance().getClientPlayerEntity()); // Traitement de la touche } } private void keyTestTyped(EntityPlayer player) { // La touche vient d'être appuyé !! if(player.inventory.armorItemInSlot(1).getItem() == ScaphLeggings.airbag_leggings) { if(player.isInWater()){ player.motionY = 4.0F; while(player.isInWater()) { player.motionY = 2.5F; } = return; } else { return; } }J’ai tenté quelques trucs pour contrer le systeme, par exemple, rajouter la condition de l’eau avant de la condition de la touvhe, comme ceci :
@SubscribeEvent public void onEvent(KeyInputEvent event) { // Si vous remplacez isPressed() par getIsKeyPressed() // Le chat sera inondé à chaque fois que vous presserez la touche if(player.insInWater()) { if(keyAirBag.isPressed()) { keyTestTyped(FMLClientHandler.instance().getClientPlayerEntity()); // Traitement de la touche } } } private void keyTestTyped(EntityPlayer player) { // La touche vient d'être appuyé !! if(player.inventory.armorItemInSlot(1).getItem() == ScaphLeggings.airbag_leggings) { player.motionY = 4.0F; while(player.isInWater()) { player.motionY = 2.5F; } return; } else { return; } }Résultat décevant = Un crash
-
if(player.inventory.armorItemInSlot(1).getItem() == ScaphLeggings.airbag_leggings) {
->
if(player.inventory.armorItemInSlot(1) != null && player.inventory.armorItemInSlot(1).getItem() == ScaphLeggings.airbag_leggings) { -
AAAh c’est ça ce que tu voulait dire pas le null check… My Bad.
Bon par contre, quand j’appuie sur la touche dans l’eau et avec le pantalon, je crash. Je pense que Minecraft aime pas trop la boucle que j’ai fait. Enfin c’est pas un crash a propreument parlé, c’est plutot un GROS Freeze, suivis d’un Ne Réponds Pas, suivi d’un crash quand tu ferme le jeu. Mais… Pas de crash-report.
Sinon, tous fonctionne
(Pantalon = Saute pas - Eau = Saute pas - Pantalon+Eau = Saute/Crash
- Rien = Saute pas ) -
C’est surement le boucle while qu’il n’aime pas.
-
Je l’ai enlevé, et ça fontionne. Mais par contre, si on barbotte dans 1 bloc d’eau, et qu’on active les airbags, on décole a plus de vingts blocs de haut… Et donc il y a des chances de décéder…
Comment faire pour que je monte tant que je suis dans l’eau, sans boucles while :S ?
EDIT = on part a 29 bloc de haut
-
Renvoi ton code actuel.
-
private void keyTestTyped(EntityPlayer player) { // La touche vient d'être appuyé !! if(player.inventory.armorItemInSlot(1) != null && player.inventory.armorItemInSlot(1).getItem() == ScaphLeggings.airbag_leggings) { if(player.isInWater()){ player.motionY = 4.0F; } else { return; } } }C’est normal que le motionY soit a 4.0F
-
Faudrait mettre un tag dans le joueur (player.getEntityData().setBoolean(“ascend”, true);) lors de l’appuie de la touche s’il a les jambières et qu’il est dans l’eau et ensuite dans un TickEvent.PlayerTickEvent fait que si le joueur à le tag (event.player.getEntityData().getBoolean(“ascend”)) alors s’il n’est pas dans l’eau tu le retire et tu mets son motionY sur 0, sinon s’il est dans l’eau tu mets son motionY sur 2.5F.
-
OMG c’est super complexe…
je vais tenter d’analyser sa plus en profondeur, et voir ce que je peut faire.
Sa me parait super dur !Si je ne me trompe pas, il fau tutiliser les Extends Entity trucs ?
-
Heu non pas du tout.
-
Sans Extand Entity Properties, comment mettre un tag au joueur ?
On peut le mettre directement dans la MainClass/ClientProxy/CommonProxy ? -
@‘robin4002’:
Faudrait mettre un tag dans le joueur (player.getEntityData().setBoolean(“ascend”, true);) lors de l’appuie de la touche s’il a les jambières et qu’il est dans l’eau et ensuite dans un TickEvent.PlayerTickEvent fait que si le joueur à le tag (event.player.getEntityData().getBoolean(“ascend”)) alors s’il n’est pas dans l’eau tu le retire et tu mets son motionY sur 0, sinon s’il est dans l’eau tu mets son motionY sur 2.5F.
Comme l’a dit Robin, tu fais player.getEntityData.setBoolean(“unNom”, taValeur)
-
Comment on fait pour le TickEvent ?
C’est une classe ou une méthode ? -
C’est un event, donc ça s’utilise comme n’importe quel event.
-
Bon, j’ai pas tous compris.
Les events sont trop compliqué pour moi
J’ai improvisé, et j’ai fait a ma sauce.
Sans surprise, ça ne fonctionne pasClient
private void keyTestTyped(EntityPlayer player) { // La touche vient d'être appuyé !! if(player.inventory.armorItemInSlot(1) != null && player.inventory.armorItemInSlot(1).getItem() == ScaphLeggings.airbag_leggings) { if(player.isInWater()) { player.getEntityData().setBoolean("airbag", true); } else { player.getEntityData().setBoolean("airbag", false); } } }Jambières
public void onArmorTick(World world, EntityPlayer player, ItemStack itemStack) { if(player.getEntityData().getBoolean("ascend")) { player.motionY += 2.5F; } } -
-
Enfaîte, c’est fonctionnel. J’avais juste fait une faute dans la classe des jambières (Je vous laisse chercher
)
Sauf, que c’est TROP fonctionnel

PS : je suis monté jusqu’a environ 100b de haut ( Base 64 ), puis j’ai enlevé les jambières. Je suis monté jusqu’a environ 20 000 -
Normal, tu as mis 20.0F il me semble ?
le nombre que tu mets c’est la distance qui se parcouru au prochain tick, donc si tu mets 2 en y, le joueur sautera en l’air de 2 blocks. -
J’ai mis += 2.5F
L’erreur est autre part. Tellement visible qu’elle en devient invisible
(Faut surement que j’enlève le +
)
PS = le fait que je décole vient dfait que le boolean n’est jamais mis en False je pense
Ouais, enfaite, le false est mis vachement tard, ou jmais
J’ai tenté un truc, mais rien n’y faitprivate void keyTestTyped(EntityPlayer player) { // La touche vient d'être appuyé !! if(player.inventory.armorItemInSlot(1) != null && player.inventory.armorItemInSlot(1).getItem() == ScaphLeggings.airbag_leggings) { if(player.isInWater()) { player.getEntityData().setBoolean("airbag", true); } if(!player.isInWater()) { player.getEntityData().setBoolean("airbag", false); } } } -
Avec onArmor tick c’est bon aussi.
Et en effet, ça serait plutôt comme ça :if(player.getEntityData().getBoolean("airbag")) { if(player.isInWater()) { player.motionY = 2.5F; } else { player.getEntityData().setBoolean("airbag", false); } }