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