Module minetest_python_nsi

@Author: Christophe Viroulaud @Time: Dimanche 05 Février 2023 23:16

Expand source code
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
@Author: Christophe Viroulaud
@Time:   Dimanche 05 Février 2023 23:16
"""

import time
from . import connection
from . util import *

conn = None
player = None


def connexion(pseudo: str = "", host: str = "localhost", port: int = 4711) -> tuple:
    """
    - établit la connexion avec Minetest (local ou distant) et récupère l'id du joueur
    - connexion(): par défaut la liaison est établie en locale

    Paramètres:
        - pseudo (str, optionnel): pseudo du joueur. 
        - host (str, optionnel): adresse du serveur. 
        - port (int, optionnel): port. 4711 est le port par défaut 

    Renvoi:
        - tuple: la connexion, l'id du joueur
    """
    global conn, player
    # Attente de connexion
    wait_for_conn = True
    while wait_for_conn:
        try:
            conn = connection.Connection(host, port)
        except:
            print("Attente de connexion...")
            time.sleep(1)
        else:
            wait_for_conn = False

    wait_for_player = True
    # connexion locale avec paramètres par défaut
    if host == "localhost":
        while wait_for_player:
            try:
                ids = conn.sendReceive("world.getPlayerIds")
            except:
                print("Attente de connexion du joueur...")
                time.sleep(1)
            else:
                wait_for_player = False

        players = list(map(int, ids.split("|")))
        player = players[0]
    else:  # connexion réseau
        while wait_for_player:
            try:
                id = conn.sendReceive("world.getPlayerId", pseudo)
                assert id != "fail", "nom de joueur inconnu"
            except:
                print("Attente de connexion du joueur...")
                time.sleep(1)
            else:
                wait_for_player = False
        player = id
    # return (conn, player)


# connexion automatique
#conn, player = connexion()
#conn, player = connexion("mon_pseudo", "mon_serveur", 4711)

# Fonctions monde


def recuperer_id_bloc(coord: tuple) -> int:
    """
    - trouve l'identifiant du bloc repéré

    Paramètres:
        - coord (tuple): coordonnées du bloc

    Renvoi:
        - int: type de bloc
    """
    return int(conn.sendReceive("world.getBlock", intFloor(coord[0], coord[1], coord[2])))


def poser_bloc(coord: tuple, bloc: int, donnees: int = 0) -> None:
    """
    - place un bloc aux coordonnées données
    - pour certains blocs, il est possible de donner des informations supplémentaires
    (couleur, type de bois, orientation...)

    Paramètres:
        - coord (tuple): coordonnées du bloc
        - bloc (int): type de bloc
        - donnees (int, optionnel): informations supplémentaires (couleur, type de bois...)
    """
    conn.send("world.setBlock", intFloor(
        coord[0], coord[1], coord[2], bloc, donnees))


def recuperer_altitude(coord: tuple) -> int:
    """
    - Récupère l'altitude de coordonnées horizontales (x,z)

    Paramètres:
        - coord (tuple): coordonnées du bloc

    Renvoi:
        - int: hauteur maximale à ce point
    """
    return int(conn.sendReceive("world.getHeight", intFloor(coord[0], coord[2])))


def recuperer_id(nom: str) -> int:
    """
    - Récupère l'identifiant du joueur selon son nom
    - Lève une assertion si le nom est inconnu

    Paramètres:
        - nom (str): nom du joueur

    Renvoi:
        - int: id du joueur
    """
    id = conn.sendReceive("world.getPlayerId", nom)
    if id == "fail":
        print("Attention! Nom de joueur inconnu; valeur renvoyée: 0")
        return 0
    else:
        return int(id)


def recuperer_ids() -> list:
    """
    - Récupère les identifiants de tous les joueurs

    Renvoi:
        - list: tableau des identifiants
    """
    infos = conn.sendReceive("world.getPlayerIds")
    ids = map(int, infos.split("|"))
    return list(ids)


def sauvegarder() -> None:
    """
    - Sauvegarde un point de contrôle qui peut être utilisé pour restaurer un état du jeu
    """
    conn.send("world.checkpoint.save")


def restaurer() -> None:
    """
    - Restaure l'état du jeu au moment de la sauvegarde d'un point de contrôle
    """
    conn.send("world.checkpoint.restore")


def poster(msg: str) -> None:
    """
    - Poste un message sur le chat

    Paramètres:
        - msg (str): le message à poster
    """
    conn.send("chat.post", msg)

# Fonctions joueur


def recuperer_ma_position() -> tuple:
    """
    - Récupère la position de la tuile sous le joueur

    Renvoi:
        - tuple: coordonnées (x, y, z)
    """
    s = conn.sendReceive("entity.getTile", player)
    return tuple(map(int, s.split(",")))


def changer_ma_position(coord: tuple) -> None:
    """
    - Repositionnement du joueur sur une autre tuile

    Paramètres:
        - coord (tuple): nouvelle coordonnées
    """
    conn.send("entity.setTile", player, intFloor(coord[0], coord[1], coord[2]))


def recuperer_ma_rotation() -> float:
    """
    - Récupère l'angle de rotation dans le plan horizontal du joueur 

    Renvoi:
        - float: angle dans le plan Oxz (0° à 360°)
    """
    s = conn.sendReceive("entity.getRotation", player)
    return float(s)


def recuperer_mon_inclinaison() -> float:
    """
    - Récupère l'angle de rotation dans le plan vertical du joueur 

    Renvoi:
        - float: angle dans le plan Oxy (-90° à 90°)
    """
    s = conn.sendReceive("entity.getPitch", player)
    return float(s)


def recuperer_ma_direction() -> tuple:
    """
    - Récupère le vecteur unitaire du cap du joueur

    Renvoi:
        - tuple: coordonnées (x, y, z)
    """
    s = conn.sendReceive("entity.getDirection", player)
    return tuple(map(float, s.split(",")))

# Fonctions autres joueurs


def recuperer_position(id: int) -> tuple:
    """
    - Récupère la position de la tuile sous le joueur 'id'

    Paramètres:
        - id (int): identifiant du joueur

    Renvoi:
        - tuple: coordonnées (x, y, z)
    """
    ids = recuperer_ids()
    if id in ids:
        s = conn.sendReceive("entity.getTile", id)
        return tuple(map(int, s.split(",")))
    else:
        print("Attention! Joueur inconnu, impossible de récupérer sa position; valeur renvoyée: (0, 0, 0)")
        return (0, 0, 0)


def changer_position(id: int, coord: tuple) -> None:
    """
    - Repositionnement du joueur 'id' sur une autre tuile

    Paramètres:
        - id (int): identifiant du joueur
        - coord (tuple): nouvelle coordonnées
    """
    ids = recuperer_ids()
    if id in ids:
        conn.send("entity.setTile", id, intFloor(coord[0], coord[1], coord[2]))
    else:
        print("Attention! Joueur inconnu, impossible de le bouger")


def recuperer_rotation(id: int) -> float:
    """
    - Récupère l'angle de rotation dans le plan horizontal du joueur 'id'

    Paramètres:
        - id (int): identifiant du joueur

    Renvoi:
        - float: angle dans le plan Oxz (0° à 360°)
    """
    ids = recuperer_ids()
    if id in ids:
        s = conn.sendReceive("entity.getRotation", id)
        return float(s)
    else:
        print("Attention! Joueur inconnu, impossible de récupérer sa rotation; valeur renvoyée: 0")
        return 0


def recuperer_inclinaison(id: int) -> float:
    """
    - Récupère l'angle de rotation dans le plan vertical du joueur 'id'

    Paramètres:
        - id (int): identifiant du joueur

    Renvoi:
        - float: angle dans le plan Oxy (-90° à 90°)
    """
    ids = recuperer_ids()
    if id in ids:
        s = conn.sendReceive("entity.getPitch", id)
        return float(s)
    else:
        print("Attention! Joueur inconnu, impossible de récupérer son inclinaison; valeur renvoyée: 0")
        return 0


def recuperer_direction(id: int) -> tuple:
    """
    - Récupère le vecteur unitaire du cap du joueur

    Paramètres:
        - id (int): identifiant du joueur

    Renvoi:
        - tuple: coordonnées (x, y, z)
    """
    ids = recuperer_ids()
    if id in ids:
        s = conn.sendReceive("entity.getDirection", id)
        return tuple(map(float, s.split(",")))
    else:
        print("Attention! Joueur inconnu, impossible de récupérer son inclinaison; valeur renvoyée: (0,0,0)")
        return (0, 0, 0)

Fonctions

def changer_ma_position(coord: tuple) ‑> None
  • Repositionnement du joueur sur une autre tuile

Paramètres

  • coord (tuple): nouvelle coordonnées
Expand source code
def changer_ma_position(coord: tuple) -> None:
    """
    - Repositionnement du joueur sur une autre tuile

    Paramètres:
        - coord (tuple): nouvelle coordonnées
    """
    conn.send("entity.setTile", player, intFloor(coord[0], coord[1], coord[2]))
def changer_position(id: int, coord: tuple) ‑> None
  • Repositionnement du joueur 'id' sur une autre tuile

Paramètres

  • id (int): identifiant du joueur
  • coord (tuple): nouvelle coordonnées
Expand source code
def changer_position(id: int, coord: tuple) -> None:
    """
    - Repositionnement du joueur 'id' sur une autre tuile

    Paramètres:
        - id (int): identifiant du joueur
        - coord (tuple): nouvelle coordonnées
    """
    ids = recuperer_ids()
    if id in ids:
        conn.send("entity.setTile", id, intFloor(coord[0], coord[1], coord[2]))
    else:
        print("Attention! Joueur inconnu, impossible de le bouger")
def connexion(pseudo: str = '', host: str = 'localhost', port: int = 4711) ‑> tuple
  • établit la connexion avec Minetest (local ou distant) et récupère l'id du joueur
  • connexion(): par défaut la liaison est établie en locale

Paramètres

  • pseudo (str, optionnel): pseudo du joueur.
  • host (str, optionnel): adresse du serveur.
  • port (int, optionnel): port. 4711 est le port par défaut

Renvoi

  • tuple: la connexion, l'id du joueur
Expand source code
def connexion(pseudo: str = "", host: str = "localhost", port: int = 4711) -> tuple:
    """
    - établit la connexion avec Minetest (local ou distant) et récupère l'id du joueur
    - connexion(): par défaut la liaison est établie en locale

    Paramètres:
        - pseudo (str, optionnel): pseudo du joueur. 
        - host (str, optionnel): adresse du serveur. 
        - port (int, optionnel): port. 4711 est le port par défaut 

    Renvoi:
        - tuple: la connexion, l'id du joueur
    """
    global conn, player
    # Attente de connexion
    wait_for_conn = True
    while wait_for_conn:
        try:
            conn = connection.Connection(host, port)
        except:
            print("Attente de connexion...")
            time.sleep(1)
        else:
            wait_for_conn = False

    wait_for_player = True
    # connexion locale avec paramètres par défaut
    if host == "localhost":
        while wait_for_player:
            try:
                ids = conn.sendReceive("world.getPlayerIds")
            except:
                print("Attente de connexion du joueur...")
                time.sleep(1)
            else:
                wait_for_player = False

        players = list(map(int, ids.split("|")))
        player = players[0]
    else:  # connexion réseau
        while wait_for_player:
            try:
                id = conn.sendReceive("world.getPlayerId", pseudo)
                assert id != "fail", "nom de joueur inconnu"
            except:
                print("Attente de connexion du joueur...")
                time.sleep(1)
            else:
                wait_for_player = False
        player = id
    # return (conn, player)
def poser_bloc(coord: tuple, bloc: int, donnees: int = 0) ‑> None
  • place un bloc aux coordonnées données
  • pour certains blocs, il est possible de donner des informations supplémentaires (couleur, type de bois, orientation…)

Paramètres

  • coord (tuple): coordonnées du bloc
  • bloc (int): type de bloc
  • donnees (int, optionnel): informations supplémentaires (couleur, type de bois…)
Expand source code
def poser_bloc(coord: tuple, bloc: int, donnees: int = 0) -> None:
    """
    - place un bloc aux coordonnées données
    - pour certains blocs, il est possible de donner des informations supplémentaires
    (couleur, type de bois, orientation...)

    Paramètres:
        - coord (tuple): coordonnées du bloc
        - bloc (int): type de bloc
        - donnees (int, optionnel): informations supplémentaires (couleur, type de bois...)
    """
    conn.send("world.setBlock", intFloor(
        coord[0], coord[1], coord[2], bloc, donnees))
def poster(msg: str) ‑> None
  • Poste un message sur le chat

Paramètres

  • msg (str): le message à poster
Expand source code
def poster(msg: str) -> None:
    """
    - Poste un message sur le chat

    Paramètres:
        - msg (str): le message à poster
    """
    conn.send("chat.post", msg)
def recuperer_altitude(coord: tuple) ‑> int
  • Récupère l'altitude de coordonnées horizontales (x,z)

Paramètres

  • coord (tuple): coordonnées du bloc

Renvoi

  • int: hauteur maximale à ce point
Expand source code
def recuperer_altitude(coord: tuple) -> int:
    """
    - Récupère l'altitude de coordonnées horizontales (x,z)

    Paramètres:
        - coord (tuple): coordonnées du bloc

    Renvoi:
        - int: hauteur maximale à ce point
    """
    return int(conn.sendReceive("world.getHeight", intFloor(coord[0], coord[2])))
def recuperer_direction(id: int) ‑> tuple
  • Récupère le vecteur unitaire du cap du joueur

Paramètres

  • id (int): identifiant du joueur

Renvoi

  • tuple: coordonnées (x, y, z)
Expand source code
def recuperer_direction(id: int) -> tuple:
    """
    - Récupère le vecteur unitaire du cap du joueur

    Paramètres:
        - id (int): identifiant du joueur

    Renvoi:
        - tuple: coordonnées (x, y, z)
    """
    ids = recuperer_ids()
    if id in ids:
        s = conn.sendReceive("entity.getDirection", id)
        return tuple(map(float, s.split(",")))
    else:
        print("Attention! Joueur inconnu, impossible de récupérer son inclinaison; valeur renvoyée: (0,0,0)")
        return (0, 0, 0)
def recuperer_id(nom: str) ‑> int
  • Récupère l'identifiant du joueur selon son nom
  • Lève une assertion si le nom est inconnu

Paramètres

  • nom (str): nom du joueur

Renvoi

  • int: id du joueur
Expand source code
def recuperer_id(nom: str) -> int:
    """
    - Récupère l'identifiant du joueur selon son nom
    - Lève une assertion si le nom est inconnu

    Paramètres:
        - nom (str): nom du joueur

    Renvoi:
        - int: id du joueur
    """
    id = conn.sendReceive("world.getPlayerId", nom)
    if id == "fail":
        print("Attention! Nom de joueur inconnu; valeur renvoyée: 0")
        return 0
    else:
        return int(id)
def recuperer_id_bloc(coord: tuple) ‑> int
  • trouve l'identifiant du bloc repéré

Paramètres

  • coord (tuple): coordonnées du bloc

Renvoi

  • int: type de bloc
Expand source code
def recuperer_id_bloc(coord: tuple) -> int:
    """
    - trouve l'identifiant du bloc repéré

    Paramètres:
        - coord (tuple): coordonnées du bloc

    Renvoi:
        - int: type de bloc
    """
    return int(conn.sendReceive("world.getBlock", intFloor(coord[0], coord[1], coord[2])))
def recuperer_ids() ‑> list
  • Récupère les identifiants de tous les joueurs

Renvoi

  • list: tableau des identifiants
Expand source code
def recuperer_ids() -> list:
    """
    - Récupère les identifiants de tous les joueurs

    Renvoi:
        - list: tableau des identifiants
    """
    infos = conn.sendReceive("world.getPlayerIds")
    ids = map(int, infos.split("|"))
    return list(ids)
def recuperer_inclinaison(id: int) ‑> float
  • Récupère l'angle de rotation dans le plan vertical du joueur 'id'

Paramètres

  • id (int): identifiant du joueur

Renvoi

  • float: angle dans le plan Oxy (-90° à 90°)
Expand source code
def recuperer_inclinaison(id: int) -> float:
    """
    - Récupère l'angle de rotation dans le plan vertical du joueur 'id'

    Paramètres:
        - id (int): identifiant du joueur

    Renvoi:
        - float: angle dans le plan Oxy (-90° à 90°)
    """
    ids = recuperer_ids()
    if id in ids:
        s = conn.sendReceive("entity.getPitch", id)
        return float(s)
    else:
        print("Attention! Joueur inconnu, impossible de récupérer son inclinaison; valeur renvoyée: 0")
        return 0
def recuperer_ma_direction() ‑> tuple
  • Récupère le vecteur unitaire du cap du joueur

Renvoi

  • tuple: coordonnées (x, y, z)
Expand source code
def recuperer_ma_direction() -> tuple:
    """
    - Récupère le vecteur unitaire du cap du joueur

    Renvoi:
        - tuple: coordonnées (x, y, z)
    """
    s = conn.sendReceive("entity.getDirection", player)
    return tuple(map(float, s.split(",")))
def recuperer_ma_position() ‑> tuple
  • Récupère la position de la tuile sous le joueur

Renvoi

  • tuple: coordonnées (x, y, z)
Expand source code
def recuperer_ma_position() -> tuple:
    """
    - Récupère la position de la tuile sous le joueur

    Renvoi:
        - tuple: coordonnées (x, y, z)
    """
    s = conn.sendReceive("entity.getTile", player)
    return tuple(map(int, s.split(",")))
def recuperer_ma_rotation() ‑> float
  • Récupère l'angle de rotation dans le plan horizontal du joueur

Renvoi

  • float: angle dans le plan Oxz (0° à 360°)
Expand source code
def recuperer_ma_rotation() -> float:
    """
    - Récupère l'angle de rotation dans le plan horizontal du joueur 

    Renvoi:
        - float: angle dans le plan Oxz (0° à 360°)
    """
    s = conn.sendReceive("entity.getRotation", player)
    return float(s)
def recuperer_mon_inclinaison() ‑> float
  • Récupère l'angle de rotation dans le plan vertical du joueur

Renvoi

  • float: angle dans le plan Oxy (-90° à 90°)
Expand source code
def recuperer_mon_inclinaison() -> float:
    """
    - Récupère l'angle de rotation dans le plan vertical du joueur 

    Renvoi:
        - float: angle dans le plan Oxy (-90° à 90°)
    """
    s = conn.sendReceive("entity.getPitch", player)
    return float(s)
def recuperer_position(id: int) ‑> tuple
  • Récupère la position de la tuile sous le joueur 'id'

Paramètres

  • id (int): identifiant du joueur

Renvoi

  • tuple: coordonnées (x, y, z)
Expand source code
def recuperer_position(id: int) -> tuple:
    """
    - Récupère la position de la tuile sous le joueur 'id'

    Paramètres:
        - id (int): identifiant du joueur

    Renvoi:
        - tuple: coordonnées (x, y, z)
    """
    ids = recuperer_ids()
    if id in ids:
        s = conn.sendReceive("entity.getTile", id)
        return tuple(map(int, s.split(",")))
    else:
        print("Attention! Joueur inconnu, impossible de récupérer sa position; valeur renvoyée: (0, 0, 0)")
        return (0, 0, 0)
def recuperer_rotation(id: int) ‑> float
  • Récupère l'angle de rotation dans le plan horizontal du joueur 'id'

Paramètres

  • id (int): identifiant du joueur

Renvoi

  • float: angle dans le plan Oxz (0° à 360°)
Expand source code
def recuperer_rotation(id: int) -> float:
    """
    - Récupère l'angle de rotation dans le plan horizontal du joueur 'id'

    Paramètres:
        - id (int): identifiant du joueur

    Renvoi:
        - float: angle dans le plan Oxz (0° à 360°)
    """
    ids = recuperer_ids()
    if id in ids:
        s = conn.sendReceive("entity.getRotation", id)
        return float(s)
    else:
        print("Attention! Joueur inconnu, impossible de récupérer sa rotation; valeur renvoyée: 0")
        return 0
def restaurer() ‑> None
  • Restaure l'état du jeu au moment de la sauvegarde d'un point de contrôle
Expand source code
def restaurer() -> None:
    """
    - Restaure l'état du jeu au moment de la sauvegarde d'un point de contrôle
    """
    conn.send("world.checkpoint.restore")
def sauvegarder() ‑> None
  • Sauvegarde un point de contrôle qui peut être utilisé pour restaurer un état du jeu
Expand source code
def sauvegarder() -> None:
    """
    - Sauvegarde un point de contrôle qui peut être utilisé pour restaurer un état du jeu
    """
    conn.send("world.checkpoint.save")

Blocs

Liste des blocs existants (fichier json)