MFF

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

    Problème de rendue avec des EntityThrowable

    Planifier Épinglé Verrouillé Déplacé Résolu 1.12.x
    1.12.2
    6 Messages 2 Publieurs 311 Vues 2 Watching
    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.
    • AsonyxA Hors-ligne
      Asonyx
      dernière édition par

      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

      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 robin4002

        @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

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

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

          ).

          1 réponse Dernière réponse Répondre Citer 0
          • AsonyxA Hors-ligne
            Asonyx
            dernière édition par robin4002

            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);
                }
            }
            
            AsonyxA 1 réponse Dernière réponse Répondre Citer 0
            • AsonyxA Hors-ligne
              Asonyx @Asonyx
              dernière édition par

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

              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 robin4002

                @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

                AsonyxA 1 réponse Dernière réponse Répondre Citer 1
                • AsonyxA Hors-ligne
                  Asonyx @robin4002
                  dernière édition par

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

                  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