Rendu d'item dans les deux mains
-
Bonjour tout le monde !
J’ai créé un nouvel item : c’est comme deux objets en un item ( marteau et une pointe pour faire de la sculpture ). Donc pour que se soit un peut logique, je voudrais que un objet soit rendu dans une main et l’autre dans l’autre. Mais je ne sais pas comment faire ( notamment pour que chaque item suive la bonne main en troisième personne.)Après, j’aurais une autre question : comment changer l’animation des mains quand on casse un block avec mon item ?
-
- Je ne sais pas.
- Pour l’action, il y a une fonction dans l’item qui la donne, getAction ou un truc comme ça (regarde dans l’arc/la nourriture).
-
@‘AymericRed’:
- Je ne sais pas.
- Pour l’action, il y a une fonction dans l’item qui la donne, getAction ou un truc comme ça (regarde dans l’arc/la nourriture).
Je sait qu’il y a getItemUseAction pour l’arc et la nourriture ( pour quand un fait clic droit) mais je ne pence pas pouvoir utiliser ça pour le clic gauche ( pour casser un block ).
-
Ah oui autant pour moi, je n’ai pas fait attention au “casse”, et j’ai pensé au clic droit. Je ne sais pas, je regarderais tout à l’heure si personne ne trouve
-
J’ai un peut avancé sur le premier problème :
Pour l’instant, je m’occupe juste d’afficher l’item en double (un item par main et je m’occuperais plus tard d’afficher seulement un objet par mains) en utilisant l’event RenderPlayerEvent.Post pour afficher l’item à la 3° personne. Je me suis inspiré du code de BattleGear2 et de minecraft pour afficher l’item et cela donne… ça :
Là, l’item ne bouge pas quand on tourne sur soit-même.
Et là on voit (en tout cas, moi je le vois) que le centre de rotation de l’item n’est pas le bon (mauvais en rouge et bon en vert)Voici mon code :
@SubscribeEvent public void onRenderHandj(RenderPlayerEvent.Post event) { if (event.entityPlayer.getHeldItem() != null && event.entityPlayer.getHeldItem().getItem() instanceof ChiselHammerItem) { this.renderIn3rdPerson(event.entityPlayer, event.renderer, event.entityPlayer.getHeldItem(), event.partialRenderTick); } } private void renderIn3rdPerson(EntityPlayer entityPlayer, RenderPlayer render, ItemStack itemStack, float frame) { ModelPlayer playerModel = render.getMainModel(); ModelRenderer armModel = playerModel.bipedLeftArm; GlStateManager.pushMatrix(); if (render.getMainModel().isChild) { GlStateManager.translate(0, 10F/16F, 0); GlStateManager.rotate(-20, -1, 0, 0); GlStateManager.scale(0.5F, 0.5F, 0.5F); } armModel.postRender(1F/16F); GlStateManager.translate(1 /16F, 7 /16F, 1 /16F); if (entityPlayer.isSneaking()) { GlStateManager.translate(0.0F, 0.203125F, 0.0F); } Minecraft.getMinecraft().getItemRenderer().renderItem(entityPlayer, itemStack, TransformType.THIRD_PERSON); GlStateManager.popMatrix(); }
-
OUI ! ENFIN ! J’ai trouvé !!! Merci minecraftforum.net !
Ce qu’il fallait faire c’est passer par les “LayerRenderer” plutôt que par l’event “RenderPlayerEvent”.
Ça donne donc quelque chose comme :public class LayerOffhandItem implements LayerRenderer <entityplayer>{ protected final RenderPlayer renderer; public LayerOffhandItem(RenderPlayer playerRenderer) { this.renderer = playerRenderer; } @Override public void doRenderLayer(EntityPlayer player, float p_177141_2_, float p_177141_3_, float partialTicks, float p_177141_5_, float p_177141_6_, float p_177141_7_, float scale) { if (player.getHeldItem() != null && player.getHeldItem().getItem() instanceof ChiselHammerItem) { BlockBreakingHandler.renderIn3rdPerson((EntityPlayer) player, renderer, player.getHeldItem(), partialTicks); } } @Override public boolean shouldCombineTextures() { return false; } }
Et il faut ensuite ajouter ce layer au joueur dans l’event “FMLInitializationEvent” coté client:
RenderPlayer steveRender = Minecraft.getMinecraft().getRenderManager().getSkinMap().get("default"); RenderPlayer alexRender = Minecraft.getMinecraft().getRenderManager().getSkinMap().get("slim"); steveRender.addLayer(new LayerOffhandItem(steveRender)); alexRender.addLayer(new LayerOffhandItem(alexRender));
Mais il me reste encore la deuxième partie : comment changer l’animation des mains quand on casse un block avec mon item ?</entityplayer>
-
Pour mon premier problème, j’ai résolu le principale mais il me reste un petit souci : je voudrais savoir ci c’est possible de mettre un model différent à mon item selon si il est dans l’inventaire, dans la main ou au sol. (Je sais qu’en 1.9+ c’est possible via les “IItemPropertyGetter” mais en 1.8, ça doit être plus complexe ).
Et pour mon deuxième problème, j’ai trouvé un moyen de modifier légèrement l’animation mais je ne peux pas modifier directement l’animation. Si il y as moyen avec “getItemUseAction”, ça m’intéresse.
-
Pour IItemPropertyGetter regarde comment fait la canne à pêche pour le cast
-
@‘BrokenSwing’:
Pour IItemPropertyGetter regarde comment fait la canne à pêche pour le cast
Pour la canne à pêche, c’est comme pour l’arc, c’est directement dans la fonction “renderItemModelForEntity” de la class “RenderItem”.
Donc je pence que je suis obligé de passer par un “IPerspectiveAwareModel”.
EDIT : C’est bon, je suis passé par un IPerspectiveAwareModel. Mais il me reste (en plus de l’animation) à faire l’affichage de l’item en première personne. J’ai cherché dans les events et j’ai trouvé “RenderHandEvent” donc je me demandais si c’était seulement l’affichage de la main (donc fonctionne pas si on à un item en main) ou si c’était justement l’affichage de l’item en main et dans ce cas, c’est ce qu’il me faut.