135 lines
4.3 KiB
Python
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")
|