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

environmentSvc.py (11501B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\parklife\environmentSvc.py
      2 from carbon.common.lib import telemetry
      3 from carbon.common.script.sys.service import Service
      4 from eve.client.script.ui.view.viewStateConst import ViewState
      5 from eve.common.script.sys.idCheckers import IsSolarSystem, IsKnownSpaceSystem
      6 from evedungeons.client.environmenttemplates.loader import DungeonEnvironmentTemplateData
      7 from evedungeons.client.environmenttemplates.tracker import DungeonEnvironmentTemplateTracker
      8 from evegraphics.environments.environment import EnvironmentObject
      9 from evegraphics.environments.environmentManager import EnvironmentManager
     10 from evegraphics.settings import UI_ASTEROID_ATMOSPHERICS
     11 from evegraphics.skyBoxEffects.skyBoxEffectManager import SkyBoxEffectManager
     12 from fsdBuiltData.client.environmentTemplates import GetAllSubEnvironmentTypeIDs, HasAssociatedTemplateID, GetTemplateID, EnvironmentTemplates
     13 from tacticalNavigation.ballparkFunctions import GetBallpark
     14 SOLARSYSTEM_VISUALEFFECT_ENVIRONMENT_ID = {'INCURSION': 2,
     15  'SHATTEREDWORMHOLE_OVERLAY': 3,
     16  'THERA': 2519,
     17  'TRIGLAVIAN_HOME': 2570,
     18  'AMARR_HOME': 3475,
     19  'CALDARI_HOME': 3476,
     20  'GALLENTE_HOME': 3477,
     21  'MINMATAR_HOME': 3478,
     22  'CONCORD_HOME': 3479}
     23 
     24 def GetEnvironmentService():
     25     return sm.GetService('environment')
     26 
     27 
     28 class EnvironmentService(Service):
     29     __guid__ = 'svc.environment'
     30     __servicename__ = 'environment'
     31     __displayname__ = 'Environment Service'
     32     __exportedcalls__ = {}
     33     __notifyevents__ = ['OnSessionChanged',
     34      'DoBallsRemove',
     35      'DoBallsAdded',
     36      'OnEnteringDungeonRoom',
     37      'OnExitingDungeon',
     38      'OnGraphicSettingsChanged',
     39      'OnPrimaryViewChanged',
     40      'OnClientEvent_JumpStarted',
     41      'OnClientEvent_JumpExecuted',
     42      'OnComponentRemovedSystemEnvironment',
     43      'OnSessionReset',
     44      'OnLoadScene']
     45     __startupdependencies__ = ['sceneManager']
     46     __dependencies__ = ['incursion']
     47     viewStatesWithoutEnvironments = [ViewState.Hangar]
     48     viewStatesWithEnvironments = [ViewState.Structure, ViewState.Space]
     49 
     50     def __init__(self):
     51         super(EnvironmentService, self).__init__()
     52         self.subEnvironmentTypes = None
     53         self.skyBoxEffectManager = None
     54 
     55     def Run(self, *args):
     56         Service.Run(self, *args)
     57         self.subEnvironmentTypes = GetAllSubEnvironmentTypeIDs()
     58         EnvironmentTemplates.CacheTemplates()
     59         EnvironmentTemplates.ConnectToOnReload(EnvironmentTemplates.CacheTemplates)
     60         EnvironmentManager.GetInstance().SetGetCameraFunction(self.sceneManager.GetActiveCamera)
     61         EnvironmentManager.GetInstance().SetGetRenderJobFunction(self.sceneManager.GetFisRenderJob)
     62         templateData = DungeonEnvironmentTemplateData()
     63         self.dungeonEnvironmentTemplateTracker = DungeonEnvironmentTemplateTracker(templateData)
     64 
     65     def OnSessionReset(self):
     66         self.ClearAllEnvironments()
     67 
     68     def OnSessionChanged(self, isremote, session, change):
     69         if 'locationid' in change:
     70             oldLocation, newLocation = change['locationid']
     71             if IsSolarSystem(newLocation):
     72                 self.ChangeSolarSystem(oldLocation, newLocation)
     73 
     74     def OnLoadScene(self, scene, key):
     75         if self.skyBoxEffectManager is None:
     76             systemPositions = {systemId:system.center for systemId, system in cfg.mapSystemCache.iteritems()}
     77             self.skyBoxEffectManager = SkyBoxEffectManager(systemPositions)
     78         if key != 'default' or not IsKnownSpaceSystem(session.solarsystemid):
     79             return
     80         if session.stationid is not None:
     81             return
     82         self.skyBoxEffectManager.EnterSolarSystem(session.solarsystemid, scene)
     83 
     84     def ChangeSolarSystem(self, oldSolarSystemID, newSolarSystemID):
     85         EnvironmentManager.GetInstance().RemoveEnvironmentForSolarSystem(oldSolarSystemID)
     86         self.RefreshSystemWideEnvironment(newSolarSystemID)
     87 
     88     def RefreshSystemWideEnvironment(self, solarSystemID):
     89         system = cfg.mapSolarSystemContentCache[solarSystemID]
     90         if self.incursion.IsSystemInIncursion(solarSystemID):
     91             self._AddSystemEnvironment('incursion', SOLARSYSTEM_VISUALEFFECT_ENVIRONMENT_ID['INCURSION'])
     92         elif hasattr(system, 'visualEffect'):
     93             templateID = SOLARSYSTEM_VISUALEFFECT_ENVIRONMENT_ID.get(system.visualEffect, None)
     94             if templateID is not None:
     95                 self._AddSystemEnvironment(system.visualEffect, templateID)
     96 
     97     def IsDockedInHangar(self):
     98         return sm.GetService('viewState').GetActiveViewName() in EnvironmentService.viewStatesWithoutEnvironments
     99 
    100     def AddBallEnvironment(self, ball, environmentTemplateID):
    101         if not EnvironmentManager.ENABLED:
    102             return
    103         ballPos = (ball.x, ball.y, ball.z)
    104         environmentName = str(ball.id)
    105         systemId = session.solarsystemid or session.solarsystemid2
    106         EnvironmentManager.GetInstance().AddEnvironment(environmentName, ballPos, environmentTemplateID, systemId)
    107 
    108     def AddSystemEnvironment(self, name, environmentID):
    109         if self.IsDockedInHangar():
    110             return
    111         self._AddSystemEnvironment(name, environmentID)
    112 
    113     def _AddSystemEnvironment(self, name, environmentID):
    114         if not EnvironmentManager.ENABLED:
    115             return
    116         EnvironmentManager.GetInstance().AddEnvironment(name, (0, 0, 0), environmentID, session.solarsystemid2)
    117 
    118     def RemoveEnvironment(self, name):
    119         envManager = EnvironmentManager.GetInstance()
    120         envManager.RemoveEnvironment(name)
    121 
    122     @telemetry.ZONE_METHOD
    123     def DoBallsRemove(self, listOfBalls, isRelease):
    124         manager = EnvironmentManager.GetInstance()
    125         anchors = manager.GetAllAnchorIDs()
    126         ballRemovalList = [ ball.id for ball, slimItem, terminal in listOfBalls if ball.id in anchors and HasAssociatedTemplateID(slimItem.typeID, slimItem.skinMaterialSetID) ]
    127         for ballId in ballRemovalList:
    128             manager.RemoveEnvironmentAnchor(ballId)
    129 
    130     @telemetry.ZONE_METHOD
    131     def DoBallsAdded(self, ballsAndSlimItemsToAdd):
    132         if not EnvironmentManager.ENABLED:
    133             return
    134         applicableTypeIDs = [ (slimItem.typeID, slimItem.skinMaterialSetID, ball) for ball, slimItem in ballsAndSlimItemsToAdd if HasAssociatedTemplateID(slimItem.typeID, slimItem.skinMaterialSetID) or slimItem.typeID in self.subEnvironmentTypes ]
    135         environmentObjects = []
    136         for typeID, materialSetID, ball in applicableTypeIDs:
    137             environmentName = str(ball.id)
    138             systemId = session.solarsystemid or session.solarsystemid2
    139             templateID = GetTemplateID(typeID, materialSetID)
    140             ballPos = (ball.x, ball.y, ball.z)
    141             if EnvironmentManager.GetInstance().IsSubEnvironmentObject(ballPos, typeID):
    142                 environmentObjects.append(EnvironmentObject(typeID, ballPos, ball.radius, ball))
    143             elif templateID is not None:
    144                 self.LogInfo('Adding environment with template %s and typeID %s' % (templateID, typeID))
    145                 newEnvironment = EnvironmentManager.GetInstance().AddEnvironment(environmentName, ballPos, templateID, systemId, ball.radius, ball, ball.id)
    146                 environmentsToRemove = []
    147                 for environment in EnvironmentManager.GetInstance().GetEnvironmentsForPosition(ballPos):
    148                     anchorBalls = [ sm.GetService('michelle').GetBall(anchorID) for anchorID in environment.anchorIDs ]
    149                     anchorBallTypeIDs = [ getattr(anchorBall, 'typeData', {}).get('typeID', None) for anchorBall in anchorBalls ]
    150                     if all([ ballTypeId in newEnvironment.subEnvironmentTypeIDs for ballTypeId in anchorBallTypeIDs ]):
    151                         environmentsToRemove.append(environment)
    152                         for b in anchorBalls:
    153                             environmentObjects.append(EnvironmentObject(b.typeData['typeID'], (b.x, b.y, b.z), b.radius, b))
    154 
    155                 for env in environmentsToRemove:
    156                     EnvironmentManager.GetInstance().RemoveEnvironment(env.name)
    157 
    158         if len(environmentObjects) != 0:
    159             self.LogInfo('Adding sub objects [%s]' % ', '.join([ str(e.typeID) for e in environmentObjects ]))
    160             EnvironmentManager.GetInstance().AddObjectsInEnvironment(environmentObjects)
    161 
    162     def OnGraphicSettingsChanged(self, changes):
    163         thingsChanged = [ c for c, _ in changes ]
    164         if UI_ASTEROID_ATMOSPHERICS not in thingsChanged:
    165             return
    166         EnvironmentManager.GetInstance().RefreshEnvironments()
    167         ballpark = GetBallpark()
    168         if ballpark is None:
    169             return
    170         environmentObjects = []
    171         for ball, slimItem in GetBallpark().GetBallsAndItems():
    172             ballPos = (ball.x, ball.y, ball.z)
    173             if EnvironmentManager.GetInstance().IsSubEnvironmentObject(ballPos, slimItem.typeID):
    174                 environmentObjects.append(EnvironmentObject(slimItem.typeID, ballPos, ball.radius, ball))
    175 
    176         if len(environmentObjects) != 0:
    177             self.LogInfo('OnGraphicSettingsChanged Adding sub objects [%s]' % ', '.join([ str(e.typeID) for e in environmentObjects ]))
    178             EnvironmentManager.GetInstance().AddObjectsInEnvironment(environmentObjects)
    179 
    180     def OnPrimaryViewChanged(self, oldView, newView):
    181         disabledState = EnvironmentService.viewStatesWithoutEnvironments
    182         enabledState = EnvironmentService.viewStatesWithEnvironments
    183         oldState = getattr(oldView, 'name', None)
    184         newState = getattr(newView, 'name', None)
    185         if oldState in enabledState and newState in disabledState:
    186             EnvironmentManager.GetInstance().ClearAllEnvironments()
    187         elif newState in enabledState and oldState in disabledState:
    188             self.RefreshSystemWideEnvironment(session.solarsystemid2)
    189 
    190     def FreezeEnvironments(self, frozen):
    191         EnvironmentManager.GetInstance().frozen = frozen
    192 
    193     def ClearAllEnvironments(self):
    194         EnvironmentManager.GetInstance().ClearAllEnvironments()
    195 
    196     def OnClientEvent_JumpStarted(self, *args):
    197         self.FreezeEnvironments(True)
    198 
    199     def OnClientEvent_JumpExecuted(self, itemID):
    200         self.FreezeEnvironments(False)
    201         self.RefreshSystemWideEnvironment(session.solarsystemid2)
    202 
    203     def OnComponentRemovedSystemEnvironment(self, solarSystemID):
    204         EnvironmentManager.GetInstance().RemoveEnvironmentForSolarSystem(solarSystemID)
    205 
    206     def OnEnteringDungeonRoom(self, dungeonID, roomID, roomPosition, instanceID, dungeonValues):
    207         self._RemoveActiveDungeonEnvironmentTemplate()
    208         self.dungeonEnvironmentTemplateTracker.change_dungeon_room(dungeonID, roomID, roomPosition)
    209         self._AddActiveDungeonEnvironmentTemplate()
    210 
    211     def _AddActiveDungeonEnvironmentTemplate(self):
    212         dungeonEnvironmentTemplates = self.dungeonEnvironmentTemplateTracker.get_active_dungeon_environment_templates()
    213         for template in dungeonEnvironmentTemplates:
    214             EnvironmentManager.GetInstance().AddEnvironment(template.name, template.position, template.template_id, session.solarsystemid2)
    215 
    216     def OnExitingDungeon(self, dungeonID):
    217         self._RemoveActiveDungeonEnvironmentTemplate()
    218         self.dungeonEnvironmentTemplateTracker.change_dungeon_room(None, None, None)
    219 
    220     def _RemoveActiveDungeonEnvironmentTemplate(self):
    221         for template in self.dungeonEnvironmentTemplateTracker.get_active_dungeon_environment_templates():
    222             EnvironmentManager.GetInstance().RemoveEnvironment(template.name)