def GetShipsAndGroups(self, filterTextLower, fittings): fittingsByGroupID = defaultdict(list) fittingsByGroupAndRaceIDs = defaultdict(lambda: defaultdict(set)) if not fittings: shipGroups, shipsByGroupID, shipsByGroupAndRaceIDs = self.GetAllShipGroupsAndShipsByGroupID( filterTextLower) else: shipGroups = set() shipsByGroupID = defaultdict(set) shipsByGroupAndRaceIDs = defaultdict(lambda: defaultdict(set)) for fittingID, fitting in fittings.iteritems(): shipTypeID = fitting.shipTypeID if not evetypes.Exists(shipTypeID): log.LogError( 'Ship in stored fittings does not exist, shipID=%s, fittingID=%s' % (shipTypeID, fittingID)) continue groupID = evetypes.GetGroupID(shipTypeID) fittingsByGroupID[groupID].append(fitting) groupName = evetypes.GetGroupName(shipTypeID) shipGroups.add((groupName, groupID)) raceID = evetypes.GetRaceID(shipTypeID) shipsByGroupAndRaceIDs[groupID][raceID].add(shipTypeID) fittingsByGroupAndRaceIDs[groupID][raceID].add(fitting) return (fittingsByGroupID, shipsByGroupID, shipGroups, shipsByGroupAndRaceIDs, fittingsByGroupAndRaceIDs)
def InitializeData(self): for typeID in evetypes.Iterate(): self.typeData[typeID] = (evetypes.GetGroupID(typeID), evetypes.GetCategoryID(typeID), evetypes.GetRaceID(typeID)) self.blueprints = industry.BlueprintStorage()
def __init__(self, typeID, itemID=None, materialSetID=None, scenePath=None): if scenePath is None: raceID = evetypes.GetRaceID(typeID) scenePath = gfxutils.GetPreviewScenePath(raceID) self.typeID = typeID self.itemID = itemID self.materialSetID = materialSetID self.scenePath = scenePath
def UpdateText(self): context = self.previewContainer.context if not hasattr(context, 'typeID'): return groupID = evetypes.GetGroupID(context.typeID) categoryID = evetypes.GetCategoryID(context.typeID) title = evetypes.GetName(context.typeID) if hasattr(context, 'itemID'): bp = sm.GetService('michelle').GetBallpark() if bp: slim = bp.GetInvItem(context.itemID) if slim: title = slim.name self.title.text = title subtitle = '' if categoryID != invconst.categoryApparel: scene = self.previewContainer.sceneContainer.scene model = first_or_default(getattr(scene, 'objects', []), None) if model: radius = round(model.GetBoundingSphereRadius() * 2, 0) if groupID in invconst.turretModuleGroups or groupID in invconst.turretAmmoGroups: subtitle = localization.GetByLabel( 'UI/Preview/ShipSubLabelNoRace', groupName=evetypes.GetGroupName(context.typeID), length=FmtDist(radius)) else: raceID = evetypes.GetRaceID(context.typeID) race = cfg.races.Get( raceID) if raceID in cfg.races else None if race is None: subtitle = localization.GetByLabel( 'UI/Preview/ShipSubLabelNoRace', groupName=evetypes.GetGroupName(context.typeID), length=FmtDist(radius)) else: raceName = localization.GetByMessageID(race.raceNameID) subtitle = localization.GetByLabel( 'UI/Preview/ShipSubLabel', raceName=raceName, groupName=evetypes.GetGroupName(context.typeID), length=FmtDist(radius)) self.subtitle.text = subtitle if categoryID == invconst.categoryApparel: self.descCont.Show() description = evetypes.GetDescription(context.typeID) or '' description = re.sub('<b>|</b>|\\r', '', description) description = re.sub('\\n', '<br>', description) self.desc.text = description
def __init__(self, typeID, subsystems=None, scenePath=None): if not IsModularShip(typeID): raise InvalidPreviewType('%s (%s) is not a tech 3 ship' % (evetypes.GetName(typeID), typeID)) subsystems = subsystems or {} randomSubsystems = sm.GetService('t3ShipSvc').GetRandomSubsystems( typeID) subsystems = { k: subsystems.get(k, v) for k, v in randomSubsystems.iteritems() } if scenePath is None: raceID = evetypes.GetRaceID(typeID) scenePath = gfxutils.GetPreviewScenePath(raceID) self.typeID = typeID self.subsystems = subsystems self.scenePath = scenePath
def GetHangarType(stationTypeID, shipTypeID): if USE_CITADEL_HANGAR or evetypes.GetCategoryID(stationTypeID) == const.categoryStructure: hangarType = CITADEL_NORMAL_HANGAR_SIZE if shipTypeID and ShipNeedsBigHangar(shipTypeID): hangarType = CITADEL_CAPITAL_HANGAR_SIZE else: raceID = evetypes.GetRaceID(stationTypeID) if raceID == const.raceAmarr: hangarType = AMARR_NORMAL_HANGAR_SIZE elif raceID == const.raceCaldari: hangarType = CALDARI_NORMAL_HANGAR_SIZE elif raceID == const.raceGallente: hangarType = GALLENTE_NORMAL_HANGAR_SIZE elif raceID == const.raceMinmatar: hangarType = MINMATAR_NORMAL_HANGAR_SIZE else: hangarType = GALLENTE_NORMAL_HANGAR_SIZE return hangarType
def ApplyWorldspaceCustomization(): if not eve.stationItem or session.worldspaceid != session.stationid2: return stationTypeID = eve.stationItem.stationTypeID stationRace = evetypes.GetRaceID(stationTypeID) if stationRace not in worldspaceCustomizationDefinitions.themeSettings: return if eve.stationItem.ownerID not in worldspaceCustomizationDefinitions.themeSettings[stationRace]: return changes = worldspaceCustomizationDefinitions.themeSettings[stationRace][eve.stationItem.ownerID] UpdateShaderParameters(changes.shaderParameters) if changes.flares: UpdateFlares(*changes.flares) if changes.pointLights: UpdateSpotPointLights(*changes.pointLights) if changes.cylendricalLights: UpdateCylendricalLights(*changes.cylendricalLights) UpdateEnlightenTexture()
def GetImage(self, itemID, size, handler, sprite=None, orderIfMissing=True, callback=None, defaultIcon='res:/UI/Texture/notavailable.dds', isAlliance=False): if uicore.desktop.dpiScaling > 1.0 and not isAlliance: size = size * 2 if not isinstance(itemID, numbers.Integral): return defaultIcon if util.IsDustCharacter(itemID): try: character = cfg.eveowners.Get(itemID) path = const.dustCharacterPortraits[int( character.gender)][evetypes.GetRaceID(character.typeID)] isFresh = True except KeyError: return defaultIcon else: path, isFresh = handler.GetCachedImage(itemID, size) if sprite is not None: sprite.LoadTexture(path or defaultIcon) if not isFresh and orderIfMissing and not handler.MissingFromServer( itemID): if (itemID, size, handler) in self.currentlyFetching: self.currentlyFetching[itemID, size, handler].append([sprite, callback]) else: self.imageServerQueue[itemID, size, handler].append([sprite, callback]) if len( self.imageServerQueue ) > self.fetchingFromImageServer and self.fetchingFromImageServer < MAX_PORTRAIT_THREADS: self.fetchingFromImageServer += 1 uthread.pool('photo::FetchRemoteImages', self.__FetchFromImageServer) elif handler.MissingFromServer(itemID) and path is None: return defaultIcon if isFresh: return path
def GetWorldSpaceTypeIDFromWorldSpaceID(self, worldSpaceID): if util.IsStation(worldSpaceID): stationRace = evetypes.GetRaceID(eve.stationItem.stationTypeID) configVals = sm.GetService('machoNet').GetGlobalConfig() if stationRace == const.raceCaldari: if configVals.get('CaldariCQEnabled', '1') == '1': return const.typeCaldariCaptainsQuarters else: if stationRace == const.raceMinmatar: return const.typeMinmatarCaptainsQuarters if stationRace == const.raceAmarr: if configVals.get('AmarrCQEnabled', '1') == '1': return const.typeAmarrCaptainsQuarters elif stationRace == const.raceGallente: if configVals.get('GallenteCQEnabled', '1') == '1': return const.typeGallenteCaptainsQuarters elif stationRace == const.raceJove: if configVals.get('GallenteCQEnabled', '1') == '1': return const.typeGallenteCaptainsQuarters return const.typeMinmatarCaptainsQuarters return sm.RemoteSvc('worldSpaceServer').GetWorldSpaceTypeIDFromWorldSpaceID(worldSpaceID)
def GetShipExposureTemplateData(self): if not eve.stationItem: return racialShips = { const.raceAmarr: [2006, 20183, 24696, 24692, 597, 1944, 624], const.raceCaldari: [621, 20185, 24698, 640, 602, 648, 623], const.raceGallente: [627, 20187, 24700, 641, 593, 650, 626], const.raceMinmatar: [629, 20189, 24702, 644, 587, 653, 622] } oreShipsList = [17478, 17476, 2998] racialIntroVideos = { const.raceAmarr: 'res:/video/cq/LOGO_AMARR.webm', const.raceCaldari: 'res:/video/cq/LOGO_CALDARI.webm', const.raceGallente: 'res:/video/cq/LOGO_GALLENTE.webm', const.raceMinmatar: 'res:/video/cq/LOGO_MINMATAR.webm' } data = util.KeyVal() if random.random() <= 0.3: data.introVideoPath = 'res:/video/cq/LOGO_ORE.webm' data.shipTypeID = random.choice(oreShipsList) else: stationRace = evetypes.GetRaceID(eve.stationItem.stationTypeID) if stationRace not in racialShips: stationRace = const.raceGallente data.introVideoPath = racialIntroVideos[stationRace] data.shipTypeID = random.choice(racialShips[stationRace]) data.shipName = evetypes.GetName(data.shipTypeID) data.shipGroupName = evetypes.GetGroupName(data.shipTypeID) data.buttonText = localization.GetByLabel( 'UI/Station/Holoscreen/Common/AvailableOnMarketNow') data.mainText = '<fontsize=30>' + localization.GetByLabel( 'UI/Station/Holoscreen/Ship/ShipDetailsTitle') data.mainText += '\n<fontsize=25>' + evetypes.GetDescription( data.shipTypeID) data.clickFunc = sm.GetService('marketutils').ShowMarketDetails data.clickArgs = (data.shipTypeID, None) data.clickFuncLabel = localization.GetByLabel( 'UI/Station/Holoscreen/Ship/OpenMarketForShip', ship=data.shipTypeID) return data
def StartTransition(self, fromView, toView): viewstate.Transition.StartTransition(self, fromView, toView) viewState = sm.GetService('viewState') self.fadeLayer = uiprimitives.Container(name='transition_overlay', parent=viewState.overlayLayerParent, pickState=uiconst.TR2_SPS_OFF, bgColor=util.Color.BLACK, opacity=0.0) height = uicore.desktop.height width = uicore.desktop.width self.loadingText = uicontrols.Label(parent=self.fadeLayer, text=localization.GetByLabel('UI/Worldspaces/Common/Loading'), fontsize=50, align=uiconst.CENTER, top=100, color=util.Color.WHITE, glowFactor=1.0, glowColor=(1.0, 1.0, 1.0, 0.1), uppercase=uiconst.WINHEADERUPPERCASE) stationRace = evetypes.GetRaceID(eve.stationItem.stationTypeID) backgroundToUse = self.racialLoadingBackgrounds[stationRace] uiprimitives.Sprite(name='aura', parent=self.fadeLayer, texturePath=backgroundToUse, align=uiconst.CENTER, width=width, height=height) if fromView is not None: if getattr(fromView, 'cachedPlayerPos', None) is not None and getattr(fromView, 'cachedPlayerRot', None) is not None: toView.cachedPlayerPos = fromView.cachedPlayerPos toView.cachedPlayerRot = fromView.cachedPlayerRot if getattr(fromView, 'cachedCameraYaw', None) is not None and getattr(fromView, 'cachedCameraPitch', None) is not None and getattr(fromView, 'cachedCameraZoom', None) is not None: toView.cachedCameraYaw = fromView.cachedCameraYaw toView.cachedCameraPitch = fromView.cachedCameraPitch toView.cachedCameraZoom = fromView.cachedCameraZoom uicore.animations.FadeIn(self.fadeLayer, duration=self.fadeInTimeMS / 1000.0, sleep=True) lobby = GetLobbyClass().GetIfOpen() if lobby is not None and not lobby.destroyed: lobby.LockUndockButton()
def GetAllShipGroupsAndShipsByGroupID(self, filterTextLower): shipGroups = set() shipsByGroupID = defaultdict(set) shipsByGroupAndRaceIDs = defaultdict(lambda: defaultdict(set)) grouplist = sm.GetService('marketutils').GetMarketGroups()[ const.marketCategoryShips] shipTypesIDsFromMarket = { i for i in itertools.chain.from_iterable( [x.types for x in grouplist]) } for shipTypeID in shipTypesIDsFromMarket: shipName = evetypes.GetName(shipTypeID) if filterTextLower and shipName.lower().find(filterTextLower) < 0: continue groupID = evetypes.GetGroupID(shipTypeID) groupName = evetypes.GetGroupName(shipTypeID) shipGroups.add((groupName, groupID)) shipsByGroupID[groupID].add(shipTypeID) raceID = evetypes.GetRaceID(shipTypeID) shipsByGroupAndRaceIDs[groupID][raceID].add(shipTypeID) return (shipGroups, shipsByGroupID, shipsByGroupAndRaceIDs)
def GetPictureFileName(typeID, graphicID, size): shaderModel = trinity.GetShaderModel() name = '%s_%s_%s_%s_%s.dds' % (shaderModel, graphicID or 0, evetypes.GetIconID(typeID) or 0, evetypes.GetRaceID(typeID) or 0, size) return name
def LoadHangarBackground(self): stationRace = evetypes.GetRaceID(eve.stationItem.stationTypeID) stationGraphicsID = hangarUtil.racialHangarScenes[8] if stationRace in hangarUtil.racialHangarScenes: stationGraphicsID = hangarUtil.racialHangarScenes[stationRace] scenePath = GetGraphicFile(stationGraphicsID) if stationRace == const.raceAmarr: shipPositionData = ReadYamlFile( 'res:/dx9/scene/hangar/shipPlacementAmarr.yaml') positioning = ReadYamlFile( 'res:/dx9/scene/hangar/amarrbalconyplacement.yaml') self.sceneTranslation = positioning['position'] self.sceneRotation = geo2.QuaternionRotationSetYawPitchRoll( positioning['orientation'], 0.0, 0.0) elif stationRace == const.raceCaldari: shipPositionData = ReadYamlFile( 'res:/dx9/scene/hangar/shipPlacementCaldari.yaml') positioning = ReadYamlFile( 'res:/dx9/scene/hangar/caldaribalconyplacement.yaml') self.sceneTranslation = positioning['position'] self.sceneRotation = geo2.QuaternionRotationSetYawPitchRoll( positioning['orientation'], 0.0, 0.0) elif stationRace == const.raceGallente: shipPositionData = ReadYamlFile( 'res:/dx9/scene/hangar/shipPlacementGallente.yaml') positioning = ReadYamlFile( 'res:/dx9/scene/hangar/gallentebalconyplacement.yaml') self.sceneTranslation = positioning['position'] self.sceneRotation = geo2.QuaternionRotationSetYawPitchRoll( positioning['orientation'], 0.0, 0.0) elif stationRace == const.raceMinmatar: shipPositionData = ReadYamlFile( 'res:/dx9/scene/hangar/shipPlacementMinmatar.yaml') positioning = ReadYamlFile( 'res:/dx9/scene/hangar/minmatarbalconyplacement.yaml') self.sceneTranslation = positioning['position'] self.sceneRotation = geo2.QuaternionRotationSetYawPitchRoll( positioning['orientation'], 0.0, 0.0) else: shipPositionData = ReadYamlFile( 'res:/dx9/scene/hangar/shipPlacementGallente.yaml') positioning = ReadYamlFile( 'res:/dx9/scene/hangar/gallentebalconyplacement.yaml') self.sceneTranslation = positioning['position'] self.sceneRotation = geo2.QuaternionRotationSetYawPitchRoll( positioning['orientation'], 0.0, 0.0) self.hangarScene = blue.resMan.LoadObject(scenePath) hangarMeshes = self.hangarScene.Find('trinity.EveStation2') for hangarMesh in hangarMeshes: if hangarMesh.planeSets is not None: hangarMesh.planeSets.removeAt(-1) self.hangarTraffic.SetupScene(self.hangarScene) self.hangarTraffic.RemoveAudio(self.hangarScene) self.sceneManager.SetupIncarnaBackground(self.hangarScene, self.sceneTranslation, self.sceneRotation) self.shipPositionMinDistance = shipPositionData['minDistance'] self.shipPositionMaxDistance = shipPositionData['maxDistance'] self.shipPositionMaxSize = shipPositionData['shipMaxSize'] self.shipPositionMinSize = shipPositionData['shipMinSize'] self.shipPositionTargetHeightMin = shipPositionData[ 'shipTargetHeightMin'] self.shipPositionTargetHeightMax = shipPositionData[ 'shipTargetHeightMax'] self.shipPositionCurveRoot = shipPositionData['curveRoot'] self.shipPositionRotation = shipPositionData['rotation'] if self.hangarScene is not None: stationModel = self.hangarScene.objects[0] stationModel.enableShadow = False
def LoadHangarBackground(self): stationRace = evetypes.GetRaceID(eve.stationItem.stationTypeID) if stationRace == const.raceAmarr: scenePath = 'res:/dx9/model/hangar/amarr/ah1/ah1_fis.red' shipPositionData = ReadYamlFile( 'res:/dx9/scene/hangar/shipPlacementAmarr.yaml') positioning = ReadYamlFile( 'res:/dx9/scene/hangar/amarrbalconyplacement.yaml') self.sceneTranslation = positioning['position'] self.sceneRotation = geo2.QuaternionRotationSetYawPitchRoll( positioning['orientation'], 0.0, 0.0) elif stationRace == const.raceCaldari: scenePath = 'res:/dx9/model/hangar/caldari/ch1/ch1_fis.red' shipPositionData = ReadYamlFile( 'res:/dx9/scene/hangar/shipPlacementCaldari.yaml') positioning = ReadYamlFile( 'res:/dx9/scene/hangar/caldaribalconyplacement.yaml') self.sceneTranslation = positioning['position'] self.sceneRotation = geo2.QuaternionRotationSetYawPitchRoll( positioning['orientation'], 0.0, 0.0) elif stationRace == const.raceGallente: scenePath = 'res:/dx9/model/hangar/gallente/gh1/gh1_fis.red' shipPositionData = ReadYamlFile( 'res:/dx9/scene/hangar/shipPlacementGallente.yaml') positioning = ReadYamlFile( 'res:/dx9/scene/hangar/gallentebalconyplacement.yaml') self.sceneTranslation = positioning['position'] self.sceneRotation = geo2.QuaternionRotationSetYawPitchRoll( positioning['orientation'], 0.0, 0.0) elif stationRace == const.raceMinmatar: scenePath = 'res:/dx9/model/hangar/minmatar/mh1/mh1_fis.red' shipPositionData = ReadYamlFile( 'res:/dx9/scene/hangar/shipPlacementMinmatar.yaml') positioning = ReadYamlFile( 'res:/dx9/scene/hangar/minmatarbalconyplacement.yaml') self.sceneTranslation = positioning['position'] self.sceneRotation = geo2.QuaternionRotationSetYawPitchRoll( positioning['orientation'], 0.0, 0.0) else: scenePath = 'res:/dx9/model/hangar/gallente/gh1/gh1_fis.red' shipPositionData = ReadYamlFile( 'res:/dx9/scene/hangar/shipPlacementGallente.yaml') positioning = ReadYamlFile( 'res:/dx9/scene/hangar/gallentebalconyplacement.yaml') self.sceneTranslation = positioning['position'] self.sceneRotation = geo2.QuaternionRotationSetYawPitchRoll( positioning['orientation'], 0.0, 0.0) self.hangarScene = blue.resMan.LoadObject(scenePath) self.sceneManager.SetupIncarnaBackground(self.hangarScene, self.sceneTranslation, self.sceneRotation) self.shipPositionMinDistance = shipPositionData['minDistance'] self.shipPositionMaxDistance = shipPositionData['maxDistance'] self.shipPositionMaxSize = shipPositionData['shipMaxSize'] self.shipPositionMinSize = shipPositionData['shipMinSize'] self.shipPositionTargetHeightMin = shipPositionData[ 'shipTargetHeightMin'] self.shipPositionTargetHeightMax = shipPositionData[ 'shipTargetHeightMax'] self.shipPositionCurveRoot = shipPositionData['curveRoot'] self.shipPositionRotation = shipPositionData['rotation'] if self.hangarScene is not None: stationModel = self.hangarScene.objects[0] stationModel.enableShadow = False
def GetRacialEpicArcTemplateData(self): epicArcList = self.holoscreenMgr.GetRuntimeCache().epicArcAgents if not epicArcList: return if not eve.stationItem: return epicArcData = random.choice(epicArcList) data = util.KeyVal() data.charID = epicArcData.agentID data.headingText = '' solarSystemID = sm.GetService('agents').GetSolarSystemOfAgent( epicArcData.agentID) regionID = sm.GetService('map').GetRegionForSolarSystem(solarSystemID) securityLevel = sm.GetService('map').GetSecurityStatus(solarSystemID) data.mainText = '<fontsize=30><color=WHITE>' + localization.GetByLabel( 'UI/Station/Holoscreen/RacialEpicArc/AgentAdvert', system=solarSystemID, region=regionID, securityLevel=securityLevel) epicArcDict = { 48: (const.factionAmarrEmpire, localization.GetByLabel( 'UI/Station/Holoscreen/RacialEpicArc/AmarrNews')), 52: (const.factionGallenteFederation, localization.GetByLabel( 'UI/Station/Holoscreen/RacialEpicArc/GallenteNews')), 40: (const.factionCaldariState, localization.GetByLabel( 'UI/Station/Holoscreen/RacialEpicArc/CaldariNews')), 29: (const.factionSistersOfEVE, localization.GetByLabel( 'UI/Station/Holoscreen/RacialEpicArc/SistersNews')), 53: (const.factionMinmatarRepublic, localization.GetByLabel( 'UI/Station/Holoscreen/RacialEpicArc/MinmatarNews')), 56: (const.factionAngelCartel, localization.GetByLabel( 'UI/Station/Holoscreen/RacialEpicArc/AngelsNews')), 55: (const.factionGuristasPirates, localization.GetByLabel( 'UI/Station/Holoscreen/RacialEpicArc/GuristasNews')) } if epicArcData.epicArcID not in epicArcDict: return data.factionID, data.bottomText = epicArcDict.get( epicArcData.epicArcID, '') data.factionNameText = cfg.eveowners.Get(data.factionID).ownerName data.introVideoPath = { const.factionAmarrEmpire: 'res:/video/cq/LOGO_AMARR.webm', const.factionCaldariState: 'res:/video/cq/LOGO_CALDARI.webm', const.factionGallenteFederation: 'res:/video/cq/LOGO_GALLENTE.webm', const.factionMinmatarRepublic: 'res:/video/cq/LOGO_MINMATAR.webm', const.factionAngelCartel: 'res:/video/cq/LOGO_ANGELCARTEL.webm', const.factionGuristasPirates: 'res:/video/cq/LOGO_GURISTAS.webm', const.factionSistersOfEVE: 'res:/video/cq/LOGO_SISTERSOFEVE.webm' }.get(data.factionID, None) videoDict = { const.factionAmarrEmpire: 'res:/video/cq/CQ_TEMPLATE_EPICARC_AMARR.webm', const.factionCaldariState: 'res:/video/cq/CQ_TEMPLATE_EPICARC_CALDARI.webm', const.factionGallenteFederation: 'res:/video/cq/CQ_TEMPLATE_EPICARC_GALLENTE.webm', const.factionMinmatarRepublic: 'res:/video/cq/CQ_TEMPLATE_EPICARC_MINMATAR.webm', const.factionAngelCartel: 'res:/video/cq/CQ_TEMPLATE_EPICARC_MINMATAR.webm', const.factionGuristasPirates: 'res:/video/cq/CQ_TEMPLATE_EPICARC_CALDARI.webm' } factionKey = data.factionID if factionKey not in videoDict: factionKey = { const.raceAmarr: const.factionAmarrEmpire, const.raceCaldari: const.factionCaldariState, const.raceGallente: const.factionGallenteFederation, const.raceMinmatar: const.factionMinmatarRepublic }.get(evetypes.GetRaceID(eve.stationItem.stationTypeID), const.factionGallenteFederation) data.videoPath = videoDict.get( factionKey, 'res:/video/cq/CQ_TEMPLATE_EPICARC_GALLENTE.webm') data.clickFunc = sm.GetService('agents').InteractWith data.clickArgs = (data.charID, ) data.clickFuncLabel = localization.GetByLabel( 'UI/Station/Holoscreen/RacialEpicArc/StartAgentConversation') return data