move interest code to DoInterestManager

This commit is contained in:
Dave Schuyler 2005-01-28 02:55:41 +00:00
parent bfbfcc0f74
commit d50d46a46e
4 changed files with 135 additions and 129 deletions

View File

@ -15,13 +15,13 @@ from PyDatagram import PyDatagram
from PyDatagramIterator import PyDatagramIterator
class ClientRepository(ConnectionRepository.ConnectionRepository):
""" This maintains a client-side connection with a Panda server.
"""
This maintains a client-side connection with a Panda server.
It currently supports several different versions of the server:
within the VR Studio, we are currently in transition from the
Toontown server to the OTP server; people outside the VR studio
will use the Panda LAN server provided by CMU."""
will use the Panda LAN server provided by CMU.
"""
notify = DirectNotifyGlobal.directNotify.newCategory("ClientRepository")
def __init__(self):
@ -64,11 +64,11 @@ class ClientRepository(ConnectionRepository.ConnectionRepository):
self.heartbeatStarted = 0
self.lastHeartbeat = 0
if wantOtpServer:
# Top level Interest Manager
self._interestIdAssign = 1
self._interestIdScops = 100;
self._interests = {}
#%# if wantOtpServer:
#%# # Top level Interest Manager
#%# self._interestIdAssign = 1
#%# self._interestIdScops = 100;
#%# self._interests = {}
# By default, the ClientRepository is set up to respond to
# datagrams from the CMU Panda LAN server. You can
@ -577,7 +577,6 @@ class ClientRepository(ConnectionRepository.ConnectionRepository):
self.DOIDbase = di.getUint32()
self.DOIDlast = self.DOIDbase + di.getUint32()
self.DOIDnext = self.DOIDbase
return None
def handleRequestGenerates(self, di):
# When new clients join the zone of an object, they need to hear
@ -816,7 +815,8 @@ class ClientRepository(ConnectionRepository.ConnectionRepository):
self.handleUnexpectedMsgType(msgType, di)
if wantOtpServer:
#%#:
if 0 and wantOtpServer:
# interest managment
def addInterest(self, parentId, zoneIdList, description, event=None):
"""

View File

@ -1,14 +1,14 @@
from pandac.PandaModules import *
from direct.task import Task
from direct.directnotify import DirectNotifyGlobal
from direct.showbase import DirectObject
from direct.distributed.DoInterestManager import DoInterestManager
from PyDatagram import PyDatagram
from PyDatagramIterator import PyDatagramIterator
import types
import imp
class ConnectionRepository(DirectObject.DirectObject, CConnectionRepository):
class ConnectionRepository(DoInterestManager, CConnectionRepository):
"""
This is a base class for things that know how to establish a
connection (and exchange datagrams) with a gameserver. This
@ -18,7 +18,8 @@ class ConnectionRepository(DirectObject.DirectObject, CConnectionRepository):
taskPriority = -30
def __init__(self, config):
DirectObject.DirectObject.__init__(self)
assert self.notify.debugCall()
DoInterestManager.__init__(self)
CConnectionRepository.__init__(self)
self.setPythonRepository(self)

View File

@ -330,8 +330,8 @@ class DistributedObject(PandaObject):
self.__barrierContext = None
if wantOtpServer:
def addInterest(self, zoneId, note=""):
self.cr.addInterest(self.getDoId(), zoneId, note)
def addInterest(self, zoneId, note="", event=None):
self.cr.addInterest(self.getDoId(), zoneId, note, event)
def setLocation(self, parentId, zoneId):
# The store must run first so we know the old location

View File

@ -9,25 +9,21 @@ p.s. A great deal of this code is just code moved from ClientRepository.py.
from pandac.PandaModules import *
from MsgTypes import *
from direct.task import Task
from direct.directnotify import DirectNotifyGlobal
import CRCache
import ConnectionRepository
from direct.showbase import PythonUtil
import ParentMgr
import RelatedObjectMgr
import time
from ClockDelta import *
from direct.showbase.PythonUtil import *
from direct.showbase import DirectObject
from PyDatagram import PyDatagram
from PyDatagramIterator import PyDatagramIterator
#from PyDatagramIterator import PyDatagramIterator
class DoInterestManager(DirectObject.DirectObject):
"""
Top level Interest Manager
"""
if __debug__:
notify = DirectNotifyGlobal.directNotify.newCategory("DoInterestManager")
def __init__(self):
assert self.notify.debugCall()
DirectObject.DirectObject.__init__(self)
self._interestIdAssign = 1
self._interestIdScopes = 100;
@ -37,6 +33,7 @@ class DoInterestManager(DirectObject.DirectObject):
"""
Look into a zone.
"""
assert self.notify.debugCall()
self._interestIdAssign += 1
self._interestIdScopes += 1
contextId = self._interestIdAssign
@ -50,6 +47,7 @@ class DoInterestManager(DirectObject.DirectObject):
"""
Stop looking in a zone
"""
assert self.notify.debugCall()
answer = 0
if self._interests.has_key(contextId):
if event is not None:
@ -73,6 +71,7 @@ class DoInterestManager(DirectObject.DirectObject):
"""
Removes old interests and adds new interests.
"""
assert self.notify.debugCall()
answer = 0
if self._interests.has_key(contextId):
self._interestIdScopes += 1
@ -94,6 +93,7 @@ class DoInterestManager(DirectObject.DirectObject):
Part of the new otp-server code.
Return a ScopeId Id for an Interest
"""
assert self.notify.debugCall()
answer = 0
if self._interests.has_key(contextId):
answer = self._interests[contextId][1];
@ -106,6 +106,7 @@ class DoInterestManager(DirectObject.DirectObject):
"""
returns an event for an interest.
"""
assert self.notify.debugCall()
answer = None
if self._interests.has_key(contextId):
answer = self._interests[contextId][2];
@ -117,6 +118,7 @@ class DoInterestManager(DirectObject.DirectObject):
"""
Consider whether we should cull the interest set.
"""
assert self.notify.debugCall()
if self._interests.has_key(handle):
if self._interests[handle][3] == "PendingDel":
del self._interests[handle]
@ -146,6 +148,7 @@ class DoInterestManager(DirectObject.DirectObject):
necessarily have any relationship to the same contextId
on another client.
"""
assert self.notify.debugCall()
datagram = PyDatagram()
# Add message type
datagram.addUint16(CLIENT_ADD_INTEREST)
@ -169,6 +172,7 @@ class DoInterestManager(DirectObject.DirectObject):
necessarily have any relationship to the same contextId
on another client.
"""
assert self.notify.debugCall()
datagram = PyDatagram()
# Add message type
datagram.addUint16(CLIENT_REMOVE_INTEREST)
@ -180,19 +184,20 @@ class DoInterestManager(DirectObject.DirectObject):
This handles the interest done messages and may dispatch a
action based on the ID, Context
"""
assert self.notify.debugCall()
id = di.getUint16()
scope = di.getUint32()
expect_scope = self.GetInterestScopeID(id)
expect_scope = self.getInterestScopeId(id)
print "handleInterestDoneMessage--> Received ID:%s Scope:%s"%(id,scope);
if expect_scope == scope:
print "handleInterestDoneMessage--> Scope Match:%s Scope:%s"%(id,scope);
event = self.GetInterestScopeEvent(id)
event = self.getInterestScopeEvent(id)
if event is not None:
print "handleInterestDoneMessage--> Send Event : %s"%(event);
messenger.send(event)
else:
print "handleInterestDoneMessage--> No Event ";
self._PonderRemoveFlaggedInterest(id)
self._ponderRemoveFlaggedInterest(id)
else:
print "handleInterestDoneMessage--> Scope MisMatch :%s :%s"%(expect_scope,scope);