open_toontown_panda3d/direct/src/level/LevelMgr.py

90 lines
3.3 KiB
Python
Executable File

"""LevelMgr module: contains the LevelMgr class"""
from PythonUtil import Functor
import LevelMgrBase
class LevelMgr(LevelMgrBase.LevelMgrBase):
"""This class manages editable client-side level attributes"""
__attribs__ = (
'cogLevel',
'cogTrack',
'modelFilename',
)
def __init__(self, level, entId):
LevelMgrBase.LevelMgrBase.__init__(self, level, entId)
# load the model
self.geom = loader.loadModel(self.modelFilename)
# modelZoneNum -> zone entId
self.level.zoneNum2entId = {}
# modelZoneNum -> network zoneId
self.level.zoneNum2zoneId = {}
# zone entId -> network zoneId
self.level.zoneEntId2zoneId = {}
# listen for every zone creation
self.accept(self.level.getEntityOfTypeCreateEvent('zone'),
self.handleZoneCreated)
def destroy(self):
del self.level.zoneIds
del self.level.zoneEntId2zoneId
del self.level.zoneNum2zoneId
del self.level.zoneNum2entId
self.geom.removeNode()
del self.geom
LevelMgrBase.LevelMgrBase.destroy(self)
def handleZoneCreated(self, entId):
zoneEnt = self.level.getEntity(entId)
# register the zone's info in the tables
# right off the bat, we have the zone's modelZoneNum and entId
self.level.zoneNum2entId[zoneEnt.modelZoneNum] = entId
# we can assume that we have a complete list of zoneIds in
# self.level.zoneIds. As each zone entity is created, set up
# as if we have all of the zone entities. This allows dynamic
# zone entity creation and deletion during editing.
# TODO: we should delay this until all zone entities have been
# created on level init
self.privAssignZoneIds()
# listen for the zone's destruction
self.accept(self.level.getEntityDestroyEvent(entId),
Functor(self.handleZoneDestroy, entId))
def handleZoneDestroy(self, entId):
zoneEnt = self.level.getEntity(entId)
# unregister the zone from the maps
del self.level.zoneNum2entId[zoneEnt.modelZoneNum]
del self.level.zoneNum2zoneId[zoneEnt.modelZoneNum]
del self.level.zoneEntId2zoneId[entId]
# reassign the zoneIds (we may not need to do this, if all of the
# other entities already have their correct zoneId...?)
self.privAssignZoneIds()
def privAssignZoneIds(self):
"""assign zoneIds from self.level.zoneIds, according to the zones
that are registered so far in self.level.zoneNum2entId"""
# sort the model zoneNums
modelZoneNums = self.level.zoneNum2entId.keys()
modelZoneNums.sort()
# dole out the zoneIds, in increasing order of zoneNum
for i in range(len(modelZoneNums)):
zoneNum = modelZoneNums[i]
entId = self.level.zoneNum2entId[zoneNum]
zoneEnt = self.level.getEntity(entId)
zoneEnt.setZoneId(self.level.zoneIds[i])
# the zoneIds have shifted. update the tables
for entId in self.level.zoneNum2entId.values():
zoneEnt = self.level.getEntity(entId)
zoneId = zoneEnt.getZoneId()
self.level.zoneNum2zoneId[zoneEnt.modelZoneNum] = zoneId
self.level.zoneEntId2zoneId[entId] = zoneId