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 hasardeux 😞

    Voici 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


  • Moddeurs confirmés Rédacteurs Administrateurs

    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


  • Moddeurs confirmés Rédacteurs Administrateurs

    @'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


Log in to reply