Serveur minecraft

PHP, Arduino et … Minecraft? Combiner Minecraft avec PHP! – SitePoint – Resoudre les problemes d’un serveur MineCraft

Le 3 février 2020 - 11 minutes de lecture

IoTWeek_Gray

C'est la semaine de l'IoT sur SitePoint! Toute la semaine, nous publions des articles sur l'intersection d'Internet et du monde physique. Continuez donc à vérifier la balise IoT pour les dernières mises à jour.

Une partie de la programmation la plus intéressante que j'ai faite a été dans Minecraft. Il s'agit d'un jeu de sandbox en monde ouvert développé par Mojang (récemment acquis par Microsoft). Minecraft a commencé comme une toile d'expression créative, et bien que j'y fasse des choses très différentes ces jours-ci, c'est toujours ça pour moi.

Je vais vous emmener en voyage, alors que nous construisons un manoir Minecraft, puis le sécuriser avec un système d'alarme réel. Il y a pas mal de chemin à parcourir, et bien que je prévois que ce soit une série en deux parties, je vais devoir vous laisser quelques détails tangentiels à découvrir!

Vous pouvez trouver le code de ce tutoriel sur https://github.com/sitepoint-editors/tutorial-php-arduino-and-minecraft

Cours intensif de programmation Minecraft

Minecraft a commencé comme la combinaison de deux idées simples. La première est que les joueurs peuvent récolter des ressources sur la carte dans laquelle ils se trouvent. Certaines de ces ressources, comme la nourriture et le bois, sont communes en surface. D'autres, comme l'or et la pierre, nécessitent un peu d'huile de coude virtuelle.

C'est de là que vient la «mine» (dans Minecraft). L'une de ces ressources s'appelle Redstone. On le trouve profondément sous terre, et c'est en quelque sorte un chef d'orchestre. Lorsqu'il est récolté et placé sur le sol, il ressemble aux lignes argentées sur le revers des cartes de circuits imprimés. Il existe également des émetteurs de puissance, similaires aux batteries ou au secteur, qui prennent de nombreuses formes dans le jeu.

Capture d'écran de Redstone en jeu

En utilisant ces ressources récoltées, les joueurs peuvent construire des habitations, cuisiner des aliments et même câbler des circuits virtuels. C'est de là que vient le «métier».

Je parle de tout cela, ainsi que des circuits et de la programmation de base, dans ma conférence Zombies and Binary. Je l'ai présenté récemment à php[tek] 2016, mais l'enregistrement a été perdu. Voici une version sur le thème JavaScript de FluentConf 2016: https://youtu.be/APJRBZUxADQ.

Imaginez que nous avons créé un vaste manoir Minecraft…

Capture d'écran du manoir en jeu

Maintenant, imaginez que nous voulons sécuriser la porte d'entrée dudit manoir… Nous avons besoin d'un moyen de vérifier si la porte d'entrée a été ouverte. Pour ce faire, nous devons utiliser Redstone, quelque chose appelé comparateur, et une autre chose appelée bloc de commande:

Capture d'écran dans le jeu des tests de blocage

Vous remarquerez peut-être le commutateur que j'ai connecté au bloc de commandes. Les commutateurs sont un type de source d'alimentation, et celle-ci fournira une certaine puissance au bloc de commande afin qu'il puisse effectuer la vérification de la porte ouverte. Nous automatiserons cette source d'alimentation dans un peu…

Les blocs de commandes sont des espaces réservés qui peuvent contenir une seule commande serveur. Les commandes serveur sont tout ce que vous pouvez faire en tant que joueur (à condition que vous soyez administrateur de serveur ou en mode solo). Ils sont comme des boutons d'Amazon Dash, en ce sens qu'ils peuvent recevoir une seule commande à exécuter, en appuyant sur un bouton.

Nous allons faire le test du bloc de commande pour une porte ouverte. Les cartes Minecraft sont basées sur des coordonnées, ce qui signifie que le test doit inclure des coordonnées pour l'emplacement de la porte. Par souci d’argument, disons que la porte est 191 67 -194. La commande pour le test (d'une porte ouverte en bois) sera alors:

/ testforblock 191 67-194 wooden_door 3

Vous pouvez trouver les coordonnées de votre carte actuelle avec fn + alt + F3 (pour Mac) et F3 (pour Windows). Dirigez-vous vers le bloc où vous allez placer la porte et entrez ces coordonnées dans la commande.

Différents blocs Minecraft (qu'ils soient fabriqués ou d'origine naturelle) ont des noms de blocs uniques. porte en bois est le nom de bloc unique pour une porte en chêne. 3 est une référence à l'orientation de la porte, il peut donc être différent dans vos cartes si vous placez votre porte dans une orientation différente. Si oui, essayez 0 par 3 jusqu'à ce que vous obteniez le résultat souhaité.

Nous allons faire en sorte que le deuxième bloc de commandes nous chuchote un message pour nous indiquer quand le test a trouvé un bloc correspondant. Lorsque nous actionnons l'interrupteur et que la porte est toujours fermée, nous ne devons rien voir. Mais lorsque nous ouvrons la porte (et que le test correspond à l'orientation de la porte ouverte), nous devrions voir une confirmation de cela!

Image animée en jeu du test d'un bloc

Nous avons maintenant un moyen de vérifier une porte ouverte. Nous ne voulons pas rester debout, mais pour exécuter manuellement cette vérification. Configurons l'équivalent de programmation d'une boucle infinie, ou l'équivalent électronique d'une horloge à cristal.

Pour cela, nous avons besoin de deux blocs de commande, disposés comme suit:

Capture d'écran de l'horloge dans le jeu

Remarquez que j'ai attaché un bouton à chaque bloc de commandes, afin de pouvoir exécuter leurs commandes. Ces boutons agissent également comme une source d'alimentation, donnant un bref pic de puissance aux blocs auxquels ils sont connectés.

Les coordonnées de la carte peuvent également être relativement définies. Autrement dit, si vous devez référencer des coordonnées à proximité du bloc de commande, vous pouvez utiliser ~ -1 ~ ~ + 1 pour signifier la coordonnée x du bloc de commande moins 1, la même coordonnée y et la coordonnée z plus 1.

Dans cet arrangement, nous voulons que le bloc de commande supérieur place un bloc Redstone juste en dessous:

/ setblock ~ ~ -1 ~ redstone_block

… Et nous voulons que le bloc de commandement du bas place un bloc d'air au-dessus:

/ setblock ~ ~ + 1 ~ air

Les blocs Redstone agissent également comme source d'énergie. Cet arrangement a un effet secondaire intéressant. Lorsque le bloc supérieur place un bloc Redstone en dessous de lui-même, le bloc Redstone donne d'abord de la puissance au bloc de commande inférieur. Il donne ensuite le pouvoir au bloc de commande supérieur.

Entre-temps, le bloc de commande inférieur a supprimé le bloc Redstone. Étant donné que le bloc de commande supérieur a reçu un nouveau signal d'alimentation (du bloc Redstone qu'il a placé) et que le bloc a ensuite été retiré par le bloc de commande inférieur, il recommence le cycle.

Cela conduit à la boucle infinie dont j'ai parlé. La boucle persistera pendant les redémarrages du serveur, et si vous êtes en mode créatif, vous pourrez briser le bloc Redstone et en voir de nouveaux créés instantanément.

Image animée dans le jeu de l'horloge de travail

Par défaut, ces actions de bloc de commande seront enregistrées et déclencheront des messages sur le serveur. Vous pouvez les désactiver avec quelques commandes (que vous n'avez qu'à entrer une fois par carte): / gamerule logAdminCommands false et / gamerule commandBlockOutput false.

Si nous prenons le pouvoir de l'horloge et le dirigeons vers le bloc de commande de test, le test se déroulera plusieurs fois par seconde, donnant un retour immédiat lorsque la porte sera ouverte!

Les nouvelles versions de Minecraft permettent aux blocs de commande de s'alimenter et même de se répéter. Avec cela, il est possible que le contrôle de porte se répète sans l’horloge. Si vous utilisez une ancienne version de Minecraft, en particulier lorsque vous utilisez des packs de mods, vous devrez peut-être encore faire l'horloge vous-même…

Animation dans le jeu de la porte qui fonctionne, de l'ouverture et de la fermeture

Il est également utile de savoir quand la porte a été fermée, afin que nous puissions désactiver l'alarme réelle. Pour cela, nous pouvons utiliser un onduleur (pensez-y comme tournant la porte fermée (fausse valeur) à une valeur vraie, de la même manière que nous le ferions en programmation: while (true) if (! $ doorOpen) print ....

Capture d'écran de l'onduleur en jeu

Regarder les fichiers journaux avec PHP

Tout cela est joli et inutile sans la possibilité de voir ces changements en PHP. Nous avons besoin d'un moyen «d'entendre» quand la porte a été ouverte et de réagir en PHP.

Heureusement, les messages chuchotés sont tous enregistrés. Si nous pouvons comprendre comment regarder et interpréter les fichiers journaux, nous devrions avoir toutes les informations dont nous avons besoin…

Une recherche Packagist rapide fournit une bibliothèque d’observateurs de fichiers qui semble à la hauteur de la tâche. Nous pouvons l'installer avec:

le compositeur requiert yosymfony / resource-watcher

Après cela, faisons un script pour regarder les fichiers journaux. Nous commençons par créer une instance de Symfony Finder et la pointer vers le répertoire dans lequel les journaux Minecraft sont stockés:

nécessite __DIR__. "/vendor/autoload.php";

utilisez Symfony  Component  Finder  Finder;

$ path = "/ path / to / Application Support / minecraft / logs";

$ finder = nouveau Finder ();

$ finder-> files ()
    -> nom ("*. log")
    -> profondeur (0)
    -> dans ($ path);

Le chemin vers Support d'application sera différent pour vous – c'est généralement dans le Bibliothèque dossier associé à votre compte. Vous pouvez également utiliser une version portable de Minecraft, vous n'aurez donc qu'à chercher un peu, jusqu'à ce que vous trouviez le journaux dossier.

Cette instance du Finder réduit la liste de surveillance des fichiers à *.Journal fichiers dans le même répertoire que celui que nous avons spécifié. Les méthodes sont clairement nommées, vous pouvez donc étendre les critères pour d'autres applications.

Ensuite, nous devons définir un fichier cache et une instance d'observateur:

utiliser Yosymfony  ResourceWatcher  ResourceCacheFile;
utilisez Yosymfony  ResourceWatcher  ResourceWatcher;

$ cache = new ResourceCacheFile (__ DIR__. "/cache.php");

$ watcher = new ResourceWatcher ($ cache);
$ watcher-> setFinder ($ finder);

tandis que (vrai) 
    sommeil (1);

    $ watcher-> findChanges ();

    // ... répondre aux changements

Ce script agit comme un processus de longue durée. Autrement dit, nous voulons surveiller les modifications apportées aux fichiers, pour une durée indéterminée. Nous créons donc une boucle infinie et l'utilisons pour rechercher constamment les changements de fichiers.

Vous pouvez dormir plus ou moins longtemps. J'ai trouvé qu'une seconde était assez bonne pour moi…

La bibliothèque de surveillance fournit des méthodes pour trois types de modifications de fichiers: création, suppression et mises à jour. Nous nous soucions uniquement des mises à jour:

tandis que (vrai) {
    sommeil (1);

    $ watcher-> findChanges ();

    // ... répondre aux changements
    $ changes = $ watcher-> getUpdatedResources ();

    if (count ($ changes)> 0) 
        $ first = $ change[0];

        $ lignes = fichier ($ en premier);

        for ($ i = count ($ lines) - 1; $ i> -1; $ i--) 
            if (stristr ($ lines[$i], "CHAT")) 
                if (stristr ($ lines[$i], "fermé")) 
                    imprimer "fermé!";
                

                if (stristr ($ lines[$i], "ouvert")) 
                    imprimer "ouvert!";
                

                Pause;
            
        
    
}

De nouveaux messages de discussion sont ajoutés au bas du fichier journal, nous devons donc vérifier si des fichiers journaux ont été modifiés (nous nous attendons à un seul fichier journal), diviser le fichier journal en lignes et vérifier chaque ligne à partir du bas du fichier jusqu'au sommet.

Si nous voyons une ligne de journal contenant BAVARDER, nous pouvons supposer qu'il s'agit d'un message de discussion. S'il contient également ouvert ou fermé, nous pouvons supposer qu'elle est causée par le circuit que nous avons créé.

Image animée de PHP et Minecraft travaillant ensemble

Vous pouvez utiliser des formats de message plus «uniques» pour les événements d'ouverture / fermeture. L'approche que j'ai choisie est simple mais ouverte aux abus et à l'ambiguïté (comme si quelqu'un d'autre me chuchotait «ouvert»). Les principes sous-jacents sont cependant les mêmes.

Ce n'est que la moitié de l'expérience. Dans le post de suivi, nous verrons comment construire un circuit d'alarme basé sur Arduino et le connecter à ce script. Le résultat final sera une alarme automatisée et réelle pour notre manoir Minecraft.

Si cela vous a plu et / ou avez des questions, faites-le nous savoir dans les commentaires!

Commentaires

Laisser un commentaire

Votre commentaire sera révisé par les administrateurs si besoin.