def gotAllRooms(self):
        self.notify.debug('stage %s: got all rooms' % self.doId)
        if self.roomWatcher:
            self.roomWatcher.destroy()
            self.roomWatcher = None
        self.geom = render.attachNewNode('stage%s' % self.doId)
        for doId in self.roomDoIds:
            self.rooms.append(base.cr.doId2do[doId])
            self.rooms[-1].setStage(self)

        self.notify.info('stageId %s, floor %s, %s' %
                         (self.stageId, self.floorNum, self.rooms[0].avIdList))
        rng = self.layout.getRng()
        numRooms = self.layout.getNumRooms()
        for i, room in enumerate(self.rooms):
            if i == 0:
                room.getGeom().reparentTo(self.geom)
            else:
                room.attachTo(self.hallways[i - 1], rng)
            self.allRooms.append(room)
            self.listenForFloorEvents(room)
            if i < numRooms - 1:
                hallway = StageRoom.StageRoom(self.layout.getHallwayModel(i))
                hallway.attachTo(room, rng)
                hallway.setRoomNum(i * 2 + 1)
                hallway.initFloorCollisions()
                hallway.enter()
                self.hallways.append(hallway)
                self.allRooms.append(hallway)
                self.listenForFloorEvents(hallway)

        self.placeToon()

        def handleCameraRayFloorCollision(collEntry, self=self):
            name = collEntry.getIntoNode().getName()
            self.notify.debug('camera floor ray collided with: %s' % name)
            prefix = StageRoom.StageRoom.FloorCollPrefix
            prefixLen = len(prefix)
            if name[:prefixLen] == prefix:
                try:
                    roomNum = int(name[prefixLen:])
                except:
                    DistributedLevel.notify.warning(
                        'Invalid zone floor collision node: %s' % name)
                else:
                    self.camEnterRoom(roomNum)
                    print(collEntry)
                    print()

        self.accept('on-floor', handleCameraRayFloorCollision)
        if bboard.has('stageRoom'):
            self.warpToRoom(bboard.get('stageRoom'))
        firstSetZoneDoneEvent = self.cr.getNextSetZoneDoneEvent()

        def handleFirstSetZoneDone():
            self.notify.debug('stageHandleFirstSetZoneDone')
            bboard.post(DistributedStage.ReadyPost, self)

        self.acceptOnce(firstSetZoneDoneEvent, handleFirstSetZoneDone)
        zoneList = [OTPGlobals.UberZone, self.zoneId]
        for room in self.rooms:
            zoneList.extend(room.zoneIds)

        base.cr.sendSetZoneMsg(self.zoneId, zoneList)
        self.accept('takingScreenshot', self.handleScreenshot)
        base.transitions.irisIn()
        taskMgr.doMethodLater(0.25, self._delayedInit, 'delayedInit')
        return
Exemplo n.º 2
0
    def gotAllRooms(self):
        self.notify.debug('stage %s: got all rooms' % self.doId)
        self.roomWatcher.destroy()
        self.roomWatcher = None

        self.geom = render.attachNewNode('stage%s' % self.doId)

        # fill out our table of rooms
        for doId in self.roomDoIds:
            self.rooms.append(base.cr.doId2do[doId])
            self.rooms[-1].setStage(self)

        self.notify.info('stageId %s, floor %s, %s' %
                         (self.stageId, self.floorNum, self.rooms[0].avIdList))

        rng = self.layout.getRng()
        numRooms = self.layout.getNumRooms()

        for i, room in enumerate(self.rooms):
            # there's a hallway between each pair of rooms
            if i == 0:
                room.getGeom().reparentTo(self.geom)
            else:
                # attach the room to the preceding hallway
                room.attachTo(self.hallways[i - 1], rng)
            self.allRooms.append(room)
            self.listenForFloorEvents(room)

            if i < (numRooms - 1):
                # add a hallway leading out of the room
                hallway = StageRoom.StageRoom(self.layout.getHallwayModel(i))
                hallway.attachTo(room, rng)
                hallway.setRoomNum((i * 2) + 1)
                hallway.initFloorCollisions()
                hallway.enter()
                self.hallways.append(hallway)
                self.allRooms.append(hallway)
                self.listenForFloorEvents(hallway)

        self.placeToon()

        # listen for camera-ray/floor collision events
        def handleCameraRayFloorCollision(collEntry, self=self):
            name = collEntry.getIntoNode().getName()
            self.notify.debug('camera floor ray collided with: %s' % name)
            prefix = StageRoom.StageRoom.FloorCollPrefix
            prefixLen = len(prefix)
            if (name[:prefixLen] == prefix):
                try:
                    roomNum = int(name[prefixLen:])
                except:
                    DistributedLevel.notify.warning(
                        'Invalid zone floor collision node: %s' % name)
                else:
                    self.camEnterRoom(roomNum)
                    print(collEntry)
                    print()

        self.accept('on-floor', handleCameraRayFloorCollision)

        if bboard.has('stageRoom'):
            self.warpToRoom(bboard.get('stageRoom'))

        # get this event name before we send out our first setZone
        firstSetZoneDoneEvent = self.cr.getNextSetZoneDoneEvent()

        # wait until the first viz setZone completes before announcing
        # that we're ready to go
        def handleFirstSetZoneDone():
            self.notify.debug('stageHandleFirstSetZoneDone')
            # NOW we're ready.
            bboard.post(DistributedStage.ReadyPost, self)

        self.acceptOnce(firstSetZoneDoneEvent, handleFirstSetZoneDone)

        # listen to all of the network zones; no network visibility for now
        zoneList = [OTPGlobals.UberZone, self.zoneId]
        for room in self.rooms:
            zoneList.extend(room.zoneIds)
        base.cr.sendSetZoneMsg(self.zoneId, zoneList)

        self.accept('takingScreenshot', self.handleScreenshot)
        base.transitions.irisIn()
        #this next bit is a hack, but it's the only thing that works reliably
        taskMgr.doMethodLater(0.25, self._delayedInit, "delayedInit")