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]