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