incomingDotTracker.py (3319B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\dotWeapons\client\incomingDotTracker.py 2 from collections import defaultdict 3 import signals 4 from carbon.common.script.util.timerstuff import AutoTimer 5 from dotWeapons.client.dotInfoPerTarget import DamageInfoPerTarget 6 from uthread2 import BufferedCall 7 8 class IncomingDotTracker(object): 9 __notifyevents__ = ['OnSessionChanged'] 10 _appliedDmgApp = None 11 _pending = None 12 signalOnDotWeaponUpdate = None 13 14 def __init__(self): 15 self._expireThread = None 16 self._infoByTargetID = defaultdict(DamageInfoPerTarget) 17 self._isAttackBtnVisible = False 18 sm.RegisterNotify(self) 19 self.signalOnDotWeaponUpdate = signals.Signal(signalName='signalOnDotWeaponUpdate') 20 self._ResetState() 21 22 def _ResetState(self): 23 self._infoByTargetID.clear() 24 self.signalOnDotWeaponUpdate() 25 26 def OnSessionChanged(self, isRemote, sess, change): 27 if 'shipid' in change or 'locationid' in change or 'structureid' in change: 28 self._ResetState() 29 30 def OnDotWeaponsUpdated(self, targetID, dmgAppsInfo): 31 self._infoByTargetID[targetID].UpdatedDotWeapons(dmgAppsInfo) 32 if not self._expireThread: 33 self._expireThread = AutoTimer(1000, self.ExpireThread) 34 self.signalOnDotWeaponUpdate() 35 36 def CurrentShipHasIncomingDotApps(self): 37 shipID = session.shipid 38 if shipID in self._infoByTargetID: 39 return self._infoByTargetID[shipID].HasDotApps() 40 return False 41 42 def GetDmgInfoForShipID(self, shipID): 43 if shipID in self._infoByTargetID: 44 return self._infoByTargetID[shipID].GetAllDmgInfo() 45 return set() 46 47 def GetLastExpiryTimestampForCurrentShip(self): 48 shipID = session.shipid 49 if shipID in self._infoByTargetID: 50 return self._infoByTargetID[shipID].GetLastExpiryTimestamp() 51 52 def GetOnGridDamageInfosForAttacker(self, charID, doExpire = True): 53 ret = [] 54 ballpark = sm.GetService('michelle').GetBallpark() 55 for targetID, info in self._infoByTargetID.iteritems(): 56 if not ballpark.GetInvItem(targetID): 57 continue 58 ret += info.GetDamageInfoForAttacker(charID, doExpire) 59 60 return ret 61 62 def HasAttackingDotApps(self, doExpire = True): 63 return bool(self.GetOnGridDamageInfosForAttacker(session.charid, doExpire)) 64 65 def ShouldShowAttackingBtn(self): 66 self._isAttackBtnVisible = self.HasAttackingDotApps() 67 return self._isAttackBtnVisible 68 69 def ExpireThread(self): 70 if not self._infoByTargetID: 71 self._expireThread = None 72 return 73 btnVisibleBefore = self._isAttackBtnVisible 74 toRemove = set() 75 for targetID, info in self._infoByTargetID.iteritems(): 76 if not info.HasDotApps(): 77 toRemove.add(targetID) 78 79 for targetID in toRemove: 80 self._infoByTargetID.pop(targetID, None) 81 82 btnVisibleAfter = self.ShouldShowAttackingBtn() 83 if session.shipid in toRemove: 84 self.TriggerUpdate() 85 elif btnVisibleBefore != btnVisibleAfter: 86 self.TriggerUpdate() 87 88 @BufferedCall(50) 89 def TriggerUpdate(self): 90 self.signalOnDotWeaponUpdate()