Day: 16 July 2017

Python in Minecraft 9 – railway track

1 Comment

To add railway track we need to have some normal rail and some powered rail. Next to every section of powered rail we need to provide a redstone torch.

First we define the items which are not defined in mcpi.block yet

    RAIL = block.Block(66)
    RAIL_POWERED = block.Block(27)
    TORCH_REDSTONE = block.Block(76)

We are already placing a plain torch every 4 blocks. Now we want to place a redstone torch every 4 blocks but offset by 2. Next to the redstone torch we want two pieces of powered rail, at positions 1 and 2. The rest of the rail is normal rail. This code goes in the second loop where the full tunnel profile is created.

    if x % 4 == 2:
        mc.setBlock(x,y+1,z+1,TORCH_REDSTONE.id,5)
    if x % 4 == 1 or x % 4 == 2:
        mc.setBlock(x,y+1,z,RAIL_POWERED)
    else:
        mc.setBlock(x,y+1,z,RAIL)

Here is a screenshot showing the railway track in the tunnel.

Here is the full code.

import mcpi.minecraft as minecraft
import mcpi.block as block
mc=minecraft.Minecraft.create()
XMIN = -400 # x value at one end of tunnel.
XMAX = -200 # x value at other end of tunnel. Must be greater than XMIN
GROUND = 72 # y position of tunnel at each end
FLOOR = 10  # minimum value of y at bottom of tunnel
ZPOS = -244 # z position for full length of tunnel
TAIL = 10   # length of horizontal at each end of tunnel

# Define blocks currently missing from mcpi.block
STAIRS_STONE = block.Block(109)
RAIL = block.Block(66)
RAIL_POWERED = block.Block(27)
TORCH_REDSTONE = block.Block(76)
 
# constants for tunnelvertical function
kx = (XMAX + XMIN) / 2
ky = GROUND + TAIL - (XMAX - XMIN) / 2
 
# tunnelvertical returns a vertical position of the tunnel
# for each value of the x position (eastposition)
def tunnelvertical(eastposition):
    y = abs(eastposition - kx) + ky
    if y < FLOOR:
        return FLOOR
    if y > GROUND: 
        return GROUND
    return y
 
# set the z coordinate for the tunnel which doesn't change for the full length    
z = ZPOS
 
# Initial loop to create a route made of solid glass with a stone base 
for x in range(XMIN,XMAX+1):
    y = tunnelvertical(x)
    mc.setBlocks(x,y,z-2,x,y+6,z+2,block.GLASS)
    mc.setBlocks(x,y,z-1,x,y,z+1,block.STONE)
 
# Initialise previous value of y so can determine if stairs going up or down
yprev = tunnelvertical(XMIN)
# Second loop to convert solid glass into a tunnel
for x in range(XMIN+1,XMAX):
    y = tunnelvertical(x)
    # replace centre glass with air to make it a tunnel
    mc.setBlocks(x,y+1,z-1,x,y+5,z+1,block.AIR)
    # place a torch every 4 positions to light the tunnel
    # variation 5 = torch facing up
    # every 4 blocks
    # pos 0: rail and normal torch
    # pos 1: powered rail
    # pos 2: powered rail and redstone torch
    # pos 3: rail 
    if x % 4 == 0:
        mc.setBlock(x,y+1,z+1,block.TORCH.id,5)
    if x % 4 == 2:
        mc.setBlock(x,y+1,z+1,TORCH_REDSTONE.id,5)
    if x % 4 == 1 or x % 4 == 2:
        mc.setBlock(x,y+1,z,RAIL_POWERED)
    else:
        mc.setBlock(x,y+1,z,RAIL)
    # check if stairs are going up or down 
    if y > yprev:
        # variation 0 = stairs ascending to the east
        mc.setBlock(x,y,z-1,STAIRS_STONE.id,0)
    if y < yprev:
        # variation 1 = stairs ascending to the west
        mc.setBlock(x-1,yprev,z-1,STAIRS_STONE.id,1)
    yprev=y
Categories: CoderDojo