Résolu 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 :
Celui de la boule de neige:
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
-
@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 classeRenderDamageSnowball
dans cette fonction :public ItemStack getStackToRender(T entityIn) { return new ItemStack(this.item); }
si tu remplacesthis.item
parModItems.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 fonctionEntityRegistry.registerModEntity
-
Bonjour,
Tu peux envoyer le contenu de la classeModItems
?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
-
@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 classeRenderDamageSnowball
dans cette fonction :public ItemStack getStackToRender(T entityIn) { return new ItemStack(this.item); }
si tu remplacesthis.item
parModItems.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 fonctionEntityRegistry.registerModEntity
-
@robin4002
Cela fonctionne beaucoup mieux comme ça.
Merci et bonne fin de journée