Redstone [Serveur Vanilla]Quand ce joueur s'est-il connecté pour la dernière fois?

Minecoincoin

A la vanille
2 Juillet 2012
234
13
125
Je me demandais bien ce que j'allais trouver de marrant à faire avec une des nouvelles commandes.

En utilisant /time query gametime, on peut maintenant connaitre le temps écoulé depuis la création d'une map. Grâce à cette nouvelle commande, je vais vous montrer comment faire un système pour donner le nombre de minutes depuis lequel un joueur ne s'est pas connecté (ce qui permet donc, de savoir sa dernière heure de connexion). Attention cependant : Ce type de système est surtout réservé aux petits serveurs, sachant qu'à une étape il faudra quelques command blocks par joueur sur le serveur.

Nous allons commencé par utiliser la commande en question dans un command block, qui sera alimenté en permanence par une clock (hopper clock fait l'affaire) :
Code:
/time query gametime
Il faut maintenant qu'on puisse extraire le résultat de ce command block (le temps depuis la création de la map) dans un score, pour pouvoir en faire un peu ce qu'on veut. Pour ça, créez un score (qui s'appellera dans mon tutoriel derniereCo) :
Code:
/scoreboard objectives add derniereCo dummy
Puis, initialisez la variable pour chaque joueur pour qui on veut connaitre l'heure de dernière connexion :
Code:
/scoreboard players set [nomdujoueur] derniereCo 0
Ensuite, placez vous au dessus du command block, puis tapez :
Code:
/stats block ~ ~-1 ~ set QueryResult @a derniereCo
Voilà. Maintenant le score derniereCo de tous les joueurs connectés sur le serveur va s'actualiser en continu. Dès qu'un joueur quittera le serveur, son score va se bloquer sur une valeur précise. Vous commencez à voir où je veux en venir? :p Le problème par contre, c'est que cette valeur correspond à des ticks, et nous, on veut savoir en nombre de minutes. Une petite conversion s'impose.
Pour ça, on va créer une valeur constante dans un scoreboard, puis diviser derniereCo par cette valeur. Cette valeur, ce sera 1200. Car 1200 gameticks = 1 minutes dans la vie réelle. Mais un problème se pose encore : Un score est attribué forcément à quelqu'un, à qui attribuer la constante? Je vous propose de créer un faux joueur :
Code:
/scoreboard players set ticksEnMinutes derniereCo 1200
Mignon son pseudo vous ne trouvez pas?... Bref. Maintenant, passons à la division d'un score par un autre : dans un deuxième command block, collé au premier, tapez :
Code:
/scoreboard players operation @a derniereCo /= ticksEnMinute derniereCo
Et vous voilà avec un nombre de minutes dans le score de chaque joueur maintenant!
Mais nous, ce qu'on veut, c'est faire la différence entre le score d'un joueur connecté (qui a son score qui augmente en permanence) et d'un joueur non connecté (qui a un score qui n'augmente plus depuis qu'il s'est déconnecté), puis afficher ça pour un joueur qui l'aura demandé via une commande... Une idée?

Il va falloir passer par un objectif trigger. La commande trigger permet à n'importe quel joueur (administrateur ou pas) d'éditer la valeur un d'un score, si on lui donne l'autorisation. C'est un très bon moyen de créer des commandes pour les joueurs (comme je l'ai présenté dans un autre tutoriel... Hem). Malheureusement pour nous ici, il va falloir créer un scoreboard trigger pour chaque joueur dont on veut savoir la dernière connexion.
Code:
/scoreboard objectives add Joueur trigger
Répétez l'opération pour tous les joueurs du serveur, puis utilisez l'autre partie de la clock (un comparateur sur l'autre hopper) pour mettre à jour autant de command blocks que vous avez de joueurs, et dans chacun de ces command block, insérez ça avec le nom du Joueur associé :
Code:
/scoreboard players operation @a[score_Joueur=1,score_Joueur_min=1] derniereCo -= Joueur derniereCo
Ce command block fait la soustraction du score d'un joueur qui veut savoir le nombre de minutes par celui d'un autre joueur.
Il va également vous falloir actualiser des command blocks avec ça :
Code:
/scoreboard players enable @a  Joueur
Toujours en remplaçant Joueur par un des noms de joueurs du serveur à chaque fois. En fait, si on ne fait pas ça, trigger ne va marcher qu'une fois, il faut actualiser cette commande constamment pour qu'elle permette d'utiliser trigger à nouveau.
Pour chaque command blocks qui fait la soustraction, vous allez placer un comparateur en sortie. Dès qu'un joueur fera la commande "/trigger Joueur set 1", le comparateur du command block avec le nom du Joueur correspondant s'allumera.
Vous avez maintenant permis aux joueurs de choisir le joueur dont ils veulent savoir la dernière connexion. Il ne reste plus qu'à envoyer le résultat de toutes ces opérations aux joueurs qui voudront savoir. Derrière le comparateur, entrez :
Code:
/tellraw @p[score_Joueur=1,score_Joueur_min=1] {score:{name:"@p[score_Joueur=1,score_Joueur_min=1]", objective:"derniereCo"},extra:[{text:" minutes."}]}
Et voilà. Le système est fini. Ou presque. En effet, si vous laissez ça comme ça, le score du joueur qui voudra savoir restera à 1, ce qui fait que le comparateur va rester allumé et personne ne pourra se reservir de cette commande. Il suffit de reset son score à 0, et le tour est joué. Collez un dernier command block au précédent, avec la commande :
Code:
/scoreboard players set @a Joueur 0

Voilà. Ce système est plutôt long à mettre en place, mais moi je trouve ça fun (et puis moi quand je peux me passer des plugins...).^^ En espérant que tout ce texte ne vous aura pas découragé! Si vous le souhaitez, vous pouvez l'améliorer pour afficher les heures voir même les jours, ça ne devrait pas être très difficile.
 

Minecoincoin

A la vanille
2 Juillet 2012
234
13
125
Ouaip. Mais en fait, c'est plus intéressant en heures je trouve. Du coup, il faut juste changer la constante (1200 => 72000) et le texte qui s'affiche avec le tellraw si quelqu'un passe par là et sait pas comment faire...^^
 

WegaCraft

Viel Archi'Red
2 Janvier 2014
284
32
135
Petite question tout de même ; pourquoi n'utilise-tu pas simplement un score de type stat.playOneMinute ?
Celui-ci se stopera automatiquement lors d'une déconnexion et augmentera dès la reconnexion.

Ca te faciliterai pas les choses ?
 

Minecoincoin

A la vanille
2 Juillet 2012
234
13
125
Mmmh je connaissais pas mais ça a pas l'air de convenir pour compter les minutes/heures, en tout cas avec ma méthode. :s Il me semble qu'on peut pas diviser deux scores en mettant le résultat dans un autre score malheureusement. Ce qui fait qu'en divisant par 1200, le score playOneMinute repart à 0 en continu (le chrono démarre, puis est divisé par 1200/72000, repart à 0 à cause de ça, est divisé par 1200/72000... etc). Ce qui n'est pas le cas avec le gametime, qui lui est une variable qui n'est pas un scoreboard à la base (le score est update par rapport au gametime, c'est divisé par 1200, la valeur diminue, mais revient avec une plus haute valeur que le précédent gametime puisque le score a changé mais pas le gametime, rediminue car divisée par 1200/72000, etc...).

Alors on pourrait faire un truc qui compte le nombre de minute en resettant playOneMinute à chaque fois qu'il atteint 1200, mais j'ai peur que ce soit assez imprécis... Et quand bien même pas sûr que ça simplifierait le système.
 

WegaCraft

Viel Archi'Red
2 Janvier 2014
284
32
135
Tu as raison :)
Je me posait juste la question.
Mais il possible de stocker un score dans un score system qui ne bougera pas si tu ne demande pas l actualisation.

La grosse différence entre le query et le score stat.playOneMinute c'est que le stat.playOneMinute compte déjà en minute et c'est propre à chaque joueur.
 

WegaCraft

Viel Archi'Red
2 Janvier 2014
284
32
135
Il me semblait que stat.playOneMinute, étant relié au statistique (http://minecraft.gamepedia.com/Statistics) et même juste au nom, indiquait les minute :D

Mais rien n'empèche de relié le score Time à un autre style Time2 avec une égalité ponctuelle, pour pouvoir traiter la valeur en séparé.
L'avantage c'est que le Tim appartiendera au joueur et non à la map, car le query est propre à la map.

Après c'est toi qui voit ^^
 

Minecoincoin

A la vanille
2 Juillet 2012
234
13
125
Et quel avantage ça a au juste? :p En fait je saurais même pas comment faire pour t'avouer. Éclaire moi un peu sur la façon de procéder... Je crois que je suis trop focalisé sur ma méthode pour ça. x)

Pour moi le gros problème ici c'est que la valeur peut pas augmenter si personne est sur le serveur (en gros elle est forcément rattaché à un joueur avant de changer), donc même en l'isolant quelque part impossible de s'en servir et de déterminer l'heure de co de tout le monde...
 

WegaCraft

Viel Archi'Red
2 Janvier 2014
284
32
135
Après, c'est vrai quc'est galère à expliquer, en fait tu peut l'utiliser pour déterminer, le temps de jeu, le temps de connection et l'heure de connection mais c'est plus galère à utiliser en heure de connection que pour le reste ^^'

Donc le mieux c'est que tu reste sur ton idée ;) De toute façon, c'etait juste une remarque :D