Load internal names from FML name mapping. Can't do much besides name the blocks, though.
This commit is contained in:
parent
c6f11a6926
commit
1dc929077a
@ -16,7 +16,7 @@ import time
|
||||
from mceditlib import nbt
|
||||
from mceditlib.anvil.entities import PCEntityRef, PCTileEntityRef
|
||||
from mceditlib.anvil.worldfolder import AnvilWorldFolder
|
||||
from mceditlib.blocktypes import pc_blocktypes
|
||||
from mceditlib.blocktypes import pc_blocktypes, PCBlockTypeSet, BlockType
|
||||
from mceditlib.geometry import Vector
|
||||
from mceditlib.selection import BoundingBox
|
||||
from mceditlib import nbtattr
|
||||
@ -436,6 +436,7 @@ class AnvilWorldAdapter(object):
|
||||
try:
|
||||
metadataTag = nbt.load(buf=self.selectedRevision.readFile("level.dat"))
|
||||
self.metadata = AnvilWorldMetadata(metadataTag)
|
||||
self.loadFMLMapping()
|
||||
except (EnvironmentError, zlib.error) as e:
|
||||
log.info("Error loading level.dat, trying level.dat_old ({0})".format(e))
|
||||
try:
|
||||
@ -455,6 +456,57 @@ class AnvilWorldAdapter(object):
|
||||
|
||||
# --- Create, save, close ---
|
||||
|
||||
def loadFMLMapping(self):
|
||||
metadataTag = self.metadata.metadataTag
|
||||
fml = metadataTag.get('FML')
|
||||
if fml is None:
|
||||
return
|
||||
|
||||
mid = fml.get('ModItemData') # MC 1.6
|
||||
if mid is not None:
|
||||
log.info("Adding block IDs from FML for MC 1.6")
|
||||
blocktypes = PCBlockTypeSet()
|
||||
for entry in mid:
|
||||
ID = entry['ItemId'].value
|
||||
meta = entry['ordinal'].value
|
||||
name = entry['ItemType'].value
|
||||
if (ID, 0) not in blocktypes.statesByID:
|
||||
blocktypes.IDsByState[name] = ID, meta
|
||||
blocktypes.statesByID[ID, meta] = name
|
||||
blocktypes.blockJsons[name] = {
|
||||
'displayName':name,
|
||||
'internalName':name,
|
||||
'blockState':'',
|
||||
}
|
||||
blocktypes.allBlocks.append(BlockType(ID, meta, blocktypes))
|
||||
|
||||
blocktypes.allBlocks.sort()
|
||||
self.blocktypes = blocktypes
|
||||
|
||||
itemdata = fml.get('ItemData') # MC 1.7
|
||||
if itemdata is not None:
|
||||
count = 0
|
||||
log.info("Adding block IDs from FML for MC 1.7")
|
||||
blocktypes = PCBlockTypeSet()
|
||||
for entry in itemdata:
|
||||
ID = entry['V'].value
|
||||
name = entry['K'].value
|
||||
if (ID, 0) not in blocktypes.statesByID:
|
||||
count += 1
|
||||
blocktypes.IDsByState[name] = ID, 0
|
||||
blocktypes.statesByID[ID, 0] = name
|
||||
blocktypes.blockJsons[name] = {
|
||||
'displayName':name,
|
||||
'internalName':name,
|
||||
'blockState':'',
|
||||
}
|
||||
blocktypes.allBlocks.append(BlockType(ID, 0, blocktypes))
|
||||
|
||||
blocktypes.allBlocks.sort()
|
||||
log.info("Added %d blocks.", count)
|
||||
self.blocktypes = blocktypes
|
||||
|
||||
|
||||
def _createMetadataTag(self, random_seed=None):
|
||||
"""
|
||||
Create a level.dat for a newly created world or a world found with damaged level.dat/.dat_old (xxx repair in
|
||||
|
Reference in New Issue
Block a user