[CommandBlock] Système de vente 1.8+

WegaCraft

Viel Archi'Red
2 Janvier 2014
284
32
135
Bonjour à tous et à toutes ;)

Me voilà aujourd'hui à vous demander de l'aide, en effet, je réalise actuellement un système de vente mais je bloque sur certains éléments.
Je récapitule déjà ce que j'ai déjà de fait.

Fonctionnement :
Un villageois dont le trade est bloqué invulnérable et immobile.​
Une mûle dont la montée est bloque, invisible, invulnérable et immobile.​
Un clic gauche n'occasionne aucune action​
Un clic droit non-plus​
Un clic droit sneaké permet d'accéder au Trade system.​
Déjà réalisé :
Bloquage du trade du villageois. ✔​
Immobilisation et invulnérabilité du villageois. ✔​
Bloquage de la montée de la mûle. ✔​
Immobilisation, invisibilité et invulnérabilité de la mûle. ✔​

La partie simple est déjà faites comme vous pouvez le voir :D

Organisation des données :
Je travaille d'une façon assez spécial en effet, j'organise des "Datatags custom" - ce ne sont pas vraiment des DataTags mais c'est comme ça que je les utilise :D - avec un hiérarchie et des héritage que voici :​
EntityHorse:​
Trade:0/1​
Full:0/1​
Class:0-10​
ClassLvl:0-5​
Items:​
J'explique :​
Les chevaux - EntityHorse - possède 4 "DataTags custom" et un vrai DataTag - plus mais je n'utilise que celui ci pour l'instant :D -, Il dispose donc de :​
Trade :0/1 (Faux/Vrai) Le cheval est un cheval de trading.​
Full :0/1 (Faux/Vrai) Le cheval a son magasin complet (les items correspondent)​
Class :0-10 Le type de vente du cheval (Chasseur,Forgeron,Libraire,Fermier,Barman...)​
ClassLvl:0-5 Le niveau de vente du cheval​
Items : Les items dont le cheval dispose.​
Class & Items :
En réalité, j'ai déjà préparé quels items auront les chevaux en fonction de leur Class et leur ClassLvl.​
Au final :
Le système fonctionnerait sur un clock cmdblc, je cherche donc à testerait l'inventaire des chevaux de la meilleurs façon possible.​
Je sais dèjà utiliser /clear - /replaceitem mais il faudrait détecter quel est le joueur avec qui on trade et quel objet il a pris.​
C'est là que rentre en ligne de compte mes "DataTags", ils permette de différencier les différents chevaux.​
J'espère que vous pourez m'aider :D Je m'adresse essentiellement au grand mais toute aide et commentaire constructif sont les bienvenus :D
 

Monta

Map Maker
26 Août 2011
275
10
124
Je cherche encore la question.
Ton idée est très bonne et tout semble pouvoir marcher: qu'est-ce qui te pose problème (excepté le français vu le nombre de fautes...) ?

Je sais dèjà utiliser /clear - /replaceitem mais il faudrait détecter quel est le joueur avec qui on trade et quel objet il a pris.

Tu as la réponse dans la question là. Le /clear te permet de savoir ce qui est pris.
Tu ajoutes un tag "Prix" éventuellement ou un tag "PlaceHolder" pour savoir que c'est un objet à acheter et non un objet déjà acheté.
 

WegaCraft

Viel Archi'Red
2 Janvier 2014
284
32
135
En fait, c'est vrai qu'en me relisant là question n'est pas évidente :oops: Dsl

En réalité, je ne savais pas vraiment si j'établissait le prix par slot et par Class.
En effet le /clear me permet de detecter quel objet serait manquant mais je ne voit pas comment ajouter un tag sur un item qui n'est pas une entité.
 

Minecoincoin

A la vanille
2 Juillet 2012
234
13
125
J'ai pas compris grand chose... En fait le plus simple ça aurait été que tu nous parles que de ton problème. :D Parce que là tu parles de tout le système dont les villageois au début alors qu'ils ont rien à faire là-dedans (si j'ai bien compris), du coup ça aide pas à la compréhension du problème...
J'aimerais bien plus de détails sur les DataTags Custom aussi.^^ Comment tu mets ça en place? C'est un scoreboard? Parce que dire "j'appelle ça des Custom DataTags, mais en fait c'est pas des DataTags" ça aide pas vraiment. xD Quand tu dis ajouter un tag c'est quoi pour toi? Ajouter un moyen de détecter quelque chose en lui assignant une valeur? Ce que tu veux c'est donner une valeur à un item de l'inventaire d'un cheval pour détecter si c'est bien cet item qui est manquant ou pas?

Voilà voilà, beaucoup de questions mais je t'avoue que même en relisant, malgré le fait que c'est bien présenté (avec certes des fautes de français) je vois pas exactement où tu veux en venir. Pourtant j'aimerais bien chercher pour essayer de t'aider. :D
 

WegaCraft

Viel Archi'Red
2 Janvier 2014
284
32
135
Alors je vais y aller pas à pas :D

Les "Datatag Custom" :
Il s'agit en effet de score ; il est possible d'affecter un score à tout type d'entité donc j'en ai profité :D
Les chevaux possèdent donc des score correspondant à leur type et leur niveau pour ainsi déterminer quelles objets ils vendront.​
Ainsi :​
[score_Class=0,score_Class_min=0,score_Classlvl=0,score_ClassLvl_min=0] => Chasseur I​
[score_Class=0,score_Class_min=0,score_Classlvl=1,score_ClassLvl_min=1] => Chasseur II​
[score_Class=0,score_Class_min=0,score_Classlvl=2,score_ClassLvl_min=2] => Chasseur III​
...etc :D

Le problème :
J'ai trouvé comment remplir automatiquement les inventaires ✔​
Je cherche un moyen organisé de détecter l'objet pris dans l'inventaire et qui l'a pris :D
Car j'ai déjà pensé à quelque chose, par rapport à ce qu'à dit Monta - car je voit pas comment faire autrement - :​
- Ajouter payant dans les Lore des items ; ce qui permet de tester si l'objet a été pris dans le vendeur.​
Mais ça ne résout pas mon problème car je suis obliger de mobiliser 5 cmdblc par objet avec cette solution​
Et je serais ravi de travailler là dessus avec toi :D
 

Minecoincoin

A la vanille
2 Juillet 2012
234
13
125
mmmh j'arrive pas à faire un testfor ou un clear dans l'inventaire d'un EntityHorse spécifique... Est-ce que c'est ton problème aussi? :D Parce que sinon après je saurais comment faire mais là... Pas moyen de trouver un moyen de tester ce qu'il y a dans le coffre du cheval...
 

WegaCraft

Viel Archi'Red
2 Janvier 2014
284
32
135
Et bien si en fait :D

Attend j'explique ce que j'ai fait mais qui ne me plait pas ^^ :

J'effectue ces commandes :
Code:
/scoreboard players set @e[type=EntityHorse,score_Trade_min=1] Full 0
Mise a zéro pour tout les chevaux vendeurs​
Ensuite j’enchaîne par :
Code:
/scoreboard players set @e[type=EntityHorse,score_Trade_min=1,score_Class=0,score_Class_min=0,score_Classlvl=0,score_ClassLvl_min=0] Full 1 {Items:[{...},{...}]}
En fonction de la classe​

Seulement, ensuite ça me plait pas :
J'effectue ces commandes :​
Code:
/testfor@e[type=EntityHorse,score_Trade_min=1,score_Full=0]
Qui active tout les /replace item pour chaque slot de chaque classes pour remplir les inventaire et ça fait beaucoup de commande qui tourne - même si elle tourne qu'avec les chevaux ayant le score Full=0 et de la classe correspondante.​
Puis d'un autres coté je test le joueur :​
Code:
/clear @a[score_Trading_min=1] bow 0 0 {display:{Lore:["Payant"]}}
Seulement, là aussi ça ne me plait pas car il faudrait que je fasse ça pour tout les objets possibles à la vente :eek:​
Et bien, j'espère que cette fois ci a été claire :D
 

Minecoincoin

A la vanille
2 Juillet 2012
234
13
125
Oui excuse moi j'ai trouvé la commande en cherchant peu après. Il me manquait un b pour le slot et le count... x)

Du coup, ce que tu veux c'est que quand quelqu'un prend un item dans un cheval, ça détecte qu'un item a été pris dans l'inventaire du cheval (via une commande au lieu de trouzemille), et que ça donne un score à la personne qui a pris l'item en question? Si c'est ça je pense avoir trouvé un moyen.
Tu utilises un command block par cheval pour tester l'ensemble de son inventaire dans un premier temps (et non pas les items un par un) :
Code:
/testfor @e[...] {Items:[{id:minecraft:...,Slot:...b,Count:...b},{id:minecraft:...,Slot:...b,Count:...b}]}
... avec autant de {id:minecraft:...,Slot:...b,Count:...b} que tu veux évidemment. x)
Tu changes les data du command block, de façon à ce que ça donne un score de 0 au joueur le plus proche si le testfor ne marche plus (et donc que l'inventaire du cheval a changé) :
Code:
/stats block ~ ~ ~ set SuccessCount @p nomdobjectifquetuveux
Ensuite, tu tues le cheval (tu le tp dans la lave ou le void évidemment plutôt qu'un kill, pour éviter que les items se droppent) si la commande n'a pas marché (et donc que l'inventaire correspond plus), et tu en réinvoques un avec l'inventaire de base.

Avec ça au final on a détecté qui a pris l'item (score de 0), et le cheval a de nouveau son inventaire. Après le soucis c'est qu'en remettant un cheval avec un inventaire, le score du joueur va passer à 1... Donc faut faire ce que tu veux du joueur entre le moment où il prend un item dans le coffre du cheval, et le moment où tu réinvoques un nouveau cheval...

Edit : Tu peux te servir de /stats avec /scoreboard players aussi d'ailleurs si c'est comme ça que tu veux procéder. x)
 

WegaCraft

Viel Archi'Red
2 Janvier 2014
284
32
135
Déjà, j'ai déjà la détection d'inventaire incomplet mais je cherche à déterminer facilement quel item a été pris et par qui sans avoir à faire un bloc de 5 cmdblc par item - ce que j'ai actuellement et qui ne me plait pas -.
De plus ton idée est bonne mais c'est la première que j'ai eu et elle n'est pas adaptée car il faudrait mettre le système sous chaque cheval :D

A l'heure actuelle, je travaille pour simplifié l'utilisation des système - comme pour le More Food que je vais pas tarder à publier - où l'emplacement des objets concerné n'a pas d'importance.

Dans l'état actuel des choses, je peut trés facilement ajouter un trader avec :
/summon Villager -527 57 408 {Invulnerable:1,Riding:{id:WitherSkull,direction:[]}}​
/summon Slime -527 57 408 {Invulnerable:1,Silent:1,Size:0,ActiveEffects:[{Id:14,Amplifier:-1,Duration:1000000,ShowParticles:0}],Riding:{id:Slime,Invulnerable:1,Silent:1,Size:1,ActiveEffects:[{Id:14,Amplifier:-1,Duration:1000000,ShowParticles:0}],Riding:{id:Slime,Invulnerable:1,Silent:1,Size:1,ActiveEffects:[{Id:14,Amplifier:-1,Duration:1000000,ShowParticles:0}],Riding:{id:WitherSkull,direction:[]}}}}​
/summon EntityHorse -527 57 408 {Invulnerable:1,CustomName:Chasseur,Silent:1,Type:2,ChestedHorse:1,Tame:1,ActiveEffects:[{Id:14,Amplifier:-1,Duration:1000000,ShowParticles:0}],Riding:{id:WitherSkull,direction:[]}}​

Puis l'affectation au cheval du rôle de vendeur (valeur pour un chasseur) avec :
/scoreboard players set @e[type=EntityHorse,x=-527,y=57,z=408,r=0] Trade 1​
/scoreboard players set @e[type=EntityHorse,x=-527,y=57,z=408,r=0] Class 0​
/scoreboard players set @e[type=EntityHorse,x=-527,y=57,z=408,r=0] ClassLvl 0​
Comme tu l'as certainement compris, la révolution dans mon système est qu'il est totalement indépendant de la position du vendeur et permet l'ajout d'un vendeur à n'importe quel endroit :D

EDIT : Voilà la map du système, avec des explication :D >>>MAP<<<
 

Minecoincoin

A la vanille
2 Juillet 2012
234
13
125
Euh... Donc si c'est indépendant de la position du vendeur, les coordonnées que tu as marqué, quand le système sera fonctionnel, ce sera remplacé par des coordonnées relatives : ~ ?