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

facilitySvc.py (5360B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\industry\facilitySvc.py
      2 import uthread
      3 import telemetry
      4 from carbon.common.script.sys.service import Service
      5 from eve.common.script.util import industryCommon
      6 from caching.memoize import Memoize
      7 from eveexceptions import UserError
      8 from inventorycommon.const import typeOffice
      9 
     10 class FacilityService(Service):
     11     __guid__ = 'svc.facilitySvc'
     12     __servicename__ = 'Facility Service'
     13     __displayname__ = 'Facility Service'
     14     __dependencies__ = ['clientPathfinderService']
     15     __notifyevents__ = ['OnSessionChanged', 'OnSystemActivityUpdated', 'OnFacilitiesUpdated']
     16 
     17     def Run(self, *args, **kwargs):
     18         Service.Run(self, *args, **kwargs)
     19         self.facilities = {}
     20         self.maxActivityModifiers = None
     21         self.loadedRegion = None
     22         self.loading = uthread.Semaphore()
     23         self.facilityManager = sm.RemoteSvc('facilityManager')
     24 
     25     def OnSessionChanged(self, isRemote, session, change):
     26         if 'regionid' in change:
     27             self.Reload()
     28         if 'solarsystemid2' in change or 'stationid' in change:
     29             map(self._UpdateFacilityDistance, self.facilities.itervalues())
     30             sm.ScatterEvent('OnFacilitiesReloaded', None)
     31 
     32     def OnSystemActivityUpdated(self):
     33         self.maxActivityModifiers = None
     34         self.Reload()
     35 
     36     def OnFacilitiesUpdated(self, facilityIDs):
     37         for facilityID in facilityIDs:
     38             self.facilities.pop(facilityID, None)
     39             try:
     40                 self._PrimeFacility(self.facilityManager.GetFacility(facilityID))
     41             except UserError:
     42                 pass
     43 
     44         sm.ScatterEvent('OnFacilitiesReloaded', facilityIDs)
     45 
     46     @telemetry.ZONE_METHOD
     47     def GetFacilities(self, facilityIDs = None):
     48         if facilityIDs is None or self.loadedRegion is None:
     49             self._PrimeFacilities()
     50         if facilityIDs:
     51             fetch = set(facilityIDs) - set(self.facilities.keys())
     52             if fetch:
     53                 for facility in self.facilityManager.GetFacilitiesByID(facilityIDs):
     54                     self._PrimeFacility(facility)
     55 
     56         return [ f for k, f in self.facilities.iteritems() if facilityIDs is None or k in facilityIDs ]
     57 
     58     @telemetry.ZONE_METHOD
     59     def GetFacility(self, facilityID, prime = True):
     60         if facilityID:
     61             if self.loadedRegion is None:
     62                 self._PrimeFacilities()
     63             if prime and facilityID not in self.facilities:
     64                 self._PrimeFacility(self.facilityManager.GetFacility(facilityID))
     65             return self.facilities[facilityID]
     66 
     67     def GetMaxActivityModifier(self, activityID = None):
     68         self.InitMaxActivityModifiers()
     69         if activityID:
     70             return self.maxActivityModifiers.get(activityID, 1.0)
     71         else:
     72             return max(self.maxActivityModifiers.values()) or 1.0
     73 
     74     def InitMaxActivityModifiers(self):
     75         if self.maxActivityModifiers is None:
     76             self.maxActivityModifiers = self.facilityManager.GetMaxActivityModifiers()
     77 
     78     def GetFacilityTaxes(self, facilityID):
     79         return self.facilityManager.GetFacilityTaxes(facilityID, session.corpid)
     80 
     81     def SetFacilityTaxes(self, facilityID, taxRateValues):
     82         self.facilityManager.SetFacilityTaxes(facilityID, session.corpid, taxRateValues)
     83 
     84     def Reload(self, facilityID = None):
     85         if facilityID is None:
     86             self.facilities.clear()
     87             self.loadedRegion = None
     88         else:
     89             self.facilities.pop(facilityID, None)
     90             self._PrimeFacility(self.facilityManager.GetFacility(facilityID))
     91         sm.ScatterEvent('OnFacilitiesReloaded', {facilityID})
     92 
     93     def GetFreshFacility(self, facilityID):
     94         with self.loading:
     95             if facilityID in self.facilities and self.facilities[facilityID].rigModifiers:
     96                 del self.facilities[facilityID]
     97         return self.GetFacility(facilityID)
     98 
     99     @Memoize(1)
    100     def GetFacilityLocations(self, facilityID, ownerID):
    101         if facilityID is None:
    102             return []
    103         locations = self.facilityManager.GetFacilityLocations(facilityID, ownerID)
    104         cfg.evelocations.Prime(set([ location.itemID for location in locations if location.typeID != typeOffice ]))
    105         return locations
    106 
    107     def IsFacility(self, itemID):
    108         self._PrimeFacilities()
    109         if itemID in self.facilities:
    110             return True
    111         return False
    112 
    113     def _PrimeFacilities(self, force = False):
    114         with self.loading:
    115             if not force and self.loadedRegion == session.regionid:
    116                 return
    117             self.facilities.clear()
    118             for data in self.facilityManager.GetFacilities():
    119                 self._PrimeFacility(data)
    120 
    121             cfg.eveowners.Prime(set([ facility.ownerID for facility in self.facilities.itervalues() ]))
    122             cfg.evelocations.Prime(set([ facility.facilityID for facility in self.facilities.itervalues() ]))
    123             self.loadedRegion = session.regionid
    124 
    125     def _PrimeFacility(self, data):
    126         facility = industryCommon.Facility(data)
    127         self.facilities[facility.facilityID] = facility
    128         self._UpdateFacilityDistance(facility)
    129 
    130     def _UpdateFacilityDistance(self, facility):
    131         facility.distance = self.clientPathfinderService.GetJumpCountFromCurrent(facility.solarSystemID)