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