historical/toontown-classic.git/toontown/coghq/CogHQLobby.py

111 lines
4.5 KiB
Python
Raw Normal View History

2024-01-16 11:20:27 -06:00
from direct.directnotify import DirectNotifyGlobal
from direct.fsm import ClassicFSM, State
from direct.fsm import State
from toontown.hood import Place
from toontown.building import Elevator
from toontown.toonbase import ToontownGlobals
from panda3d.core import *
from libotp import *
from otp.distributed.TelemetryLimiter import RotationLimitToH, TLGatherAllAvs
class CogHQLobby(Place.Place):
notify = DirectNotifyGlobal.directNotify.newCategory('CogHQLobby')
def __init__(self, hood, parentFSM, doneEvent):
Place.Place.__init__(self, hood, doneEvent)
self.parentFSM = parentFSM
self.elevatorDoneEvent = 'elevatorDone'
self.fsm = ClassicFSM.ClassicFSM('CogHQLobby', [State.State('start', self.enterStart, self.exitStart, ['walk',
'tunnelIn',
'teleportIn',
'doorIn']),
State.State('walk', self.enterWalk, self.exitWalk, ['elevator',
'DFA',
'doorOut',
'stopped']),
State.State('stopped', self.enterStopped, self.exitStopped, ['walk', 'teleportOut', 'elevator']),
State.State('doorIn', self.enterDoorIn, self.exitDoorIn, ['walk']),
State.State('doorOut', self.enterDoorOut, self.exitDoorOut, ['walk']),
State.State('teleportIn', self.enterTeleportIn, self.exitTeleportIn, ['walk']),
State.State('elevator', self.enterElevator, self.exitElevator, ['walk', 'stopped']),
State.State('DFA', self.enterDFA, self.exitDFA, ['DFAReject']),
State.State('DFAReject', self.enterDFAReject, self.exitDFAReject, ['walk']),
State.State('final', self.enterFinal, self.exitFinal, ['start'])], 'start', 'final')
def load(self):
self.parentFSM.getStateNamed('cogHQLobby').addChild(self.fsm)
Place.Place.load(self)
def unload(self):
self.parentFSM.getStateNamed('cogHQLobby').removeChild(self.fsm)
Place.Place.unload(self)
self.fsm = None
return
def enter(self, requestStatus):
self.zoneId = requestStatus['zoneId']
Place.Place.enter(self)
self.fsm.enterInitialState()
base.playMusic(self.loader.music, looping=1, volume=0.8)
self.loader.geom.reparentTo(render)
self.accept('doorDoneEvent', self.handleDoorDoneEvent)
self.accept('DistributedDoor_doorTrigger', self.handleDoorTrigger)
NametagGlobals.setMasterArrowsOn(1)
how = requestStatus['how']
self.fsm.request(how, [requestStatus])
self._telemLimiter = TLGatherAllAvs('CogHQLobby', RotationLimitToH)
def exit(self):
self._telemLimiter.destroy()
del self._telemLimiter
self.fsm.requestFinalState()
self.ignoreAll()
self.loader.music.stop()
if self.loader.geom != None:
self.loader.geom.reparentTo(hidden)
Place.Place.exit(self)
return
def enterWalk(self, teleportIn = 0):
Place.Place.enterWalk(self, teleportIn)
self.ignore('teleportQuery')
base.localAvatar.setTeleportAvailable(0)
def enterElevator(self, distElevator, skipDFABoard = 0):
self.accept(self.elevatorDoneEvent, self.handleElevatorDone)
self.elevator = Elevator.Elevator(self.fsm.getStateNamed('elevator'), self.elevatorDoneEvent, distElevator)
if skipDFABoard:
self.elevator.skipDFABoard = 1
distElevator.elevatorFSM = self.elevator
self.elevator.load()
self.elevator.enter()
def exitElevator(self):
self.ignore(self.elevatorDoneEvent)
self.elevator.unload()
self.elevator.exit()
del self.elevator
def detectedElevatorCollision(self, distElevator):
self.fsm.request('elevator', [distElevator])
def handleElevatorDone(self, doneStatus):
self.notify.debug('handling elevator done event')
where = doneStatus['where']
if where == 'reject':
if hasattr(base.localAvatar, 'elevatorNotifier') and base.localAvatar.elevatorNotifier.isNotifierOpen():
pass
else:
self.fsm.request('walk')
elif where == 'exit':
self.fsm.request('walk')
elif where == 'cogHQBossBattle':
self.doneStatus = doneStatus
messenger.send(self.doneEvent)
else:
self.notify.error('Unknown mode: ' + where + ' in handleElevatorDone')
def enterTeleportIn(self, requestStatus):
base.localAvatar.setPosHpr(render, 0, 0, 0, 0, 0, 0)
Place.Place.enterTeleportIn(self, requestStatus)