structureControl.py (4451B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\services\structure\structureControl.py 2 import evetypes 3 from caching.memoize import Memoize 4 from carbon.common.lib.const import UE_LOC 5 from carbon.common.script.sys.service import Service 6 from carbonui import uiconst 7 from eve.common.lib.appConst import corpRoleStationManager 8 from eve.common.script.sys.eveCfg import IsControllingStructure 9 from eveexceptions import UserError 10 from inventorycommon.const import groupCapsule 11 from localization import GetByLabel 12 from menucheckers import CelestialChecker, SessionChecker 13 from player_messaging.client.ui_message import prompt_player_fsd_dialog 14 from structures import SETTING_DEFENSE_CAN_CONTROL_STRUCTURE 15 CAPSULE_SHIPID = -1 16 17 class StructureControl(Service): 18 __guid__ = 'svc.structureControl' 19 20 def __init__(self): 21 self.oldShipID = None 22 super(StructureControl, self).__init__() 23 24 def TakeControl(self, structureID): 25 if session.structureid and session.solarsystemid and structureID == session.structureid and not IsControllingStructure(): 26 sm.RemoteSvc('structureControl').TakeControl(session.structureid) 27 self.oldShipID = None 28 29 def BoardStructure(self, structureID): 30 if session.structureid: 31 return 32 if not session.solarsystemid: 33 return 34 self.oldShipID = None 35 structureInfo = sm.GetService('structureDirectory').GetStructureInfo(structureID) 36 if structureInfo.solarSystemID != session.solarsystemid: 37 raise RuntimeError("Structure isn't in this solar system") 38 playerShipTypeID = sm.GetService('invCache').GetInventoryFromId(session.shipid).typeID 39 if evetypes.GetGroupID(playerShipTypeID) != groupCapsule: 40 if prompt_player_fsd_dialog('BoardingFlexStructure', {}, uiconst.YESNO, suppress=uiconst.ID_YES) != uiconst.ID_YES: 41 return 42 self.oldShipID = session.shipid 43 else: 44 self.oldShipID = CAPSULE_SHIPID 45 sm.StartService('sessionMgr').PerformSessionChange('board', sm.RemoteSvc('structureControl').BoardStructure, structureID) 46 47 def ReleaseControl(self): 48 if session.shipid == session.structureid: 49 sm.RemoteSvc('structureControl').ReleaseControl() 50 self.oldShipID = None 51 52 def BoardPreviousShip(self): 53 shipID, isCapsule = self.GetOldShipInfo() 54 if not isCapsule: 55 shipID = self._GetShipIDToBoardFromStructures(shipID) 56 if shipID is None: 57 raise UserError('CustomInfo', {'info': GetByLabel('UI/Inflight/HUDOptions/CantBoardShipFromStructure')}) 58 self.EjectFromStructure(shipID) 59 60 def _GetShipIDToBoardFromStructures(self, oldShipID): 61 bp = sm.GetService('michelle').GetBallpark() 62 if not bp: 63 return 64 slimItem = bp.slimItems.get(oldShipID) 65 if not slimItem: 66 return 67 celestialChecker = CelestialChecker(slimItem, cfg, SessionChecker(session, sm)) 68 if celestialChecker.OfferBoardShip(): 69 return oldShipID 70 if celestialChecker.failure_label: 71 text = GetByLabel(celestialChecker.failure_label) 72 raise UserError('CustomNotify', {'notify': text}) 73 74 def EjectFromStructure(self, shipID = None): 75 if session.shipid == session.structureid: 76 sm.StartService('sessionMgr').PerformSessionChange('board', sm.RemoteSvc('structureControl').EjectFromStructure, shipID) 77 self.oldShipID = None 78 79 @Memoize(0.1) 80 def MayTakeControl(self, structureID): 81 if structureID is None: 82 return False 83 return sm.GetService('structureSettings').CharacterHasSetting(structureID, SETTING_DEFENSE_CAN_CONTROL_STRUCTURE) 84 85 @staticmethod 86 def GetStructurePilot(structureID): 87 if structureID is None: 88 return 89 return sm.RemoteSvc('structureControl').GetStructurePilot(structureID) 90 91 @staticmethod 92 def CheckCanDisableServiceModule(moduleItem): 93 if session.corprole & corpRoleStationManager != corpRoleStationManager or session.corpid != moduleItem.ownerID: 94 raise UserError('CrpAccessDenied', {'reason': (UE_LOC, 'UI/Corporations/AccessRestrictions/InsufficientRoles')}) 95 96 def GetOldShipInfo(self): 97 if self.oldShipID == CAPSULE_SHIPID: 98 return (None, True) 99 return (self.oldShipID, False)