Entity montable
-
J’y étais arrivé, je t’envoie le code dès que je le retrouve. (Mon entity était montable et dirigeable)
EDIT : Bon je sais plus où je l’ai mis mais je m’étais inspiré de cette discussion : http://www.minecraftforgefrance.fr/showthread.php?tid=1766
-
Sinon regarde du côté de FFMT lib, on ajoute aussi une entité qui permet de s’assoir.
Ce qu’on a fait nous c’est que l’entité est créé lorsque le joueur clic droit sur le bloc, puis elle est kill lorsque le joueur s’enlève. -
C’est ce que je fais dans mon code sauf que l’entité s’enlève toute seule quand elle est plus dans le block correspondant.
Je vous tiens au courant avec ce que vous m’avez donné.EDIT : aucun changement avec ce nouveau code, je pense que c’est un bug forge.
Mes nouvelles classes :
package fr.scarex.hilium.block; import java.util.List; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; import fr.scarex.hilium.Hilium; import fr.scarex.hilium.entity.EntitySit; import fr.scarex.hilium.tileentity.TileEntitySit; /** * @author SCAREX * */ public class BlockSit extends Block { protected BlockSit(Material material) { super(material); } @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { if (this.canSit(world, x, y, z, player, side, hitX, hitY, hitZ)) { // Entity entity = world.getEntityByID(((TileEntitySit) world.getTileEntity(x, y, z)).getEntityId()); List <entitysit>list = world.getEntitiesWithinAABB(EntitySit.class, AxisAlignedBB.getBoundingBox(x, y, z, x + 1.0D, y + 1.0D, z + 1.0D)); EntitySit entity = list.size() > 0 ? list.get(0) : null; Hilium.LOGGER.info(entity); if (entity != null) entity.interactFirst(player); return true; } return false; } public boolean canSit(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { return true; } @Override public void onBlockAdded(World world, int x, int y, int z) { EntitySit e = new EntitySit(world, x + 0.5D, y + 0.5D, z + 0.5D, this.getOffsetY(world, x, y, z)); world.spawnEntityInWorld(e); ((TileEntitySit) world.getTileEntity(x, y, z)).setEntityId(e.getEntityId()); } public float getOffsetY(World world, int x, int y, int z) { return 0.5F; } }package fr.scarex.hilium.entity; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.MathHelper; import net.minecraft.world.World; import fr.scarex.hilium.Hilium; import fr.scarex.hilium.block.BlockSit; /** * @author SCAREX * */ public class EntitySit extends Entity { protected float offsetY; public EntitySit(World world) { super(world); this.noClip = true; this.preventEntitySpawning = true; this.setSize(0.2F, 0.2F); this.offsetY = 0.0F; } public EntitySit(World world, double x, double y, double z, float offsetY) { this(world); this.setPosition(x, y, z); this.offsetY = offsetY; } @Override protected void entityInit() {} @Override protected void readEntityFromNBT(NBTTagCompound comp) {} @Override protected void writeEntityToNBT(NBTTagCompound comp) {} @Override public void onUpdate() { super.onUpdate(); if (!(this.worldObj.getBlock(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posY), MathHelper.floor_double(this.posZ)) instanceof BlockSit)) this.kill(); } @Override public boolean interactFirst(EntityPlayer p) { if (this.riddenByEntity != null) return true; if (!this.worldObj.isRemote) p.mountEntity(this); return true; } @Override public double getMountedYOffset() { return this.offsetY; } @Override public void updateRiderPosition() { super.updateRiderPosition(); if (this.riddenByEntity != null) this.riddenByEntity.rotationYaw = 90.0F * this.worldObj.getBlockMetadata(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posY), MathHelper.floor_double(this.posZ)); } } ```___En fait je pense que le problème vient du fait que l'entité soit null côté client : j'ai rajouté des logs et l'entité existe seulement côté serveur, alors qu'elle devrait aussi exister côté client.</entitysit> -
Tu as enregistré l’entité avec EntityRegistry.registerModEntity ?
-
Ok, je me suicide maintenant ? j’avais juste oublié de l’enregistrer, j’ai pas l’habitude des entités. Ce qui est marrant c’est que çà n’a pas du tout crasher, et j’arrivais quand même à m’asseoir 1 fois sur 2.
EDIT : en fait non, çà ne résout pas le problème.
-
Si personne n’a d’idée pour résoudre ce problème, je report ce bug à MinecraftForge.
-
Ça ne spawn toujours pas côté client ?
-
Je pense comprendre : la fonction onBlockAdded est appelée uniquement côté serveur, donc le client ne sait pas que l’entité est apparue. Donc soit je fait apparaître l’entité dans une autre fonction, soit il faut que j’envoi un paquet au client.
-
Maintenant l’entité apparaît bien côté client et je peux m’asseoir dessus, mais il y a encore un problème de synchronisation : le getMountedYOffset ne s’applique que côté serveur.
package fr.scarex.hilium.block; 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.world.World; import fr.scarex.hilium.Hilium; import fr.scarex.hilium.entity.EntitySit; import fr.scarex.hilium.tileentity.TileEntitySit; /** * @author SCAREX * */ public class BlockSit extends Block { protected BlockSit(Material material) { super(material); } @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { if (this.canSit(world, x, y, z, player, side, hitX, hitY, hitZ)) { EntitySit entity = new EntitySit(world, x + 0.5D, y + 0.5D, z + 0.5D, this.getOffsetY(world, x, y, z)); world.spawnEntityInWorld(entity); entity.interactFirst(player); return true; } return false; } public boolean canSit(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { return true; } public double getOffsetY(World world, int x, int y, int z) { return 0.5D; } }package fr.scarex.hilium.entity; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.MathHelper; import net.minecraft.world.World; import fr.scarex.hilium.Hilium; import fr.scarex.hilium.block.BlockSit; /** * @author SCAREX * */ public class EntitySit extends Entity { protected double offsetY; public EntitySit(World world) { super(world); this.noClip = true; this.preventEntitySpawning = true; this.setSize(0.0F, 0.0F); this.offsetY = 0.0F; } public EntitySit(World world, double x, double y, double z, double offsetY) { this(world); this.setPosition(x, y, z); this.offsetY = offsetY; } @Override protected void entityInit() {} @Override protected void readEntityFromNBT(NBTTagCompound comp) {} @Override protected void writeEntityToNBT(NBTTagCompound comp) {} @Override public void onEntityUpdate() { if (this.riddenByEntity == null || this.riddenByEntity.isDead) this.setDead(); super.onEntityUpdate(); } @Override public boolean interactFirst(EntityPlayer p) { if (this.riddenByEntity != null) return true; if (!this.worldObj.isRemote) p.mountEntity(this); return true; } @Override public double getMountedYOffset() { return this.offsetY; } }package fr.scarex.hilium.block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MathHelper; import net.minecraft.world.World; import cpw.mods.fml.common.registry.GameRegistry; import fr.scarex.hilium.Hilium; import fr.scarex.hilium.client.ClientProxy; import fr.scarex.hilium.tileentity.TileEntitySit; import fr.scarex.hilium.tileentity.TileEntityUseless; /** * @author SCAREX * */ public class BlockToilet extends BlockSit { public static final String NAME = "toilet"; protected BlockToilet() { super(Material.glass); this.setHardness(0.5F); this.setResistance(5.0F); this.setStepSound(this.soundTypeGlass); this.setCreativeTab(CreativeTabs.tabDecorations); this.setBlockName(Hilium.MODID + "_" + NAME); this.setBlockTextureName(Hilium.MODID + ":" + NAME); this.register(); } private void register() { GameRegistry.registerBlock(this, NAME); GameRegistry.registerTileEntity(TileEntitySit.class, Hilium.MODID + ":" + NAME); } @Override public boolean renderAsNormalBlock() { return false; } @Override public int getRenderType() { return ClientProxy.RENDER_ID; } @Override public boolean isOpaqueCube() { return false; } @Override public boolean hasTileEntity(int metadata) { return true; } @Override public TileEntity createTileEntity(World world, int metadata) { return new TileEntitySit(); } @Override public void setBlockBoundsForItemRender() { this.setBlockBounds(0.05F, 0.0F, 0.05F, 0.95F, 0.88F, 0.95F); } @Override public void registerBlockIcons(IIconRegister register) { this.blockIcon = register.registerIcon("glass"); } @Override public boolean canPlaceBlockAt(World world, int x, int y, int z) { return super.canPlaceBlockAt(world, x, y, z) && World.doesBlockHaveSolidTopSurface(world, x, y - 1, z); } @Override public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entity, ItemStack stack) { int direction = MathHelper.floor_double((double) (entity.rotationYaw * 4.0F / 360.0F) + 2.5D) & 3; world.setBlockMetadataWithNotify(x, y, z, direction == 3 ? 0 : direction + 1, 2); } @Override public double getOffsetY(World world, int x, int y, int z) { return 0.3D; } } -
Ajoute implements IEntityAdditionalSpawnData et avec writeSpawnData et readSpawnData synchro la valeur de offsetY.
-
Merci, je connaissais pas du tout cette interface, problème résolu. Mis à part le fait qu’il faut un certain temps pour que le joueur soit à la bonne hauteur :

Ensuite :

-
Mdr des toilettes x), je me demande à quoi servira ce mod.
Si tu as trouvé la solution tu pourrait faire un tutoriel dans ton temps libre s’il te plait ? Je pense sa en satisfera plus d’un ( moi le premier ).
-
Si tu veux, si j’arrives à corriger ce bug… #MojangCorrectYourBugs (je suis pas censé publier de screenshots du model que j’utilise)
-
Tkt Scarex, c’est correct pour les photos, juste pas donner le model

-
Quand tu dis certains temps, c’est combien environ ?
-
30/40 secondes
-
À mon avis quand il reçoit le paquet il ne rafraichie pas directement la position du joueur, faudrait voir pour forcer ça.
-
Pas grave, je mets en résolu