Navigation

    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Popular
    • Users
    • Groups

    Entity Projectile : Problème impacte avec Block

    Sans suite
    1.12.x
    3
    4
    782
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • M
      Mailevy last edited by

      ( 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 Reply Last reply Reply Quote 0
      • M
        Mailevy last edited by

        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 Reply Last reply Reply Quote 0
        • Deleted
          Deleted last edited by

          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 Reply Last reply Reply Quote 0
          • robin4002
            robin4002 Administrateurs Rédacteurs Moddeurs confirmés last edited by

            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 Reply Last reply Reply Quote 0
            • 1 / 1
            • First post
              Last post
            Design by Woryk
            Contact / Mentions Légales / Faire un don

            MINECRAFT FORGE FRANCE © 2018

            Powered by NodeBB