def copyWithOffset(cls, entity, copyOffset): eTag = deepcopy(entity) positionTags = map(lambda p, co: nbt.TAG_Double(p.value + co), eTag["Pos"], copyOffset) eTag["Pos"] = nbt.TAG_List(positionTags) if eTag["id"].value in ("Painting", "ItemFrame"): eTag["TileX"].value += copyOffset[0] eTag["TileY"].value += copyOffset[1] eTag["TileZ"].value += copyOffset[2] return eTag
def copyWithOffset(cls, entity, copyOffset, regenerateUUID=False): eTag = deepcopy(entity) # Need to check the content of the copy to regenerate the possible sub entities UUIDs. # A simple fix for the 1.9+ minecarts is proposed. positionTags = map(lambda p, co: nbt.TAG_Double(p.value + co), eTag["Pos"], copyOffset) eTag["Pos"] = nbt.TAG_List(positionTags) # Also match the 'minecraft:XXX' names # if eTag["id"].value in ("Painting", "ItemFrame", u'minecraft:painting', u'minecraft:item_frame'): # print "#" * 40 # print eTag # eTag["TileX"].value += copyOffset[0] # eTag["TileY"].value += copyOffset[1] # eTag["TileZ"].value += copyOffset[2] # Trying more agnostic way if eTag.get('TileX') and eTag.get('TileY') and eTag.get('TileZ'): eTag["TileX"].value += copyOffset[0] eTag["TileY"].value += copyOffset[1] eTag["TileZ"].value += copyOffset[2] if "Riding" in eTag: eTag["Riding"] = Entity.copyWithOffset(eTag["Riding"], copyOffset) # # Fix for 1.9+ minecarts if "Passengers" in eTag: passengers = nbt.TAG_List() for passenger in eTag["Passengers"]: passengers.append( Entity.copyWithOffset(passenger, copyOffset, regenerateUUID)) eTag["Passengers"] = passengers # # if regenerateUUID: # Courtesy of SethBling eTag["UUIDMost"] = nbt.TAG_Long((random.getrandbits(47) << 16) | (1 << 12) | random.getrandbits(12)) eTag["UUIDLeast"] = nbt.TAG_Long(-( (7 << 60) | random.getrandbits(60))) return eTag
def copyWithOffset(cls, entity, copyOffset, regenerateUUID=False): eTag = deepcopy(entity) positionTags = map(lambda p, co: nbt.TAG_Double(p.value + co), eTag["Pos"], copyOffset) eTag["Pos"] = nbt.TAG_List(positionTags) if eTag["id"].value in ("Painting", "ItemFrame"): eTag["TileX"].value += copyOffset[0] eTag["TileY"].value += copyOffset[1] eTag["TileZ"].value += copyOffset[2] if "Riding" in eTag: eTag["Riding"] = Entity.copyWithOffset(eTag["Riding"], copyOffset) if regenerateUUID: # Courtesy of SethBling eTag["UUIDMost"] = nbt.TAG_Long((random.getrandbits(47) << 16) | (1 << 12) | random.getrandbits(12)) eTag["UUIDLeast"] = nbt.TAG_Long(-((7 << 60) | random.getrandbits(60))) return eTag
def testModify(self): level = self.testCreate() # Most of the value types work as expected. Here, we replace the entire tag with a TAG_String level["About"]["Author"] = nbt.TAG_String("YARRR~!") # Because the tag type usually doesn't change, # we can replace the string tag's value instead of replacing the entire tag. level["About"]["Author"].value = "Stew Pickles" # Remove members of a TAG_Compound using del, similar to a python dict. del (level["About"]) # Replace all of the wood blocks with gold using a boolean index array blocks = level["Map"]["Blocks"].value blocks[blocks == 5] = 41 level["Entities"][0] = nbt.TAG_Compound([ nbt.TAG_String("Creeper", "id"), nbt.TAG_List([nbt.TAG_Double(d) for d in (1, 1, 1)], "Pos") ])
def setpos(cls, tag, pos): tag["Pos"] = nbt.TAG_List([nbt.TAG_Double(p) for p in pos])
def numbersToFloats(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]])
def getPlayerDimension(self, player="Player"): """ Always returns 0, as MCPE only has the overworld dimension. :param player: string of the name of the player. "Player" for SSP player, player_<client-id> for SMP player. :return: int """ return 0 def setPlayerPosition(self, (x, y, z), player="Player"): """ Sets the players position to x, y, z :param (x, y, z): tuple of the coordinates of the player :param player: string of the name of the player. "Player" for SSP player, player_<client-id> for SMP player. :return: """ posList = nbt.TAG_List([nbt.TAG_Double(p) for p in (x, y - 1.75, z)]) playerTag = self.getPlayerTag(player) playerTag["Pos"] = posList def getPlayerPosition(self, player="Player"): """ Gets the players position :param player: string of the name of the player. "Player" for SSP player, player_<client-id> for SMP player. :return: tuple int (x, y, z): Coordinates of the player. """ playerTag = self.getPlayerTag(player) posList = playerTag["Pos"] x, y, z = map(lambda c: c.value, posList) return x, y + 1.75, z