def setPlayerOrientation(self, yp, player="Player"): """ Gets the players orientation. :param player: string of the name of the player. "Player" for SSP player, player_<client-id> for SMP player. :param yp: int tuple (yaw, pitch) :return: None """ self.getPlayerTag(player)["Rotation"] = nbt.TAG_List( [nbt.TAG_Float(p) for p in yp])
def __init__(self, root_tag=None, filename=""): self.Width = 0 self.Height = 0 self.Length = 0 self.Blocks = array([], "uint8") self.Data = array([], "uint8") self.Spawn = (0, 0, 0) self.filename = filename if root_tag: self.root_tag = root_tag mapTag = root_tag["Map"] self.Width = mapTag["Width"].value self.Length = mapTag["Length"].value self.Height = mapTag["Height"].value mapTag["Blocks"].value.shape = (self.Height, self.Length, self.Width) self.Blocks = swapaxes(mapTag["Blocks"].value, 0, 2) mapTag["Data"].value.shape = (self.Height, self.Length, self.Width) self.Data = swapaxes(mapTag["Data"].value, 0, 2) self.BlockLight = self.Data & 0xf self.Data >>= 4 self.Spawn = [mapTag[Spawn][i].value for i in range(3)] if "Entities" not in root_tag: root_tag["Entities"] = nbt.TAG_List() self.Entities = root_tag["Entities"] # xxx fixup Motion and Pos to match infdev format def numbersToDoubles(ent): for attr in "Motion", "Pos": if attr in ent: ent[attr] = nbt.TAG_List([nbt.TAG_Double(t.value) for t in ent[attr]]) for ent in self.Entities: numbersToDoubles(ent) if "TileEntities" not in root_tag: root_tag["TileEntities"] = nbt.TAG_List() self.TileEntities = root_tag["TileEntities"] # xxx fixup TileEntities positions to match infdev format for te in self.TileEntities: pos = te["Pos"].value (x, y, z) = self.decodePos(pos) TileEntity.setpos(te, (x, y, z)) localPlayerList = [tag for tag in root_tag["Entities"] if tag['id'].value == 'LocalPlayer'] if len(localPlayerList) == 0: # omen doesn't make a player entity playerTag = nbt.TAG_Compound() playerTag['id'] = nbt.TAG_String('LocalPlayer') playerTag['Pos'] = nbt.TAG_List([nbt.TAG_Float(0.), nbt.TAG_Float(64.), nbt.TAG_Float(0.)]) playerTag['Rotation'] = nbt.TAG_List([nbt.TAG_Float(0.), nbt.TAG_Float(45.)]) self.LocalPlayer = playerTag else: self.LocalPlayer = localPlayerList[0] else: log.info(u"Creating new Indev levels is not yet implemented.!") raise ValueError("Can't do that yet")
def setPlayerOrientation(self, yp, player="Ignored"): self.LocalPlayer["Rotation"] = nbt.TAG_List([nbt.TAG_Float(p) for p in yp])
def setPlayerPosition(self, pos, player="Ignored"): self.LocalPlayer["Pos"] = nbt.TAG_List([nbt.TAG_Float(p) for p in pos])
def __init__(self, root_tag=None, filename=""): self.Width = 0 self.Height = 0 self.Length = 0 self.Blocks = array([], uint8) self.Data = array([], uint8) self.Spawn = (0, 0, 0) self.filename = filename if root_tag: self.root_tag = root_tag mapTag = root_tag[Map] self.Width = mapTag[Width].value self.Length = mapTag[Length].value self.Height = mapTag[Height].value mapTag[Blocks].value.shape = (self.Height, self.Length, self.Width) self.Blocks = swapaxes(mapTag[Blocks].value, 0, 2) mapTag[Data].value.shape = (self.Height, self.Length, self.Width) self.Data = swapaxes(mapTag[Data].value, 0, 2) self.BlockLight = self.Data & 0xf self.Data >>= 4 self.Spawn = [mapTag[Spawn][i].value for i in range(3)] if not Entities in root_tag: root_tag[Entities] = nbt.TAG_List() self.Entities = root_tag[Entities] # xxx fixup Motion and Pos to match infdev format def numbersToDoubles(ent): for attr in "Motion", "Pos": if attr in ent: ent[attr] = nbt.TAG_List( [nbt.TAG_Double(t.value) for t in ent[attr]]) for ent in self.Entities: numbersToDoubles(ent) if not TileEntities in root_tag: root_tag[TileEntities] = nbt.TAG_List() self.TileEntities = root_tag[TileEntities] # xxx fixup TileEntities positions to match infdev format for te in self.TileEntities: pos = te["Pos"].value (x, y, z) = self.decodePos(pos) TileEntity.setpos(te, (x, y, z)) if len( filter(lambda x: x['id'].value == 'LocalPlayer', root_tag[Entities]) ) == 0: # omen doesn't make a player entity p = nbt.TAG_Compound() p['id'] = nbt.TAG_String('LocalPlayer') p['Pos'] = nbt.TAG_List( [nbt.TAG_Float(0.), nbt.TAG_Float(64.), nbt.TAG_Float(0.)]) p['Rotation'] = nbt.TAG_List( [nbt.TAG_Float(0.), nbt.TAG_Float(45.)]) root_tag[Entities].append(p) # self.saveInPlace() else: info(u"Creating new Indev levels is not yet implemented.!") raise ValueError("Can't do that yet")
def setPlayerOrientation(self, yp, player="Ignored"): for x in self.root_tag["Entities"]: if x["id"].value == "LocalPlayer": x["Rotation"] = nbt.TAG_List([nbt.TAG_Float(p) for p in yp])
def setPlayerPosition(self, pos, player="Ignored"): for x in self.root_tag["Entities"]: if x["id"].value == "LocalPlayer": x["Pos"] = nbt.TAG_List([nbt.TAG_Float(p) for p in pos])
def testCreate(self): "Create an indev level." # The root of an NBT file is always a TAG_Compound. level = nbt.TAG_Compound(name="MinecraftLevel") # Subtags of a TAG_Compound are automatically named when you use the [] operator. level["About"] = nbt.TAG_Compound() level["About"]["Author"] = nbt.TAG_String("codewarrior") level["About"]["CreatedOn"] = nbt.TAG_Long(time.time()) level["Environment"] = nbt.TAG_Compound() level["Environment"]["SkyBrightness"] = nbt.TAG_Byte(16) level["Environment"]["SurroundingWaterHeight"] = nbt.TAG_Short(32) level["Environment"]["FogColor"] = nbt.TAG_Int(0xcccccc) entity = nbt.TAG_Compound() entity["id"] = nbt.TAG_String("Creeper") entity["Pos"] = nbt.TAG_List( [nbt.TAG_Float(d) for d in (32.5, 64.0, 33.3)]) level["Entities"] = nbt.TAG_List([entity]) # You can also create and name a tag before adding it to the compound. spawn = nbt.TAG_List( (nbt.TAG_Short(100), nbt.TAG_Short(45), nbt.TAG_Short(55))) spawn.name = "Spawn" mapTag = nbt.TAG_Compound() mapTag.add(spawn) mapTag.name = "Map" level.add(mapTag) mapTag2 = nbt.TAG_Compound([spawn]) mapTag2.name = "Map" # I think it looks more familiar with [] syntax. l, w, h = 128, 128, 128 mapTag["Height"] = nbt.TAG_Short(h) # y dimension mapTag["Length"] = nbt.TAG_Short(l) # z dimension mapTag["Width"] = nbt.TAG_Short(w) # x dimension # Byte arrays are stored as numpy.uint8 arrays. mapTag["Blocks"] = nbt.TAG_Byte_Array() mapTag["Blocks"].value = numpy.zeros( l * w * h, dtype=numpy.uint8) # create lots of air! # The blocks array is indexed (y,z,x) for indev levels, so reshape the blocks mapTag["Blocks"].value.shape = (h, l, w) # Replace the bottom layer of the indev level with wood mapTag["Blocks"].value[0, :, :] = 5 # This is a great way to learn the power of numpy array slicing and indexing. mapTag["Data"] = nbt.TAG_Byte_Array() mapTag["Data"].value = numpy.zeros(l * w * h, dtype=numpy.uint8) # Save a few more tag types for completeness level["ShortArray"] = nbt.TAG_Short_Array( numpy.zeros((16, 16), dtype='uint16')) level["IntArray"] = nbt.TAG_Int_Array( numpy.zeros((16, 16), dtype='uint32')) level["Float"] = nbt.TAG_Float(0.3) return level