Python+Minecraft

How to Run Python Script with minecraft 

  • Open Minecraft : ./minecraft-pi
  • Open Terminal and Go to ~/Python_Minecraft
  • Run Python Script : python <script name>.py

install

  • HOME PAGE : http://pi.minecraft.net
  • wget https://s3.amazonaws.com/assets.minecraft.net/pi/minecraft-pi-0.1.1.tar.gz
  • To decompress it: tar -zxvf minecraft-pi-0.1.1.tar.gz
  • To run it: cd mcpi
  • Followed by ./minecraft-pi
  • https://minecraft.net/
  • Create Desktop Icon (Minecraft.desktop on XScreen)
    • [Desktop Entry]
      Name=Minecraft Pi Edition
      Comment=Launch Minecraft Pi Edition!
      Exec=sh -c 'cd ~/mcpi && lxterminal -l -t Minecraft -e ./minecraft-pi'
      Icon=/home/pi/mcpi/minecraft.png
      Terminal=false
      Type=Application
      Categories=Application;Games;
      StartupNotify=true
    • Using Minecraft : This isn’t the place to give an extensive guide to using Minecraft but I thought I would present some basics to get you moving around the environment.
      ESC  Pause/Menu
      W    Move forward
      A    Move left
      S    Move backwards
      D    Move right
      E    Show inventory of blocks
      1-8  Select items in the quick-bar
      
      Left mouse  Destroy blocks
      Right mouse Place blocks
      
      Space  Jump (ascend in fly-mode)
      Shift  Sneak (descend in fly-mode)

      The mouse can be used to change your point-of-view. The scroll wheel can be used to scroll through the items, the left mouse button being used to select a block. When viewing the inventory you can use the WASD keys to move the selection using the Enter key to select a block.

      Double-tapping the Space bar will activate and deactivate fly-mode.

      You can exit Minecraft by clicking the [x] in the top right hand corner of the game window

API Reference

This is a reference of Minecraft: Pi Edition's: Python API Library.

If you want to know more about how to use the API, including tutorials, see my projects and download code, visit my minecraft page.

Structure

  • minecraft.py
    • Class Minecraft - main class for connecting and interacting with the game
      • Class camera - changing camera angle and postion
      • Class player - getting and changing the players position and settings
      • Class events - retreiving events which have occured in the game
  • block.py
    • Class Block - definition of a block, specifically its type
  • event.py
    • Class BlockEvent - definition of a block event, specifically what event, what block and what player
  • vec3.py
    • Class Vec3 - generic class for managing a 3 dimension vector (i.e. x,y,z)
  • connection.py - internal module used by the api
  • util.py - internal module used by the api

Minecraft

"Main class for interacting with the Minecraft world, includes functions for creating a connection, modifying players and blocks and capturing events"

.create(address = "localhost", port = 4711)
"Create connection to Minecraft (address, port) => Minecraft object"

#use default address and port
mc = minecraft.Minecraft.create()
#specify ip address and port
mc = minecraft.Minecraft.create("192.168.1.1", 4711)

.getBlock(x,y,z)
"Get block (x,y,z) => id:int"

#retrieves the block type for the block at 0,0,0
blockType = mc.getBlock(0,0,0)

.getBlocks(x0,y0,z0,x1,y1,z1)
"Get a cuboid of blocks (x0,y0,z0,x1,y1,z1) => [id:int]"

Not implemented in the API

.getBlockWithData(x,y,z)
"Get block with data (x,y,z) => Block"

#retrieves a block object for the block at 0,0,0
blockObj = mc.getBlockWithData(0,0,0)

.setBlock(x,y,z)
"Set block (x,y,z,id,[data])"

#sets a block at an x, y, z co-ordinate to a particular type
mc.setBlock(0,0,0,block.DIRT.id)
#sets a block to a particular type and 'subtype'
mc.setblock(0,0,0,block.WOOD.id, 1)

.setBlocks(x0,y0,z0,x1,y1,z1,blockType, blockData)
"Set a cuboid of blocks (x0,y0,z0,x1,y1,z1,id,[data])"

#sets many blocks at a time, filling the gap between 2 sets of x, y, z co-ordinates
mc.setBlocks(-1, -1, -1, 1, 1, 1, block.STONE.id)

.getHeight(x,z)
"Get the height of the world (x,z) => int"

#find the y (vertical) of an x, z co-ordinate which represents the 'highest' (non-air) block
y = mc.getHeight(0,0)

.getPlayerEntityIds()
"Get the entity ids of the connected players => [id:int]"

#get the entity id's of the players connected to the game
entityIds = mc.getPlayerEntityIds()
for entityId in entityIds
    print entityId

.saveCheckpoint()
"Save a checkpoint that can be used for restoring the world"

mc.saveCheckpoint()

.restoreCheckpoint()
"Restore the world state to the checkpoint"

mc.restoreCheckpoint()

.postToChat(message)
"Post a message to the game chat"

#write 'Hello Minecraft World' to the chat window
mc.postToChat("Hello Minecraft World")

.setting(setting, status)
"Set a world setting (setting, status). keys: world_immutable, nametags_visible"

#change world immutable to True
mc.setting("world_immutable", True)
#change nametags_visible setting to False
mc.setting("nametags_visible", False)

Minecraft.player

.getPos()
"Gets the player's position in the world as a Vec3 of floats (decimal numbers), if the player is in the middle of a block x.5 is returned"

#get players position as floats
playerPos = mc.player.getPos()

.setPos()
"Moves the player to a position in the world by passing co-ordinates ([x,y,z])"

#set the players position as floats
mc.player.setPos(0.0,0.0,0.0)

.getTilePos()
"Gets the position of the 'tile' the player is currently on."

#get the position of the tile the players is on
playerTile = mc.player.getTilePos()

.setTilePos()
"Move the player to a tile position in the world by passing co-ordinates ([x,y,z])"

#set the position of the tile the player is on
mc.player.setTilePos(0,0,0)

Minecraft.camera

.setNormal(entityId)
"Set camera mode to normal Minecraft view ([entityId])"

#set camera mode to normal for a specific player
mc.camera.setNormal(entityId)

.setFixed()
"Set camera mode to fixed view"

#set camera mode to fixed 
mc.camera.setFixed()

.setFollow(entityId)
"Set camera mode to follow an entity ([entityId])"

#set camera mode to follow for a specific player
mc.camera.setFollow(entityId)

.setPos(x,y,z)
"Set camera entity position (x,y,z)"

#set camera position to a specific position of x, y, z
mc.camera.setPos(0,0,0)

Minecraft.events

.pollBlockHits()
"Block Hits (Only triggered by sword) => [BlockEvent]"

#get block event hits that have occured since the last time the function was run
blockEvents = mc.events.pollBlockHits()
for blockEvent in blockEvents
    print blockEvent

.clearAll()
"Clear all old events"

#clear all events that have happened since the events where last got
mc.events.clearAll()

Block

"The definition of a Block in Minecraft, used to describe a block type and (if applicable) its data; also contains constants for the blocks type id's, e.g. BLOCK.AIR.id"

#create block of a specific type
blockObj = block.Block(id)
#create a block of a specific type and apply a data value
blockObj = block.Block(id, data)

.id
"The id (or type) of block"

Block id constants:
AIR                 = Block(0)
STONE               = Block(1)
GRASS               = Block(2)
DIRT                = Block(3)
COBBLESTONE         = Block(4)
WOOD_PLANKS         = Block(5)
SAPLING             = Block(6)
BEDROCK             = Block(7)
WATER_FLOWING       = Block(8)
WATER               = WATER_FLOWING
WATER_STATIONARY    = Block(9)
LAVA_FLOWING        = Block(10)
LAVA                = LAVA_FLOWING
LAVA_STATIONARY     = Block(11)
SAND                = Block(12)
GRAVEL              = Block(13)
GOLD_ORE            = Block(14)
IRON_ORE            = Block(15)
COAL_ORE            = Block(16)
WOOD                = Block(17)
LEAVES              = Block(18)
GLASS               = Block(20)
LAPIS_LAZULI_ORE    = Block(21)
LAPIS_LAZULI_BLOCK  = Block(22)
SANDSTONE           = Block(24)
BED                 = Block(26)
COBWEB              = Block(30)
GRASS_TALL          = Block(31)
WOOL                = Block(35)
FLOWER_YELLOW       = Block(37)
FLOWER_CYAN         = Block(38)
MUSHROOM_BROWN      = Block(39)
MUSHROOM_RED        = Block(40)
GOLD_BLOCK          = Block(41)
IRON_BLOCK          = Block(42)
STONE_SLAB_DOUBLE   = Block(43)
STONE_SLAB          = Block(44)
BRICK_BLOCK         = Block(45)
TNT                 = Block(46)
BOOKSHELF           = Block(47)
MOSS_STONE          = Block(48)
OBSIDIAN            = Block(49)
TORCH               = Block(50)
FIRE                = Block(51)
STAIRS_WOOD         = Block(53)
CHEST               = Block(54)
DIAMOND_ORE         = Block(56)
DIAMOND_BLOCK       = Block(57)
CRAFTING_TABLE      = Block(58)
FARMLAND            = Block(60)
FURNACE_INACTIVE    = Block(61)
FURNACE_ACTIVE      = Block(62)
DOOR_WOOD           = Block(64)
LADDER              = Block(65)
STAIRS_COBBLESTONE  = Block(67)
DOOR_IRON           = Block(71)
REDSTONE_ORE        = Block(73)
SNOW                = Block(78)
ICE                 = Block(79)
SNOW_BLOCK          = Block(80)
CACTUS              = Block(81)
CLAY                = Block(82)
SUGAR_CANE          = Block(83)
FENCE               = Block(85)
GLOWSTONE_BLOCK     = Block(89)
BEDROCK_INVISIBLE   = Block(95)
STONE_BRICK         = Block(98)
GLASS_PANE          = Block(102)
MELON               = Block(103)
FENCE_GATE          = Block(107)
GLOWING_OBSIDIAN    = Block(246)
NETHER_REACTOR_CORE = Block(247)

.data
"The data (or sub-type) of a block"

WOOL data values (colours):
0: White
1: Orange
2: Magenta
3: Light Blue
4: Yellow
5: Lime
6: Pink
7: Grey
8: Light grey
9: Cyan
10: Purple
11: Blue
12: Brown
13: Green
14: Red
15:Black

Wood data values:
0: Oak
1: Spruce
2: Birch
3: ....
[needs completing]

TORCH data values:
1: Pointing east
2: Pointing west
3: Pointing south
4: Pointing north
5: Standing on the floor
6: Standing in ground

LEAVES data values:
0: Oak leaves
1: Spruce leaves
2: Birch leaves

BlockEvent

"The definition of a BlockEvent in minecraft, used to describe an event in minecraft affecting blocks; returned by the Minecraft.events.pollBlockHits() method."

blockEvent = mc.events.pollBlockHits()

.type
"Type of block event; there is only 1 event currently implemented BlockEvent.HIT"

blockEventType = blockEvent.type

BlockEvent types:
0: BlockEvent.HIT

.pos
"The position of the block where the event occured, i.e. the block which was hit.  .pos returns a Vec3 object of x,y,z co-ordinates"

blockEventPos = BlockEvent.pos

.face
"The face of the block where the event occured"

blockEventFace = BlockEvent.face

.entityId
"entityId of the player who caused the block event, i.e. the player who hit the block"

blockEventPlayer - BlockEvent.entityId

Vec3

"The definition of a 3 part vector in Minecraft, i.e. a set of x, y, z co-ordinates; x and z are the horizontal positions, y the vertical"

position = vec3.Vec(0,0,0)

.x
"x position"

xPos = position.x
.y
"y position"

yPos = position.y
.z
"z position"

zPos = position.z

Problem and Solution

Control Minecraft by Scratch :
  • Open Minecraft 
  • Open ScratchMCPI
  • if open New Scartch File then it have to open the Scratch2MCPL terminal Again