Ver código fonte

added new sellbot leg factory

Darren Ranalli 22 anos atrás
pai
commit
23a63b2e73

+ 6 - 6
direct/src/level/BasicEntities.py

@@ -17,12 +17,6 @@ class NodePathAttribs:
         if doReparent:
         if doReparent:
             self.callSetters('parentEntId')
             self.callSetters('parentEntId')
 
 
-    def setParentEntId(self, parentEntId):
-        self.parentEntId = parentEntId
-        self.level.requestReparent(self.getNodePath(), self.parentEntId)
-
-    def reparentTo(self, *args): self.getNodePath().reparentTo(*args)
-
     def setPos(self, *args): self.getNodePath().setPos(*args)
     def setPos(self, *args): self.getNodePath().setPos(*args)
     def setX(self, *args): self.getNodePath().setX(*args)
     def setX(self, *args): self.getNodePath().setX(*args)
     def setY(self, *args): self.getNodePath().setY(*args)
     def setY(self, *args): self.getNodePath().setY(*args)
@@ -38,6 +32,12 @@ class NodePathAttribs:
     def setSy(self, *args): self.getNodePath().setSy(*args)
     def setSy(self, *args): self.getNodePath().setSy(*args)
     def setSz(self, *args): self.getNodePath().setSz(*args)
     def setSz(self, *args): self.getNodePath().setSz(*args)
     
     
+    def reparentTo(self, *args): self.getNodePath().reparentTo(*args)
+
+    def setParentEntId(self, parentEntId):
+        self.parentEntId = parentEntId
+        self.level.requestReparent(self, self.parentEntId)
+
 class privNodePathImpl(NodePath.NodePath):
 class privNodePathImpl(NodePath.NodePath):
     def __init__(self, name):
     def __init__(self, name):
         node = hidden.attachNewNode(name)
         node = hidden.attachNewNode(name)

+ 20 - 35
direct/src/level/DistributedLevel.py

@@ -198,6 +198,9 @@ class DistributedLevel(DistributedObject.DistributedObject,
         # fix up the floor collisions for walkable zones *before*
         # fix up the floor collisions for walkable zones *before*
         # any entities get put under the model
         # any entities get put under the model
         for zoneNum,zoneNode in self.zoneNum2node.items():
         for zoneNum,zoneNode in self.zoneNum2node.items():
+            # don't do this to the uberzone
+            if zoneNum == LevelConstants.UberZoneNum:
+                continue
             # if this is a walkable zone, fix up the model
             # if this is a walkable zone, fix up the model
             allColls = zoneNode.findAllMatches('**/+CollisionNode').asList()
             allColls = zoneNode.findAllMatches('**/+CollisionNode').asList()
             # which of them, if any, are floors?
             # which of them, if any, are floors?
@@ -225,35 +228,6 @@ class DistributedLevel(DistributedObject.DistributedObject,
                     self.toonEnterZone(zoneNum)
                     self.toonEnterZone(zoneNum)
                 self.accept('enter%s' % floorCollName, handleZoneEnter)
                 self.accept('enter%s' % floorCollName, handleZoneEnter)
 
 
-        # hack in another doorway
-        dw = self.geom.attachNewNode('Doorway27')
-        dw.setPos(-49.4,86.7,19.26)
-        dw.setH(0)
-
-        # find the doorway nodes
-        # this is going to go away soon.
-        def findNumberedNodes(baseString, model=self.geom, self=self):
-            # finds nodes whose name follows the pattern 'baseString#'
-            # where there are no characters after #
-            # returns dictionary that maps # to node
-            potentialNodes = model.findAllMatches(
-                '**/%s*' % baseString).asList()
-            num2node = {}
-            for potentialNode in potentialNodes:
-                name = potentialNode.getName()
-                DistributedLevel.notify.debug('potential match for %s: %s' %
-                                  (baseString, name))
-                try:
-                    num = int(name[len(baseString):])
-                except:
-                    continue
-                
-                num2node[num] = potentialNode
-
-            return num2node
-
-        self.doorwayNum2Node = findNumberedNodes('Doorway')
-
     def announceGenerate(self):
     def announceGenerate(self):
         DistributedLevel.notify.debug('announceGenerate')
         DistributedLevel.notify.debug('announceGenerate')
         DistributedObject.DistributedObject.announceGenerate(self)
         DistributedObject.DistributedObject.announceGenerate(self)
@@ -287,10 +261,6 @@ class DistributedLevel(DistributedObject.DistributedObject,
         # remove factory menu to SpeedChat
         # remove factory menu to SpeedChat
         toonbase.localToon.chatMgr.chatInputSpeedChat.removeFactoryMenu()
         toonbase.localToon.chatMgr.chatInputSpeedChat.removeFactoryMenu()
 
 
-    def getDoorwayNode(self, doorwayNum):
-        # returns node that doors should parent themselves to
-        return self.doorwayNum2Node[doorwayNum]
-
     def getZoneNode(self, zoneNum):
     def getZoneNode(self, zoneNum):
         return self.zoneNum2node[zoneNum]
         return self.zoneNum2node[zoneNum]
 
 
@@ -400,13 +370,23 @@ class DistributedLevel(DistributedObject.DistributedObject,
         if zoneNum not in self.zoneNum2entId:
         if zoneNum not in self.zoneNum2entId:
             DistributedLevel.notify.error(
             DistributedLevel.notify.error(
                 'no ZoneEntity for this zone (%s)!!' % zoneNum)
                 'no ZoneEntity for this zone (%s)!!' % zoneNum)
-            return
 
 
+        self.updateVisibility(zoneNum)
+
+    def updateVisibility(self, zoneNum=None):
+        """update the visibility assuming that we're in the specified
+        zone; don't check to see if it's the zone we're already in"""
+        if zoneNum is None:
+            zoneNum = self.curZoneNum
+            
         zoneEntId = self.zoneNum2entId[zoneNum]
         zoneEntId = self.zoneNum2entId[zoneNum]
         zoneSpec = self.levelSpec.getEntitySpec(zoneEntId)
         zoneSpec = self.levelSpec.getEntitySpec(zoneEntId)
         # use dicts to efficiently ensure that there are no duplicates
         # use dicts to efficiently ensure that there are no duplicates
         visibleZoneNums = list2dict([zoneNum])
         visibleZoneNums = list2dict([zoneNum])
         visibleZoneNums.update(list2dict(zoneSpec['visibility']))
         visibleZoneNums.update(list2dict(zoneSpec['visibility']))
+
+        # we should not have the uberZone in the list at this point
+        assert not 0 in visibleZoneNums
         
         
         if DistributedLevel.HideZones:
         if DistributedLevel.HideZones:
             # figure out which zones are new and which are going invisible
             # figure out which zones are new and which are going invisible
@@ -416,7 +396,7 @@ class DistributedLevel(DistributedObject.DistributedObject,
             removedZoneNums = []
             removedZoneNums = []
             allVZ = dict(visibleZoneNums)
             allVZ = dict(visibleZoneNums)
             allVZ.update(self.curVisibleZoneNums)
             allVZ.update(self.curVisibleZoneNums)
-            for vz,None in allVZ.items():
+            for vz,dummy in allVZ.items():
                 new = vz in visibleZoneNums
                 new = vz in visibleZoneNums
                 old = vz in self.curVisibleZoneNums
                 old = vz in self.curVisibleZoneNums
                 if new and old:
                 if new and old:
@@ -460,6 +440,11 @@ class DistributedLevel(DistributedObject.DistributedObject,
             value = eval(valueStr)
             value = eval(valueStr)
             self.levelSpec.setAttribChange(entId, attribName, value, username)
             self.levelSpec.setAttribChange(entId, attribName, value, username)
 
 
+        def handleVisChange(self):
+            """the zone visibility lists have changed"""
+            Level.Level.handleVisChange(self)
+            self.updateVisibility()
+
     def spawnTitleText(self):
     def spawnTitleText(self):
         def getDescription(zoneId, self=self):
         def getDescription(zoneId, self=self):
             entId = self.zoneNum2entId.get(zoneId)
             entId = self.zoneNum2entId.get(zoneId)

+ 4 - 0
direct/src/level/Level.py

@@ -322,3 +322,7 @@ class Level:
                 entity.destroy()
                 entity.destroy()
             # update our local type->entId table
             # update our local type->entId table
             self.entType2ids[self.getEntityType(entId)].remove(entId)
             self.entType2ids[self.getEntityType(entId)].remove(entId)
+
+        def handleVisChange(self):
+            """the zone visibility lists have changed"""
+            pass

+ 15 - 6
direct/src/level/LevelUtil.py

@@ -1,10 +1,11 @@
 """LevelUtil module: contains Level utility funcs"""
 """LevelUtil module: contains Level utility funcs"""
 
 
+import string
+
 def getZoneNum2Node(levelModel):
 def getZoneNum2Node(levelModel):
     """ given model, returns dict of ZoneNumber -> ZoneNode """
     """ given model, returns dict of ZoneNumber -> ZoneNode """
     def findNumberedNodes(baseString, model):
     def findNumberedNodes(baseString, model):
-        # finds nodes whose name follows the pattern 'baseString#'
-        # where there are no characters after #
+        # finds nodes whose name follows the pattern 'baseString#blah'
         # returns dictionary that maps # to node
         # returns dictionary that maps # to node
         potentialNodes = model.findAllMatches(
         potentialNodes = model.findAllMatches(
             '**/%s*' % baseString).asList()
             '**/%s*' % baseString).asList()
@@ -12,16 +13,24 @@ def getZoneNum2Node(levelModel):
         for potentialNode in potentialNodes:
         for potentialNode in potentialNodes:
             name = potentialNode.getName()
             name = potentialNode.getName()
             print 'potential match for %s: %s' % (baseString, name)
             print 'potential match for %s: %s' % (baseString, name)
-            try:
-                num = int(name[len(baseString):])
-            except:
+            name = name[len(baseString):]
+            numDigits = 0
+            while numDigits < len(name):
+                if name[numDigits] not in string.digits:
+                    break
+                numDigits += 1
+            if numDigits == 0:
                 continue
                 continue
-
+            num = int(name[:numDigits])
+            # do we already have a ZoneNode for this zone num?
+            assert not num in num2node
             num2node[num] = potentialNode
             num2node[num] = potentialNode
 
 
         return num2node
         return num2node
 
 
     zoneNum2node = findNumberedNodes('Zone', levelModel)
     zoneNum2node = findNumberedNodes('Zone', levelModel)
+    # temp
+    zoneNum2node.update(findNumberedNodes('ZONE', levelModel))
     # add the UberZone to the table
     # add the UberZone to the table
     zoneNum2node[0] = levelModel
     zoneNum2node[0] = levelModel
     return zoneNum2node
     return zoneNum2node

+ 6 - 0
direct/src/level/SpecUtil.py

@@ -82,3 +82,9 @@ def privUpdateSpec(spec, modelPath=None):
             spec.insertEntity(entId, 'zone', LevelConstants.UberZoneEntId)
             spec.insertEntity(entId, 'zone', LevelConstants.UberZoneEntId)
             spec.doSetAttrib(entId, 'name', 'zone%s' % zoneNum)
             spec.doSetAttrib(entId, 'name', 'zone%s' % zoneNum)
             spec.doSetAttrib(entId, 'modelZoneNum', zoneNum)
             spec.doSetAttrib(entId, 'modelZoneNum', zoneNum)
+            # by default, new zone can see every other zone
+            visList = list(modelZoneNums)
+            # cur zone and uberzone are implicit
+            visList.remove(zoneNum)
+            visList.remove(0)
+            spec.doSetAttrib(entId, 'visibility', visList)

+ 4 - 0
direct/src/level/ZoneEntity.py

@@ -12,3 +12,7 @@ class ZoneEntity(ZoneEntityBase.ZoneEntityBase, BasicEntities.NodePathAttribs):
 
 
     def getNodePath(self):
     def getNodePath(self):
         return self.nodePath
         return self.nodePath
+
+    def setVisibility(self, visibility):
+        self.visibility = visibility
+        self.level.handleVisChange()