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

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)