91 lines
2.7 KiB
Python
91 lines
2.7 KiB
Python
#
|
|
# Code under the MIT license by Alexander R. Pruss
|
|
#
|
|
|
|
import sys
|
|
import time
|
|
import mcpi.minecraft as minecraft
|
|
|
|
# vectors must be minecraft.Vec3
|
|
def drawGlyph(mc, pos, forwardVec, upVec, glyph, foreground, background=None):
|
|
bitmap = glyph[3]
|
|
height = len(bitmap)
|
|
width = glyph[0]
|
|
offset = glyph[1]
|
|
delta = glyph[2]
|
|
|
|
for i in range(height):
|
|
pixelPos = pos + upVec*(height-1-i) + forwardVec*offset
|
|
for j in range(width):
|
|
if not foreground is None and 0 != bitmap[i] & (1 << (width-1-j)):
|
|
mc.setBlock(pixelPos, foreground)
|
|
elif not background is None and 0 == bitmap[i] & (1 << (width-1-j)):
|
|
mc.setBlock(pixelPos, background)
|
|
pixelPos += forwardVec
|
|
return pos + forwardVec*delta
|
|
|
|
|
|
def drawText(mc, font, pos, forwardVec, upVec, text, foreground, background=None):
|
|
try:
|
|
text = text.decode("cp1252")
|
|
except:
|
|
text = text.decode("iso8859_1")
|
|
pixelPos = pos.clone()
|
|
height = len(font[32][3])
|
|
numLines = text.count("\n")+1
|
|
pixelPos += upVec * ((numLines-1) * height)
|
|
lineStart = pixelPos.clone()
|
|
for c in text:
|
|
value = ord(c)
|
|
|
|
if value == 10:
|
|
lineStart += upVec * (-height)
|
|
pixelPos = lineStart.clone()
|
|
else:
|
|
try:
|
|
glyph = font[value]
|
|
except:
|
|
glyph = font[32]
|
|
pixelPos = drawGlyph(mc, pixelPos, forwardVec, upVec, glyph, foreground, background)
|
|
return pixelPos
|
|
|
|
def angleToTextDirectionCardinal(angle):
|
|
return angleToTextDirection(90 * round(angle/90))
|
|
|
|
def angleToTextDirection(angle):
|
|
direction = int(round((angle % 360) / 45))
|
|
if direction == 0:
|
|
return minecraft.Vec3(-1,0,0)
|
|
elif direction == 1:
|
|
return minecraft.Vec3(-1,0,-1)
|
|
elif direction == 2:
|
|
return minecraft.Vec3(0,0,-1)
|
|
elif direction == 3:
|
|
return minecraft.Vec3(1,0,-1)
|
|
elif direction == 4:
|
|
return minecraft.Vec3(1,0,0)
|
|
elif direction == 5:
|
|
return minecraft.Vec3(1,0,1)
|
|
elif direction == 6:
|
|
return minecraft.Vec3(0,0,1)
|
|
else:
|
|
return minecraft.Vec3(-1,0,1)
|
|
|
|
if __name__ == '__main__':
|
|
import fonts
|
|
import mcpi.block as block
|
|
|
|
mc = minecraft.Minecraft()
|
|
pos = mc.player.getPos()
|
|
forward = angleToTextDirection(mc.player.getRotation())
|
|
foreground = 169 # sea lantern
|
|
background = block.OBSIDIAN
|
|
|
|
if len(sys.argv) <= 1:
|
|
text = "Hello, world!\nWelcome to Minecraft."
|
|
else:
|
|
del sys.argv[0]
|
|
text = " ".join(sys.argv)
|
|
|
|
drawText(mc, fonts.FONTS['tallfont'], pos, forward, minecraft.Vec3(0,1,0), text, foreground, background)
|