Marcono1234

Minecraft Hologram Data Format

May 8th, 2015
258
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.37 KB | None | 0 0
  1. from ast import literal_eval
  2.  
  3. def raise_error(text):
  4.     raise Exception ("{}".format(text))
  5.  
  6. data = None
  7. dataVersion = None
  8. mainData = None
  9.  
  10. with open(raw_input("File path:\n"),"r") as localFile:
  11.     data = localFile.read()
  12.     localFile.close()
  13.  
  14.  
  15. data = data.replace("\r","").split("\n")
  16.  
  17. newData = []
  18. for line in data:
  19.     if line.find("#",0,1) != 0:
  20.         newData.append(line)
  21.  
  22. data = newData
  23.  
  24. for line in range(0,len(data)):
  25.     mainDataPos = []
  26.    
  27.     if data[line].find("@Start",0) == 0:
  28.         dataVersion = data[line][1:]
  29.         mainDataPos.append(line)
  30.  
  31.         for newLine in range(line+1,len(data)):
  32.             if data[newLine].find("@End",0) == 0:
  33.                 mainDataPos.append(newLine)
  34.                 break
  35.  
  36.         if len(mainDataPos) != 2:
  37.             raise_error("Missing \"@End\"to close the main data")
  38.  
  39.         else:
  40.             try:
  41.                 mainData = literal_eval("".join(data[mainDataPos[0]+1:mainDataPos[1]]))
  42.                 data = data[:mainDataPos[0]]+data[mainDataPos[1]+1:]
  43.             except Exception as inst:
  44.                 raise_error("mainData has an invalid format:\n{}\n{}".format(type(inst),inst))
  45.         break
  46.  
  47. if len(data) == 0:
  48.     raise_error("No data was found")
  49. else:
  50.  
  51.     # See http://minecraft.gamepedia.com/Formatting_codes
  52.     validCharacters = ["{0:x}".format(i) for i in range(0,16)]
  53.    
  54.     newData = []
  55.    
  56.     for line in data:
  57.         newLine = "\u2b1b\\\u00a7".decode("unicode-escape").join(i for i in line if i in validCharacters)
  58.         if len(newLine) != 0:
  59.             newData.append("\u00a7"+newLine+"\u2b1b".decode("unicode-escape"))
  60.  
  61.     mainValues = {
  62.         "gapValue": 0.23,
  63.         "positionType": "bottom",
  64.         "baseCoordinates": ["~","~","~"],
  65.         "newBaseCoordinates": [0,-6,0],
  66.     }
  67.    
  68.     try:
  69.         mainValues["gapValue"] = float(mainData["Gap"])
  70.     except:
  71.         pass
  72.  
  73.     try:
  74.         mainValues["positionType"] = mainData["Pos"][1]
  75.     except:
  76.         pass
  77.  
  78.     try:
  79.         mainValues["baseCoordinates"] = mainData["Pos"][0]
  80.     except:
  81.         pass
  82.  
  83.     if mainValues["positionType"] == "top":
  84.         mainValues["gapValue"] *= -1
  85.  
  86.     for i in range(0,3):
  87.         if mainValues["baseCoordinates"][i].find("~",0,1) != 0:
  88.             mainValues["newBaseCoordinates"][i] = float(mainValues["baseCoordinates"][i])
  89.         else:
  90.             mainValues["newBaseCoordinates"][i] += float(mainValues["baseCoordinates"][i][1:]) if len(mainValues["baseCoordinates"][i]) > 1 else 0
  91.  
  92.     lastHeight = mainValues["newBaseCoordinates"][1]
  93.  
  94.     commands = []
  95.    
  96.     for i in range(0,len(newData)):
  97.         coordinates = [None,None,None]
  98.         line = None
  99.  
  100.         if mainValues["positionType"] == "top":
  101.             line = newData.pop(0)
  102.         else:
  103.             line = newData.pop()
  104.  
  105.         for j in range(0,3):
  106.             if j == 1:
  107.                 coordinate = lastHeight
  108.             else:
  109.                 coordinate = float(mainValues["newBaseCoordinates"][j])
  110.                
  111.             if int(coordinate) == coordinate:
  112.                 coordinate = int(coordinate)
  113.                
  114.             if mainValues["baseCoordinates"][j].find("~",0,1) == 0:
  115.                 coordinates[j] = u"~{}".format(coordinate)
  116.             else:
  117.                 coordinates[j] = u"{}".format(coordinate)
  118.  
  119.         lastHeight += mainValues["gapValue"]
  120.         commands.append(u"/summon ArmorStand {} {} {} {{NoGravity:1,Invulnerable:1,Invisible:1,Marker:1,CustomName:{},CustomNameVisible:1}}".format(coordinates[0],coordinates[1],coordinates[2],line))
  121.  
  122.  
  123.     def create_command(commandList):
  124.         closeBrackets = []
  125.         command = "/summon MinecartCommandBlock ~ ~2 ~ {Command:/setblock ~ ~-4 ~ redstone_block"
  126.         closeBrackets.append("}")
  127.  
  128.         command += "#"
  129.  
  130.         #Need this, else it will skip the first minecarts
  131.         command += ",Riding:{id:MinecartCommandBlock"
  132.         closeBrackets.append("}")
  133.  
  134.         command += ",Riding:{id:FallingSand,Time:1,Block:activator_rail"
  135.         closeBrackets.append("}")
  136.  
  137.         command += ",Riding:{id:FallingSand,Time:1,Block:redstone_block"
  138.         closeBrackets.append("}")
  139.  
  140.         command += ",Riding:{id:FallingSand,Time:1,Block:stone"
  141.         closeBrackets.append("}")
  142.  
  143.         command += ",Riding:{id:FallingSand,Time:1,Block:command_block,TileEntityData:{Command:/fill ~ ~-2 ~ ~ ~3 ~ air}"
  144.         closeBrackets.append("}")
  145.  
  146.         command += ",Riding:{id:FallingSand,Time:1,Block:stone"
  147.         closeBrackets.append("}")
  148.  
  149.         commandStack = ""
  150.         while len(commands) > 0:
  151.             localCommand = commands.pop(0)
  152.             localCommand = ",Riding:{id:MinecartCommandBlock,Command:"+localCommand
  153.             commandStack += localCommand
  154.             closeBrackets.append("}")
  155.  
  156.         command = command.replace("#",commandStack)
  157.  
  158.         while len(closeBrackets) != 0:
  159.             command += closeBrackets.pop()
  160.  
  161.         return command
  162.  
  163.     returnCommand = "/setblock ~ ~1 ~ standing_sign 0 replace {Text1:\"{text:Click,clickEvent:{action:run_command,value:\\\"/setblock ~ ~1 ~ command_block 0 replace {Command:/kill @e[type=MinecartCommandBlock,dy=6]}\\\"}}\",Text2:\"{text:\\\"\\\",clickEvent:{action:run_command,value:\\\"#\\\"}}\"}"
  164.     returnCommand = returnCommand.replace("#",create_command(commands))
  165.     print returnCommand
Advertisement
Add Comment
Please, Sign In to add comment