underConstruction.py (7121B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\spacecomponents\client\components\underConstruction.py 2 import logging 3 import mathext 4 import evetypes 5 from spacecomponents.common.componentConst import UNDER_CONSTRUCTION 6 from inventorycommon.typeHelpers import GetAveragePrice 7 from spacecomponents import Component 8 from spacecomponents.client import MSG_ON_SLIM_ITEM_UPDATED, MSG_ON_LOAD_OBJECT, MSG_ON_ADDED_TO_SPACE, MSG_ON_REMOVED_FROM_SPACE 9 import uthread 10 import blue 11 from spacecomponents.client.ui.underConstruction.bracket import UnderContructionBracket 12 logger = logging.getLogger(__name__) 13 14 class UnderConstruction(Component): 15 16 def __init__(self, itemID, typeID, attributes, componentRegistry): 17 Component.__init__(self, itemID, typeID, attributes, componentRegistry) 18 self.SubscribeToMessage(MSG_ON_SLIM_ITEM_UPDATED, self.OnSlimItemUpdated) 19 self.SubscribeToMessage(MSG_ON_LOAD_OBJECT, self.OnLoadObject) 20 self.SubscribeToMessage(MSG_ON_ADDED_TO_SPACE, self.OnAddedToSpace) 21 self.SubscribeToMessage(MSG_ON_REMOVED_FROM_SPACE, self.OnRemovedFromSpace) 22 self._bracket_ui = None 23 self.itemID = itemID 24 self.completed = False 25 self.progressDict = {} 26 self.estimatedProgress = 0 27 self.currentProgress = 0 28 self.estimatedValueProgress = None 29 self.buildEffectThread = None 30 self.buildAmountControllerVariable = None 31 32 def OnAddedToSpace(self, slimItem): 33 self.progressDict = slimItem.component_underConstruction_progress or {} 34 uthread.new(self._AddUiToSpace, slimItem) 35 36 def _AddUiToSpace(self, slimItem): 37 if self._bracket_ui is None: 38 self._bracket_ui = UnderContructionBracket(slimItem.itemID, slimItem.typeID) 39 40 def ReloadUI(self): 41 if self._bracket_ui: 42 self._bracket_ui.close() 43 self._bracket_ui = None 44 slimItem = sm.GetService('michelle').GetItem(self.itemID) 45 self._bracket_ui = UnderContructionBracket(slimItem.itemID, slimItem.typeID) 46 47 def OnSlimItemUpdated(self, slimItem): 48 progress = slimItem.component_underConstruction_progress or {} 49 self.completed = slimItem.component_underConstruction_completed or False 50 self.CalculateProgress(slimItem) 51 sm.ScatterEvent('OnUnderConstructionUpdated', slimItem.itemID, progress, self.GetEstimatedValueProgress(), self.completed) 52 ball = sm.GetService('michelle').GetBall(self.itemID) 53 if ball is not None: 54 self._UpdateModel(ball) 55 self.progressDict = progress 56 57 def OnLoadObject(self, ball): 58 bp = sm.GetService('michelle').GetBallpark() 59 if bp is None: 60 return 61 slimItem = bp.GetInvItem(self.itemID) 62 self.CalculateProgress(slimItem) 63 self.currentProgress = self.estimatedProgress 64 ball.SetControllerVariable('isBuilt', 1.0) 65 ball.SetControllerVariable('isBuildByValue', 1.0) 66 ball.SetControllerVariable('buildAmount', self.estimatedProgress) 67 if ball.model is not None: 68 ball.model.StartControllers() 69 self._UpdateModel(ball) 70 71 def CalculateProgress(self, slimItem): 72 progress = slimItem.component_underConstruction_progress 73 if progress is None or not len(progress) > 0: 74 return 75 self._CalculateVisualProgress(progress) 76 self._CalculatePriceProgress(progress) 77 78 def _CalculateVisualProgress(self, progress): 79 estimateByComponentSum = sum(list(progress.values())) / len(progress) 80 self.estimatedProgress = min(1.0, max(0.0, estimateByComponentSum)) 81 82 def _CalculatePriceProgress(self, progress): 83 valueOfComponents = 0 84 totalValueOfNeeded = 0 85 try: 86 for typeID, inputInfo in self.attributes.inputItems.iteritems(): 87 typePrice = GetAveragePrice(typeID) 88 if not typePrice: 89 return 90 neededQty = inputInfo.qtyRequired 91 totalValueOfNeeded += typePrice * neededQty 92 typeProgress = progress.get(typeID, 0) 93 currentQty = typeProgress * neededQty 94 valueOfComponents += currentQty * typePrice 95 96 if totalValueOfNeeded: 97 self.estimatedValueProgress = float(valueOfComponents) / totalValueOfNeeded 98 else: 99 self.estimatedValueProgress = None 100 except Exception as e: 101 logger.exception('Failed _CalculatePriceProgress') 102 103 def _UpdateModel(self, ball): 104 if not hasattr(ball, 'model') or ball.model is None or self.estimatedProgress == self.currentProgress: 105 return 106 structureController = ball.model.controllers.FindByName('structure') 107 if structureController is not None: 108 targetLerpVariable = structureController.variables.FindByName('buildAmount') 109 if targetLerpVariable is not None: 110 self.buildAmountControllerVariable = targetLerpVariable 111 if self.buildAmountControllerVariable is not None and not self.buildEffectThread: 112 self.buildEffectThread = uthread.new(self.BuildEffectThread) 113 114 def BuildEffectThread(self): 115 try: 116 while True: 117 currentDifference = self.estimatedProgress - self.currentProgress 118 if abs(currentDifference) < 0.01 or self.buildAmountControllerVariable is None: 119 self.buildAmountControllerVariable.value = self.estimatedProgress 120 break 121 lerpSpeed = 0.005 122 frameRateAdjustment = 60 / blue.os.fps 123 adjustedLerpSpeed = lerpSpeed * frameRateAdjustment 124 self.currentProgress = self.currentProgress + currentDifference * adjustedLerpSpeed 125 self.buildAmountControllerVariable.value = self.currentProgress 126 blue.synchro.Yield() 127 128 finally: 129 self.currentProgress = self.estimatedProgress 130 self.buildAmountControllerVariable = None 131 self.buildEffectThread = None 132 133 def GetEstimatedValueProgress(self): 134 if self.estimatedValueProgress is None: 135 return self.estimatedProgress 136 return self.estimatedValueProgress 137 138 def OpenUnderConstructionWnd(self): 139 from eve.client.script.ui.shared.underConstruction.underConstructionWnd import UnderConstructionWnd 140 windowID = 'underConstructionWnd_%s' % self.itemID 141 wnd = UnderConstructionWnd.GetIfOpen(windowID=windowID) 142 if wnd and not wnd.destroyed: 143 wnd.Maximize() 144 else: 145 UnderConstructionWnd.Open(windowID=windowID, itemID=self.itemID) 146 147 def OnRemovedFromSpace(self): 148 if self._bracket_ui: 149 self._bracket_ui.close() 150 self._bracket_ui = None 151 152 def DepositItemsFromShip(self, typeAndQty): 153 remoteBallpark = sm.GetService('michelle').GetRemotePark() 154 failedToMove = remoteBallpark.CallComponentFromClient(self.itemID, UNDER_CONSTRUCTION, 'DepositItemsFromShip', typeAndQty=typeAndQty) 155 return failedToMove