2019-11-02 17:27:54 -05:00
|
|
|
from direct.showbase.DirectObject import DirectObject
|
|
|
|
from direct.showbase.PythonUtil import lineInfo
|
|
|
|
from direct.directnotify import DirectNotifyGlobal
|
|
|
|
|
|
|
|
class Entity(DirectObject):
|
|
|
|
notify = DirectNotifyGlobal.directNotify.newCategory('Entity')
|
|
|
|
|
|
|
|
def __init__(self, level = None, entId = None):
|
|
|
|
self.initializeEntity(level, entId)
|
|
|
|
|
|
|
|
def initializeEntity(self, level, entId):
|
|
|
|
self.level = level
|
|
|
|
self.entId = entId
|
|
|
|
if self.level is not None and self.entId is not None:
|
|
|
|
self.level.initializeEntity(self)
|
|
|
|
return
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
if hasattr(self, 'level') and self.level:
|
|
|
|
return 'ent%s(%s)' % (self.entId, self.level.getEntityType(self.entId))
|
|
|
|
elif hasattr(self, 'name'):
|
|
|
|
return self.name
|
|
|
|
elif hasattr(self, 'entId'):
|
|
|
|
return '%s-%s' % (self.__class__.__name__, self.entId)
|
|
|
|
else:
|
|
|
|
return self.__class__.__name__
|
|
|
|
|
|
|
|
def destroy(self):
|
|
|
|
Entity.notify.debug('Entity.destroy() %s' % self.entId)
|
|
|
|
if self.level:
|
|
|
|
if self.level.isInitialized():
|
|
|
|
self.level.onEntityDestroy(self.entId)
|
|
|
|
else:
|
|
|
|
Entity.notify.warning('Entity %s destroyed after level??' % self.entId)
|
|
|
|
self.ignoreAll()
|
|
|
|
del self.level
|
|
|
|
del self.entId
|
|
|
|
|
|
|
|
def getUniqueName(self, name, entId = None):
|
|
|
|
if entId is None:
|
|
|
|
entId = self.entId
|
|
|
|
return '%s-%s-%s' % (name, self.level.levelId, entId)
|
|
|
|
|
|
|
|
def getParentToken(self):
|
|
|
|
return self.level.getParentTokenForEntity(self.entId)
|
|
|
|
|
|
|
|
def getOutputEventName(self, entId = None):
|
|
|
|
if entId is None:
|
|
|
|
entId = self.entId
|
|
|
|
return self.getUniqueName('entityOutput', entId)
|
|
|
|
|
|
|
|
def getZoneEntId(self):
|
|
|
|
return self.level.getEntityZoneEntId(self.entId)
|
|
|
|
|
|
|
|
def getZoneEntity(self):
|
|
|
|
return self.level.getEntity(self.getZoneEntId())
|
|
|
|
|
|
|
|
def getZoneNode(self):
|
|
|
|
return self.getZoneEntity().getNodePath()
|
|
|
|
|
|
|
|
def privGetSetter(self, attrib):
|
2020-01-08 16:47:17 -06:00
|
|
|
setFuncName = 'set%s%s' % (attrib[0].upper(), attrib[1:])
|
2019-11-02 17:27:54 -05:00
|
|
|
if hasattr(self, setFuncName):
|
|
|
|
return getattr(self, setFuncName)
|
|
|
|
return None
|
|
|
|
|
|
|
|
def callSetters(self, *attribs):
|
|
|
|
self.privCallSetters(0, *attribs)
|
|
|
|
|
|
|
|
def callSettersAndDelete(self, *attribs):
|
|
|
|
self.privCallSetters(1, *attribs)
|
|
|
|
|
|
|
|
def privCallSetters(self, doDelete, *attribs):
|
|
|
|
for attrib in attribs:
|
|
|
|
if hasattr(self, attrib):
|
|
|
|
setter = self.privGetSetter(attrib)
|
|
|
|
if setter is not None:
|
|
|
|
value = getattr(self, attrib)
|
|
|
|
if doDelete:
|
|
|
|
delattr(self, attrib)
|
|
|
|
setter(value)
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
def setAttribInit(self, attrib, value):
|
|
|
|
self.__dict__[attrib] = value
|
|
|
|
|
|
|
|
if __dev__:
|
|
|
|
|
|
|
|
def handleAttribChange(self, attrib, value):
|
|
|
|
setter = self.privGetSetter(attrib)
|
|
|
|
if setter is not None:
|
|
|
|
setter(value)
|
|
|
|
else:
|
|
|
|
self.__dict__[attrib] = value
|
|
|
|
self.attribChanged(attrib, value)
|
|
|
|
return
|
|
|
|
|
|
|
|
def attribChanged(self, attrib, value):
|
|
|
|
pass
|