2015-09-28 08:41:18 -05:00

110 lines
3.9 KiB
Python

from vehicle import Vehicle,getSavePath,getLoadPath
import sys
from mc import *
from time import sleep
import os
#
# Either:len
# scan name x0 y0 z0 x1 y1 z1 : scan from (x0,y0,z0) relative to player to (x1,y1,z1) relative to player
# scan name y0 : scan from y0 to sky in sword-right-click specified rectangle
# scan name : scan from player feet to sky in sword-right-click specified rectangle
# scan name r : restore scan
# Put a - for the name to be asked.
#
def getArea(basePos,depth):
mc.postToChat("Sword-right-click other corner of rectangle")
mc.events.clearAll()
while True:
hits = mc.events.pollBlockHits()
if len(hits) > 0:
c1 = (min(basePos.x,hits[0].pos.x),min(basePos.y-depth,hits[0].pos.y),min(basePos.z,hits[0].pos.z))
c2 = (max(basePos.x,hits[0].pos.x),None,max(basePos.z,hits[0].pos.z))
break
sleep(0.25)
maxY = c1[1]
for x in range(c1[0],c2[0]+1):
for z in range(c1[2],c2[2]+1):
y = mc.getHeight(x,z)
if y > maxY:
maxY = y
return (c1[0]-basePos.x,c1[1]-basePos.y,c1[2]-basePos.z),(c2[0]-basePos.x,maxY-basePos.y,c2[2]-basePos.z)
def save(vehicle,name):
directory = os.path.join(os.path.dirname(sys.argv[0]),"vehicles")
try:
os.mkdir(directory)
except:
pass
if name and name != '-':
path = os.path.join(directory,name+".py")
else:
path = getSavePath('vehicles', 'py')
if not path:
mc.postToChat('Canceled')
return
vehicle.save(path)
mc.postToChat('Saved in '+path)
def restore(vehicle,name,pos):
directory = os.path.join(os.path.dirname(sys.argv[0]),"vehicles")
if name and name != '-':
path = os.path.join(directory,name+".py")
else:
path = getLoadPath('vehicles', 'py')
if not path:
mc.postToChat('Canceled')
return
vehicle.load(path)
mc.postToChat('Loaded from '+path)
minX = min(x for (x,y,z) in vehicle.baseVehicle)
minY = min(y for (x,y,z) in vehicle.baseVehicle)
minZ = min(z for (x,y,z) in vehicle.baseVehicle)
maxX = max(x for (x,y,z) in vehicle.baseVehicle)
maxY = max(y for (x,y,z) in vehicle.baseVehicle)
maxZ = max(z for (x,y,z) in vehicle.baseVehicle)
mc.postToChat('Erasing')
mc.setBlocks(pos.x+minX,pos.y+minY,pos.z+minZ,pos.x+maxX,pos.y+maxY,pos.z+maxZ,AIR)
mc.postToChat('Drawing')
vehicle.draw(pos.x,pos.y,pos.z,vehicle.baseAngle)
mc.postToChat('Done')
mc = Minecraft()
basePos = mc.player.getTilePos()
rot = mc.player.getRotation()
vehicle = Vehicle(mc)
#restore(vehicle, "cottage", basePos)
#exit()
if len(sys.argv) == 8:
corner1 = int(sys.argv[2]),int(sys.argv[3]),int(sys.argv[4])
corner2 = int(sys.argv[5]),int(sys.argv[6]),int(sys.argv[7])
elif len(sys.argv) == 2:
corner1,corner2 = getArea(basePos,0)
elif len(sys.argv) == 3:
if sys.argv[2].startswith('r'):
restore(vehicle,sys.argv[1],basePos)
exit()
corner1,corner2 = getArea(basePos,int(sys.argv[2]))
else:
mc.postToChat("scan vehiclename x1 y1 z1 x2 y2 z2")
mc.postToChat("scan vehiclename depth [then right-click with sword on other corner]")
mc.postToChat("scan vehiclename restore")
mc.postToChat("scan vehiclename [then right-click with sword on other corner]")
mc.postToChat("All coordinates are relative to player")
exit()
mc.postToChat("Scanning region "+str(corner1)+"-"+str(corner2))
dict = {}
for x in range(corner1[0],corner2[0]+1):
for y in range(corner1[1],corner2[1]+1):
for z in range(corner1[2],corner2[2]+1):
block = vehicle.getBlockWithData(basePos.x+x,basePos.y+y,basePos.z+z)
if block.id != AIR.id:
dict[(x,y,z)] = block
mc.postToChat("Scanned "+str(len(dict))+" blocks")
vehicle.setVehicle(dict, rot)
save(vehicle,sys.argv[1])