diff --git a/src/mceditlib/anvil/adapter.py b/src/mceditlib/anvil/adapter.py index 47c9594..6db2f05 100644 --- a/src/mceditlib/anvil/adapter.py +++ b/src/mceditlib/anvil/adapter.py @@ -212,10 +212,13 @@ class AnvilChunkData(object): levelTag["Biomes"] = nbt.TAG_Byte_Array(numpy.empty((16, 16), 'uint8')) levelTag["Biomes"].value[:] = -1 - self.Entities = [PCEntityRef(tag) for tag in self.rootTag["Level"]["Entities"]] - del self.rootTag["Level"]["Entities"] - self.TileEntities = [PCTileEntityRef(tag) for tag in self.rootTag["Level"]["TileEntities"]] - del self.rootTag["Level"]["TileEntities"] + self.Entities = self.rootTag["Level"]["Entities"] + self.TileEntities = self.rootTag["Level"]["TileEntities"] + + # self.Entities = [PCEntityRef(tag) for tag in self.rootTag["Level"]["Entities"]] + # del self.rootTag["Level"]["Entities"] + # self.TileEntities = [PCTileEntityRef(tag) for tag in self.rootTag["Level"]["TileEntities"]] + # del self.rootTag["Level"]["TileEntities"] def _create(self): chunkTag = nbt.TAG_Compound() @@ -264,8 +267,6 @@ class AnvilChunkData(object): sections.append(section.buildNBTTag()) tag["Level"]["Sections"] = sections - tag["Level"]["Entities"] = nbt.TAG_List([ref.rootTag for ref in self.Entities]) - tag["Level"]["TileEntities"] = nbt.TAG_List([ref.rootTag for ref in self.TileEntities]) log.debug(u"Saved chunk {0}".format(self)) return tag diff --git a/src/mceditlib/anvil/entities.py b/src/mceditlib/anvil/entities.py index 594ab59..e42d17a 100644 --- a/src/mceditlib/anvil/entities.py +++ b/src/mceditlib/anvil/entities.py @@ -11,8 +11,9 @@ log = logging.getLogger(__name__) class PCEntityRef(object): - def __init__(self, rootTag): + def __init__(self, rootTag, chunk=None): self.rootTag = rootTag + self.chunk = chunk def raw_tag(self): return self.rootTag @@ -32,12 +33,13 @@ class PCEntityRef(object): entity = newEntityClass(tag) entity.Position = self.Position + copyOffset - return PCEntityRef(tag) + return PCEntityRef(tag, None) class PCTileEntityRef(object): - def __init__(self, rootTag): + def __init__(self, rootTag, chunk=None): self.rootTag = rootTag + self.chunk = chunk def raw_tag(self): return self.rootTag diff --git a/src/mceditlib/schematic.py b/src/mceditlib/schematic.py index d9627fa..7757379 100644 --- a/src/mceditlib/schematic.py +++ b/src/mceditlib/schematic.py @@ -156,8 +156,8 @@ class SchematicFileAdapter(FakeChunkedLevelAdapter): self.rootTag["Data"].value &= 0xF # discard high bits - self.Entities = [self.EntityRef(tag) for tag in self.rootTag["Entities"]] - self.TileEntities = [self.EntityRef(tag) for tag in self.rootTag["TileEntities"]] + self.Entities = [self.EntityRef(tag, None) for tag in self.rootTag["Entities"]] + self.TileEntities = [self.EntityRef(tag, None) for tag in self.rootTag["TileEntities"]] def saveChanges(self): diff --git a/src/mceditlib/worldeditor.py b/src/mceditlib/worldeditor.py index 3bb4e71..84ae9de 100644 --- a/src/mceditlib/worldeditor.py +++ b/src/mceditlib/worldeditor.py @@ -48,6 +48,8 @@ class WorldEditorChunk(object): self.cx, self.cz = chunkData.cx, chunkData.cz self.dimName = chunkData.dimName self.dimension = editor.getDimension(self.dimName) + self.Entities = [editor.adapter.EntityRef(tag, self) for tag in chunkData.Entities] + self.TileEntities = [editor.adapter.TileEntityRef(tag, self) for tag in chunkData.TileEntities] def buildNBTTag(self): return self.chunkData.buildNBTTag() @@ -101,14 +103,6 @@ class WorldEditorChunk(object): def HeightMap(self): return self.chunkData.HeightMap - @property - def Entities(self): - return self.chunkData.Entities - - @property - def TileEntities(self): - return self.chunkData.TileEntities - @property def TerrainPopulated(self): return self.chunkData.TerrainPopulated @@ -117,6 +111,28 @@ class WorldEditorChunk(object): def TerrainPopulated(self, val): self.chunkData.TerrainPopulated = val + def addEntity(self, ref): + if ref.chunk is self: + return + self.chunkData.Entities.append(ref.rootTag) + self.Entities.append(ref) + ref.chunk = self + + def addTileEntity(self, ref): + if ref.chunk is self: + return + self.chunkData.TileEntities.append(ref.rootTag) + self.TileEntities.append(ref) + ref.chunk = self + + def removeTileEntity(self, ref): + if ref.chunk is not self: + return + self.chunkData.TileEntities.remove(ref.rootTag) + self.TileEntities.remove(ref) + ref.chunk = None + ref.rootTag = None + class WorldEditor(object): def __init__(self, filename=None, create=False, readonly=False, adapterClass=None, adapter=None, resume=None): @@ -606,7 +622,7 @@ class WorldEditorDimension(object): x, y, z = ref.Position cx, cz = chunk_pos(x, z) chunk = self.getChunk(cx, cz, create=True) - chunk.Entities.append(ref.copy()) + chunk.addEntity(ref.copy()) def addTileEntity(self, ref): x, y, z = ref.Position @@ -615,9 +631,9 @@ class WorldEditorDimension(object): existing = [old for old in chunk.TileEntities if old.Position == (x, y, z)] for e in existing: - chunk.TileEntities.remove(e) + chunk.removeTileEntity(e) - chunk.TileEntities.append(ref.copy()) + chunk.addTileEntity(ref.copy()) # --- Import/Export ---