droneDogmaItem.py (5494B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\dogma\items\droneDogmaItem.py 2 from __future__ import absolute_import 3 import weakref 4 from eveprefs import boot 5 from inventorycommon import const as invconst 6 from .baseDogmaItem import BaseDogmaItem 7 from utillib import KeyVal 8 from eve.common.script.sys.idCheckers import IsSolarSystem 9 from ccpProfile import TimedFunction 10 11 class DroneDogmaItem(BaseDogmaItem): 12 13 def GetShipItem(self): 14 shipID = self.dogmaLocation.shipsByPilotID.get(self.ownerID, None) 15 if not shipID: 16 return 17 else: 18 return self.dogmaLocation.dogmaItems.get(shipID, None) 19 20 def GetCharacterID(self): 21 return self.invItem.ownerID 22 23 def SetLocation(self, locationID, locationDogmaItem, flagID): 24 oldOwnerID, oldLocationID, oldFlagID = self.GetLocationInfo() 25 self.flagID = flagID 26 locationDogmaItem.RegisterDrone(self) 27 self.HandleLocationChange(oldLocationID) 28 29 def UnsetLocation(self, locationDogmaItem): 30 self.flagID = None 31 locationDogmaItem.UnregisterDrone(self.itemID) 32 33 @TimedFunction('DroneDogmaItem::HandleLocationChange') 34 def HandleLocationChange(self, oldLocationID): 35 self.dogmaLocation.LogInfo('Handle location change from %s to %s, flagID is %s' % (oldLocationID, self.locationID, self.flagID)) 36 if oldLocationID == self.locationID and self.flagID != invconst.flagDroneBay: 37 return 38 shipItem = self.GetShipItem() 39 if shipItem: 40 if self.locationID == self.dogmaLocation.locationID: 41 shipItem.subItems.remove(self) 42 elif self.locationID == shipItem.itemID: 43 shipItem.subItems.add(self) 44 self.dogmaLocation.broker.LogInfo('DroneDogmaItem %s handling locationChange from %s to new location %s' % (self.itemID, oldLocationID, self.locationID)) 45 self.__RemoveAndRestoreDroneOwnerModifiers(oldLocationID) 46 47 @TimedFunction('DroneDogmaItem::__RemoveAndRestoreDroneOwnerModifiers') 48 def __RemoveAndRestoreDroneOwnerModifiers(self, oldLocationID): 49 if self.IsOwnerModifiable(oldLocationID) and not self.IsOwnerModifiable(): 50 self.RemoveDroneOwnerModifiers() 51 elif self.IsOwnerModifiable(): 52 self.__AddDroneOwnerModifiers() 53 54 def RemoveDroneOwnerModifiers(self, ownerID = None): 55 if not ownerID: 56 ownerID = self.ownerID 57 owner = self.dogmaLocation.dogmaItems.get(ownerID, None) 58 if not owner: 59 self.dogmaLocation.broker.LogWarn('__RemoveDroneOwnerModifiers::DroneDogmaItem %s could not find its owner?') 60 return 61 for skillID in self.reqSkills: 62 ownerMods = owner.ownerReqSkillMods.get(skillID, {}) 63 self.dogmaLocation.broker.LogInfo('__RemoveDroneOwnerModifiers is removing modifiers %s from DroneDogmaItem %s owned by %s' % (ownerMods, self.itemID, ownerID)) 64 for attribID, modSet in ownerMods.iteritems(): 65 if attribID in self.attributes: 66 toAttrib = self.attributes[attribID] 67 for operation, fromAttrib in modSet: 68 fromAttrib.RemoveOutgoingModifier(operation, toAttrib) 69 toAttrib.RemoveIncomingModifier(operation, fromAttrib) 70 71 def __AddDroneOwnerModifiers(self, ownerID = None): 72 if not ownerID: 73 ownerID = self.ownerID 74 owner = self.dogmaLocation.dogmaItems.get(ownerID, None) 75 if not owner: 76 self.dogmaLocation.broker.LogWarn('__AddDroneOwnerModifiers::DroneDogmaItem %s could not find its owner?') 77 return 78 for skillID in self.reqSkills: 79 ownerMods = owner.ownerReqSkillMods.get(skillID, {}) 80 self.dogmaLocation.broker.LogInfo('__AddDroneOwnerModifiers is adding modifiers %s from DroneDogmaItem %s owned by %s' % (ownerMods, self.itemID, ownerID)) 81 for attribID, modSet in ownerMods.iteritems(): 82 if attribID in self.attributes: 83 toAttrib = self.attributes[attribID] 84 self._ApplyModsToAttrib(modSet, toAttrib, callOnAttributeChanged=True, debugContext='__AddDroneOwnerModifiers') 85 86 def IsOwnerModifiable(self, locationID = None): 87 if not locationID: 88 locationID = self.locationID 89 pilotID = self.ownerID 90 if not pilotID: 91 return False 92 pilotShip = self.GetShipItem() 93 if not pilotShip: 94 return False 95 if not IsSolarSystem(locationID) and not boot.role == 'client': 96 return False 97 if not pilotShip.IsItemIDInDrones(self.itemID): 98 return False 99 return True 100 101 def GetLocation(self): 102 return None 103 104 def ReconnectWithOwner(self, ownerID, shipID): 105 self.RemoveDroneOwnerModifiers(ownerID) 106 self.dogmaLocation.AddDroneToLocation(shipID, self.itemID) 107 self.__AddDroneOwnerModifiers() 108 109 110 class GhostDroneDogmaItem(DroneDogmaItem): 111 FAKE_LOCATION_ID = -1 112 113 def SetLocation(self, locationID, locationDogmaItem, flagID): 114 self.flagID = flagID 115 if flagID == const.flagDroneBay: 116 locationDogmaItem.RegisterDrone(self) 117 self.HandleLocationChange(self.FAKE_LOCATION_ID) 118 119 def IsOwnerModifiable(self, locationID = None): 120 if locationID == self.FAKE_LOCATION_ID: 121 return False 122 return DroneDogmaItem.IsOwnerModifiable(self, locationID)