We are running an intro to programming event in a few weeks and wanted to demo some building stuff with Minecraft on the raspberry pi without having to hard code buildings into the source code. This is a super quick and dirty script we can run to parse a text file, line by line and do run several commands:
- create a single block of material at a given location using setBlock
- create a multi block of material at a given location using setBlocks
- move the player to a suitable vantage point
Each line of the file starts with the command word, followed by some optional parameters and the script just works through each command in realtime in minecraft.
I came up with some other desirable features - for authoring lines starting with a hash (#) are comments - for debugging and demonstration I added a message command, to output to the chat window, and a wait to space out the building work so that the pi cpu doesn’t get too hot.
Here’s the script:
import time import mcpi.minecraft as minecraft world = minecraft.Minecraft.create() with open("build.txt") as file: for line in file: chunks = line.split() if chunks: command = chunks if command.startswith('#'): print('Comment -> ' + line) elif command == 'message': startindex = len('message') #print(line[startindex:]) world.postToChat(line[startindex:]) elif command == 'goto': x = int(chunks) z = int(chunks) y = world.getHeight(x, z) #print('moving to ' + x + ' ' + z) world.player.setTilePos(x, y, z) elif command == 'block': material = int(chunks) x = int(chunks) y = int(chunks) z = int(chunks) world.setBlock(x, y, z, material) elif command == 'blocks': material = int(chunks) x1 = int(chunks) y1 = int(chunks) z1 = int(chunks) x2 = int(chunks) y2 = int(chunks) z2 = int(chunks) # print('multiple block from ' + x1 + ' ' + y1 + ' ' + z1 + ' to ' + x2 + ' ' + y2 + ' ' + z2) world.setBlocks(x1, y1, z1, x2, y2, z2, material) elif command == 'wait': delay = int(chunks) time.sleep(delay)
and an example script to flatten the ground, lay down some earth and grass prior to building:
goto 0 0 # Clear some space by filling area with 'air' blocks 0 -20 -20 -20 20 20 20 wait 10 # layer of dirt blocks 3 -20 -1 -20 20 0 20 wait 10 # layer of grass blocks 2 -20 1 -20 20 1 20 wait 10 message done