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

colonyTemplateLoading.py (10587B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\planet\colonyTemplateLoading.py
      2 import blue
      3 import carbonui.const as uiconst
      4 import eve.client.script.ui.shared.planet.planetConst as planetConst
      5 import eve.common.lib.appConst as appConst
      6 import evetypes
      7 import inventorycommon.const as invConst
      8 import locks
      9 import uthread2
     10 from carbonui.uicore import uicore
     11 from eve.client.script.ui.shared.planet import planetUtil
     12 from eve.client.script.ui.shared.planet.planetUtil import ConvertPinType
     13 from eve.common.script.planet.planetUtil import CMDCTRSTRING
     14 from eve.common.script.planet.surfacePoint import SurfacePoint
     15 from eveplanet.client.templates.templateConst import TemplateDictKeys, TemplatePinDataDictKeys, TemplateLinkDataDictKeys, TemplateRouteDataDictKeys
     16 from eveplanet.client.templates.verification import VerifyTemplate
     17 from localization import GetByLabel
     18 from player_messaging.client.ui_message import message_player, prompt_player, prompt_player_fsd_dialog
     19 
     20 def PreviewLoad(colonyTemplate):
     21     VerifyTemplate(colonyTemplate.loadedTemplate)
     22     if not planetUtil.IsSerenity():
     23         planetUI = sm.GetService('planetUI')
     24         cmdCtrPin = planetUI.myPinManager.GetCommandCenterPin()
     25         if cmdCtrPin is None or cmdCtrPin.pin.IsInEditMode():
     26             raise UserError('NeedCmdCtrToUseTemplate')
     27     from eve.client.script.ui.shared.planet.templatePreviewWindow import TemplatePreviewWindow
     28     wnd = TemplatePreviewWindow.GetIfOpen()
     29     if wnd:
     30         wnd.Maximize()
     31         message_player(GetByLabel('UI/PI/AlreadyLoading'))
     32         return
     33     tpw = TemplatePreviewWindow(parent=uicore.layer.planet, template=colonyTemplate, clientPlanet=sm.GetService('planetUI').GetCurrentPlanet())
     34 
     35 
     36 def LoadPiTemplate(newSPs, colonyTemplate):
     37     with locks.TempLock('PITemplate_Load'):
     38         return _LoadPiTemplate(newSPs, colonyTemplate)
     39 
     40 
     41 def _LoadPiTemplate(newSPs, colonyTemplate):
     42     planetUI = sm.GetService('planetUI')
     43     hasCommandCenterInTemplate = False
     44     cmdCtrPin = planetUI.myPinManager.GetCommandCenterPin()
     45     alreadyHaveCmdCtr = bool(cmdCtrPin)
     46     if not planetUtil.IsSerenity():
     47         if cmdCtrPin is None or cmdCtrPin.pin.IsInEditMode():
     48             raise UserError('NeedCmdCtrToUseTemplate')
     49     cmdCtrItemID = None
     50     templateData = colonyTemplate.loadedTemplate
     51     message_player(GetByLabel('UI/PI/PinBuildingStarted'))
     52     if newSPs is None:
     53         newSPs = {}
     54         for pin in templateData[TemplateDictKeys.PinData]:
     55             point = SurfacePoint(theta=pin[TemplatePinDataDictKeys.Longi], phi=pin[TemplatePinDataDictKeys.Lat])
     56             newSPs[str(pin)] = (point,)
     57 
     58     for pin in templateData[TemplateDictKeys.PinData]:
     59         pinTypeInTemplate = pin[TemplatePinDataDictKeys.PinTypeID]
     60         pinType = ConvertPinType(pinTypeInTemplate, planetUI.planet.GetPlanetTypeID())
     61         if pinType is None:
     62             prompt_player_fsd_dialog('CustomError', {'error': GetByLabel('UI/PI/DoNotHaveCorrespondingPin', pinTypeName=evetypes.GetName(pinTypeInTemplate))})
     63             return False
     64         if pinType not in planetConst.TYPEIDS_COMMAND_CENTER:
     65             continue
     66         cmdCtrPinPos = newSPs[str(pin)][0]
     67         if not alreadyHaveCmdCtr:
     68             planetUI.myPinManager.PlacePinType(cmdCtrPinPos, pinType)
     69             _AttemptToUpgradeCommandCenter(templateData)
     70         cmdCtrItemID = planetUI.planet.colony.colonyData.commandPin.id
     71         hasCommandCenterInTemplate = True
     72         break
     73 
     74     pinIDCountCompensator = 0
     75     if not hasCommandCenterInTemplate:
     76         if alreadyHaveCmdCtr:
     77             pinIDCountCompensator = -1
     78             cmdCtrItemID = planetUI.planet.colony.colonyData.commandPin.id
     79             if planetUI.planet.colony.colonyData.level < templateData[TemplateDictKeys.CmdCenterLV]:
     80                 _AttemptToUpgradeCommandCenter(templateData)
     81         else:
     82             prompt_player(text=GetByLabel('UI/PI/NoCmdCtrWillSupportSoon'), title=GetByLabel('UI/Common/Error'), options=uiconst.CLOSE, icon=uiconst.ERROR)
     83             return False
     84     SurfacePoint(theta=planetUI.planet.colony.colonyData.commandPin.longitude, phi=planetUI.planet.colony.colonyData.commandPin.latitude)
     85     pinIDCount = 1
     86     blue.pyos.synchro.SleepWallclock(1000)
     87     existedPinsRecorder = set(planetUI.myPinManager.pinsByID.keys())
     88     idxToPinTable = {}
     89     idxToPinTable[CMDCTRSTRING] = CMDCTRSTRING
     90     debugIdxToPinTable = {}
     91     totalNumPins = len(templateData[TemplateDictKeys.PinData])
     92     for pin in templateData[TemplateDictKeys.PinData]:
     93         pinTypeInTemplate = pin[TemplatePinDataDictKeys.PinTypeID]
     94         pinType = ConvertPinType(pinTypeInTemplate, planetUI.planet.GetPlanetTypeID())
     95         if pinType is None:
     96             prompt_player_fsd_dialog('CustomError', {'error': GetByLabel('UI/PI/DoNotHaveCorrespondingPin', pinTypeName=evetypes.GetName(pinTypeInTemplate))})
     97             return False
     98         if pinType in planetConst.TYPEIDS_COMMAND_CENTER:
     99             existedPinsRecorder = set(planetUI.myPinManager.pinsByID.keys())
    100             continue
    101         position = newSPs[str(pin)][0]
    102         planetUI.myPinManager.PlacePinType(position, pinType)
    103         blue.pyos.synchro.SleepWallclock(200)
    104         newExistedPinsRecorder = set(planetUI.myPinManager.pinsByID.keys())
    105         newPinIDs = newExistedPinsRecorder.difference(existedPinsRecorder)
    106         if len(newPinIDs) != 1 and cmdCtrItemID not in newPinIDs:
    107             raise UserError('CustomError', {'error': GetByLabel('UI/PI/PINError')})
    108         else:
    109             popped = newPinIDs.pop()
    110             if popped == cmdCtrItemID:
    111                 popped = newPinIDs.pop()
    112             idxToPinTable[pinIDCount] = popped[1]
    113             debugIdxToPinTable[pinIDCount] = evetypes.GetName(pinType)
    114             existedPinsRecorder = set(planetUI.myPinManager.pinsByID.keys())
    115         if pinType in planetConst.TYPEIDS_PROCESSORS and pin[TemplatePinDataDictKeys.Product] is not None:
    116             try:
    117                 planetUI.myPinManager.InstallSchematic((1, idxToPinTable[pinIDCount]), planetConst.OUTPUT_TO_SCHEMATICID[pin[TemplatePinDataDictKeys.Product]])
    118             except:
    119                 pass
    120 
    121         elif evetypes.GetGroupID(pinType) == invConst.groupExtractionControlUnitPins:
    122             pass
    123         message_player(GetByLabel('UI/PI/PinBuildingProgress', currentNum=pinIDCount, totalNum=totalNumPins), flash_existing=False)
    124         pinIDCount += 1
    125 
    126     message_player(GetByLabel('UI/PI/LinkBuildingStarted'), flash_existing=False)
    127     totalNumLinks = len(templateData[TemplateDictKeys.LinkData])
    128     for i, link in enumerate(templateData[TemplateDictKeys.LinkData]):
    129         sou = idxToPinTable[link[TemplateLinkDataDictKeys.Source]]
    130         des = idxToPinTable[link[TemplateLinkDataDictKeys.Destination]]
    131         if sou != CMDCTRSTRING and des != CMDCTRSTRING and sou > des:
    132             sou, des = des, sou
    133         oneSou = (1, sou) if sou != CMDCTRSTRING else cmdCtrItemID
    134         oneDes = (1, des) if des != CMDCTRSTRING else cmdCtrItemID
    135         planetUI.myPinManager.SetLinkChild(oneSou, oneDes, False)
    136         blue.pyos.synchro.SleepWallclock(100)
    137         planetUI.myPinManager.UpgradeLink(oneSou, oneDes, link[TemplateLinkDataDictKeys.Level])
    138         message_player(GetByLabel('UI/PI/LinkBuildingProgress', currentNum=i + 1, totalNum=totalNumLinks), flash_existing=False)
    139 
    140     uthread2.Yield()
    141     message_player(GetByLabel('UI/PI/RouteBuildingStarted'), flash_existing=False)
    142     totalNumRoutes = len(templateData[TemplateDictKeys.RouteData])
    143     failedRoutes = []
    144     for i, route in enumerate(templateData[TemplateDictKeys.RouteData]):
    145         path = []
    146         skipThisRoute = False
    147         for node in route[TemplateRouteDataDictKeys.Path]:
    148             if node == CMDCTRSTRING:
    149                 prompt_player_fsd_dialog('CustomError', {'error': GetByLabel('UI/PI/LinkWithCmdCtrNotAvailable')})
    150                 skipThisRoute = True
    151                 break
    152             else:
    153                 path.append((1, idxToPinTable[node]))
    154                 adjustedNode = node + pinIDCountCompensator
    155                 pinType = templateData[TemplateDictKeys.PinData][adjustedNode][TemplatePinDataDictKeys.PinTypeID]
    156                 if evetypes.GetGroupID(pinType) == invConst.groupExtractionControlUnitPins:
    157                     skipThisRoute = True
    158                     break
    159 
    160         if skipThisRoute:
    161             continue
    162         try:
    163             planetUI.planet.CreateRoute(path, route[TemplateRouteDataDictKeys.ItemType], route[TemplateRouteDataDictKeys.ItemQuantity])
    164         except Exception:
    165             failedRoutes.append(route)
    166 
    167         message_player(GetByLabel('UI/PI/RouteBuildingProgress', currentNum=i + 1, totalNum=totalNumRoutes), flash_existing=False)
    168 
    169     if failedRoutes:
    170         textList = []
    171         for eachRoute in failedRoutes:
    172             rTextList = []
    173             for pinInRoute in eachRoute[TemplateRouteDataDictKeys.Path]:
    174                 adjustedPin = pinInRoute + pinIDCountCompensator
    175                 pinType = templateData[TemplateDictKeys.PinData][adjustedPin][TemplatePinDataDictKeys.PinTypeID]
    176                 convertedPinType = ConvertPinType(pinType, planetUI.planet.GetPlanetTypeID())
    177                 rTextList.append(evetypes.GetName(convertedPinType))
    178 
    179             itemTypeName = evetypes.GetName(eachRoute[TemplateRouteDataDictKeys.ItemType])
    180             routeText = ' -> '.join(rTextList)
    181             textList.append(u'\u2022 %s (%s)' % (routeText, itemTypeName))
    182 
    183         routeList = '<br>'.join(textList)
    184         prompt_player_fsd_dialog('PiTemplateRoutesFailed', {'routeList': routeList})
    185     return True
    186 
    187 
    188 def _AttemptToUpgradeCommandCenter(templateData):
    189     planetUI = sm.GetService('planetUI')
    190     currentLevel = planetUI.planet.colony.colonyData.level
    191     commandCenterLevel = templateData[TemplateDictKeys.CmdCenterLV]
    192     try:
    193         planetUI.planet.UpgradeCommandCenter(planetUI.planet.colony.colonyData.commandPin.id, commandCenterLevel)
    194     except UserError as e:
    195         if e.msg == 'CantUpgradeCommandCenterSkillRequired':
    196             text = GetByLabel('UI/PI/UnableToUpgradeCommandCenter', skillName=evetypes.GetName(appConst.typeCommandCenterUpgrade), requestedLevel=e.dict['requestedLevel'])
    197             message_player(text)
    198             skillLevel = sm.GetService('skills').GetEffectiveLevel(appConst.typeCommandCenterUpgrade)
    199             if skillLevel and skillLevel > currentLevel:
    200                 planetUI.planet.UpgradeCommandCenter(planetUI.planet.colony.colonyData.commandPin.id, skillLevel)
    201         else:
    202             raise