MFF

    Minecraft Forge France
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes
    • Forge Events
      • Automatique
      • Foncé
      • Clair
    • S'inscrire
    • Se connecter

    Entity Projectile : Problème impacte avec Block

    Planifier Épinglé Verrouillé Déplacé Sans suite
    1.12.x
    4 Messages 3 Publieurs 1.0k Vues 1 Abonné
    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.
    • M Hors-ligne
      Mailevy
      dernière édition par

      ( forge-1.12-14.21.1.2443-mdk )

      Bonjour,

      Mon but est le suivant : un Projectile capable de se planter dans le sol lors de son impact.

      Hors , lors de l’impact de mon projectile sur un Block , ce dernier ne reste pas immobile sur le Block .
      En effet , il prend deux positions :
      Position 1 ( Impact ) :

      Position 2 ( peu de temps après l’impact ) :

      Le projectile alterne ces deux positions à chaque seconde.

      Remarque : Plus je le lance loin , moins la hauteur entre ses deux positions est grande ( à une certaine distance , le projectile n’alterne plus ces deux positions et reste immobile Position 1 ) .
                               **Si je me déconnecte et me reconnecte à la Map , le projectile n’alterne plus ses deux positions et reste immobile ( Position 1 ) .

      **Je vous fournis le code :

      EntityProjectile.java

      package fr.mailevy.mod.entity.projectile;
      
      import java.util.List;
      
      import fr.mailevy.mod.Reference;
      import net.minecraft.block.Block;
      import net.minecraft.block.material.Material;
      import net.minecraft.block.state.IBlockState;
      import net.minecraft.entity.Entity;
      import net.minecraft.entity.EntityLivingBase;
      import net.minecraft.entity.projectile.EntityThrowable;
      import net.minecraft.init.Blocks;
      import net.minecraft.init.SoundEvents;
      import net.minecraft.server.MinecraftServer;
      import net.minecraft.util.DamageSource;
      import net.minecraft.util.EnumParticleTypes;
      import net.minecraft.util.ResourceLocation;
      import net.minecraft.util.math.AxisAlignedBB;
      import net.minecraft.util.math.BlockPos;
      import net.minecraft.util.math.MathHelper;
      import net.minecraft.util.math.RayTraceResult;
      import net.minecraft.util.math.Vec3d;
      import net.minecraft.util.math.RayTraceResult.Type;
      import net.minecraft.world.World;
      import net.minecraft.world.WorldServer;
      import net.minecraftforge.fml.common.registry.EntityRegistry;
      
      public class EntityProjectile extends EntityThrowable{
      
          private boolean impact = false;
          private Vec3d pos;
      
          public EntityProjectile(World worldIn)
          {
              super(worldIn);
      
          }
      
          public EntityProjectile(World worldIn, EntityLivingBase throwerIn)
          {
              super(worldIn, throwerIn);
      
          }
      
          public EntityProjectile(World worldIn, double x, double y, double z)
          {
              super(worldIn, x, y, z);
      
          }
      
          public static void registerEntity()
          {
      
              EntityRegistry.registerModEntity(new ResourceLocation("mod" , "projectile"), EntityProjectile.class, "projectile", 0001 , Reference.modid , 64, 10, true);
          }
      
          @Override
          public void setThrowableHeading(double x, double y, double z, float velocity, float inaccuracy)
          {
              super.setThrowableHeading(x, y, z, velocity, inaccuracy);
          }       
      
          protected float getGravityVelocity()
          {
              return 0.1F;
          }
      
          @Override
          public void onUpdate()
          {
      
              super.onUpdate();
      
              if(this.impact)
              {
                  this.motionX = 0;
                  this.motionY = 0;
                  this.motionZ = 0;
                  this.setPosition(this.pos.x, this.pos.y, this.pos.z);
              }
      
          }    
      
          @Override
          protected void onImpact(RayTraceResult result)
          {
              if(result.typeOfHit == Type.ENTITY.BLOCK)    
              {            
                  this.pos = new Vec3d(result.hitVec.x, result.hitVec.y, result.hitVec.z);       
                  this.impact = true;             
              }
      
          }
      
      }
      
      

      RenderEntityProjectile.java

      package fr.mailevy.mod.entity.projectile;
      
      import net.minecraft.client.Minecraft;
      import net.minecraft.client.renderer.GlStateManager;
      import net.minecraft.client.renderer.RenderItem;
      import net.minecraft.client.renderer.block.model.ItemCameraTransforms;
      import net.minecraft.client.renderer.entity.Render;
      import net.minecraft.client.renderer.entity.RenderManager;
      import net.minecraft.client.renderer.entity.RenderSnowball;
      import net.minecraft.client.renderer.texture.TextureMap;
      import net.minecraft.entity.Entity;
      import net.minecraft.item.Item;
      import net.minecraft.util.ResourceLocation;
      import net.minecraftforge.fml.client.registry.IRenderFactory;
      import net.minecraftforge.fml.client.registry.RenderingRegistry;
      import fr.mailevy.mod.Reference;
      import fr.mailevy.mod.init.ItemsMod;
      
      public class RenderEntityProjectile extends RenderSnowball<entityprojectile>{
      
          protected final Item item;
          private final RenderItem itemRenderer;
      
          public RenderEntityProjectile(RenderManager renderManagerIn)
          {
              super(renderManagerIn , ItemsMod.itemProjectile , Minecraft.getMinecraft().getRenderItem());
              this.item = ItemsMod.itemEntityProjectile;
              this.itemRenderer = Minecraft.getMinecraft().getRenderItem();
      
          }
      
          public static void RenderRegistry()
          {    
              RenderingRegistry.registerEntityRenderingHandler(EntityProjectile.class, new IRenderFactory<entityprojectile>()
              {
                  @Override
                  public Render <entityprojectile>createRenderFor(RenderManager manager)
                  {
                      return new RenderEntityProjectile(manager);
                  }
      
              });
          }
      
          public void doRender(EntityProjectile entity, double x, double y, double z, float entityYaw, float partialTicks)
          {
              GlStateManager.pushMatrix();
              GlStateManager.translate((float)x, (float)y, (float)z);
              GlStateManager.enableRescaleNormal();        
              GlStateManager.rotate(-this.renderManager.playerViewY, 0.0F, 1.0F, 0.0F);
              GlStateManager.rotate((float)(this.renderManager.options.thirdPersonView == 2 ? -1 : 1) * this.renderManager.playerViewX, 1.0F, 0.0F, 0.0F);        
              GlStateManager.rotate(180.0F, 0.0F, 1.0F, 0.0F);
              this.bindTexture(TextureMap.LOCATION_BLOCKS_TEXTURE);
      
              if (this.renderOutlines)
              {
                  GlStateManager.enableColorMaterial();
                  GlStateManager.enableOutlineMode(this.getTeamColor(entity));
              }
      
              this.itemRenderer.renderItem(this.getStackToRender(entity), ItemCameraTransforms.TransformType.GROUND);
      
              if (this.renderOutlines)
              {
                  GlStateManager.disableOutlineMode();
                  GlStateManager.disableColorMaterial();
              }
      
              GlStateManager.disableRescaleNormal();
              GlStateManager.popMatrix();
          }
      
      }
      
      

      EntitiesMod.java

      package fr.mailevy.mod.init;
      
      import net.minecraft.client.Minecraft;
      import net.minecraft.client.renderer.entity.Render;
      import net.minecraft.client.renderer.entity.RenderManager;
      import net.minecraft.entity.Entity;
      import net.minecraft.entity.projectile.EntityThrowable;
      import net.minecraftforge.fml.client.registry.IRenderFactory;
      import net.minecraftforge.fml.client.registry.RenderingRegistry;
      import fr.mailevy.mod.entity.projectile.EntityProjectile;
      import fr.mailevy.mod.entity.projectile.RenderEntityProjectile;
      
      public class EntitiesMod {
      
          public static void registerEntityRenderingHandlers()
          {
              EntityProjectile.registerEntity();
              RenderEntityProjectile.RenderRegistry();
          }
      
      }
      

      Client.java

      package fr.mailevy.mod;
      
      import java.io.File;
      
      import net.minecraft.client.Minecraft;
      import net.minecraft.client.renderer.entity.Render;
      import net.minecraft.client.renderer.entity.RenderManager;
      import net.minecraft.client.renderer.entity.RenderSnowball;
      import net.minecraft.entity.Entity;
      import net.minecraft.entity.monster.EntityEnderman;
      import net.minecraft.init.Items;
      import net.minecraftforge.fml.client.registry.IRenderFactory;
      import net.minecraftforge.fml.client.registry.RenderingRegistry;
      import fr.mailevy.mod.entity.projectile.EntityProjectile;
      import fr.mailevy.mod.entity.projectile.RenderEntityProjectile;
      import fr.mailevy.mod.init.EntitiesMod;
      import fr.mailevy.mod.init.ItemsMod;
      
      public class Client extends Common{
      
          @Override
          public void preInit(File configFile)
          {
              super.preInit(configFile);
              System.out.println("Pre init côté client");
              EntitiesMod.registerEntityRenderingHandlers();
          }
      
          @Override
          public void init()
          {
              super.init();
      
          }
      
          @Override
          public void RegisterRenders()
          {
              ItemsMod.registerRenders();
          }
      
      }
      
      

      Merci :-3</entityprojectile></entityprojectile></entityprojectile>

      1 réponse Dernière réponse Répondre Citer 0
      • M Hors-ligne
        Mailevy
        dernière édition par

        En modifiant la classe de l’item qui fait spawn l’entité cela fonctionne .

        Modification :

             if (!worldIn.isRemote)
                 {
                         EntityProjectile h = new EntityProjectile(worldIn, playerIn.posX, playerIn.posY, playerIn.posZ);
                         h.setHeadingFromThrower(playerIn, playerIn.rotationPitch, playerIn.rotationYaw, 0.0f, 1.5f, 0.0f);                
                        worldIn.spawnEntity(h);
        
                 }
        

        par

             if (worldIn.isRemote)
                 {
        
                        EntityProjectile h = new EntityProjectile(worldIn, playerIn.posX, playerIn.posY, playerIn.posZ);
                         h.setHeadingFromThrower(playerIn, playerIn.rotationPitch, playerIn.rotationYaw, 0.0f, 1.5f, 0.0f);                
                        worldIn.spawnEntity(h);
        
                 }
        

        ( J’ai supprimer le " ! " )

        Une personne pourrais m’expliquer pourquoi cette fois sa marche ?

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

          Pas une bonne idée de la faire spawn uniquement côté client.
          Pour répondre à ta question, sans trop m’avancer, je dirai que les motion ne sont gérés que côté client, du coup en la faisant spawn sur cette side, les trois variables sont bien reset à zéro et donc ta grenade ne bouge plus du tout. Le mieux aurait été un spawn uniquement côté serveur, mais implémenter ta classe entity de cette interface IEntityAdditionalSpawnData pour synchroniser les motions.

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

            Salut,
            Il y a surement un problème de synchro client <-> serveur.
            Faire spawner l’entité seulement sur le client n’est pas une bonne idée.

            Comment enregistres-tu ton entité ?

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

            MINECRAFT FORGE FRANCE © 2024

            Powered by NodeBB