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

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()