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

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