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

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