示例#1
0
    def requestPurchase(self, phone, callback):
        # Orders the item via the indicated telephone.  Some items
        # will pop up a dialog querying the user for more information
        # before placing the order; other items will order
        # immediately.

        # In either case, the function will return immediately before
        # the transaction is finished, but the given callback will be
        # called later with two parameters: the return code (one of
        # the P_* symbols defined in ToontownGlobals.py), followed by the
        # item itself.

        # This method is only called on the client.
        from toontown.toontowngui import TTDialog
        avatar = base.localAvatar

        accessoriesOnOrder = 0
        for item in avatar.onOrder + avatar.mailboxContents:
            if item.storedInTrunk():
                accessoriesOnOrder += 1

        if avatar.isTrunkFull(accessoriesOnOrder):
            # If the avatar's closet is full, pop up a dialog warning
            # the user, and give him a chance to bail out.
            self.requestPurchaseCleanup()
            buttonCallback = PythonUtil.Functor(
                self.__handleFullPurchaseDialog, phone, callback)
            if avatar.getMaxAccessories() == 0:
                text = TTLocalizer.CatalogPurchaseNoTrunk
            else:
                text = TTLocalizer.CatalogPurchaseTrunkFull
            self.dialog = TTDialog.TTDialog(
                style=TTDialog.YesNo,
                text=text,
                text_wordwrap=15,
                command=buttonCallback,
            )
            self.dialog.show()

        else:
            # The avatar's closet isn't full; just buy it.
            CatalogItem.CatalogItem.requestPurchase(self, phone, callback)
示例#2
0
    def forceTransition(self, request, *args):
        """Changes unconditionally to the indicated state.  This
        bypasses the filterState() function, and just calls
        exitState() followed by enterState()."""

        self.fsmLock.acquire()
        try:
            assert isinstance(request, str)
            self.notify.debug("%s.forceTransition(%s, %s" %
                              (self._name, request, str(args)[1:]))

            if not self.state:
                # Queue up the request.
                self.__requestQueue.append(
                    PythonUtil.Functor(self.forceTransition, request, *args))
                return

            self.__setState(request, *args)
        finally:
            self.fsmLock.release()
示例#3
0
    def requestPurchase(self, phone, callback):
        from toontown.toontowngui import TTDialog
        avatar = base.localAvatar
        clothesOnOrder = 0
        for item in avatar.onOrder + avatar.mailboxContents:
            if item.storedInCloset():
                clothesOnOrder += 1

        if avatar.isClosetFull(clothesOnOrder):
            self.requestPurchaseCleanup()
            buttonCallback = PythonUtil.Functor(
                self.__handleFullPurchaseDialog, phone, callback)
            self.dialog = TTDialog.TTDialog(
                style=TTDialog.YesNo,
                text=TTLocalizer.CatalogPurchaseClosetFull,
                text_wordwrap=15,
                command=buttonCallback)
            self.dialog.show()
        else:
            CatalogItem.CatalogItem.requestPurchase(self, phone, callback)
 def beginBarrier(self, name, avIds, timeout, callback):
     Barrier = Barrier
     import otp.ai
     context = self._DistributedObjectUD__nextBarrierContext
     self._DistributedObjectUD__nextBarrierContext = self._DistributedObjectUD__nextBarrierContext + 1 & 65535
     if avIds:
         barrier = Barrier.Barrier(
             name,
             self.uniqueName(name),
             avIds,
             timeout,
             doneFunc=PythonUtil.Functor(
                 self._DistributedObjectUD__barrierCallback, context,
                 callback))
         self._DistributedObjectUD__barriers[context] = barrier
         self.sendUpdate('setBarrierData',
                         [self._DistributedObjectUD__getBarrierData()])
     else:
         callback(avIds)
     return context
示例#5
0
    def requestPurchase(self, phone, callback):
        from src.toontown.toontowngui import TTDialog
        avatar = base.localAvatar
        accessoriesOnOrder = 0
        for item in avatar.onOrder + avatar.mailboxContents + avatar.onGiftOrder:
            if hasattr(item, 'isHat'):
                accessoriesOnOrder += 1

        if avatar.isTrunkFull(accessoriesOnOrder):
            self.requestPurchaseCleanup()
            buttonCallback = PythonUtil.Functor(
                self.__handleFullPurchaseDialog, phone, callback)
            text = TTLocalizer.CatalogPurchaseTrunkFull
            self.dialog = TTDialog.TTDialog(style=TTDialog.YesNo,
                                            text=text,
                                            text_wordwrap=15,
                                            command=buttonCallback)
            self.dialog.show()
        else:
            CatalogItem.CatalogItem.requestPurchase(self, phone, callback)
示例#6
0
    def __createEstateZoneAndObjects(self, avId, isOwner, ownerId, name):
        # assume this is only called when isOwner == 1

        # stop any cleanup tasks that might be pending for this avId
        # (note: we might be in a case where we aren't in the toBeDeleted list
        # and still have a cleanup task pending.  this happens when we switch
        # shards)
        self.__stopCleanupTask(avId)

        # first check that we aren't in the toBeDeleted list
        avZone = self.toBeDeleted.get(avId)
        if avZone:

            # move our info back to estateZone
            self.setEstateZone(avId, avZone)
            del self.toBeDeleted[avId]
            return

        # check if our account has an estate created under a different avatar
        if self.__checkAccountSwitchedAvatars(name, avId):
            return

        # request the zone for the owners estate
        zoneId = self.air.allocateZone()
        self.setEstateZone(
            avId,
            [zoneId, isOwner, name])  # [zoneId, isOwner, userName (if owner)]
        self.account2avId[name] = avId
        self.zone2owner[zoneId] = avId

        # start a ref count for this zone id
        self.refCount[zoneId] = []

        # don't send a message back yet since the estate is not filled
        # in.  Do this later.
        #self.sendUpdateToAvatarId(avId, "setEstateZone", [avId, zoneId])

        # create the estate and generate the zone
        callback = PythonUtil.Functor(self.handleGetEstate, avId, ownerId)
        self.air.getEstate(avId, zoneId, callback)
    def requestPurchase(self, phone, callback):
        from src.toontown.toontowngui import TTDialog
        avatar = base.localAvatar
        itemsOnOrder = 0
        for item in avatar.onOrder + avatar.mailboxContents:
            if item.storedInAttic() and not item.replacesExisting():
                itemsOnOrder += 1

        numHouseItems = phone.numHouseItems + itemsOnOrder
        if numHouseItems >= ToontownGlobals.MaxHouseItems and not self.replacesExisting(
        ):
            self.requestPurchaseCleanup()
            buttonCallback = PythonUtil.Functor(
                self.__handleFullPurchaseDialog, phone, callback)
            self.dialog = TTDialog.TTDialog(
                style=TTDialog.YesNo,
                text=TTLocalizer.CatalogPurchaseHouseFull,
                text_wordwrap=15,
                command=buttonCallback)
            self.dialog.show()
        else:
            CatalogItem.CatalogItem.requestPurchase(self, phone, callback)
示例#8
0
    def processPet(self, pet, db):
        RepairAvatars.PetIterator.processPet(self, pet, db)
        # the safezone should be TTC
        if pet.getSafeZone() != ToontownGlobals.ToontownCentral:
            print(
                ('Warning: pet %s is a pet that does not need to be patched!' %
                 pet.doId))
            # prevent mem leak
            pet.patchDelete()
            # this will request another pet if there are more to request
            self.getNextPet()
            return

        # grab the pet's owner
        print('requesting owner %s of pet %s' % (pet.getOwnerId(), pet.doId))
        ag = RepairAvatars.AvatarGetter(self.air)
        event = 'getOwner-%s' % pet.doId
        ag.getAvatar(
            pet.getOwnerId(),
            fields=['setName', 'setMaxHp', 'setMaxMoney', 'setMaxBankMoney'],
            event=event)
        self.acceptOnce(event, PythonUtil.Functor(self.gotOwner, pet=pet))
示例#9
0
    def requestPurchase(self, phone, callback):
        from toontown.toontowngui import TTDialog
        avatar = base.localAvatar
        accessoriesOnOrder = 0
        for item in avatar.onOrder + avatar.mailboxContents:
            if item.storedInTrunk():
                accessoriesOnOrder += 1

        if avatar.isTrunkFull(accessoriesOnOrder):
            self.requestPurchaseCleanup()
            buttonCallback = PythonUtil.Functor(
                self.__handleFullPurchaseDialog, phone, callback)
            if avatar.getMaxAccessories() == 0:
                text = TTLocalizer.CatalogPurchaseNoTrunk
            else:
                text = TTLocalizer.CatalogPurchaseTrunkFull
            self.dialog = TTDialog.TTDialog(style=TTDialog.YesNo,
                                            text=text,
                                            text_wordwrap=15,
                                            command=buttonCallback)
            self.dialog.show()
        else:
            CatalogItem.CatalogItem.requestPurchase(self, phone, callback)
示例#10
0
    def demand(self, request, *args):
        """Requests a state transition, by code that does not expect
        the request to be denied.  If the request is denied, raises a
        RequestDenied exception.

        Unlike request(), this method allows a new request to be made
        while the FSM is currently in transition.  In this case, the
        request is queued up and will be executed when the current
        transition finishes.  Multiple requests will queue up in
        sequence.
        """

        assert (isinstance(request, types.StringTypes))
        self.notify.debug("%s.demand(%s, %s" %
                          (self.name, request, str(args)[1:]))
        if not self.state:
            # Queue up the request.
            self.__requestQueue.append(
                PythonUtil.Functor(self.demand, request, *args))
            return

        if not self.request(request, *args):
            raise RequestDenied, request
示例#11
0
    def fillSlot(self, index, avId):
        self.notify.debug('%s.fillSlot(%s, %s, ...)' %
                          (self.doId, index, avId))
        request = self.toonRequests.get(index)
        if request:
            self.cr.relatedObjectMgr.abortRequest(request)
            del self.toonRequests[index]

        if avId == 0:
            pass
        1
        if not self.cr.doId2do.has_key(avId):
            func = PythonUtil.Functor(self.gotToon, index, avId)
            self.toonRequests[index] = self.cr.relatedObjectMgr.requestObjects(
                [avId], allCallback=func)
        elif not self.isSetup:
            self.deferredSlots.append((index, avId))
        elif avId == base.localAvatar.getDoId():
            self.localToonOnBoard = 1
            elevator = self.getPlaceElevator()
            elevator.fsm.request('boarding', [self.getElevatorModel()])
            elevator.fsm.request('boarded')

        toon = self.cr.doId2do[avId]
        toon.stopSmooth()
        toon.wrtReparentTo(self.golfKart)
        sitStartDuration = toon.getDuration('sit-start')
        jumpTrack = self.generateToonJumpTrack(toon, index)
        track = Sequence(jumpTrack,
                         Func(toon.setAnimState, 'Sit', 1.0),
                         Func(self.clearToonTrack, avId),
                         name=toon.uniqueName('fillElevator'),
                         autoPause=1)
        track.delayDelete = DelayDelete.DelayDelete(toon, 'fillSlot')
        self.storeToonTrack(avId, track)
        track.start()
        self.boardedAvIds[avId] = None
示例#12
0
 def fillSlot(self, index, avId, wantBoardingShow=0):
     self.notify.debug('%s.fillSlot(%s, %s, ... %s)' %
                       (self.doId, index, avId, globalClock.getRealTime()))
     request = self.toonRequests.get(index)
     if request:
         self.cr.relatedObjectMgr.abortRequest(request)
         del self.toonRequests[index]
     if avId == 0:
         pass
     elif avId not in self.cr.doId2do:
         func = PythonUtil.Functor(self.gotToon, index, avId)
         self.toonRequests[index] = self.cr.relatedObjectMgr.requestObjects(
             [avId], allCallback=func)
     elif not self.isSetup:
         self.deferredSlots.append((index, avId, wantBoardingShow))
     else:
         if avId == base.localAvatar.getDoId():
             place = base.cr.playGame.getPlace()
             if not place:
                 return
             elevator = self.getPlaceElevator()
             if elevator == None:
                 place.fsm.request('elevator')
                 elevator = self.getPlaceElevator()
             if not elevator:
                 return
             self.localToonOnBoard = 1
             if hasattr(localAvatar,
                        'boardingParty') and localAvatar.boardingParty:
                 localAvatar.boardingParty.forceCleanupInviteePanel()
                 localAvatar.boardingParty.forceCleanupInviterPanels()
             if hasattr(base.localAvatar, 'elevatorNotifier'):
                 base.localAvatar.elevatorNotifier.cleanup()
             cameraTrack = Sequence()
             cameraTrack.append(
                 Func(elevator.fsm.request, 'boarding',
                      [self.getElevatorModel()]))
             cameraTrack.append(Func(elevator.fsm.request, 'boarded'))
         toon = self.cr.doId2do[avId]
         toon.stopSmooth()
         toon.wrtReparentTo(self.golfKart)
         sitStartDuration = toon.getDuration('sit-start')
         jumpTrack = self.generateToonJumpTrack(toon, index)
         track = Sequence(jumpTrack,
                          Func(toon.setAnimState, 'Sit', 1.0),
                          Func(self.clearToonTrack, avId),
                          name=toon.uniqueName('fillElevator'),
                          autoPause=1)
         if wantBoardingShow:
             boardingTrack, boardingTrackType = self.getBoardingTrack(
                 toon, index, True)
             track = Sequence(boardingTrack, track)
             if avId == base.localAvatar.getDoId():
                 cameraWaitTime = 2.5
                 if boardingTrackType == BoardingGroupShow.TRACK_TYPE_RUN:
                     cameraWaitTime = 0.5
                 cameraTrack = Sequence(Wait(cameraWaitTime), cameraTrack)
         if self.canHideBoardingQuitBtn(avId):
             track = Sequence(
                 Func(localAvatar.boardingParty.groupPanel.disableQuitButton
                      ), track)
         if avId == base.localAvatar.getDoId():
             track = Parallel(cameraTrack, track)
         track.delayDelete = DelayDelete.DelayDelete(
             toon, 'CogKart.fillSlot')
         self.storeToonTrack(avId, track)
         track.start()
         self.fillSlotTrack = track
         self.boardedAvIds[avId] = None
     return
示例#13
0
 def fillSlot(self, index, avId, wantBoardingShow=0):
     self.notify.debug('%s.fillSlot(%s, %s, ...)' %
                       (self.doId, index, avId))
     request = self.toonRequests.get(index)
     if request:
         self.cr.relatedObjectMgr.abortRequest(request)
         del self.toonRequests[index]
     if avId == 0:
         pass
     elif avId not in self.cr.doId2do:
         func = PythonUtil.Functor(self.gotToon, index, avId)
         self.toonRequests[index] = self.cr.relatedObjectMgr.requestObjects(
             [avId], allCallback=func)
     elif not self.isSetup:
         self.deferredSlots.append((index, avId, wantBoardingShow))
     else:
         if avId == base.localAvatar.getDoId():
             place = base.cr.playGame.getPlace()
             if not place:
                 return
             place.detectedElevatorCollision(self)
             elevator = self.getPlaceElevator()
             if elevator == None:
                 if place.fsm.hasStateNamed('elevator'):
                     place.fsm.request('elevator')
                 elif place.fsm.hasStateNamed('Elevator'):
                     place.fsm.request('Elevator')
                 elevator = self.getPlaceElevator()
             if not elevator:
                 return
             self.localToonOnBoard = 1
             if hasattr(localAvatar,
                        'boardingParty') and localAvatar.boardingParty:
                 localAvatar.boardingParty.forceCleanupInviteePanel()
                 localAvatar.boardingParty.forceCleanupInviterPanels()
             if hasattr(base.localAvatar, 'elevatorNotifier'):
                 base.localAvatar.elevatorNotifier.cleanup()
             cameraTrack = Sequence()
             cameraTrack.append(
                 Func(elevator.fsm.request, 'boarding',
                      [self.getElevatorModel()]))
             cameraTrack.append(Func(elevator.fsm.request, 'boarded'))
         toon = self.cr.doId2do[avId]
         toon.stopSmooth()
         if not wantBoardingShow:
             toon.setZ(self.getElevatorModel(),
                       self.elevatorPoints[index][2])
             toon.setShadowHeight(0)
         if toon.isDisguised:
             animInFunc = Sequence(Func(toon.suit.loop, 'walk'))
             animFunc = Sequence(Func(toon.setAnimState, 'neutral', 1.0),
                                 Func(toon.suit.loop, 'neutral'))
         else:
             animInFunc = Sequence(Func(toon.setAnimState, 'run', 1.0))
             animFunc = Func(toon.setAnimState, 'neutral', 1.0)
         toon.headsUp(self.getElevatorModel(),
                      apply(Point3, self.elevatorPoints[index]))
         track = Sequence(animInFunc,
                          LerpPosInterval(toon,
                                          TOON_BOARD_ELEVATOR_TIME * 0.75,
                                          apply(Point3,
                                                self.elevatorPoints[index]),
                                          other=self.getElevatorModel()),
                          LerpHprInterval(toon,
                                          TOON_BOARD_ELEVATOR_TIME * 0.25,
                                          Point3(180, 0, 0),
                                          other=self.getElevatorModel()),
                          Func(self.clearToonTrack, avId),
                          animFunc,
                          name=toon.uniqueName('fillElevator'),
                          autoPause=1)
         if wantBoardingShow:
             boardingTrack, boardingTrackType = self.getBoardingTrack(
                 toon, index, False)
             track = Sequence(boardingTrack, track)
             if avId == base.localAvatar.getDoId():
                 cameraWaitTime = 2.5
                 if boardingTrackType == BoardingGroupShow.TRACK_TYPE_RUN:
                     cameraWaitTime = 0.5
                 elif boardingTrackType == BoardingGroupShow.TRACK_TYPE_POOF:
                     cameraWaitTime = 1
                 cameraTrack = Sequence(Wait(cameraWaitTime), cameraTrack)
         if self.canHideBoardingQuitBtn(avId):
             track = Sequence(
                 Func(localAvatar.boardingParty.groupPanel.disableQuitButton
                      ), track)
         if avId == base.localAvatar.getDoId():
             track = Parallel(cameraTrack, track)
         track.delayDelete = DelayDelete.DelayDelete(
             toon, 'Elevator.fillSlot')
         self.storeToonTrack(avId, track)
         track.start()
         self.fillSlotTrack = track
         self.boardedAvIds[avId] = None
     return
示例#14
0
    def fillSlot(self, index, avId):
        self.notify.debug("%s.fillSlot(%s, %s, ...)" %
                          (self.doId, index, avId))
        request = self.toonRequests.get(index)
        if request:
            self.cr.relatedObjectMgr.abortRequest(request)
            del self.toonRequests[index]

        if avId == 0:
            # This means that the slot is now empty, and no action should
            # be taken.
            pass

        elif avId not in self.cr.doId2do:
            # It's someone who hasn't been generated yet.
            func = PythonUtil.Functor(self.gotToon, index, avId)

            assert index not in self.toonRequests
            self.toonRequests[index] = self.cr.relatedObjectMgr.requestObjects(
                [avId], allCallback=func)

        elif not self.isSetup:
            # We haven't set up the elevator yet.
            self.deferredSlots.append((index, avId))

        else:
            # If localToon is boarding, he needs to change state
            if avId == base.localAvatar.getDoId():
                self.localToonOnBoard = 1
                elevator = self.getPlaceElevator()
                elevator.fsm.request("boarding", [self.getElevatorModel()])
                elevator.fsm.request("boarded")

            toon = self.cr.doId2do[avId]
            # Parent it to the elevator
            toon.stopSmooth()
            # avoid wrtReparent so that we don't muck with the toon's scale
            #toon.wrtReparentTo(self.getElevatorModel())
            toon.setZ(self.getElevatorModel(), self.getScaledPoint(index)[2])
            toon.setShadowHeight(0)

            if toon.isDisguised:
                toon.suit.loop("walk")
                animFunc = Func(toon.suit.loop, "neutral")
            else:
                toon.setAnimState("run", 1.0)
                animFunc = Func(toon.setAnimState, "neutral", 1.0)
            toon.headsUp(self.getElevatorModel(),
                         Point3(*self.getScaledPoint(index)))

            track = Sequence(
                # Pos 1: -1.5, 5, 0
                # Pos 2: 1.5, 5, 0
                # Pos 3: -2.5, 3, 0
                # Pos 4: 2.5, 3, 0
                LerpPosInterval(toon,
                                TOON_BOARD_ELEVATOR_TIME * 0.75,
                                Point3(*self.getScaledPoint(index)),
                                other=self.getElevatorModel()),
                LerpHprInterval(toon,
                                TOON_BOARD_ELEVATOR_TIME * 0.25,
                                Point3(180, 0, 0),
                                other=self.getElevatorModel()),
                #Func(toon.setAnimState, "neutral", 1.0),
                animFunc,
                name=toon.uniqueName("fillElevator"),
                autoPause=1)
            track.start()

            assert avId not in self.boardedAvIds
            self.boardedAvIds[avId] = index
示例#15
0
    def fillSlot(self, index, avId, wantBoardingShow = 0):
        """Put someone in the kart, as dictated by the AI."""
        self.notify.debug("%s.fillSlot(%s, %s, ... %s)" % (self.doId, index, avId, globalClock.getRealTime()))
        request = self.toonRequests.get(index)
        if request:
            self.cr.relatedObjectMgr.abortRequest(request)
            del self.toonRequests[index]

        if avId == 0:
            # This means that the slot is now empty, and no action should
            # be taken.
            pass

        elif avId not in self.cr.doId2do:
            # It's someone who hasn't been generated yet.
            func = PythonUtil.Functor(
                self.gotToon, index, avId)

            assert index not in self.toonRequests
            self.toonRequests[index] = self.cr.relatedObjectMgr.requestObjects(
                [avId], allCallback = func)

        elif not self.isSetup:
            # We haven't set up the elevator yet.
            self.deferredSlots.append((index, avId, wantBoardingShow))

        else:
            # If localToon is boarding, he needs to change state
            if avId == base.localAvatar.getDoId():
                place = base.cr.playGame.getPlace()
                if not place:
                    return
                elevator = self.getPlaceElevator()
                if elevator == None:
                    place.fsm.request('elevator')
                    elevator = self.getPlaceElevator()
                if not elevator:
                    return

                self.localToonOnBoard = 1

                if hasattr(localAvatar, "boardingParty") and localAvatar.boardingParty:
                    localAvatar.boardingParty.forceCleanupInviteePanel()
                    localAvatar.boardingParty.forceCleanupInviterPanels()

                # Cleanup any leftover elevator messages before boarding the elevator.
                if hasattr(base.localAvatar, "elevatorNotifier"):
                    base.localAvatar.elevatorNotifier.cleanup()

                cameraTrack = Sequence()
                # Move the camera towards and face the elevator.
                cameraTrack.append(Func(elevator.fsm.request, "boarding", [self.getElevatorModel()]))
                # Enable the Hop off button.
                cameraTrack.append(Func(elevator.fsm.request, "boarded"))

            toon = self.cr.doId2do[avId]
            # Parent it to the elevator
            toon.stopSmooth()
            toon.wrtReparentTo(self.golfKart)

            sitStartDuration = toon.getDuration("sit-start")
            jumpTrack = self.generateToonJumpTrack(toon, index)

            track = Sequence(
				jumpTrack,
                Func(toon.setAnimState, "Sit", 1.0),
                Func(self.clearToonTrack, avId),
                name = toon.uniqueName("fillElevator"),
                autoPause = 1)

            if wantBoardingShow:
                boardingTrack, boardingTrackType = self.getBoardingTrack(toon, index, True)
                track = Sequence(boardingTrack, track)

                if avId == base.localAvatar.getDoId():
                    cameraWaitTime = 2.5
                    if (boardingTrackType == BoardingGroupShow.TRACK_TYPE_RUN):
                        cameraWaitTime = 0.5
                    cameraTrack = Sequence(Wait(cameraWaitTime), cameraTrack)

            if self.canHideBoardingQuitBtn(avId):
                track = Sequence(Func(localAvatar.boardingParty.groupPanel.disableQuitButton),
                                 track)

            # Start the camera track in parallel here
            if avId == base.localAvatar.getDoId():
                track = Parallel(cameraTrack, track)

            track.delayDelete = DelayDelete.DelayDelete(toon, 'CogKart.fillSlot')
            self.storeToonTrack(avId, track)
            track.start()

            self.fillSlotTrack = track

            assert avId not in self.boardedAvIds
            self.boardedAvIds[avId] = None
    def fillSlot(self, index, avId, wantBoardingShow=0):
        self.notify.debug("%s.fillSlot(%s, %s, ...)" %
                          (self.doId, index, avId))
        request = self.toonRequests.get(index)
        if request:
            self.cr.relatedObjectMgr.abortRequest(request)
            del self.toonRequests[index]

        if avId == 0:
            # This means that the slot is now empty, and no action should
            # be taken.
            pass

        elif avId not in self.cr.doId2do:
            # It's someone who hasn't been generated yet.
            func = PythonUtil.Functor(self.gotToon, index, avId)

            assert index not in self.toonRequests
            self.toonRequests[index] = self.cr.relatedObjectMgr.requestObjects(
                [avId], allCallback=func)

        elif not self.isSetup:
            # We haven't set up the elevator yet.
            self.deferredSlots.append((index, avId, wantBoardingShow))

        else:
            # If localToon is boarding, he needs to change state
            if avId == base.localAvatar.getDoId():
                place = base.cr.playGame.getPlace()
                if not place:
                    return
                place.detectedElevatorCollision(self)
                elevator = self.getPlaceElevator()
                if elevator == None:
                    place.fsm.request('elevator')
                    elevator = self.getPlaceElevator()
                if not elevator:
                    return

                self.localToonOnBoard = 1

                if hasattr(localAvatar,
                           "boardingParty") and localAvatar.boardingParty:
                    localAvatar.boardingParty.forceCleanupInviteePanel()
                    localAvatar.boardingParty.forceCleanupInviterPanels()

                # Cleanup any leftover elevator messages before boarding the elevator.
                if hasattr(base.localAvatar, "elevatorNotifier"):
                    base.localAvatar.elevatorNotifier.cleanup()

                cameraTrack = Sequence()
                # Move the camera towards and face the elevator.
                cameraTrack.append(
                    Func(elevator.fsm.request, "boarding",
                         [self.getElevatorModel()]))
                # Enable the Hop off button.
                cameraTrack.append(Func(elevator.fsm.request, "boarded"))

            toon = self.cr.doId2do[avId]
            # Parent it to the elevator
            toon.stopSmooth()
            # avoid wrtReparent so that we don't muck with the toon's scale
            #toon.wrtReparentTo(self.getElevatorModel())

            if not wantBoardingShow:
                toon.setZ(self.getElevatorModel(),
                          self.elevatorPoints[index][2])
                toon.setShadowHeight(0)

            if toon.isDisguised:
                animInFunc = Sequence(Func(toon.suit.loop, "walk"))
                #RAU this stops the dog's ears from flapping too much
                animFunc = Sequence(Func(toon.setAnimState, "neutral", 1.0),
                                    Func(toon.suit.loop, "neutral"))
            else:
                animInFunc = Sequence(Func(toon.setAnimState, "run", 1.0))
                animFunc = Func(toon.setAnimState, "neutral", 1.0)
            toon.headsUp(self.getElevatorModel(),
                         Point3(*self.elevatorPoints[index]))

            track = Sequence(
                # Pos 1: -1.5, 5, 0
                # Pos 2: 1.5, 5, 0
                # Pos 3: -2.5, 3, 0
                # Pos 4: 2.5, 3, 0
                animInFunc,
                LerpPosInterval(toon,
                                TOON_BOARD_ELEVATOR_TIME * 0.75,
                                Point3(*self.elevatorPoints[index]),
                                other=self.getElevatorModel()),
                LerpHprInterval(toon,
                                TOON_BOARD_ELEVATOR_TIME * 0.25,
                                Point3(180, 0, 0),
                                other=self.getElevatorModel()),
                #Func(toon.setAnimState, "neutral", 1.0),
                Func(self.clearToonTrack, avId),
                animFunc,
                name=toon.uniqueName("fillElevator"),
                autoPause=1)

            if wantBoardingShow:
                boardingTrack, boardingTrackType = self.getBoardingTrack(
                    toon, index, False)
                track = Sequence(boardingTrack, track)

                if avId == base.localAvatar.getDoId():
                    cameraWaitTime = 2.5
                    if (boardingTrackType == BoardingGroupShow.TRACK_TYPE_RUN):
                        cameraWaitTime = 0.5
                    elif (boardingTrackType ==
                          BoardingGroupShow.TRACK_TYPE_POOF):
                        cameraWaitTime = 1
                    cameraTrack = Sequence(Wait(cameraWaitTime), cameraTrack)

            if self.canHideBoardingQuitBtn(avId):
                track = Sequence(
                    Func(localAvatar.boardingParty.groupPanel.disableQuitButton
                         ), track)

            # Start the camera track in parallel here
            if avId == base.localAvatar.getDoId():
                track = Parallel(cameraTrack, track)

            track.delayDelete = DelayDelete.DelayDelete(
                toon, 'Elevator.fillSlot')
            self.storeToonTrack(avId, track)
            track.start()

            self.fillSlotTrack = track

            assert avId not in self.boardedAvIds
            self.boardedAvIds[avId] = None