Résolu Problème de son
-
Bonjours à tous !
Depuis un moment, j’essaye de faire un bloc qui téléporte le joueur à un étage au dessus (en quelque sorte), mais le problème, c’est que ça marche de façon très aléatoire :s
Quelque fois la téléportation se fait, quelque fois non, défois la téléportation se fait mais le son n’est pas jouer, d’autre fois non, c’est très hasardeuxVoici mon code:
package com.yvelis.mtpblocks.blocks; import cpw.mods.fml.common.network.Player; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.ChatMessageComponent; import net.minecraft.world.World; public class TpUpBlock extends Block { public TpUpBlock(int id) { super(id, Material.glass); } public void onEntityWalking(World world, int X, int Y, int Z, Entity entity) { if(!(entity instanceof EntityPlayer)) return; EntityPlayer player = (EntityPlayer) entity; double posY = player.posY; boolean locationFound = false; for (int i = (int) posY; i < 1000 ; i++) { if( world.getBlockId(X, i, Z) != 0 && world.getBlockId(X, i + 1, Z) == 0 && world.getBlockId(X, i + 2, Z) == 0 && world.getBlockId(X, i + 3, Z) == 0) { player.setPosition(X, i + 3, Z); if(!world.isRemote) player.worldObj.playSoundAtEntity(player, "mtpblocks:teleport", 1.0F, 1.0F); return; } } if(!world.isRemote) player.sendChatToPlayer( ChatMessageComponent.createFromText("Aucune destination trouvé pour la téléportation") ); } }
Merci de votre futur aide
Mugiwaxar
-
Ouch, la boucle for c’est pas une bonne idée du tout. De plus, world.isAirBlock(x, y, z) est à privilégier.
J’aurai plutôt fait ça :
package com.yvelis.mtpblocks.blocks; import cpw.mods.fml.common.network.Player; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.ChatMessageComponent; import net.minecraft.world.World; public class TpUpBlock extends Block { public TpUpBlock(int id) { super(id, Material.glass); } public void onEntityWalking(World world, int x, int y, int z, Entity entity) { if(!(entity instanceof EntityPlayer)) return; EntityPlayer player = (EntityPlayer) entity; boolean locationFound = false; int targetY = y; while(!world.isAirBlock(x, targetY, z) && targetY < 254) { targetY++; } if(targetY < 254) { player.setPosition(x, targetY, y); if(!world.isRemote) player.worldObj.playSoundAtEntity(player, "mtpblocks:teleport", 1.0F, 1.0F); } else { player.sendChatToPlayer( ChatMessageComponent.createFromText("Aucune destination trouvé pour la téléportation") ); } } }
-
Le problème avec ce code, c’est que si au dessus il y a plusieurs bloc de suite, le joueur ne serra pas téléporter
Pourquoi pas de boucle for ?
Ps: J’ai pris ton code, le problème reste le même
Ps2: J’ai l’avertissement: “[Avertissement [Minecraft-Server] Player984 moved wrongly!]” qui s’affiche à chaque fois
-
@‘Mugiwaxar’:
Le problème avec ce code, c’est que si au dessus il y a plusieurs bloc de suite, le joueur ne serra pas téléporter
Comment ça ?
@‘Mugiwaxar’:
Pourquoi pas de boucle for ?
Ps: J’ai pris ton code, le problème reste le même
Car une boucle for n’est pas approprié pour ça, tu fais beaucoup plus de test que nécessaire (surtout que 1000 c’est plus que les 256 maximum).
Essaye avec le OnEntityColled et réduit la collision du bloc (regarde le code de la sandStone) il me semble que la fonction onEntityWalking ne fonctionne pas super bien.
@‘Mugiwaxar’:
Ps2: J’ai l’avertissement: “[Avertissement [Minecraft-Server] Player984 moved wrongly!]” qui s’affiche à chaque fois
Il doit pas aimer le setPosition, regarde la fonction pour téléporter, il me semble qu’il y a d’autre code pour prévenir la téléportation.
-
@‘robin4002’:
@‘Mugiwaxar’:
Le problème avec ce code, c’est que si au dessus il y a plusieurs bloc de suite, le joueur ne serra pas téléporter
Comment ça ?
Avec ce code, le joueur va se téléporter au premier bloc trouvée, et va essayer de se TP dessu, si ya pas la place, la téléportation va s’annuler, d’ou mon test si il y a des bloc au dessu
@‘robin4002’:
@‘Mugiwaxar’:
Pourquoi pas de boucle for ?
Ps: J’ai pris ton code, le problème reste le même
Car une boucle for n’est pas approprié pour ça, tu fais beaucoup plus de test que nécessaire (surtout que 1000 c’est plus que les 256 maximum).
Au final j’ai mis world.getHeight()
@‘robin4002’:
@‘Mugiwaxar’:
Ps2: J’ai l’avertissement: “[Avertissement [Minecraft-Server] Player984 moved wrongly!]” qui s’affiche à chaque fois
Il doit pas aimer le setPosition, regarde la fonction pour téléporter, il me semble qu’il y a d’autre code pour prévenir la téléportation.
Malheuresement j’ai chercher pendant un moment, j’ai rien trouvé
-
Bon, mon problème a l’air d’être résolut
Je fait encore quelque teste et je confirme
Merci pour ton aide
Voici mon code source pour ceux que sa interesse:
package com.yvelis.mtpblocks.blocks; import cpw.mods.fml.common.network.Player; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.ChatMessageComponent; import net.minecraft.world.World; public class TpUpBlock extends Block { public TpUpBlock(int id) { super(id, Material.glass); } public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int i, int j, int k) { float f = 0.0625F; return AxisAlignedBB.getAABBPool().getAABB((float)i + f, j, (float)k + f, (float)(i + 1) - f, (float)(j + 1) - f, (float)(k + 1) - f); } @Override public void onEntityCollidedWithBlock(World world, int X, int Y, int Z, Entity entity) { if(!(entity instanceof EntityPlayer)) return; if(world.isRemote) return; EntityPlayer player = (EntityPlayer) entity; int posY = (int) player.posY + 1; boolean locationFound = false; while ( posY < world.getHeight() ) { posY++; if( !world.isAirBlock(X, posY, Z) && world.isAirBlock(X, posY + 1, Z) && world.isAirBlock(X, posY + 2, Z) && world.isAirBlock(X, posY + 3, Z)) { locationFound = true; break; } } if(locationFound) { player.setPositionAndUpdate(X, posY + 1, Z); player.worldObj.playSoundAtEntity(player, "mtpblocks:teleport", 1.0F, 1.0F); } else player.sendChatToPlayer( ChatMessageComponent.createFromText("Aucune destination pour la teleportation") ); super.onEntityCollidedWithBlock(world, X, Y, Z, entity); } }
Edit: Tout a l’air d’être fonctionnel !
Résolut