Browse Source

added VisibilityBlocker

Darren Ranalli 22 years ago
parent
commit
e25ab93820
2 changed files with 31 additions and 37 deletions
  1. 0 37
      direct/src/level/DistributedLevel.py
  2. 31 0
      direct/src/level/VisibilityBlocker.py

+ 0 - 37
direct/src/level/DistributedLevel.py

@@ -63,9 +63,6 @@ class DistributedLevel(DistributedObject.DistributedObject,
             )
         self.zonesEnteredList = []
         self.fColorZones = 0
-        # we use these to track setZone requests
-        self.setZonesRequested = 0
-        self.setZonesReceived = 0
 
     def generate(self):
         DistributedLevel.notify.debug('generate')
@@ -446,10 +443,6 @@ class DistributedLevel(DistributedObject.DistributedObject,
                     self.camEnterZone(zoneNum)
         self.accept('on-floor', handleCameraRayFloorCollision)
 
-        # register our datagram handler to listen for setZone msgs
-        self.oldTcrHandler = toonbase.tcr.handler
-        toonbase.tcr.handler = self.handleDatagram
-
         # if no viz, listen to all the zones
         if not DistributedLevel.WantVisibility:
             zoneNums = list(self.zoneNums)
@@ -465,35 +458,6 @@ class DistributedLevel(DistributedObject.DistributedObject,
     def shutdownVisibility(self):
         taskMgr.remove(self.uniqueName(DistributedLevel.VisChangeTaskName))
 
-        if toonbase.tcr.handler == self.handleDatagram:
-            toonbase.tcr.handler = self.oldTcrHandler
-        del self.oldTcrHandler
-
-    def getSetZoneCompleteEvent(self, num):
-        return self.uniqueName('setZoneComplete-%s' % num)
-
-    def getNextSetZoneCompleteEvent(self):
-        return self.uniqueName('setZoneComplete-%s' % self.setZonesRequested)
-
-    def handleDatagram(self, msgType, di):
-        if msgType == CLIENT_DONE_SET_ZONE_RESP:
-            # snoop to see what zone we're talking about
-            di2 = DatagramIterator(di)
-            zone = di2.getUint32()
-            if zone != self.levelZone:
-                self.notify.warning('got setZoneComplete for unknown zone %s' %
-                                    zone)
-            else:
-                self.notify.info('setZone #%s complete' % self.setZonesReceived)
-                messenger.send(self.getSetZoneCompleteEvent(
-                    self.setZonesReceived))
-                self.setZonesReceived += 1
-            
-        if self.oldTcrHandler is None:
-            toonbase.tcr.handleUnexpectedMsgType(msgType, di)
-        else:
-            self.oldTcrHandler(msgType, di)
-
     def toonEnterZone(self, zoneNum, ouchLevel=None):
         """
         zoneNum is an int.
@@ -628,7 +592,6 @@ class DistributedLevel(DistributedObject.DistributedObject,
                 self.hideZone(rz)
 
         self.setVisibility(visibleZoneNums.keys())
-        self.setZonesRequested += 1
 
         self.curZoneNum = zoneNum
         self.curVisibleZoneNums = visibleZoneNums

+ 31 - 0
direct/src/level/VisibilityBlocker.py

@@ -0,0 +1,31 @@
+"""VisibilityBlocker module: contains the VisibilityBlocker class"""
+
+import Entity
+
+class VisibilityBlocker:
+    """This is a mixin class for level entities (see Entity.py) that in some
+    way 'block' visibility (such as doors) -- entities that can completely
+    obscure what's behind them. It provides the blocker with a mechanism
+    whereby they are informed of when it is safe for them to 'unblock' the
+    visibility and show what's behind them. Without this mechanism, the
+    blocker might show what's behind it before all of the distributed objects
+    behind it have been generated."""
+    def __init__(self):
+        # this may do something in the future; please call down to it
+        pass
+
+    def destroy(self):
+        self.ignoreAll()
+
+    def requestUnblockVis(self):
+        """derived class should call this before the end of the frame in which
+        they cause the visibility to be extended. okToUnblockVis (see below)
+        will be called when it's safe to show the new zones."""
+        self.accept(self.level.tcr.getNextSetZoneDoneEvent(),
+                    self.okToUnblockVis)
+
+    def okToUnblockVis(self):
+        """derived class should override this func and do the vis unblock
+        (i.e. open the door, etc.)"""
+        # this may do something in the future; please call down to it
+        pass