From ebf7be4920b0dbe1141d352ec2896ed0ebff0ce4 Mon Sep 17 00:00:00 2001 From: Darren Ranalli Date: Sat, 4 Dec 2004 01:49:16 +0000 Subject: [PATCH] support for multiple levels on single client --- direct/src/level/DistributedEntityAI.py | 3 +- direct/src/level/EditorGlobals.py | 39 +++++++++++++++++-------- direct/src/level/Entity.py | 7 +++++ direct/src/level/Level.py | 7 +++++ 4 files changed, 43 insertions(+), 13 deletions(-) diff --git a/direct/src/level/DistributedEntityAI.py b/direct/src/level/DistributedEntityAI.py index 4ec6066b41..17ffb1aa30 100755 --- a/direct/src/level/DistributedEntityAI.py +++ b/direct/src/level/DistributedEntityAI.py @@ -39,4 +39,5 @@ class DistributedEntityAI(DistributedObjectAI.DistributedObjectAI, self.parentEntId = parentEntId # switch to new zone newZoneId = self.getZoneEntity().getZoneId() - self.sendSetZone(newZoneId) + if newZoneId != self.zoneId: + self.sendSetZone(newZoneId) diff --git a/direct/src/level/EditorGlobals.py b/direct/src/level/EditorGlobals.py index 6e51c21abd..3503cd049a 100755 --- a/direct/src/level/EditorGlobals.py +++ b/direct/src/level/EditorGlobals.py @@ -2,16 +2,22 @@ from direct.showbase.PythonUtil import uniqueElements +# levels should put themselves into the bboard under this posting +# to assert themselves as the level to be edited by ~edit +EditTargetPostName = 'inGameEditTarget' + EntIdRange = 10000 # Once a range has been assigned to a user, please don't change it. username2entIdBase = { - 'darren': 1*EntIdRange, - 'samir': 2*EntIdRange, - 'skyler': 3*EntIdRange, - 'joe': 4*EntIdRange, - 'DrEvil': 5*EntIdRange, - 'asad': 6*EntIdRange, - 'drose': 7*EntIdRange, + 'darren': 1*EntIdRange, + 'samir': 2*EntIdRange, + 'skyler': 3*EntIdRange, + 'joe': 4*EntIdRange, + 'DrEvil': 5*EntIdRange, + 'asad': 6*EntIdRange, + 'drose': 7*EntIdRange, + 'pappy': 8*EntIdRange, + 'patricia': 9*EntIdRange, } assert uniqueElements(username2entIdBase.values()) @@ -20,12 +26,21 @@ undefinedUsername = 'UNDEFINED_USERNAME' editUsername = config.GetString(usernameConfigVar, undefinedUsername) # call this to make sure things have been set up correctly -def assertReadyToEdit(): - assert editUsername != undefinedUsername, ( - "you must config '%s'; see %s.py" % (usernameConfigVar, __name__)) +def checkNotReadyToEdit(): + # returns error string if not ready, None if ready + if editUsername == undefinedUsername: + return "you must config '%s'; see %s.py" % ( + usernameConfigVar, __name__) # Feel free to add your name to the table if it's not in there - assert editUsername in username2entIdBase, ( - "unknown editor username '%s'; see %s.py" % (editUsername, __name__)) + if editUsername not in username2entIdBase: + return "unknown editor username '%s'; see %s.py" % ( + editUsername, __name__) + return None + +def assertReadyToEdit(): + msg = checkNotReadyToEdit() + if msg is not None: + assert False, msg def getEditUsername(): return editUsername diff --git a/direct/src/level/Entity.py b/direct/src/level/Entity.py index 4b2fc387b5..e6bf428eef 100755 --- a/direct/src/level/Entity.py +++ b/direct/src/level/Entity.py @@ -56,6 +56,13 @@ class Entity(DirectObject): entId = self.entId return '%s-%s-%s' % (name, self.level.levelId, entId) + def getParentToken(self): + """returns a value that uniquely identifies this entity for purposes + of distributed parenting""" + # give the level the option of modifying our entId, to handle instances + # where there are multiple levels present on the client simultaneously + return self.level.getParentTokenForEntity(self.entId) + def getOutputEventName(self, entId=None): """returns the event generated by an entity; defaults to this entity""" if entId is None: diff --git a/direct/src/level/Level.py b/direct/src/level/Level.py index cf5ff91377..681bec64b7 100755 --- a/direct/src/level/Level.py +++ b/direct/src/level/Level.py @@ -251,6 +251,13 @@ class Level: """returns the model zoneNum that corresponds to a network zoneId""" return self.zoneId2zoneNum[zoneId] + def getParentTokenForEntity(self, entId): + """returns a unique parent token for this entity""" + # default impl + # subclasses can override to allow for multiple levels present + # on the client simultaneously + return entId + # these events are thrown as the level initializes itself # LEVEL def getLevelPreCreateEvent(self):