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 []