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

planetInfoSvc.py (5399B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\parklife\planetInfoSvc.py
      2 from carbon.common.script.sys.service import Service
      3 from carbon.common.script.sys.serviceConst import SERVICE_RUNNING, SERVICE_START_PENDING
      4 from collections import defaultdict
      5 import trinity
      6 import telemetry
      7 from eve.common.script.sys import idCheckers
      8 import inventorycommon.const as invConst
      9 from eve.common.script.sys.idCheckers import IsSkyhook
     10 from spacecomponents.common.helper import IsActiveComponent
     11 
     12 class PlanetInfoSvc(Service):
     13     __guid__ = 'svc.planetInfo'
     14     __notifyevents__ = ['OnSessionChanged',
     15      'DoBallsAdded',
     16      'DoBallRemove',
     17      'OnLocalHackProgressUpdated',
     18      'DoBallsRemove']
     19     __servicename__ = 'PlanetInfo'
     20     __displayname__ = 'Planet Info Caching Service'
     21     __dependencies__ = ['michelle']
     22 
     23     def Run(self, memStream = None):
     24         self.state = SERVICE_START_PENDING
     25         self.LogInfo('PlanetInfo::Starting')
     26         self.Reset()
     27         self.hackProgress = {}
     28         self.state = SERVICE_RUNNING
     29 
     30     def Stop(self, memStream = None):
     31         if not trinity.app:
     32             return
     33         self.LogInfo('PlanetInfo::Stopping')
     34         self.Reset()
     35 
     36     def OnSessionChanged(self, isremote, session, change):
     37         if session.charid is None:
     38             return
     39         if 'solarsystemid' in change:
     40             self.Reset()
     41 
     42     def OnLocalHackProgressUpdated(self, hackedObjectID, hackProgress):
     43         self.hackProgress[hackedObjectID] = hackProgress
     44         bracket = sm.GetService('bracket').GetBracket(hackedObjectID)
     45         if bracket and bracket.sr.orbitalHackLocal is not None:
     46             bracket.UpdateHackProgress(hackProgress)
     47 
     48     def GetMyHackProgress(self, itemID):
     49         return self.hackProgress.get(itemID, None)
     50 
     51     def Reset(self):
     52         self.LogInfo('PlanetInfo::Reset')
     53         self.planets = set()
     54         self.orbitals = set()
     55         self.orbitalsByPlanetID = defaultdict(lambda : defaultdict(set))
     56 
     57     def GetFunctionalCustomOfficeOrbitalsForPlanet(self, planetID):
     58         groupIDs = (invConst.groupPlanetaryCustomsOffices, invConst.groupSkyhook)
     59         orbitals = self._GetOrbitalsForPlanet(planetID, groupIDs)
     60         ballpark = sm.GetService('michelle').GetBallpark()
     61         functionalPocos = set()
     62         for orbitalID in orbitals:
     63             slimItem = ballpark.GetInvItem(orbitalID)
     64             if IsSkyhook(slimItem.typeID) and not IsActiveComponent(ballpark.componentRegistry, slimItem.typeID, slimItem.itemID):
     65                 continue
     66             functionalPocos.add(orbitalID)
     67 
     68         return functionalPocos
     69 
     70     def _GetOrbitalsForPlanet(self, planetID, groupIDs = None):
     71         orbitals = set()
     72         allPlanetOrbitals = self.orbitalsByPlanetID.get(planetID, {})
     73         for groupID, groupOrbitals in allPlanetOrbitals.iteritems():
     74             if groupIDs is None or groupID in groupIDs:
     75                 orbitals.update(allPlanetOrbitals.get(groupID, set()))
     76 
     77         return orbitals
     78 
     79     def GetOrbitalsAtPlanet(self, orbitalID):
     80         for planetID, orbitsByGroupID in self.orbitalsByPlanetID.iteritems():
     81             for groupID, orbits in orbitsByGroupID.iteritems():
     82                 if orbitalID in orbits:
     83                     return self._GetOrbitalsForPlanet(planetID)
     84 
     85         return set()
     86 
     87     def GetPocosForPlanet(self, planetID):
     88         return self._GetOrbitalsForPlanet(planetID, (invConst.groupPlanetaryCustomsOffices,))
     89 
     90     def GetSkyhooksAtPlanet(self, planetID):
     91         return self._GetOrbitalsForPlanet(planetID, (invConst.groupSkyhook,))
     92 
     93     def DoBallsAdded(self, ballItems, *args, **kwargs):
     94         for ball, slimItem in ballItems:
     95             if slimItem.groupID == invConst.groupPlanet:
     96                 self._AddPlanet(ball, slimItem)
     97             elif idCheckers.IsOrbital(slimItem.categoryID):
     98                 self._AddOrbital(ball, slimItem)
     99 
    100     @telemetry.ZONE_METHOD
    101     def DoBallsRemove(self, pythonBalls, isRelease):
    102         for ball, slimItem, terminal in pythonBalls:
    103             self.DoBallRemove(ball, slimItem, terminal)
    104 
    105     def DoBallRemove(self, ball, slimItem, *args, **kwargs):
    106         if slimItem.groupID == invConst.groupPlanet and slimItem.itemID in self.planets:
    107             self._RemovePlanet(ball, slimItem)
    108         elif idCheckers.IsOrbital(slimItem.categoryID) and slimItem.itemID in self.orbitals:
    109             self._RemoveOrbital(ball, slimItem)
    110 
    111     def _AddPlanet(self, ball, slimItem):
    112         self.planets.add(slimItem.itemID)
    113 
    114     def _RemovePlanet(self, ball, slimItem):
    115         self.planets.remove(slimItem.itemID)
    116         if slimItem.itemID in self.orbitalsByPlanetID:
    117             del self.orbitalsByPlanetID[slimItem.itemID]
    118 
    119     def _AddOrbital(self, ball, slimItem):
    120         self.orbitals.add(slimItem.itemID)
    121         self.orbitalsByPlanetID[slimItem.planetID][slimItem.groupID].add(slimItem.itemID)
    122 
    123     def _RemoveOrbital(self, ball, slimItem):
    124         self.orbitals.remove(slimItem.itemID)
    125         if slimItem.planetID in self.orbitalsByPlanetID:
    126             for groupID, groupList in self.orbitalsByPlanetID[slimItem.planetID].iteritems():
    127                 if slimItem.itemID in groupList:
    128                     groupList.remove(slimItem.itemID)
    129                     if len(groupList) == 0:
    130                         del self.orbitalsByPlanetID[slimItem.planetID][groupID]
    131                     break