planetSvc.py (9266B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\environment\planetSvc.py 2 import blue 3 import gametime 4 import geo2 5 import utillib 6 from carbon.common.script.sys.service import Service 7 from carbon.common.script.sys.serviceConst import SERVICE_RUNNING 8 from eve.client.script.environment.planet import clientPlanet 9 from eve.common.lib import appConst 10 from eve.common.script.net import eveMoniker 11 from eve.common.script.util import planetCommon 12 from eve.common.script.util.planetCommon import NETWORK_UPDATE_DELAY 13 14 class PlanetService(Service): 15 __guid__ = 'svc.planetSvc' 16 __servicename__ = 'planetSvc' 17 __displayName__ = 'Planet Service' 18 __notifyevents__ = ['OnMajorPlanetStateUpdate', 19 'OnPlanetChangesSubmitted', 20 'OnPlanetViewChanged', 21 'OnSessionReset'] 22 23 def __init__(self): 24 super(PlanetService, self).__init__() 25 self.planets = {} 26 self.simPlanets = {} 27 self.colonizationData = None 28 self.state = SERVICE_RUNNING 29 self.foreignColoniesByPlanet = {} 30 self.commandPinsByPlanet = {} 31 self.extractorsByPlanet = {} 32 self._lastSubmitTimestamp = None 33 self._submittingInProgress = set() 34 35 def ReInitialize(self): 36 self.planets = {} 37 self.simPlanets = {} 38 self.colonizationData = None 39 self.state = SERVICE_RUNNING 40 self.foreignColoniesByPlanet = {} 41 self.commandPinsByPlanet = {} 42 self.extractorsByPlanet = {} 43 44 def Run(self, memStream = None): 45 self.LogInfo('Starting planet service') 46 47 def OnSessionReset(self): 48 self.ReInitialize() 49 50 def GetPlanet(self, planetID): 51 if planetID not in self.planets: 52 self.planets[planetID] = self.GetClientPlanet(planetID) 53 ret = self.planets[planetID] 54 return ret 55 56 def GetClientPlanet(self, planetID): 57 return clientPlanet.ClientPlanet(self, planetID) 58 59 def GetMyPlanets(self): 60 if self.colonizationData is None: 61 self.colonizationData = sm.RemoteSvc('planetMgr').GetPlanetsForChar() 62 return self.colonizationData 63 64 def GetMyPlanetsData(self): 65 planets = self.GetMyPlanets() 66 return [ self.GetPlanet(planet.planetID) for planet in planets ] 67 68 @staticmethod 69 def IsSystemWithinScanRange(solarSystemID): 70 remoteSensing = sm.GetService('skills').GetEffectiveLevel(appConst.typeRemoteSensing) 71 if not remoteSensing: 72 return (False, False) 73 currentLocation = cfg.evelocations.Get(session.solarsystemid2) 74 currentPosition = (currentLocation.x, currentLocation.y, currentLocation.z) 75 systemLocation = cfg.evelocations.Get(solarSystemID) 76 systemPosition = (systemLocation.x, systemLocation.y, systemLocation.z) 77 distanceFromSystem = geo2.Vec3Distance(currentPosition, systemPosition) / appConst.LIGHTYEAR 78 maxRanges = appConst.planetResourceScanningRanges[:] 79 maxRanges.reverse() 80 maxScanRange = maxRanges[remoteSensing - 1] 81 return (distanceFromSystem <= maxScanRange, distanceFromSystem > max(maxRanges)) 82 83 def IsPlanetColonizedByMe(self, planetID): 84 planets = self.GetMyPlanets() 85 for planet in planets: 86 if planetID == planet.planetID: 87 return True 88 89 return False 90 91 def GetColonyForCharacter(self, planetID, characterID): 92 if planetID not in self.foreignColoniesByPlanet: 93 self.foreignColoniesByPlanet[planetID] = {} 94 colonyData = self.foreignColoniesByPlanet[planetID].get(characterID, None) 95 if colonyData is None or colonyData.timestamp + planetCommon.PLANET_CACHE_TIMEOUT < blue.os.GetWallclockTime(): 96 self.LogInfo('GetColonyForCharacter :: Fetching fresh data due to lack of colony or expired timestamp for planet', planetID, 'character', characterID) 97 remotePlanet = eveMoniker.GetPlanet(planetID) 98 colonyData = utillib.KeyVal(timestamp=blue.os.GetWallclockTime()) 99 colonyData.data = remotePlanet.GetFullNetworkForOwner(planetID, characterID) 100 self.foreignColoniesByPlanet[planetID][characterID] = colonyData 101 return colonyData.data 102 103 def GetPlanetCommandPins(self, planetID): 104 pinData = self.commandPinsByPlanet.get(planetID, None) 105 if pinData is None or pinData.timestamp + planetCommon.PLANET_CACHE_TIMEOUT < blue.os.GetWallclockTime(): 106 self.LogInfo('GetPlanetCommandPins :: Fetching fresh data due to lack of data or expired timestamp for planet', planetID) 107 remotePlanet = eveMoniker.GetPlanet(planetID) 108 pinData = utillib.KeyVal(timestamp=blue.os.GetWallclockTime()) 109 pinData.data = remotePlanet.GetCommandPinsForPlanet(planetID) 110 self.commandPinsByPlanet[planetID] = pinData 111 return pinData.data 112 113 def GetExtractorsForPlanet(self, planetID): 114 extractorData = self.extractorsByPlanet.get(planetID, None) 115 if extractorData is None or extractorData.timestamp + planetCommon.PLANET_CACHE_TIMEOUT < blue.os.GetWallclockTime(): 116 self.LogInfo('GetPlanetExtractors :: Fetching fresh data due to lack of data or expired timestamp for planet', planetID) 117 remotePlanet = eveMoniker.GetPlanet(planetID) 118 extractorData = utillib.KeyVal(timestamp=blue.os.GetWallclockTime()) 119 extractorData.data = remotePlanet.GetExtractorsForPlanet(planetID) 120 self.extractorsByPlanet[planetID] = extractorData 121 return extractorData.data 122 123 def OnMajorPlanetStateUpdate(self, planetID, numCommandCentersChanged = False): 124 if planetID in self.planets: 125 self.planets[planetID].Init() 126 if planetID in self.simPlanets: 127 self.simPlanets[planetID].Init() 128 if numCommandCentersChanged: 129 self._UpdateColonyPresence(planetID) 130 else: 131 self._UpdateColonyNumberOfPins(planetID) 132 sm.ScatterEvent('OnPlanetPinsChanged', planetID) 133 134 def OnPlanetChangesSubmitted(self, planetID): 135 self._UpdateColonyNumberOfPins(planetID) 136 137 def _UpdateColonyPresence(self, planetID): 138 if planetID not in self.planets: 139 self.colonizationData = [ colony for colony in self.colonizationData if colony.planetID != planetID ] 140 elif self.colonizationData is not None: 141 colony = self.planets[planetID].GetColony(session.charid) 142 if colony is None or colony.colonyData is None or len(colony.colonyData.pins) < 1: 143 self.colonizationData = [ colony for colony in self.colonizationData if colony.planetID != planetID ] 144 else: 145 addColony = True 146 for c in self.colonizationData: 147 if c.planetID == planetID: 148 c.numberOfPins = len(colony.colonyData.pins) 149 addColony = False 150 break 151 152 if addColony: 153 planet = self.GetPlanet(planetID) 154 newEntry = utillib.KeyVal(solarSystemID=self.planets[planetID].solarSystemID, planetID=planetID, typeID=self.planets[planetID].GetPlanetTypeID(), numberOfPins=len(colony.colonyData.pins), celestialIndex=planet.celestialIndex) 155 self.colonizationData.append(newEntry) 156 sm.ScatterEvent('OnColonyPinCountUpdated', planetID) 157 158 def _UpdateColonyNumberOfPins(self, planetID): 159 planet = self.planets.get(planetID, None) 160 if not planet: 161 return 162 data = self.GetMyPlanets() 163 for dataRow in data: 164 if dataRow.planetID == planetID: 165 colony = planet.GetColony(session.charid) 166 if colony is not None and colony.colonyData is not None: 167 if dataRow.numberOfPins != len(colony.colonyData.pins): 168 dataRow.numberOfPins = len(colony.colonyData.pins) 169 sm.ScatterEvent('OnColonyPinCountUpdated', planetID) 170 else: 171 dataRow.numberOfPins = 0 172 sm.ScatterEvent('OnColonyPinCountUpdated', planetID) 173 break 174 175 def OnPlanetViewChanged(self, newPlanetID, oldPlanetID): 176 if oldPlanetID in self.planets: 177 self.planets[oldPlanetID].StopTicking() 178 179 def ScatterOnPlanetCommandCenterDeployedOrRemoved(self, planetID): 180 self._UpdateColonyPresence(planetID) 181 sm.ScatterEvent('OnPlanetCommandCenterDeployedOrRemoved') 182 183 def SetSubmittingInProgressForPlanet(self, planetID): 184 self._submittingInProgress.add(planetID) 185 self._lastSubmitTimestamp = gametime.GetWallclockTime() 186 187 def RemoveSubmittingInProgressForPlanet(self, planetID): 188 self._submittingInProgress.discard(planetID) 189 190 def IsSubmittingInProgressOrThrottled(self): 191 if self._submittingInProgress: 192 return True 193 if self._lastSubmitTimestamp is None: 194 return False 195 timeSinceLastSubmit = gametime.GetWallclockTime() - self._lastSubmitTimestamp 196 if timeSinceLastSubmit < NETWORK_UPDATE_DELAY: 197 return True 198 return False 199 200 def IsSubmittingInProgressForPlanet(self, planetID): 201 return planetID in self._submittingInProgress