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

Détecter l'heure IRL 1.9+

Discussion dans 'Redstone & Commands blocks' créé par Eglaios, 10 Avr 2019.

  1. Eglaios

    Eglaios Enter the World

    Inscrit:
    20 Mar 2019
    Messages:
    40
    Points:
    20
    Sexe:
    Homme
    Ceci est un post que j'ai créé à l'origine dans un autre forum. Je donnerai le lien original à toute personne suspectant ce post d'être créé par quelqu'un d'autre, si requis par message privé.

    Non mais c'est quoi ce bazar? Les spoilers sont tout déréglés sur ce forum! ça en crée des nouveaux automatiquement!

    -EDIT : marche pour toutes les versions suivant la 1.9!! Et avec les spoilers, c'est bien mieux!-
    Vous avez toujours voulu créer un événement nocturne dans minecraft? Une interaction avec un villageois qui donnerait au joueur, à 15h59, une clé secrète, et tout cela en vanilla 1.9? Impossible!

    ...En fait, non.
    Croyez-le ou non, ces rêves deviendront réalité grâce à un petit système fait maison qui vous permettra de les reproduire dans vos propres maps! (Cette version-ci est en 1.9.4, mais elle doit sans doute pouvoir être faite dans d'autres versions)


    L'idée m'est venue d'une fonctionnalité relativement peu utile des blocs de commande : la ligne "Résultat précédent".
    Son rôle est d'afficher, comme son nom l'indique, un retour sur la dernière commande exécutée par le bloc en question.

    Parties :

    -Le principe
    -La structure et les commandes
    -Inconvénients et solutions


    Le principe


    Etape 1 : Obtenir l'heure


    Il suffit de faire exécuter à répétition une commande à résultat fixe. Pour cette petite structure, j'ai utilisé la commande "/gamerule doFireTick". (Le système s'attend à ce que celle-ci soit mise en "false", c'est généralement le cas de beaucoup de maps).
    Le résultat du bloc de commande affichera donc toujours la même chose, que la gamerule est sur false.

    La même chose? Pas tout à fait! Voici précisément ce que le bloc de commande renvoie :
    Code (cpp):
    [14:55:07] doFireTick = false
    Eh oui, le bloc a été exécuté pour la dernière fois à 14 heures 55 minutes et 7 secondes! Les choses s'éclaircissent!


    Etape 2 : Détecter l'heure obtenue


    Maintenant que le bloc de commande affiche l'heure exacte, il faut réussir à la détecter. Comment? Avec la commande /testforblock (Toujours en 1.9, évidemment)!
    En regardant le bloc de /gamerule avec le /blockdata, voici ce qui est affiché :

    [​IMG]
    Ce qui nous intéresse, c'est l'argument "LastOutput", commençant à la troisième ligne pour finir à la dernière. C'est donc la partie la plus énervante; copier tout le json et ne pas oublier ces maudits espaces avant et après l'heure et le "\u003d" (Unicode du symbole "=") :'(

    Enfin, on en tire la commande qui permet de détecter l'heure :
    Code (cpp):
    /testforblock ~ ~-2 ~ minecraft:repeating_command_block 1 {LastOutput:"{\"extra\":[{\"extra\":[{\"text\":\" \u003d \"},{\"text\":\"false\"}],\"text\":\"doFireTick\"}],\"text\":\"[15:11:22] \"}"}
    Et voilà! C'est... pas encore parfait, vu qu'il faudra attendre 24 heures plus tard pour voir le système se déclencher... Il faudra donc régler le /testforblock à l'heure désirée. Pour cela, il suffit de changer l'heure présente dans la commande ci-dessus (par exemple, changer le [15:11:22] pour [20:00:00] si l'a structure doit s'activer à 20 heures).



    La structure


    [​IMG]

    Blocs de commande :


    1 : Impulsion - inconditionnel - par la redstone
    Rôle : Désactivation de la propagation du feu - À activer une fois, indispensable, peut être détruit après
    Code (cpp):
    /gamerule doFireTick false
    2 : Répétition - inconditionnel - toujours actif
    Rôle : Actualisation de l'heure réelle dans le jeu - À pointer vers le haut
    Code (cpp):
    /gamerule doFireTick
    3 : Répétition - inconditionnel - toujours actif
    Rôle : Détection de l'heure sélectionnée - Remplacer [14:22:50] par l'heure voulue (heure-minute-seconde), à placer 2 blocs au-dessus du bloc #2 comme sur l'image, NE PAS SUPPRIMER L'ESPACE APRÈS [14:22:50] !
    Code (cpp):
    /testforblock ~ ~-2 ~ minecraft:repeating_command_block 1 {LastOutput:"{\"extra\":[{\"extra\":[{\"text\":\" \u003d \"},{\"text\":\"false\"}],\"text\":\"doFireTick\"}],\"text\":\"[14:22:50] \"}"}
    4 : Bloc de commande en chaîne, pour répéter une action pendant la seconde d'activation. Commande non spécifiée.



    Inconvénients du système et moyens de les contourner (IMPORTANT, À LIRE!!!)


    1. Problème : Le bloc de /testforblock est activé pendant une seconde
    Comme le bloc de /gamerule s'actualise toutes les secondes, lorsque le bloc de /testforblock sera exécuté avec succès, si un bloc de commande en chaîne y est connecté, il sera activé une dizaine de fois dans la seconde! Pour un système de détection, c'est pratique, mais pour une série de commandes, avec du /give, par exemple, ça peut être très problématique
    Solution : Mettre un comparateur pour ne déclencher qu'une fois


    2. Problème : Le bloc de /testforblock ne peut QUE s'activer pendant une seconde, ni plus ni moins.
    Le système ne peut détecter qu'une heure précise, pas d'intervalle (du moins, à ce que je sache), le temps affiché étant un texte et non pas une variable!
    Solution : Mettre deux blocs de /testforblock!
    S'il faut activer un système pendant un intervalle, il suffit de mettre deux blocs de /testforblock : un qui se déclenchera le premier, activant le système, et un autre bloc se déclenchant plus tard, qui désactivera le système!
    -CORRECTION- CE SYSTÈME COMPORTE TROP DE FAILLES POUR ÊTRE ADOPTE : LE JOUEUR EST OBLIGE D'ETRE PRESENT AUX DEUX MOMENTS SANS QUOI LA DUREE EST ALTEREE. Il faudra perfectionner tout ça pour tenter de résoudre ce problème d'une autre façon.


    3. Problème : Le temps réel continue quand minecraft est mis en pause (ah bon :confused:)

    Eh oui, on ne peut pas arrêter le temps, et ça cause un certain problème : Si jamais la structure doit s'activer à 20h et qu'entre 19h59 et 20h01, le joueur avait mis son jeu en pause, les données du block de /gamerule passeront de [19:59:00] à [20:01:00]! L'activation n'aura donc pas eu lieu et il aurait fallu attendre le jour suivant! (Ou changer l'heure de l'ordinateur, mais chuuuut! :fou: )
    Solution : Mettre en multijoueur
    En multijoueur, ouvrir le menu ne met pas le jeu en pause! Petit hic : il existe une commande pour mettre automatiquement un monde en LAN, le /publish, mais elle est inutilisable en bloc de commande, est même en clickEvent de tellraw, de livre ou de pancarte (Oui, j'ai TOUT essayé). Donc soit régler ce problème est capital (Surtout avec la solution du problème #2, les petits malins sauteraient le bloc de désactivation :fou:), et dans ce cas, mieux vaut mettre un système d'avertissement au joueur pour lui dire d'ouvrir le monde en LAN manuellement, soit ce n'est pas grave et c'est mieux de rester avec ce problème plus ou moins important, ça dépend de vous!


    J'espère que vous saurez tirer parti de ce système amusant (Peut-être un peu frustrant?) tout à fait exclusif, je n'ai rien trouvé de tel sur internet. Amusez-vous bien!




    Eglaios
     
    • J'aime J'aime x 1
    #1 Eglaios, 10 Avr 2019
    Dernière édition: 10 Avr 2019

Partager cette page