1. Si vous venez d'arriver sur le forum et que vous êtes un peu perdus, cliquez ici !
    Rejeter la notice

Résolu remplacement du testfor en 1.13, problème de scoreboard et économie

Discussion dans 'Commands blocks & Redstone' créé par Cailbairwhos, 4 Juil 2018.

  1. Cailbairwhos

    Cailbairwhos Nouveau

    Inscrit:
    4 Juil 2018
    Messages:
    6
    Points:
    2
    Bonjour pour créer une économie sur un serveur perso je cherche à pouvoir vente des objets et que sa rajoute l'argent à un scoreboard. les items peuvent être vendu seul ou par 10 ou 64 pour cela j'ai utiliser cette commande

    Code (cpp):
    /execute as @a[nbt={Inventory:[{id:"minecraft:iron_nugget",Count:10b}]}] at @s run ...
    le problème c'est qu'il détecte que par slot et non pas l’inventaire complet et aussi qu'il ne s'exécute que si le slot contiens le bon nombre d'item alors que l'on pourrais en avoir plus.

    aussi non j'ai une deuxième solution qui serai que chaque mob incrémente lui même la somme d'argent quand il est tuer mais je ne trouve pas comment faire. (un zombie lvl 1 donne 1$ alors qu'un lvl 2 en donne 3$ et que un skeleton lvl 1 en donne 2$ par exemple)

    La quel des 2 solution serais la meilleur et pouvez vous m'aidé merci
     
  2. Daminator4113

    Daminator4113 Enter the World

    Inscrit:
    5 Août 2017
    Messages:
    33
    Points:
    22
    Sexe:
    Homme
    Personnellement, je préfère gérer l'argent avec un score, car le problème des items, c'est que tu peux les perdre, ils prennent de la place si tu en à trop, etc... Je pencherais plutôt pour la 2ème solution (même si la 1ère est réalisable). Si tu as besoin d'aide pour réaliser l'un ou l'autre de tes système, n'hésite pas à demander ^^
     
  3. Cailbairwhos

    Cailbairwhos Nouveau

    Inscrit:
    4 Juil 2018
    Messages:
    6
    Points:
    2
    justement quoi qu'il arrive l'argent se situe en scoreboard c'est juste la manière de l'obtenir qui diffère de plus la question principal est justement de savoir comment faire c'est système, du moins l'un des deux
     
  4. Daminator4113

    Daminator4113 Enter the World

    Inscrit:
    5 Août 2017
    Messages:
    33
    Points:
    22
    Sexe:
    Homme
    Je résume :
    Donc en gros, ton premier système c'est que quand tu tue un mob, il te drop un item, et une fois que tu ramasse l'item, ça incrémente ton score.
    Et dans le 2ème système, c'est quand tu tue le mob que ça incrémente directement ton score.

    Pour le premier système, il faudrais changer le loot de tout les mobs pour qu'ils te donnent un item, puis détecté l'item dans ton inventaire.
    Pour le 2ème système, il faut juste détecté quand le joueur tue le mob (spécifique), pour ensuite incrémenté le score.
     
  5. Cailbairwhos

    Cailbairwhos Nouveau

    Inscrit:
    4 Juil 2018
    Messages:
    6
    Points:
    2
    en quelque sorte,
    pour le premier l'item peu être vendu à un pnj (vente via le tchat) et on peu les vendre mais le problème c'est que je trouve pas comment détecter les item sachant que l'on peu en avoir plus que demandé sur soit (ex vente 1,10 ou 64 mais on peu en avoir aussi bien 3 que 65)

    pour le second comme dit si un mob lvl 1 est tuer on récolte 1 à 2 mais un lvl 2 on gagne 1 à 3 par exemple (selon le mob) mais je trouve pas comment faire donc oui directement incrémenter

    pour rappel je suis en 1.13 car en 1.12 le premier est simple à faire
     
  6. Daminator4113

    Daminator4113 Enter the World

    Inscrit:
    5 Août 2017
    Messages:
    33
    Points:
    22
    Sexe:
    Homme
    Je comprend pas à quoi sert le score si tu veux échanger ton item à un pnj.
    • Soit tu met un score quand tu ramasse l'item;
    Tu ajoutes 1 à celui qui récupère un item (iron_nugget avec un tag money:1b pour l'exemple), puis tu clear l'item de l'inventaire. Et ça le refait tant que tu auras un item dans ton inventaire :
    Code (cpp):
    /execute as @a[nbt={Inventory:[{tag:{money:1b}}]}] run scoreboard players add @s Money 1
    /execute as @a[nbt={Inventory:[{tag:{money:1b}}]}] run clear @s iron_nugget{money:1b} 1

    • Soit tu garde l'item dans ton inventaire, et tu l'échange à un pnj.
    Tu summon un pnj personnalisé, et tu rajoutes les échanges que tu veux (après la virgule), en changeant l'item vendu (une diamond_sword pour l'exemple), ainsi que le nombre d'items nécessaires pour l'échanges (avec le Count de l'iron_nugget) :
    Code (cpp):
    /summon villager ~ ~1 ~ {CustomName:"{\"text\":\"Marchand\"}",NoAI:1b,Invulnerable:1b,Profession:5,PersistenceRequired:1b,Tags:["Custom"],Offers:{Recipes:[{maxUses:999,buy:{id:"iron_nugget",Count:5b,tag:{money:1b}},sell:{id:"diamond_sword",Count:1b}},]}}


    Pour le 2ème :
    Tu ajoutes un scoreboard qui détect quand tu tue un mob (un zombie par exemple :
    Code (cpp):
    /scoreboard objectives add Money minecraft.killed:minecraft.zombie
    ). Le problème, c'est qu'il faudrait un scoreboard pour chaque mob, et que tu ne pourras pas savoir le niveau du mob.

    J'ai pas encore trop réfléchis pour trouver un solution, car cette façon là est plus complexe.
     
  7. Cailbairwhos

    Cailbairwhos Nouveau

    Inscrit:
    4 Juil 2018
    Messages:
    6
    Points:
    2
    La tu ne m'avance pas trop pour la seconde solution car cela je le savais déjà, il faut imaginer qu'un zombie puisse être de lvl x et qu'un autre soit de lvl x+1 donc que chaqu'un d'entre eu donne une récompense différente

    et pour le premier c'est pas comme sa que je veux faire.

    voici un exemple mais ce pnj la, lui vend. Le problème que j'ai c'est pour celui qui achète

    [​IMG]
     
  8. Daminator4113

    Daminator4113 Enter the World

    Inscrit:
    5 Août 2017
    Messages:
    33
    Points:
    22
    Sexe:
    Homme
    Pour celui qui achète, tu détectes l'item dans l'inventaire du joueur, s'il l'a, tu lui incrémente son score d'argent de la valeur de l'item, puis tu clear l'item de l'inventaire.
    Code (cpp):
    /execute as @a[nbt={Inventory:[{id:"minecraft:iron_sword"}]}] run scoreboard players add @s Money 10
    /execute as @a[nbt={Inventory:[{id:"minecraft:iron_sword"}]}] run clear @s iron_sword 1
    Mais comme je l'ai dit, j'ai pas encore vraiment réfléchi pour la 2ème solution.
     
  9. Cailbairwhos

    Cailbairwhos Nouveau

    Inscrit:
    4 Juil 2018
    Messages:
    6
    Points:
    2
    Pour celui qui achète, tu détectes l'item dans l'inventaire du joueur, s'il l'a, tu lui incrémente son score d'argent de la valeur de l'item, puis tu clear l'item de l'inventaire.
    Code (cpp):
    /execute as @a[nbt={Inventory:[{id:"minecraft:iron_sword"}]}] run scoreboard players add @s Money 10
    /execute as @a[nbt={Inventory:[{id:"minecraft:iron_sword"}]}] run clear @s iron_sword 1
    Mais comme je l'ai dit, j'ai pas encore vraiment réfléchi pour la 2ème solution.[/QUOTE]

    Mais la n'ai pas le problème, si tu reviens à ma première question c'est comment faire pour détecter qu'il a bien l'item en sachant que l'on peu vendre 1,10ou64 à la fois mais que dans le slot il n'y à pas forcément le nombre exacte voir pas le bon nombre
     
  10. Lighar

    Lighar Explorateur

    Inscrit:
    15 Nov 2014
    Messages:
    60
    Points:
    54
    Sexe:
    Homme
    Bonjour, la solution donnée par Daminator4113 permet bien de gérer les différents niveaux, exemple le zombie niveau 10 dropera plus d'items que celui niveau 1. Tu n'as qu'à gérer le nombre de drops lorsque tu les /summon.
    Si tu veux tester un nombre d'items minimum, on peut récupérer le nombre d'items du joueur :
    -Avant on utilisait la commande /stats block et la commande /clear dans un second commande block mais maintenant tout se fait en une seule commande.
    1)
    On crée un score pour l'item, exemple pour l'iron nugget :
    Code (cpp):
    /scoreboard objectives add IronNugget dummy
    2)
    Puis on utilise un exécute dans un commande block qui sera activé avec un clic dans le chat (setblock de bloc de redstone, je pense que tu sais comment faire, mais sinon demande) :
    Code (cpp):
    /execute as @a store result score @s IronNugget run clear @s minecraft:iron_nugget 0
    Explication de la commande :
    Code (cpp):
    /execute as @a
    : Fait la commande en tant que tous les joueurs sans prendre en compte leurs positions
    Code (cpp):
    store result
    : remplace l'ancien /stats Affected......, et donc qui prend en compte le nombre d'items, mobs ... pris en compte dans la commande
    Code (cpp):
    score @s IronNugget
    : on stocke la commande pour le joueur qui exécute la commande dans son score IronNugget
    Code (cpp):
    run clear @s minecraft:iron_nugget 0
    : On exécute un clear qui supprime 0 iron nugget et qui va renvoyer le nombre d'iron nugget


    Au final chaque joueurs aura son nombre d'iron nugget stocké dans le score. Il suffit ensuite de mettre :
    Code (cpp):
    /execute as @p[scores={IronNugget=10..}] run /scoreboard players add @p Argent 10
    qui teste si le joueur a plus de 10 dans son score et lui donne 10 d'argent
    Code (cpp):
    /execute as @p[scores={IronNugget=10..}] run clear @p iron_nugget 10
    qui teste si le joueur a plus de 10 dans son score et lui retire 10 iron nugget

    Tu peux tester plusieurs nombres très précis et au dessus de 64 avec cette technique
     
    • J'approuve J'approuve x 1
    #10 Lighar, 7 Juil 2018
    Dernière édition: 7 Juil 2018
  11. Cailbairwhos

    Cailbairwhos Nouveau

    Inscrit:
    4 Juil 2018
    Messages:
    6
    Points:
    2
    merci de ta réponse et tes explications, si je disais que non c'est que je ne voyais pas sa comme sa dans se qu'il disais.

    Maintenant est il plus simple de faire comme sa ou de faire que le score de l'argent s'incrémente directement à la mort du mob? si c'est plus facile comme sa, comment puis je le faire?

    Encore merci à vous deux pour votre aide
     

Partager cette page