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)
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()
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
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)
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)
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))
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)
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
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
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
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
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
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