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ésBah 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ésBah 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ésBah 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
-
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; } }