refactoring. create TagProperty() to create a getter+setter that automatically creates a required tag when it is absent. extract createPlayer() out of create() and getPlayerPath out of getPlayerTag
This commit is contained in:
parent
3b80ead4a7
commit
5e4c57a883
124
infiniteworld.py
124
infiniteworld.py
@ -6,6 +6,7 @@ Created on Jul 22, 2011
|
|||||||
from mclevelbase import *
|
from mclevelbase import *
|
||||||
from collections import deque;
|
from collections import deque;
|
||||||
import time
|
import time
|
||||||
|
import zlib
|
||||||
import struct
|
import struct
|
||||||
|
|
||||||
#infinite
|
#infinite
|
||||||
@ -835,7 +836,7 @@ def base36(n):
|
|||||||
|
|
||||||
return neg + ''.join(reversed(work))
|
return neg + ''.join(reversed(work))
|
||||||
|
|
||||||
import zlib
|
|
||||||
def deflate(data):
|
def deflate(data):
|
||||||
#zobj = zlib.compressobj(6,zlib.DEFLATED,-zlib.MAX_WBITS,zlib.DEF_MEM_LEVEL,0)
|
#zobj = zlib.compressobj(6,zlib.DEFLATED,-zlib.MAX_WBITS,zlib.DEF_MEM_LEVEL,0)
|
||||||
#zdata = zobj.compress(data)
|
#zdata = zobj.compress(data)
|
||||||
@ -892,52 +893,23 @@ class MCInfdevOldLevel(MCLevel):
|
|||||||
def __str__(self):
|
def __str__(self):
|
||||||
return "MCInfdevOldLevel(" + os.path.split(self.worldDir)[1] + ")"
|
return "MCInfdevOldLevel(" + os.path.split(self.worldDir)[1] + ")"
|
||||||
|
|
||||||
@property
|
def TagProperty(tagName, tagType, defaultValueFunc=lambda self:None):
|
||||||
def SizeOnDisk(self):
|
def getter(self):
|
||||||
return self.root_tag[Data]['SizeOnDisk'].value
|
if tagName not in self.root_tag[Data]:
|
||||||
|
self.root_tag[Data][tagName] = tagType(defaultValueFunc(self))
|
||||||
|
return self.root_tag[Data][tagName].value
|
||||||
|
|
||||||
@SizeOnDisk.setter
|
def setter(self, val):
|
||||||
def SizeOnDisk(self, val):
|
self.root_tag[Data][tagName] = tagType(value=val)
|
||||||
if 'SizeOnDisk' not in self.root_tag[Data]:
|
|
||||||
self.root_tag[Data]['SizeOnDisk'] = TAG_Long(value=val)
|
|
||||||
else:
|
|
||||||
self.root_tag[Data]['SizeOnDisk'].value = val
|
|
||||||
|
|
||||||
@property
|
return property(getter, setter)
|
||||||
def RandomSeed(self):
|
|
||||||
return self.root_tag[Data]['RandomSeed'].value
|
|
||||||
|
|
||||||
@RandomSeed.setter
|
SizeOnDisk = TagProperty('SizeOnDisk', TAG_Long)
|
||||||
def RandomSeed(self, val):
|
RandomSeed = TagProperty('RandomSeed', TAG_Long)
|
||||||
self.root_tag[Data]['RandomSeed'].value = val
|
Time = TagProperty('Time', TAG_Long); """ Age of the world in ticks. 20 ticks per second; 24000 ticks per day."""
|
||||||
|
LastPlayed = TagProperty('LastPlayed', TAG_Long, lambda self:long(time.time()*1000))
|
||||||
|
|
||||||
@property
|
LevelName = TagProperty('LevelName', TAG_String, lambda self:self.displayName)
|
||||||
def Time(self):
|
|
||||||
""" Age of the world in ticks. 20 ticks per second; 24000 ticks per day."""
|
|
||||||
return self.root_tag[Data]['Time'].value
|
|
||||||
|
|
||||||
@Time.setter
|
|
||||||
def Time(self, val):
|
|
||||||
self.root_tag[Data]['Time'].value = val
|
|
||||||
|
|
||||||
@property
|
|
||||||
def LastPlayed(self):
|
|
||||||
return self.root_tag[Data]['LastPlayed'].value
|
|
||||||
|
|
||||||
@LastPlayed.setter
|
|
||||||
def LastPlayed(self, val):
|
|
||||||
self.root_tag[Data]['LastPlayed'].value = val
|
|
||||||
|
|
||||||
@property
|
|
||||||
def LevelName(self):
|
|
||||||
if 'LevelName' not in self.root_tag[Data]:
|
|
||||||
return self.displayName
|
|
||||||
|
|
||||||
return self.root_tag[Data]['LevelName'].value
|
|
||||||
|
|
||||||
@LevelName.setter
|
|
||||||
def LevelName(self, val):
|
|
||||||
self.root_tag[Data]['LevelName'] = TAG_String(val)
|
|
||||||
|
|
||||||
_bounds = None
|
_bounds = None
|
||||||
@property
|
@property
|
||||||
@ -971,39 +943,48 @@ class MCInfdevOldLevel(MCLevel):
|
|||||||
if random_seed is None:
|
if random_seed is None:
|
||||||
random_seed = long(random.random() * 0xffffffffffffffffL) - 0x8000000000000000L
|
random_seed = long(random.random() * 0xffffffffffffffffL) - 0x8000000000000000L
|
||||||
|
|
||||||
root_tag[Data]['LastPlayed'] = TAG_Long(long(last_played))
|
self.root_tag = root_tag;
|
||||||
root_tag[Data]['RandomSeed'] = TAG_Long(long(random_seed))
|
|
||||||
root_tag[Data]['SizeOnDisk'] = TAG_Long(long(0))
|
|
||||||
root_tag[Data]['Time'] = TAG_Long(1)
|
|
||||||
|
|
||||||
root_tag[Data]['version'] = TAG_Int(19132)
|
root_tag[Data]['version'] = TAG_Int(19132)
|
||||||
root_tag[Data]['LevelName'] = TAG_String(os.path.basename(self.worldDir))
|
|
||||||
|
self.LastPlayed = long(last_played)
|
||||||
|
self.RandomSeed = long(random_seed)
|
||||||
|
self.SizeOnDisk = 0
|
||||||
|
self.Time = 1
|
||||||
|
self.LevelName = os.path.basename(self.worldDir)
|
||||||
|
|
||||||
### if singleplayer:
|
### if singleplayer:
|
||||||
root_tag[Data][Player] = TAG_Compound()
|
|
||||||
|
|
||||||
|
self.createPlayer("Player")
|
||||||
root_tag[Data][Player]['Air'] = TAG_Short(300);
|
|
||||||
root_tag[Data][Player]['AttackTime'] = TAG_Short(0)
|
|
||||||
root_tag[Data][Player]['DeathTime'] = TAG_Short(0);
|
|
||||||
root_tag[Data][Player]['Fire'] = TAG_Short(-20);
|
|
||||||
root_tag[Data][Player]['Health'] = TAG_Short(20);
|
|
||||||
root_tag[Data][Player]['HurtTime'] = TAG_Short(0);
|
|
||||||
root_tag[Data][Player]['Score'] = TAG_Int(0);
|
|
||||||
root_tag[Data][Player]['FallDistance'] = TAG_Float(0)
|
|
||||||
root_tag[Data][Player]['OnGround'] = TAG_Byte(0)
|
|
||||||
|
|
||||||
root_tag[Data][Player]['Inventory'] = TAG_List()
|
|
||||||
|
|
||||||
root_tag[Data][Player]['Motion'] = TAG_List([TAG_Double(0) for i in range(3)])
|
|
||||||
root_tag[Data][Player]['Pos'] = TAG_List([TAG_Double([0.5, 2.8, 0.5][i]) for i in range(3)])
|
|
||||||
root_tag[Data][Player]['Rotation'] = TAG_List([TAG_Float(0), TAG_Float(0)])
|
|
||||||
|
|
||||||
#root_tag["Creator"] = TAG_String("MCEdit-"+release.release);
|
|
||||||
|
|
||||||
if not os.path.exists(self.worldDir):
|
if not os.path.exists(self.worldDir):
|
||||||
os.mkdir(self.worldDir)
|
os.mkdir(self.worldDir)
|
||||||
|
|
||||||
self.root_tag = root_tag;
|
|
||||||
|
|
||||||
|
def createPlayer(self, playerName):
|
||||||
|
if playerName == "Player":
|
||||||
|
playerTag = self.root_tag[Data].setdefault(playerName, TAG_Compound())
|
||||||
|
else:
|
||||||
|
playerTag = TAG_Compound()
|
||||||
|
|
||||||
|
playerTag['Air'] = TAG_Short(300);
|
||||||
|
playerTag['AttackTime'] = TAG_Short(0)
|
||||||
|
playerTag['DeathTime'] = TAG_Short(0);
|
||||||
|
playerTag['Fire'] = TAG_Short(-20);
|
||||||
|
playerTag['Health'] = TAG_Short(20);
|
||||||
|
playerTag['HurtTime'] = TAG_Short(0);
|
||||||
|
playerTag['Score'] = TAG_Int(0);
|
||||||
|
playerTag['FallDistance'] = TAG_Float(0)
|
||||||
|
playerTag['OnGround'] = TAG_Byte(0)
|
||||||
|
|
||||||
|
playerTag['Inventory'] = TAG_List()
|
||||||
|
|
||||||
|
playerTag['Motion'] = TAG_List([TAG_Double(0) for i in range(3)])
|
||||||
|
playerTag['Pos'] = TAG_List([TAG_Double([0.5, 2.8, 0.5][i]) for i in range(3)])
|
||||||
|
playerTag['Rotation'] = TAG_List([TAG_Float(0), TAG_Float(0)])
|
||||||
|
|
||||||
|
if playerName != "Player":
|
||||||
|
self.playerTagCache.save(self.getPlayerPath(playerName))
|
||||||
|
|
||||||
def __init__(self, filename=None, create=False, random_seed=None, last_played=None):
|
def __init__(self, filename=None, create=False, random_seed=None, last_played=None):
|
||||||
"""
|
"""
|
||||||
@ -2346,6 +2327,9 @@ class MCInfdevOldLevel(MCLevel):
|
|||||||
for name, val in zip(self.spawnxyz, pos):
|
for name, val in zip(self.spawnxyz, pos):
|
||||||
playerSpawnTag[name] = nbt.TAG_Int(val);
|
playerSpawnTag[name] = nbt.TAG_Int(val);
|
||||||
|
|
||||||
|
def getPlayerPath(self, player):
|
||||||
|
assert player != "Player"
|
||||||
|
return os.path.join(self.worldDir, "players", player + ".dat")
|
||||||
|
|
||||||
def getPlayerTag(self, player="Player"):
|
def getPlayerTag(self, player="Player"):
|
||||||
if player == "Player" and player in self.root_tag["Data"]:
|
if player == "Player" and player in self.root_tag["Data"]:
|
||||||
@ -2353,7 +2337,7 @@ class MCInfdevOldLevel(MCLevel):
|
|||||||
return self.root_tag["Data"]["Player"];
|
return self.root_tag["Data"]["Player"];
|
||||||
|
|
||||||
else:
|
else:
|
||||||
playerFilePath = os.path.join(self.worldDir, "players", player + ".dat")
|
playerFilePath = self.getPlayerPath(player)
|
||||||
if os.path.exists(playerFilePath):
|
if os.path.exists(playerFilePath):
|
||||||
#multiplayer world, found this player
|
#multiplayer world, found this player
|
||||||
playerTag = self.playerTagCache.get(playerFilePath)
|
playerTag = self.playerTagCache.get(playerFilePath)
|
||||||
|
7
tests.py
7
tests.py
@ -106,6 +106,13 @@ class TestAlphaLevel(unittest.TestCase):
|
|||||||
self.indevlevel = TempLevel("hell.mclevel")
|
self.indevlevel = TempLevel("hell.mclevel")
|
||||||
self.alphalevel = TempLevel("PyTestWorld")
|
self.alphalevel = TempLevel("PyTestWorld")
|
||||||
|
|
||||||
|
def testUnsetProperties(self):
|
||||||
|
level = self.alphalevel.level
|
||||||
|
del level.root_tag['Data']['LastPlayed']
|
||||||
|
import time
|
||||||
|
level.LastPlayed
|
||||||
|
level.LastPlayed = time.time() * 1000 - 1000000
|
||||||
|
|
||||||
|
|
||||||
def testCreateChunks(self):
|
def testCreateChunks(self):
|
||||||
indevlevel = self.indevlevel.level
|
indevlevel = self.indevlevel.level
|
||||||
|
Reference in New Issue
Block a user