[Inventaire personnalisé] Par ou commencer
-
Bonjour, ce post n’est pas vraiment une demande de support mais plutôt une demande d’informations étant donné que je n’ai rien. J’ai suivi les tutoriels en 1.7.10 et remercie d’ailleurs grandement l’équipe de Minecraft Forge France. Néanmoins je suis un peu bloqué actuellement. Jusqu’à maintenant j’avançait en lisant les tutoriels, hors est venu le moment ou j’ai dû me débrouiller seul.
Actuellement je cherche à créer un inventaire personnalisé en jeu, pouvoir rajouter des slots d’amure (objectif RPG) seulement, le site ne propose pas de tutoriels et les seuls que j’ai trouvé en Anglais sont trop vagues. J’ai la chance de m’être fait prêté un mod qui contient ce que je veux mais je ne sait pas le reproduire.
Je vous demande donc, par ou commencer pour créer un inventaire personnalisé ?
Quelqu’un pourrait-il m’ajouter Skype ou par message privé sur le site pour que je lui montre les sources de ce mod prêté et qu’il m’explique les points vagues ?
Merci d’avance en espérant avoir été claire.
-
Salut,
pense à changer la balise sur ton topic précédent si il est selon toi, résolu.Ensuite une petite remarque, si tu viens poster dans support pour les moddeurs, c’est dans le but que plusieurs membres viennent t’aider afin de trouver et poster la solution. Donc par ailleurs, il est inutile de demander de l’aide par MP, car cela ne ferait ni profiter la future communauté de MFF (j’entends par là les futurs moddeurs butant sur le même problème que toi), à moins que tu postes dans un message clair et détaillé la solution, et cela ne permettrait pas aux autres helpers de pouvoir interagir si on avait décidé de commencer à résoudre ce problème sur une discussion skype. Comprends-tu ce que je veux dire ^^ ?
Après si je peux te mener sur une piste, je dirai de check dans un event tické, et côté client (ClientTickEvent irait à merveille) quel est le container actuellement ouvert par le joueur, et à condition qu’il ne soit pas null (Minecraft.getMinecraft ().thePlayer.openContainer, je crois), et qu’il instanceof InventoryPlayer. Si toutes ces conditions sont réunies, alors tu peux ouvrir ton nouveau inventaire par-dessus le vanilla.
Est-ce claire ? Si oui, c’est cool, si non continue tes recherches, sur le fofo, cette question a déjà été postée plusieurs fois. Et si tu n’y arrives toujours pas, reviens nous voirEDIT = J’avais presque oublié mais n’oublie pas de renseigner la balise de version.
-
@‘Plaigon’:
Salut,
pense à changer la balise sur ton topic précédent si il est selon toi, résolu.Ensuite une petite remarque, si tu viens poster dans support pour les moddeurs, c’est dans le but que plusieurs membres viennent t’aider afin de trouver et poster la solution. Donc par ailleurs, il est inutile de demander de l’aide par MP, car cela ne ferait ni profiter la future communauté de MFF (j’entends par là les futurs moddeurs butant sur le même problème que toi), à moins que tu postes dans un message clair et détaillé la solution, et cela ne permettrait pas aux autres helpers de pouvoir interagir si on avait décidé de commencer à résoudre ce problème sur une discussion skype. Comprends-tu ce que je veux dire ^^ ?
Après si je peux te mener sur une piste, je dirai de check dans un event tické, et côté client (ClientTickEvent irait à merveille) quel est le container actuellement ouvert par le joueur, et à condition qu’il ne soit pas null (Minecraft.getMinecraft ().thePlayer.openContainer, je crois), et qu’il instanceof InventoryPlayer. Si toutes ces conditions sont réunies, alors tu peux ouvrir ton nouveau inventaire par-dessus le vanilla.
Est-ce claire ? Si oui, c’est cool, si non continue tes recherches, sur le fofo, cette question a déjà été postée plusieurs fois. Et si tu n’y arrives toujours pas, reviens nous voirMon topic précédent n’est pas encore résolu (aucun moddeur ne m’a contacté c’est pour ça aussi que je me suis lancé dans le Java).
Je suis d’accord avec ta deuxième partie mais je parlait du privé pour montrer les sources du mod prêté (je me vois pas afficher ici tout ca alors que je ne sait pas de quoi les helpeurs vont avoir besoin). Après effectivement le but est que tout le monde en profite.
Je vais aller check ces events tickés en espérant que ce soit fructueux, et justement j’ai fait une recherche sur le Forum sans succès c’est pour ça que je suis ici.
Merci de ta réponse, j’actualiserai le post !
-
Je parlais de ton topic traitant du problème suivant : “Texture armure inchangée”
1 seule recherche google, t’as pas dû saisir les bons mots-clés….
https://www.minecraftforgefrance.fr/showthread.php?tid=2864
Oups…celui n’était pas terrible en fait :x
https://www.minecraftforgefrance.fr/showthread.php?tid=3070 -
@‘Plaigon’:
Je parlais de ton topic traitant du problème suivant : “Texture armure inchangée”
1 seule recherche google, t’as pas dû saisir les bons mots-clés….
https://www.minecraftforgefrance.fr/showthread.php?tid=2864J’ai toujours le problème mais j’approfondirai plus tard, c’est plus une prio je vais le mettre en résolu en attendant.
Je vais regarder le post, merci
EDIT : En fait il y a plusieurs parties, le container, le gui en lui même, l’appel pour déclencher ce GUI, mais comme je dois reprendre des codes existants je sais pas trop par ou commencer.
-
J’ai eu le temps de pas mal chercher du coup, et je me suis rendu compte qu’il y avait plus de travail que ce que je pensais. Du coup je pense qu’il faudrait commencer par le commencement, quelles classes sont à créé pour créer une inventaire basique sur lequel on peut ajouter des slots d’amure ?
Pour ceux qui auraient le même soucis que moi je vais faire ça sous forme de liste que vous m’aiderez, je l’espère, à compléter.
Ce que je vais dire ci-dessous est probablement faux, je le corrigerai avec votre aide.
- Inventory : la classe de base qui relie les divers autres classes.
- GuiInventory : permet de définir l’interface de l’inventaire, elle est la forme.
- Container : rend utilisable les slots d’inventaires du joueur, c’est le fond.
- KeyHandler : événement qui fait que lorsqu’on appui sur une touche, l’inventaire s’ouvre.
? 5) Packets : transit des actions effectuées dans l’inventaire (je ne suis pas sûr). - ? A vous de me le dire !
Du coup, ces cinq points suffisent-ils à faire ce que je veux ? Que faut-il ajouter ? Et une fois que je connaîtrai chacune des classes à créer je pourrais me documenter précisément.
EDIT : Du coup, j’ai encore avancé mais je suis pas sûr. J’ai pris comme exemple “InventoryBasic” dans .net.minecraft.inventory/InventoryBasic est ce que celui-ci correspond à ce que je cherche ?
-
Tiens voici un lien qui devrait t’aider (je parle surtout du github)
Je récupère mon PC ce soir, je pourrai donc t’aider en détail !
-
Du coup, j’ai réussi à “recréer” InventoryBasic seulement comment l’ouvrir ou qu’est ce qui lui manque ? Voici mon code entier :
:::
package fr.shyfe.dcedo.common; import java.util.ArrayList; import java.util.List; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInvBasic; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; public class DCEDOInventory implements IInventory { //Title private String DCEDOInventory; //Nombre de slot private int slotsCount; //Contenu de l'inventaire private ItemStack[] inventoryContents; //? private List list; //Inventaire nommé ou non private boolean inventoryNamed; //? //private static final String = "Inconnu"; public DCEDOInventory(String Title,boolean Named, int slotsCount) { this.DCEDOInventory = Title; this.inventoryNamed = Named; this.slotsCount = slotsCount; this.inventoryContents = new ItemStack[slotsCount]; } public void onInventoryChanged(IInvBasic p_110134_1_) { if (this.list == null) { this.list = new ArrayList(); } this.list.add(p_110134_1_); } public ItemStack getStackInSlot(int i) { return i >= 0 && i < this.inventoryContents.length ? this.inventoryContents* : null; } public ItemStack decrStackSize(int invSlot1, int invSlot2) { if (this.inventoryContents[invSlot1] != null) { ItemStack itemstack; if (this.inventoryContents[invSlot1].stackSize <= invSlot2) { itemstack = this.inventoryContents[invSlot1]; this.inventoryContents[invSlot1] = null; this.markDirty(); return itemstack; } else { itemstack = this.inventoryContents[invSlot1].splitStack(invSlot2); if (this.inventoryContents[invSlot1].stackSize == 0) { this.inventoryContents[invSlot1] = null; } this.markDirty(); return itemstack; } } else { return null; } } public ItemStack getStackInSlotOnClosing(int closeDrop) { if (this.inventoryContents[closeDrop] != null) { ItemStack itemstack = this.inventoryContents[closeDrop]; this.inventoryContents[closeDrop] = null; return itemstack; } else { return null; } } public void setInventorySlotContents(int numberItems, ItemStack ItemGiven) { this.inventoryContents[numberItems] = ItemGiven; if (ItemGiven != null && ItemGiven.stackSize > this.getInventoryStackLimit()) { ItemGiven.stackSize = this.getInventoryStackLimit(); } this.markDirty(); } public int getSizeInventory() { return this.slotsCount; } public String getInventoryName() { return this.DCEDOInventory; } public boolean hasCustomInventoryName() { return this.inventoryNamed; } public void func_110133_a(String name) { this.inventoryNamed = true; this.DCEDOInventory = name; } public int getInventoryStackLimit() { return 64; } public void markDirty() { if (this.list != null) { for (int i = 0; i < this.list.size(); ++i) { ((IInvBasic)this.list.get(i)).onInventoryChanged(null); } } } public boolean isUseableByPlayer(EntityPlayer player) { return true; } public void openInventory() {} public void closeInventory() {} public boolean isItemValidForSlot(int sizeItem, ItemStack item) { return true; } }
:::
Je dois créer un raccourci pour l’ouvrir ? Je dois ajouter le système de slot ? Je suis perdu la.
-
La classe GuiInventory est la partie client du gui, c’est elle qui défini tout ce qui est visuel. Comme la classe hérite de GuiContainer, elle doit être lié a un container et s’occupe automatiquement d’afficher les slots si on passe la souris dessus.
La classe du container et commune au client et au serveur. C’est elle qui défini l’emplacement des slots et gère le transferts entre les slots. Il y a dernière des paquets pour gérer la synchro, mais c’est déjà géré par le code existant, rien à faire de ce côté.
Le classe d’inventaire implémente l’interface IInventory qui défini comment interagir avec ce dernier. Celle classe contient aussi en général le tableau d’itemstack qui correspond au item se trouvant dans l’inventaire. Ce tableau d’item stack est sauvegarder dans le tag NBT du joueur. Pour sauvegarder des slots supplémentaire tu aura besoin d’un Extended Entity Properties
Comme tu veux remplacer un container/gui existant tu vas aussi d’avoir besoin d’événements pour détecter quand remplacer ce dernier (ou alors utiliser une nouvelle touche avec un second inventaire en gardant le premier, ou en empêchant de l’ouvrir).
Il faut aussi gérer le ramassage d’item et le drop des derniers lors de la mort (à nouveau, via des événements). -
Waw, merci donc si je résume :
Je créé une classe GuiInventory similaire à celle de minecraft, une classe container qui gérera le contenu de l’inventaire et une classe Inventaire basée sur IInventory ?
Pour l’ouverture, une nouvelle touche + un blocage de l’ancien inventaire seront parfaits.
Je me pose quand même la question de l’utilité de ce que je viens de faire du coup ? Enfin l’utilité de “InventoryBasic”
EDIT : J’ai suivi le tutoriel que tu m’as envoyé (Plaigon) et merci mais … J’ai des erreurs et arrivé à l’étape 4.1 ou l’auteur n’explique plus vraiment ça devient très complexe. Je suis de nouveau bloqué …
Du coup j’ai réussi à résoudre quelques erreurs mais je suis bloqué sur une partie de ma classe InventoryCustom qui reprend les propriétés de l’inventaire.
public void readFromNBT(NBTTagCompound compound) { NBTBase items = compound.getTag(tagName); for (int i = 0; i < items.tagCount(); ++i) { NBTTagCompound item = (NBTTagCompound) items.tagAt(i); byte slot = item.getByte("Slot"); if (slot >= 0 && slot < getSizeInventory()) { inventory[slot] = ItemStack.loadItemStackFromNBT(item); } } }
J’ai deux erreurs : la première pour tagCount() et la seconde pour tagAt, les erreurs sont “The method tagCount() is undefined for the type NBTBase” et “The method tagAt(int) is undefined for the type NBTBase”, je ne comprend vraiment pas d’ou ça peut venir.
-
Car tu dois avoir un NBTList au lieu d’un NBTBase, donc tu dois faire compound.getTagList(tagName, 10)
-
J’arrive à quelque chose comme ça du tout mais ca me semble faux :
public void readFromNBT(NBTTagCompound compound) { NBTTagList items = compound.getTagList(tagName, 10); for (int i = 0; i < items.tagCount(); ++i) { NBTTagCompound item = (NBTTagCompound) items.getCompoundTagAt(i); byte slot = item.getByte("Slot"); if (slot >= 0 && slot < getSizeInventory()) { inventory[slot] = ItemStack.loadItemStackFromNBT(item); } } }
Je n’ai plus l’erreur au tagCount, même si eclipse me dit qu’elle n’est pas utilisée, je vois pas trop ce que j’ai loupé
-
Qu’est-ce qui n’est pas utilisé ?
-
Trop de choses que je comprend pas dans le tutoriel que j’ai suivi, de plus il est en 1.6.4, je reprend tout et je ferais une liste de ce qui me bloque ou ce que je comprend pas…
Et c’était tagCount qui n’était pas utilisé
Ok du coup je reprend tout à partir des classes de bases et en m’aidant d’un mod existant mais quelqu’un sait ou je peux trouver des exemples sans les func_16424_d (exemple), car je ne sait pas trop quoi mettre dans ma fonction “markDirty()”
-
hein ? Tu as copié des mods avec des noms obfusqués ?
-
Bah j’ai demandé a un mec le mod qu’il utilisait sur son ancien serveur pour voir à quoi il ressemblait et il me l’a filé mais sous forme de mod, du coup il m’a conseillé d’utiliser jd-gui pour le lire.
EDIT : Je cherche donc toujours une fonction de base markDirty() que je pourrais modifier pour qu’elle corresponde à ce que je cherche et je n’ai toujours pas trouvé de solution pour le “tagAt” :
public void readFromNBT(NBTTagCompound compound) { NBTTagList items = compound.func_150295_c("CustomInvTag", compound.tagAt()); for (int i = 0; i < items.tagCount(); i++) { NBTTagCompound item = items.tagAt(i); byte slot = item.getByte("Slot"); if ((slot >= 0) && (slot < getSizeInventory ())) { this.inventory[slot] = ItemStack.loadItemStackFromNBT(item); } } }
L’erreur : The method tagAt() is undefined for the type NBTTagCompound
-
Pour retrouver les bons noms, tu peux utiliser BON2 (disponible sur github).
Regarde plutôt les tutoriels disponibles sur le forum pour ce genre de choses car ils sont mieux faits ici
-
@‘SCAREX’:
Pour retrouver les bons noms, tu peux utiliser BON2 (disponible sur github).
Regarde plutôt les tutoriels disponibles sur le forum pour ce genre de choses car ils sont mieux faits ici
Je vais voir ça, je n’ai pas trouvé de tutoriel pour ça mais je vais re-chercher
-
-
@‘SCAREX’:
https://www.minecraftforgefrance.fr/showthread.php?tid=2082
https://www.minecraftforgefrance.fr/showthread.php?tid=2017Ah oui je les avaient vus mais ils correspondent pas vraiment à ce que je veux.
Sinon entre temps j’ai repris tout le code qu’on m’avait donné grâce à BON2 en le modifiant à ma sauve mais j’ai des erreurs au lancement que je comprend pas trop, si quelqu’un veut bien se dévouer pour me les “traduire”, ce serait super gentil.
http://pastebin.com/5r9iVABN (sous pastebin car c’est long)
J’ai vu que ca avait l’air de planter avec les ChannelPipeline (un doublon ? je n’en ai pas vu) voici donc le code de PacketPipeline : http://pastebin.com/4FySm6x7
Je ne sait pas si cela peut aider mais j’ai aussi AbstractPacket pour les Packets donc voici son code (d’ailleurs, dans Eclipse dans mon Package Explorer, à gauche j’ai un petit A en haut à droite de la feuille de code)
http://pastebin.com/E8cZ6WegMerci d’avance !