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

shipDogmaItem.py (6206B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\dogma\items\shipDogmaItem.py
      2 from __future__ import absolute_import
      3 import weakref
      4 from collections import defaultdict
      5 from itertools import izip
      6 from .locationDogmaItem import LocationDogmaItem
      7 import inventorycommon.const as invconst
      8 from inventorycommon.util import IsShipFittingFlag, IsFighterTubeFlag
      9 import dogma.const as dgmconst
     10 import blue
     11 from dogma.attributes.heatAttribute import CalculateHeat
     12 from ccpProfile import TimedFunction
     13 
     14 class ShipDogmaItem(LocationDogmaItem):
     15 
     16     @TimedFunction('ShipDogmaItem::__init__')
     17     def __init__(self, dogmaLocation, item, eveCfg, clientIDFunc):
     18         LocationDogmaItem.__init__(self, dogmaLocation, item, eveCfg, clientIDFunc)
     19         self.flagID = item.flagID
     20         self.drones = {}
     21         self.overloadedModules = set()
     22         self.damageByLayerByType = defaultdict(lambda : defaultdict(float))
     23 
     24     def AddOverloadedModule(self, module):
     25         self.overloadedModules.add(module)
     26 
     27     def RemoveOverloadedModule(self, module):
     28         self.overloadedModules.remove(module)
     29 
     30     @TimedFunction('ShipDogmaItem::Load')
     31     def Load(self, item, instanceRow):
     32         LocationDogmaItem.Load(self, item, instanceRow)
     33         self.isDirty = True
     34         self.flagID = item.flagID
     35 
     36     def Unload(self):
     37         LocationDogmaItem.Unload(self)
     38         for droneID in self.GetDronesInBay():
     39             self.dogmaLocation.UnloadItem(droneID)
     40 
     41         for droneID, drone in self.GetDronesInSpace().iteritems():
     42             for attrib in drone.attributes.itervalues():
     43                 attrib.RemoveAllModifiers()
     44                 attrib.MarkDirty()
     45 
     46             self.UnregisterDrone(droneID)
     47 
     48         self.drones = {}
     49 
     50     def OnItemLoaded(self):
     51         self.dogmaLocation.FitItemToLocation(self.itemID, self.itemID, self.flagID)
     52         LocationDogmaItem.OnItemLoaded(self)
     53 
     54     def CanFitItem(self, dogmaItem, flagID):
     55         if self.ValidFittingFlag(flagID):
     56             return True
     57         if dogmaItem.itemID == self.itemID:
     58             return True
     59         if flagID == invconst.flagPilot:
     60             return True
     61         return False
     62 
     63     def ValidFittingFlag(self, flagID):
     64         if flagID == invconst.flagDroneBay or IsFighterTubeFlag(flagID):
     65             return True
     66         return IsShipFittingFlag(flagID)
     67 
     68     def SetLocation(self, locationID, locationDogmaItem, flagID):
     69         if locationID != self.itemID:
     70             raise RuntimeError('ShipDogmaItem.SetLocation::locationID is not ship (%s, %s)' % (locationID, self.itemID))
     71         self.fittedItems[locationID] = weakref.proxy(self)
     72         self.flagID = flagID
     73 
     74     def SetDrones(self, drones):
     75         self.drones = drones
     76 
     77     def GetCharacterID(self):
     78         return self.GetPilot()
     79 
     80     def GetPersistables(self):
     81         ret = LocationDogmaItem.GetPersistables(self)
     82         ret.update(self.drones)
     83         return ret
     84 
     85     def RegisterDrone(self, drone):
     86         self.drones[drone.itemID] = drone
     87 
     88     def RegisterPilot(self, pilotDogmaItem):
     89         pilotID = pilotDogmaItem.itemID
     90         self.fittedItems[pilotID] = weakref.proxy(pilotDogmaItem)
     91 
     92     def UnregisterPilot(self, pilotDogmaItem):
     93         try:
     94             del self.fittedItems[pilotDogmaItem.itemID]
     95         except KeyError:
     96             self.dogmaLocation.LogError("ShipDogmaItem::Unregistering a pilot that isn't fitted", pilotDogmaItem.itemID)
     97 
     98     def UnregisterDrone(self, droneID):
     99         if droneID in self.drones:
    100             del self.drones[droneID]
    101 
    102     def _FlushEffects(self):
    103         ownerID = self.ownerID
    104         with self.dogmaLocation.ignoredOwnerEvents.Event(ownerID):
    105             stackTraceCount = LocationDogmaItem._FlushEffects(self)
    106         return stackTraceCount
    107 
    108     def GetPilot(self):
    109         return self.dogmaLocation.pilotsByShipID.get(self.itemID, None)
    110 
    111     def RegisterDamage(self, damageByLayer):
    112         damageAttribs = self.dogmaLocation.dogmaStaticMgr.damageAttributes
    113         for attributeID, damages in damageByLayer:
    114             for damageAttributeID, damage in izip(damageAttribs, damages):
    115                 self.damageByLayerByType[attributeID][damageAttributeID] += damage
    116 
    117     def GetHeatStates(self):
    118         heatStates = {}
    119         for heatID in (dgmconst.attributeHeatHi, dgmconst.attributeHeatMed, dgmconst.attributeHeatLow):
    120             heatStates[heatID] = self.attributes[heatID].GetHeatMessage()
    121 
    122         return heatStates
    123 
    124     def GetHeatValues(self):
    125         heatVals = {}
    126         for heatID, heatState in self.GetHeatStates().iteritems():
    127             currentHeat, maxHeat, incomingHeat, hgm, heatDissipationRate, lastCalc = heatState
    128             if maxHeat == 0 or currentHeat == 0 and incomingHeat == 0:
    129                 heatVals[heatID] = 0.0
    130                 continue
    131             currentTime = blue.os.GetSimTime()
    132             timeDiff = (currentTime - lastCalc) / float(const.dgmTauConstant)
    133             currentHeat = CalculateHeat(currentHeat, timeDiff, incomingHeat, heatDissipationRate, hgm, maxHeat)
    134             heatVals[heatID] = currentHeat / maxHeat
    135 
    136         return heatVals
    137 
    138     def GetDrones(self):
    139         return self.drones.copy()
    140 
    141     def GetDronesInBay(self):
    142         drones = {}
    143         for droneID, drone in self.drones.iteritems():
    144             if drone.locationID == self.itemID:
    145                 drones[droneID] = drone
    146 
    147         return drones
    148 
    149     def GetDronesInSpace(self):
    150         drones = {}
    151         for droneID, drone in self.drones.iteritems():
    152             if drone.locationID == self.locationID:
    153                 drones[droneID] = drone
    154 
    155         return drones
    156 
    157     def IsItemIDInDrones(self, itemID):
    158         return itemID in self.drones
    159 
    160 
    161 FAKE_FLAGID = -1
    162 
    163 class GhostShipDogmaItem(ShipDogmaItem):
    164     __guid__ = 'GhostShipDogmaItem'
    165 
    166     def RegisterFittedItem(self, dogmaItem, flagID):
    167         if flagID in (FAKE_FLAGID, None):
    168             return
    169         ShipDogmaItem.RegisterFittedItem(self, dogmaItem, flagID)
    170 
    171     def UnregisterFittedItem(self, dogmaItem):
    172         if dogmaItem.flagID in (FAKE_FLAGID, None):
    173             return
    174         ShipDogmaItem.UnregisterFittedItem(self, dogmaItem)
    175 
    176     def GetPilot(self):
    177         return session.charid