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



  • 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 😄



  • 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é.



  • 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é.



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



  • @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.


Log in to reply