2022-12-16 18:40:57 -06:00
|
|
|
from panda3d.core import Vec3
|
|
|
|
from panda3d.core import OmniBoundingVolume
|
|
|
|
from panda3d.core import AlphaTestAttrib
|
|
|
|
from panda3d.core import RenderAttrib
|
2019-11-02 17:27:54 -05:00
|
|
|
from direct.actor.Actor import Actor
|
|
|
|
from direct.interval.IntervalGlobal import *
|
|
|
|
from direct.distributed.ClockDelta import globalClockDelta
|
|
|
|
from toontown.effects.FireworkShowMixin import FireworkShowMixin
|
|
|
|
from toontown.effects.RocketExplosion import RocketExplosion
|
|
|
|
from toontown.toonbase import TTLocalizer
|
2019-12-30 00:07:56 -06:00
|
|
|
from .PartyGlobals import FireworkShows
|
|
|
|
from .PartyGlobals import ActivityIds
|
|
|
|
from .PartyGlobals import ActivityTypes
|
|
|
|
from .PartyGlobals import FireworksStartedEvent
|
|
|
|
from .PartyGlobals import FireworksFinishedEvent
|
|
|
|
from .PartyGlobals import FireworksPostLaunchDelay
|
|
|
|
from .PartyGlobals import RocketSoundDelay
|
|
|
|
from .PartyGlobals import RocketDirectionDelay
|
|
|
|
from .DistributedPartyActivity import DistributedPartyActivity
|
|
|
|
from .activityFSMs import FireworksActivityFSM
|
|
|
|
from . import PartyGlobals
|
2019-11-02 17:27:54 -05:00
|
|
|
|
|
|
|
class DistributedPartyFireworksActivity(DistributedPartyActivity, FireworkShowMixin):
|
|
|
|
notify = directNotify.newCategory('DistributedPartyFireworksActivity')
|
|
|
|
|
|
|
|
def __init__(self, cr):
|
|
|
|
DistributedPartyFireworksActivity.notify.debug('__init__')
|
|
|
|
DistributedPartyActivity.__init__(self, cr, ActivityIds.PartyFireworks, ActivityTypes.HostInitiated, wantLever=True)
|
|
|
|
FireworkShowMixin.__init__(self, restorePlaygroundMusic=True, startDelay=FireworksPostLaunchDelay)
|
|
|
|
|
|
|
|
def setEventId(self, eventId):
|
|
|
|
DistributedPartyFireworksActivity.notify.debug('setEventId( %s )' % FireworkShows.getString(eventId))
|
|
|
|
self.eventId = eventId
|
|
|
|
|
|
|
|
def setShowStyle(self, showStyle):
|
|
|
|
DistributedPartyFireworksActivity.notify.debug('setShowStyle( %d )' % showStyle)
|
|
|
|
self.showStyle = showStyle
|
|
|
|
|
|
|
|
def load(self):
|
|
|
|
DistributedPartyFireworksActivity.notify.debug('load')
|
|
|
|
DistributedPartyActivity.load(self)
|
|
|
|
self.eventId = PartyGlobals.FireworkShows.Summer
|
|
|
|
self.launchPadModel = loader.loadModel('phase_13/models/parties/launchPad')
|
|
|
|
self.launchPadModel.setH(90.0)
|
|
|
|
self.launchPadModel.setPos(0.0, -18.0, 0.0)
|
|
|
|
self.launchPadModel.reparentTo(self.root)
|
|
|
|
railingsCollection = self.launchPadModel.findAllMatches('**/launchPad_mesh/*railing*')
|
|
|
|
for i in range(railingsCollection.getNumPaths()):
|
|
|
|
railingsCollection[i].setAttrib(AlphaTestAttrib.make(RenderAttrib.MGreater, 0.75))
|
|
|
|
|
|
|
|
leverLocator = self.launchPadModel.find('**/RocketLever_locator')
|
|
|
|
self.lever.setPosHpr(Vec3.zero(), Vec3.zero())
|
|
|
|
self.lever.reparentTo(leverLocator)
|
|
|
|
self.toonPullingLeverInterval = None
|
|
|
|
self.sign.reparentTo(self.launchPadModel.find('**/launchPad_sign_locator'))
|
|
|
|
self.rocketActor = Actor('phase_13/models/parties/rocket_model', {'launch': 'phase_13/models/parties/rocket_launch'})
|
|
|
|
rocketLocator = self.launchPadModel.find('**/rocket_locator')
|
|
|
|
self.rocketActor.reparentTo(rocketLocator)
|
|
|
|
self.rocketActor.node().setBound(OmniBoundingVolume())
|
|
|
|
self.rocketActor.node().setFinal(True)
|
|
|
|
effectsLocator = self.rocketActor.find('**/joint1')
|
|
|
|
self.rocketExplosionEffect = RocketExplosion(effectsLocator, rocketLocator)
|
|
|
|
self.rocketParticleSeq = None
|
2020-01-14 13:28:52 -06:00
|
|
|
self.launchSound = base.loader.loadSfx('phase_13/audio/sfx/rocket_launch.ogg')
|
2019-11-02 17:27:54 -05:00
|
|
|
self.activityFSM = FireworksActivityFSM(self)
|
|
|
|
self.activityFSM.request('Idle')
|
|
|
|
return
|
|
|
|
|
|
|
|
def unload(self):
|
|
|
|
DistributedPartyFireworksActivity.notify.debug('unload')
|
|
|
|
taskMgr.remove(self.taskName('delayedStartShow'))
|
|
|
|
if self.rocketParticleSeq:
|
|
|
|
self.rocketParticleSeq.pause()
|
|
|
|
self.rocketParticleSeq = None
|
|
|
|
self.launchPadModel.removeNode()
|
|
|
|
del self.launchPadModel
|
|
|
|
del self.toonPullingLeverInterval
|
|
|
|
self.rocketActor.delete()
|
|
|
|
self.rocketExplosionEffect.destroy()
|
|
|
|
self.activityFSM.request('Disabled')
|
|
|
|
del self.rocketActor
|
|
|
|
del self.launchSound
|
|
|
|
del self.activityFSM
|
|
|
|
del self.eventId
|
|
|
|
del self.showStyle
|
|
|
|
DistributedPartyActivity.unload(self)
|
|
|
|
return
|
|
|
|
|
|
|
|
def _leverPulled(self, collEntry):
|
|
|
|
DistributedPartyFireworksActivity.notify.debug('_leverPulled')
|
|
|
|
hostPulledLever = DistributedPartyActivity._leverPulled(self, collEntry)
|
|
|
|
if self.activityFSM.getCurrentOrNextState() == 'Active':
|
|
|
|
self.showMessage(TTLocalizer.PartyFireworksAlreadyActive)
|
|
|
|
elif self.activityFSM.getCurrentOrNextState() == 'Disabled':
|
|
|
|
self.showMessage(TTLocalizer.PartyFireworksAlreadyDone)
|
|
|
|
elif self.activityFSM.getCurrentOrNextState() == 'Idle':
|
|
|
|
if hostPulledLever:
|
|
|
|
base.cr.playGame.getPlace().fsm.request('activity')
|
|
|
|
self.toonPullingLeverInterval = self.getToonPullingLeverInterval(base.localAvatar)
|
|
|
|
self.toonPullingLeverInterval.append(Func(self.d_toonJoinRequest))
|
|
|
|
self.toonPullingLeverInterval.append(Func(base.cr.playGame.getPlace().fsm.request, 'walk'))
|
|
|
|
self.toonPullingLeverInterval.start()
|
|
|
|
else:
|
|
|
|
self.showMessage(TTLocalizer.PartyOnlyHostLeverPull)
|
|
|
|
|
|
|
|
def setState(self, newState, timestamp):
|
|
|
|
DistributedPartyFireworksActivity.notify.debug('setState( newState=%s, ... )' % newState)
|
|
|
|
DistributedPartyActivity.setState(self, newState, timestamp)
|
|
|
|
if newState == 'Active':
|
|
|
|
self.activityFSM.request(newState, timestamp)
|
|
|
|
else:
|
|
|
|
self.activityFSM.request(newState)
|
|
|
|
|
|
|
|
def startIdle(self):
|
|
|
|
DistributedPartyFireworksActivity.notify.debug('startIdle')
|
|
|
|
|
|
|
|
def finishIdle(self):
|
|
|
|
DistributedPartyFireworksActivity.notify.debug('finishIdle')
|
|
|
|
|
|
|
|
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 finishActive(self):
|
|
|
|
self.rocketParticleSeq = None
|
|
|
|
DistributedPartyFireworksActivity.notify.debug('finishActive')
|
|
|
|
messenger.send(FireworksFinishedEvent)
|
|
|
|
taskMgr.remove(self.taskName('delayedStartShow'))
|
|
|
|
FireworkShowMixin.disable(self)
|
|
|
|
return
|
|
|
|
|
|
|
|
def startDisabled(self):
|
|
|
|
DistributedPartyFireworksActivity.notify.debug('startDisabled')
|
|
|
|
if not self.rocketActor.isEmpty():
|
|
|
|
self.rocketActor.hide()
|
|
|
|
|
|
|
|
def finishDisabled(self):
|
|
|
|
DistributedPartyFireworksActivity.notify.debug('finishDisabled')
|
|
|
|
|
|
|
|
def handleToonDisabled(self, toonId):
|
|
|
|
self.notify.warning('handleToonDisabled no implementation yet')
|