text: from panda3d.core import *
  from toontown.toonbase.ToonBaseGlobal import *
  from direct.gui.DirectGui import *
  from panda3d.core import *
  from direct.interval.IntervalGlobal import *
  from direct.fsm import ClassicFSM, State
  from direct.fsm import State
  from direct.fsm import StateData
  from toontown.launcher import DownloadForceAcknowledge
  from toontown.toonbase import TTLocalizer
  from otp.otpbase import PythonUtil
  
  class Elevator(StateData.StateData):
  
      def __init__(self, elevatorState, doneEvent, distElevator):
          StateData.StateData.__init__(self, doneEvent)
          self.fsm = ClassicFSM.ClassicFSM('Elevator', [State.State('start', self.enterStart, self.exitStart, ['elevatorDFA']),
           State.State('elevatorDFA', self.enterElevatorDFA, self.exitElevatorDFA, ['requestBoard', 'final']),
           State.State('requestBoard', self.enterRequestBoard, self.exitRequestBoard, ['boarding']),
           State.State('boarding', self.enterBoarding, self.exitBoarding, ['boarded']),
           State.State('boarded', self.enterBoarded, self.exitBoarded, ['requestExit', 'elevatorClosing', 'final']),
           State.State('requestExit', self.enterRequestExit, self.exitRequestExit, ['exiting', 'elevatorClosing']),
           State.State('elevatorClosing', self.enterElevatorClosing, self.exitElevatorClosing, ['final']),
           State.State('exiting', self.enterExiting, self.exitExiting, ['final']),
           State.State('final', self.enterFinal, self.exitFinal, ['start'])], 'start', 'final')
          self.dfaDoneEvent = 'elevatorDfaDoneEvent'
          self.elevatorState = elevatorState
          self.distElevator = distElevator
          distElevator.elevatorFSM = self
          self.reverseBoardingCamera = False
          self.skipDFABoard = 0
  
      def load(self):
          self.elevatorState.addChild(self.fsm)
          self.buttonModels = loader.loadModel('phase_3.5/models/gui/inventory_gui')
          self.upButton = self.buttonModels.find('**//InventoryButtonUp')
          self.downButton = self.buttonModels.find('**/InventoryButtonDown')
          self.rolloverButton = self.buttonModels.find('**/InventoryButtonRollover')
  
      def unload(self):
          self.elevatorState.removeChild(self.fsm)
          self.distElevator.elevatorFSM = None
          del self.distElevator
          del self.fsm
          del self.elevatorState
          self.buttonModels.removeNode()
          del self.buttonModels
          del self.upButton
          del self.downButton
          del self.rolloverButton
          return
  
      def enter(self):
          self.fsm.enterInitialState()
          self.fsm.request('elevatorDFA')
  
      def exit(self):
          self.ignoreAll()
  
      def signalDone(self, doneStatus):
          messenger.send(self.doneEvent, [doneStatus])
  
      def enterStart(self):
          pass
  
      def exitStart(self):
          pass
  
      def enterElevatorDFA(self):
          self.acceptOnce(self.dfaDoneEvent, self.enterDFACallback)
          self.dfa = DownloadForceAcknowledge.DownloadForceAcknowledge(self.dfaDoneEvent)
          self.dfa.enter(7)
  
      def enterDFACallback(self, DFAdoneStatus):
          self.dfa.exit()
          del self.dfa
          if DFAdoneStatus['mode'] == 'complete':
              if self.skipDFABoard:
                  self.skipDFABoard = 0
              else:
                  self.fsm.request('requestBoard')
          else:
              if DFAdoneStatus['mode'] == 'incomplete':
                  elevatorDoneStatus = {}
                  elevatorDoneStatus['where'] = 'reject'
                  messenger.send(self.doneEvent, [elevatorDoneStatus])
              else:
                  self.notify.error('Unrecognized doneStatus: ' + str(DFAdoneStatus))
  
      def exitElevatorDFA(self):
          self.ignore(self.dfaDoneEvent)
  
      def enterRequestBoard(self):
          messenger.send(self.distElevator.uniqueName('enterElevatorOK'))
  
      def exitRequestBoard(self):
          pass
  
      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 exitBoarding(self):
          self.ignore('boardedElevator')
  
      def enterBoarded(self):
          self.enableExitButton()
  
      def exitBoarded(self):
          self.cameraBoardTrack.finish()
          self.disableExitButton()
  
      def enableExitButton(self):
          self.exitButton = DirectButton(relief=None, text=TTLocalizer.ElevatorHopOff, text_fg=(0.9,
                                                                                                0.9,
                                                                                                0.9,
                                                                                                1), text_pos=(0,
                                                                                                              -0.23), text_scale=TTLocalizer.EexitButton, image=(self.upButton, self.downButton, self.rolloverButton), image_color=(0.5,
                                                                                                                                                                                                                                    0.5,
                                                                                                                                                                                                                                    0.5,
                                                                                                                                                                                                                                    1), image_scale=(20,
                                                                                                                                                                                                                                                     1,
                                                                                                                                                                                                                                                     11), pos=(0,
                                                                                                                                                                                                                                                               0,
                                                                                                                                                                                                                                                               0.8), scale=0.15, command=lambda self=self: self.fsm.request('requestExit'))
          if hasattr(localAvatar, 'boardingParty') and localAvatar.boardingParty and localAvatar.boardingParty.getGroupLeader(localAvatar.doId) and localAvatar.boardingParty.getGroupLeader(localAvatar.doId) != localAvatar.doId:
              self.exitButton['command'] = None
              self.exitButton.hide()
          if self.distElevator.antiShuffle:
              self.hopWarning = DirectLabel(parent=self.exitButton, relief=None, pos=Vec3(0, 0, 0.0), text=TTLocalizer.ElevatorStayOff, text_fg=(0.9,
                                                                                                                                                 0.9,
                                                                                                                                                 0.9,
                                                                                                                                                 1), text_pos=(0,
                                                                                                                                                               -1.1), text_scale=0.6)
              self.hopWarning.reparentTo(self.exitButton.stateNodePath[2])
          else:
              self.hopWarning = None
          return
  
      def disableExitButton(self):
          if self.hopWarning:
              self.hopWarning.destroy()
          self.exitButton.destroy()
  
      def enterRequestExit(self):
          messenger.send('elevatorExitButton')
  
      def exitRequestExit(self):
          pass
  
      def enterElevatorClosing(self):
          pass
  
      def exitElevatorClosing(self):
          pass
  
      def enterExiting(self):
          pass
  
      def exitExiting(self):
          pass
  
      def enterFinal(self):
          pass
  
      def exitFinal(self):
          pass
  
      def setReverseBoardingCamera(self, newVal):
          self.reverseBoardingCamera = newVal