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

baseContentProviderDungeons.py (4459B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\agencyNew\contentProviders\baseContentProviderDungeons.py
      2 from collections import defaultdict
      3 from eve.client.script.ui.shared.agencyNew import agencyConst
      4 from eve.client.script.ui.shared.agencyNew.agencyConst import SECURITY_THRESHOLDS
      5 from eve.client.script.ui.shared.agencyNew.agencyUtil import GetRoundRobinMix
      6 from eve.client.script.ui.shared.agencyNew.contentProviders.baseContentProvider import BaseContentProvider
      7 from eve.common.script.sys.idCheckers import IsKnownSpaceSystem
      8 
      9 class BaseContentProviderDungeons(BaseContentProvider):
     10     __notifyevents__ = BaseContentProvider.__notifyevents__ + ['OnSignalTrackerAnomalyUpdate',
     11      'OnSignalTrackerSignatureUpdate',
     12      'OnSessionChanged',
     13      'OnSystemScanDone']
     14 
     15     def __init__(self):
     16         super(BaseContentProviderDungeons, self).__init__()
     17         self.dungeonInstances = None
     18         sm.RegisterNotify(self)
     19 
     20     def _ConstructContentPieces(self):
     21         self.dungeonInstances = self.GetAllDungeonInstances()
     22         solarSystemIDsByBucket = self.GetSolarSystemIDsByBucket()
     23         contentPieces = []
     24         for solarSystemID in GetRoundRobinMix(solarSystemIDsByBucket, numMax=agencyConst.MAX_CONTENT_PIECES_MAX):
     25             if self.dungeonInstances is None or self.contentPieces is None:
     26                 return
     27             if solarSystemID not in self.dungeonInstances:
     28                 continue
     29             contentPiece = self.ConstructContentPiece(solarSystemID, self.dungeonInstances[solarSystemID])
     30             contentPieces.append(contentPiece)
     31 
     32         contentPieces = sorted(contentPieces, key=self._GetSortKey)
     33         self.ExtendContentPieces(contentPieces)
     34 
     35     def _GetSortKey(self, contentPiece):
     36         return contentPiece.GetJumpsToSelfFromCurrentLocation()
     37 
     38     def ConstructContentPiece(self, solarSystemID, dungeonInstances):
     39         raise NotImplementedError()
     40 
     41     def GetAllDungeonInstances(self):
     42         if not self.dungeonInstances:
     43             self.dungeonInstances = self._GetAllDungeonInstances()
     44         return self.dungeonInstances
     45 
     46     def _GetAllDungeonInstances(self):
     47         raise NotImplementedError
     48 
     49     def InvalidateDungeonInstances(self):
     50         self.dungeonInstances = None
     51 
     52     def CheckCriteria(self, solarSystemID):
     53         return self.CheckSecurityStatusFilterCriteria(solarSystemID) and self.CheckDistanceCriteria(solarSystemID)
     54 
     55     def GetSolarSystemIDsByBucket(self):
     56         buckets = defaultdict(list)
     57         if not IsKnownSpaceSystem(session.solarsystemid2):
     58             solarSystemIDs = (session.solarsystemid2,)
     59         else:
     60             solarSystemIDs = self.dungeonInstances.keys() if self.dungeonInstances else []
     61         for solarSystemID in solarSystemIDs:
     62             if not self.CheckCriteria(solarSystemID):
     63                 continue
     64             bucketKey = self._GetBucketKey(solarSystemID)
     65             buckets[bucketKey].append(solarSystemID)
     66 
     67         bucketKeys = self.GetBucketKeysSorted(buckets)
     68         solarSystemsByBucket = [ iter(sorted(buckets[key], key=self._GetSystemSortKey)) for key in bucketKeys ]
     69         return solarSystemsByBucket
     70 
     71     def _GetBucketKey(self, solarSystemID):
     72         securityStatus = sm.GetService('map').GetSecurityStatus(solarSystemID)
     73         for i, threshold in enumerate(SECURITY_THRESHOLDS):
     74             if securityStatus > threshold:
     75                 return i
     76 
     77         return len(SECURITY_THRESHOLDS)
     78 
     79     def GetBucketKeysSorted(self, buckets):
     80         bucketKeys = sorted(buckets.keys())
     81         for key, solarSystemIDs in buckets.iteritems():
     82             if session.solarsystemid2 in solarSystemIDs:
     83                 bucketKeys.remove(key)
     84                 bucketKeys.insert(0, key)
     85 
     86         return bucketKeys
     87 
     88     def _GetSystemSortKey(self, solarSystemID):
     89         return self.GetNumJumpsToSystem(solarSystemID)
     90 
     91     def OnSignalTrackerAnomalyUpdate(self, *args):
     92         self.InvalidateDungeonInstances()
     93         self.InvalidateContentPieces()
     94 
     95     def OnSignalTrackerSignatureUpdate(self, *args):
     96         self.InvalidateDungeonInstances()
     97         self.InvalidateContentPieces()
     98 
     99     def OnSystemScanDone(self):
    100         self.InvalidateDungeonInstances()
    101         self.InvalidateContentPieces()
    102 
    103     def OnSessionChanged(self, isremote, sess, change):
    104         if 'locationid' in change:
    105             self.InvalidateContentPieces()
    106         self.InvalidateDungeonInstances()