from direct.showbase import DirectObject from direct.directnotify import DirectNotifyGlobal import BasicEntities from panda3d.core import * from direct.interval.IntervalGlobal import * from direct.distributed.ClockDelta import * from toontown.toonbase import ToontownGlobals from direct.directnotify import DirectNotifyGlobal from direct.fsm import ClassicFSM def nothing(self, track, subjectNodePath, duration): return track def irisInOut(self, track, subjectNodePath, duration): track.append(Sequence(Func(base.transitions.irisOut, 0.5), Func(base.transitions.irisIn, 1.5), Wait(duration), Func(base.transitions.irisOut, 1.0), Func(base.transitions.irisIn, 0.5))) return track def letterBox(self, track, subjectNodePath, duration): track.append(Sequence(Wait(duration))) return track def foo1(self, track, subjectNodePath, duration): track.append(Sequence(Func(base.localAvatar.stopUpdateSmartCamera), PosHprInterval(camera, other=subjectNodePath, pos=Point3(-2, -35, 7.5), hpr=VBase3(-7, 0, 0)), LerpPosHprInterval(nodePath=camera, other=subjectNodePath, duration=duration, pos=Point3(2, -22, 7.5), hpr=VBase3(4, 0, 0), blendType='easeInOut'), PosHprInterval(camera, other=subjectNodePath, pos=Point3(0, -28, 7.5), hpr=VBase3(0, 0, 0)), Func(base.localAvatar.startUpdateSmartCamera))) return track def doorUnlock(self, track, subjectNodePath, duration): track.append(Sequence(Func(base.localAvatar.stopUpdateSmartCamera), PosHprInterval(camera, other=self, pos=Point3(-2, -35, 7.5), hpr=VBase3(-7, 0, 0)), LerpPosHprInterval(nodePath=camera, other=self, duration=duration, pos=Point3(2, -22, 7.5), hpr=VBase3(4, 0, 0), blendType='easeInOut'), PosHprInterval(camera, other=self, pos=Point3(0, -28, 7.5), hpr=VBase3(0, 0, 0)), Func(base.localAvatar.startUpdateSmartCamera))) return track class CutScene(BasicEntities.NodePathEntity, DirectObject.DirectObject): notify = DirectNotifyGlobal.directNotify.newCategory('CutScene') effects = {'nothing': nothing, 'irisInOut': irisInOut, 'letterBox': letterBox} motions = {'foo1': foo1, 'doorUnlock': doorUnlock} def __init__(self, level, entId): DirectObject.DirectObject.__init__(self) BasicEntities.NodePathEntity.__init__(self, level, entId) self.track = None self.setEffect(self.effect) self.setMotion(self.motion) self.subjectNodePath = render.attachNewNode('CutScene') self.subjectNodePath.setPos(self.pos) self.subjectNodePath.setHpr(self.hpr) self.setStartStop(self.startStopEvent) return def destroy(self): self.ignore(self.startStopEvent) self.startStopEvent = None BasicEntities.NodePathEntity.destroy(self) return def setEffect(self, effect): self.effect = effect self.getEffect = self.effects[effect] def setMotion(self, motion): self.motionType = motion self.getMotion = self.motions[motion] def setSubjectNodePath(self, subjectNodePath): self.subjectNodePath = subjectNodePath def startOrStop(self, start): trackName = 'cutSceneTrack-%d' % (id(self),) if start: if self.track: self.track.finish() self.track = None track = Parallel(name=trackName) track = self.getEffect(self, track, self.subjectNodePath, self.duration) track = self.getMotion(self, track, self.subjectNodePath, self.duration) track = Sequence(Wait(0.4), track) track.start(0.0) self.track = track elif self.track: self.track.pause() self.track = None base.localAvatar.startUpdateSmartCamera() return def setStartStop(self, event): if self.startStopEvent: self.ignore(self.startStopEvent) self.startStopEvent = self.getOutputEventName(event) if self.startStopEvent: self.accept(self.startStopEvent, self.startOrStop) def getName(self): return 'switch-%s' % (self.entId,)