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

fittingSlotController.py (13638B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\fitting\fittingSlotController.py
      2 import sys
      3 import evetypes
      4 from carbon.client.script.environment.AudioUtil import PlaySound
      5 from menu import MenuLabel
      6 import eve.client.script.ui.shared.fittingScreen.slotControllerGhostFittingExtension as ghostHelpers
      7 from eve.common.script.sys.eveCfg import IsControllingStructure, IsDocked
      8 from inventorycommon.util import IsSubsystemFlagVisible, ShipCanUnfitRigs
      9 import signals
     10 from carbon.common.script.util.logUtil import LogException
     11 from carbonui import const as uiconst
     12 from inventorycommon import const as invConst
     13 from inventoryrestrictions import can_be_unfitted, ItemCannotBeUnfitted
     14 from carbonui.uicore import uicore
     15 import dogma.const as dogmaConst
     16 from player_messaging.client.ui_message import prompt_player_fsd_dialog
     17 
     18 class FittingSlotController(object):
     19 
     20     def __init__(self, flagID, parentController):
     21         self.flagID = flagID
     22         self.moduleItemID = None
     23         self.chargeItemID = None
     24         self.parentController = parentController
     25         self.failedModuleTypeID = None
     26         self.on_online_state_change = signals.Signal(signalName='on_online_state_change')
     27         self.on_item_fitted = signals.Signal(signalName='on_item_fitted')
     28 
     29     @property
     30     def dogmaModuleItem(self):
     31         if self.moduleItemID:
     32             return self.dogmaLocation.SafeGetDogmaItem(self.moduleItemID)
     33         else:
     34             return None
     35 
     36     @dogmaModuleItem.setter
     37     def dogmaModuleItem(self, _value):
     38         LogException('Setting dogmaModuleItem, no one should be doing that!')
     39 
     40     @property
     41     def dogmaChargeItem(self):
     42         if self.chargeItemID:
     43             return self.dogmaLocation.SafeGetDogmaItem(self.chargeItemID)
     44         else:
     45             return None
     46 
     47     @dogmaChargeItem.setter
     48     def dogmaChargeItem(self, _value):
     49         LogException('Setting dogmaChargeItem, no one should be doing that!')
     50 
     51     @property
     52     def dogmaLocation(self):
     53         return self.parentController.GetDogmaLocation()
     54 
     55     @dogmaLocation.setter
     56     def dogmaLocation(self, _value):
     57         LogException('Setting dogmaLocation, no one should be doing that!')
     58 
     59     def SetModuleAndChargeIDs(self, moduleItemID, chargeItemID):
     60         self.moduleItemID = moduleItemID
     61         self.chargeItemID = chargeItemID
     62 
     63     def GetFailedTypeID(self):
     64         return self.failedModuleTypeID
     65 
     66     def SetFailedTypeID(self, typeID):
     67         self.failedModuleTypeID = typeID
     68 
     69     def GetParentID(self):
     70         return self.parentController.GetItemID()
     71 
     72     def CurrentShipIsLoaded(self):
     73         if not self.parentController:
     74             return False
     75         return self.parentController.CurrentShipIsLoaded()
     76 
     77     def GetPowerType(self):
     78         if self.flagID in invConst.loSlotFlags:
     79             return dogmaConst.effectLoPower
     80         if self.flagID in invConst.medSlotFlags:
     81             return dogmaConst.effectMedPower
     82         if self.flagID in invConst.hiSlotFlags:
     83             return dogmaConst.effectHiPower
     84         if IsSubsystemFlagVisible(self.flagID):
     85             return dogmaConst.effectSubSystem
     86         if self.flagID in invConst.rigSlotFlags:
     87             return dogmaConst.effectRigSlot
     88         if self.flagID in invConst.serviceSlotFlags:
     89             return dogmaConst.effectServiceSlot
     90 
     91     def GetFlagID(self):
     92         return self.flagID
     93 
     94     def Close(self):
     95         self.on_online_state_change.clear()
     96         self.on_item_fitted.clear()
     97         self.parentController = None
     98 
     99     def GetModule(self):
    100         return self.dogmaModuleItem
    101 
    102     def GetModuleID(self):
    103         return self.moduleItemID
    104 
    105     def GetModuleTypeID(self):
    106         if self.dogmaModuleItem:
    107             return self.dogmaModuleItem.typeID
    108 
    109     def GetCharge(self):
    110         return self.dogmaChargeItem
    111 
    112     def GetChargeQuantity(self):
    113         if self.moduleItemID:
    114             self.dogmaLocation.GetQuantity(self.moduleItemID)
    115         return 0
    116 
    117     def IsChargeable(self):
    118         return bool(self.dogmaModuleItem and self.dogmaModuleItem.groupID in cfg.__chargecompatiblegroups__)
    119 
    120     def DoesFitAsCharge(self, chargeTypeID):
    121         if not chargeTypeID or not self.GetModule() or evetypes.GetCategoryID(chargeTypeID) != invConst.categoryCharge:
    122             return False
    123         usedWith = sm.GetService('info').GetUsedWithTypeIDs(chargeTypeID)
    124         if usedWith and self.GetModuleTypeID() in usedWith:
    125             return True
    126         return False
    127 
    128     def GetChargeCapacity(self):
    129         return self.dogmaLocation.GetCapacity(self.GetModule().locationID, const.attributeCapacity, self.GetFlagID())
    130 
    131     def FitCharges(self, items):
    132         if self.IsSimulated():
    133             ghostHelpers.FitCharges(self.flagID, items)
    134             self.on_item_fitted()
    135             return
    136         for chargeItem in items:
    137             if isinstance(chargeItem.itemID, tuple):
    138                 itemID = self.dogmaLocation.UnloadAmmoToContainer(session.shipid, chargeItem, (session.shipid, session.charid, const.flagCargo))
    139                 if itemID:
    140                     chargeItem.itemID, chargeItem.locationID, chargeItem.flagID = itemID[0], session.shipid, const.flagCargo
    141 
    142         chargeTypeID = items[0].typeID
    143         self.dogmaLocation.DropLoadChargeToModule(self.GetModuleID(), chargeTypeID, items)
    144 
    145     def IsSimulated(self):
    146         return self.parentController.IsSimulated()
    147 
    148     def RaiseErrorIfCannotUnfit(self):
    149         typeID = self.GetModuleTypeID()
    150         if not can_be_unfitted(typeID):
    151             raise ItemCannotBeUnfitted(type_ids=[typeID])
    152 
    153     def UnfitCharge(self):
    154         self.RaiseErrorIfCannotUnfit()
    155         if self.IsSimulated():
    156             return ghostHelpers.UnfitFromSlot(self.GetCharge(), None)
    157         moduleID = self.GetModuleID()
    158         if moduleID is None:
    159             return
    160         if self.IsInWeaponBank():
    161             moduleID = self.dogmaLocation.GetMasterModuleForFlag(session.shipid, self.GetFlagID())
    162         if IsDocked():
    163             destination = (session.structureid or session.stationid, session.charid, const.flagHangar)
    164         elif IsControllingStructure():
    165             destination = (session.shipid, sm.GetService('structureDirectory').GetStructureInfo(session.shipid).ownerID, const.flagCargo)
    166         else:
    167             destination = (session.shipid, session.charid, const.flagCargo)
    168         self.dogmaLocation.UnloadAmmoFromModules(session.shipid, moduleID, destination)
    169 
    170     def FitModule(self, item):
    171         self.dogmaLocation.TryFit(item, self.flagID)
    172         PlaySound(uiconst.SOUND_ADD_OR_USE)
    173 
    174     def ShouldShowUnfitOption(self):
    175         if not can_be_unfitted(type_id=self.GetModuleTypeID()):
    176             return False
    177         if self.IsSimulated():
    178             return True
    179         if any([session.stationid, session.structureid]):
    180             return True
    181         return False
    182 
    183     def TryGetUnfitOption(self):
    184         if self.ShouldShowUnfitOption():
    185             return self._GetUnfitOption()
    186         return []
    187 
    188     def _GetUnfitOption(self):
    189         m = []
    190         if self.GetCharge():
    191             m += [(MenuLabel('UI/Fitting/RemoveCharge'), self.UnfitCharge)]
    192         m += [(MenuLabel('UI/Fitting/Unfit'),
    193           self.UnfitModule,
    194           (),
    195           None,
    196           None,
    197           'Unfit')]
    198         return m
    199 
    200     def UnfitModule(self, *args):
    201         self.RaiseErrorIfCannotUnfit()
    202         if self.IsSimulated():
    203             return ghostHelpers.UnfitFromSlot(None, self.GetModule())
    204         if self.GetModule() is None:
    205             return
    206         parentID = self.GetParentID()
    207         if parentID is None:
    208             return
    209         masterID = self.IsInWeaponBank()
    210         invCache = sm.GetService('invCache')
    211         if masterID:
    212             ret = prompt_player_fsd_dialog('ClearGroupModule', {}, uiconst.YESNO, suppress=uiconst.ID_YES)
    213             if ret != uiconst.ID_YES:
    214                 return
    215             if self.GetModule():
    216                 self.GetModule().dogmaLocation.UngroupModule(parentID, masterID)
    217         if self.GetCharge() is not None:
    218             self.UnfitCharge()
    219         if session.stationid or session.structureid:
    220             invCache.GetInventory(const.containerHangar).Add(self.GetModuleID(), parentID, flag=const.flagHangar)
    221         else:
    222             shipInv = invCache.GetInventoryFromId(parentID, locationID=session.stationid)
    223             shipInv.Add(self.GetModuleID(), parentID, qty=None, flag=const.flagCargo)
    224         PlaySound(uiconst.SOUND_REMOVE)
    225 
    226     def Unfit(self, *args):
    227         self.RaiseErrorIfCannotUnfit()
    228         if self.IsSimulated():
    229             return ghostHelpers.UnfitFromSlot(self.GetCharge(), self.GetModule())
    230         parentID = self.GetParentID()
    231         if parentID is None:
    232             return
    233         invCache = sm.GetService('invCache')
    234         parentInv = invCache.GetInventoryFromId(parentID, locationID=session.stationid)
    235         if self.GetPowerType() == const.effectRigSlot:
    236             if self.CanUnfitRigsWithoutDestroying():
    237                 self.UnfitModule()
    238             else:
    239                 ret = prompt_player_fsd_dialog('RigUnFittingInfo', {}, uiconst.OKCANCEL)
    240                 if ret != uiconst.ID_OK:
    241                     return
    242                 parentInv.DestroyFitting(self.GetModuleID())
    243         elif self.GetCharge():
    244             self.UnfitCharge()
    245         else:
    246             self.UnfitModule()
    247 
    248     def CanUnfitRigsWithoutDestroying(self):
    249         if self.parentController.ControllerForCategory() == invConst.categoryShip:
    250             if ShipCanUnfitRigs(self.parentController.GetTypeID()):
    251                 return True
    252         return False
    253 
    254     def IsGroupable(self):
    255         return self.GetModule().groupID in const.dgmGroupableGroupIDs
    256 
    257     def GetDragData(self):
    258         l = []
    259         if self.dogmaChargeItem:
    260             l.extend(self.GetChargeDragNodes())
    261         if l:
    262             return l
    263         if self.GetModule() is None:
    264             return l
    265         shift = uicore.uilib.Key(uiconst.VK_SHIFT)
    266         if shift:
    267             if self.IsGroupable():
    268                 sm.ScatterEvent('OnStartSlotLinkingMode', self.GetModule().typeID)
    269             elif not self.IsSimulated():
    270                 return []
    271         return self.GetModuleDragData()
    272 
    273     def GetModuleDragData(self):
    274         return self.dogmaLocation.GetDragData(self.GetModuleID())
    275 
    276     def GetChargeDragNodes(self, *args):
    277         return self.dogmaLocation.GetDragData(self.chargeItemID)
    278 
    279     def SlotExists(self):
    280         if not self.CurrentShipIsLoaded():
    281             return
    282         if self.IsSubsystemSlot():
    283             if self.parentController.HasStance() or not self.parentController.HasSubsystems():
    284                 return False
    285         return self.dogmaLocation.SlotExists(self.GetParentID(), self.flagID)
    286 
    287     def IsSubsystemSlot(self):
    288         return IsSubsystemFlagVisible(self.flagID)
    289 
    290     def IsOnlineable(self):
    291         if not self.GetModule() or not self.SlotExists():
    292             return False
    293         try:
    294             return const.effectOnline in self.dogmaLocation.dogmaStaticMgr.effectsByType[self.GetModuleTypeID()]
    295         except ReferenceError:
    296             pass
    297 
    298     def IsOnline(self):
    299         return self.GetModule().IsOnline()
    300 
    301     def OnlineModule(self):
    302         self.dogmaLocation.OnlineModule(self.GetModuleID())
    303 
    304     def OfflineModule(self):
    305         self.dogmaLocation.OfflineModule(self.GetModuleID())
    306 
    307     def IsInWeaponBank(self, item = None):
    308         if not item:
    309             return self.dogmaLocation.IsInWeaponBank(self.GetModule().locationID, self.GetModuleID())
    310         else:
    311             return self.dogmaLocation.IsInWeaponBank(item.locationID, item.itemID)
    312 
    313     def GetWeaponBankChargeIDs(self):
    314         return self.dogmaLocation.GetSubLocationsInBank(self.GetParentID(), self.GetCharge().itemID)
    315 
    316     def GetWeaponBankCrystalIDs(self):
    317         return self.dogmaLocation.GetCrystalsInBank(self.GetParentID(), self.GetCharge().itemID)
    318 
    319     def LinkWithWeapon(self, item):
    320         self.dogmaLocation.LinkWeapons(self.GetModule().locationID, self.GetModuleID(), item.itemID)
    321 
    322     def DestroyWeaponBank(self):
    323         masterID = self.IsInWeaponBank()
    324         if masterID:
    325             self.dogmaLocation.DestroyWeaponBank(self.GetModule().locationID, masterID)
    326 
    327     def ToggleOnlineModule(self):
    328         if self.IsOnline():
    329             if self.IsInWeaponBank():
    330                 ret = prompt_player_fsd_dialog('QueryGroupOffline', {}, uiconst.YESNO, suppress=uiconst.ID_YES)
    331                 if ret != uiconst.ID_YES:
    332                     return
    333             self.OfflineModule()
    334         else:
    335             self.OnlineModule()
    336 
    337     def IsRigSlot(self):
    338         return self.flagID in invConst.rigSlotFlags
    339 
    340     def OnSlotAttributeChanged(self, parentID, itemID, attributeID, value):
    341         try:
    342             if self.GetModule() is not None and self.GetModuleID() == itemID and attributeID == const.attributeIsOnline:
    343                 self.on_online_state_change()
    344             elif attributeID == const.attributeQuantity:
    345                 if not isinstance(itemID, tuple):
    346                     return
    347                 parentID, flagID, typeID = itemID
    348                 if parentID != self.GetParentID() or flagID != self.GetFlagID():
    349                     return
    350                 if not value:
    351                     self.chargeItemID = None
    352                 self.on_item_fitted()
    353         except ReferenceError:
    354             self.chargeItemID = None
    355             sys.exc_clear()
    356 
    357     def IsModulePreviewModule(self):
    358         return False
    359 
    360     def IsFittableType(self, typeID):
    361         return self.parentController.IsFittableType(typeID)
    362 
    363     def GetMenu(self):
    364         return []