def __init__(self, cmd="", hover="", block="I", d="u", cond=False, redstone=False, time=0, first=False): name = "minecraft:" + self.nameMap[block] dv = self.dMap[d] if cond: dv += 8 nbtData = nbt.TAG_Compound("", []) nbtData.add(nbt.TAG_Byte("auto", int(not redstone))) nbtData.add(nbt.TAG_String("Command", cmd)) nbtData.add(nbt.TAG_String("CustomName", hover)) nbtData.add(nbt.TAG_Byte("powered", int(block == "R" and not redstone))) if time == 0 and not first: nbtData.add(nbt.TAG_Int("Version", 8)) else: nbtData.add(nbt.TAG_Int("Version", 9)) nbtData.add(nbt.TAG_Byte("ExecuteOnFirstTick", int(first))) nbtData.add(nbt.TAG_Int("TickDelay", time)) nbtData.add(nbt.TAG_Byte("conditionMet", 0)) nbtData.add(nbt.TAG_String("id", "CommandBlock")) nbtData.add(nbt.TAG_Byte("isMovable", 1)) nbtData.add(nbt.TAG_Int("LPCommandMode", 0)) # Not sure what these LPModes do. This works. nbtData.add(nbt.TAG_Byte("LPConditionalMode", 0)) nbtData.add(nbt.TAG_Byte("LPRedstoneMode", 0)) nbtData.add(nbt.TAG_Long("LastExecution", 0)) nbtData.add(nbt.TAG_String("LastOutput", "")) nbtData.add(nbt.TAG_List("LastOutputParams", [])) nbtData.add(nbt.TAG_Int("SuccessCount", 0)) nbtData.add(nbt.TAG_Byte("TrackOutput", 1)) super().__init__(name, dv, nbtData)
def getTAGStructure(self): tag = nbt.TAG_Compound() tag["Name"] = nbt.TAG_String(self.name) tag["DisplayName"] = nbt.TAG_String(self.displayName) tag["Prefix"] = nbt.TAG_String(self.prefix) tag["Suffix"] = nbt.TAG_String(self.suffix) if self.color != None: tag["TeamColor"] = nbt.TAG_String(self.color) tag["NameTagVisibility"] = nbt.TAG_String(self.nametags) tag["DeathMessageVisibility"] = nbt.TAG_String(self.deathMessage) tag["AllowFriendlyFire"] = nbt.TAG_Byte(self.friendlyFire) tag["SeeFriendlyInvisibles"] = nbt.TAG_Byte(self.friendlyInvisibles) players = nbt.TAG_List() for member in self.teamMembers: players.append(nbt.TAG_String(member)) tag["Players"] = players return tag
def chestWithItemID(cls, itemID, count=64, damage=0): """ Creates a chest with a stack of 'itemID' in each slot. Optionally specify the count of items in each stack. Pass a negative value for damage to create unnaturally sturdy tools. """ root_tag = nbt.TAG_Compound() invTag = nbt.TAG_List() root_tag["Inventory"] = invTag for slot in range(9, 36): itemTag = nbt.TAG_Compound() itemTag["Slot"] = nbt.TAG_Byte(slot) itemTag["Count"] = nbt.TAG_Byte(count) itemTag["id"] = nbt.TAG_Short(itemID) itemTag["Damage"] = nbt.TAG_Short(damage) invTag.append(itemTag) chest = INVEditChest(root_tag, "") return chest
def toNBT(self): root = nbt.TAG_Compound() root['BlockStates'] = nbt.TAG_Long_Array(self.__old_blockstates) root['Y'] = nbt.TAG_Byte(self._y) root['BlockLight'] = nbt.TAG_Byte_Array(self._block_light) root['SkyLight'] = nbt.TAG_Byte_Array(self._sky_light) palette = nbt.TAG_List() for block in self.palette: palette.append(block.toNBT()) root['Palette'] = self._palette return root
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["Environment"] = nbt.TAG_Compound() level["Environment"]["SkyBrightness"] = nbt.TAG_Byte(16) level["Environment"]["SurroundingWaterHeight"] = nbt.TAG_Short(32) "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) "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) return level
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