WorldEditorChunk now maintains a list of [Tile]EntityRefs instead of AnvilChunkData

This commit is contained in:
David Vierra 2015-02-18 19:09:36 -10:00
parent e0f27e590b
commit fb64391a22
4 changed files with 41 additions and 22 deletions

View File

@ -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

View File

@ -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

View File

@ -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):

View File

@ -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 ---