Blocks into bombs using events

Here is a very cool script again by the amazing author Martin O’Hanlon, you can right click block and have it explode like TNT in Minecraft.

Here is the code:

</pre>
#www.stuffaboutcode.com
#Raspberry Pi, Minecraft Bombs - Turn any block into a bomb!

#import the minecraft.py module from the minecraft directory
import minecraft.minecraft as minecraft
#import minecraft block module
import minecraft.block as block
#import time, so delays can be used
import time
#import threading, so threads can be used
import threading

class ExplodingBlock(threading.Thread):

def __init__(self, pos, fuseInSecs, blastRadius):
 #Setup object
 threading.Thread.__init__(self)
 self.pos = pos
 self.fuseInSecs = fuseInSecs
 self.blastRadius = blastRadius

def run(self):
 #Open connect to minecraft
 mc = minecraft.Minecraft.create()

#Get values
 pos = self.pos
 blastRadius = self.blastRadius

#Explode the block!
 # get block type
 blockType = mc.getBlock(pos.x, pos.y, pos.z)
 # flash the block
 for fuse in range(0, self.fuseInSecs):
 mc.setBlock(pos.x, pos.y, pos.z, block.AIR)
 time.sleep(0.5)
 mc.setBlock(pos.x, pos.y, pos.z, blockType)
 time.sleep(0.5)
 # create sphere of air
 for x in range(blastRadius*-1,blastRadius):
 for y in range(blastRadius*-1, blastRadius):
 for z in range(blastRadius*-1,blastRadius):
 if x**2 + y**2 + z**2 < blastRadius**2:
 mc.setBlock(pos.x + x, pos.y + y, pos.z + z, block.AIR)

if __name__ == "__main__":

time.sleep(5)
 #Connect to minecraft by creating the minecraft object
 # - minecraft needs to be running and in a game
 mc = minecraft.Minecraft.create()

#Post a message to the minecraft chat window
 mc.postToChat("Minecraft Bombs, Hit (Right Click) a Block, www.stuffaboutcode.com")

#loop until Ctrl C
 try:
 while True:
 #Get the block hit events
 blockHits = mc.events.pollBlockHits()
 # if a block has been hit
 if blockHits:
 # for each block that has been hit
 for blockHit in blockHits:
 #Create and run the exploding block class in its own thread
 # pass the position of the block, fuse time in seconds and blast radius
 # threads are used so multiple exploding blocks can be created
 explodingBlock = ExplodingBlock(blockHit.pos, 3, 3)
 explodingBlock.daemon
 explodingBlock.start()
 time.sleep(0.1)
 except KeyboardInterrupt:
 print("stopped")
<pre>

It’s also on the github

Source: Here

Minecraft Cannon

Hey back, I would like to show you guys a new script i found out there it allows you to play the classic game Snake by Martin O’Hanlon.

2014-01-19_12.56.112014-01-19_12.56.56

Here is a video i found on the page

Code:

</pre>
#www.stuffaboutcode.com
#Raspberry Pi, Minecraft Snake

#import the minecraft.py module from the minecraft directory
import minecraft.minecraft as minecraft
#import minecraft block module
import minecraft.block as block
#import time, so delays can be used
import time
#import random module to create random number
import random

#snake class which controls the whole game
class Snake:
 def __init__(self, mc, startVec3, playingBottomLeft, playingTopRight):
 self.mc = mc
 self.direction = "up"
 self.lenght = 5
 self.tail = []
 self.tail.insert(0, startVec3)
 self.playingBottomLeft = playingBottomLeft
 self.playingTopRight = playingTopRight
 self.createApple()
 self.score = 0

#draw's the whole snake
 def draw(self):
 for segment in self.tail:
 self.mc.setBlock(segment.x, segment.y, segment.z, block.DIAMOND_BLOCK)

#add's one segment to the snake
 def addSegment(self, segment):
 self.mc.setBlock(segment.x, segment.y, segment.z, block.DIAMOND_BLOCK)
 self.tail.insert(0, segment)
 #do I need to clear the last segment
 if (len(self.tail) > self.lenght):
 lastSegment = self.tail[len(self.tail)-1]
 self.mc.setBlock(lastSegment.x, lastSegment.y, lastSegment.z, block.AIR)
 #pop the last segment off the tail
 self.tail.pop()

#moves the snake, if it cant it returns false (i.e. game over)
 def move(self):
 newSegment = minecraft.Vec3(self.tail[0].x, self.tail[0].y, self.tail[0].z)
 if self.direction == "up":
 newSegment.y = newSegment.y + 1
 elif self.direction == "down":
 newSegment.y = newSegment.y - 1
 elif self.direction == "left":
 newSegment.x = newSegment.x - 1
 elif self.direction == "right":
 newSegment.x = newSegment.x + 1
 if (self.checkCollision(newSegment) == False):
 self.addSegment(newSegment)
 #have I eaten the apple?
 if (matchVec3(newSegment, self.apple) == True):
 #increase my lenght
 self.lenght = self.lenght + 2
 #increase my score
 self.score = self.score + 10
 #create a new apple
 self.createApple()
 return True
 else:
 #game over
 #flash snake head
 mc.setBlock(self.tail[0].x, self.tail[0].y, self.tail[0].z, block.AIR)
 time.sleep(0.3)
 mc.setBlock(self.tail[0].x, self.tail[0].y, self.tail[0].z, block.DIAMOND_BLOCK)
 time.sleep(0.3)
 mc.setBlock(self.tail[0].x, self.tail[0].y, self.tail[0].z, block.AIR)
 time.sleep(0.3)
 mc.setBlock(self.tail[0].x, self.tail[0].y, self.tail[0].z, block.DIAMOND_BLOCK)
 time.sleep(0.3)
 #show score
 mc.postToChat("Game over - score = " + str(self.score))
 time.sleep(5)
 mc.postToChat("www.stuffaboutcode.com")
 return False

#function to check if a new segment (or apple) can go there
 def checkCollision(self, newSegment):
 #am I going the boundary
 if ((newSegment.x == playingBottomLeft.x) or (newSegment.y == playingBottomLeft.y) or (newSegment.x == playingTopRight.x) or (newSegment.y == playingTopRight.y)):
 return True
 else:
 #or my own tail
 hitTail = False
 for segment in self.tail:
 if (matchVec3(segment, newSegment) == True):
 hitTail = True
 return hitTail

#function to change the snake's direction
 def changeDirection(self, newDirection):
 #code to make sure user doesnt try and make the snake move back on itself
 if (newDirection == "up"):
 if (self.direction != "down"): self.direction = newDirection
 elif (newDirection == "down"):
 if (self.direction != "up"): self.direction = newDirection
 elif (newDirection == "left"):
 if (self.direction != "right"): self.direction = newDirection
 elif (newDirection == "right"):
 if (self.direction != "left"): self.direction = newDirection

#create the apple at a random position on the board
 def createApple(self):
 badApple = True
 #loop until an apple is created which doesnt collide with the boundary or the snake
 while (badApple == True):
 x = random.randrange(playingBottomLeft.x, playingTopRight.x)
 y = random.randrange(playingBottomLeft.y, playingTopRight.y)
 z = playingBottomLeft.z
 newApple = minecraft.Vec3(x, y, z)
 badApple = self.checkCollision(newApple)
 self.apple = newApple
 self.mc.setBlock(self.apple.x, self.apple.y, self.apple.z, block.GLOWING_OBSIDIAN)

#Compares vec3 objects, if they are the same returns true
def matchVec3(vec1, vec2):
 if ((vec1.x == vec2.x) and (vec1.y == vec2.y) and (vec1.z == vec2.z)):
 return True
 else:
 return False

#draws a vertical outline
def drawVerticalOutline(mc, x0, y0, x1, y1, z, blockType, blockData=0):
 mc.setBlocks(x0, y0, z, x0, y1, z, blockType, blockData)
 mc.setBlocks(x0, y1, z, x1, y1, z, blockType, blockData)
 mc.setBlocks(x1, y1, z, x1, y0, z, blockType, blockData)
 mc.setBlocks(x1, y0, z, x0, y0, z, blockType, blockData)

#main program
if __name__ == "__main__":

#constants
 screenBottomLeft = minecraft.Vec3(-10,4,15)
 screenTopRight = minecraft.Vec3(10,24,15)
 playingBottomLeft = minecraft.Vec3(-10, 4, 14)
 playingTopRight = minecraft.Vec3(10, 24, 14)
 snakeStart = minecraft.Vec3(0, 5, 14)
 upControl = minecraft.Vec3(0, -1, 1)
 downControl = minecraft.Vec3(0, -1, -1)
 leftControl = minecraft.Vec3(-1, -1, 0)
 rightControl = minecraft.Vec3(1, -1, 0)
 middleControl = minecraft.Vec3(0, 0, 0)

 #Connect to minecraft by creating the minecraft object
 # - minecraft needs to be running and in a game
 mc = minecraft.Minecraft.create()

#Post a message to the minecraft chat window
 mc.postToChat("Hi, Minecraft Snake, www.stuffaboutcode.com")

 #Build game board
 # clear a suitably large area
 mc.setBlocks(-10, 0, -5, 10, 25, 16, block.AIR)
 # create playing board
 mc.setBlocks(screenBottomLeft.x, screenBottomLeft.y, screenBottomLeft.z, screenTopRight.x, screenTopRight.y, screenTopRight.z, block.STONE)
 drawVerticalOutline(mc, playingBottomLeft.x, playingBottomLeft.y, playingTopRight.x, playingTopRight.y, playingTopRight.z, block.OBSIDIAN)

 # create control buttons
 mc.setBlock(upControl.x, upControl.y, upControl.z, block.DIAMOND_BLOCK)
 mc.setBlock(downControl.x, downControl.y, downControl.z, block.DIAMOND_BLOCK)
 mc.setBlock(leftControl.x, leftControl.y, leftControl.z, block.DIAMOND_BLOCK)
 mc.setBlock(rightControl.x, rightControl.y, rightControl.z, block.DIAMOND_BLOCK)
 # blocks around control buttons, to stop player moving off buttons
 mc.setBlock(middleControl.x + 2,middleControl.y + 1,middleControl.z, block.GLASS)
 mc.setBlock(middleControl.x - 2,middleControl.y + 1,middleControl.z, block.GLASS)
 mc.setBlock(middleControl.x,middleControl.y + 1,middleControl.z + 2, block.GLASS)
 mc.setBlock(middleControl.x,middleControl.y + 1,middleControl.z - 2, block.GLASS)
 mc.setBlock(middleControl.x - 1,middleControl.y + 1,middleControl.z - 1, block.GLASS)
 mc.setBlock(middleControl.x - 1,middleControl.y + 1,middleControl.z + 1, block.GLASS)
 mc.setBlock(middleControl.x + 1,middleControl.y + 1,middleControl.z + 1, block.GLASS)
 mc.setBlock(middleControl.x + 1,middleControl.y + 1,middleControl.z - 1, block.GLASS)
 mc.setBlock(middleControl.x,middleControl.y - 1,middleControl.z, block.STONE)
 # put player in the middle of the control
 mc.player.setPos(middleControl.x + 0.5,middleControl.y,middleControl.z + 0,5)

#time for minecraft to catchup
 time.sleep(3)

mc.postToChat("Walk forward, backward, left, right to control the snake")
 time.sleep(3)

#create snake
 snake = Snake(mc, snakeStart, playingBottomLeft, playingTopRight)
 snake.draw()

playing = True

 try:
 #loop until game over
 while playing == True:
 #sleep otherwise the snake moves WAY too fast
 time.sleep(0.3)
 #get players position - are they on a control tile, if so change snake's direction
 playerTilePos = mc.player.getTilePos()
 playerTilePos.y = playerTilePos.y - 1
 if matchVec3(playerTilePos, upControl) == True: snake.changeDirection("up")
 elif matchVec3(playerTilePos, downControl) == True: snake.changeDirection("down")
 elif matchVec3(playerTilePos, leftControl) == True: snake.changeDirection("left")
 elif matchVec3(playerTilePos, rightControl) == True: snake.changeDirection("right")
 #move the snake
 playing = snake.move()
 except KeyboardInterrupt:
 print "stopped"
<pre>

Note! I changed the glowing obsidian aka ‘The Snakes food’ to a gold blocks because i was testing it on raspberry juice

Here is a link to the original thread!

It’s also on the github @ http://github.com/brooksc/mcpipy/

Going to minecon?

Hi all, this is Brooks. Sorry we’ve been absent for a while, but I wanted to drop a note that Phillip and I will be at minecon this weekend.

If you are going and you’d like to meet up, please drop an email to mcpipy at mcpipy.com!

Update: Sorry, our email is mcpipy at mcpipy.com, I don’t think we have the gmail account :(

jjinux’s Sierpinske Triangle Script

Hi it’s Phillip and I’m back updating the site – here is our first script to highlight!

Jjinux has submitted his script to our github code archive, thanks!

This script makes a Sierpinske Triangle in the sky made out of snow!!!

Here are some photos and a video to show you what it does:

jjinux's script pic jjinux's script pic

here’s a video of the script. Please Subscribe, Like, Comment or please do them all!! :)


Here’s the code:

</pre>
#!/usr/bin/env python




# mcpipy.com retrieved from URL below, written by jjinux
# http://jjinux.blogspot.com/2013/05/drawing-sierpinskis-triangle-in.html




"""Draw Sierpinski's triangle in Minecraft.




See: http://jjinux.blogspot.com/2013/05/drawing-sierpinskis-triangle-in.html




"""




import random




import mcpi.minecraft
import mcpi.block as block
import server




# It goes from -MAX_XZ to MAX_XZ.
MAX_XZ = 128
MAX_Y = 64




# These are the vertices of the triangle. It's a list of points. Each point
# is an (X, Y, X) tuple.
TRIANGLE_HEIGHT = MAX_Y - 1
TOP = (-MAX_XZ, TRIANGLE_HEIGHT, 0)
BOTTOM_LEFT = (MAX_XZ, TRIANGLE_HEIGHT, MAX_XZ)
BOTTOM_RIGHT = (MAX_XZ, TRIANGLE_HEIGHT, -MAX_XZ)
TRIANGLE_VERTICES = [TOP, BOTTOM_LEFT, BOTTOM_RIGHT]




BASE_BLOCK_ID = block.SANDSTONE.id
TRIANGLE_BLOCK_ID = block.SNOW.id




# This is the maximum number of iterations to let the algorithm run. The
# algorithm relies on randomness, so I'm just picking a sensible value.
MAX_ITERATIONS = MAX_XZ ** 2




PRINT_FREQ = 1000








def clear_board(minecraft):
    minecraft.setBlocks(-MAX_XZ, 0, -MAX_XZ, MAX_XZ, MAX_Y, MAX_XZ, 0)
    minecraft.setBlocks(-MAX_XZ, 0, -MAX_XZ, MAX_XZ, -MAX_Y, MAX_XZ, BASE_BLOCK_ID)








def draw_sierpinski_triangle(minecraft):




    def random_in_range():
        return random.randint(-MAX_XZ, MAX_XZ)




    def int_average(a, b):
        return int(round((a + b) / 2.0))




    # Draw the triangle vertices.




    for (x, y, z) in TRIANGLE_VERTICES:
        minecraft.setBlock(x, y, z, TRIANGLE_BLOCK_ID)




    # Pick a random point to start at.




    current = (random_in_range(),
               TRIANGLE_HEIGHT,
               random_in_range())




    for i in xrange(MAX_ITERATIONS):




        if i % PRINT_FREQ == 0:
            print("Drew %s blocks" % i)




        # Pick a random vertex to "walk" toward.




        destination = random.choice(TRIANGLE_VERTICES)




        # Draw a block in the middle of the current location and the
        # destination.




        (c_x, c_y, c_z) = current
        (d_x, d_y, d_z) = destination
        current = (
            int_average(c_x, d_x),
            TRIANGLE_HEIGHT,
            int_average(c_z, d_z)
        )
        (x, y, z) = current
        minecraft.setBlock(x, y, z, TRIANGLE_BLOCK_ID)








if __name__ == "__main__":
    minecraft = mcpi.minecraft.Minecraft.create(server.address)




    # Uncomment this if you need it.
    # clear_board(minecraft)
    
    draw_sierpinski_triangle(minecraft)

And the source is on our github as usual!! Source: Pull Request On Github

3 new scripts from goldfish – HelloWorld, clearZone and drawBuilding!

Ryan (goldfish) has submitted 3 new programs — and he has my many thanks for doing so by pushing his changed to the github repo and making them compatible with the other scripts!!

Here’s what he’s contributed:

gf_helloworld.py

This is a simple program that connects to the minecraft server and does a quick chat — this is a great template for starting new programs…

#! /usr/bin/python
import mcpi.minecraft as minecraft
import server

""" hello world test app

    @author: goldfish"""

mc = minecraft.Minecraft.create( server.address )
mc.postToChat("Hello, Minecraft!")

gf_clearZone.py

This one creates a 20×20 block and adds a stone floor.  Even better you can import it and call clearZone(x1,y1,x2,y2) to create a clear zone of the size you specify.

Screen Shot 2013-03-01 at 3.07.42 PM

#! /usr/bin/python
import mcpi.minecraft as minecraft
import mcpi.block as block
import server

""" clearZone clears an area and sets a stone floor
    takes two x,z pairs clears everything above 0y and then sets
    a stone floor at -1y
    @author: goldfish"""

def clearZone( alocx, alocz, blocx, blocz ):
    mc.setBlocks( alocx, 0, alocz, blocx, 64, blocz, block.AIR )
    mc.setBlocks( alocx, -1, alocz, blocx, -1, blocz, block.STONE )

if __name__ == "__main__":
    mc = minecraft.Minecraft.create( server.address )
    clearZone( -20, -20, 20, 20 )

gf_drawbuilding.py

This one creates a building with floors and windows in it — or you can call it again with your own parameters.  Call the following function..

drawBuilding( locx, locy, locz, floors, width, depth, floorheight, wallmaterial, floormaterial)

Screen Shot 2013-03-01 at 3.08.56 PM
Screen Shot 2013-03-01 at 3.09.20 PM
Screen Shot 2013-03-01 at 3.09.39 PM

#! /usr/bin/python
import mcpi.minecraft as minecraft
import mcpi.block as block
import server
import random

""" draw a building

    @author: goldfish"""

def drawBuilding( locx, locy, locz, floors, width, depth, floorheight, wallmaterial, floormaterial ):
    topx = locx+width
    topy = locy+((floorheight+1)*floors)
    topz = locz+depth
    #draw building shell
    mc.setBlocks( locx, locy, locz, topx, topy, topz, wallmaterial )
    mc.setBlocks( locx+1, locy+1, locz+1, topx-1, topy-1, topz-1, block.AIR )
    #draw floors
    if( floors > 1 ):
        for i in range( floors -1 ):
            floorYloc = locy+( (floorheight+1)*(i+1) )
            mc.setBlocks( locx+1, floorYloc, locz+1, topx-1, floorYloc, topz-1, floormaterial )
    #draw door
    doorloc = random.randint( 1, width-2 )
    mc.setBlock( locx, locy+1, locz+doorloc, block.AIR )
    mc.setBlock( locx, locy+2, locz+doorloc, block.AIR )
    #draw front windows
    if( floors > 1 ):
        for i in range( floors-1 ):
            windowYloc = locy+2+( (floorheight+1)*(i+1) )
            for j in range( floorheight-1 ):
                mc.setBlocks( locx, windowYloc+j , locz+1, locx, windowYloc+j, locz+(width-1), block.GLASS_PANE )
    #draw back windows
    if( floors > 1 ):
        for i in range( floors-1 ):
            windowYloc = locy+2+( (floorheight+1)*(i+1) )
            for j in range( floorheight-1 ):
                mc.setBlocks( locx+depth, windowYloc+j , locz+1, locx+depth, windowYloc+j, locz+(width-1), block.GLASS_PANE )
    #connect levels with ladder
    #mc.setBlocks( topx-1, locy+1, topz-1, topx-1, topy-1, topz-1, block.LADDER )

if __name__ == "__main__":
    mc = minecraft.Minecraft.create( server.address )
    drawBuilding( 0, 0, 0, 5, 5, 5, 3, block.STONE, block.WOOD_PLANKS )

RaspberryJuice v1.2 update available, thanks Zhuowei!

Zhuowei Zhang has updated RaspberryJuice to v1.2! v1.2 includes the following changes:

  1. added world.getBlockWithData to be compatible with Minecraft Pi 1.1.
  2. changed block hit events to listen for right-click with sword
  3. added ban-ip feature: if an IP is banned in the server, connections to the Pi API will be automatically kicked

I’m most excited about the addition of getBlockWithData. With this change, the minescan.py program works just as well against the desktop as the raspberry pi.

Download the v1.2 change here.

Thanks Zhuowei for making this change!

If you’re not familiar with RaspberryJuice, check out my previous post on it here