def hasGag(self, toonId, networkTime): if not self._gameInProgress(): return if not self.getToon(base.localAvatar.doId): return elapsedTime = globalClockDelta.localElapsedTime(networkTime) self.game.hasGag(toonId, elapsedTime)
def startActive(self, showStartTimestamp): DistributedPartyFireworksActivity.notify.debug("startActive") messenger.send(FireworksStartedEvent) # if too much time has passed since the show started, don't bother # playing the rocket animation, just hide it timeSinceStart = globalClockDelta.localElapsedTime(showStartTimestamp) if timeSinceStart > self.rocketActor.getDuration("launch"): self.rocketActor.hide() self.startShow(self.eventId, self.showStyle, showStartTimestamp) else: self.rocketActor.play("launch") self.rocketParticleSeq = Sequence(Wait(RocketSoundDelay), \ Func(base.playSfx,self.launchSound), \ Func(self.rocketExplosionEffect.start), \ Wait(RocketDirectionDelay), \ LerpHprInterval(self.rocketActor, 4.0, Vec3(0, 0, -60)), \ Func(self.rocketExplosionEffect.end), \ Func(self.rocketActor.hide)) self.rocketParticleSeq.start() # give rocket animation some time to play out before starting the show taskMgr.doMethodLater( FireworksPostLaunchDelay, self.startShow, self.taskName("delayedStartShow"), extraArgs=[ self.eventId, self.showStyle, showStartTimestamp, self.root ], )
def stopMovie(self, timestamp): av = self.cr.doId2do.get(self.avId) if av: def endInteractSetup(): def blah(task = None): av.loop(av.getAnimInfo('LandRoam')[PiratesGlobals.STAND_INDEX][0]) self.adjustPos(av) return task.done taskMgr.doMethodLater(0, blah, self.uniqueName('blahadjustpos')) def endInteractCleanup(): av.canMove = True av.startSmooth() av.motionFSM.request('On') av.clearAnimProp() av.usingPropNoNotice = 0 del self.myIvals[self.avId] self.avId = None self.cleanupMovies() ival = self.createTransitionIval(av, 'idleOutof', transitionBeginCallback = endInteractSetup, transitionEndCallback = endInteractCleanup) ival.start(startT = globalClockDelta.localElapsedTime(timestamp, bits = 32)) self.myIvals[self.avId] = ival
def pickUp(self, toonId, pickupNum, networkTime): if not self._gameInProgress(): return if not self.getToon(base.localAvatar.doId): return elapsedTime = globalClockDelta.localElapsedTime(networkTime) self.game.pickUp(toonId, pickupNum, elapsedTime)
def setChatText(self, chatText, timeout=False, timestamp=None): if timeout: delay = len(chatText) * 0.5 if delay < self.CHAT_TIMEOUT_MIN: delay = self.CHAT_TIMEOUT_MIN elif delay > self.CHAT_TIMEOUT_MAX: delay = self.CHAT_TIMEOUT_MAX if timestamp is not None: delay -= min(globalClockDelta.localElapsedTime(timestamp, bits=32), delay) if not delay: return # If we are currently displaying chat text, we need to "stomp" it. In # other words, we need to clear the current chat text, pause for a # brief moment, and then display the new chat text: if self.getChatText(): self.clearChatText() self.stompChatText = chatText self.stompTask = taskMgr.doMethodLater( self.CHAT_STOMP_DELAY, self.__chatStomp, self.stompTaskName, extraArgs=[timeout]) return self.clearChatText() self.chatPages = chatText.split('\x07') self.setChatPageIndex(0) if timeout: self.chatTimeoutTask = taskMgr.doMethodLater( delay, self.clearChatText, self.chatTimeoutTaskName)
def setMovie(self, mode, avId, timestamp): timeStamp = globalClockDelta.localElapsedTime(timestamp) if mode in (PetConstants.PET_MOVIE_CALL, PetConstants.PET_MOVIE_SCRATCH, PetConstants.PET_MOVIE_FEED): if self.movieTrack is not None and self.movieTrack.isPlaying(): self.movieTrack.finish() if avId != 0: self.isLocalToon = avId == base.localAvatar.doId av = base.cr.doId2do.get(avId) if av is None: self.notify.warning('Avatar %d not found in doId' % avId) return if mode == PetConstants.PET_MOVIE_CLEAR: self.clearMovie() return if mode == PetConstants.PET_MOVIE_CALL: try: self.movieTrack = Sequence(Func(self._petMovieStart, av), Parallel(av.getCallPetIval(), Sequence(Wait(0.54), SoundInterval(self.callSfx))), self._getPetMovieCompleteIval(av)) self.movieTrack.start() except StandardError as error: print str(error) if mode == PetConstants.PET_MOVIE_SCRATCH: try: self.movieTrack = Sequence(Func(self._petMovieStart, av), Func(self.holdPetDownForMovie), Parallel(self.getInteractIval(self.Interactions.SCRATCH), av.getScratchPetIval(), SoundInterval(self.petSfx)), Func(self.releasePetFromHoldDown), self._getPetMovieCompleteIval(av)) self.movieTrack.start() except StandardError as error: print str(error) if mode == PetConstants.PET_MOVIE_FEED: self.bean = loader.loadModel('phase_4/models/props/jellybean4') bean = self.bean.find('**/jellybean') bean.setColor(random.choice(BeanColors)) self.movieTrack = Sequence(Func(self._petMovieStart, av), Func(self.holdPetDownForMovie), Parallel(Func(base.playSfx, self.swallowSfx, 0, 1, 1, 2.5, self.bean), Sequence(ActorInterval(self, 'toBeg'), ActorInterval(self, 'beg'), ActorInterval(self, 'fromBeg'), ActorInterval(self, 'eat'), ActorInterval(self, 'swallow'), Func(self.loop, 'neutral')), Sequence(Wait(0.3), ActorInterval(av, 'feedPet'), Func(av.animFSM.request, 'neutral')), Sequence(Wait(0.3), Func(self.bean.reparentTo, av.rightHand), Func(self.bean.setPos, 0.1, 0.0, 0.2), Wait(2.1), Func(av.update, 0), Func(av.update, 1), Func(av.update, 2), Func(self.bean.wrtReparentTo, render), Parallel(LerpHprInterval(self.bean, hpr=Point3(random.random() * 360.0 * 2, random.random() * 360.0 * 2, random.random() * 360.0 * 2), duration=1.2), ProjectileInterval(self.bean, endPos=self.find('**/joint_tongueBase').getPos(render), duration=1.2, gravityMult=0.45)), Func(self.bean.removeNode))), Func(self.releasePetFromHoldDown), self._getPetMovieCompleteIval(av)) self.movieTrack.start() return
def pieThrow(self, avId, timestamp, heading, pos, power): toon = self.activity.getAvatar(avId) if toon is None: return tossTrack, pieTrack, flyPie = self.getTossPieInterval(toon, pos[0], pos[1], pos[2], heading, 0, 0, power) if avId == base.localAvatar.doId: flyPie.setTag('throwerId', str(avId)) collSphere = CollisionSphere(0, 0, 0, 0.5) collSphere.setTangible(0) name = 'PieSphere-%d' % avId collSphereName = self.activity.uniqueName(name) collNode = CollisionNode(collSphereName) collNode.setFromCollideMask(ToontownGlobals.PieBitmask) collNode.addSolid(collSphere) collNP = flyPie.attachNewNode(collNode) base.cTrav.addCollider(collNP, self.pieHandler) self.toonPieEventNames[collNP] = 'pieHit-' + collSphereName self.accept(self.toonPieEventNames[collNP], self.handlePieCollision) else: player = self.players.get(avId) if player is not None: player.faceForward() def matchRunningAnim(toon = toon): toon.playingAnim = None toon.setSpeed(toon.forwardSpeed, toon.rotateSpeed) newTossTrack = Sequence(tossTrack, Func(matchRunningAnim)) pieTrack = Parallel(newTossTrack, pieTrack, name='PartyCogActivity.pieTrack-%d-%s' % (avId, timestamp)) elapsedTime = globalClockDelta.localElapsedTime(timestamp) if elapsedTime < 16.0 / 24.0: elapsedTime = 16.0 / 24.0 pieTrack.start(elapsedTime) self.pieIvals.append(pieTrack) self.toonPieTracks[avId] = pieTrack
def stopMovie(self, timestamp): av = self.cr.doId2do.get(self.avId) if av: def endInteractSetup(): def blah(task=None): av.loop(av.getAnimInfo("LandRoam")[PiratesGlobals.STAND_INDEX][0]) self.adjustPos(av) return task.done taskMgr.doMethodLater(0, blah, self.uniqueName("blahadjustpos")) def endInteractCleanup(): av.canMove = True av.startSmooth() av.motionFSM.request("On") av.clearAnimProp() av.usingPropNoNotice = 0 del self.myIvals[self.avId] self.avId = None self.cleanupMovies() ival = self.createTransitionIval( av, "idleOutof", transitionBeginCallback=endInteractSetup, transitionEndCallback=endInteractCleanup ) ival.start(startT=globalClockDelta.localElapsedTime(timestamp, bits=32)) self.myIvals[self.avId] = ival
def throwGear(self, point, timestamp=None): if timestamp == None: ts = 0.0 else: ts = globalClockDelta.localElapsedTime(timestamp) point = Point3(point[0], point[1], point[2]) self.fsm.request('throwGear', [point, ts])
def playJoke(self, avId, timestamp): self.realJokeNetworkTime = globalClockDelta.localElapsedTime(timestamp) avatar = base.cr.doId2do.get(avId, None) if avatar: if self.jokeSeq: self.jokeSeq.pause() def playLaughTrack(): base.playSfx(self.jokeSfx, time=1.30) doorJoke = KnockKnockGlobals.Jokes.get( KnockKnockGlobals.Zone2Block2Joke.get(self.zoneId).get( self.block)) knocker = doorJoke[0] punchline = doorJoke[1] holdTime = doorJoke[2] if len( doorJoke) == 3 else KnockKnockGlobals.DEF_PUNCHLINE_HOLD_TIME self.jokeSeq = Sequence() self.jokeSeq.append(Func(base.playSfx, self.knockSfx)) self.jokeSeq.append(Wait(0.2)) self.jokeSeq.append(Func(self.showName)) self.jokeSeq.append( KnockKnockGlobals.generateBasicJoke(avatar, self, knocker, punchline, holdTime, playLaughTrack)) self.jokeSeq.append(Func(self.hideName)) self.jokeSeq.start(self.realJokeNetworkTime)
def setAnimState(self, anim, loop=1, timestamp=None): prevAnim = self.anim self.anim = anim if timestamp == None: ts = 0.0 else: ts = globalClockDelta.localElapsedTime(timestamp) if type(anim) == types.IntType: if anim != 44 and anim != 45: anim = SuitGlobals.getAnimById(anim) animName = anim.getName() elif anim == 44: animName = 'die' elif anim == 45: animName = 'flyNeutral' elif type(anim) == types.StringType: animName = anim if self.animFSM.hasStateNamed(animName): self.animFSM.request(animName, [ts]) else: if loop: self.loop(animName) else: self.play(animName) messenger.send(SuitGlobals.animStateChangeEvent % (self.uniqueName), [anim, prevAnim])
def startActive(self, showStartTimestamp): DistributedPartyFireworksActivity.notify.debug('startActive') messenger.send(FireworksStartedEvent) timeSinceStart = globalClockDelta.localElapsedTime(showStartTimestamp) if timeSinceStart > self.rocketActor.getDuration('launch'): self.rocketActor.hide() if timeSinceStart < 60: self.startShow(self.eventId, self.showStyle, self.songId, showStartTimestamp) else: self.rocketActor.play('launch') self.rocketParticleSeq = Sequence( Wait(RocketSoundDelay), Func(base.playSfx, self.launchSound), Func(self.rocketExplosionEffect.start), Wait(RocketDirectionDelay), LerpHprInterval(self.rocketActor, 4.0, Vec3(0, 0, -60)), Func(self.rocketExplosionEffect.end), Func(self.rocketActor.hide)) self.rocketParticleSeq.start() taskMgr.doMethodLater(FireworksPostLaunchDelay, self.startShow, self.taskName('delayedStartShow'), extraArgs=[ self.eventId, self.showStyle, self.songId, showStartTimestamp, self.root ])
def processStateRequest(self, avId, stateId, lastStateId, timestamp): """ This is the processing part of the state system that mimics the FSM system """ avatar = base.cr.doId2do.get(avId, None) elapsedTime = globalClockDelta.localElapsedTime(timestamp) if not avatar: self.notify.warning( 'SUSPICIOUS! Attempted to change the state of a non-existent avatar!' ) return # Let's exit out of the previous state. if lastStateId == 0: self.exitFreezeUp(avatar) elif lastStateId == 1: self.exitFrozen(avatar) if stateId == 0: self.enterFreezeUp(avatar, elapsedTime) elif stateId == 1: self.enterFrozen(avatar, elapsedTime) elif stateId == 2: self.enterCooldown(avatar, elapsedTime) elif stateId == 3: self.enterCooldown(avatar, elapsedTime, fromFrozen=1) elif stateId == 4: self.handleCooldownFinish(avatar) elif stateId == 5: # The AI is just clearing the state of the specified avatar. self.__resetAvatarIvalAndUnloadIceCube(avatar) else: self.notify.warning( 'Attempted to set state with unknown state id: {0}.'.format( stateId))
def scan(self, timestamp = None, afterShooting = 0): if timestamp == None: ts = 0.0 else: ts = globalClockDelta.localElapsedTime(timestamp) self.fsm.request('scan', [ts, afterShooting])
def setChatText(self, chatText, timeout=False, timestamp=None): if timeout: delay = len(chatText) * 0.5 if delay < self.CHAT_TIMEOUT_MIN: delay = self.CHAT_TIMEOUT_MIN elif delay > self.CHAT_TIMEOUT_MAX: delay = self.CHAT_TIMEOUT_MAX if timestamp is not None: delay -= min( globalClockDelta.localElapsedTime(timestamp, bits=32), delay) if not delay: return # If we are currently displaying chat text, we need to "stomp" it. In # other words, we need to clear the current chat text, pause for a # brief moment, and then display the new chat text: if self.getChatText(): self.clearChatText() self.stompChatText = chatText self.stompTask = taskMgr.doMethodLater(self.CHAT_STOMP_DELAY, self.__chatStomp, self.stompTaskName, extraArgs=[timeout]) return self.clearChatText() self.chatPages = chatText.split('\x07') self.setChatPageIndex(0) if timeout: self.chatTimeoutTask = taskMgr.doMethodLater( delay, self.clearChatText, self.chatTimeoutTaskName)
def startPosInterval(self, startX, startY, startZ, endX, endY, endZ, duration, blendType, ts=0.0): if ts != 0.0: ts = globalClockDelta.localElapsedTime(ts) self.stopMoveInterval() startPos = Point3(startX, startY, startZ) endPos = Point3(endX, endY, endZ) self.moveIval = LerpPosInterval(self, duration=duration, pos=endPos, startPos=startPos, blendType=blendType) self.moveIval.start(ts)
def setState(self, state, timestamp=None): if timestamp == None: ts = 0.0 else: ts = globalClockDelta.localElapsedTime(timestamp) self.state = state if self.boat: self.fsm.request(state, [ts])
def doAttack(self, attackId, avId, timestamp = None): if timestamp == None: ts = 0.0 else: ts = globalClockDelta.localElapsedTime(timestamp) attackName = SuitAttacks.SuitAttackLengths.keys()[attackId] avatar = self.cr.doId2do.get(avId) self.animFSM.request('attack', [attackName, avatar, ts])
def setAnimState(self, anim, timestamp=None, callback=None, extraArgs=[]): self.anim = anim if timestamp is None: ts = 0.0 else: ts = globalClockDelta.localElapsedTime(timestamp) if self.animFSM.getStateNamed(anim): self.animFSM.request(anim, [ts, callback, extraArgs])
def setState(self, state, timestamp=None): if timestamp is None: ts = 0.0 else: ts = globalClockDelta.localElapsedTime(timestamp) self.state = state if self.boat and base.cr.holidayManager.getHoliday( ) != HolidayType.CHRISTMAS: self.fsm.request(state, [ts])
def toonHitBySuit(self, toonId, suitType, suitNum, networkTime): if not self._gameInProgress(): return if not self.getToon(base.localAvatar.doId): return if toonId == localAvatar.doId: return elapsedTime = globalClockDelta.localElapsedTime(networkTime) self.game.toonHitBySuit(toonId, suitType, suitNum, elapsedTime)
def toonUsedGag(self, toonId, x, y, h, networkTime): if not self._gameInProgress(): return if not self.getToon(base.localAvatar.doId): return if toonId == localAvatar.doId: return elapsedTime = globalClockDelta.localElapsedTime(networkTime) self.game.toonUsedGag(toonId, x, y, h, elapsedTime)
def setState(self, state, timestamp = None): if timestamp == None: ts = 0.0 else: ts = globalClockDelta.localElapsedTime(timestamp) self.state = state if self.boat: self.fsm.request(state, [ts]) return
def doTrick(self, trickId, timestamp): if not self.isLockedDown(): if self.trickIval is not None and self.trickIval.isPlaying(): self.trickIval.finish() self.trickIval = PetTricks.getTrickIval(self, trickId) if trickId == PetTricks.Tricks.BALK: mood = self.getDominantMood() self.trickIval = Parallel(self.trickIval, Sequence(Func(self.handleMoodChange, 'confusion'), Wait(1.0), Func(self.handleMoodChange, mood))) self.trickIval.start(globalClockDelta.localElapsedTime(timestamp)) return
def playProjectile(self): ts = globalClockDelta.localElapsedTime(self.projTimestamp) self.ival = Sequence( FlightProjectileInterval(self, startPos=Point3(*self.projStart), endPos=Point3(*self.projEnd), duration=self.projDuration, gravityMult=self.projGravity), Func(self.ivalFinished)) self.ival.start(0) #ts)
def setSuitState(self, index, startPoint, endPoint, timestamp=None): if timestamp != None: ts = globalClockDelta.localElapsedTime(timestamp) else: ts = 0.0 self.suitState = self.stateIndex2suitState[index] self.startPoint = startPoint self.endPoint = endPoint self.suitFSM.request(self.suitState, [startPoint, endPoint, ts]) return
def setAnimState(self, anim, timestamp=None, callback=None, extraArgs=[]): self.anim = anim if timestamp == None: ts = 0.0 else: ts = globalClockDelta.localElapsedTime(timestamp) if type(anim) == types.IntType: anim = self.animId2animState[anim] if self.animFSM.getStateNamed(anim): self.animFSM.request(anim, [ts, callback, extraArgs]) return
def setAnimState(self, anim, timestamp = None, callback = None, extraArgs = []): self.anim = anim if timestamp == None: ts = 0.0 else: ts = globalClockDelta.localElapsedTime(timestamp) if type(anim) == types.IntType: anim = self.animId2animState[anim] if self.animFSM.getStateNamed(anim): self.animFSM.request(anim, [ts, callback, extraArgs]) return
def pieThrow(self, avId, timestamp, heading, pos, power): """Show local or remote toon throwing a pie.""" toon = self.activity.getAvatar(avId) if toon is None: return tossTrack, pieTrack, flyPie = self.getTossPieInterval( toon, pos[0], pos[1], pos[2], heading, 0, 0, power) if avId == base.localAvatar.doId: flyPie.setTag('throwerId', str(avId)) collSphere = CollisionSphere(0, 0, 0, 0.5) # Make the sphere intangible collSphere.setTangible(0) name = "PieSphere-%d" % avId collSphereName = self.activity.uniqueName(name) collNode = CollisionNode(collSphereName) collNode.setFromCollideMask(ToontownGlobals.PieBitmask) collNode.addSolid(collSphere) collNP = flyPie.attachNewNode(collNode) base.cTrav.addCollider(collNP, self.pieHandler) self.toonPieEventNames[collNP] = 'pieHit-' + collSphereName self.accept(self.toonPieEventNames[collNP], self.handlePieCollision) else: player = self.players.get(avId) if player is not None: player.faceForward() def matchRunningAnim(toon=toon): toon.playingAnim = None toon.setSpeed(toon.forwardSpeed, toon.rotateSpeed) newTossTrack = Sequence(tossTrack, Func(matchRunningAnim)) pieTrack = Parallel(newTossTrack, pieTrack, name="PartyCogActivity.pieTrack-%d-%s" % (avId, timestamp)) elapsedTime = globalClockDelta.localElapsedTime(timestamp) if elapsedTime < 16. / 24.: elapsedTime = 16. / 24. # make the pie fly immediately pieTrack.start(elapsedTime) self.pieIvals.append(pieTrack) self.toonPieTracks[avId] = pieTrack
def setAnimState(self, animName, animMultiplier=1.0, timestamp=None, animType=None, callback=None, extraArgs=[]): if self.animFSM.getCurrentState().getName() == animName: return None if not animName or animName == 'None': return None if timestamp == None: ts = 0.0 else: ts = globalClockDelta.localElapsedTime(timestamp) self.animMultiplier = animMultiplier if self.animFSM.getStateNamed(animName): self.animFSM.request(animName, [animMultiplier, ts, callback, extraArgs])
def doTrick(self, trickId, timestamp): if not self.isLockedDown(): if self.trickIval is not None and self.trickIval.isPlaying(): self.trickIval.finish() self.trickIval = PetTricks.getTrickIval(self, trickId) if trickId == PetTricks.Tricks.BALK: mood = self.getDominantMood() self.trickIval = Parallel( self.trickIval, Sequence(Func(self.handleMoodChange, 'confusion'), Wait(1.0), Func(self.handleMoodChange, mood))) self.trickIval.start(globalClockDelta.localElapsedTime(timestamp))
def start(self, timestamp): if self.doneTask is not None: self.stop() self.setup() for track in self.tracks.values(): track.start(globalClockDelta.localElapsedTime(timestamp, bits=32)) self.doneTask = taskMgr.doMethodLater( self.getDuration(), self.__handleMovieDone, self.getUniqueName() + '-done')
def start(self, timestamp): if self.doneTask is not None: self.stop() self.setup() for track in self.tracks.values(): track.start(globalClockDelta.localElapsedTime(timestamp, bits=32)) self.doneTask = taskMgr.doMethodLater(self.getDuration(), self.__handleMovieDone, self.getUniqueName() + '-done')
def toonHitByGag(self, toonId, hitToon, networkTime): if not self._gameInProgress(): return None if not self.getToon(base.localAvatar.doId): return None if toonId == localAvatar.doId: return None elapsedTime = globalClockDelta.localElapsedTime(networkTime) self.game.toonHitByGag(toonId, hitToon, elapsedTime)
def startProjInterval(self, startX, startY, startZ, endX, endY, endZ, duration, gravityMult, ts=0): if isinstance(ts, int) and ts != 0: ts = globalClockDelta.localElapsedTime(ts) self.disableRay() self.stopMoveInterval() startPos = Point3(startX, startY, startZ) endPos = Point3(endX, endY, endZ) oldHpr = self.getHpr(render) self.headsUp(endPos) newHpr = self.getHpr(render) self.setHpr(oldHpr) self.moveIval = Parallel(LerpHprInterval(self, duration=0.5, hpr=newHpr, startHpr=oldHpr, blendType='easeInOut'), Sequence(Func(self.animFSM.request, 'flyAway', [ts]), Wait(3.5), Func(self.animFSM.request, 'flyDown', [1.0])), Sequence(Wait(2.0), Func(self.headsUp, endPos), ProjectileInterval(self, startPos=startPos, endPos=endPos, gravityMult=gravityMult, duration=duration))) self.moveIval.start(ts)
def doAttack(self, attackId, avId, timestamp=None): if timestamp == None: ts = 0.0 else: ts = globalClockDelta.localElapsedTime(timestamp) attackName = SuitAttacks.SuitAttackLengths.keys()[attackId] attackTaunt = CIGlobals.SuitAttackTaunts[attackName][random.randint(0, len(CIGlobals.SuitAttackTaunts[attackName]) - 1)] avatar = self.cr.doId2do.get(avId) shouldChat = 0 if self.suitPlan in [SuitBank.VicePresident, SuitBank.LucyCrossbill]: shouldChat = random.randint(0, 2) if shouldChat == 0: self.setChat(attackTaunt) self.animFSM.request('attack', [attackName, avatar, 0.0]) return
def doAction(self, action, data, networkTime): if not self._gameInProgress(): return if action == Globals.GameActions.RevealDoor: self.game.toonRevealsDoor(data) elif action == Globals.GameActions.EnterDoor: self.game.toonEntersDoor(data) elif action == Globals.GameActions.OpenDoor: timeLeft = Globals.SecondsUntilGameEnds - globalClockDelta.localElapsedTime(networkTime) self.game.openDoor(timeLeft) elif action == Globals.GameActions.Countdown: countdownTimeLeft = Globals.SecondsUntilTimeout self.game.countdown(countdownTimeLeft) elif action == Globals.GameActions.TimeAlert: self.game.timeAlert()
def startActive(self, showStartTimestamp): DistributedPartyFireworksActivity.notify.debug('startActive') messenger.send(FireworksStartedEvent) timeSinceStart = globalClockDelta.localElapsedTime(showStartTimestamp) if timeSinceStart > self.rocketActor.getDuration('launch'): self.rocketActor.hide() self.startShow(self.eventId, self.showStyle, showStartTimestamp) else: self.rocketActor.play('launch') self.rocketParticleSeq = Sequence(Wait(RocketSoundDelay), Func(base.playSfx, self.launchSound), Func(self.rocketExplosionEffect.start), Wait(RocketDirectionDelay), LerpHprInterval(self.rocketActor, 4.0, Vec3(0, 0, -60)), Func(self.rocketExplosionEffect.end), Func(self.rocketActor.hide)) self.rocketParticleSeq.start() taskMgr.doMethodLater(FireworksPostLaunchDelay, self.startShow, self.taskName('delayedStartShow'), extraArgs=[self.eventId, self.showStyle, showStartTimestamp, self.root])
def showBoardingChoice(self, shipToBoard): if not self.boardingPanel: shipInfo = shipToBoard.getShipInfo() from direct.distributed.ClockDelta import globalClockDelta dt = globalClockDelta.localElapsedTime(shipToBoard.sinkTimestamp) time = shipToBoard.sinkTime - dt self.boardingPanel = ShipFrameBoard.ShipFrameBoard( shipName=shipInfo[1], shipClass=shipInfo[2], mastInfo=shipInfo[3], parent=base.a2dTopCenter, pos=(-0.45, 0, -0.5), time=time, command=self.__handleBoardingChoice) self._boardingTimer = taskMgr.doMethodLater( time, self._boardingChoiceTimeout, 'boardingTimer') self.boardingPanel.show()
def showToonThrowingPie(self, avId, timestamp, heading, pos): toon = self.getAvatar(avId) if toon: (tossTrack, pieTrack, flyPie) = self.getTossPieInterval(toon, pos[0], pos[1], pos[2], heading, 0, 0, 0) def removePieFromTraverser(flyPie = flyPie): if base.cTrav: if flyPie: base.cTrav.removeCollider(flyPie) if avId == self.localAvId: flyPie.setTag('throwerId', str(avId)) collSphere = CollisionSphere(0, 0, 0, 0.5) collSphere.setTangible(0) name = 'PieSphere-%d' % avId collSphereName = self.uniqueName(name) collNode = CollisionNode(collSphereName) collNode.setFromCollideMask(ToontownGlobals.PieBitmask) collNode.addSolid(collSphere) colNp = flyPie.attachNewNode(collNode) colNp.show() base.cTrav.addCollider(colNp, self.pieHandler) self.accept('pieHit-' + collSphereName, self.handlePieHitting) def matchRunningAnim(toon = toon): toon.playingAnim = None toon.setSpeed(toon.forwardSpeed, toon.rotateSpeed) newTossTrack = Sequence(tossTrack, Func(matchRunningAnim)) pieTrack = Parallel(newTossTrack, pieTrack) elapsedTime = globalClockDelta.localElapsedTime(timestamp) if elapsedTime < 16.0 / 24.0: elapsedTime = 16.0 / 24.0 pieTrack.start(elapsedTime) self.toonPieTracks[avId] = pieTrack
def showToonThrowingPie(self, avId, timestamp, heading, pos): toon = self.getAvatar(avId) if toon: (tossTrack, pieTrack, flyPie) = self.getTossPieInterval(toon, pos[0], pos[1], pos[2], heading, 0, 0, 0) def removePieFromTraverser(flyPie=flyPie): if base.cTrav: if flyPie: base.cTrav.removeCollider(flyPie) if avId == self.localAvId: flyPie.setTag('throwerId', str(avId)) collSphere = CollisionSphere(0, 0, 0, 0.5) collSphere.setTangible(0) name = 'PieSphere-%d' % avId collSphereName = self.uniqueName(name) collNode = CollisionNode(collSphereName) collNode.setFromCollideMask(ToontownGlobals.PieBitmask) collNode.addSolid(collSphere) colNp = flyPie.attachNewNode(collNode) colNp.show() base.cTrav.addCollider(colNp, self.pieHandler) self.accept('pieHit-' + collSphereName, self.handlePieHitting) def matchRunningAnim(toon=toon): toon.playingAnim = None toon.setSpeed(toon.forwardSpeed, toon.rotateSpeed) newTossTrack = Sequence(tossTrack, Func(matchRunningAnim)) pieTrack = Parallel(newTossTrack, pieTrack) elapsedTime = globalClockDelta.localElapsedTime(timestamp) if elapsedTime < 16.0 / 24.0: elapsedTime = 16.0 / 24.0 pieTrack.start(elapsedTime) self.toonPieTracks[avId] = pieTrack
def startFlying(self, timestamp): self.flyTrack.loop(globalClockDelta.localElapsedTime(timestamp, bits=32)) self.loop('flying')
def gunShot(self, avId, timestamp): ts = globalClockDelta.localElapsedTime(timestamp) av = self.getRemoteAvatar(avId) if av: av.fsm.request('shoot', [ts])
def deadAvatar(self, avId, timestamp): ts = globalClockDelta.localElapsedTime(timestamp) av = self.getRemoteAvatar(avId) if av: av.fsm.request('die', [ts])
def setState(self, stateName, timestamp): ts = globalClockDelta.localElapsedTime(timestamp) self.fsm.request(stateName, [ts])
def playMovie(self, av, timestamp): self.pendingMovie = None av.stopSmooth() av.motionFSM.request("Off") availAnims = CustomAnims.INTERACT_ANIMS.get(self.interactType) availProps = None if availAnims == None: self.notify.warning( "undefined interaction type %s, not found in CustomAnims.INTERACT_ANIMS" % self.interactType ) else: availProps = availAnims.get("props") availIdles = availAnims.get("idles") intoAnims = availAnims.get("idleInto", [""]) self.interactAnim = random.choice(availIdles) def interactSetup(): av.usingPropNoNotice = 1 av.abortNotice() self.adjustPos(av) av.loop(self.interactAnim) def playInteract(): if self.interactType == "hit": av.play(self.interactAnim) if self.interactAnim == "boxing_kick": reactDelay = 0.42999999999999999 else: reactDelay = 0.40000000000000002 taskMgr.doMethodLater(reactDelay, self.playInteraction, self.uniqueName("playReact")) elif self.interactType == "sit": av.loop(self.interactAnim, blendT=av.motionFSM.BLENDAMT) (posOffset, hprOffset) = self.getLocatorOffset(av.getParent()) av.setPos(posOffset[0], posOffset[1], posOffset[2]) av.setHpr(hprOffset[0], hprOffset[1], hprOffset[2]) elif self.interactType == "stockade": av.loop(self.interactAnim, blendT=av.motionFSM.BLENDAMT) myPos = self.getPos(av.getParent()) myHpr = self.getHpr(av.getParent()) av.setPos(myPos[0], myPos[1], myPos[2]) av.setHpr(myHpr[0], myHpr[1], myHpr[2]) else: av.loop(self.interactAnim, blendT=0) (posOffset, hprOffset) = self.getLocatorOffset(av.getParent()) if self.interactType not in PiratesGlobals.INTERACT_TYPES_WITHOUT_FORCE_POS: av.setPos(posOffset[0], posOffset[1], posOffset[2]) av.setHpr(hprOffset[0], hprOffset[1], hprOffset[2]) if availProps: av.holdAnimProp(availProps) av.interactAnim = self.interactAnim del self.myIvals[self.avId] av.canMove = False self.sendUpdate("inPosition") self.cleanupMovies() ival = self.createTransitionIval(av, "idleInto", interactSetup, playInteract) startTime = globalClockDelta.localElapsedTime(timestamp, bits=32) ival.start(startT=startTime) self.myIvals[self.avId] = ival
def eagleExitCooldown(self, eagleId, networkTime): self.notify.debugCall() elapsedTime = globalClockDelta.localElapsedTime(networkTime) self.game.eagleExitCooldown(eagleId, elapsedTime)
def debuffPowerup(self, toonId, pickupType, networkTime): elapsedTime = globalClockDelta.localElapsedTime(networkTime) self.game.debuffPowerup(toonId, pickupType, elapsedTime)
def toonClearAsEagleTarget(self, toonId, eagleId, networkTime): self.notify.debugCall() elapsedTime = globalClockDelta.localElapsedTime(networkTime) self.game.toonClearAsEagleTarget(toonId, eagleId, elapsedTime)
def toonSpawn(self, toonId, networkTime): if toonId != base.localAvatar.doId: elapsedTime = globalClockDelta.localElapsedTime(networkTime) self.game.toonSpawn(toonId, elapsedTime)
def __showToonHitBySuit(self, avId, timestamp): toon = self.getAvatar(avId) if toon == None: return rng = self.toonRNGs[self.avIdList.index(avId)] curPos = toon.getPos(render) oldTrack = self.toonHitTracks[avId] if oldTrack.isPlaying(): oldTrack.finish() toon.setPos(curPos) toon.setZ(self.TOON_Z) parentNode = render.attachNewNode('mazeFlyToonParent-' + `avId`) parentNode.setPos(toon.getPos()) toon.reparentTo(parentNode) toon.setPos(0,0,0) startPos = parentNode.getPos() dropShadow = toon.dropShadow.copyTo(parentNode) dropShadow.setScale(toon.dropShadow.getScale(render)) trajectory = Trajectory.Trajectory( 0, Point3(0,0,0), Point3(0,0,50), gravMult=1.0) flyDur = trajectory.calcTimeOfImpactOnPlane(0.0) while 1: endTile = [rng.randint(2, self.maze.width-1), rng.randint(2, self.maze.height-1)] if self.maze.isWalkable(endTile[0], endTile[1]): break endWorldCoords = self.maze.tile2world(endTile[0], endTile[1]) endPos = Point3(endWorldCoords[0], endWorldCoords[1], startPos[2]) def flyFunc(t, trajectory, startPos = startPos, endPos = endPos, dur = flyDur, moveNode = parentNode, flyNode = toon): u = t/dur moveNode.setX(startPos[0] + u * (endPos[0]-startPos[0])) moveNode.setY(startPos[1] + u * (endPos[1]-startPos[1])) flyNode.setPos(trajectory.getPos(t)) flyTrack = Sequence( LerpFunctionInterval(flyFunc, fromData=0.0, toData=flyDur, duration=flyDur, extraArgs=[trajectory]), name=toon.uniqueName('hitBySuit-fly')) if avId != self.localAvId: cameraTrack = Sequence() else: self.camParent.reparentTo(parentNode) startCamPos = camera.getPos() destCamPos = camera.getPos() zenith = trajectory.getPos(flyDur/2.0)[2] destCamPos.setZ(zenith*1.3) destCamPos.setY(destCamPos[1]*0.3) def camTask(task, zenith = zenith, flyNode = toon, startCamPos = startCamPos, camOffset = destCamPos - startCamPos): u = flyNode.getZ()/zenith camera.setPos(startCamPos + camOffset*u) camera.lookAt(toon) return Task.cont camTaskName = 'mazeToonFlyCam-' + `avId` taskMgr.add(camTask, camTaskName, priority=20) def cleanupCamTask(self = self, toon = toon, camTaskName = camTaskName, startCamPos = startCamPos): taskMgr.remove(camTaskName) self.camParent.reparentTo(toon) camera.setPos(startCamPos) camera.lookAt(toon) cameraTrack = Sequence( Wait(flyDur), Func(cleanupCamTask), name='hitBySuit-cameraLerp') geomNode = toon.getGeomNode() startHpr = geomNode.getHpr() destHpr = Point3(startHpr) hRot = rng.randrange(1, 8) if rng.choice([0, 1]): hRot = -hRot destHpr.setX(destHpr[0] + hRot*360) spinHTrack = Sequence( LerpHprInterval(geomNode, flyDur, destHpr, startHpr=startHpr), Func(geomNode.setHpr, startHpr), name=toon.uniqueName('hitBySuit-spinH')) parent = geomNode.getParent() rotNode = parent.attachNewNode('rotNode') geomNode.reparentTo(rotNode) rotNode.setZ(toon.getHeight()/2.0) oldGeomNodeZ = geomNode.getZ() geomNode.setZ(-toon.getHeight()/2.0) startHpr = rotNode.getHpr() destHpr = Point3(startHpr) pRot = rng.randrange(1,3) if rng.choice([0, 1]): pRot = -pRot destHpr.setY(destHpr[1] + pRot*360) spinPTrack = Sequence( LerpHprInterval(rotNode, flyDur, destHpr, startHpr=startHpr), Func(rotNode.setHpr, startHpr), name=toon.uniqueName('hitBySuit-spinP')) i = self.avIdList.index(avId) soundTrack = Sequence( Func(base.playSfx, self.sndTable['hitBySuit'][i]), Wait(flyDur * (2.0/3.0)), SoundInterval(self.sndTable['falling'][i], duration=flyDur * (1.0/3.0)), name=toon.uniqueName('hitBySuit-soundTrack')) def preFunc(self = self, avId = avId, toon = toon, dropShadow = dropShadow): forwardSpeed = toon.forwardSpeed rotateSpeed = toon.rotateSpeed if avId == self.localAvId: self.orthoWalk.stop() else: toon.stopSmooth() if forwardSpeed or rotateSpeed: toon.setSpeed(forwardSpeed, rotateSpeed) toon.dropShadow.hide() def postFunc(self = self, avId = avId, oldGeomNodeZ = oldGeomNodeZ, dropShadow = dropShadow, parentNode = parentNode): if avId == self.localAvId: base.localAvatar.setPos(endPos) if hasattr(self, 'orthoWalk'): if self.gameFSM.getCurrentState().getName() == 'play': self.orthoWalk.start() dropShadow.removeNode() del dropShadow toon.dropShadow.show() geomNode = toon.getGeomNode() rotNode = geomNode.getParent() baseNode = rotNode.getParent() geomNode.reparentTo(baseNode) rotNode.removeNode() del rotNode geomNode.setZ(oldGeomNodeZ) toon.reparentTo(render) toon.setPos(endPos) parentNode.removeNode() del parentNode if avId != self.localAvId: toon.startSmooth() preFunc() hitTrack = Sequence(Parallel(flyTrack, cameraTrack, spinHTrack, spinPTrack, soundTrack), Func(postFunc), name=toon.uniqueName('hitBySuit')) self.toonHitTracks[avId] = hitTrack hitTrack.start(globalClockDelta.localElapsedTime(timestamp))
def setTrack(self, track, timestamp=0.0): self.track = Sequence() for screenIndex, duration in track: self.track.append(Func(self.setScreen, screenIndex)) self.track.append(Wait(duration)) self.track.loop(globalClockDelta.localElapsedTime(timestamp, bits=32))
def showToonHitBySuit(self, avId, timestamp): toon = self.getAvatar(avId) if toon == None: return rng = self.toonRNGs[self.avIdList.index(avId)] curPos = toon.getPos(render) oldTrack = self.toonHitTracks[avId] if oldTrack.isPlaying(): oldTrack.finish() toon.setPos(curPos) toon.setZ(self.TOON_Z) parentNode = render.attachNewNode('mazeFlyToonParent-' + `avId`) parentNode.setPos(toon.getPos()) toon.reparentTo(parentNode) toon.setPos(0, 0, 0) startPos = parentNode.getPos() dropShadow = toon.dropShadow.copyTo(parentNode) dropShadow.setScale(toon.dropShadow.getScale(render)) trajectory = Trajectory.Trajectory(0, Point3(0, 0, 0), Point3(0, 0, 50), gravMult=1.0) oldFlyDur = trajectory.calcTimeOfImpactOnPlane(0.0) trajectory = Trajectory.Trajectory(0, Point3(0, 0, 0), Point3(0, 0, 50), gravMult=0.55) flyDur = trajectory.calcTimeOfImpactOnPlane(0.0) avIndex = self.avIdList.index(avId) endPos = CTGG.ToonStartingPositions[avIndex] def flyFunc(t, trajectory, startPos = startPos, endPos = endPos, dur = flyDur, moveNode = parentNode, flyNode = toon): u = t / dur moveNode.setX(startPos[0] + u * (endPos[0] - startPos[0])) moveNode.setY(startPos[1] + u * (endPos[1] - startPos[1])) flyNode.setPos(trajectory.getPos(t)) flyTrack = Sequence(LerpFunctionInterval(flyFunc, fromData=0.0, toData=flyDur, duration=flyDur, extraArgs=[trajectory]), name=toon.uniqueName('hitBySuit-fly')) geomNode = toon.getGeomNode() startHpr = geomNode.getHpr() destHpr = Point3(startHpr) hRot = rng.randrange(1, 8) if rng.choice([0, 1]): hRot = -hRot destHpr.setX(destHpr[0] + hRot * 360) spinHTrack = Sequence(LerpHprInterval(geomNode, flyDur, destHpr, startHpr=startHpr), Func(geomNode.setHpr, startHpr), name=toon.uniqueName('hitBySuit-spinH')) parent = geomNode.getParent() rotNode = parent.attachNewNode('rotNode') geomNode.reparentTo(rotNode) rotNode.setZ(toon.getHeight() / 2.0) oldGeomNodeZ = geomNode.getZ() geomNode.setZ(-toon.getHeight() / 2.0) startHpr = rotNode.getHpr() destHpr = Point3(startHpr) pRot = rng.randrange(1, 3) if rng.choice([0, 1]): pRot = -pRot destHpr.setY(destHpr[1] + pRot * 360) spinPTrack = Sequence(LerpHprInterval(rotNode, flyDur, destHpr, startHpr=startHpr), Func(rotNode.setHpr, startHpr), name=toon.uniqueName('hitBySuit-spinP')) i = self.avIdList.index(avId) soundTrack = Sequence(Func(base.playSfx, self.sndTable['hitBySuit'][i]), Wait(flyDur * (2.0 / 3.0)), SoundInterval(self.sndTable['falling'][i], duration=flyDur * (1.0 / 3.0)), name=toon.uniqueName('hitBySuit-soundTrack')) def preFunc(self = self, avId = avId, toon = toon, dropShadow = dropShadow): forwardSpeed = toon.forwardSpeed rotateSpeed = toon.rotateSpeed if avId == self.localAvId: self.stopGameWalk() else: toon.stopSmooth() if forwardSpeed or rotateSpeed: toon.setSpeed(forwardSpeed, rotateSpeed) toon.dropShadow.hide() def postFunc(self = self, avId = avId, oldGeomNodeZ = oldGeomNodeZ, dropShadow = dropShadow, parentNode = parentNode): if avId == self.localAvId: base.localAvatar.setPos(endPos) if hasattr(self, 'gameWalk'): toon = base.localAvatar toon.setSpeed(0, 0) self.startGameWalk() dropShadow.removeNode() del dropShadow toon = self.getAvatar(avId) if toon: toon.dropShadow.show() geomNode = toon.getGeomNode() rotNode = geomNode.getParent() baseNode = rotNode.getParent() geomNode.reparentTo(baseNode) rotNode.removeNode() del rotNode geomNode.setZ(oldGeomNodeZ) if toon: toon.reparentTo(render) toon.setPos(endPos) parentNode.removeNode() del parentNode if avId != self.localAvId: if toon: toon.startSmooth() preFunc() slipBack = Parallel(Sequence(ActorInterval(toon, 'slip-backward', endFrame=24), Wait(CTGG.LyingDownDuration - (flyDur - oldFlyDur)), ActorInterval(toon, 'slip-backward', startFrame=24))) if toon.doId == self.localAvId: slipBack.append(SoundInterval(self.sndOof)) hitTrack = Sequence(Parallel(flyTrack, spinHTrack, spinPTrack, soundTrack), slipBack, Func(postFunc), name=toon.uniqueName('hitBySuit')) self.notify.debug('hitTrack duration = %s' % hitTrack.getDuration()) self.toonHitTracks[avId] = hitTrack hitTrack.start(globalClockDelta.localElapsedTime(timestamp)) return
def enterTeleportOut(self, timestamp): self.track = self.getTeleportOutTrack() self.track.start(globalClockDelta.localElapsedTime(timestamp))