NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

undockingSvc.py (6405B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\dockedUI\undockingSvc.py
      2 import blue
      3 import gametime
      4 import uthread
      5 from carbon.common.script.sys.service import Service
      6 from eve.client.script.ui.shared.dockedUI import ReloadLobbyWnd
      7 from eve.client.script.ui.station.undockQuestions import IsOkToUndock, IsOkToUndockWithMissingCargo, CheckOkToUndockWhileAttackerInFW
      8 from eve.common.lib import appConst as const
      9 from eveexceptions import UserError
     10 from journey.journey_messanger import JourneyMessenger
     11 from player_messaging.client.ui_message import prompt_player_fsd_dialog
     12 UNDOCK_STEPS = 3
     13 UNDOCK_DELAY = 5000
     14 
     15 class UndockingSvc(Service):
     16     __guid__ = 'svc.undocking'
     17     __servicename__ = 'undocking'
     18 
     19     def Run(self, memStream = None):
     20         self.LogInfo('Starting Undocking Service')
     21         self._exitTriggeredTimestamp = None
     22         self._exitingLocation = None
     23         self.pastUndockPointOfNoReturn = False
     24         self.undockCheck = None
     25         self._message_bus = None
     26 
     27     @property
     28     def message_bus(self):
     29         if self._message_bus is None:
     30             self._message_bus = JourneyMessenger(sm.GetService('publicGatewaySvc'))
     31         return self._message_bus
     32 
     33     def ActivateUndockCheck(self, undockCheck):
     34         self.undockCheck = undockCheck
     35 
     36     def DeactivateUndockCheck(self):
     37         self.undockCheck = None
     38 
     39     def CanUndock(self):
     40         if not callable(self.undockCheck):
     41             return True
     42         return self.undockCheck()
     43 
     44     def CheckUndock(self):
     45         CheckOkToUndockWhileAttackerInFW()
     46 
     47     def UndockBtnClicked(self):
     48         if self._exitTriggeredTimestamp:
     49             self.AbortUndock()
     50             return
     51         self.ExitDockableLocation()
     52 
     53     def ExitDockableLocation(self):
     54         if self._exitTriggeredTimestamp:
     55             return
     56         if not self.CanUndock():
     57             self.AbortUndock()
     58             return
     59         try:
     60             self.CheckUndock()
     61         except UserError as e:
     62             self.AbortUndock()
     63             prompt_player_fsd_dialog(e.msg, e.dict)
     64             return
     65 
     66         exitingTime = gametime.GetWallclockTime()
     67         self._exitTriggeredTimestamp = exitingTime
     68         self._exitingLocation = session.stationid or session.structureid
     69         self.PrepareExit()
     70         if not IsOkToUndock():
     71             self.AbortUndock()
     72             return
     73         shipID = session.shipid
     74         if shipID is None:
     75             self._DealWithMissingShip()
     76             self.ResetDockingVariables()
     77             return
     78         if not IsOkToUndockWithMissingCargo():
     79             self.ResetDockingVariables()
     80             return
     81         uthread.new(self.message_bus.linked, 'Undock')
     82         uthread.new(self._Undock_Thread, shipID, exitingTime)
     83 
     84     def PrepareExit(self):
     85         viewSvc = sm.GetService('viewState')
     86         currentView = viewSvc.GetCurrentView()
     87         if currentView.name == 'hangar':
     88             currentView.StartExitAnimation()
     89 
     90     def _Undock_Thread(self, shipID, exitingTime):
     91         if not self._exitTriggeredTimestamp:
     92             sm.ScatterEvent('OnDockingProgressChanged', None)
     93             return
     94         sm.ScatterEvent('OnUndockingStarted', self._exitingLocation)
     95         undockDelay = GetUndockDelay()
     96         sleepingTime = undockDelay / UNDOCK_STEPS
     97         for i in xrange(UNDOCK_STEPS):
     98             progress = float(i) / UNDOCK_STEPS
     99             sm.ScatterEvent('OnDockingProgressChanged', progress)
    100             blue.synchro.SleepSim(sleepingTime)
    101             if self._exitTriggeredTimestamp != exitingTime:
    102                 sm.ScatterEvent('OnDockingProgressChanged', None)
    103                 return
    104 
    105         sm.ScatterEvent('OnDockingProgressChanged', 1)
    106         self.pastUndockPointOfNoReturn = True
    107         self.UndockAttempt(shipID)
    108 
    109     def UndockAttempt(self, shipID):
    110         success = False
    111         try:
    112             if session.stationid:
    113                 success = sm.GetService('station').UndockAttempt(shipID)
    114             elif session.structureid:
    115                 success = sm.GetService('structureDocking').Undock(session.structureid)
    116         except:
    117             self.AbortUndock()
    118             raise
    119 
    120         if success:
    121             locationID = self._exitingLocation
    122             self.ResetDockingVariables()
    123             sm.ScatterEvent('OnUndockingCompleted', locationID)
    124         else:
    125             self.AbortUndock()
    126 
    127     def _DealWithMissingShip(self):
    128         shipID = ShipPicker()
    129         if shipID is not None:
    130             sm.GetService('clientDogmaIM').GetDogmaLocation().MakeShipActive(shipID)
    131         else:
    132             prompt_player_fsd_dialog('NeedShipToUndock')
    133 
    134     def AbortUndock(self):
    135         locationID = self._exitingLocation
    136         self.ResetDockingVariables()
    137         ReloadLobbyWnd()
    138         viewSvc = sm.GetService('viewState')
    139         currentView = viewSvc.GetCurrentView()
    140         if currentView.name == 'hangar':
    141             currentView.StopExitAnimation()
    142         sm.ScatterEvent('OnUndockingAborted', locationID)
    143 
    144     def PastUndockPointOfNoReturn(self):
    145         return self.pastUndockPointOfNoReturn
    146 
    147     def IsExiting(self):
    148         return bool(self._exitTriggeredTimestamp)
    149 
    150     def GetUndockLocation(self):
    151         if not self.IsExiting():
    152             return None
    153         return self._exitingLocation
    154 
    155     def ResetDockingVariables(self):
    156         self._exitTriggeredTimestamp = None
    157         self._exitingLocation = None
    158         self.pastUndockPointOfNoReturn = False
    159 
    160 
    161 def GetUndockDelay():
    162     undockDelay = UNDOCK_DELAY
    163     if session and session.nextSessionChange:
    164         duration = session.nextSessionChange - blue.os.GetSimTime()
    165         if duration > 0:
    166             undockDelay = max(undockDelay, (duration / const.SEC + 1) * 1000)
    167     return undockDelay
    168 
    169 
    170 def ShipPicker():
    171     hangarInv = sm.GetService('invCache').GetInventory(const.containerHangar)
    172     items = hangarInv.List(const.flagHangar)
    173     tmplst = []
    174     for item in items:
    175         if item[const.ixCategoryID] == const.categoryShip and item[const.ixSingleton]:
    176             import evetypes
    177             tmplst.append((evetypes.GetName(item[const.ixTypeID]), item[const.ixItemID], item[const.ixTypeID]))
    178 
    179     import localization
    180     from eve.client.script.ui.util import uix
    181     ret = uix.ListWnd(tmplst, 'item', localization.GetByLabel('UI/Station/SelectShip'), None, 1)
    182     if ret is None:
    183         return
    184     return ret[1]