2016-07-09 17:21:20 -05:00

135 lines
4.3 KiB
Python

#
# Code under the MIT license by Alexander Pruss
#
from mc import *
import random
import sys
def getHeightBelow(x,y,z):
if isPE:
return min(mc.getHeight(x,z),y)
else:
y0 = y - 255
while y > y0:
if mc.getBlock(x,y,z) != AIR.id:
return y
y -= 1
return min(mc.getHeight(x,z),y)
def rectangularPrism(x1,y1,z1, x2,y2,z2, distribution):
x1 = int(round(x1))
y1 = int(round(y1))
z1 = int(round(z1))
x2 = int(round(x2))
y2 = int(round(y2))
z2 = int(round(z2))
for x in range(min(x1,x2),max(x1,x2)+1):
for y in range(min(y1,y2),max(y1,y2)+1):
for z in range(min(z1,z2),max(z1,z2)+1):
if isinstance(distribution, Block):
mc.setBlock(x,y,z,distribution)
else:
r = random.random()
for p,b in distribution:
r -= p
if r<0:
mc.setBlock(x,y,z,b)
break
# Note: the first set of coordinates must be smaller than the second
def wall(x1,y1,z1, x2,y2,z2, baseHeight, altHeight, distribution):
x = x1
z = z1
while True:
if (x-x1+z-z1) % 2 == 0:
height = altHeight
else:
height = baseHeight
y0 = getHeightBelow(x,y1,z)
rectangularPrism(x,y0,z,x,y1+height,z,distribution)
if x >= x2 and z >= z2:
return
if x < x2:
x = x + 1
if z < z2:
z = z + 1
# Note: the first set of coordinates must be smaller than the second
def moatSide(x1,y1,z1, x2,y2,z2, depth):
x = x1
z = z1
while True:
y0 = getHeightBelow(x,y1,z)
mc.setBlocks(x,y0-depth+1,z,x,y0,z,WATER_STATIONARY)
if x >= x2 and z >= z2:
return
if x < x2:
x = x + 1
if z < z2:
z = z + 1
def crenellatedSquare(x1,y1,z1,width,height,altHeight,distribution):
wall(x1, y1, z1, x1+width-1, y1, z1, height, altHeight,distribution)
wall(x1, y1, z1, x1, y1, z1+width-1, height, altHeight,distribution)
wall(x1+width-1, y1, z1, x1+width-1, y1, z1+width-1, height, altHeight,distribution)
wall(x1, y1, z1+width-1, x1+width-1, y1, z1+width-1, height, altHeight,distribution)
def square(x,y,z,width,height,distribution):
crenellatedSquare(x,y,z,width,height,height,distribution)
def moatSquare(x1,y1,z1,width,depth):
moatSide(x1, y1, z1, x1+width-1, y1, z1, depth)
moatSide(x1, y1, z1, x1, y1, z1+width-1, depth)
moatSide(x1+width-1, y1, z1, x1+width-1, y1, z1+width-1, depth)
moatSide(x1, y1, z1+width-1, x1+width-1, y1, z1+width-1, depth)
def crenellatedSquareWithInnerWall(x,y,z,width,baseHeight,altHeight,distribution):
crenellatedSquare(x,y,z,width,baseHeight,altHeight,distribution)
square(x+1,y,z+1,width-2,baseHeight-1,distribution)
def tower(x,y,z,width,baseHeight,altHeight,innerHeight,distribution):
crenellatedSquareWithInnerWall(x,y,z,width,baseHeight,altHeight,distribution)
rectangularPrism(x+2,y+innerHeight-1,z+2, x+width-3,y+innerHeight-1,z+width-3, distribution)
mc = Minecraft()
pos = mc.player.getTilePos()
distribution = ((.05,MOSS_STONE), (.1,Block(STONE_BRICK.id, 1)), (.2,Block(STONE_BRICK.id, 2)),
(.651,Block(STONE_BRICK.id, 0)))
wallSize = 51
groundY = 1+getHeightBelow(pos.x, pos.y, pos.z)
# outer walls
mc.postToChat("Outer walls")
crenellatedSquareWithInnerWall(pos.x,groundY,pos.z, wallSize, 9, 10, distribution)
# towers
mc.postToChat("Towers")
tower(pos.x-7,groundY,pos.z-7, 9, 12, 13, 11, distribution)
tower(pos.x+wallSize-2,groundY,pos.z+wallSize-2, 9, 12, 13, 11, distribution)
tower(pos.x-7,groundY,pos.z+wallSize-2, 9, 12, 13, 11, distribution)
tower(pos.x+wallSize-1,groundY,pos.z-7, 9, 12, 13, 11, distribution)
# keep
mc.postToChat("Keep")
keepStartX = pos.x+wallSize/4
keepStartZ = pos.z+wallSize/4
keepWidth = wallSize / 6 * 3
tower(keepStartX,groundY, keepStartZ,keepWidth, 16, 17, 15, distribution)
# moat
if len(sys.argv) <= 1 or sys.argv[1][0] != 'n':
mc.postToChat("Moat")
moatStartX = pos.x - 12
moatStartZ = pos.z - 12
moatInnerSize = wallSize+24
for i in range(6):
moatSquare(moatStartX-i,groundY-1,moatStartZ-i,moatInnerSize+2*i,2)
mc.postToChat("Castle done")