mirror of
https://github.com/Sneed-Group/Poodletooth-iLand
synced 2024-12-25 04:32:33 -06:00
106 lines
3.4 KiB
Python
106 lines
3.4 KiB
Python
|
|
||
|
from direct.showbase.DirectObject import DirectObject
|
||
|
from direct.directnotify import DirectNotifyGlobal
|
||
|
|
||
|
class DistributedObjectBase(DirectObject):
|
||
|
"""
|
||
|
The Distributed Object class is the base class for all network based
|
||
|
(i.e. distributed) objects. These will usually (always?) have a
|
||
|
dclass entry in a *.dc file.
|
||
|
"""
|
||
|
notify = DirectNotifyGlobal.directNotify.newCategory("DistributedObjectBase")
|
||
|
|
||
|
def __init__(self, cr):
|
||
|
assert self.notify.debugStateCall(self)
|
||
|
self.cr = cr
|
||
|
self.children = {}
|
||
|
self.parentId = None
|
||
|
self.zoneId = None
|
||
|
|
||
|
if __debug__:
|
||
|
def status(self, indent=0):
|
||
|
"""
|
||
|
print out "doId(parentId, zoneId) className"
|
||
|
"""
|
||
|
spaces=' '*(indent+2)
|
||
|
try:
|
||
|
print "%s%s:"%(
|
||
|
' '*indent, self.__class__.__name__)
|
||
|
print "%sfrom DistributedObject doId:%s, parent:%s, zone:%s"%(
|
||
|
spaces,
|
||
|
self.doId, self.parentId, self.zoneId),
|
||
|
except Exception, e: print "%serror printing status"%(spaces,), e
|
||
|
|
||
|
def getLocation(self):
|
||
|
try:
|
||
|
if self.parentId == 0 and self.zoneId == 0:
|
||
|
return None
|
||
|
# This is a -1 stuffed into a uint32
|
||
|
if self.parentId == 0xffffffff and self.zoneId == 0xffffffff:
|
||
|
return None
|
||
|
return (self.parentId, self.zoneId)
|
||
|
except AttributeError:
|
||
|
return None
|
||
|
|
||
|
def handleChildArrive(self, childObj, zoneId):
|
||
|
"""
|
||
|
A new child has just setLocation beneath us. Give us a
|
||
|
chance to run code when a new child sets location to us. For
|
||
|
example, we may want to scene graph reparent the child to
|
||
|
some subnode we own.
|
||
|
"""
|
||
|
assert self.notify.debugCall()
|
||
|
# Inheritors should override
|
||
|
pass
|
||
|
|
||
|
def handleChildArriveZone(self, childObj, zoneId):
|
||
|
"""
|
||
|
A child has just changed zones beneath us with setLocation.
|
||
|
Give us a chance to run code when an existing child sets
|
||
|
location to us. For example, we may want to scene graph
|
||
|
reparent the child to some subnode we own.
|
||
|
"""
|
||
|
assert self.notify.debugCall()
|
||
|
# Inheritors should override
|
||
|
pass
|
||
|
|
||
|
def handleChildLeave(self, childObj, zoneId):
|
||
|
"""
|
||
|
A child is about to setLocation away from us. Give us a
|
||
|
chance to run code just before a child sets location away from us.
|
||
|
"""
|
||
|
assert self.notify.debugCall()
|
||
|
# Inheritors should override
|
||
|
pass
|
||
|
|
||
|
def handleChildLeaveZone(self, childObj, zoneId):
|
||
|
"""
|
||
|
A child is about to setLocation to another zone beneath us.
|
||
|
Give us a chance to run code just before a child sets
|
||
|
location to that zone.
|
||
|
"""
|
||
|
assert self.notify.debugCall()
|
||
|
# Inheritors should override
|
||
|
pass
|
||
|
|
||
|
def handleQueryObjectChildrenLocalDone(self, context):
|
||
|
assert self.notify.debugCall()
|
||
|
# Inheritors should override
|
||
|
pass
|
||
|
|
||
|
def getParentObj(self):
|
||
|
if self.parentId is None:
|
||
|
return None
|
||
|
return self.cr.doId2do.get(self.parentId)
|
||
|
|
||
|
def hasParentingRules(self):
|
||
|
return self.dclass.getFieldByName('setParentingRules') != None
|
||
|
|
||
|
def delete(self):
|
||
|
"""
|
||
|
Overwrite this to handle cleanup right before this object
|
||
|
gets deleted.
|
||
|
"""
|
||
|
pass
|
||
|
|