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

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)