ccSvc.py (8906B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\services\ccSvc.py 2 from datetime import datetime 3 import launchdarkly 4 import localization 5 import logging 6 import paperdoll 7 import uthread 8 from caching import Memoize 9 from carbon.common.script.sys.service import Service 10 from carbon.common.script.sys.serviceConst import ROLE_QA 11 from carbon.common.script.util.commonutils import StripTags 12 from carbonui import uiconst 13 from characterdata.schools import get_school 14 from eve.client.script.ui.login.intromovie.introcontroller import IntroController 15 from eve.common.script.sys.dbrow import LookupConstValue 16 from inventorycommon.const import categoryApparel, containerHangar, flagHangar, flagWardrobe 17 from loginCharacterselection.charselData import CharacterSelectionData 18 import pytelemetry as telemetry 19 log = logging.getLogger(__name__) 20 21 class CCSvc(Service): 22 __update_on_reload__ = 1 23 __guid__ = 'svc.cc' 24 __dependencies__ = ['invCache'] 25 26 def Run(self, *args, **kwargs): 27 super(CCSvc, self).Run(*args, **kwargs) 28 LookupConstValue('', '') 29 self.chars = None 30 self.characterSelectionData = None 31 self.charCreationInfo = None 32 self.bloodlineDataByRaceID, self.bloodlineDataByID = (None, None) 33 self.dollState = None 34 self.availableTypeIDs = None 35 self.introController = IntroController() 36 37 def GetCharacterSelectionData(self, force = 0): 38 if self.characterSelectionData is None or force: 39 self.characterSelectionData = CharacterSelectionData(sm.RemoteSvc('charUnboundMgr'), cfg, localization, StripTags) 40 self.PrimeCharacterDetails(self.characterSelectionData.GetChars()) 41 return self.characterSelectionData 42 43 def GetMyAgeInDays(self): 44 if not session.charid: 45 log.exception('Character not selected yet, cannot calculate age') 46 return 0 47 characterCreationDate = self._GetCharacterCreationDate() 48 delta = datetime.now() - characterCreationDate 49 return delta.days 50 51 @Memoize 52 def _GetCharacterCreationDate(self): 53 return sm.RemoteSvc('charMgr').GetCharacterCreationDate() 54 55 def on_character_log_off(self): 56 self.ClearCharacterSelectionData() 57 58 def ClearCharacterSelectionData(self): 59 self.characterSelectionData = None 60 self._GetCharacterCreationDate.clear_memoized() 61 62 def PrimeCharacterDetails(self, characterDetails): 63 primeOwners = set() 64 primeLocations = set() 65 primeTickers = set() 66 for character in characterDetails: 67 primeOwners.add(character.characterID) 68 primeOwners.add(character.corporationID) 69 if character.allianceID: 70 primeOwners.add(character.allianceID) 71 if character.stationID is not None: 72 primeLocations.add(character.stationID) 73 primeTickers.add(character.corporationID) 74 75 cfg.eveowners.Prime(primeOwners) 76 cfg.corptickernames.Prime(primeTickers) 77 if len(primeLocations): 78 cfg.evelocations.Prime(primeLocations) 79 80 def GetCharactersToSelect(self, force = 0): 81 return self.GetCharacterSelectionData(force).GetChars() 82 83 def GoBack(self, *args): 84 sm.GetService('viewState').ActivateView('charsel') 85 86 def CreateCharacterWithDoll(self, charactername, bloodlineID, genderID, ancestryID, charInfo, portraitInfo, schoolID, raceID, *args): 87 qa_starter_system_id = None 88 if session.role & ROLE_QA: 89 qa_starter_system_id = self._QAPickStarterSystem() 90 self.LogInfo('charInfo:', charInfo) 91 charID = sm.RemoteSvc('charUnboundMgr').CreateCharacterWithDoll(charactername, raceID, bloodlineID, genderID, ancestryID, charInfo, portraitInfo, schoolID, None, qa_starter_system_id) 92 self.ClearCharacterSelectionData() 93 return charID 94 95 def _QAPickStarterSystem(self): 96 system_ids = sorted(sm.RemoteSvc('charUnboundMgr').GetQAStarterSystemIDs()) 97 if not system_ids: 98 return None 99 cfg.evelocations.Prime(system_ids) 100 labels = [ u'%s (systemID=%s)' % (cfg.evelocations.Get(sid).name, sid) for sid in system_ids ] 101 ret, _ = sm.GetService('gameui').RadioButtonMessageBox(text='QA - Pick Starter System\n\nQA override: pick the starter system this character should spawn in. Cancel keeps the normal allocator choice.', title=' ', buttons=uiconst.OKCANCEL, icon=uiconst.QUESTION, radioOptions=labels, height=500, width=380) 102 button, selection = ret 103 if button in (uiconst.ID_CANCEL, uiconst.ID_CLOSE): 104 return None 105 index = int(selection[len('radioboxOption'):-len('Selected')]) - 1 106 return system_ids[index] 107 108 def UpdateExistingCharacterFull(self, charID, dollInfo, portraitInfo, dollExists, genderID, flush = False): 109 sm.RemoteSvc('charUnboundMgr').UpdateCharacterGender(charID, genderID) 110 session.SetAttributes({'genderID': genderID}) 111 sm.RemoteSvc('paperDollServer').UpdateExistingCharacterFull(charID, dollInfo, portraitInfo, dollExists, flush=flush) 112 sm.GetService('paperdoll').ClearCurrentPaperDollData() 113 sm.GetService('objectCaching').InvalidateCachedMethodCall('paperDollServer', 'GetPaperDollData', charID) 114 sm.GetService('objectCaching').InvalidateCachedMethodCall('charMgr', 'GetPublicInfo', charID) 115 self.GetCharacterSelectionData(force=1) 116 117 def UpdateExistingCharacterLimited(self, charID, dollInfo, portraitInfo, dollExists): 118 dollData = dollInfo.copy() 119 dollData.sculpts = [] 120 self.LogInfo('UpdateExistingCharacterLimited', charID) 121 sm.RemoteSvc('paperDollServer').UpdateExistingCharacterLimited(charID, dollData, portraitInfo, dollExists) 122 sm.GetService('paperdoll').ClearCurrentPaperDollData() 123 sm.GetService('objectCaching').InvalidateCachedMethodCall('paperDollServer', 'GetPaperDollData', charID) 124 self.GetCharacterSelectionData(force=1) 125 126 def UpdateExistingCharacterBloodline(self, charID, bloodlineID, refreshCharData = False): 127 sm.RemoteSvc('charUnboundMgr').UpdateCharacterBloodline(charID, bloodlineID) 128 if refreshCharData: 129 sm.GetService('paperdoll').ClearCurrentPaperDollData() 130 sm.GetService('objectCaching').InvalidateCachedMethodCall('paperDollServer', 'GetPaperDollData', charID) 131 self.GetCharacterSelectionData(force=1) 132 session.SetAttributes({'bloodlineID': bloodlineID}) 133 134 @telemetry.ZONE_METHOD 135 def GetPortraitData(self, charID): 136 data, _ = sm.RemoteSvc('paperDollServer').GetPaperDollPortraitDataFor(charID) 137 if len(data): 138 return data[0] 139 140 def StoreCurrentDollState(self, state, *args): 141 self.dollState = state 142 143 def NoExistingCustomization(self, *arags): 144 return self.dollState == paperdoll.State.no_existing_customization 145 146 def ClearMyAvailabelTypeIDs(self, *args): 147 self.availableTypeIDs = None 148 149 def GetMyApparel(self): 150 if getattr(self, 'availableTypeIDs', None) is not None: 151 return self.availableTypeIDs 152 availableTypeIDs = set() 153 if session.stationid or session.structureid: 154 try: 155 inv = self.invCache.GetInventory(containerHangar) 156 availableTypeIDs.update({i.typeID for i in inv.List(flagHangar) if i.categoryID == categoryApparel}) 157 inv = self.invCache.GetInventoryFromId(session.charid) 158 availableTypeIDs.update({i.typeID for i in inv.List() if i.flagID == flagWardrobe}) 159 except Exception as e: 160 self.LogException(e) 161 162 self.availableTypeIDs = availableTypeIDs 163 return self.availableTypeIDs 164 165 def GetSchoolAndSchoolCorpInfoForChar(self, charID): 166 charInfo = sm.RemoteSvc('charMgr').GetPublicInfo(charID) 167 schoolInfo = get_school(charInfo.schoolID) 168 schoolCorpInfo = sm.GetService('corp').GetCorporation(schoolInfo.corporationID) 169 return (schoolInfo, schoolCorpInfo) 170 171 def _LoadGame(self, characterID, skipTutorial): 172 sm.GetService('sessionMgr').PerformSessionChange(sessionChangeReason='charcreation', func=sm.RemoteSvc('charUnboundMgr').SelectCharacterID, charID=characterID, secondChoiceID=None, skipTutorial=skipTutorial) 173 launchdarkly.get_client().character_select(session.userid, characterID, session.languageID) 174 175 def FinishCharacterCreation(self, characterID, skipTutorial): 176 uthread.new(self.introController.play_intro, characterID, skipTutorial) 177 self._LoadGame(characterID, skipTutorial) 178 179 def IsIntroPlaying(self): 180 return self.introController.is_intro_playing 181 182 def IsGameLoaded(self): 183 return self.introController.is_game_loaded and not self.introController.is_intro_playing 184 185 def StopIntro(self): 186 self.introController.stop_intro()