diff --git a/raspberryjammod/TODO b/raspberryjammod/TODO new file mode 100755 index 0000000..9bd75d6 --- /dev/null +++ b/raspberryjammod/TODO @@ -0,0 +1 @@ +win32move doesn't work \ No newline at end of file diff --git a/raspberryjammod/mcpipy/NeuroPy/NeuroPy.py b/raspberryjammod/mcpipy/NeuroPy/NeuroPy.py old mode 100644 new mode 100755 diff --git a/raspberryjammod/mcpipy/NeuroPy/README.txt b/raspberryjammod/mcpipy/NeuroPy/README.txt old mode 100644 new mode 100755 diff --git a/raspberryjammod/mcpipy/NeuroPy/__init__.py b/raspberryjammod/mcpipy/NeuroPy/__init__.py old mode 100644 new mode 100755 diff --git a/raspberryjammod/mcpipy/bridge.py b/raspberryjammod/mcpipy/bridge.py old mode 100644 new mode 100755 diff --git a/raspberryjammod/mcpipy/brooksc_findpos.py b/raspberryjammod/mcpipy/brooksc_findpos.py old mode 100755 new mode 100644 diff --git a/raspberryjammod/mcpipy/brooksc_flatmap50.py b/raspberryjammod/mcpipy/brooksc_flatmap50.py deleted file mode 100755 index 103b89a..0000000 --- a/raspberryjammod/mcpipy/brooksc_flatmap50.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env python - -#import the minecraft.py module from the minecraft directory -import mcpi.minecraft as minecraft -#import minecraft block module -import mcpi.block as block -#import time, so delays can be used -import server - -def main(): - mc = minecraft.Minecraft.create(server.address) - # write the rest of your code here... - mc.postToChat("Erasing a 50x50 block...") - mc.setBlocks(-50,-10,-50,50,10,50,block.AIR.id) - mc.setBlocks(-50,0,-50,50,-10,50,block.GRASS.id) - mc.postToChat("Done Erasing a 50x50 block!") - - - -if __name__ == "__main__": - main() diff --git a/raspberryjammod/mcpipy/brooksc_teleport_pad.py b/raspberryjammod/mcpipy/brooksc_teleport_pad.py deleted file mode 100755 index fa8eed9..0000000 --- a/raspberryjammod/mcpipy/brooksc_teleport_pad.py +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env python - -# as shared on mcpipy.com - -import mcpi.minecraft as minecraft -import mcpi.block as block -import time -import server - - -# If you are running this script with the bukkit mod, then use a diamond block as the magic center block for teleporting -# comment/uncomment below as appropriate -magic_block = block.DIAMOND_BLOCK # for bukkit server -#magic_block = block.NETHER_REACTOR_CORE # for raspberry pi - -if __name__ == "__main__": # The script - mc = minecraft.Minecraft.create(server.address) - loc = mc.player.getPos() - x = loc.x - y = loc.y - 1 - z = loc.z - for z_z in range (int(z-1), int(z+2)): - for x_x in range(int(x-1), int(x+2)): - mc.setBlock(x_x,y,z_z, block.COBBLESTONE) - mc.setBlock(x_x,y+1,z_z, block.AIR) - -mc.setBlock(x,y,z, magic_block) diff --git a/raspberryjammod/mcpipy/brooksc_template.py b/raspberryjammod/mcpipy/brooksc_template.py deleted file mode 100755 index c734baf..0000000 --- a/raspberryjammod/mcpipy/brooksc_template.py +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env python - -#import the minecraft.py module from the minecraft directory -import mcpi.minecraft as minecraft -#import minecraft block module -import mcpi.block as block -#import time, so delays can be used -import server - -def main(): - mc = minecraft.Minecraft.create(server.address) - # write the rest of your code here... - mc.postToChat("Hello MCPIPY World!") - - -if __name__ == "__main__": - main() diff --git a/raspberryjammod/mcpipy/brooksc_tntsnake.py b/raspberryjammod/mcpipy/brooksc_tntsnake.py old mode 100755 new mode 100644 diff --git a/raspberryjammod/mcpipy/burnaron_bunkermatic.py b/raspberryjammod/mcpipy/burnaron_bunkermatic.py deleted file mode 100755 index 1902988..0000000 --- a/raspberryjammod/mcpipy/burnaron_bunkermatic.py +++ /dev/null @@ -1,106 +0,0 @@ -#!/usr/bin/env python - -# mcpipy.com retrieved from URL below, written by burnaron -# http://www.minecraftforum.net/topic/1689199-my-first-script-bunkermaticpy/ - -import mcpi.minecraft as minecraft -import mcpi.block as block -from math import * -import server - -mc = minecraft.Minecraft.create(server.address) -x1 = 0 -y1 = 0 -z1 = 0 -# FASE 1: cleaning zone -mc.setBlocks(x1-2,y1,z1-2,x1+2,y1+20,z1+2,0) -mc.setBlocks(x1-51,y1-61,z1-51,x1+51,y1-19,z1+51,1) -# FASE 2: establishing access -mc.setBlocks(x1-1.5,y1+2,z1-1.5,x1+1.5,y1-60,z1+1.5,1) -mc.setBlocks(x1-1,y1+2,z1-1,x1-1,y1-60,z1-1,0) -# FASE 3: establishing main tunnels -mc.setBlocks(x1-1,y1-60,z1-1,x1+1,y1-56,z1+1,0) -mc.setBlocks(x1-50,y1-60,z1,x1+50,y1-58,z1,0) -mc.setBlocks(x1,y1-60,z1-50,x1,y1-58,z1+50,0) -mc.setBlocks(x1-1,y1+2,z1-1,x1-1,y1-60,z1-1,65,3) -# FASE 4: establishing main chambers -for pos in range(0,8): - mc.setBlocks(x1+10+pos,y1-60,z1-pos,x1+10+pos,y1-58+pos,z1+pos,0) - mc.setBlocks(x1-10-pos,y1-60,z1-pos,x1-10-pos,y1-58+pos,z1+pos,0) - mc.setBlocks(x1-pos,y1-60,z1+10+pos,x1+pos,y1-58+pos,z1+10+pos,0) - mc.setBlocks(x1-pos,y1-60,z1-10-pos,x1+pos,y1-58+pos,z1-10-pos,0) - -mc.setBlocks(x1+18,y1-60,z1-8,x1+18+24,y1-50,z1+8,0) -mc.setBlocks(x1-18,y1-60,z1-8,x1-18-24,y1-50,z1+8,0) -mc.setBlocks(x1-8,y1-60,z1+18,x1+8,y1-50,z1+18+24,0) -mc.setBlocks(x1-8,y1-60,z1-18,x1+8,y1-50,z1-18-24,0) - -for pos in range(0,8): - mc.setBlocks(x1+18+24+pos,y1-60,z1-8+pos,x1+18+24+pos,y1-50-pos,z1+8-pos,0) - mc.setBlocks(x1-18-24-pos,y1-60,z1-8+pos,x1-18-24-pos,y1-50-pos,z1+8-pos,0) - mc.setBlocks(x1-8+pos,y1-60,z1+18+24+pos,x1+8-pos,y1-50-pos,z1+18+24+pos,0) - mc.setBlocks(x1-8+pos,y1-60,z1-18-24-pos,x1+8-pos,y1-50-pos,z1-18-24-pos,0) - -# FASE 5: establishing lights & doors: -# FASE 5.1: central chamber lights: -mc.setBlock(0,-57,1,50) -mc.setBlock(1,-57,0,50) -mc.setBlock(0,-57,-1,50) -mc.setBlock(-1,-57,0,50) -# FASE 5.2: main chambers lights -for pos in range(2,8): - mc.setBlock(x1+pos,y1-58,z1+10+pos,50) - mc.setBlock(x1-pos,y1-58,z1+10+pos,50) - mc.setBlock(x1+pos,y1-58,z1-10-pos,50) - mc.setBlock(x1-pos,y1-58,z1-10-pos,50) - mc.setBlock(x1+10+pos,y1-58,z1+pos,50) - mc.setBlock(x1+10+pos,y1-58,z1-pos,50) - mc.setBlock(x1-10-pos,y1-58,z1+pos,50) - mc.setBlock(x1-10-pos,y1-58,z1-pos,50) - -for pos in range(0,24,2): - mc.setBlock(x1+8,y1-58,z1+18+pos,50) - mc.setBlock(x1-8,y1-58,z1+18+pos,50) - mc.setBlock(x1+8,y1-58,z1-18-pos,50) - mc.setBlock(x1-8,y1-58,z1-18-pos,50) - mc.setBlock(x1+18+pos,y1-58,z1+8,50) - mc.setBlock(x1+18+pos,y1-58,z1-8,50) - mc.setBlock(x1-18-pos,y1-58,z1+8,50) - mc.setBlock(x1-18-pos,y1-58,z1-8,50) - -for pos in range(0,7): - mc.setBlock(x1+8-pos,y1-58,z1+18+24+pos,50) - mc.setBlock(x1-8+pos,y1-58,z1+18+24+pos,50) - mc.setBlock(x1+8-pos,y1-58,z1-18-24-pos,50) - mc.setBlock(x1-8+pos,y1-58,z1-18-24-pos,50) - mc.setBlock(x1+18+24+pos,y1-58,z1+8-pos,50) - mc.setBlock(x1+18+24+pos,y1-58,z1-8+pos,50) - mc.setBlock(x1-18-24-pos,y1-58,z1+8-pos,50) - mc.setBlock(x1-18-24-pos,y1-58,z1-8+pos,50) -# FASE 5.3: doors -mc.setBlock(x1,y1-60,z1+2,64,1) -mc.setBlock(x1,y1-59,z1+2,64,8) -mc.setBlock(x1,y1-58,z1+2,1) -mc.setBlock(x1,y1-60,z1+10,64,3) -mc.setBlock(x1,y1-59,z1+10,64,8) -mc.setBlock(x1,y1-58,z1+10,1) - -mc.setBlock(x1,y1-60,z1-2,64,3) -mc.setBlock(x1,y1-59,z1-2,64,8) -mc.setBlock(x1,y1-58,z1-2,1) -mc.setBlock(x1,y1-60,z1-10,64,1) -mc.setBlock(x1,y1-59,z1-10,64,8) -mc.setBlock(x1,y1-58,z1-10,1) - -mc.setBlock(x1+2,y1-60,z1,64,4) -mc.setBlock(x1+2,y1-59,z1,64,8) -mc.setBlock(x1+2,y1-58,z1,1) -mc.setBlock(x1+10,y1-60,z1,64,2) -mc.setBlock(x1+10,y1-59,z1,64,8) -mc.setBlock(x1+10,y1-58,z1,1) -mc.setBlock(x1-2,y1-60,z1,64,2) -mc.setBlock(x1-2,y1-59,z1,64,8) -mc.setBlock(x1-2,y1-58,z1,1) -mc.setBlock(x1-10,y1-60,z1,64,4) -mc.setBlock(x1-10,y1-59,z1,64,8) -mc.setBlock(x1-10,y1-58,z1,1) \ No newline at end of file diff --git a/raspberryjammod/mcpipy/burnaron_bunkermatic2.py b/raspberryjammod/mcpipy/burnaron_bunkermatic2.py deleted file mode 100755 index fd7c61e..0000000 --- a/raspberryjammod/mcpipy/burnaron_bunkermatic2.py +++ /dev/null @@ -1,95 +0,0 @@ -#!/usr/bin/env python - -# mcpipy.com retrieved from URL below, written by burnaron -# http://www.minecraftforum.net/topic/1689199-my-first-script-bunkermaticpy/ - -import mcpi.minecraft as minecraft -import mcpi.block as block -from math import * -import server - -mc = minecraft.Minecraft.create(server.address) -x1 = -4 -y1 = 3 -z1 = 9 -long_tun = 10 -long_arc_ch = 8 -long_ch = 26 -long_m_ch = long_ch - 2 * long_arc_ch -deepness = 60 -high_c_ch = 3 - -# FASE 1: cleaning zone -mc.setBlocks(x1-2,y1,z1-2,x1+2,y1+20,z1+2,0) -mc.setBlocks(x1-(long_tun+long_ch+1),y1-(deepness+1),z1-(long_tun+long_ch+1),x1+long_tun+long_ch+1,y1-(deepness-long_arc_ch-2-1),z1+long_tun+long_ch+1,1) - -# FASE 2: establishing access -mc.setBlocks(x1-1.5,y1+2,z1-1.5,x1+1.5,y1-deepness,z1+1.5,1) -mc.setBlocks(x1-1,y1+2,z1-1,x1-1,y1-deepness,z1-1,0) - -# FASE 3: establishing main tunnels, central chamber & and access stairs -# FASE 3.1: establishing central chamber -mc.setBlocks(x1-1,y1-deepness,z1-1,x1+1,y1-(deepness-high_c_ch),z1+1,0) - -# FASE 3.2: establishing main tunnels -mc.setBlocks(x1-(long_tun+long_ch),y1-deepness,z1,x1+long_tun+long_ch,y1-(deepness-1),z1,0) -mc.setBlocks(x1,y1-deepness,z1-(long_tun+long_ch),x1,y1-(deepness-1),z1+long_tun+long_ch,0) - -# FASE 3.3: establishing access stairs -mc.setBlocks(x1-1,y1+2,z1-1,x1-1,y1-deepness,z1-1,65,3) - -# FASE 4: establishing main chambers -for pos in range(0,long_arc_ch): - mc.setBlocks(x1+long_tun+pos,y1-deepness,z1-pos,x1+long_tun+pos,y1-(deepness-2)+pos,z1+pos,0) - mc.setBlocks(x1-long_tun-pos,y1-deepness,z1-pos,x1-long_tun-pos,y1-(deepness-2)+pos,z1+pos,0) - mc.setBlocks(x1-pos,y1-deepness,z1+long_tun+pos,x1+pos,y1-(deepness-2)+pos,z1+long_tun+pos,0) - mc.setBlocks(x1-pos,y1-deepness,z1-long_tun-pos,x1+pos,y1-(deepness-2)+pos,z1-long_tun-pos,0) - -mc.setBlocks(x1+long_tun+long_arc_ch,y1-deepness,z1-long_arc_ch,x1+long_tun+long_arc_ch+long_m_ch,y1-(deepness-2)+long_arc_ch,z1+long_arc_ch,0) -mc.setBlocks(x1-(long_tun+long_arc_ch),y1-deepness,z1-long_arc_ch,x1-(long_tun+long_arc_ch)-long_m_ch,y1-(deepness-2)+long_arc_ch,z1+long_arc_ch,0) -mc.setBlocks(x1-long_arc_ch,y1-deepness,z1+long_tun+long_arc_ch,x1+long_arc_ch,y1-(deepness-2)+long_arc_ch,z1+long_tun+long_arc_ch+long_m_ch,0) -mc.setBlocks(x1-long_arc_ch,y1-deepness,z1-(long_tun+long_arc_ch),x1+long_arc_ch,y1-(deepness-2)+long_arc_ch,z1-(long_tun+long_arc_ch)-(long_m_ch),0) - -for pos in range(0,long_arc_ch): - mc.setBlocks(x1+long_tun+long_arc_ch+long_m_ch+pos,y1-deepness,z1-long_arc_ch+pos,x1+long_tun+long_arc_ch+long_m_ch+pos,y1-(deepness-2)+long_arc_ch-pos,z1+long_arc_ch-pos,0) - mc.setBlocks(x1-(long_tun+long_arc_ch)-long_m_ch-pos,y1-deepness,z1-long_arc_ch+pos,x1-(long_tun+long_arc_ch)-long_m_ch-pos,y1-(deepness-2)+long_arc_ch-pos,z1+long_arc_ch-pos,0) - mc.setBlocks(x1-long_arc_ch+pos,y1-deepness,z1+long_tun+long_arc_ch+long_m_ch+pos,x1+long_arc_ch-pos,y1-(deepness-2)+long_arc_ch-pos,z1+long_tun+long_arc_ch+long_m_ch+pos,0) - mc.setBlocks(x1-long_arc_ch+pos,y1-deepness,z1-(long_tun+long_arc_ch)-long_m_ch-pos,x1+long_arc_ch-pos,y1-(deepness-2)+long_arc_ch-pos,z1-(long_tun+long_arc_ch)-long_m_ch-pos,0) - -# FASE 5: establishing lights & doors: -# FASE 5.1: central chamber lights: -mc.setBlock(x1,y1-(deepness-2),z1+1,50) -mc.setBlock(x1+1,y1-(deepness-2),z1,50) -mc.setBlock(x1,y1-(deepness-2),z1-1,50) -mc.setBlock(x1-1,y1-(deepness-2),z1,50) - -# FASE 5.2: main chambers lights -for pos in range(2,long_arc_ch): - mc.setBlock(x1+pos,y1-(deepness-2),z1+long_tun+pos,50) - mc.setBlock(x1-pos,y1-(deepness-2),z1+long_tun+pos,50) - mc.setBlock(x1+pos,y1-(deepness-2),z1-long_tun-pos,50) - mc.setBlock(x1-pos,y1-(deepness-2),z1-long_tun-pos,50) - mc.setBlock(x1+long_tun+pos,y1-(deepness-2),z1+pos,50) - mc.setBlock(x1+long_tun+pos,y1-(deepness-2),z1-pos,50) - mc.setBlock(x1-long_tun-pos,y1-(deepness-2),z1+pos,50) - mc.setBlock(x1-long_tun-pos,y1-(deepness-2),z1-pos,50) - -for pos in range(0,long_m_ch,2): - mc.setBlock(x1+long_arc_ch,y1-(deepness-2),z1+long_tun+long_arc_ch+pos,50) - mc.setBlock(x1-long_arc_ch,y1-(deepness-2),z1+long_tun+long_arc_ch+pos,50) - mc.setBlock(x1+long_arc_ch,y1-(deepness-2),z1-(long_tun+long_arc_ch)-pos,50) - mc.setBlock(x1-long_arc_ch,y1-(deepness-2),z1-(long_tun+long_arc_ch)-pos,50) - mc.setBlock(x1+long_tun+long_arc_ch+pos,y1-(deepness-2),z1+long_arc_ch,50) - mc.setBlock(x1+long_tun+long_arc_ch+pos,y1-(deepness-2),z1-long_arc_ch,50) - mc.setBlock(x1-(long_tun+long_arc_ch)-pos,y1-(deepness-2),z1+long_arc_ch,50) - mc.setBlock(x1-(long_tun+long_arc_ch)-pos,y1-(deepness-2),z1-long_arc_ch,50) - -for pos in range(0,7): - mc.setBlock(x1+long_arc_ch-pos,y1-(deepness-2),z1+long_tun+long_arc_ch+long_m_ch+pos,50) - mc.setBlock(x1-long_arc_ch+pos,y1-(deepness-2),z1+long_tun+long_arc_ch+long_m_ch+pos,50) - mc.setBlock(x1+long_arc_ch-pos,y1-(deepness-2),z1-(long_tun+long_arc_ch)-long_m_ch-pos,50) - mc.setBlock(x1-long_arc_ch+pos,y1-(deepness-2),z1-(long_tun+long_arc_ch)-long_m_ch-pos,50) - mc.setBlock(x1+long_tun+long_arc_ch+long_m_ch+pos,y1-(deepness-2),z1+long_arc_ch-pos,50) - mc.setBlock(x1+long_tun+long_arc_ch+long_m_ch+pos,y1-(deepness-2),z1-long_arc_ch+pos,50) - mc.setBlock(x1-(long_tun+long_arc_ch)-long_m_ch-pos,y1-(deepness-2),z1+long_arc_ch-pos,50) - mc.setBlock(x1-(long_tun+long_arc_ch)-long_m_ch-pos,y1-(deepness-2),z1-long_arc_ch+pos,50) \ No newline at end of file diff --git a/raspberryjammod/mcpipy/castle.py b/raspberryjammod/mcpipy/castle.py index 7e62bef..fd92f17 100644 --- a/raspberryjammod/mcpipy/castle.py +++ b/raspberryjammod/mcpipy/castle.py @@ -18,6 +18,12 @@ def getHeightBelow(x,y,z): 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): diff --git a/raspberryjammod/mcpipy/chess.py b/raspberryjammod/mcpipy/chess.py old mode 100644 new mode 100755 index 3be0e31..b00442b --- a/raspberryjammod/mcpipy/chess.py +++ b/raspberryjammod/mcpipy/chess.py @@ -21,19 +21,24 @@ LABEL_BLOCK = REDSTONE_BLOCK try: import _sunfish as sunfish except: + import urllib2 + import os.path + import os + content = urllib2.urlopen("https://raw.githubusercontent.com/thomasahle/sunfish/master/sunfish.py").read() + filename = os.path.join(os.path.dirname(sys.argv[0]),"_sunfish.py") try: - import urllib2 - import os.path - content = urllib2.urlopen("https://raw.githubusercontent.com/thomasahle/sunfish/master/sunfish.py").read() - f=open(os.path.join(os.path.dirname(sys.argv[0]),"_sunfish.py"),"w") - f.write("# From: https://raw.githubusercontent.com/thomasahle/sunfish/master/sunfish.py\n") - f.write("# Covered by the GPL 2 license\n") - f.write(content) + f=open(filename,"wb") + f.write(b"# -*- coding: utf-8 -*-") + f.write(b"# From: https://raw.githubusercontent.com/thomasahle/sunfish/master/sunfish.py\n") + f.write(b"# Covered by the GPL 2 license\n") + f.write(bytearray(content)) f.close() import _sunfish as sunfish except: - print "Failed download: You need sunfish.py for this script." - + os.remove(filename) + print("Error creating _sunfish.py") + sys.exit(0) + def getCoords(row,col): return (corner.x+8*row+4,corner.y,corner.z+8*col+4) @@ -390,7 +395,7 @@ while True: sunfish.tp = OrderedDict() move,score = sunfish.search(pos) else: - moves = tuple(pos.genMoves()) + moves = tuple(pos.gen_moves()) move = None while move not in moves: if move is not None: diff --git a/raspberryjammod/mcpipy/clock.py b/raspberryjammod/mcpipy/clock.py old mode 100644 new mode 100755 diff --git a/raspberryjammod/mcpipy/console.py b/raspberryjammod/mcpipy/console.py old mode 100644 new mode 100755 index 3d09fdb..374f70f --- a/raspberryjammod/mcpipy/console.py +++ b/raspberryjammod/mcpipy/console.py @@ -1,3 +1,7 @@ +# +# WARNING: If you're running RJM on a server, do NOT include this script server-side for security reasons. +# + # # Code under the MIT license by Alexander Pruss # @@ -26,6 +30,8 @@ def inputLine(prompt): return 'quit()' elif c.message == ' ': return '' + elif "__" in c.message: + sys.exit(); else: return c.message time.sleep(0.2) diff --git a/raspberryjammod/mcpipy/danielbates_minecraft_basic.py b/raspberryjammod/mcpipy/danielbates_minecraft_basic.py deleted file mode 100644 index d48fd3c..0000000 --- a/raspberryjammod/mcpipy/danielbates_minecraft_basic.py +++ /dev/null @@ -1,114 +0,0 @@ -# Don't execute this directory -- this is a support script for danielbates_setblockdemo.py - -import sys - -# Add some common locations where the main API might be. Feel free to add/change -# these to suit you. -sys.path.append("mcpi") -sys.path.append("api/python/mcpi") -sys.path.append("mcpi/api/python/mcpi") - -# Attempt to import Mojang's API. -try: - import connection - import minecraft -except ImportError: - print "Unable to find Minecraft API. Please place minecraft_basic.py in the mcpi directory." - exit() - -_server = None -_blockedit = None -_playeredit = None - -def connect(ip="127.0.0.1", port=4711): - global _server, _blockedit, _playeredit - - try: - _server = connection.Connection(ip, port) - _blockedit = minecraft.Minecraft(_server) - _playeredit = _blockedit.player - except Exception: - print "Unable to connect to Minecraft server at {0}:{1}".format(ip,port) - return - - print "Connected to Minecraft server at {0}:{1}".format(ip,port) - -def setblock(x,y,z,*typedata): - _blockedit.setBlock(x,y,z,typedata) - -def getblock(x,y,z): - return _blockedit.getBlock(x,y,z) - -def moveplayer(x,y,z): - _playeredit.setPos(x,y,z) - -AIR = 0 -STONE = 1 -GRASS = 2 -DIRT = 3 -COBBLESTONE = 4 -WOOD_PLANK = 5 -SAPLING = 6 -BEDROCK = 7 -WATER_FLOWING = 8 -WATER = 9 -LAVA_FLOWING = 10 -LAVA = 11 -SAND = 12 -GRAVEL = 13 -GOLD_ORE = 14 -IRON_ORE = 15 -COAL_ORE = 16 -WOOD = 17 -LEAVES = 18 -GLASS = 20 -LAPIS_ORE = 21 -LAPIS = 22 -SANDSTONE = 24 -BED = 26 -COBWEB = 30 -TALL_GRASS = 31 -WOOL = 35 -FLOWER_YELLOW = 37 -FLOWER_RED = 38 -MUSHROOM_BROWN = 39 -MUSHROOM_RED = 40 -GOLD = 41 -IRON = 42 -STONE_SLAB_DOUBLE = 43 -STONE_SLAB = 44 -BRICK = 45 -TNT = 46 -BOOKSHELF = 47 -MOSSY_STONE = 48 -TORCH = 50 -FIRE = 51 -WOOD_STAIRS = 53 -CHEST = 54 -DIAMOND_ORE = 56 -DIAMOND = 57 -CRAFTING_TABLE = 58 -FARMLAND = 60 -FURNACE = 61 -FURNACE_ACTIVE = 62 -WOOD_DOOR = 64 -LADDER = 65 -COBBLESTONE_STAIRS = 67 -IRON_DOOR = 71 -REDSTONE_ORE = 73 -SNOW_COVER = 78 -ICE = 79 -SNOW = 80 -CACTUS = 81 -CLAY = 82 -SUGAR_CANE = 83 -FENCE = 85 -GLOWSTONE = 89 -INVISIBLE_BEDROCK = 95 -STONE_BRICK = 98 -GLASS_PANE = 102 -MELON = 103 -FENCE_GATE = 107 -GLOWING_OBSIDIAN = 246 -NETHER_REACTOR_CORE = 247 -UPDATE_GAME_BLOCK = 249 \ No newline at end of file diff --git a/raspberryjammod/mcpipy/danielbates_setblockdemo.py b/raspberryjammod/mcpipy/danielbates_setblockdemo.py old mode 100755 new mode 100644 index 4bfa02f..2ac5827 --- a/raspberryjammod/mcpipy/danielbates_setblockdemo.py +++ b/raspberryjammod/mcpipy/danielbates_setblockdemo.py @@ -1,7 +1,10 @@ #!/usr/bin/env python # -from math import sin, cos, radians -import danielbates_minecraft_basic as mc +# +# By Daniel Bates, with minor adaptations by Alexander Pruss +# + +from mc import * #import pygame.image # comment this out if not using images - it's slow to import. If you uncomment, uncomment the image reference below. import random import server @@ -283,7 +286,7 @@ def officeblock(wallmaterial): goody = (point.y%5 == 1) or (point.y%5 == 2) goodz = (point.z%5 == 1) or (point.z%5 == 2) if (goodx and goody) or (goodz and goody): - return mc.GLASS + return GLASS else: return wallmaterial return f @@ -313,13 +316,13 @@ def tomaterial(r,g,b): # Just a quick hack for now - could of course add more colours # and a way of finding the nearest supported colour. if (r,g,b) == (255,255,255): # white - return mc.AIR + return AIR elif (r,g,b) == (0,0,0): # black - return mc.OBSIDIAN + return OBSIDIAN elif (r,g,b) == (188,17,66): # pink - return mc.REDSTONE_ORE + return REDSTONE_ORE elif (r,g,b) == (117,169,40): # green - return mc.MELON + return MELON else: return None @@ -374,61 +377,62 @@ by multiplying them together. fillfunc = solid(material) for point in shape: point2 = transform * point - mc.setblock(int(point2.x), int(point2.y), int(point2.z), fillfunc(point)) + mc.setBlock(int(point2.x), int(point2.y), int(point2.z), fillfunc(point)) def clear(shape, transform=identity()): """Remove any non-air blocks in the given shape.""" - fillshape(shape,transform,mc.AIR) + fillshape(shape,transform,AIR) def main(): + global mc """Function used to build my demo world. Extra clearing may be required for hilly worlds.""" - mc.connect(server.address) + mc = Minecraft() # Create a large empty space with a neat, grassy floor. Takes a long time! clear(cuboid(100,10,120)) - fillshape(floor(100,120), shift(0,-1,0), material=mc.GRASS) + fillshape(floor(100,120), shift(0,-1,0), material=GRASS) # Introduce basic shapes/transformations/fill functions. - fillshape(arrow, material=mc.STONE) - fillshape(arrow, shift(6,0,0), mc.STONE) - fillshape(arrow, shift(12,0,0)*rotationx(90), mc.STONE) - fillshape(arrow, shift(18,0,0)*rotationx(45), mc.STONE) - fillshape(arrow, shift(24,0,0), fillfunc=chequers(mc.WOOD, mc.STONE)) + fillshape(arrow, material=STONE) + fillshape(arrow, shift(6,0,0), STONE) + fillshape(arrow, shift(12,0,0)*rotationx(90), STONE) + fillshape(arrow, shift(18,0,0)*rotationx(45), STONE) + fillshape(arrow, shift(24,0,0), fillfunc=chequers(WOOD, STONE)) # Introduce generator functions. - fillshape(cuboid(4,4,4), shift(30,0,0), mc.STONE) - fillshape(cuboid(3,8,2), shift(36,0,0), mc.STONE) + fillshape(cuboid(4,4,4), shift(30,0,0), STONE) + fillshape(cuboid(3,8,2), shift(36,0,0), STONE) # Show other simple shapes. - fillshape(sphere(5), shift(45,5,0), mc.STONE) - fillshape(pyramid(5), shift(50,0,0), mc.STONE) - fillshape(cylinder(5,4), shift(65,0,0), mc.STONE) - fillshape(cone(5,5), shift(75,0,0), mc.STONE) + fillshape(sphere(5), shift(45,5,0), STONE) + fillshape(pyramid(5), shift(50,0,0), STONE) + fillshape(cylinder(5,4), shift(65,0,0), STONE) + fillshape(cone(5,5), shift(75,0,0), STONE) # Show some fill functions. - fillshape(cuboid(4,4,4), shift(80,0,5), fillfunc=chequers(mc.GOLD, mc.IRON)) - fillshape(pyramid(5), shift(80,0,10), fillfunc=randomfill([mc.SAND, mc.SANDSTONE])) - fillshape(hollowcuboid(4,6,4), shift(80,0,22), mc.WOOD_PLANK) - fillshape(building(2,6,2), shift(80,0,30), fillfunc=officeblock(mc.COBBLESTONE)) + fillshape(cuboid(4,4,4), shift(80,0,5), fillfunc=chequers(GOLD_BLOCK, IRON_BLOCK)) + fillshape(pyramid(5), shift(80,0,10), fillfunc=randomfill([SAND, SANDSTONE])) + fillshape(hollowcuboid(4,6,4), shift(80,0,22), WOOD) + fillshape(building(2,6,2), shift(80,0,30), fillfunc=officeblock(COBBLESTONE)) # Line drawing. - fillshape(line(80,0,40,85,5,45), material=mc.WOOL) - fillshape(line(80,0,40,80,2,50), material=mc.WOOL) - fillshape(line(80,2,50,85,5,45), material=mc.WOOL) + fillshape(line(80,0,40,85,5,45), material=WOOL) + fillshape(line(80,0,40,80,2,50), material=WOOL) + fillshape(line(80,2,50,85,5,45), material=WOOL) # Fun lava sphere. - fillshape(sphere(10), shift(80,10,60), mc.GLASS) - fillshape(sphere(9), shift(80,10,60), mc.LAVA) + fillshape(sphere(10), shift(80,10,60), GLASS) + fillshape(sphere(9), shift(80,10,60), LAVA) # Fractals - far easier to code than to build by hand. - fillshape(mengersponge(0), shift(70,0,75), mc.IRON) - fillshape(mengersponge(1), shift(66,0,75), mc.IRON) - fillshape(mengersponge(2), shift(56,0,75), mc.IRON) - fillshape(mengersponge(3), shift(28,0,75), mc.IRON) + fillshape(mengersponge(0), shift(70,0,75), IRON_BLOCK) + fillshape(mengersponge(1), shift(66,0,75), IRON_BLOCK) + fillshape(mengersponge(2), shift(56,0,75), IRON_BLOCK) + fillshape(mengersponge(3), shift(28,0,75), IRON_BLOCK) # Maze. - fillshape(maze(25,25), shift(0,0,75), mc.STONE) + fillshape(maze(25,25), shift(0,0,75), STONE) # Picture - can use the same technique to draw text. # fillshape(cuboid(24,30,1), shift(0,0,30), fillfunc=image("pi.png",24,30)) diff --git a/raspberryjammod/mcpipy/davef21370_maze.py b/raspberryjammod/mcpipy/davef21370_maze.py old mode 100755 new mode 100644 diff --git a/raspberryjammod/mcpipy/daviewales_minesweeper.py b/raspberryjammod/mcpipy/daviewales_minesweeper.py deleted file mode 100755 index 8c43f31..0000000 --- a/raspberryjammod/mcpipy/daviewales_minesweeper.py +++ /dev/null @@ -1,261 +0,0 @@ -#!/usr/bin/env python - -# mcpipy.com retrieved from URL below, written by Davie Wales -# https://bitbucket.org/dwales/minesweeper-for-minecraft-pi-edition/src - - -import sys -import random -import threading -import mcpi.minecraft as minecraft -import server - - -defaultDifficulty = 0.1 -setDifficulty = defaultDifficulty - -class board: - """ The cartesian grid can be done as follows: - board = [["?", "*", "?", "?", "*", "?", "?", "?", "?", "*",], - ["?", "?", "*", "?", "?", "?", "?", "?", "?", "?",], - ["?", "*", "*", "?", "*", "?", "?", "*", "*", "?",], - ["?", "?", "?", "?", "?", "?", "*", "?", "*", "?",], - ["*", "?", "?", "?", "?", "*", "?", "?", "?", "?",], - ["?", "?", "?", "?", "?", "?", "?", "?", "?", "?",], - ["?", "*", "?", "*", "?", "?", "?", "*", "?", "*",], - ["?", "?", "?", "?", "?", "?", "?", "?", "?", "?",], - ["?", "*", "?", "?", "*", "*", "?", "?", "*", "?",], - ["?", "?", "*", "?", "?", "?", "?", "*", "?", "?",]] - - Obviously the grid will be randomly generated on run to fit - within the bounds of the terminal window. - Notice that you can access the state of any tile on the grid with - the simple command "board[x][y]" - i.e. a = board[0][0] makes a == "?", a = board[0][9] makes a == "*" - NOTE: I subsequently changed the code to use nested dictionaries, - rather than lists to represent the board. The general idea is - still the same... - If we use a dictionary rather than a list in the following - function, we will get a KeyError if we try to access a - negative index, assuming we construct the dictionary such - that it has identical indexes to the list equivalent. - i.e. dictionary = {0:{0:" ", 1:" ", 2"*"}, 1:{0:"*", 1:" ", 2:" "}} - This will be helpful, as it will negate the need to explicitly - check whether a particular coordinate is legitimate. i.e. a - dictionary won't match negative values for x, y, but a list will...""" - - """ At the moment we are getting the window size before curses is - initialised, which means that we have to use "stty size". If - we can move this code into the curses section, we can use the - built in window.getmaxyx(). This will make it easier to use - windows smaller than the size of the terminal for the game, - which will in turn allow us to add timers and minecounts.""" - - def __init__(self): - global width, height - width = 10 - height = 10 - - def options(self): - totalTiles = width * height - - #possible choices of tile: either "*" or " " - self.mineNumber = int(setDifficulty * totalTiles) - choices = list(self.mineNumber * "*") - choices.extend(list((totalTiles-len(choices))*" ")) - return choices - - # For every x and y, check all the squares around to see if there is a mine, - # add together the number of mines touching the original square and replace - # the original square with the final count. - def numberise(self, board): - for x in xrange(width): - for y in xrange(height): - count = 0 - if board[x][y] != "*": - for i in xrange(-1, 2): - for n in xrange(-1, 2): - try: - if board[x+i][y+n] == "*": - count += 1 - except KeyError: - pass - if count != 0: - board[x][y] = str(count) - - def create(self): - self.mineCoords = [] - choices = self.options() - board = {} - for i in xrange(0, width): - board[i] = {} - for n in xrange(0, height): - board[i][n] = choices.pop(choices.index(random.choice(choices))) - if board[i][n] == "*": - self.mineCoords.append([i,n]) - - self.numberise(board) - for i in xrange(width): - for n in xrange(height): - minecraftAddBlock(i, n, 1, board[i][n]) - - return board - - def visibleScreen(self): - board = {} - for i in xrange(0, width): - board[i] = {} - for n in xrange(0, height): - board[i][n] = " " - return board - -def minecraftAddBlock(X, Y, Z, mineAttribute): - # This equates values passed through mineAttribute with the actual - # block IDs from Minecraft. - # 0 is Air, 5 is Wood Planks, 4 is cobblestone, coal is 16 - # Iron is 15, Gold is 14, Diamond is 56, Gold Block is 41, - # Diamond Block is 57 - mineDict = {"dirt":3, "*":46, " ":20, 0:0, "1":5, "2":4, "3":16, "4":15, "5":14, "6":56, "7":41, "8":57} - mc.setBlock(X, Y, Z, mineDict[mineAttribute]) - -def explore(x, y, Z): # Z is capitalised because it doesn't - # need to be changed by the function. - """ This is the bit that happens when you click on a blank square - First it checks the squares directly around the clicked square - If the square it checks is a number, it will display it, and - if the square it checks is blank, it will add the blank square's - coordinates to a list or dictionary, then it will keep doing the - same process to all the coordinates in the list, deleting squares - that have been checked, and adding new squares, until the list is - empty. At that point, the area around the original square will be - revealed, as you would expect to happen in minesweeper.""" - - checked = [[x,y]] # Has been checked and contains either a number or ' ' - toBeCentre = [[x, y]] # Each point in this list will be checked on all sides for the above conditions - centred = [] # These points have already been checked on all sides - global cleared - cleared = [] - - while len(toBeCentre) > 0: - X, Y = toBeCentre.pop(0) - centred.append([X,Y]) - minecraftAddBlock(X, Y, Z, 0) - if [X,Y] not in cleared: - cleared.append([X,Y]) - for i in xrange(-1, 2): - for n in xrange(-1, 2): - - # When I was writing this section, it wouldn't work, and wouldn't work - # and then after changing it around a million times, suddenly it started working... - # The only problem is that I don't actually know what I did to make it work... =P - try: - if ((newBoard[X+i][Y+n] in ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'])and ([X+i, Y+n] not in checked)): - minecraftAddBlock(X+i, Y+n, Z, 0) #newBoard[X+i][Y+n]) - checked.append([X+i, Y+n]) - if [X+i,Y+n] not in cleared: - cleared.append([X+i,Y+n]) - - elif newBoard[X+i][Y+n] == " ": - if (([X+i, Y+n] not in checked) and ([X+i, Y+n] not in toBeCentre)): - toBeCentre.append([X+i, Y+n]) - checked.append([X+i, Y+n]) - except KeyError: - pass - -class WinningCheckThread (threading.Thread): - - def __init__(self, mineCoords, mineNumber, z): - self.mineCoords = mineCoords - self.mineNumber = mineNumber - self.z = z - threading.Thread.__init__(self) - - def run(self): - global running - running = True - mc = minecraft.Minecraft.create() - while running: - ### This is the winning condition... ### - flagCount = 0 - correctFlagCount = 0 - - for x in xrange(width): - for y in xrange(height): - if mc.getBlock(x, y, 0-1) == 50: - flagCount += 1 - if [x,y] in self.mineCoords: - correctFlagCount += 1 - - if (self.mineNumber == correctFlagCount) and (self.mineNumber == flagCount): - for x in xrange(width): - for y in xrange(height): - mc.setBlock(x, y, self.z, 20) - - mc.postToChat("You Win!!!") - running = False - sys.exit() - -class BlockCheckThread(threading.Thread): - - def __init__(self): - - threading.Thread.__init__(self) - def run(self): - global running - running = True - mc = minecraft.Minecraft.create() - while running: - - event = mc.events.pollBlockHits() - - if event: -# mc.postToChat("Hit detected") - eventSplit = str(event[0]).split() - eventSplit = [eventSplit[1][0], eventSplit[2][0], eventSplit[3][0]] - cursorX, cursorY, cursorZ = eventSplit - cursorX = int(cursorX) - cursorY = int(cursorY) - cursorZ = int(cursorZ) - if newBoard[cursorX][cursorY] == "*": - for y in xrange(height): - for x in xrange(width): - # This bit of code's dodgy, because it relies on the - # creation of "newBoard" external to the function... - mc.setBlock(x, y, z, 0) # (If you hit a mine it clears the board.) - mc.postToChat("You Lose!") - running = False - sys.exit() - - if newBoard[cursorX][cursorY] in ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']: - #visibleScreen[x][y] = newBoard[x][y] - mc.setBlock(cursorX, cursorY, cursorZ, 0) # We just remove the top layer. - - if newBoard[cursorX][cursorY] == " ": - explore(cursorX, cursorY, cursorZ) - -#def main(): -global running -running = True -mc = minecraft.Minecraft.create(server.address) -board = board() -newBoard = board.create() -visibleScreen = board.visibleScreen() - -for x in xrange(width): - for y in xrange(height): - mc.setBlock(x,y,-1,0) - -z = 0 # For now... We can make this dynamic later. -for y in xrange(height): - for x in xrange(width): - # This bit of code's dodgy, because it relies on the - # creation of "visibleScreen" external to the function... - minecraftAddBlock(x, y, z, "dirt") - -WinningCheck = WinningCheckThread(board.mineCoords, board.mineNumber, z) -BlockCheck = BlockCheckThread() -BlockCheck.daemon -WinningCheck.start() -BlockCheck.start() - -#main() \ No newline at end of file diff --git a/raspberryjammod/mcpipy/dragoncurve.py b/raspberryjammod/mcpipy/dragoncurve.py old mode 100644 new mode 100755 diff --git a/raspberryjammod/mcpipy/drawing.py b/raspberryjammod/mcpipy/drawing.py old mode 100644 new mode 100755 index f97df29..dd763b2 --- a/raspberryjammod/mcpipy/drawing.py +++ b/raspberryjammod/mcpipy/drawing.py @@ -501,7 +501,7 @@ class Drawing: x0 = p[0]+point[0] y0 = p[1]+point[1] z0 = p[2]+point[2] - if (x0,y0,z0) not in self.done: + if (x0,y0,z0) not in done: self.mc.setBlock(x0,y0,z0,block) done.add((x0,y0,z0)) diff --git a/raspberryjammod/mcpipy/fancytree.py b/raspberryjammod/mcpipy/fancytree.py old mode 100644 new mode 100755 diff --git a/raspberryjammod/mcpipy/fleap_railgen.py b/raspberryjammod/mcpipy/fleap_railgen.py old mode 100755 new mode 100644 diff --git a/raspberryjammod/mcpipy/gf_clearZone.py b/raspberryjammod/mcpipy/gf_clearZone.py deleted file mode 100755 index a597cc3..0000000 --- a/raspberryjammod/mcpipy/gf_clearZone.py +++ /dev/null @@ -1,17 +0,0 @@ -#! /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 ) diff --git a/raspberryjammod/mcpipy/gf_drawbuilding.py b/raspberryjammod/mcpipy/gf_drawbuilding.py old mode 100755 new mode 100644 diff --git a/raspberryjammod/mcpipy/glasscube.py b/raspberryjammod/mcpipy/glasscube.py old mode 100644 new mode 100755 diff --git a/raspberryjammod/mcpipy/globe.py b/raspberryjammod/mcpipy/globe.py new file mode 100644 index 0000000..ecf3ee3 --- /dev/null +++ b/raspberryjammod/mcpipy/globe.py @@ -0,0 +1,39 @@ +from mc import * + +def globe(center, radius=40, spacing_degrees=10, block=STAINED_GLASS_YELLOW): + quality = int(radius * 2*pi * 2) + + # longitude lines + longitude_degrees = 0 + while longitude_degrees < 360: + theta = longitude_degrees * 2 * pi / 360 + xmult = radius * cos(theta) + zmult = radius * sin(theta) + for i in range(quality): + phi = 2 * pi * i / quality + y = radius * sin(phi) + x = xmult * cos(phi) + z = zmult * cos(phi) + mc.setBlock(center[0]+x,center[1]+y,center[2]+z,block) + longitude_degrees += spacing_degrees + + # latitude lines + latitude_degrees = -90 + while latitude_degrees <= 90: + phi = latitude_degrees * 2 * pi / 360 + y = radius * sin(phi) + r = radius * cos(phi) + for i in range(quality): + theta = 2 * pi * i / quality + x = r * cos(theta) + z = r * sin(theta) + mc.setBlock(center[0]+x,center[1]+y,center[2]+z,block) + latitude_degrees += spacing_degrees + +if __name__ == "__main__": + mc = Minecraft() + center = mc.player.getPos() + radius = 40 + globe((center.x,center.y+radius,center.z), radius-1, 360./(2*pi*2*radius), STAINED_GLASS_BLUE) + globe((center.x,center.y+radius,center.z), radius, 10, STAINED_GLASS_YELLOW) + \ No newline at end of file diff --git a/raspberryjammod/mcpipy/grenade.py b/raspberryjammod/mcpipy/grenade.py old mode 100644 new mode 100755 index a6811a7..e5707d5 --- a/raspberryjammod/mcpipy/grenade.py +++ b/raspberryjammod/mcpipy/grenade.py @@ -1,4 +1,4 @@ -# +# # Code under the MIT license by Alexander Pruss # @@ -105,4 +105,4 @@ while True: if t > path[-1][0]: break -mc.setBlock(path[-1][1],REDSTONE_BLOCK) +mc.setBlock(path[-1][1],FIRE) diff --git a/raspberryjammod/mcpipy/helloworld.py b/raspberryjammod/mcpipy/helloworld.py index 7ac612b..b21c4fb 100644 --- a/raspberryjammod/mcpipy/helloworld.py +++ b/raspberryjammod/mcpipy/helloworld.py @@ -2,7 +2,7 @@ import mcpi.minecraft as minecraft import mcpi.block as block import server import sys -mc = minecraft.Minecraft.create(server.address) +mc = minecraft.Minecraft() mc.postToChat("Hello world!") playerPos = mc.player.getPos() mc.setBlock(playerPos.x,playerPos.y-1,playerPos.z,block.DIAMOND_ORE) diff --git a/raspberryjammod/mcpipy/hilbert.py b/raspberryjammod/mcpipy/hilbert.py old mode 100644 new mode 100755 diff --git a/raspberryjammod/mcpipy/input.py b/raspberryjammod/mcpipy/input.py new file mode 100755 index 0000000..8a34c46 --- /dev/null +++ b/raspberryjammod/mcpipy/input.py @@ -0,0 +1,148 @@ +# +# Windows-only (right now) +# Copyright (c) 2016 Alexander Pruss. MIT License +# + +from platform import system + +if system() == 'Windows': + from ctypes import windll + + LBUTTON = 1 + RBUTTON = 2 + CANCEL = 3 + MBUTTON = 4 + BACK = 8 + TAB = 9 + CLEAR = 12 + RETURN = 13 + SHIFT = 16 + CONTROL = 17 + MENU = 18 + PAUSE = 19 + CAPITAL = 20 + KANA = 21 + HANGUL = 21 + JUNJA = 23 + FINAL = 24 + HANJA = 25 + KANJI = 25 + ESCAPE = 27 + CONVERT = 28 + NONCONVERT = 29 + ACCEPT = 30 + MODECHANGE = 31 + SPACE = 32 + PRIOR = 33 + NEXT = 34 + END = 35 + HOME = 36 + LEFT = 37 + UP = 38 + RIGHT = 39 + DOWN = 40 + SELECT = 41 + PRINT = 42 + EXECUTE = 43 + SNAPSHOT = 44 + INSERT = 45 + DELETE = 46 + HELP = 47 + LWIN = 91 + RWIN = 92 + APPS = 93 + NUMPAD0 = 96 + NUMPAD1 = 97 + NUMPAD2 = 98 + NUMPAD3 = 99 + NUMPAD4 = 100 + NUMPAD5 = 101 + NUMPAD6 = 102 + NUMPAD7 = 103 + NUMPAD8 = 104 + NUMPAD9 = 105 + MULTIPLY = 106 + ADD = 107 + SEPARATOR = 108 + SUBTRACT = 109 + DECIMAL = 110 + DIVIDE = 111 + F1 = 112 + F2 = 113 + F3 = 114 + F4 = 115 + F5 = 116 + F6 = 117 + F7 = 118 + F8 = 119 + F9 = 120 + F10 = 121 + F11 = 122 + F12 = 123 + F13 = 124 + F14 = 125 + F15 = 126 + F16 = 127 + F17 = 128 + F18 = 129 + F19 = 130 + F20 = 131 + F21 = 132 + F22 = 133 + F23 = 134 + F24 = 135 + NUMLOCK = 144 + SCROLL = 145 + LSHIFT = 160 + RSHIFT = 161 + LCONTROL = 162 + RCONTROL = 163 + LMENU = 164 + RMENU = 165 + PROCESSKEY = 229 + ATTN = 246 + CRSEL = 247 + EXSEL = 248 + EREOF = 249 + PLAY = 250 + ZOOM = 251 + NONAME = 252 + PA1 = 253 + OEM_CLEAR = 254 + XBUTTON1 = 0x05 + XBUTTON2 = 0x06 + VOLUME_MUTE = 0xAD + VOLUME_DOWN = 0xAE + VOLUME_UP = 0xAF + MEDIA_NEXT_TRACK = 0xB0 + MEDIA_PREV_TRACK = 0xB1 + MEDIA_PLAY_PAUSE = 0xB3 + BROWSER_BACK = 0xA6 + BROWSER_FORWARD = 0xA7 + + def getPressState(key): + v = windll.user32.GetAsyncKeyState(int(key)) + return bool(0x8000 & v), bool(0x0001 & v) + + def isPressedNow(key): + return bool(0x8000 & windll.user32.GetAsyncKeyState(int(key))) + + def wasPressedSinceLast(key): + return bool(0x0001 & windll.user32.GetAsyncKeyState(int(key))) + + def clearPressBuffer(key): + while wasPressedSinceLast(key): + pass + +if __name__ == '__main__': + from time import sleep + print("Press ESC to exit. Testing spacebar.") + while True: + if wasPressedSinceLast(ESCAPE): + print("Done") + break + now,last = getPressState(ord(' ')) + if now or last: + print now, last + sleep(0.01) + \ No newline at end of file diff --git a/raspberryjammod/mcpipy/interpreter.py b/raspberryjammod/mcpipy/interpreter.py old mode 100644 new mode 100755 diff --git a/raspberryjammod/mcpipy/jjinux_sierpinski_triangle.py b/raspberryjammod/mcpipy/jjinux_sierpinski_triangle.py old mode 100755 new mode 100644 diff --git a/raspberryjammod/mcpipy/knot.py b/raspberryjammod/mcpipy/knot.py index 48771ea..e69b774 100644 --- a/raspberryjammod/mcpipy/knot.py +++ b/raspberryjammod/mcpipy/knot.py @@ -23,5 +23,5 @@ while t < 2*pi: z = z0+int( scale * sin(5*t) ) if (x,y,z) not in done: mc.setBlock(x,y,z,GOLD_BLOCK) - done[x,y,z] = GOLD_BLOCK + done.add((x,y,z)) t += 2*pi / 10000 diff --git a/raspberryjammod/mcpipy/lforest.py b/raspberryjammod/mcpipy/lforest.py old mode 100644 new mode 100755 diff --git a/raspberryjammod/mcpipy/lsystem.py b/raspberryjammod/mcpipy/lsystem.py old mode 100644 new mode 100755 diff --git a/raspberryjammod/mcpipy/ltree.py b/raspberryjammod/mcpipy/ltree.py old mode 100644 new mode 100755 diff --git a/raspberryjammod/mcpipy/mandelbrot.py b/raspberryjammod/mcpipy/mandelbrot.py old mode 100644 new mode 100755 diff --git a/raspberryjammod/mcpipy/mandelbulb.py b/raspberryjammod/mcpipy/mandelbulb.py old mode 100644 new mode 100755 diff --git a/raspberryjammod/mcpipy/mc.py b/raspberryjammod/mcpipy/mc.py old mode 100644 new mode 100755 diff --git a/raspberryjammod/mcpipy/mcdragoncurve.py b/raspberryjammod/mcpipy/mcdragoncurve.py old mode 100644 new mode 100755 diff --git a/raspberryjammod/mcpipy/mcpi/block.py b/raspberryjammod/mcpipy/mcpi/block.py index dd5666d..6ab2b0c 100644 --- a/raspberryjammod/mcpipy/mcpi/block.py +++ b/raspberryjammod/mcpipy/mcpi/block.py @@ -11,7 +11,10 @@ class Block: self.nbt = nbt def __eq__(self, rhs): - return self.id == rhs.id and self.data == rhs.data and self.nbt == rhs.nbt + try: + return self.id == rhs.id and self.data == rhs.data and self.nbt == rhs.nbt + except: + return self.data == 0 and self.nbt is None and self.id == rhs def __ne__(self, rhs): return not self.__eq__(rhs) diff --git a/raspberryjammod/mcpipy/mcpi/connection.py b/raspberryjammod/mcpipy/mcpi/connection.py index 1729984..299b549 100644 --- a/raspberryjammod/mcpipy/mcpi/connection.py +++ b/raspberryjammod/mcpipy/mcpi/connection.py @@ -1,9 +1,12 @@ + import socket import select import sys import atexit import os import platform +import base64 +from hashlib import md5 from util import flatten_parameters_to_string """ @author: Aron Nieminen, Mojang AB""" @@ -16,6 +19,7 @@ class Connection: RequestFailed = "Fail" def __init__(self, address=None, port=None): + self.windows = (platform.system() == "Windows" or platform.system().startswith("CYGWIN_NT")) if address==None: try: address = os.environ['MINECRAFT_API_HOST'] @@ -33,11 +37,11 @@ class Connection: self.socket.connect((address, port)) self.readFile = self.socket.makefile("r") self.lastSent = "" - if platform.system() == "Windows": + if self.windows: atexit.register(self.close) def __del__(self): - if platform.system() == "Windows": + if self.windows: self.close() try: atexit.unregister(self.close) @@ -46,13 +50,26 @@ class Connection: def close(self): try: - self.readFile.close() + if self.windows: + # ugly hack to block until all sending is completed + self.sendReceive("world.getBlock",0,0,0) except: pass try: self.socket.close() except: pass + + @staticmethod + def tohex(data): + return "".join((hex(b) for b in data)) + + def authenticate(self, username, password): + challenge = self.sendReceive("world.getBlock",0,0,0) + if challenge.startswith("security.challenge "): + salt = challenge[19:].rstrip() + auth = md5(salt+":"+username+":"+password).hexdigest() + self.send("security.authenticate", auth) def drain(self): """Drains the socket of incoming data""" diff --git a/raspberryjammod/mcpipy/mcpi/entity.py b/raspberryjammod/mcpipy/mcpi/entity.py old mode 100644 new mode 100755 diff --git a/raspberryjammod/mcpipy/mcpi/minecraft-pi-edition-LICENSE.txt b/raspberryjammod/mcpipy/mcpi/minecraft-pi-edition-LICENSE.txt old mode 100644 new mode 100755 diff --git a/raspberryjammod/mcpipy/mcpi/minecraft.py b/raspberryjammod/mcpipy/mcpi/minecraft.py index 96d141c..9759517 100644 --- a/raspberryjammod/mcpipy/mcpi/minecraft.py +++ b/raspberryjammod/mcpipy/mcpi/minecraft.py @@ -5,6 +5,7 @@ from block import Block import math from os import environ from util import flatten,floorFlatten +import security """ Minecraft PI low level api v0.1_1 @@ -185,16 +186,34 @@ class Minecraft: else: self.conn = Connection() + if security.AUTHENTICATION_USERNAME and security.AUTHENTICATION_PASSWORD: + self.conn.authenticate(security.AUTHENTICATION_USERNAME, security.AUTHENTICATION_PASSWORD) + self.camera = CmdCamera(self.conn) self.entity = CmdEntity(self.conn) + + self.playerId = None + if autoId: try: - playerId = int(environ['MINECRAFT_PLAYER_ID']) - self.player = CmdPlayer(self.conn,playerId=playerId) + self.playerId = int(environ['MINECRAFT_PLAYER_ID']) + self.player = CmdPlayer(self.conn,playerId=self.playerId) except: - self.player = CmdPlayer(self.conn) + try: + self.playerId = self.getPlayerId(environ['MINECRAFT_PLAYER_NAME']) + self.player = CmdPlayer(self.conn,playerId=self.playerId) + except: + if security.AUTHENTICATION_USERNAME: + try: + self.playerId = self.getPlayerId(security.AUTHENTICATION_USERNAME) + self.player = CmdPlayer(self.conn,playerId=self.playerId) + except: + self.player = CmdPlayer(self.conn) + else: + self.player = CmdPlayer(self.conn) else: self.player = CmdPlayer(self.conn) + self.events = CmdEvents(self.conn) self.enabledNBT = False @@ -320,7 +339,11 @@ class Minecraft: def getPlayerId(self, *args): """Get the id of the current player""" - return int(self.conn.sendReceive_flat("world.getPlayerId", floorFlatten(args))) + a = tuple(flatten(args)) + if self.playerId is not None and len(a) == 0: + return self.playerId + else: + return int(self.conn.sendReceive_flat("world.getPlayerId", flatten(args))) def getPlayerEntityIds(self): """Get the entity ids of the connected players => [id:int]""" diff --git a/raspberryjammod/mcpipy/mcpi/security.py b/raspberryjammod/mcpipy/mcpi/security.py new file mode 100644 index 0000000..2420ae1 --- /dev/null +++ b/raspberryjammod/mcpipy/mcpi/security.py @@ -0,0 +1,2 @@ +AUTHENTICATION_USERNAME=None +AUTHENTICATION_PASSWORD=None diff --git a/raspberryjammod/mcpipy/mcpi/settings.py b/raspberryjammod/mcpipy/mcpi/settings.py old mode 100644 new mode 100755 diff --git a/raspberryjammod/mcpipy/mcpipy.pyproj b/raspberryjammod/mcpipy/mcpipy.pyproj old mode 100644 new mode 100755 diff --git a/raspberryjammod/mcpipy/mcpipy.sln b/raspberryjammod/mcpipy/mcpipy.sln old mode 100644 new mode 100755 diff --git a/raspberryjammod/mcpipy/mcturtle.py b/raspberryjammod/mcpipy/mcturtle.py old mode 100644 new mode 100755 diff --git a/raspberryjammod/mcpipy/mengersponge.py b/raspberryjammod/mcpipy/mengersponge.py old mode 100644 new mode 100755 diff --git a/raspberryjammod/mcpipy/minetris.py b/raspberryjammod/mcpipy/minetris.py index 2eedf88..8595e34 100755 --- a/raspberryjammod/mcpipy/minetris.py +++ b/raspberryjammod/mcpipy/minetris.py @@ -1,190 +1,356 @@ # -# requires Windows and pywin32 +# requires Windows (for input.py to work) +# Copyright (c) 2016 Alexander Pruss. MIT License. # + +# +# Make sure to have input.py and text.py in the same directory. +# + + from mc import * from time import sleep,time from random import randint -import win32con,win32api +import input +import text +from fonts import FONTS -HEIGHT = 22 -WIDTH = 9 +FONT = 'thin9pt' #metrix7pt +HEIGHT = 20 +WIDTH = 10 BORDER = WOOL_BLACK BACKGROUND = STAINED_GLASS_BLACK +DELAYS = ( 0.5, 0.45, 0.4, 0.35, 0.3, 0.25, 0.2, 0.15, 0.1, 0.05) + PIECES = ( (('XXXX',), ('.X','.X','.X','.X')), - (('XX','XX'),), - (('XXX', '..X'), ('.X', '.X', 'XX'), ('X','XXX'), ('XX', 'X', 'X')), - (('XXX', 'X'), ('XX', '.X', '.X'), ('..X', 'XXX'), ('X.', 'X.', 'XX')), - (('XX', '.XX'), ('.X','XX', 'X.')), - (('.XX', 'XX'), ('X.', 'XX', '.X')) ) + (('XX','XX'),), + (('XXX', '..X'), ('.X', '.X', 'XX'), ('X','XXX'), ('XX', 'X', 'X')), + (('XXX', 'X'), ('XX', '.X', '.X'), ('..X', 'XXX'), ('X.', 'X.', 'XX')), + (('XX', '.XX'), ('.X','XX', 'X.')), + (('.XX', 'XX'), ('X.', 'XX', '.X')) ) +def inputMoveDown(): + return input.wasPressedSinceLast(input.DOWN) + +def inputMoveLeft(): + return input.wasPressedSinceLast(input.LEFT) + +def inputMoveRight(): + return input.wasPressedSinceLast(input.RIGHT) + +def inputRotateLeft(): + return input.wasPressedSinceLast(input.PRIOR) + +def inputRotateRight(): + return input.wasPressedSinceLast(input.NEXT) + +def inputNext(): + return input.wasPressedSinceLast(ord('N')) + +def inputLevelUp(): + return input.wasPressedSinceLast(ord('L')) + +def inputPause(): + return input.wasPressedSinceLast(ord('P')) + +def answerYes(): + input.clearPressBuffer(ord('Y')) + input.clearPressBuffer(ord('N')) + while True: + if input.wasPressedSinceLast(ord('Y')): + return True + if input.wasPressedSinceLast(ord('N')): + return False + sleep(0.1) + +def clearInput(): + for k in (input.DOWN, input.LEFT, input.RIGHT, + input.PRIOR, input.NEXT, input.UP, + ord('N'), ord('L'), ord('P'), ord('Y')): + input.clearPressBuffer(k) + def drawBoard(): - mc.setBlocks(left-1, bottom-1, plane, left+WIDTH, bottom-1, plane, BORDER) - mc.setBlocks(left-1, bottom+HEIGHT, plane, left+WIDTH, bottom+HEIGHT, plane, BORDER) - mc.setBlocks(left-1, bottom, plane, left, bottom+HEIGHT-1, plane, BORDER) - mc.setBlocks(left+WIDTH, bottom, plane, left+WIDTH, bottom+HEIGHT-1, plane, BORDER) - mc.setBlocks(left-1, bottom-1, plane-1, left+WIDTH, bottom+HEIGHT, plane-1, BACKGROUND) - mc.setBlocks(left, bottom, plane, left+WIDTH-1, bottom+HEIGHT-1, plane, AIR) - + mc.setBlocks(left-1, bottom-1, plane, left+WIDTH, bottom-1, plane, BORDER) + mc.setBlocks(left-1, bottom+HEIGHT, plane, left+WIDTH, bottom+HEIGHT, plane, BORDER) + mc.setBlocks(left-1, bottom, plane, left, bottom+HEIGHT-1, plane, BORDER) + mc.setBlocks(left+WIDTH, bottom, plane, left+WIDTH, bottom+HEIGHT-1, plane, BORDER) + mc.setBlocks(left-1, bottom-1, plane-1, left+WIDTH, bottom+HEIGHT, plane-1, BACKGROUND) + mc.setBlocks(left, bottom, plane, left+WIDTH-1, bottom+HEIGHT-1, plane, AIR) + def pieceWidth(piece): - return max((len(a) for a in piece[orientation])) - + return max((len(a) for a in piece)) + def enumeratePiece(x, y, piece): - for row in range(len(piece)): - for col in range(len(piece[row])): - if piece[row][col] == 'X': - yield (x+col,y-row) - -def erasePiece(buffer, x, y, piece): - for (xx,yy) in enumeratePiece(x,y, piece): - buffer[(left+xx,bottom+yy)] = AIR + for row in range(len(piece)): + if y-row < HEIGHT: + for col in range(len(piece[row])): + if piece[row][col] == 'X': + yield (x+col,y-row) -def drawPiece(buffer, x, y, piece, color): - for (xx,yy) in enumeratePiece(x,y, piece): - if (left+xx,bottom+yy) in buffer and buffer[(left+xx,bottom+yy)] == AIR: - del buffer[(left+xx,bottom+yy)] - else: - buffer[(left+xx,bottom+yy)] = color - +def movePiece(oldX, oldY, oldPiece, x, y, piece, color): + new = set(enumeratePiece(x, y, piece)) + if oldPiece: + old = set(enumeratePiece(oldX, oldY, oldPiece)) + + for (x,y) in old-new: + mc.setBlock(x+left, y+bottom, plane, AIR) + + new = new - old + + for (x,y) in new: + mc.setBlock(x+left, y+bottom, plane, color) + +def eraseNext(): + mc.setBlocks(left+WIDTH+2,bottom+3,plane,left+WIDTH+2+3,bottom+6,plane,AIR) + +def drawNext(): + eraseNext() + for (x,y) in enumeratePiece(WIDTH+2, 6, nextFamily[nextOrientation]): + mc.setBlock(x+left, y+bottom, plane, nextColor) + def drawBuffer(buffer): - for x,y in buffer: - mc.setBlock(x,y,plane,buffer[(x,y)]) + for x,y in buffer: + mc.setBlock(x,y,plane,buffer[(x,y)]) +def makeNext(): + global nextFamily, nextColor, nextOrientation + n = randint(0, len(PIECES)-1) + nextFamily = PIECES[n] + nextColor = Block(WOOL.id, (n+1) % 16) + nextOrientation = randint(0, len(nextFamily)-1) + def placePiece(): - global pieceNum, color, family, orientation, x, y, fall, descendDelay - pieceNum = randint(0, len(PIECES)-1) - color = Block(WOOL.id, (pieceNum+1) % 16) - family = PIECES[pieceNum] - orientation = 0 - x = WIDTH // 2 - pieceWidth(family[orientation]) - y = HEIGHT - 1 - descendDelay = currentDescendDelay - fall = False - + global color, family, orientation, descendDelay, droppedFrom, didShowNext + family = nextFamily + orientation = nextOrientation + color = nextColor + makeNext() + piece = family[orientation] + x = WIDTH // 2 - pieceWidth(piece) + y = HEIGHT + len(piece) - 2 + descendDelay = currentDescendDelay + droppedFrom = None + didShowNext = showNext + if showNext: + drawNext() + return (x,y) + def fit(x, y, piece): - for (xx,yy) in enumeratePiece(x, y, piece): - if yy >= HEIGHT or yy < 0 or xx >= WIDTH or xx < 0 or board[xx][yy] is not None: - return False - return True - - + for (xx,yy) in enumeratePiece(x, y, piece): + if yy < 0 or xx >= WIDTH or xx < 0 or board[xx][yy] is not None: + return False + return True + def descend(): - global descendTimer - if descendTimer + descendDelay <= time(): - descendTimer += descendDelay - return True - return False - -def moveDown(): - return (win32api.GetAsyncKeyState(win32con.VK_DOWN)&1) - -def moveLeft(): - return (win32api.GetAsyncKeyState(win32con.VK_LEFT)&1) - -def moveRight(): - return (win32api.GetAsyncKeyState(win32con.VK_RIGHT)&1) + global descendTimer + if descendTimer + descendDelay <= time(): + descendTimer += descendDelay + return True + return False -def rotateLeft(): - return (win32api.GetAsyncKeyState(win32con.VK_PRIOR)&1) - -def rotateRight(): - return (win32api.GetAsyncKeyState(win32con.VK_NEXT)&1) or (win32api.GetAsyncKeyState(win32con.VK_UP)&1) - +def hide(): + mc.setBlocks(left, bottom, plane, left+WIDTH-1, bottom+HEIGHT-1, plane, GLASS) + text.drawText(mc, FONTS['nicefontbold'], + Vec3(left+WIDTH//2,bottom+5,plane), + Vec3(1,0,0), Vec3(0,1,0), + "P", SEA_LANTERN, align=text.ALIGN_CENTER) + + +def restore(x, y): + for xx in range(WIDTH): + for yy in range(HEIGHT): + mc.setBlock(xx+left,yy+bottom,plane,board[xx][yy] or AIR) + movePiece(None, None, None, x, y, family[orientation], color) + def addPiece(x, y, piece, color): - for (xx,yy) in enumeratePiece(x, y, piece): - board[xx][yy] = color - while True: - foundRow = False - for y in range(HEIGHT): - full = True - for x in range(WIDTH): - if board[x][y] is None: - full = False - break - if full: - foundRow = True - for y2 in range(y, HEIGHT-1): - for x in range(WIDTH): - b = board[x][y2+1] - board[x][y2] = b - mc.setBlock(left+x,bottom+y2,plane,b if b is not None else AIR) - for x in range(WIDTH): - board[x][HEIGHT-1] = None - mc.setBlock(left+x,bottom+HEIGHT-1,plane,AIR) - - if not foundRow: - break + global score,level,totalDropped + + for (xx,yy) in enumeratePiece(x, y, piece): + board[xx][yy] = color + + dropCount = 0 + while True: + foundRow = False + for y in range(HEIGHT): + full = True + for x in range(WIDTH): + if board[x][y] is None: + full = False + break + if full: + dropCount += 1 + foundRow = True + for y2 in range(y, HEIGHT-1): + for x in range(WIDTH): + b = board[x][y2+1] + board[x][y2] = b + mc.setBlock(left+x,bottom+y2,plane,b if b is not None else AIR) + for x in range(WIDTH): + board[x][HEIGHT-1] = None + mc.setBlock(left+x,bottom+HEIGHT-1,plane,AIR) + + if not foundRow: + break + + if didShowNext: + score += 3 + (3*(level-1))//2 + droppedFrom + else: + score += 5 + 2*(level-1) + droppedFrom + if dropCount: + totalDropped += dropCount + level = 1 + totalDropped // 10 + extraLevels + updateScoreAndLevel() +def updateText(buffer,x,y,s,align): + newBuffer = {} + if s is not None: + text.drawText(mc, FONTS['thin9pt'], + Vec3(x,y,plane), + Vec3(1,0,0), Vec3(0,1,0), + s, SEA_LANTERN, background=None, align=align, buffer=newBuffer) + for pos in buffer: + if pos not in newBuffer: + mc.setBlock(pos, AIR) + for pos in newBuffer: + if pos not in buffer: + mc.setBlock(pos, SEA_LANTERN) + return newBuffer + +def updateScoreAndLevel(): + global scoreBuffer, levelBuffer, currentDescendDelay, level + if level > 10: + level = 10 + scoreBuffer = updateText(scoreBuffer,left+WIDTH+2,bottom+HEIGHT-10,str(score),text.ALIGN_LEFT) + levelBuffer = updateText(levelBuffer,left-1,bottom+HEIGHT-10,str(level),text.ALIGN_RIGHT) + currentDescendDelay = DELAYS[level-1] +def clearScoreAndLevel(): + global scoreBuffer, levelBuffer, currentDescendDelay, level + scoreBuffer = updateText(scoreBuffer,left+WIDTH+2,bottom+HEIGHT-10,None,text.ALIGN_LEFT) + levelBuffer = updateText(levelBuffer,left-1,bottom+HEIGHT-10,None,text.ALIGN_RIGHT) + +def game(): + global score, level, extraLevels, totalDropped, scoreBuffer, levelBuffer, showNext, didShowNext + global orientation, board, descendTimer, droppedFrom, descendDelay + + board = [[None for i in range(HEIGHT)] for j in range(WIDTH)] + + drawBoard() + score = 0 + level = 1 + extraLevels = 0 + totalDropped = 0 + scoreBuffer = {} + levelBuffer = {} + showNext = False + updateScoreAndLevel() + makeNext() + + newPiece = True + + while True: + if newPiece: + x,y = placePiece() + oldPiece = None + if not fit(x, y, family[orientation]): + break + draw = True + newPiece = False + fall = False + clearInput() + descendTimer = time() + else: + oldPiece = family[orientation] + draw = False + oldX = x + oldY = y + + if inputPause(): + t0 = time() + hide() + while not inputPause(): + sleep(0.025) + clearInput() + restore(x, y) + descendTimer += time() - t0 + + if not fall: + if inputLevelUp(): + extraLevels += 1 + level += 1 + updateScoreAndLevel() + descendDelay = currentDescendDelay + + if inputMoveLeft() and fit(x-1, y, family[orientation]): + x -= 1 + draw = True + + if inputMoveRight() and fit(x+1, y, family[orientation]): + x += 1 + draw = True + + if inputRotateLeft() and fit(x, y, family[(orientation-1)%len(family)]): + orientation = (orientation-1)%len(family) + draw = True + + if inputRotateRight() and fit(x, y, family[(orientation+1)%len(family)]): + orientation = (orientation+1)%len(family) + draw = True + + if inputMoveDown(): + fall = True + droppedFrom = y+1-len(family[orientation]) + descendDelay = 0.05 + + if inputNext(): + showNext = not showNext + if showNext: + didShowNext = True + drawNext() + else: + eraseNext() + + if descend(): + if not fit(x, y-1, family[orientation]): + if droppedFrom is None: + droppedFrom = y+1-len(family[orientation]) + addPiece(x, y, family[orientation], color) + newPiece = True + else: + draw = True + y -= 1 + + if draw: + movePiece(oldX, oldY, oldPiece, x, y, family[orientation], color) + + sleep(0.025) + + return score + mc = Minecraft() +mc.postToChat("Left/Right arrow: move") +mc.postToChat("Up: rotate right") +mc.postToChat("PageUp/PageDown: rotate left/right") +mc.postToChat("N: toggle view next") +mc.postToChat("P: pause") +mc.postToChat("L: next level") + playerPos = mc.player.getTilePos() mc.player.setRotation(180) -mc.player.setPitch(-30) -mc.player.setTilePos(playerPos.x, playerPos.y, playerPos.z + 10) +mc.player.setPitch(-26) +mc.player.setTilePos(playerPos.x, playerPos.y, playerPos.z + 14) + left = playerPos.x - WIDTH // 2 plane = playerPos.z bottom = playerPos.y + 1 -board = [[None for i in range(HEIGHT)] for j in range(WIDTH)] -currentDescendDelay = 0.5 - -drawBoard() - -newPiece = True while True: - if newPiece: - placePiece() - oldPiece = None - if not fit(x, y, family[orientation]): - mc.postToChat("Doesn't fit: End of game") - print "no fit" - break - draw = True - newPiece = False - descendTimer = time() - else: - oldPiece = family[orientation] - draw = False - oldX = x - oldY = y - - if not fall: - if moveLeft() and fit(x-1, y, family[orientation]): - x -= 1 - draw = True - - if moveRight() and fit(x+1, y, family[orientation]): - x += 1 - draw = True - - if rotateLeft() and fit(x, y, family[(orientation-1)%len(family)]): - orientation = (orientation-1)%len(family) - draw = True - - if rotateRight() and fit(x, y, family[(orientation+1)%len(family)]): - orientation = (orientation+1)%len(family) - draw = True - - if moveDown(): - fall = True - descendDelay = 0.05 - - if descend(): - if not fit(x, y-1, family[orientation]): - addPiece(x, y, family[orientation], color) - newPiece = True - else: - draw = True - y -= 1 - - if draw: - buffer = {} - if oldPiece: - erasePiece(buffer, oldX, oldY, oldPiece) - drawPiece(buffer, x, y, family[orientation], color) - drawBuffer(buffer) - - sleep(0.1) - -print "done" + s = game() + mc.postToChat("Game Over: You got %d points" % s) + mc.postToChat("Play again? (Y/N)") + if not answerYes(): + mc.postToChat("Goodbye!") + break + clearScoreAndLevel() \ No newline at end of file diff --git a/raspberryjammod/mcpipy/models/dragon.txt b/raspberryjammod/mcpipy/models/dragon.txt old mode 100644 new mode 100755 diff --git a/raspberryjammod/mcpipy/models/knight.txt b/raspberryjammod/mcpipy/models/knight.txt new file mode 100644 index 0000000..68a4089 --- /dev/null +++ b/raspberryjammod/mcpipy/models/knight.txt @@ -0,0 +1,17 @@ +file 'knight.stl' +swapyz 1 +urlgz https://raw.githubusercontent.com/arpruss/raspberryjammod/master/models/knight.stl.gz +credits Knight from Chess - Classic Set by SteedMaker. CC Attribution Share Alike 3.0 +yaw 0 +pitch 0 +roll 0 +size 100 +default STAINED_GLASS_BLUE +#order material position +materials +end + +Knight from Chess - Classic Set by SteedMaker. +http://www.thingiverse.com/thing:34017 +licensed under the Creative Commons - Attribution - Share Alike license 3.0 +http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/raspberryjammod/mcpipy/nt7s_sphere.py b/raspberryjammod/mcpipy/nt7s_sphere.py old mode 100755 new mode 100644 diff --git a/raspberryjammod/mcpipy/obsidz_teleport.py b/raspberryjammod/mcpipy/obsidz_teleport.py deleted file mode 100755 index 7ec7910..0000000 --- a/raspberryjammod/mcpipy/obsidz_teleport.py +++ /dev/null @@ -1,86 +0,0 @@ -#!/usr/bin/env python - -import mcpi.minecraft as minecraft -import mcpi.block as block -import time -import server - - -#Author: Obsidz -# -#Description: This is a teleport pad script. -# To create a pad, place a nether reactor core onto a location and ring with cobbledtone blocks -# To add to locations list walk over it -# -#Notes: Pads added to list by walking over them -# Pads not removed if destroyed but can be teleported to but not from -# You cannot teleport to the same pad without modifying script -# Pads need to be added each time the script is run - -# modified version - as shared on mcpipy.com -# original post @ http://www.minecraftforum.net/topic/1691618-teleportation-python-script/ - -LPLoc = list() - -Pads = 0 -Cpad = 0 - -# If you are running this script with the bukkit mod, then use a diamond block as the magic center block for teleporting -# comment/uncomment below as appropriate -magic_block = block.DIAMOND_BLOCK.id # for bukkit server -#magic_block = block.NETHER_REACTOR_CORE.id # for raspberry pi - -def isLaunchPad(): #checks if the the location below the player is a teleporting pad - loc = mc.player.getPos() - if ((mc.getBlock(loc.x,loc.y-1,loc.z) == magic_block) and - (mc.getBlock(loc.x-1,loc.y-1,loc.z-1) == block.COBBLESTONE.id) and - (mc.getBlock(loc.x-1,loc.y-1,loc.z) == block.COBBLESTONE.id) and - (mc.getBlock(loc.x-1,loc.y-1,loc.z+1) == block.COBBLESTONE.id) and - (mc.getBlock(loc.x,loc.y-1,loc.z+1) == block.COBBLESTONE.id) and - (mc.getBlock(loc.x,loc.y-1,loc.z-1) == block.COBBLESTONE.id) and - (mc.getBlock(loc.x+1,loc.y-1,loc.z-1) == block.COBBLESTONE.id) and - (mc.getBlock(loc.x+1,loc.y-1,loc.z) == block.COBBLESTONE.id) and - (mc.getBlock(loc.x+1,loc.y-1,loc.z+1) == block.COBBLESTONE.id)): - addLPLoc(loc) - return True - else: - return False -def addLPLoc(Vec3): #Loggs the location of the pad for future use - global Pads - global LPLoc - - inList = False - if Pads > 0: - for loc in LPLoc: - if (loc.x == Vec3.x and loc.y == Vec3.y and loc.z == Vec3.z): - inList = True - - if not inList: - LPLoc.append(Vec3) - mc.postToChat("I'll remember this pad location!") - Pads = len(LPLoc) -def locCheck(): #Checks that you are not teleporting to the same pad - - global Cpad - global LPLoc - loc = mc.player.getPos() - if (loc.x == LPLoc[Cpad].x and loc.y == LPLoc[Cpad].y and loc.z == LPLoc[Cpad].z): - Cpad = Cpad + 1 -def TPChar(): #sends the character to the next pad - global Pads - global Cpad - global LPLoc - - if Pads > 1: - mc.player.setPos(LPLoc[Cpad].x,LPLoc[Cpad].y + 1,LPLoc[Cpad].z) - Cpad = ( Cpad + 1) % Pads - time.sleep(3.0) - -if __name__ == "__main__": # The script - - mc = minecraft.Minecraft.create(server.address) - while True: - if isLaunchPad(): - TPChar() - - time.sleep(0.1) \ No newline at end of file diff --git a/raspberryjammod/mcpipy/ovalegg.png b/raspberryjammod/mcpipy/ovalegg.png new file mode 100644 index 0000000..684642e Binary files /dev/null and b/raspberryjammod/mcpipy/ovalegg.png differ diff --git a/raspberryjammod/mcpipy/polyhedron.py b/raspberryjammod/mcpipy/polyhedron.py old mode 100644 new mode 100755 diff --git a/raspberryjammod/mcpipy/randomnodes.py b/raspberryjammod/mcpipy/randomnodes.py deleted file mode 100755 index 02867ec..0000000 --- a/raspberryjammod/mcpipy/randomnodes.py +++ /dev/null @@ -1,12 +0,0 @@ -from mc import * -from random import choice,randint - -mc = Minecraft() -nodes = mc.conn.sendReceive("world.getAllNodes").split("|") -pos = mc.player.getTilePos() - -for i in range(1000): - n = choice(nodes) - if "lava" in n or "fire" in n or "water" in n: continue - mc.conn.send("world.setNode", pos.x+randint(0,29), pos.y+randint(0,29), - pos.z+randint(0,29), n) \ No newline at end of file diff --git a/raspberryjammod/mcpipy/render.py b/raspberryjammod/mcpipy/render.py old mode 100644 new mode 100755 index 496e965..d3c542e --- a/raspberryjammod/mcpipy/render.py +++ b/raspberryjammod/mcpipy/render.py @@ -1,3 +1,4 @@ + #www.stuffaboutcode.com #Raspberry Pi, Minecraft - Create 3D Model from Obj file # Version 2 - draws complete faces rather than wireframes and uses materials @@ -24,7 +25,6 @@ SOFTWARE. """ from zipfile import ZipFile -from StringIO import StringIO import sys import urllib2 import struct @@ -47,51 +47,51 @@ import re IDENTITY44 = ((1.,0.,0.,0.),(0.,1.,0.,0.),(0.,0.,1.,0.),(0.,0.,0.,1.)) def determinant44(m): - inv00=m[1][1]*m[2][2]*m[3][3]-m[1][1]*m[3][2]*m[2][3]-m[1][2]*m[2][1]*m[3][3]+m[1][2]*m[3][1]*m[2][3]+m[1][3]*m[2][1]*m[3][2]-m[1][3]*m[3][1]*m[2][2] - inv01=-m[0][1]*m[2][2]*m[3][3]+m[0][1]*m[3][2]*m[2][3]+m[0][2]*m[2][1]*m[3][3]-m[0][2]*m[3][1]*m[2][3]-m[0][3]*m[2][1]*m[3][2]+m[0][3]*m[3][1]*m[2][2] - inv02=m[0][1]*m[1][2]*m[3][3]-m[0][1]*m[3][2]*m[1][3]-m[0][2]*m[1][1]*m[3][3]+m[0][2]*m[3][1]*m[1][3]+m[0][3]*m[1][1]*m[3][2]-m[0][3]*m[3][1]*m[1][2] - inv03=-m[0][1]*m[1][2]*m[2][3]+m[0][1]*m[2][2]*m[1][3]+m[0][2]*m[1][1]*m[2][3]-m[0][2]*m[2][1]*m[1][3]-m[0][3]*m[1][1]*m[2][2]+m[0][3]*m[2][1]*m[1][2] - return m[0][0]*inv00 + m[1][0]*inv01 + m[2][0]*inv02 + m[3][0]*inv03 + inv00 = m[1][1] * m[2][2] * m[3][3] - m[1][1] * m[3][2] * m[2][3] - m[1][2] * m[2][1] * m[3][3] + m[1][2] * m[3][1] * m[2][3] + m[1][3] * m[2][1] * m[3][2] - m[1][3] * m[3][1] * m[2][2] + inv01 = -m[0][1] * m[2][2] * m[3][3] + m[0][1] * m[3][2] * m[2][3] + m[0][2] * m[2][1] * m[3][3] - m[0][2] * m[3][1] * m[2][3] - m[0][3] * m[2][1] * m[3][2] + m[0][3] * m[3][1] * m[2][2] + inv02 = m[0][1] * m[1][2] * m[3][3] - m[0][1] * m[3][2] * m[1][3] - m[0][2] * m[1][1] * m[3][3] + m[0][2] * m[3][1] * m[1][3] + m[0][3] * m[1][1] * m[3][2] - m[0][3] * m[3][1] * m[1][2] + inv03 = -m[0][1] * m[1][2] * m[2][3] + m[0][1] * m[2][2] * m[1][3] + m[0][2] * m[1][1] * m[2][3] - m[0][2] * m[2][1] * m[1][3] - m[0][3] * m[1][1] * m[2][2] + m[0][3] * m[2][1] * m[1][2] + return m[0][0] * inv00 + m[1][0] * inv01 + m[2][0] * inv02 + m[3][0] * inv03 def invertMatrix44(m): inv = [[0 for i in range(4)] for j in range(4)] - inv[0][0]=m[1][1]*m[2][2]*m[3][3]-m[1][1]*m[3][2]*m[2][3]-m[1][2]*m[2][1]*m[3][3]+m[1][2]*m[3][1]*m[2][3]+m[1][3]*m[2][1]*m[3][2]-m[1][3]*m[3][1]*m[2][2] - inv[0][1]=-m[0][1]*m[2][2]*m[3][3]+m[0][1]*m[3][2]*m[2][3]+m[0][2]*m[2][1]*m[3][3]-m[0][2]*m[3][1]*m[2][3]-m[0][3]*m[2][1]*m[3][2]+m[0][3]*m[3][1]*m[2][2] - inv[0][2]=m[0][1]*m[1][2]*m[3][3]-m[0][1]*m[3][2]*m[1][3]-m[0][2]*m[1][1]*m[3][3]+m[0][2]*m[3][1]*m[1][3]+m[0][3]*m[1][1]*m[3][2]-m[0][3]*m[3][1]*m[1][2] - inv[0][3]=-m[0][1]*m[1][2]*m[2][3]+m[0][1]*m[2][2]*m[1][3]+m[0][2]*m[1][1]*m[2][3]-m[0][2]*m[2][1]*m[1][3]-m[0][3]*m[1][1]*m[2][2]+m[0][3]*m[2][1]*m[1][2] + inv[0][0] = m[1][1] * m[2][2] * m[3][3] - m[1][1] * m[3][2] * m[2][3] - m[1][2] * m[2][1] * m[3][3] + m[1][2] * m[3][1] * m[2][3] + m[1][3] * m[2][1] * m[3][2] - m[1][3] * m[3][1] * m[2][2] + inv[0][1] = -m[0][1] * m[2][2] * m[3][3] + m[0][1] * m[3][2] * m[2][3] + m[0][2] * m[2][1] * m[3][3] - m[0][2] * m[3][1] * m[2][3] - m[0][3] * m[2][1] * m[3][2] + m[0][3] * m[3][1] * m[2][2] + inv[0][2] = m[0][1] * m[1][2] * m[3][3] - m[0][1] * m[3][2] * m[1][3] - m[0][2] * m[1][1] * m[3][3] + m[0][2] * m[3][1] * m[1][3] + m[0][3] * m[1][1] * m[3][2] - m[0][3] * m[3][1] * m[1][2] + inv[0][3] = -m[0][1] * m[1][2] * m[2][3] + m[0][1] * m[2][2] * m[1][3] + m[0][2] * m[1][1] * m[2][3] - m[0][2] * m[2][1] * m[1][3] - m[0][3] * m[1][1] * m[2][2] + m[0][3] * m[2][1] * m[1][2] - inv[1][0]=-m[1][0]*m[2][2]*m[3][3]+m[1][0]*m[3][2]*m[2][3]+m[1][2]*m[2][0]*m[3][3]-m[1][2]*m[3][0]*m[2][3]-m[1][3]*m[2][0]*m[3][2]+m[1][3]*m[3][0]*m[2][2] - inv[1][1]=m[0][0]*m[2][2]*m[3][3]-m[0][0]*m[3][2]*m[2][3]-m[0][2]*m[2][0]*m[3][3]+m[0][2]*m[3][0]*m[2][3]+m[0][3]*m[2][0]*m[3][2]-m[0][3]*m[3][0]*m[2][2] - inv[1][2]=-m[0][0]*m[1][2]*m[3][3]+m[0][0]*m[3][2]*m[1][3]+m[0][2]*m[1][0]*m[3][3]-m[0][2]*m[3][0]*m[1][3]-m[0][3]*m[1][0]*m[3][2]+m[0][3]*m[3][0]*m[1][2] - inv[1][3]=m[0][0]*m[1][2]*m[2][3]-m[0][0]*m[2][2]*m[1][3]-m[0][2]*m[1][0]*m[2][3]+m[0][2]*m[2][0]*m[1][3]+m[0][3]*m[1][0]*m[2][2]-m[0][3]*m[2][0]*m[1][2] + inv[1][0] = -m[1][0] * m[2][2] * m[3][3] + m[1][0] * m[3][2] * m[2][3] + m[1][2] * m[2][0] * m[3][3] - m[1][2] * m[3][0] * m[2][3] - m[1][3] * m[2][0] * m[3][2] + m[1][3] * m[3][0] * m[2][2] + inv[1][1] = m[0][0] * m[2][2] * m[3][3] - m[0][0] * m[3][2] * m[2][3] - m[0][2] * m[2][0] * m[3][3] + m[0][2] * m[3][0] * m[2][3] + m[0][3] * m[2][0] * m[3][2] - m[0][3] * m[3][0] * m[2][2] + inv[1][2] = -m[0][0] * m[1][2] * m[3][3] + m[0][0] * m[3][2] * m[1][3] + m[0][2] * m[1][0] * m[3][3] - m[0][2] * m[3][0] * m[1][3] - m[0][3] * m[1][0] * m[3][2] + m[0][3] * m[3][0] * m[1][2] + inv[1][3] = m[0][0] * m[1][2] * m[2][3] - m[0][0] * m[2][2] * m[1][3] - m[0][2] * m[1][0] * m[2][3] + m[0][2] * m[2][0] * m[1][3] + m[0][3] * m[1][0] * m[2][2] - m[0][3] * m[2][0] * m[1][2] - inv[2][0]=m[1][0]*m[2][1]*m[3][3]-m[1][0]*m[3][1]*m[2][3]-m[1][1]*m[2][0]*m[3][3]+m[1][1]*m[3][0]*m[2][3]+m[1][3]*m[2][0]*m[3][1]-m[1][3]*m[3][0]*m[2][1] - inv[2][1]=-m[0][0]*m[2][1]*m[3][3]+m[0][0]*m[3][1]*m[2][3]+m[0][1]*m[2][0]*m[3][3]-m[0][1]*m[3][0]*m[2][3]-m[0][3]*m[2][0]*m[3][1]+m[0][3]*m[3][0]*m[2][1] - inv[2][2]=m[0][0]*m[1][1]*m[3][3]-m[0][0]*m[3][1]*m[1][3]-m[0][1]*m[1][0]*m[3][3]+m[0][1]*m[3][0]*m[1][3]+m[0][3]*m[1][0]*m[3][1]-m[0][3]*m[3][0]*m[1][1] - inv[2][3]=-m[0][0]*m[1][1]*m[2][3]+m[0][0]*m[2][1]*m[1][3]+m[0][1]*m[1][0]*m[2][3]-m[0][1]*m[2][0]*m[1][3]-m[0][3]*m[1][0]*m[2][1]+m[0][3]*m[2][0]*m[1][1] + inv[2][0] = m[1][0] * m[2][1] * m[3][3] - m[1][0] * m[3][1] * m[2][3] - m[1][1] * m[2][0] * m[3][3] + m[1][1] * m[3][0] * m[2][3] + m[1][3] * m[2][0] * m[3][1] - m[1][3] * m[3][0] * m[2][1] + inv[2][1] = -m[0][0] * m[2][1] * m[3][3] + m[0][0] * m[3][1] * m[2][3] + m[0][1] * m[2][0] * m[3][3] - m[0][1] * m[3][0] * m[2][3] - m[0][3] * m[2][0] * m[3][1] + m[0][3] * m[3][0] * m[2][1] + inv[2][2] = m[0][0] * m[1][1] * m[3][3] - m[0][0] * m[3][1] * m[1][3] - m[0][1] * m[1][0] * m[3][3] + m[0][1] * m[3][0] * m[1][3] + m[0][3] * m[1][0] * m[3][1] - m[0][3] * m[3][0] * m[1][1] + inv[2][3] = -m[0][0] * m[1][1] * m[2][3] + m[0][0] * m[2][1] * m[1][3] + m[0][1] * m[1][0] * m[2][3] - m[0][1] * m[2][0] * m[1][3] - m[0][3] * m[1][0] * m[2][1] + m[0][3] * m[2][0] * m[1][1] - inv[3][0]=-m[1][0]*m[2][1]*m[3][2]+m[1][0]*m[3][1]*m[2][2]+m[1][1]*m[2][0]*m[3][2]-m[1][1]*m[3][0]*m[2][2]-m[1][2]*m[2][0]*m[3][1]+m[1][2]*m[3][0]*m[2][1] - inv[3][1]=m[0][0]*m[2][1]*m[3][2]-m[0][0]*m[3][1]*m[2][2]-m[0][1]*m[2][0]*m[3][2]+m[0][1]*m[3][0]*m[2][2]+m[0][2]*m[2][0]*m[3][1]-m[0][2]*m[3][0]*m[2][1] - inv[3][2]=-m[0][0]*m[1][1]*m[3][2]+m[0][0]*m[3][1]*m[1][2]+m[0][1]*m[1][0]*m[3][2]-m[0][1]*m[3][0]*m[1][2]-m[0][2]*m[1][0]*m[3][1]+m[0][2]*m[3][0]*m[1][1] - inv[3][3]=m[0][0]*m[1][1]*m[2][2]-m[0][0]*m[2][1]*m[1][2]-m[0][1]*m[1][0]*m[2][2]+m[0][1]*m[2][0]*m[1][2]+m[0][2]*m[1][0]*m[2][1]-m[0][2]*m[2][0]*m[1][1] + inv[3][0] = -m[1][0] * m[2][1] * m[3][2] + m[1][0] * m[3][1] * m[2][2] + m[1][1] * m[2][0] * m[3][2] - m[1][1] * m[3][0] * m[2][2] - m[1][2] * m[2][0] * m[3][1] + m[1][2] * m[3][0] * m[2][1] + inv[3][1] = m[0][0] * m[2][1] * m[3][2] - m[0][0] * m[3][1] * m[2][2] - m[0][1] * m[2][0] * m[3][2] + m[0][1] * m[3][0] * m[2][2] + m[0][2] * m[2][0] * m[3][1] - m[0][2] * m[3][0] * m[2][1] + inv[3][2] = -m[0][0] * m[1][1] * m[3][2] + m[0][0] * m[3][1] * m[1][2] + m[0][1] * m[1][0] * m[3][2] - m[0][1] * m[3][0] * m[1][2] - m[0][2] * m[1][0] * m[3][1] + m[0][2] * m[3][0] * m[1][1] + inv[3][3] = m[0][0] * m[1][1] * m[2][2] - m[0][0] * m[2][1] * m[1][2] - m[0][1] * m[1][0] * m[2][2] + m[0][1] * m[2][0] * m[1][2] + m[0][2] * m[1][0] * m[2][1] - m[0][2] * m[2][0] * m[1][1] - invdet = 1./ (m[0][0]*inv[0][0] + m[1][0]*inv[0][1] + m[2][0]*inv[0][2] + m[3][0]*inv[0][3]) + invdet = 1. / (m[0][0] * inv[0][0] + m[1][0] * inv[0][1] + m[2][0] * inv[0][2] + m[3][0] * inv[0][3]) for i in range(4): for j in range(4): inv[i][j] = invdet * inv[i][j] return inv def mulMatrix44(a,b): - return tuple( tuple(a[i][0]*b[0][j]+a[i][1]*b[1][j]+a[i][2]*b[2][j]+a[i][3]*b[3][j] for j in xrange(4)) for i in xrange(4) ) + return tuple(tuple(a[i][0] * b[0][j] + a[i][1] * b[1][j] + a[i][2] * b[2][j] + a[i][3] * b[3][j] for j in xrange(4)) for i in xrange(4)) def applyMatrix44(a,v): if a is None: return v - return V3(a[i][0]*v[0]+a[i][1]*v[1]+a[i][2]*v[2]+a[i][3] for i in range(3)) + return V3(a[i][0] * v[0] + a[i][1] * v[1] + a[i][2] * v[2] + a[i][3] for i in range(3)) def translMatrix44(v): - return tuple( tuple((IDENTITY44[i][j] if j < 3 or i == 3 else v[i]) for j in range(4)) for i in range(4)) + return tuple(tuple((IDENTITY44[i][j] if j < 3 or i == 3 else v[i]) for j in range(4)) for i in range(4)) def safeEval(p): if '__' in p: @@ -109,7 +109,7 @@ def parseBlock(data,default): b = copy(start) else: b.id = int(start) - if len(tokens)>1: + if len(tokens) > 1: b.data = int(eval(tokens[1])) return Block(b.id,b.data) @@ -122,6 +122,33 @@ class MeshFile(object): self.objectData = {} self.objects = [] +class MeshSTLBinary(MeshFile): + def __init__(self, filename, myopen=open, swapYZ=False): + super(MeshSTLBinary,self).__init__() + + with myopen(filename, "rb") as f: + header = f.read(80) + assert not header.startswith("solid") + assert len(header) == 80 + + vertexCount = 0 + + numTriangles = struct.unpack("=3 and args[0]=='element': + if len(args) >= 3 and args[0] == 'element': elementCounts.append((args[1],int(args[2]))) assert len(elementCounts) >= 2 for element,count in elementCounts: @@ -333,8 +360,8 @@ class Mesh3DS(MeshFile): self.skip(lengthRemaining) def handle_KEYF_PIVOT(self,lengthRemaining): - self.object_pivot = V3(struct.unpack(" 0: @@ -403,7 +430,7 @@ class Mesh3DS(MeshFile): lengthRemaining -= chunkLength - 6 def handle_TRI_LOCAL(self,lengthRemaining): - m = [ [1,0,0,0], [0,1,0,0], [0,0,1,0], [0,0,0,1] ] + m = [[1,0,0,0], [0,1,0,0], [0,0,1,0], [0,0,0,1]] for i in xrange(4): for j in xrange(3): m[j][i] = struct.unpack(" maximum[i]: maximum[i] = vertex[i] - center = [(maximum[i] + minimum[i])/2 for i in range(3)] + center = [(maximum[i] + minimum[i]) / 2 for i in range(3)] - maxsize = max( ( maximum[i]-minimum[i] for i in range(3) ) ) + maxsize = max(( maximum[i] - minimum[i] for i in range(3) )) scale = self.size / maxsize - translate = V3(bottomCenter.x-scale*center[0], bottomCenter.y-scale*minimum[1], bottomCenter.z-scale*center[2]) + translate = V3(bottomCenter.x - scale * center[0], bottomCenter.y - scale * minimum[1], bottomCenter.z - scale * center[2]) for i in range(len(self.vertices)): self.vertices[i] = self.vertices[i] * scale + translate @@ -801,12 +835,12 @@ def go(filename, args=[]): # main program if __name__ == "__main__": - if len(sys.argv)<2: + if len(sys.argv) < 2: if settings.isPE: go("models/RaspberryPi.txt") else: - from Tkinter import * from tkFileDialog import askopenfilename + from Tkinter import * master = Tk() master.wm_title("render") master.attributes("-topmost", True) @@ -835,7 +869,7 @@ if __name__ == "__main__": c.select() def selectFileAndGo(): - name=askopenfilename(initialdir='models',filetypes=['controlfile {*.txt}']) + name = askopenfilename(initialdir='models',filetypes=['controlfile {*.txt}', 'all {*}']) if name: options = '-' if not clearing: diff --git a/raspberryjammod/mcpipy/sierpinski3d.py b/raspberryjammod/mcpipy/sierpinski3d.py old mode 100644 new mode 100755 diff --git a/raspberryjammod/mcpipy/simplefractaltree.py b/raspberryjammod/mcpipy/simplefractaltree.py old mode 100644 new mode 100755 diff --git a/raspberryjammod/mcpipy/simpletree.py b/raspberryjammod/mcpipy/simpletree.py old mode 100644 new mode 100755 diff --git a/raspberryjammod/mcpipy/snowbound_flatmap.py b/raspberryjammod/mcpipy/snowbound_flatmap.py deleted file mode 100755 index fcce183..0000000 --- a/raspberryjammod/mcpipy/snowbound_flatmap.py +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/env python - - -# mcpipy.com retrieved from URL below, written by snowbound -# http://www.minecraftforum.net/topic/1680160-simple-flatmap-script/ - - -import sys -import mcpi.minecraft as minecraft -import mcpi.block as block -import server - - -mc = minecraft.Minecraft.create(server.address) -mc.setBlocks(-128,0,-128,128,64,128,0) -if(len(sys.argv) > 1): - bid = int(sys.argv[1]) -else: - bid = block.SANDSTONE.id - -if bid < 0 or bid > 108: - bid = block.SANDSTONE.id - -mc.setBlocks(-128,0,-128,128,-64,128,bid) diff --git a/raspberryjammod/mcpipy/snowflake.py b/raspberryjammod/mcpipy/snowflake.py old mode 100644 new mode 100755 diff --git a/raspberryjammod/mcpipy/spacefill.py b/raspberryjammod/mcpipy/spacefill.py old mode 100644 new mode 100755 diff --git a/raspberryjammod/mcpipy/spiral.py b/raspberryjammod/mcpipy/spiral.py old mode 100755 new mode 100644 index e20f526..f988e7a --- a/raspberryjammod/mcpipy/spiral.py +++ b/raspberryjammod/mcpipy/spiral.py @@ -8,7 +8,7 @@ import math def draw_horizontal_disc(cx, cy, cz, radius, block_type, meta): for x in range(-radius, radius): for z in range(-radius, radius): - if (x**2 + z**2 <= radius): + if (x**2 + z**2 <= radius**2): mc.setBlock(cx + x, cy, cz + z, block_type, meta) def draw_spiral(mcx,mcy,mcz,major_radius,minor_radius,height,period,phase,block_type,meta): diff --git a/raspberryjammod/mcpipy/squarecurve.py b/raspberryjammod/mcpipy/squarecurve.py old mode 100644 new mode 100755 diff --git a/raspberryjammod/mcpipy/stuffaboutcode_basics.py b/raspberryjammod/mcpipy/stuffaboutcode_basics.py old mode 100755 new mode 100644 diff --git a/raspberryjammod/mcpipy/stuffaboutcode_bridge.py b/raspberryjammod/mcpipy/stuffaboutcode_bridge.py old mode 100755 new mode 100644 diff --git a/raspberryjammod/mcpipy/stuffaboutcode_clock.py b/raspberryjammod/mcpipy/stuffaboutcode_clock.py old mode 100755 new mode 100644 diff --git a/raspberryjammod/mcpipy/stuffaboutcode_hideandseek.py b/raspberryjammod/mcpipy/stuffaboutcode_hideandseek.py old mode 100755 new mode 100644 diff --git a/raspberryjammod/mcpipy/teleport.py b/raspberryjammod/mcpipy/teleport.py old mode 100644 new mode 100755 diff --git a/raspberryjammod/mcpipy/test.py b/raspberryjammod/mcpipy/test.py old mode 100755 new mode 100644 diff --git a/raspberryjammod/mcpipy/text.py b/raspberryjammod/mcpipy/text.py index 67419de..fd69baa 100644 --- a/raspberryjammod/mcpipy/text.py +++ b/raspberryjammod/mcpipy/text.py @@ -6,8 +6,12 @@ import sys import time import mcpi.minecraft as minecraft +ALIGN_LEFT = 0 +ALIGN_RIGHT = 1 +ALIGN_CENTER = 2 + # vectors must be minecraft.Vec3 -def drawGlyph(mc, pos, forwardVec, upVec, glyph, foreground, background=None): +def drawGlyph(mc, pos, forwardVec, upVec, glyph, foreground, background=None, buffer=None): bitmap = glyph[3] height = len(bitmap) width = glyph[0] @@ -17,36 +21,54 @@ def drawGlyph(mc, pos, forwardVec, upVec, glyph, foreground, background=None): 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) + if foreground is not None and 0 != bitmap[i] & (1 << (width-1-j)): + if buffer is not None: + buffer[(pixelPos.x,pixelPos.y,pixelPos.z)] = foreground + else: + mc.setBlock(pixelPos, foreground) + elif background is not None and 0 == bitmap[i] & (1 << (width-1-j)): + if buffer is not None: + buffer[(pixelPos.x,pixelPos.y,pixelPos.z)] = background + else: + mc.setBlock(pixelPos, background) pixelPos += forwardVec return pos + forwardVec*delta +def textLength(font, text): + l = 0 + for value in text: + try: + glyph = font[value] + except: + glyph = font[32] + l += glyph[2] + return l -def drawText(mc, font, pos, forwardVec, upVec, text, foreground, background=None): +def drawText(mc, font, pos, forwardVec, upVec, text, foreground=None, background=None, align=ALIGN_LEFT, buffer=None): try: - text = text.decode("cp1252") + text = bytearray(text.encode("cp1252")) except: - text = text.decode("iso8859_1") + text = bytearray(text.encode("iso8859_1")) pixelPos = pos.clone() height = len(font[32][3]) - numLines = text.count("\n")+1 - pixelPos += upVec * ((numLines-1) * height) + lines = text.split(b'\n') + pixelPos += upVec * ((len(lines)-1)* height) lineStart = pixelPos.clone() - for c in text: - value = ord(c) - - if value == 10: - lineStart += upVec * (-height) - pixelPos = lineStart.clone() - else: + for line in lines: + pixelPos = lineStart.clone() + if align == ALIGN_RIGHT: + pixelPos -= forwardVec * textLength(font, line) + elif align == ALIGN_CENTER: + pixelPos -= forwardVec * (0.5 * textLength(font, line)) + + for value in line: try: glyph = font[value] except: glyph = font[32] - pixelPos = drawGlyph(mc, pixelPos, forwardVec, upVec, glyph, foreground, background) + pixelPos = drawGlyph(mc, pixelPos, forwardVec, upVec, glyph, foreground, background, buffer) + + lineStart += upVec * (-height) return pixelPos def angleToTextDirectionCardinal(angle): @@ -87,4 +109,4 @@ if __name__ == '__main__': del sys.argv[0] text = " ".join(sys.argv) - drawText(mc, fonts.FONTS['tallfont'], pos, forward, minecraft.Vec3(0,1,0), text, foreground, background) + drawText(mc, fonts.FONTS['metrix7pt'], pos, forward, minecraft.Vec3(0,1,0), text, foreground, background, align=ALIGN_RIGHT) diff --git a/raspberryjammod/mcpipy/top.py b/raspberryjammod/mcpipy/top.py new file mode 100644 index 0000000..cdbfce9 --- /dev/null +++ b/raspberryjammod/mcpipy/top.py @@ -0,0 +1,6 @@ +from mc import * + +mc = Minecraft() + +playerPos = mc.player.getTilePos() +mc.player.setPos(playerPos.x, mc.getHeight(playerPos.x, playerPos.z)+1, playerPos.z) diff --git a/raspberryjammod/mcpipy/toschematic.py b/raspberryjammod/mcpipy/toschematic.py new file mode 100644 index 0000000..ebd41e4 --- /dev/null +++ b/raspberryjammod/mcpipy/toschematic.py @@ -0,0 +1,84 @@ +from mc import * +from ast import literal_eval +import os +import sys +import re +import mcpi.nbt as nbt +from struct import pack +from vehicle import getLoadPath + +def load(filename): + with open(filename) as f: + data = ''.join(f.readlines()) + result = re.search("=\\s*(.*)",data) + if result is None: + raise ValueError + + # Check to ensure only function called is Block() by getting literal_eval to + # raise an exception when "Block" is removed and the result isn't a literal. + # This SHOULD make the eval call safe, though USE AT YOUR OWN RISK. Ideally, + # one would walk the ast parse tree and use a whitelist. + literal_eval(result.group(1).replace("Block","")) + + return eval(result.group(1)) + +def toSchematic(vehicle): + x0 = min(x for (x,y,z) in vehicle) + y0 = min(y for (x,y,z) in vehicle) + z0 = min(z for (x,y,z) in vehicle) + x1 = max(x for (x,y,z) in vehicle) + y1 = max(y for (x,y,z) in vehicle) + z1 = max(z for (x,y,z) in vehicle) + schematic = nbt.NBTFile() + schematic.name = "Schematic" + schematic.tags.append(nbt.TAG_Short(name="Width", value = x1-x0+1)) + schematic.tags.append(nbt.TAG_Short(name="Height", value = y1-y0+1)) + schematic.tags.append(nbt.TAG_Short(name="Length", value = z1-z0+1)) + schematic.tags.append(nbt.TAG_String(name="Materials", value="Alpha")) + ids = b'' + metas = b'' + + for y in range(y0,y1+1): + for z in range(z0,z1+1): + for x in range(x0,x1+1): + try: + b = vehicle[(x,y,z)] + except: + b = Block(0) + ids += pack("B", b.id) + metas += pack("B", b.data) + + blocks = nbt.TAG_Byte_Array(name="Blocks") + blocks.value = ids + schematic.tags.append(blocks) + data = nbt.TAG_Byte_Array(name="Data") + data.value = metas + schematic.tags.append(data) + schematic.tags.append(nbt.TAG_List(name="Entities", type=nbt.TAG_Compound)) + schematic.tags.append(nbt.TAG_List(name="TileEntities", type=nbt.TAG_Compound)) + + return schematic + +def vehicleToSchematic(vehiclePath, schematicPath): + angle,highWater,vehicle = load(vehiclePath) + nbt = toSchematic(vehicle) + nbt.write_file(schematicPath) + +if __name__ == '__main__': + directory = os.path.join(os.path.dirname(sys.argv[0]),"vehicles") + if len(sys.argv) >= 2: + if sys.argv[1].endswith(".py"): + name = directory + "/" + sys.argv[1] + else: + name = directory + "/" + sys.argv[1] + ".py" + else: + name = getLoadPath(directory, "py") + + out = name + + if out.endswith(".py"): + out = name[:-2] + "schematic" + else: + out += ".schematic" + + vehicleToSchematic(name, out) diff --git a/raspberryjammod/mcpipy/trefoil.py b/raspberryjammod/mcpipy/trefoil.py old mode 100755 new mode 100644 diff --git a/raspberryjammod/mcpipy/trefoil2.py b/raspberryjammod/mcpipy/trefoil2.py old mode 100755 new mode 100644 diff --git a/raspberryjammod/mcpipy/turtleconsole.py b/raspberryjammod/mcpipy/turtleconsole.py old mode 100644 new mode 100755 index a5b2b32..0d4cf49 --- a/raspberryjammod/mcpipy/turtleconsole.py +++ b/raspberryjammod/mcpipy/turtleconsole.py @@ -1,3 +1,7 @@ +# +# WARNING: If you're running RJM on a server, do NOT include this script server-side for security reasons. +# + # # Code under the MIT license by Alexander Pruss # @@ -28,6 +32,8 @@ def inputLine(prompt): return 'quit()' elif c.message == ' ': return '' + elif "__" in c.message: + sys.exit(); else: return c.message time.sleep(0.2) diff --git a/raspberryjammod/mcpipy/turtledonut.py b/raspberryjammod/mcpipy/turtledonut.py old mode 100644 new mode 100755 diff --git a/raspberryjammod/mcpipy/vehicle.py b/raspberryjammod/mcpipy/vehicle.py old mode 100644 new mode 100755 diff --git a/raspberryjammod/mcpipy/win32move.py b/raspberryjammod/mcpipy/win32move.py new file mode 100644 index 0000000..0fcc670 --- /dev/null +++ b/raspberryjammod/mcpipy/win32move.py @@ -0,0 +1,67 @@ +from mc import * +from time import sleep +from sys import argv +import input + +mc = Minecraft() + +player = True + +if len(argv)>=2 and argv[1] != "me": + playerPos = mc.player.getPos() + playerYaw = mc.player.getRotation() + entity = mc.spawnEntity(argv[1], playerPos.x - sin(radians(playerYaw)), playerPos.z, + playerPos.z + cos(radians(playerYaw)), "{NoAI:1}") + player = False +else: + entity = mc.getPlayerId() + +lastPlatform = None +lastPlatformBlock = None + +UNSOLID = set([WATER_FLOWING.id,WATER_STATIONARY.id,AIR.id,LAVA_FLOWING.id,LAVA_STATIONARY.id]) + +while True: + pos = mc.entity.getPos(entity) + yaw = mc.entity.getRotation(entity) + move = False + if input.wasPressedSinceLast(input.NEXT): + pos.y -= 1 + move = True + if input.wasPressedSinceLast(input.PRIOR): + pos.y += 1 + move = True + if input.wasPressedSinceLast(input.LEFT): + yaw -= 15 + mc.entity.setRotation(entity,yaw) + if input.wasPressedSinceLast(input.RIGHT): + yaw += 15 + mc.entity.setRotation(entity,yaw) + if input.wasPressedSinceLast(input.UP): + pos.x += .5 * -sin(radians(yaw)) + pos.z += .5 * cos(radians(yaw)) + move = True + if input.wasPressedSinceLast(input.DOWN): + pos.x -= .5 * -sin(radians(yaw)) + pos.z -= .5 * cos(radians(yaw)) + move = True + if move: + if player: + under = (int(floor(pos.x)),int(floor(pos.y))-1,int(floor(pos.z))) + block = mc.getBlock(under) + if block in UNSOLID: + drew = under + mc.setBlock(drew,GLASS) + else: + drew = None + mc.entity.setPos(entity,pos) + if lastPlatform != under: + mc.setBlock(lastPlatform,AIR) + lastPlatform = None + if drew: + lastPlatform = drew + lastPlatformBlock = block + else: + mc.entity.setPos(entity,pos) + sleep(0.2) + \ No newline at end of file diff --git a/raspberryjammod/mcpipy/zhuowei_rainbow.py b/raspberryjammod/mcpipy/zhuowei_rainbow.py old mode 100755 new mode 100644