MFF

    Minecraft Forge France
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes
    • Forge Events
      • Automatique
      • Foncé
      • Clair
    • S'inscrire
    • Se connecter

    Vérifier si le a un item dans l'inventaire

    Planifier Épinglé Verrouillé Déplacé Résolu 1.12.x
    1.12.2
    4 Messages 2 Publieurs 473 Vues 2 Watching
    Charger plus de messages
    • Du plus ancien au plus récent
    • Du plus récent au plus ancien
    • Les plus votés
    Répondre
    • Répondre à l'aide d'un nouveau sujet
    Se connecter pour répondre
    Ce sujet a été supprimé. Seuls les utilisateurs avec les droits d'administration peuvent le voir.
    • FeedBackF Hors-ligne
      FeedBack
      dernière édition par

      Bonjour,
      Je fais une commande /sell et j’aimerai savoir si qqn a une idée pour vérifier si le joueur a un certain nombre d’un certain item dans l’inventaire ?
      Si oui, merci d’avance 😄

      1 réponse Dernière réponse Répondre Citer 0
      • U Hors-ligne
        UtopiePhysique
        dernière édition par UtopiePhysique

        Bonjour,

        C’est quand même un truc très basique, tu n’as pas dû chercher bien longtemps.

        “get all items in inventory forge 1.12.2” sur google,
        premier résultat “Item in inventory? - Modder Support - Forge Forums”,

        7eme message il indique la fonction:

        player.inventory.hasItemStack(stack) or player.inventory.hasItem(item)
        

        Tu as donc accès à l’inventaire d’un joueur par le biais de “player.inventory”, tu peux savoir si il à l’item, après je ne sais pas si en créant manuellement et dynamiquement le stack d’item avec la quantité ça valide si le joueur en possède plus, de mémoire je crois que oui mais je ne vais pas pouvoir tester ça dans l’immédiat pour confirmer.

        Il ne te restera plus qu’à retirer les items du joueur, sécurise bien ton système pour éviter toutes duplications, c’est sur ce genre de système mal timer que les duplications naissent.

        (La duplication comme la perte d’items, donc créer bien des logs pour suivre ces items en cas de disparition si il est sensé être en vente alors qu’il n’y est pas, tu seras content de pouvoir apporter un support aux joueurs).

        Bonne programmation !

        PS: Dans tout les cas c’est dans ces méthodes là qu’il faudra fouiller, j’avais créer un système d’échange de papier contre ressources il y à très longtemps et je crois si mes souvenirs ne me font pas défaut que le stack était positif qu’il était égale ou supérieur à la quantité.

        FeedBackF 1 réponse Dernière réponse Répondre Citer 0
        • FeedBackF Hors-ligne
          FeedBack @UtopiePhysique
          dernière édition par

          @UtopiePhysique merci mais en fait je voulais plus savoir comment récupérer le fameux stack

          U 1 réponse Dernière réponse Répondre Citer 0
          • U Hors-ligne
            UtopiePhysique @FeedBack
            dernière édition par

            @FeedBack En effet c’est pas super claire et simple pour ce genre de tâche, c’est étonnant, j’espère que ce sera modifié un jour … Voici 2 méthodes que j’ai faites avec un exemple en utilisant une commande /test:

            public static void register(CommandDispatcher<CommandSource> dispatcher) {
            	dispatcher.register(
            		LiteralArgumentBuilder.<CommandSource>literal("test")
            			.executes(ctx -> cmdClaim(ctx.getSource()))
            	);
            }
            
            private static int cmdClaim(CommandSource src) {
            	// Si c'est un joueur physique (et pas une console):
            	if (src.getEntity() instanceof PlayerEntity) {
            	
            		PlayerEntity joueur = (PlayerEntity)src.getEntity(); // On simplifie la prise d'entité joueur
            		
            		// On vérifie combien on possède de livres
            		src.sendFeedback(new StringTextComponent(ChatFormatting.DARK_PURPLE + "Le joueur possède: " + getQtyItem(joueur, Items.BOOK) + " livres."), false);
            
            		if (getQtyItem(joueur, Items.BOOK) >= 2) { // Si on possède 2 livres ou plus
            			removeItems(joueur, Items.BOOK, 2); // On supprime 2 livres
            			src.sendFeedback(new StringTextComponent(ChatFormatting.GREEN + "2 livres supprimé."), false);
            		} else {
            			src.sendFeedback(new StringTextComponent(ChatFormatting.RED + "La quantité de livres est insuffisante."), false);
            		}
            
            		// On vérifie combien on possède de livres à nouveau
            		src.sendFeedback(new StringTextComponent(ChatFormatting.DARK_PURPLE + "Le joueur possède: " + getQtyItem(joueur, Items.BOOK) + " livres."), false);
            	}
            	return 1;
            }
            
            // Permet de récupérer la quantité d'items d'un joueur (tout stacks inclus)
            private static int getQtyItem(PlayerEntity joueur, Item item) {
            	int nombreItems = 0;
            	for(int slot = 0; slot <= joueur.inventory.getSizeInventory(); slot++) { // Pour chaque slots dans l'inventaire
            		ItemStack getIS = joueur.inventory.getStackInSlot(slot); // On récupère l'ItemStack du slot
            		if (getIS.getItem() == item) nombreItems += getIS.getCount(); // Si l'ItemStack correspond à l'item on compte
            	}
            	return nombreItems;
            }
            
            // Permet de retirer la quantité d'items d'un joueur (tout stacks inclus)
            private static void removeItems(PlayerEntity joueur, Item item, int quantity) {
            	for(int slot = 0; slot <= joueur.inventory.getSizeInventory(); slot++) { // Pour chaque slots dans l'inventaire
            		ItemStack getIS = joueur.inventory.getStackInSlot(slot); // On récupère l'ItemStack du slot
            		if (getIS.getItem() == item) { // Si l'ItemStack correspond à l'item
            			if (getIS.getCount() >= quantity) { // Si la quantité est supérieur au retrait
            				joueur.inventory.getStackInSlot(slot).setCount(getIS.getCount() - quantity);
            				break;
            			} else {
            				quantity -= getIS.getCount();
            				joueur.inventory.getStackInSlot(slot).setCount(0);
            			}
            		}
            	}
            }
            

            Que ce sois 1 seul stack, 10 stack, 36 stacks (tout l’inventaire), il repère bien la quantité et supprimes tout les stacks jusqu’à la quantité voulu.

            Tu n’as plus qu’à passer cela en 1.12.2 et de transformer ça a ta sauce 🙂

            Screen:

            J’ai changé la quantité vérifier et celle supprimée, mais pas le texte donc ça dit “2” mais c’est “5” livres.

            PS: j’utilise joueur.inventory.getStackInSlot(slot).setCount(); au lieux de getIS.setCount(); sinon, pour je ne sais quel raisons, c’est uniquement le dernier stack supprimé qui est pris en compte.

            1 réponse Dernière réponse Répondre Citer 0
            • 1 / 1
            • Premier message
              Dernier message
            Design by Woryk
            ContactMentions Légales

            MINECRAFT FORGE FRANCE © 2024

            Powered by NodeBB