Item complexe : gui, bouton, packet et model custom
-
J’ai trouvé une solution : au lieux de rajouter Minecraft.getMinecraft().displayGuiScreen(new RuneStoneGui(playerInv, slotIndex)) et de corrigé les problèmes que ça créé, j’ai modifié mon gui pour qu’au lieu d’enregistrer l’itemstack dans une variable (ce qui fait qu’il n’est update que lorsque l’on ferme puis rouvre l’inventaire), j’enregistre l’index du slot dans lequel il est et je get le contenu du slot (ce qui donne l’itemstack ) pour modifier le rendu du gui.
Maintenant que ce problème est réglé, je m’occupe du rendu de l’item !
Dans le NBTTag de mon item, il y a 28 int. je voudrais que chaque int, s’il est égale à 1 affiche une ligne noir sur l’item. Je suppose que je ne peut pas passer par un rendu classique (un model en .json) car en recherchant dans le rendu des item j’ai trouvé ce qui correspond au model builtin/generated et il y a une liste du layer0 au layer4 donc je ne peut pas en mettre 29. (Ou alors il faudrait que j’arrive à mette les 28 lignes sur un layer)
Donc je voudrais savoir de quel manière je pourrais faire le rendu pour pouvoir mettre ces 28 lignes sans (si possible) avoir à faire un model pour chaque combinaison possible (plus tard, il y aura encore plus de possibilités car je voudrais faire en sorte que selon le int, la ligne soit d’une certaine couleur).
-
Je pense que tu pourrais utiliser un IItemRender (après, jamais utilisé donc je ne sais pas trop ce que ça offre).
-
N’existe plus en 1.8. Donc non.
-
Ah okay autant pour moi (ça a disparu comme le ISBHR (un nom de genre avec ces lettres dans un autre ordre) quoi)
Envoyé de mon RAINBOW LITE 4G en utilisant Tapatalk
-
Dommage… Il n’y a pas une autre solution qui pourrais remplacer IItemRender ?
-
Utiliser les JSONs ou utiliser ce projet https://github.com/Thog/ISBRH
-
@‘AymericRed’:
Ah okay autant pour moi (ça a disparu comme le ISBHR (un nom de genre avec ces lettres dans un autre ordre) quoi)
Envoyé de mon RAINBOW LITE 4G en utilisant Tapatalk
C’est ISBRH. Tu y étais presque
(ISpecialBlockRenderingHandler) -
@‘Superloup10’:
Utiliser les JSONs ou utiliser ce projet https://github.com/Thog/ISBRH
Je testerais avec le projet d’ ISBRH quand j’airais du temps libre (surement le week-end prochain), mais en utilisant les JSONs, je ne vois pas comment je peut faire sans avoir à faire un fichier JSON par possibilité.
-
C’est un peu spécial à gérer les jsons mais déjà, tu peux regarder l’arc pour te faire une idée.
-
J’ai un peut cherché pour l’arc …… j’ai pas vraiment l’impression que c’est un bon exemple à utiliser : dans la class de l’item, il y a une liste de strings correspondants aux icônes possibles pour l’arc mais elle est utilisée nul part. Ensuite, j’ai trouvé un endroit qui à l’aire de décidé du model de l’arc en fonction du joueur mais, c’est dans la class RenderItem …
Je me demandais si c’était possible pour les item de faire un peut comme les blockstates : faire en sorte que dans un seul json, selon la metadata, ça choisit un
modelun texture différente pour le layer supérieur du model. (Peut être en utilisant ModelBakery.addVariantName, ModelLoader.setCustomMeshDefinition ou ModelLoader.setCustomStateMapper)EDIT : J’ai trouvé deux nouveautés de la 1.8, qui pourraient surement être utiles : l’event ModelBakeEvent et l’interface ISmartItemModel. Si quelqu’un sais s’en servir, je voudrais bien qu’il me passe son savoir !
-
Tu peux faire comme les blockstates via une fonction à mettre dans la classe de ton Item : “public ModelResourceLocation getModel(ItemStack stack, EntityPlayer player, int useRemaining) {}” il suffit de return le model en fonction de ce que tu veux.
Envoyé de mon RAINBOW LITE 4G en utilisant Tapatalk
-
@‘AymericRed’:
Tu peux faire comme les blockstates via une fonction à mettre dans la classe de ton Item : “public ModelResourceLocation getModel(ItemStack stack, EntityPlayer player, int useRemaining) {}” il suffit de return le model en fonction de ce que tu veux.
Envoyé de mon RAINBOW LITE 4G en utilisant Tapatalk
Comme je l’ai dit, là il faut retourner un ModelResourceLocation donc je suis comme mème obligé de créer un .json pour chaque possibilité (à moins que je ne soit pas obligé, mais dans ce cas, il faut me dire comment faire), est-il possible faire en sorte de sélectionner un model en précisent les textures à y appliquer (comme “parent”: “monModel”,“textures”: { “layer0”: “matexture”
} mais à partir de la fonction getModel).Pour le projet ISBRH, je ne sais pas comment l’utilise : est-ce qu’il faut que j’ajoute ses sources au miennes ? Ou faire quelque chose du genre décompilé minecraft, ajouter les sources pour recompiler ?
-> Je pensais faire quelque chose de “plus simple” comme faire un seul .json avec quelque chose comme
{ "parent": "runes:item/runeStone", "display": { "thirdperson": { "rotation": [ -90, 0, 0 ], "translation": [ 0, 1, -3 ], "scale": [ 0.55, 0.55, 0.55 ] }, "firstperson": { "rotation": [ 0, -135, 25 ], "translation": [ 0, 4, 2 ], "scale": [ 1.7, 1.7, 1.7 ] } } }Et faire ItemModel custom utilisant un ISmartItemModel pour choisir le model en fonction de l’ItemStack. Mais pour faire ça, je vais galérer…
-
Je pense que tes obligé de créer un model pour chaque, après tu peux essayer de faire un model custom avec ISmartItemModel (jsp du tout comment le faire).
Pour le ISBHT, je pende qu’il faut que tu l’ajoute tes librairies (clic droit sur ton projet, build path > configure > librairies > add external librairie et tu sélectionnes le jar du ISBHR.Envoyé de mon RAINBOW LITE 4G en utilisant Tapatalk
-
@‘AymericRed’:
Je pense que tes obligé de créer un model pour chaque, après tu peux essayer de faire un model custom avec ISmartItemModel (jsp du tout comment le faire).
Pour le ISBHT, je pende qu’il faut que tu l’ajoute tes librairies (clic droit sur ton projet, build path > configure > librairies > add external librairie et tu sélectionnes le jar du ISBHR.Envoyé de mon RAINBOW LITE 4G en utilisant Tapatalk
Je viens de me rendre compte que le projet ISBRH n’existe que en 1.8 et pas en 1.8.9 donc je ne peut pas l’utiliser…

-
Ah….
Après, il n’y a pas beaucoup de différences entre les deux, tu pourrais peut-être l’adapter… Ou sinon tu fais 36 milles model d’item (tu peux trouver des logiciels pour en créer plus simplement ici). -
@‘AymericRed’:
Ah….
Après, il n’y a pas beaucoup de différences entre les deux, tu pourrais peut-être l’adapter… Ou sinon tu fais 36 milles model d’item (tu peux trouver des logiciels pour en créer plus simplement ici).Si je n’arrive pas à utiliser ISmartItemModel, saisirais de l’adapter. Pour l’instant j’ai juste un problème : c’est quoi un BakedQuad ?
-
C’est un élément (quadrilatère) d’un model je crois.
-
@‘AymericRed’:
C’est un élément (quadrilatère) d’un model je crois.
Si j’ai bien compris, les 4 vertex, ce sont les 4 sommets du quadrilatère ?
-
Il me semble que ce sont les côtes
Envoyé de mon RAINBOW LITE 4G en utilisant Tapatalk
-
J’ai réussi à créer un ISmartItemModel mais je voudrais savoir comment faire l’équivalent de
"display": { "thirdperson": { "rotation": [ -90, 0, 0 ], "translation": [ 0, 1, -3 ], "scale": [ 0.55, 0.55, 0.55 ] }, "firstperson": { "rotation": [ 0, -135, 25 ], "translation": [ 0, 4, 2 ], "scale": [ 1.7, 1.7, 1.7 ] } }à partir de la class du model.
[EDIT] :
J’ai trouvé une piste mais j’ai un petit problème.
En implémentant IPerspectiveAwareModel à mon rendu, ça ajoute 2 fonctions dont public Pair handlePerspective(TransformType cameraTransformType) qui permet de définir la rotation, translation et l’échelle en fonction du point de vue (thirdperson, firstperson, …). J’ai donc mis ça :@Override public Pair handlePerspective(TransformType cameraTransformType) { if(baseModel instanceof IPerspectiveAwareModel) { IPerspectiveAwareModel flexiModel = (IPerspectiveAwareModel)baseModel; return flexiModel.handlePerspective(cameraTransformType); } ItemTransformVec3f itemTransformVec3f = null; switch (cameraTransformType) { case FIRST_PERSON: itemTransformVec3f = baseModel.getItemCameraTransforms().firstPerson; case THIRD_PERSON: itemTransformVec3f = baseModel.getItemCameraTransforms().thirdPerson; case GUI: itemTransformVec3f = baseModel.getItemCameraTransforms().gui; case HEAD: itemTransformVec3f = baseModel.getItemCameraTransforms().head; case GROUND: itemTransformVec3f = baseModel.getItemCameraTransforms().ground; case FIXED: itemTransformVec3f = baseModel.getItemCameraTransforms().fixed; default: itemTransformVec3f = null; } return Pair.of(this, TRSRTransformation.getMatrix(itemTransformVec3f)); //return Pair.of(this, null); }Cela fonctionne très bien sauf que on ne voit plus les modifications qu’apporte mon model, c’est comme si un avait l’item avec le rendu de base, sans mon model. Si quelqu’un sais pourquoi ça fait ça ou sais comment corriger ça, je suis preneur !
[EDIT 2] :
J’ai enfin trouvé comment faire :
@Override public Pair handlePerspective(TransformType cameraTransformType) { if(baseModel instanceof IPerspectiveAwareModel) { IPerspectiveAwareModel flexiModel = (IPerspectiveAwareModel)baseModel; Pair pair = flexiModel.handlePerspective(cameraTransformType); return pair.of(this, pair.getRight()); // Ici, je ne prend pas exactement la même paire, le prend les modifications de point de vue mais avec mon model. } ItemTransformVec3f itemTransformVec3f; switch (cameraTransformType) { case FIRST_PERSON: itemTransformVec3f = baseModel.getItemCameraTransforms().firstPerson; break; case THIRD_PERSON: itemTransformVec3f = baseModel.getItemCameraTransforms().thirdPerson; break; case GUI: itemTransformVec3f = baseModel.getItemCameraTransforms().gui; break; case HEAD: itemTransformVec3f = baseModel.getItemCameraTransforms().head; break; case GROUND: itemTransformVec3f = baseModel.getItemCameraTransforms().ground; break; case FIXED: itemTransformVec3f = baseModel.getItemCameraTransforms().fixed; break; default: itemTransformVec3f = null; break; } if(itemTransformVec3f != null) { return Pair.of(this, TRSRTransformation.getMatrix(itemTransformVec3f)); } else { return Pair.of(this, null); } }Enfin, j’ai un question qui vas surement être la dernière :
Comment afficher un item dans un GUI mais avec une taille différente (8 fois plus gros, juste à partir d’un ItemStack enregistré dans les paramètres du GUI) ?
