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)