Entity Projectile : Problème impacte avec Block



  • ( 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>



  • 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 ?



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


  • Administrateurs

    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é ?