WorldEditorChunk now maintains a list of [Tile]EntityRefs instead of AnvilChunkData
This commit is contained in:
parent
e0f27e590b
commit
fb64391a22
@ -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
|
||||
|
@ -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
|
||||
|
@ -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):
|
||||
|
@ -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 ---
|
||||
|
||||
|
Reference in New Issue
Block a user