Problème de position sur une EntitySittableBlock


  • Bonsoir tout le monde j’ai crée une chaise ce soir mais j’ai un problème avec l’entity que je suis censé monter. Je la monte bien, tous les coordonnées sont, cependant au bout de 4 secondes rien ne va plus je suis tp à 2 blocks au dessus. En gros je plane , je vole dans le vide alors que 4 secondes avant tout allait pour le mieux.
    Voici mes class:

    Mes méthodes dans mon block

    
        public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ)
    
    {
    return sitPlayer(world, x, y, z, player, 1.0F);
    }
    
    public static boolean sitPlayer(World world, int x, int y, int z, EntityPlayer player, float entityY)
    {
    return sitPlayer(world, x, y, z, player, 0.5F, entityY, 0.5F);
    }
    
    public static boolean sitPlayer(World world, int x, int y, int z, EntityPlayer player, float entityX, float entityY, float entityZ)
    {
    if(!world.isRemote)
    {
    List <entitysittableblock>listEMB = world.getEntitiesWithinAABB(EntitySittableBlock.class, AxisAlignedBB.getBoundingBox(x, y, z, x + 1.0D, y + 1.0D, z + 1.0D).expand(1.0D, 1.0D, 1.0D));
    for(EntitySittableBlock entitytocheck : listEMB)
    {
    if((entitytocheck.blockPosX == x) && (entitytocheck.blockPosY == y) && (entitytocheck.blockPosZ == z))
    {
    entitytocheck.interact(player);
    return true;
    }
    }
    
    EntitySittableBlock entity = new EntitySittableBlock(world, player, x, y, z, x + entityX, y + entityY, z + entityZ);
    world.spawnEntityInWorld(entity);
    entity.interact(player);
    }
    return true;
    }
    
    

    PS = C’est un block avec TESR et orientable aussi.

    Et voici mon entity

    
    package mrplaigon.zombarcraftserver.zombarcraftmod.common.entity.other;
    
    import net.minecraft.entity.Entity;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.nbt.NBTTagCompound;
    import net.minecraft.world.World;
    
    public class EntitySittableBlock extends Entity
    {
    public int blockPosX;
    public int blockPosY;
    public int blockPosZ;
    
    public EntitySittableBlock(World world)
    {
    super(world);
    this.noClip = true;
    this.preventEntitySpawning = true;
    this.setSize(0.0F, 0.0F);
    }
    
    public EntitySittableBlock(World world, EntityPlayer entityplayer, int x, int y, int z, float entityX, float entityY, float entityZ)
    {
    this(world);
    this.blockPosX = x;
    this.blockPosY = y;
    this.blockPosZ = z;
    this.setPosition(entityX, entityY, entityZ);
    }
    
    public boolean interact(EntityPlayer entityplayer)
    {
    if(this.riddenByEntity != null)
    {
    return true;
    }
    
    if(!this.worldObj.isRemote)
    {
    entityplayer.mountEntity(this);
    }
    return true;
    }
    
    public void onEntityUpdate()
    {
    if(this.riddenByEntity == null || this.riddenByEntity.isDead)
    {
    this.setDead();
    }
    super.onEntityUpdate();
    }
    
    @Override
    public void readEntityFromNBT(NBTTagCompound compound)
    {
    this.blockPosX = compound.getInteger("blockPosX");
    this.blockPosY = compound.getInteger("blockPosY");
    this.blockPosZ = compound.getInteger("blockPosZ");
    }
    
    @Override
    public void writeEntityToNBT(NBTTagCompound compound)
    {
    compound.setInteger("blockPosX", this.blockPosX);
    compound.setInteger("blockPosY", this.blockPosY);
    compound.setInteger("blockPosZ", this.blockPosZ);
    }
    
    @Override
    protected void entityInit()
    {
    
    }
    }
    
    

    Je vous remercie d’avance =D</entitysittableblock>


  • 
    @Override
    public void readEntityFromNBT(NBTTagCompound compound)
    {
    this.blockPosX = compound.getInteger("blockPosX");
    this.blockPosY = compound.getInteger("blockPosY");
    this.blockPosZ = compound.getInteger("blockPosZ");
    }
    
    @Override
    public void writeEntityToNBT(NBTTagCompound compound)
    {
    compound.setInteger("blockPosX", this.blockPosX);
    compound.setInteger("blockPosY", this.blockPosY);
    compound.setInteger("blockPosZ", this.blockPosZ);
    }
    

    change ces méthods avec çà:

    
    @Override
    public void readEntityFromNBT(NBTTagCompound compound)
    {
    super.readEntityFromNBT(compound);
    }
    
    @Override
    public void writeEntityToNBT(NBTTagCompound compound)
    {
    super.writeEntityToNBT(compound);
    }
    

    Il ne faut JAMAIS enlever les super dans les NBTs, si tu veux rajouter des données en plus, mets les après le super.


  • @‘SCAREX’:

    
    @Override
    public void readEntityFromNBT(NBTTagCompound compound)
    {
    this.blockPosX = compound.getInteger("blockPosX");
    this.blockPosY = compound.getInteger("blockPosY");
    this.blockPosZ = compound.getInteger("blockPosZ");
    }
    
    @Override
    public void writeEntityToNBT(NBTTagCompound compound)
    {
    compound.setInteger("blockPosX", this.blockPosX);
    compound.setInteger("blockPosY", this.blockPosY);
    compound.setInteger("blockPosZ", this.blockPosZ);
    }
    

    change ces méthods avec çà:

    
    @Override
    public void readEntityFromNBT(NBTTagCompound compound)
    {
    super.readEntityFromNBT(compound);
    }
    
    @Override
    public void writeEntityToNBT(NBTTagCompound compound)
    {
    super.writeEntityToNBT(compound);
    }
    

    Il ne faut JAMAIS enlever les super dans les NBTs, si tu veux rajouter des données en plus, mets les après le super.

    J’avais celle codée par MFF, en tout cas celle qui se trouve sur leur github
    Et pour le code que tu m’as envoyé j’ai cette erreur là

    Cannot directly invoke the abstract method writeEntityToNBT(NBTTagCompound) for the type Entity


  • A quoi te servent les variables blockPosX, blockPosY et blockPosZ ?


  • @‘SCAREX’:

    A quoi te servent les variables blockPosX, blockPosY et blockPosZ ?

    Ce sont les coordonnées du block donc de l’entity puisque l’entity spawn aux mêmes coordonnées que celles du block
    Regarde les méthodes dans mon block, elles t’aideront à comprendre les NBTTag que j’ai utilisés


  • @‘Julot10085’:

    @‘SCAREX’:

    A quoi te servent les variables blockPosX, blockPosY et blockPosZ ?

    Ce sont les coordonnées du block donc de l’entity puisque l’entity spawn aux mêmes coordonnées que celles du block
    Regarde les méthodes dans mon block, elles t’aideront à comprendre les NBTTag que j’ai utilisés

    Bah justement, d’après ce que je vois, ces variables ne sont pas utilisées en tant que coordonnés à cause du this.setPosition(x,y,z) mais elles sont utilisées dans les NBT, regarde comment sont enregistrées les autres entités.


  • @‘SCAREX’:

    @‘Julot10085’:

    @‘SCAREX’:

    A quoi te servent les variables blockPosX, blockPosY et blockPosZ ?

    Ce sont les coordonnées du block donc de l’entity puisque l’entity spawn aux mêmes coordonnées que celles du block
    Regarde les méthodes dans mon block, elles t’aideront à comprendre les NBTTag que j’ai utilisés

    Bah justement, d’après ce que je vois, ces variables ne sont pas utilisées en tant que coordonnés à cause du this.setPosition(x,y,z) mais elles sont utilisées dans les NBT, regarde comment sont enregistrées les autres entités.

    Je n’ai pas trouvé grand chose mais je ne comprends j’ai copié collé le code du github de MFF ainsi que j’ai aussi essayé le github de MrCrayFish de son mod furnitur rien ne marche. Je ne vois plus quoi faire surtout que c’est toujours le même bug….


  • @‘Julot10085’:

    @‘SCAREX’:

    @‘Julot10085’:

    @‘SCAREX’:

    A quoi te servent les variables blockPosX, blockPosY et blockPosZ ?

    Ce sont les coordonnées du block donc de l’entity puisque l’entity spawn aux mêmes coordonnées que celles du block
    Regarde les méthodes dans mon block, elles t’aideront à comprendre les NBTTag que j’ai utilisés

    Bah justement, d’après ce que je vois, ces variables ne sont pas utilisées en tant que coordonnés à cause du this.setPosition(x,y,z) mais elles sont utilisées dans les NBT, regarde comment sont enregistrées les autres entités.

    Je n’ai pas trouvé grand chose mais je ne comprends j’ai copié collé le code du github de MFF ainsi que j’ai aussi essayé le github de MrCrayFish de son mod furnitur rien ne marche. Je ne vois plus quoi faire surtout que c’est toujours le même bug….

    Pas trouvé grand chose ? regarde les entityThrowable, les entityLiving, etc.


  • Attends j’ai pas tout compris le soucis est qu’à un certain moment les coordonnées ne sont plus les bonnes en quoi regarder une entityThrowable va m’aider ? Les entityThrowable ne sont pas montées.


  • @‘Julot10085’:

    Attends j’ai pas tout compris le soucis est qu’à un certain moment les coordonnées ne sont plus les bonnes en quoi regarder une entityThrowable va m’aider ? Les entityThrowable ne sont pas montées.

    Le problème est que ta classe est issue d’une classe abstraite, je pense que ton entité est mal positionnée dans le monde, donc si tu regardes comment sont faites les autres classes extends Entity, tu pourras t’en inspirer. J’aimerais plus t’aider mais je n’ai actuellement pas accès aux sources de Minecraft.


  • @‘SCAREX’:

    @‘Julot10085’:

    Attends j’ai pas tout compris le soucis est qu’à un certain moment les coordonnées ne sont plus les bonnes en quoi regarder une entityThrowable va m’aider ? Les entityThrowable ne sont pas montées.

    Le problème est que ta classe est issue d’une classe abstraite, je pense que ton entité est mal positionnée dans le monde, donc si tu regardes comment sont faites les autres classes extends Entity, tu pourras t’en inspirer. J’aimerais plus t’aider mais je n’ai actuellement pas accès aux sources de Minecraft.

    Ok je regarderai demain et j’éditerai mon message si je trouve quelque chose qui me paraît important 🙂

  • Administrateurs Rédacteurs Moddeurs confirmés

    Il me semble qu’on a le même problème sur FFMT lib.
    Je viens de regarder un peu Entity.java
    Et je viens de voir cette fonction :

    ​    public void updateRiderPosition()
    
        {
            if (this.riddenByEntity != null)
            {
                this.riddenByEntity.setPosition(this.posX, this.posY + this.getMountedYOffset() + this.riddenByEntity.getYOffset(), this.posZ);
            }
        }
    

    Du-coup je pense qu’il faudrait override la fonction getMountedYOffset() et changer sa valeur. Donc en gros ajouter dans la classe de ton entité :

    ​    public double getMountedYOffset()
    
        {
            return 0.5D; // ou autre valeur, à tester. Par défaut c'est return (double)this.height * 0.75D;
        }
    

  • Ce serait vraiment sympa un tutoriel à propos d’une chaise 😄 Une question, c’est possible de s’asseoir sur un bloc et non une entité ?


  • @‘EmotionFox’:

    Ce serait vraiment sympa un tutoriel à propos d’une chaise 😄 Une question, c’est possible de s’asseoir sur un bloc et non une entité ?

    Non, mais tu peux créer une entité à l’emplacement du bloc et la supprimer lorsque le bloc est détruit.


  • @‘robin4002’:

    Il me semble qu’on a le même problème sur FFMT lib.
    Je viens de regarder un peu Entity.java
    Et je viens de voir cette fonction :

    ​    public void updateRiderPosition()
    
        {
            if (this.riddenByEntity != null)
            {
                this.riddenByEntity.setPosition(this.posX, this.posY + this.getMountedYOffset() + this.riddenByEntity.getYOffset(), this.posZ);
            }
        }
    

    Du-coup je pense qu’il faudrait override la fonction getMountedYOffset() et changer sa valeur. Donc en gros ajouter dans la classe de ton entité :

    ​    public double getMountedYOffset()
    
        {
            return 0.5D; // ou autre valeur, à tester. Par défaut c'est return (double)this.height * 0.75D;
        }
    

    Cela ne marche toujours pas : c’est le même bug voici mon code actuelle

    
    package mrplaigon.zombarcraftserver.zombarcraftmod.common.entity.other;
    
    import net.minecraft.entity.Entity;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.nbt.NBTTagCompound;
    import net.minecraft.world.World;
    
    public class EntitySittableBlock extends Entity
    {
    public int blockPosX;
    public int blockPosY;
    public int blockPosZ;
    
    public EntitySittableBlock(World world)
    {
    super(world);
    this.noClip = true;
    this.preventEntitySpawning = true;
    this.setSize(0.0F, 0.0F);
    }
    
    public EntitySittableBlock(World world, EntityPlayer entityplayer, int x, int y, int z, float entityX, float entityY, float entityZ)
    {
    this(world);
    this.blockPosX = x;
    this.blockPosY = y;
    this.blockPosZ = z;
    this.setPosition(entityX, entityY, entityZ);
    }
    
    public boolean interact(EntityPlayer entityplayer)
    {
    if(this.riddenByEntity != null)
    {
    return true;
    }
    
    if(!this.worldObj.isRemote)
    {
    entityplayer.mountEntity(this);
    }
    return true;
    }
    
        public void updateRiderPosition()
        {
            if (this.riddenByEntity != null)
            {
                this.riddenByEntity.setPosition(this.posX, this.posY + this.getMountedYOffset() + this.riddenByEntity.getYOffset(), this.posZ);
            }
        }
    
        public double getMountedYOffset()
    
        {
            return 0.5D; // ou autre valeur, à tester. Par défaut c'est return (double)this.height * 0.75D;
        }
    
    public void onEntityUpdate()
    {
    if(this.riddenByEntity == null || this.riddenByEntity.isDead)
    {
    this.setDead();
    }
    super.onEntityUpdate();
    }
    
    @Override
    public void readEntityFromNBT(NBTTagCompound compound)
    {
    // super.readEntityFromNBT(compound);
    }
    
    @Override
    public void writeEntityToNBT(NBTTagCompound compound)
    {
    // super.writeEntityToNBT(compound);
    }
    
    @Override
    protected void entityInit()
    {
    
    }
    }
    
    

  • Je suis arrivé à çà :

    
    package fr.scarex.st18.ST18Blocks;
    
    import java.util.List;
    
    import net.minecraft.block.Block;
    import net.minecraft.block.material.Material;
    import net.minecraft.block.state.IBlockState;
    import net.minecraft.creativetab.CreativeTabs;
    import net.minecraft.entity.Entity;
    import net.minecraft.entity.EntityLivingBase;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.item.ItemStack;
    import net.minecraft.util.AxisAlignedBB;
    import net.minecraft.util.BlockPos;
    import net.minecraft.util.EnumFacing;
    import net.minecraft.world.World;
    import net.minecraftforge.fml.common.registry.GameRegistry;
    
    import com.google.common.base.Predicate;
    import com.google.common.collect.Lists;
    
    import fr.scarex.st18.ST18;
    import fr.scarex.st18.ST18Entity.EntitySit;
    
    public class BlockSittable extends Block
    {
    private static final String name = "block_sittable";
    
    protected BlockSittable() {
    super(Material.rock);
    GameRegistry.registerBlock(this, name);
    setUnlocalizedName(ST18.MODID + "_" + name);
    setCreativeTab(CreativeTabs.tabBlock);
    }
    
    public static final String getName() {
    return name;
    }
    
    @Override
    public boolean onBlockActivated(World worldIn, final BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumFacing side, float hitX, float hitY, float hitZ) {
    if (!worldIn.isRemote) {
    List list = worldIn.getEntitiesWithinAABB(Entity.class, new AxisAlignedBB(pos.getX() + minX - 1.0D, pos.getY() + minY - 1.0D, pos.getZ() + minZ - 1.0D, pos.getX() + maxX + 1.0D, pos.getY() + maxY + 1.0D, pos.getZ() + maxZ + 1.0D), new Predicate(){
    @Override
    public boolean apply(Object input) {
    return input instanceof EntitySit && ((Entity)input).getPosition().equals(pos);
    }
    });
    if (list.size() > 0) {
    playerIn.mountEntity((Entity) list.get(0));
    } else {
    worldIn.spawnEntityInWorld(new EntitySit(worldIn, pos));
    }
    }
    return true;
    }
    
    @Override
    public void onBlockPlacedBy(World worldIn, BlockPos pos, IBlockState state, EntityLivingBase placer, ItemStack stack) {
    if (!worldIn.isRemote) worldIn.spawnEntityInWorld(new EntitySit(worldIn, pos));
    }
    }
    
    
    package fr.scarex.st18.ST18Entity;
    
    import fr.scarex.st18.ST18Blocks.BlockSittable;
    import fr.scarex.st18.ST18Blocks.ST18Blocks;
    import net.minecraft.entity.Entity;
    import net.minecraft.entity.EntityHanging;
    import net.minecraft.util.AxisAlignedBB;
    import net.minecraft.util.BlockPos;
    import net.minecraft.util.EnumFacing;
    import net.minecraft.world.World;
    
    public class EntitySit extends EntityHanging
    {
    public EntitySit(World worldIn, BlockPos pos) {
    super(worldIn, pos);
    this.field_174860_b = EnumFacing.NORTH;
    this.setLocationAndAngles(pos.getX() + 0.5D, pos.getY(), pos.getZ() + 0.5D, 0.0F, 0.0F);
    setEntityBoundingBox(new AxisAlignedBB(this.hangingPosition.getX(), this.hangingPosition.getY(), this.hangingPosition.getZ(), this.hangingPosition.getX() + 1.0D, this.hangingPosition.getY() + 1.0D, this.hangingPosition.getZ() + 1.0D));
    }
    
    public EntitySit(World world) {
    super(world);
    this.field_174860_b = EnumFacing.NORTH;
    }
    
    @Override
    public int getWidthPixels() {
    return 8;
    }
    
    @Override
    public int getHeightPixels() {
    return 8;
    }
    
    @Override
    public void onBroken(Entity entity) {}
    
    @Override
    public float getCollisionBorderSize() {
    return 0.0F;
    }
    
    @Override
    public double getMountedYOffset() {
    return 0.0D;
    }
    
    @Override
    public void onUpdate() {
    super.onUpdate();
    if (this.worldObj.getBlockState(this.hangingPosition).getBlock() != ST18Blocks.blockSittable) this.setDead();
    }
    
    @Override
    public boolean onValidSurface() {
    return true;
    }
    }