Rendu 3D différent avec clic gauche / Rendu Custom d'Item
-
En fait tout se passe dans ton event InputEvent.MouseInputEvent
Dès que tu fais clic droit, on va vérifier si l’itemstack de l’item tenu par le joueur a bien init ses tags, d’où ma condition :
if(stack.getTagCompound == null) //Si ils sont nuls, tu les sets itemstack.setTagCompound(new NBTTagCompound()); else //Sinon c'est qu'ils sont bien déjà initialisés, donc il suffit juste d'inverser leur valeur de boolean, qui agira directement sur le model à rendre itemstack.getTagCompound().setBoolean("onUse", !(itemstack.getTagCompound().getBoolean("onUse"));Pour la gestion d’un des 2 modèles à rendre, c’est à voir avec ce tuto
Crées un tableau de ModelBase puis voies avec les tags de ton itemstack, lequel tu souhaites rendre, ce n’est vraiment pas compliqué
-
Du coup,
:::
@SubscribeEvent public void mouseInput(InputEvent.MouseInputEvent event) { ItemStack itemstack = Minecraft.getMinecraft().thePlayer.getCurrentEquippedItem(); if(Mouse.getEventButton() == 0 && itemstack != null && itemstack.getItem() == ModPg2.itemRailGun && Minecraft.getMinecraft().currentScreen == null) { ModPg2.zoom2 = !ModPg2.zoom2; } if(Mouse.getEventButton() == 0 && itemstack != null && itemstack.getItem() == ModPg2.itemPlasmaGun && Minecraft.getMinecraft().currentScreen == null) { ModPg2.zoom3 = !ModPg2.zoom3; } if(Mouse.getEventButton() == 0 && itemstack != null && itemstack.getItem() == ModPg2.itemPompe && Minecraft.getMinecraft().currentScreen == null) { if(itemstack.getTagCompound() == null) itemstack.setTagCompound(new NBTTagCompound()); else itemstack.getTagCompound().setBoolean("onUse", !(itemstack.getTagCompound().getBoolean("onUse"))); System.out.println(itemstack.getTagCompound().getBoolean("onUse")); System.out.println("Eh eh, alors?"); } }:::
La méthode semble appelée 2 fois et le rendu reste le même.
:::
public class RenderPompe implements IItemRenderer { protected ModelPompe model; protected static final ResourceLocation texture = new ResourceLocation("ModPg2:textures/models/items/Pompe.png"); public RenderPompe() { model = new ModelPompe(); } @Override public boolean handleRenderType(ItemStack item, ItemRenderType type) { switch(type) { case EQUIPPED: return true; case EQUIPPED_FIRST_PERSON: return true; default: return false; } } @Override public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { return false; } @Override public void renderItem(ItemRenderType type, ItemStack item, Object… data) { switch(type) { case EQUIPPED: { if(item.getTagCompound().getBoolean("onUse") == true) { GL11.glPushMatrix(); GL11.glRotatef(90.F, 1.0F, 0.2F, 0.0F); GL11.glRotatef(100.F, 1.0F, 0.0F, 0.0F); GL11.glTranslatef(0.5F, -0.35F, -0.75F); GL11.glScaled(0.5F, 0.5F, 0.5F); Minecraft.getMinecraft().renderEngine.bindTexture(texture); model.render((Entity)data[1], 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F); GL11.glPopMatrix(); break; } else { GL11.glPushMatrix(); GL11.glRotatef(90.F, 1.0F, 0.2F, 0.0F); GL11.glRotatef(100.F, 1.0F, 0.0F, 0.0F); GL11.glTranslatef(0.5F, -0.35F, -0.75F); GL11.glScaled(2.5F, 2.5F, 2.5F); Minecraft.getMinecraft().renderEngine.bindTexture(texture); model.render((Entity)data[1], 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F); GL11.glPopMatrix(); break; } } case EQUIPPED_FIRST_PERSON: { GL11.glPushMatrix(); GL11.glRotatef(90.F, 1.0F, -0.2F, 0.0F); GL11.glRotatef(100.F, 0.5F, -0.2F, -0.65F); GL11.glRotatef(30.F, -0.2F, -1.2F, 0.0F); GL11.glTranslatef(-0.25F, 0.55F, -2.8F); GL11.glScaled(1F, 1F, 1F); Minecraft.getMinecraft().renderEngine.bindTexture(texture); model.render((Entity)null, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F); GL11.glPopMatrix(); break; } default: break; } } }:::
Edit: La méthode est appelée quand j’appuie et quand je relâche (c’est le fontionnement que j’espérais alors ce n’est pas un problème). Reste le rendu Xd
-
Que dit la console, la valeur change bien ? Check aussi si les tag son bien init ou si ils sont toujours nuls…
Quant aux models, il me faudrait ta classe implémentant IItemRenderer pour voir de+près
-
Résolu!
Erreur de manip’ avec la fatigue. Je modifiais le mauvais type de rendu (3ème personne_ EQUIPED)
Du coup, un grand merci pour ce gros coup de pouce pour les nbt ^^
-
Que dit la console, la valeur change bien ? Check aussi si les tag son bien init ou si ils sont toujours nuls…
Quant aux models, il me faudrait ta classe implémentant IItemRenderer pour voir de + près
EDIT = Normal que ton modèle ne change pas, tu n’en as pas ajouté de deuxième…Si aucun changement, print et debug à fond, c’est la meilleure solution
-
Bon avec un item ça va, avec plusieurs ça crash. Je ne comprends pas le soucis (qui est un NPE: pastebin)
:::
@SubscribeEvent public void mouseInput(InputEvent.MouseInputEvent event) { ItemStack itemstack = Minecraft.getMinecraft().thePlayer.getCurrentEquippedItem(); if(Mouse.getEventButton() == 0 && itemstack != null && itemstack.getItem() == ModPg2.itemRailGun && Minecraft.getMinecraft().currentScreen == null) { ModPg2.zoom2 = !ModPg2.zoom2; } if(Mouse.getEventButton() == 0 && itemstack != null && itemstack.getItem() == ModPg2.itemPlasmaGun && Minecraft.getMinecraft().currentScreen == null) { ModPg2.zoom3 = !ModPg2.zoom3; } if(Mouse.getEventButton() == 0 && itemstack != null && itemstack.getItem() == ModPg2.itemPompe && Minecraft.getMinecraft().currentScreen == null) { if(itemstack.getTagCompound() == null) itemstack.setTagCompound(new NBTTagCompound()); else itemstack.getTagCompound().setBoolean("onUse1", !(itemstack.getTagCompound().getBoolean("onUse1"))); } if(Mouse.getEventButton() == 0 && itemstack != null && itemstack.getItem() == ModPg2.itemThomson && Minecraft.getMinecraft().currentScreen == null) { if(itemstack.getTagCompound() == null) itemstack.setTagCompound(new NBTTagCompound()); else itemstack.getTagCompound().setBoolean("onUse2", !(itemstack.getTagCompound().getBoolean("onUse2"))); } if(Mouse.getEventButton() == 0 && itemstack != null && itemstack.getItem() == ModPg2.itemPistolet && Minecraft.getMinecraft().currentScreen == null) { if(itemstack.getTagCompound() == null) itemstack.setTagCompound(new NBTTagCompound()); else itemstack.getTagCompound().setBoolean("onUse3", !(itemstack.getTagCompound().getBoolean("onUse3"))); } }:::
:::
public class ItemPompe extends Item { public void onUsingTick(ItemStack stack, EntityPlayer player, int count) { if (count % 10 == 1 && player.inventory.hasItem(ModPg2.itemBullet2) && count > 69) { player.worldObj.playSoundAtEntity(player, "modPg2:thomson", 0.5F, 0.5F); } for(int j = 0 ; j < 8; ++j) { if (count % 10 == 1 && player.inventory.hasItem(ModPg2.itemBullet2) && count > 69) { EntityBulletPompe entityBulletPompe = new EntityBulletPompe(player.worldObj, player); if(!player.capabilities.isCreativeMode) { player.inventory.consumeInventoryItem(ModPg2.itemBullet2); } if (!player.worldObj.isRemote) { player.worldObj.spawnEntityInWorld(entityBulletPompe); } } } } public ItemStack onEaten(ItemStack stack, World world, EntityPlayer player) { return stack; } public int getMaxItemUseDuration(ItemStack stack) { return 100; } public boolean onLeftClickEntity(ItemStack stack, EntityPlayer player, Entity entity) { return true; } public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { player.setItemInUse(stack, this.getMaxItemUseDuration(stack)); return stack; } public void writeToNBT(NBTTagCompound nbt) { nbt.setBoolean("onUse1", false); } public void readFromNBT(NBTTagCompound nbt) { nbt.getBoolean("onUse1"); } }:::
:::
public class RenderPompe implements IItemRenderer { protected ModelPompe model; protected static final ResourceLocation texture = new ResourceLocation("ModPg2:textures/models/items/Pompe.png"); public RenderPompe() { model = new ModelPompe(); } @Override public boolean handleRenderType(ItemStack item, ItemRenderType type) { switch(type) { case EQUIPPED: return true; case EQUIPPED_FIRST_PERSON: return true; default: return false; } } @Override public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { return false; } @Override public void renderItem(ItemRenderType type, ItemStack item, Object… data) { switch(type) { case EQUIPPED: { GL11.glPushMatrix(); GL11.glRotatef(90.F, 1.0F, 0.2F, 0.0F); GL11.glRotatef(100.F, 1.0F, 0.0F, 0.0F); GL11.glTranslatef(0.5F, -0.35F, -0.75F); GL11.glScaled(0.5F, 0.5F, 0.5F); Minecraft.getMinecraft().renderEngine.bindTexture(texture); model.render((Entity)data[1], 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F); GL11.glPopMatrix(); break; } case EQUIPPED_FIRST_PERSON: { if(item.getTagCompound().getBoolean("onUse1") == true) { GL11.glPushMatrix(); GL11.glRotatef(90.F, 1.0F, -0.2F, 0.0F); GL11.glRotatef(100.F, 0.5F, -0.2F, -0.65F); GL11.glRotatef(30.F, -0.2F, -1.2F, 0.0F); GL11.glTranslatef(-0.25F, 0.55F, -2.8F); GL11.glScaled(1F, 1F, 1F); Minecraft.getMinecraft().renderEngine.bindTexture(texture); model.render((Entity)null, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F); GL11.glPopMatrix(); break; } else { GL11.glPushMatrix(); GL11.glRotatef(90.F, 1.0F, -0.2F, 0.0F); GL11.glRotatef(100.F, 0.59F, -0.2F, -0.7F); GL11.glRotatef(30.F, 0F, -1.0F, 0.0F); GL11.glTranslatef(1F, 0.1F, -2.0F); GL11.glScaled(1F, 1F, 1F); Minecraft.getMinecraft().renderEngine.bindTexture(texture); model.render((Entity)null, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F); GL11.glPopMatrix(); break; } } default: break; } } }:::
Voilà donc, tout marchait, quand j’ai voulu m’attaquer aux items suivant j’ai simplement refais tout pareil en changeant simplement le nom du nbt (onUse1/2/3, changé correctement partout), mais visiblement il ne suffit pas de vouloir.
-
Lorsque tu as une erreur, met aussi les imports, ici tu as un NPE dans la classe RenderPistolet, dans la méthode renderItem à la ligne 60, ce pendant sans les imports la ligne 60 c’est GL11.glPopMatrix(); et ça m’étonnerai que ce soit ça qui pose problème
-
Nope en effet c’est
if(item.getTagCompound().getBoolean("onUse3") == true)edit: je mettrai les imports à l’avenir ^^
-
Essai, au début de ta fonction renderItem de mettre :
if(item.getTagCompound() == null) { itemstack.setTagCompound(new NBTTagCompound()); } else { ton code } -
Décidément, faut en mettre partout de ces nullCheck.
Soirée de +2, merci les gars.
-
Dès que tu utilise les NBT d’un item il faut que tu vérifie si l’item si il en a, il si il en a pas tu lui en met, faut vraiment pas oublier