def move(self, dt=-1, profile=0): if Mover.Profile and not profile: def func(doMove=self.move): for i in xrange(10000): doMove(dt, profile=1) __builtin__.func = func PythonUtil.startProfile(cmd='func()', filename='profile', sorts=['cumulative'], callInfo=0) del __builtin__.func return if Mover.Pstats: self.pscCpp.start() CMover.processCImpulses(self, dt) if Mover.Pstats: self.pscCpp.stop() self.pscPy.start() for impulse in self.impulses.values(): impulse._process(self.getDt()) if Mover.Pstats: self.pscPy.stop() self.pscInt.start() CMover.integrate(self) if Mover.Pstats: self.pscInt.stop()
def unlockStateChangeMsg(self): if self.stateChangeMsgLocks <= 0: print PythonUtil.lineTag() + ': someone unlocked too many times' return self.stateChangeMsgLocks -= 1 if self.stateChangeMsgLocks == 0 and self.stateHasChanged: messenger.send(self.EmoteEnableStateChanged) self.stateHasChanged = 0
def checkHealTrapLure(self): self.notify.debug('numToons: %s, numCogs: %s, lured: %s, trapped: %s' % (self.numToons, self.numCogs, self.luredIndices, self.trappedIndices)) if len(PythonUtil.union(self.trappedIndices, self.luredIndices)) == self.numCogs: canTrap = 0 else: canTrap = 1 if len(self.luredIndices) == self.numCogs: canLure = 0 canTrap = 0 else: canLure = 1 if config.GetBool('want-mini-server', False): if self.numToons == 1: canHeal = 0 else: canHeal = 1 else: if self.numToons == 0: canHeal = 0 else: canHeal = 1 if self.containsBossCogs: canLure = 0 canTrap = 0 return (canHeal, canTrap, canLure)
def serverTime(self, context, timestamp, timeOfDay): end = globalClock.getRealTime() aiTimeSkew = timeOfDay - self.cr.getServerTimeOfDay() if context != self.thisContext: self.notify.info('Ignoring TimeManager response for old context %d' % context) return elapsed = end - self.start self.attemptCount += 1 self.notify.info('Clock sync roundtrip took %0.3f ms' % (elapsed * 1000.0)) self.notify.info('AI time delta is %s from server delta' % PythonUtil.formatElapsedSeconds(aiTimeSkew)) average = (self.start + end) / 2.0 - self.extraSkew uncertainty = (end - self.start) / 2.0 + abs(self.extraSkew) globalClockDelta.resynchronize(average, timestamp, uncertainty) self.notify.info('Local clock uncertainty +/- %.3f s' % globalClockDelta.getUncertainty()) if globalClockDelta.getUncertainty() > self.maxUncertainty: if self.attemptCount < self.maxAttempts: self.notify.info('Uncertainty is too high, trying again.') self.start = globalClock.getRealTime() self.sendUpdate('requestServerTime', [self.thisContext]) return self.notify.info('Giving up on uncertainty requirement.') if self.talkResult: base.localAvatar.setChatAbsolute('latency %0.0f ms, sync \xc2\xb1%0.0f ms' % (elapsed * 1000.0, globalClockDelta.getUncertainty() * 1000.0), CFSpeech | CFTimeout) self._gotFirstTimeSync = True messenger.send('gotTimeSync') toontownTimeManager = getattr(base.cr, 'toontownTimeManager', None) if toontownTimeManager: toontownTimeManager.updateLoginTimes(timeOfDay, int(time.time()), globalClock.getRealTime()) return
def generateToonMoveTrack(self, toon): node = NodePath('tempNode') displacement = Vec3(toon.getPos(render) - self.getPos(render)) displacement.setZ(0) displacement.normalize() movieDistance = self.movieNode.getDistance(self.rotateNode) displacement *= movieDistance node.reparentTo(render) node.setPos(displacement + self.getPos(render)) node.lookAt(self) heading = PythonUtil.fitDestAngle2Src(toon.getH(render), node.getH(render)) hpr = toon.getHpr(render) hpr.setX(heading) finalX = node.getX(render) finalY = node.getY(render) finalZ = node.getZ(render) node.removeNode() toonTrack = Sequence( Parallel( ActorInterval(toon, 'walk', loop=True, duration=1), Parallel( LerpPosInterval(toon, 1.0, Point3(finalX, finalY, toon.getZ(render)), fluid=True, bakeInStart=False)), LerpHprInterval(toon, 1.0, hpr=hpr)), Func(toon.loop, 'neutral')) return toonTrack
def makeToonGrabInterval(self, toon): origPos = toon.getPos(self.root) origHpr = toon.getHpr(self.root) a = self.accomodateToon(toon) newPos = toon.getPos() newHpr = toon.getHpr() origHpr.setX(PythonUtil.fitSrcAngle2Dest(origHpr[0], newHpr[0])) self.notify.debug('toon.setPosHpr %s %s' % (origPos, origHpr)) toon.setPosHpr(origPos, origHpr) walkTime = 0.2 reach = Sequence() if reach.getDuration() < walkTime: reach = Sequence( ActorInterval(toon, 'walk', loop=1, duration=walkTime - reach.getDuration()), reach) i = Sequence( Parallel(toon.posInterval(walkTime, newPos, origPos), toon.hprInterval(walkTime, newHpr, origHpr), reach), Func(toon.stopLookAround)) if toon == base.localAvatar: i.append(Func(self.switchToAnimState, 'GolfPuttLoop')) i.append(Func(self.startAdjustClubTask)) i = Parallel(i, a) return i
def rollBossToPoint(self, fromPos, fromHpr, toPos, toHpr, reverse): vector = Vec3(toPos - fromPos) distance = vector.length() if toHpr == None: mat = Mat3(0, 0, 0, 0, 0, 0, 0, 0, 0) headsUp(mat, vector, CSDefault) scale = VBase3(0, 0, 0) shear = VBase3(0, 0, 0) toHpr = VBase3(0, 0, 0) decomposeMatrix(mat, scale, shear, toHpr, CSDefault) if fromHpr: newH = PythonUtil.fitDestAngle2Src(fromHpr[0], toHpr[0]) toHpr = VBase3(newH, 0, 0) else: fromHpr = toHpr turnTime = abs(toHpr[0] - fromHpr[0]) / ToontownGlobals.BossCogTurnSpeed if toHpr[0] < fromHpr[0]: leftRate = ToontownGlobals.BossCogTreadSpeed else: leftRate = -ToontownGlobals.BossCogTreadSpeed if reverse: rollTreadRate = -ToontownGlobals.BossCogTreadSpeed else: rollTreadRate = ToontownGlobals.BossCogTreadSpeed rollTime = distance / ToontownGlobals.BossCogRollSpeed deltaPos = toPos - fromPos track = Sequence(Func(self.setPos, fromPos), Func(self.headsUp, toPos), Parallel(self.hprInterval(turnTime, toHpr, fromHpr), self.rollLeftTreads(turnTime, leftRate), self.rollRightTreads(turnTime, -leftRate)), Parallel(LerpFunctionInterval(self.rollBoss, duration=rollTime, extraArgs=[fromPos, deltaPos]), self.rollLeftTreads(rollTime, rollTreadRate), self.rollRightTreads(rollTime, rollTreadRate))) return ( track, toHpr)
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 else: 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) else: if not self.isSetup: self.deferredSlots.append((index, avId)) else: 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] 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 return
def requestPurchase(self, phone, callback): from 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 if phone.numHouseItems is None: phone.numHouseItems = 0 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) return
def getToonPullingLeverInterval(self, toon): walkTime = 0.2 reach = ActorInterval(toon, 'leverReach', playRate=2.0) pull = ActorInterval(toon, 'leverPull', startFrame=6) origPos = toon.getPos(render) origHpr = toon.getHpr(render) newPos = self.lever.getPos(render) newHpr = self.lever.getHpr(render) origHpr.setX(PythonUtil.fitSrcAngle2Dest(origHpr[0], newHpr[0])) toon.setPosHpr(origPos, origHpr) reachAndPull = Sequence( ActorInterval(toon, 'walk', loop=True, duration=walkTime - reach.getDuration()), reach, pull) leverSeq = Sequence( Wait(walkTime + reach.getDuration() - 0.1), self.stick.hprInterval(0.55, Point3(0.0, 25.0, 0.0), Point3(0.0, 0.0, 0.0)), Wait(0.3), self.stick.hprInterval(0.4, Point3(0.0, 0.0, 0.0), Point3(0.0, 25.0, 0.0))) returnSeq = Sequence( Parallel(toon.posInterval(walkTime, newPos, origPos), toon.hprInterval(walkTime, newHpr, origHpr), leverSeq, reachAndPull)) return returnSeq
def enterBoarding(self, nodePath, side): camera.wrtReparentTo(nodePath) heading = PythonUtil.fitDestAngle2Src(camera.getH(nodePath), 90 * side) self.cameraBoardTrack = LerpPosHprInterval( camera, 1.5, Point3(14.4072 * side, 0, 3.8667), Point3(heading, -15, 0)) self.cameraBoardTrack.start() return
def enterBoarding(self, nodePath): camera.wrtReparentTo(nodePath) heading = PythonUtil.fitDestAngle2Src(camera.getH(nodePath), 180) self.cameraBoardTrack = LerpPosHprInterval(camera, 1.5, Point3(0, 18, 8), Point3(heading, -10, 0)) self.cameraBoardTrack.start() return
def __hoverCallback(self, inside, hoodIndex, pos): alpha = OTPPythonUtil.choice(inside, 0.25, 1.0) try: clouds = self.clouds[hoodIndex] except ValueError: clouds = [] for cloud in clouds: cloud.setColor((1, 1, 1, alpha))
def getPetInfoFromSeed(seed, safezoneId): S = random.getstate() random.seed(seed) dnaArray = PetDNA.getRandomPetDNA(safezoneId) gender = PetDNA.getGender(dnaArray) nameString = PetNameGenerator.PetNameGenerator().randomName(gender=gender, seed=seed + safezoneId) traitSeed = PythonUtil.randUint31() random.setstate(S) return (nameString, dnaArray, traitSeed)
def enterBoarding(self, nodePath): camera.wrtReparentTo(nodePath) if self.reverseBoardingCamera: heading = PythonUtil.fitDestAngle2Src(camera.getH(nodePath), 180) self.cameraBoardTrack = LerpPosHprInterval(camera, 1.5, Point3(0, 18, 8), Point3(heading, -10, 0)) else: self.cameraBoardTrack = LerpPosHprInterval(camera, 1.5, Point3(0, -16, 5.5), Point3(0, 0, 0)) self.cameraBoardTrack.start()
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 else: 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) else: if not self.isSetup: self.deferredSlots.append((index, avId)) else: 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] toon.stopSmooth() 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(), apply(Point3, self.getScaledPoint(index))) track = Sequence( LerpPosInterval(toon, TOON_BOARD_ELEVATOR_TIME * 0.75, apply(Point3, self.getScaledPoint(index)), other=self.getElevatorModel()), LerpHprInterval(toon, TOON_BOARD_ELEVATOR_TIME * 0.25, Point3(180, 0, 0), other=self.getElevatorModel()), animFunc, name=toon.uniqueName('fillElevator'), autoPause=1) track.start() self.boardedAvIds[avId] = index
def setHeading(self, finalPos, initPos): diffX = finalPos.getX() - initPos.getX() angle = -90 * diffX / math.fabs(diffX) startAngle = self.suit.getH() startAngle = PythonUtil.fitSrcAngle2Dest(startAngle, angle) dur = 0.1 * abs(startAngle - angle) / 90 self.suitTurnIval = LerpHprInterval(self.suit, dur, Point3(angle, 0, 0), startHpr=Point3(startAngle, 0, 0), name='SuitLerpHpr') self.suitTurnIval.start()
def getJumpHpr(av=av, node=self.golfKart): hpr = Point3(0, 0, 0) if hasattr(self, 'golfKart') and self.golfKart: hpr = self.golfKart.getHpr(av.getParent()) if seatIndex < 2: hpr.setX(hpr.getX() + 180) else: hpr.setX(hpr.getX()) angle = PythonUtil.fitDestAngle2Src(av.getH(), hpr.getX()) hpr.setX(angle) else: self.notify.warning('getJumpHpr invalid golfKart, returning (0,0,0)') return hpr
def __chooseTarget(self, extraDelay=0): direction = self.__chooseDirection() if direction == None: self.target = None self.arrivalTime = None self.b_destroyGoon() return heading, dist = direction dist = min(dist, self.legLength) targetH = PythonUtil.reduceAngle(self.getH() + heading) origH = self.getH() h = PythonUtil.fitDestAngle2Src(origH, targetH) delta = abs(h - origH) turnTime = delta / (self.velocity * 5) walkTime = dist / self.velocity self.setH(targetH) self.target = self.boss.scene.getRelativePoint(self, Point3(0, dist, 0)) self.departureTime = globalClock.getFrameTime() self.arrivalTime = self.departureTime + turnTime + walkTime + extraDelay self.d_setTarget(self.target[0], self.target[1], h, globalClockDelta.localToNetworkTime(self.arrivalTime)) return
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 process(self, invoker, target, incantation): self.currentInvoker = invoker self.currentTarget = target word, args = (incantation.split(' ', 1) + [''])[:2] try: return self.doWord(word, args) except MagicError as e: return (e.message, True) except Exception: return (PythonUtil.describeException(backTrace=1), True) finally: self.currentInvoker = None self.currentTarget = None return
def generateToonMoveTrack(self): hpr = self.movieNode.getHpr(render) heading = PythonUtil.fitDestAngle2Src(self.av.getH(render), hpr[0]) hpr.setX(heading) self.av.setAnimState('run', 1.0) toonTrack = Sequence( Wait(0.5), Parallel( LerpPosInterval( self.av, 1.0, Point3(self.movieNode.getX(self.avParent), self.movieNode.getY(self.avParent), 0)), LerpHprInterval(self.av, 1.0, hpr=hpr, other=render)), Func(self.av.loop, 'neutral')) return toonTrack
def takePhoneInterval(self, toon): torso = TextEncoder.upper(toon.style.torso[0]) legs = TextEncoder.upper(toon.style.legs[0]) phoneOutAnim = '%s%s_phoneOut' % (torso, legs) takePhoneAnim = '%s%s_takePhone' % (torso, legs) phoneNeutralAnim = '%s%s_phoneNeutral' % (torso, legs) self.toonScale = toon.getGeomNode().getChild(0).getScale( self.getParent()) walkTime = 1.0 scaleTime = 1.0 origScale = self.getScale() origToonPos = toon.getPos() origToonHpr = toon.getHpr() self.origToonHpr = origToonHpr self.setScale(self.toonScale) toon.setPosHpr(self, 0, -4.5, 0, 0, 0, 0) destToonPos = toon.getPos() destToonHpr = toon.getHpr() destToonHpr = VBase3( PythonUtil.fitSrcAngle2Dest(destToonHpr[0], origToonHpr[0]), destToonHpr[1], destToonHpr[2]) self.setScale(origScale) toon.setPos(origToonPos) toon.setHpr(origToonHpr) walkToPhone = Sequence( Func(toon.stopSmooth), Func(toon.loop, 'walk'), Func(base.playSfx, base.localAvatar.soundWalk), toon.posHprInterval(walkTime, destToonPos, destToonHpr, blendType='easeInOut'), Func(toon.loop, 'neutral'), Func(toon.startSmooth)) interval = Sequence( Parallel( walkToPhone, ActorInterval(self.model, phoneOutAnim), self.scaleInterval(scaleTime, self.toonScale, blendType='easeInOut')), Parallel( ActorInterval(self.model, takePhoneAnim), ActorInterval(toon, 'takePhone'), Sequence(Wait(0.625), Func(base.playSfx, self.pickUpSfx), Func(self.__receiverToHand, toon), Wait(1), Func(base.playSfx, self.handleSfx))), Func(self.model.loop, phoneNeutralAnim), Func(toon.loop, 'phoneNeutral'), Func(base.playSfx, self.ringSfx)) return interval
def moveCamera(self, seatIndex): self.oldCameraPos = camera.getPos() self.oldCameraHpr = camera.getHpr() camera.wrtReparentTo(self.picnicTable) heading = PythonUtil.fitDestAngle2Src(camera.getH(), 90) if seatIndex < 3: self.cameraBoardTrack = LerpPosHprInterval(camera, 2.0, Point3(0, 0, 17), Point3(0, -90, 0)) else: if camera.getH() < 0: self.cameraBoardTrack = LerpPosHprInterval( camera, 2.0, Point3(0, 0, 17), Point3(-180, -90, 0)) else: self.cameraBoardTrack = LerpPosHprInterval( camera, 2.0, Point3(0, 0, 17), Point3(180, -90, 0)) self.cameraBoardTrack.start()
class KartGlobals: ENTER_MOVIE = 1 EXIT_MOVIE = 2 COUNTDOWN_TIME = 30 BOARDING_TIME = 10.0 ENTER_RACE_TIME = 6.0 ERROR_CODE = PythonUtil.Enum( 'success, eGeneric, eTickets, eBoardOver, eNoKart, eOccupied, eTrackClosed, eTooLate, eUnpaid' ) FRONT_LEFT_SPOT = 0 FRONT_RIGHT_SPOT = 1 REAR_LEFT_SPOT = 2 REAR_RIGHT_SPOT = 3 PAD_GROUP_NUM = 4 def getPadLocation(padId): return padId % KartGlobals.PAD_GROUP_NUM getPadLocation = staticmethod(getPadLocation)
def resume(self, currentFloor=0, topFloor=0): if len(self.suits) == 0: self.d_setMembers() self.suitsKilledPerFloor.append(self.suitsKilledThisBattle) if topFloor == 0: self.b_setState('Reward') else: for floorNum, cogsThisFloor in PythonUtil.enumerate( self.suitsKilledPerFloor): for toonId in self.activeToons: toon = self.getToon(toonId) if toon: recovered, notRecovered = self.air.questManager.recoverItems( toon, cogsThisFloor, self.zoneId) self.toonItems[toonId][0].extend(recovered) self.toonItems[toonId][1].extend(notRecovered) meritArray = self.air.promotionMgr.recoverMerits( toon, cogsThisFloor, self.zoneId, getCreditMultiplier(floorNum)) if toonId in self.helpfulToons: self.toonMerits[toonId] = addListsByValue( self.toonMerits[toonId], meritArray) else: self.notify.debug( 'toon %d not helpful, skipping merits' % toonId) self.d_setBattleExperience() self.b_setState('BuildingReward') else: if self.resumeNeedUpdate == 1: self.d_setMembers() if len(self.resumeDeadSuits ) > 0 and self.resumeLastActiveSuitDied == 0 or len( self.resumeDeadToons) > 0: self.needAdjust = 1 self.setState('WaitForJoin') self.resumeNeedUpdate = 0 self.resumeDeadToons = [] self.resumeDeadSuits = [] self.resumeLastActiveSuitDied = 0
def __get_Slots(numRings, rng, vertical=1): tracks = [] tOffsets = [] fpTab = [] for i in range(numRings): fpTab.append(PythonUtil.lineupPos(i, numRings, 2.0 / 3)) offset = 1 - fpTab[(-1)] offset = rng.random() * (offset * 2) - offset fpTab = map(lambda x: x + offset, fpTab) for i in range(0, numRings): if vertical: getActionsFunc = RingTracks.getVerticalSlotActions else: getActionsFunc = RingTracks.getHorizontalSlotActions actions, durations = getActionsFunc(fpTab[i]) track = RingTrack.RingTrack(actions, durations) tracks.append(track) tOffsets.append(float(i) / numRings * 0.5) return (tracks, tOffsets, fullCirclePeriod)
def makeToonGrabInterval(self, toon): origPos = toon.getPos() origHpr = toon.getHpr() a = self.accomodateToon(toon) newPos = toon.getPos() newHpr = toon.getHpr() origHpr.setX(PythonUtil.fitSrcAngle2Dest(origHpr[0], newHpr[0])) toon.setPosHpr(origPos, origHpr) walkTime = 0.2 reach = ActorInterval(toon, 'leverReach') if reach.getDuration() < walkTime: reach = Sequence( ActorInterval(toon, 'walk', loop=1, duration=walkTime - reach.getDuration()), reach) i = Sequence( Parallel(toon.posInterval(walkTime, newPos, origPos), toon.hprInterval(walkTime, newHpr, origHpr), reach), Func(self.startWatchJoystick, toon)) i = Parallel(i, a) return i
def __startWalk(self): self.__stopWalk() if self.target: now = globalClock.getFrameTime() availableTime = self.arrivalTime - now if availableTime > 0: origH = self.getH() h = PythonUtil.fitDestAngle2Src(origH, self.targetH) delta = abs(h - origH) turnTime = delta / (self.velocity * 5) dist = Vec3(self.target - self.getPos()).length() walkTime = dist / self.velocity denom = turnTime + walkTime if denom != 0: timeCompress = availableTime / denom self.walkTrack = Sequence( self.hprInterval(turnTime * timeCompress, VBase3(h, 0, 0)), self.posInterval(walkTime * timeCompress, self.target)) self.walkTrack.start() else: self.setPos(self.target) self.setH(self.targetH)
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)