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

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()