• S'inscrire
    • Se connecter
    • Recherche
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes

    Résolu Entity montable

    1.7.x
    1.7.10
    6
    23
    4469
    Charger plus de messages
    • Du plus ancien au plus récent
    • Du plus récent au plus ancien
    • Les plus votés
    Répondre
    • Répondre à l'aide d'un nouveau sujet
    Se connecter pour répondre
    Ce sujet a été supprimé. Seuls les utilisateurs avec les droits d'administration peuvent le voir.
    • SCAREX
      SCAREX dernière édition par

      Récemment j’ai essayé de créer un block sur lequel on peut s’asseoir, sauf que j’ai que le problème est que le client et le serveur ne sont pas synchronisé : lorsque je clique la première fois sur mon block, je suis considéré comme étant monté sur l’entité pour le serveur mais pas pour le client.

      Voici mes classes :

      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)) {
      Entity entity = world.getEntityByID(((TileEntitySit) world.getTileEntity(x, y, z)).getEntityId());
      if (entity != null && entity.riddenByEntity == null) player.mountEntity(entity);
      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.tileentity;
      
      import net.minecraft.nbt.NBTTagCompound;
      import net.minecraft.network.NetworkManager;
      import net.minecraft.network.Packet;
      import net.minecraft.network.play.server.S35PacketUpdateTileEntity;
      import net.minecraft.tileentity.TileEntity;
      
      /**
      * @author SCAREX
      *
      */
      public class TileEntitySit extends TileEntity
      {
      protected int entityId;
      
      public int getEntityId() {
      return this.entityId;
      }
      
      public void setEntityId(int id) {
      this.entityId = id;
      }
      
      @Override
      public void readFromNBT(NBTTagCompound comp) {
      super.readFromNBT(comp);
      this.entityId = comp.getInteger("entityId");
      }
      
      @Override
      public void writeToNBT(NBTTagCompound comp) {
      super.writeToNBT(comp);
      comp.setInteger("entityId", this.entityId);
      }
      
      @Override
      public Packet getDescriptionPacket() {
      NBTTagCompound comp = new NBTTagCompound();
      this.writeToNBT(comp);
      return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 0, comp);
      }
      
      @Override
      public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) {
      this.readFromNBT(pkt.func_148857_g());
      }
      }
      
      package fr.scarex.hilium.entity;
      
      import net.minecraft.entity.Entity;
      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.setSize(0.2F, 0.2F);
      this.offsetY = 0.0F;
      }
      
      public EntitySit(World world, double x, double y, double z, float offsetY) {
      super(world);
      this.setSize(0.2F, 0.2F);
      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 double getMountedYOffset() {
      return this.offsetY;
      }
      }
      

      Site web contenant mes scripts : http://SCAREXgaming.github.io

      Pas de demandes de support par MP ni par skype SVP.
      Je n'accepte sur skype que l…

      1 réponse Dernière réponse Répondre Citer 0
      • Deleted
        Deleted dernière édition par

        Je ne sais pas mais dans la méthode onBlockAdded, peut-être rajouter une condition du genre si tu es sur le serveur comme side.

        
        if (!world.isRemote)
        
        

        Je suppose sa car c’est dans cette méthode que tu fais spawn le mob et la méthode spawnEntityInWorld n est que présente sur le serveur.
        Si ce n est pas sa, je regarderai de plus près ce week end quand je serai sur mon ordinateur 😉

        1 réponse Dernière réponse Répondre Citer 0
        • SCAREX
          SCAREX dernière édition par

          j’ai déjà essayé, mais çà ne change rien, justement je l’ai enlevé pour que le client soit synchronisé, mais çà ne change rien.

          Site web contenant mes scripts : http://SCAREXgaming.github.io

          Pas de demandes de support par MP ni par skype SVP.
          Je n'accepte sur skype que l…

          1 réponse Dernière réponse Répondre Citer 0
          • Deleted
            Deleted dernière édition par

            @‘SCAREX’:

            j’ai déjà essayé, mais çà ne change rien, justement je l’ai enlevé pour que le client soit synchronisé, mais çà ne change rien.

            Ha ok ^^ 
            Toute façon tu n es pas le seul a avoir du mal avec ces EntitySittable x)  si tu te souviens de mon poste…
            J ai chez moi le code d une EntitySittable sur laquelle on peut se déplacer (un genre de voiture). Penses que sa pourrait faire une bonne base si on retire les quelques méthodes qui gèrent le déplacement ?

            1 réponse Dernière réponse Répondre Citer 0
            • SCAREX
              SCAREX dernière édition par

              Tout ce qu’il me manque c’est la syncro.

              Site web contenant mes scripts : http://SCAREXgaming.github.io

              Pas de demandes de support par MP ni par skype SVP.
              Je n'accepte sur skype que l…

              1 réponse Dernière réponse Répondre Citer 0
              • L
                Laserflip33 dernière édition par

                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

                1 réponse Dernière réponse Répondre Citer 0
                • robin4002
                  robin4002 Moddeurs confirmés Rédacteurs Administrateurs dernière édition par

                  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.

                  1 réponse Dernière réponse Répondre Citer 0
                  • SCAREX
                    SCAREX dernière édition par

                    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>

                    Site web contenant mes scripts : http://SCAREXgaming.github.io

                    Pas de demandes de support par MP ni par skype SVP.
                    Je n'accepte sur skype que l…

                    1 réponse Dernière réponse Répondre Citer 0
                    • robin4002
                      robin4002 Moddeurs confirmés Rédacteurs Administrateurs dernière édition par

                      Tu as enregistré l’entité avec EntityRegistry.registerModEntity ?

                      1 réponse Dernière réponse Répondre Citer 0
                      • SCAREX
                        SCAREX dernière édition par

                        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.

                        Site web contenant mes scripts : http://SCAREXgaming.github.io

                        Pas de demandes de support par MP ni par skype SVP.
                        Je n'accepte sur skype que l…

                        1 réponse Dernière réponse Répondre Citer 0
                        • SCAREX
                          SCAREX dernière édition par

                          Si personne n’a d’idée pour résoudre ce problème, je report ce bug à MinecraftForge.

                          Site web contenant mes scripts : http://SCAREXgaming.github.io

                          Pas de demandes de support par MP ni par skype SVP.
                          Je n'accepte sur skype que l…

                          1 réponse Dernière réponse Répondre Citer 0
                          • robin4002
                            robin4002 Moddeurs confirmés Rédacteurs Administrateurs dernière édition par

                            Ça ne spawn toujours pas côté client ?

                            1 réponse Dernière réponse Répondre Citer 0
                            • SCAREX
                              SCAREX dernière édition par

                              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.

                              Site web contenant mes scripts : http://SCAREXgaming.github.io

                              Pas de demandes de support par MP ni par skype SVP.
                              Je n'accepte sur skype que l…

                              1 réponse Dernière réponse Répondre Citer 0
                              • SCAREX
                                SCAREX dernière édition par

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

                                Site web contenant mes scripts : http://SCAREXgaming.github.io

                                Pas de demandes de support par MP ni par skype SVP.
                                Je n'accepte sur skype que l…

                                1 réponse Dernière réponse Répondre Citer 0
                                • robin4002
                                  robin4002 Moddeurs confirmés Rédacteurs Administrateurs dernière édition par

                                  Ajoute implements IEntityAdditionalSpawnData et avec writeSpawnData et readSpawnData synchro la valeur de offsetY.

                                  1 réponse Dernière réponse Répondre Citer 0
                                  • SCAREX
                                    SCAREX dernière édition par

                                    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 :

                                    Site web contenant mes scripts : http://SCAREXgaming.github.io

                                    Pas de demandes de support par MP ni par skype SVP.
                                    Je n'accepte sur skype que l…

                                    1 réponse Dernière réponse Répondre Citer 0
                                    • Snyker
                                      Snyker dernière édition par

                                      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 ).

                                      Aucune signature n'est disponible pour une barre chocolatée.

                                      1 réponse Dernière réponse Répondre Citer 0
                                      • SCAREX
                                        SCAREX dernière édition par

                                        Si tu veux, si j’arrives à corriger ce bug… #MojangCorrectYourBugs (je suis pas censé publier de screenshots du model que j’utilise)

                                        Site web contenant mes scripts : http://SCAREXgaming.github.io

                                        Pas de demandes de support par MP ni par skype SVP.
                                        Je n'accepte sur skype que l…

                                        1 réponse Dernière réponse Répondre Citer 0
                                        • Mikavanille39
                                          Mikavanille39 dernière édition par

                                          Tkt Scarex, c’est correct pour les photos, juste pas donner le model 😛

                                          1 réponse Dernière réponse Répondre Citer 0
                                          • robin4002
                                            robin4002 Moddeurs confirmés Rédacteurs Administrateurs dernière édition par

                                            Quand tu dis certains temps, c’est combien environ ?

                                            1 réponse Dernière réponse Répondre Citer 0
                                            • 1
                                            • 2
                                            • 1 / 2
                                            • Premier message
                                              Dernier message
                                            Design by Woryk
                                            Contact / Mentions Légales

                                            MINECRAFT FORGE FRANCE © 2018

                                            Powered by NodeBB