Com programar Minecraft amb Python

De les proves que havia fet fins ara per intentar programar amb Python sobre el Minecraft al nostre institut, on tenim Linux sense permísos per instal.ar programari, les coses que no han funcionat són:


Ha fallat: Minecraft Pi amb VirtualBox

Per la Raspberry Pi existeix una versió antiga, gratuïta i especial de Minecraft, anomenada Minecraft Pi, que permet programar molt fàcilment sobre Minecraft amb Python.

He intentat descarregar la distribució Raspbian per Raspberry PI, però en una versió especial per PC, de l’adreça https://www.raspberrypi.org/downloads/raspberry-pi-desktop/, i executar-la sobre el nostre VirtualBox, però llavors he trobat que la distribució Raspbian per PC no ve amb l'aplicació Minecraft Pi.


Ha fallat: Minecraft per Windows amb la nostra versió de VirtualBox

El programari Minecraft es pot descarregar lliurement a la seva web, però cal pagar per un compte d'usuari per poder jugar. No he trobat una versió d'avaluació, així que per fer proves a classe he acabat buscant una versió pirata.

La versió pirata fàcil de trobar és per la plataforma Windows, però llavors al nostre institut, on treballem amb Linux, l'hauríem d'executar sobre una màquina virtual Windows. Tanmateix, la versió de VirtualBox del nostre institut no proporciona l'acceleració gràfica necessària per executar Minecraft per Windows sobre una màquina virtual.

La versió educativa de Minecraft tampoc té versió nativa per Linux, i la seva versió per Windows tampoc funciona sobre el nostre VirtualBox.


Ha funcionat: Minecraft per Linux + servidor Spigot + plugin RaspberryJuice + llibreries mcpi

Ho podrem deixar tot a la carpeta "dades". No cal instal·lar res. Tant Minecraft com el servidor Spigot s'executen sobre Java.

Per executar codi Python a Minecraft hem d'instal·lar un servidor de Minecraft, com Spigot o Paper, que contingui el plugin RaspberryJuice. Llavors quan l'usuari llenci el joc Minecraft ha d'escollir joc multijugador, i escriure la IP de l'ordinador on s'executa Spigot.

Els passos són:

  1. Descarrega el servidor de Spigot adient de l'adreça:

    https://getbukkit.org/download/spigot

    Spigot en executar-se generarà molts fitxers. Millor que el tinguis en una carpeta per ell sol.

  2. Descarrega RaspberryJuice de l'adreça:

    https://www.spigotmc.org/resources/raspberryjuice.22724/

    Crea una carpeta anomenada plugins dintre de la carpeta on tinguis el servidor Spigot, i posa aquest fitxer raspberryjuice-1.12.1.jar dintre d'aquesta carpeta "plugins"

  3. Executa el servidor escrivint al terminal: java -jar spigot-1.16.3.jar

    Aquesta primera execució crearà un fitxer "eula.txt" que et demanarà modificar. Canvia a "eula.txt" on diu eula=false per eula=true

    Si el Minecraft era pirata, canvia també al fitxer "server.properties" d'Spigot, on diu online-mode=true per online-mode=false

    Si vols treballar en mode "creatiu" enlloc de mode "supervivència", canvia també al fitxer "server.properties" d'Spigot, on diu gamemode=survival per gamemode=creative

    Executa de nou el servidor escrivint al terminal: java -jar spigot-1.16.3.jar

  4. Descarrega Minecraft 1.16.3 pirata per Linux de l'adreça:

    https://btdb.eu/search/minecraft%20linux/0/

    Descomprimeix Minecraft 1.16.3 i executa el joc Minecraft. Selecciona menú "Multiplayer". Al submenú "Direct Connect" escriu 127.0.0.1 o localhost , per jugar dins el teu propi servidor Spigot

    Ara que estàs a una partida de Minecraft hauràs de prèmer simultàniament les tecles F3 + P per tal que cada vegada que deixis la finestra de Minecraft, aquesta no aturi el joc.

  5. A la carpeta on vulguis guardar el teu programa Python, descarrega les llibreries per Minecraft de la següent adreça:

    https://github.com/martinohanlon/mcpi

    La carpeta mcpi ha d'estar disponible on escrius el programa

  6. Comença els teus programes amb una línia import mcpi i fes servir les funcions de la llibreria:

    http://www.stuffaboutcode.com/p/minecraft-api-reference.html

    Aquí hi ha un llibre gratuït amb programes per fer proves:

    https://magpi.raspberrypi.org/books/essentials-minecraft-v1/pdf


Ha funcionat a casa: paquets Minetest i PyCraft per Linux des dels repositoris

Cal instal·lar programari, i no tenim permisos, però a casa m'ha funcionat bé Minetest amb el mòdul Pycraft, que és una opció gratuïta i també més senzilla que Minecraft amb RaspberryJuice.

Aquí deixo la recepta. Ho he fet sobre Debian Testing, però estic segur que els paquets estan disponibles als repositoris de les últimes Ubuntu.

Minetest és un clon de Minecraft, escrit en el llenguatge de programació Lua. Pycraft és l'adaptació per Minetest del mòdul RaspberryJuice. Tot el que hem programat per Minecraft + RaspberryJuice hauria de funcionar a Minetest + Pycraft.

Els passos són:

  1. Instal·la els paquets dels repositoris:

    sudo apt install minetest minetest-mod-pycraft python3-minecraftpi
  2. Arrenca Minetest. Selecciona la casella "mode creatiu" i desselecciona la casella "permetre danys"

    Fes clic a "Nou". Un cop creat el nou joc, abans d'executar-lo clica "Configurar".

    A "Configurar" selecciona el mòdul "pycraft" i fes clic a la casella "Activat". Guarda canvis.

    A la pestanya "Configuració" clica el botó "All Settings". Clica la casella "Mostra els noms tècnics". Busca "secur" i t'apareixerà "secure.enable_security" , que hauràs de donar-li el valor "Desactivat" fent doble clic sobre ell.

    (Hagués estat millor no tocar l'opció secure.enable_security, i en canvi donar el valor pycraft a l'opció secure.trusted_mods, però a mi no m'ha funcionat).

    Prem la tecla ESC, torna a la pestanya "Start Game" i clica el botó "Jugar Joc".

    Els canvis han quedat guardats (joc creat, mòdul pycraft activat, i seguretat dels mòduls inhabilitada) i no caldrà que els proper cops que vulguis obrir el joc repeteixis tots els passos anteriors.


API i REFERÈNCIES


API: FUNCIONS


API: BLOCS


TECLAT


EXEMPLES

from mcpi.minecraft import Minecraft
from mcpi import block
from time import sleep

# inicialitza
mc = Minecraft.create()

# Diu alguna cosa
mc.postToChat('Hola mon!')

# Obté el tipus del bloc sota del personatge
x, y, z = mc.player.getPos()
mc.postToChat('El bloc sota teu és ' + str(mc.getBlock(x, y-1, z)))

# Obté les coordenades del personatge i teletransportal amunt
x, y, z = mc.player.getPos()
mc.postToChat('Teletransportat en un segon amunt a y=' + str(y+100))
sleep(1)
mc.player.setPos(x, y+100, z)

# Posa un bloc de aire sota el personatge i
# blocs de lava, aigua i pedra al voltant cada 3 segons
x, y, z = mc.player.getPos()
sleep(3)
mc.setBlock(x, y, z+3, block.LAVA.id)
mc.postToChat('Fuego es mi espiritu')
sleep(3)
mc.setBlock(x+3, y, z, block.WATER.id)
mc.postToChat('Agua es mi sangre')
sleep(3)
mc.setBlock(x-3, y, z, block.STONE.id)
mc.postToChat('Tierra es mi cuerpo')
sleep(3)
mc.setBlock(x, y-1, z, block.AIR.id)
mc.postToChat('Aire es mi aliento')

# Posa una torre de blocs d'explosius amb una iteració
mc.postToChat('Aquesta torre és la bomba')
i = 1
while i <= 100:
    mc.setBlock(x, y+i, z+5, block.TNT.id, 1)
    i = i + 1
    sleep(0.1)

# Posa una piscina (blocs de pedra amb aigua dintre)
mc.postToChat('En un segon estaràs a una piscina')
sleep(1)
mc.setBlocks(x-2, y, z-2, x+2, y-2, z+2, block.STONE.id)
mc.setBlocks(x-1, y, z-1, x+1, y-1, z+1, block.WATER.id)

# Fes una casa (blocs de fusta amb aire dintre i una porta)
# ...

# Posa una piràmide de diamants amb una iteració
mc.postToChat('Ara construeixo una piràmide')
h = 5
z = z + 2*h
i = 0
while i < h:
    mc.setBlocks(x-h+i, y+i, z-h+i, x+h-i, y+i, z+h-i, block.DIAMOND_BLOCK.id)
    i = i + 1
    sleep(0.1)

# Dibuixa una corona al cel
from math import sin, cos, pi
mc.postToChat('Ara dibuixo una corona de colors al cel')
a = 0
R = 100
h = 20
b = 5
i = 0.01
color = 0
x, y, z = mc.player.getPos()
while a < 2*pi:
    mc.setBlock(x + R*cos(a), y + 50 + h*cos(a*b), z + R*sin(a), block.WOOL.id, color)
    a = a + i
    color = (color + 1) % 16

# Quan el personatge camina, fes créixer flors a l'herba trepitjada
while True:
    x, y, z = mc.player.getPos()
    if mc.getBlock(x, y-1, z) == block.GRASS.id:
        mc.setBlock(x, y, z, block.FLOWER_CYAN.id)
    sleep(0.1)

Last updated