1.12.2 Problème de rendue avec des EntityThrowable



  • Bonjour, je développe un mod basé sur la neige et la glace, et j'ai décidé d'ajouté deux nouvelle EntityThrowable.
    Une boule de glace et une boule de neige qui infligent des dégat au joueur.
    Mais je rencontre un problème de rendue, le rendue de la boule de glace se crée bien, mais le rendue de la boule de neige prend la texture de celui de la boule de glace
    Les rendues en jeu :
    Celui de la boule de glace :
    iceBallRender.jpg
    Celui de la boule de neige:
    snowballRender.jpg
    La classe de rendue de la boule de glace :

    @SideOnly(Side.CLIENT)
    public class RenderIceBall<T extends Entity> extends Render<T> {
    
        protected final Item item;
        private final RenderItem itemRenderer;
    
        public RenderIceBall(RenderManager renderManagerIn, Item itemIn, RenderItem renderItemIn) {
            super(renderManagerIn);
            this.item = itemIn;
            this.itemRenderer = renderItemIn;
        }
    
        public void doRender(T 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();
            super.doRender(entity, x, y, z, entityYaw, partialTicks);
        }
    
        public ItemStack getStackToRender(T entityIn)
        {
            return new ItemStack(this.item);
        }
    
        @Nullable
        protected ResourceLocation getEntityTexture(Entity entity) {
            return TextureMap.LOCATION_BLOCKS_TEXTURE;
        }
    }
    

    La classe de rendue de la boule de neige :

    @SideOnly(Side.CLIENT)
    public class RenderDamageSnowball<T extends Entity> extends Render<T> {
    
        protected final Item item;
        private final RenderItem itemRenderer;
    
        public RenderDamageSnowball(RenderManager renderManagerIn, Item itemIn, RenderItem itemRendererIn) {
            super(renderManagerIn);
            this.item = itemIn;
            this.itemRenderer = itemRendererIn;
        }
        public void doRender(T 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();
            super.doRender(entity, x, y, z, entityYaw, partialTicks);
        }
    
        public ItemStack getStackToRender(T entityIn)
        {
            return new ItemStack(this.item);
        }
    
        @Nullable
        protected ResourceLocation getEntityTexture(Entity entity) {
            return TextureMap.LOCATION_BLOCKS_TEXTURE;
        }
    }
    

    La classe d'enregistrement des rendues :

    public class RegisterRendering {
        public static void registerEntityRender() {
            SnowProjectMain.logger.info("Register rendering of entities");
            RenderingRegistry.registerEntityRenderingHandler(EntityThrowDamageSnowball.class, new IRenderFactory<EntityThrowDamageSnowball>() {
                @Override
                public Render<? super EntityThrowDamageSnowball> createRenderFor(RenderManager manager) {
                    return new RenderDamageSnowball(manager, ModItems.DAMAGE_SNOWBALL, Minecraft.getMinecraft().getRenderItem());
                }
            });
            RenderingRegistry.registerEntityRenderingHandler(EntityThrowIceBall.class, new IRenderFactory<EntityThrowIceBall>() {
                @Override
                public Render<? super EntityThrowIceBall> createRenderFor(RenderManager manager) {
                    return new RenderIceBall(manager, ModItems.ICE_BALL, Minecraft.getMinecraft().getRenderItem());
                }
            });
        }
    }
    

    La classe principale :

    @Mod(modid = Reference.MODID, name = Reference.NAME, version = Reference.VERSION)
    public class SnowProjectMain {
        @Instance
        public static SnowProjectMain instance;
        @SidedProxy(clientSide = "fr.asonyx.snowproject.proxy.ClientProxy", serverSide = "fr.asonyx.snowproject.proxy.CommonProxy")
        public static CommonProxy proxy;
    
        public static Logger logger;
    
        @EventHandler
        public void preInit(FMLPreInitializationEvent e) {
            logger = e.getModLog();
            proxy.preInit(e.getSuggestedConfigurationFile());
            RegisterRendering.registerEntityRender();
        }
        @EventHandler
        public void Init(FMLInitializationEvent e) {
            proxy.Init();
            ModEntities.registerEntities();
        }
        @EventHandler
        public void postInit(FMLPostInitializationEvent e){
    
        }
    
        public SnowProjectMain() {
            MinecraftForge.EVENT_BUS.register(new FreezeEvent());
            MinecraftForge.EVENT_BUS.register(new RegisterHandler());
        }
    }
    

    La classe de l'entité de la boule de glace :

    public class EntityThrowIceBall extends EntityThrowable {
    
        public EntityThrowIceBall(World worldIn) {
            super(worldIn);
        }
    
        @SideOnly(Side.CLIENT)
        public EntityThrowIceBall(World worldIn, double x, double y, double z) {
            super(worldIn, x, y, z);
        }
    
        public EntityThrowIceBall(World worldIn, EntityLivingBase throwerIn) {
            super(worldIn, throwerIn);
        }
    
        public static void registerFixesRock(DataFixer fixer) {
            EntityThrowable.registerFixesThrowable(fixer, "ThrownIceBall");
        }
    
        @Override
        protected void onImpact(RayTraceResult result) {
            EntityLivingBase thrower = this.getThrower();
            if (result.entityHit != null) {
                result.entityHit.attackEntityFrom(DamageSource.causeThrownDamage(this, thrower), 5.0F);
            }
            if (!this.world.isRemote) {
                this.world.setEntityState(this, (byte)3);
                this.setDead();
            }
        }
    
        @Override
        public void onUpdate() {
            EntityLivingBase thrower = this.getThrower();
            if (thrower != null && thrower instanceof EntityPlayer && !thrower.isEntityAlive()) this.setDead();
            else super.onUpdate();
        }
    }
    

    La classe de l'entié de la boule de neige :

    public class EntityThrowDamageSnowball extends EntityThrowable {
    
        public EntityThrowDamageSnowball(World worldIn) {
            super(worldIn);
        }
    
        @SideOnly(Side.CLIENT)
        public EntityThrowDamageSnowball(World worldIn, double x, double y, double z) {
            super(worldIn, x, y, z);
        }
    
        public EntityThrowDamageSnowball(World worldIn, EntityLivingBase throwerIn) {
            super(worldIn, throwerIn);
        }
    
        public static void registerFixesRock(DataFixer fixer) {
            EntityThrowable.registerFixesThrowable(fixer, "ThrownDamageSnowball");
        }
    
        @Override
        protected void onImpact(RayTraceResult result) {
            EntityLivingBase thrower = this.getThrower();
            if (result.entityHit != null) {
                result.entityHit.attackEntityFrom(DamageSource.causeThrownDamage(this, thrower), 1.0F);
            }
            if (!this.world.isRemote) {
                this.world.setEntityState(this, (byte)3);
                this.setDead();
            }
        }
    
        @Override
        public void onUpdate() {
            EntityLivingBase thrower = this.getThrower();
            if (thrower != null && thrower instanceof EntityPlayer && !thrower.isEntityAlive()) this.setDead();
            else super.onUpdate();
        }
    }
    

    PS : Je suis encore débutant


  • Moddeurs confirmés Rédacteurs Administrateurs

    @Asonyx a dit dans Problème de rendue avec des EntityThrowable :

    En plus, (je ne sais pas si c'est ma version de forge) je ne trouve pas la classe RenderItemThrowable

    Heu effectivement je me suis planté, c'est une classe d'un de mes mods et non de Minecraft.

    Dans la classe RenderDamageSnowball dans cette fonction :

        public ItemStack getStackToRender(T entityIn)
        {
            return new ItemStack(this.item);
        }
    

    si tu remplaces this.item par ModItems.ICE_BALL ça donne quoi ?

    ÉDIT :

    Tes entités ont le même id, -1.
    Donc forcement quand le serveur envoie un paquet au client pour dire que l'entité à spawn, le client voit tous le temps la même.
    Remplaces le premier -1 par 1 et le deuxième par 2 dans la fonction EntityRegistry.registerModEntity


  • Moddeurs confirmés Rédacteurs Administrateurs

    Bonjour,
    Tu peux envoyer le contenu de la classe ModItems ?

    Techniquement, la même classe de rendu pourrait être utilisé pour les deux (tu peux même utiliser la classe RenderItemThrowable de Minecraft, par exemple :

            RenderingRegistry.registerEntityRenderingHandler(EntitySlimeBall.class, manager -> new RenderItemThrowable(Items.SLIME_BALL,  Minecraft.getMinecraft() manager));
    

    ).



  • La classe ModItems :

    @EventBusSubscriber(value = Side.CLIENT,modid = Reference.MODID)
    public class ModItems {
    
        public static final Item GLOVE = new ItemBase("glove", 1, CreativeTabs.COMBAT);
        public static final Item SUGAR_STICK = new ItemBase("sugar_stick", 64, CreativeTabs.MISC);
        public static final Item ICE_BALL = new ItemIceBall();
        public static final Item DAMAGE_SNOWBALL = new ItemDamageSnowball();
        public static final Item CANDY_CANE = new FoodItem("candy_cane",64,2, CreativeTabs.FOOD, false, 2.0F);
        public static final Item BLOCK_ICE_SNOW_ITEM = new ItemBlock(ModBlock.ICE_SNOW).setRegistryName(ModBlock.ICE_SNOW.getRegistryName());
        public static final Item BLOCK_CANDY_CANE_ITEM = new ItemBlock(ModBlock.CANDY_CANE).setRegistryName(ModBlock.CANDY_CANE.getRegistryName());
        public static final Item BLOCK_WHITE_LEAVE_ITEM = new ItemBlock(ModBlock.WHITE_LEAVE).setRegistryName(ModBlock.WHITE_LEAVE.getRegistryName());
        public static final Item BLOCK_RED_CHRISTMAS_BALL_ITEM = new ItemBlock(ModBlock.RED_CHISTMAS_BALL).setRegistryName(ModBlock.RED_CHISTMAS_BALL.getRegistryName());
        public static final Item BLOCK_BLUE_CHRISTMAS_BALL_ITEM = new ItemBlock(ModBlock.BLUE_CHRISTMAS_BALL).setRegistryName(ModBlock.BLUE_CHRISTMAS_BALL.getRegistryName());
        public static final Item BLOCK_GREEN_CHRISTMAS_BALL_ITEM = new ItemBlock(ModBlock.GREEN_CHRISTMAS_BALL).setRegistryName(ModBlock.GREEN_CHRISTMAS_BALL.getRegistryName());
        public static final Item BLOCK_YELLOW_CHRISTMAS_BALL_ITEM = new ItemBlock(ModBlock.YELLOW_CHRISTMAS_BALL).setRegistryName(ModBlock.YELLOW_CHRISTMAS_BALL.getRegistryName());
        public static final Item BLOCK_LUCKY_ICE_SNOW = new ItemBlock(ModBlock.LUCKY_ICE_SNOW).setRegistryName(ModBlock.LUCKY_ICE_SNOW.getRegistryName());
    
        public static void setItemName(Item item, String name) {
            item.setRegistryName(Reference.MODID, name).setUnlocalizedName(Reference.MODID + "." + name);
        }
    
        @SideOnly(Side.CLIENT)
        @SubscribeEvent
        public static void registerItemModels(ModelRegistryEvent e) {
            // Items
            registerModel(GLOVE,0);
            registerModel(ICE_BALL,0);
            registerModel(DAMAGE_SNOWBALL, 0);
            registerModel(SUGAR_STICK, 0);
            // Food Items
            registerModel(CANDY_CANE,0);
            // Blocks
            registerModel(BLOCK_ICE_SNOW_ITEM,0);
            registerModel(BLOCK_CANDY_CANE_ITEM,0);
            registerModel(BLOCK_WHITE_LEAVE_ITEM,0);
            registerModel(BLOCK_RED_CHRISTMAS_BALL_ITEM,0);
            registerModel(BLOCK_BLUE_CHRISTMAS_BALL_ITEM,0);
            registerModel(BLOCK_GREEN_CHRISTMAS_BALL_ITEM,0);
            registerModel(BLOCK_YELLOW_CHRISTMAS_BALL_ITEM,0);
            registerModel(BLOCK_LUCKY_ICE_SNOW, 0);
        }
    
        @SideOnly(Side.CLIENT)
        public static void registerModel(Item item, int metadata) {
            if (metadata < 0) metadata = 0;
            String resourceName = item.getUnlocalizedName().substring(5).replace('.', ':');
            if (metadata > 0) resourceName += "_m" + String.valueOf(metadata);
    
            ModelLoader.setCustomModelResourceLocation(item, metadata, new ModelResourceLocation(resourceName, "inventory"));
        }
    }
    

    Je met aussi la classe ItemDamageSnowball et ModEntities

    ItemDamageSnowball :

    public class ItemDamageSnowball extends Item {
        public static final String NAME = "damage_snowball";
    
        public ItemDamageSnowball() {
            ModItems.setItemName(this, NAME);
            setMaxStackSize(16);
            setCreativeTab(CreativeTabs.MISC);
        }
    
        @Override
        public ActionResult<ItemStack> onItemRightClick(World worldIn, EntityPlayer playerIn, EnumHand handIn) {
            ItemStack stack = playerIn.getHeldItem(handIn);
    
            if (playerIn.capabilities.isCreativeMode) stack.shrink(0);
            else stack.shrink(1);
    
            worldIn.playSound((EntityPlayer) null, playerIn.posX, playerIn.posY, playerIn.posZ, SoundEvent.REGISTRY.getObject(new ResourceLocation("entity.snowball.throw")), SoundCategory.PLAYERS, 1.0F, 1.0F / (itemRand.nextFloat() * 0.4F + 0.8F));
    
            if(!worldIn.isRemote) {
                EntityThrowDamageSnowball iceball = new EntityThrowDamageSnowball(worldIn, playerIn);
                iceball.shoot(playerIn, playerIn.rotationPitch, playerIn.rotationYaw, 0.0F, 1.5F, 1.0F);
                worldIn.spawnEntity(iceball);
    
            }
            playerIn.addStat(StatList.getObjectUseStats(this));
            return new ActionResult<>(EnumActionResult.SUCCESS, stack);
        }
    }
    

    La classe ItemIceBall est la même que ItemDamageSnowball (a quelques lignes de codes près)

    ModEntities :

    public class ModEntities {
        public static void registerEntities() {
            EntityRegistry.registerModEntity(new ResourceLocation(Reference.MODID + ":ice_ball"), EntityThrowIceBall.class, "IceBall", -1, SnowProjectMain.instance, 64, 1, true);
            EntityRegistry.registerModEntity(new ResourceLocation(Reference.MODID + ":damage_snowball"), EntityThrowDamageSnowball.class, "DamageSnowball", -1, SnowProjectMain.instance, 64, 1, true);
        }
    }
    


  • En plus, (je ne sais pas si c'est ma version de forge) je ne trouve pas la classe RenderItemThrowable


  • Moddeurs confirmés Rédacteurs Administrateurs

    @Asonyx a dit dans Problème de rendue avec des EntityThrowable :

    En plus, (je ne sais pas si c'est ma version de forge) je ne trouve pas la classe RenderItemThrowable

    Heu effectivement je me suis planté, c'est une classe d'un de mes mods et non de Minecraft.

    Dans la classe RenderDamageSnowball dans cette fonction :

        public ItemStack getStackToRender(T entityIn)
        {
            return new ItemStack(this.item);
        }
    

    si tu remplaces this.item par ModItems.ICE_BALL ça donne quoi ?

    ÉDIT :

    Tes entités ont le même id, -1.
    Donc forcement quand le serveur envoie un paquet au client pour dire que l'entité à spawn, le client voit tous le temps la même.
    Remplaces le premier -1 par 1 et le deuxième par 2 dans la fonction EntityRegistry.registerModEntity



  • @robin4002
    Cela fonctionne beaucoup mieux comme ça.
    Merci et bonne fin de journée


Log in to reply