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

modularHangarCapitalBehaviours.py (13045B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\view\hangarBehaviours\modularHangarCapitalBehaviours.py
      2 from __future__ import absolute_import
      3 import blue
      4 import geo2
      5 import trinity
      6 import math
      7 import logging
      8 import uthread
      9 from . import modularHangarBehavioursConstants as hConst
     10 from uthread2 import call_after_simtime_delay
     11 from fsdBuiltData.common.graphicIDs import GetGraphicFile
     12 from .modularHangarBehaviours import ModularHangarShipBehaviour, ModularHangarDroneBehaviour
     13 from evetypes import GetGroupID
     14 import inventorycommon.const as invC
     15 import evecamera
     16 log = logging.getLogger(__name__)
     17 EXIT_POINT_FROM_SHIP_OFFSET = (0, 0, 10000)
     18 
     19 class ModularCapitalHangarShipBehaviour(ModularHangarShipBehaviour):
     20 
     21     def __init__(self):
     22         super(ModularCapitalHangarShipBehaviour, self).__init__()
     23         self.shipTranslation = (0, 0, 0)
     24         self.shipRotation = (0, 0, 0, 0)
     25         self.playerShipItemID = 0
     26         self.playerShipTypeID = 0
     27         self.shipOffset = (0, 0, 0)
     28         self.exitLocation = (0, 0, 0)
     29         self.hangarScene = None
     30         self.hangarModel = None
     31         self.playerShip = None
     32         self.dockMultiEffect = None
     33         self.dockedShipItemID = 0
     34 
     35     def SetAnchorPoint(self, hangarModel, hangarScene):
     36         if hangarModel is None:
     37             self.log.error('ModularHangarShipBehaviour.SetAnchorPoint: Setting anchor point when hangarModel is None')
     38             return
     39         self.hangarScene = hangarScene
     40         self.hangarModel = hangarModel
     41         self._CreateDock(hangarModel, hangarScene)
     42 
     43     def GetCamera(self):
     44         return sm.GetService('sceneManager').GetRegisteredCamera(evecamera.CAM_MODULARHANGAR_CAPITAL)
     45 
     46     def GetAllDockedShips(self):
     47         return [self.playerShip]
     48 
     49     def _CreateDock(self, hangarModel, hangarScene):
     50         shipPlacement = self.GetLocatorsFromSet(hangarModel, 'ship_placement')
     51         MEResPath = GetGraphicFile(hConst.DOCKER_CAPITAL_MULTIEFFECT_GRAPHIC_ID)
     52         if len(shipPlacement) != 1:
     53             self.log.error('ModularHangarShipBehaviour._CreateDock: ship_placement locatorSet missconfigured')
     54             return
     55         for locator in shipPlacement:
     56             self.shipTranslation = locator[0]
     57             self.shipRotation = locator[1]
     58             ME = blue.resMan.LoadObject(MEResPath)
     59             self.exitLocation = geo2.Vec3Add(locator[0], EXIT_POINT_FROM_SHIP_OFFSET)
     60             self.dockMultiEffect = ME
     61             self.dockMultiEffect.SetParameter('docking_dock', hangarModel)
     62             self.dockMultiEffect.SetControllerVariable('isCapital', 1.0)
     63 
     64     def _ConfigureShipTransform(self, ship, offset):
     65         platformRotation = trinity.Tr2CurveConstant()
     66         platformRotation.value = self.shipRotation
     67         shipTranslation = trinity.Tr2CurveCombiner()
     68         platformTranslation = trinity.Tr2TranslationAdapter()
     69         platformTranslation.value = geo2.Add(offset, self.shipTranslation)
     70         multiEffectTranslation = trinity.Tr2TranslationAdapter()
     71         multiEffectTranslation.rotationOffset = self.shipRotation
     72         shipTranslation.curves.append(platformTranslation)
     73         shipTranslation.curves.append(multiEffectTranslation)
     74         displayOffset = ship.locatorSets.FindByName(hConst.LOCATORSET_DISPLAY_OFFSET)
     75         if displayOffset is not None and len(displayOffset.locators) == 1:
     76             displayOffsetCurve = trinity.Tr2TranslationAdapter()
     77             displayOffsetCurve.value = displayOffset.locators[0][0]
     78             displayOffsetCurve.rotationOffset = self.shipRotation
     79             shipTranslation.curves.append(displayOffsetCurve)
     80         ship.translationCurve = shipTranslation
     81         ship.rotationCurve = platformRotation
     82         ship.modelRotationCurve = trinity.Tr2RotationAdapter()
     83         ship.modelTranslationCurve = trinity.Tr2TranslationAdapter()
     84 
     85     def PrepareFSB(self, vfxMultiEffect):
     86         self.dockMultiEffect.SetParameter('docking_ship', None)
     87 
     88     def FinishFSB(self):
     89         self.dockMultiEffect.SetParameter('docking_ship', self.playerShip)
     90         self.dockMultiEffect.SetControllerVariable('materialize', 1.0)
     91         self.dockMultiEffect.SetControllerVariable('_previousState', 1.0)
     92         self.dockMultiEffect.SetControllerVariable('materializeDelay', 0.0)
     93         self.dockMultiEffect.StartControllers()
     94 
     95     def GetActiveDock(self):
     96         return None
     97 
     98     def PlaceShip(self, itemID, typeID, skipDockingAnimation = False):
     99         if self.playerShipItemID == self.dockedShipItemID:
    100             return self.playerShip
    101         firstTime = self.playerShip is None
    102         model = self.LoadShipModel(itemID, typeID)
    103         trinity.WaitForResourceLoads()
    104         try:
    105             counter = 0
    106             maxYields = 10
    107             while counter < maxYields:
    108                 modelBB = model.GetLocalBoundingBox()
    109                 if modelBB[0][0] != 0.0 and modelBB[0][2] != 0.0:
    110                     break
    111                 counter = counter + 1
    112                 blue.synchro.Yield()
    113                 if counter is maxYields - 1:
    114                     self.log.error('modularHangarCapitalBehaviour.PlaceShip: failed waiting for boundingBox, model: %s' % model)
    115 
    116         except IndexError:
    117             self.log.error('modularHangarCapitalBehaviour.PlaceShip: bounding box missconfigured')
    118 
    119         self.shipOffset = geo2.QuaternionTransformVector(self.shipRotation, self.GetShipOffset(model, typeID))
    120         self._ConfigureShipTransform(model, self.shipOffset)
    121         model.clipSphereFactor = 1.0
    122         self.playerShip = model
    123         self.hangarScene.objects.append(model)
    124         self.GetCamera().SetShip(model, typeID)
    125         if skipDockingAnimation:
    126             self._ReplaceShipInDock(self, model, None, skipAnimation=True)
    127             self.dockMultiEffect.SetControllerVariable('_previousState', 1.0)
    128             self.dockMultiEffect.SetControllerVariable('materialize', 1.0)
    129             self.dockMultiEffect.SetControllerVariable('materializeDelay', 0.0)
    130             self.dockMultiEffect.SetControllerVariable('docked', 1.0)
    131         elif firstTime:
    132             self.dockMultiEffect = self._ReplaceShipInDock(model, None, True)
    133             self.dockMultiEffect.SetControllerVariable('_previousState', 1.0)
    134             self.dockMultiEffect.SetControllerVariable('materialize', 1.0)
    135             self.dockMultiEffect.SetControllerVariable('materializeDelay', 0.0)
    136             self.dockMultiEffect.SetControllerVariable('docked', 0.0)
    137         else:
    138             self.dockMultiEffect = self._ReplaceShipInDock(model, None)
    139         self.dockMultiEffect.SetParameter('docking_ship', model)
    140         self.dockMultiEffect.SetParameter('docking_dock', self.hangarModel)
    141         self.hangarModel.SetControllerVariable('isActivePlayerDock', 1.0)
    142         self.dockMultiEffect.SetControllerVariable('isCapital', 1.0)
    143         groupID = GetGroupID(typeID)
    144         shipClass = 0.0
    145         if groupID == invC.groupTitan:
    146             shipClass = 2.0
    147         elif groupID in (invC.groupDreadnought,
    148          invC.groupSupercarrier,
    149          invC.groupCommandCarrier,
    150          invC.groupForceAux,
    151          invC.groupLancerDreadnought):
    152             shipClass = 1.0
    153         self.hangarModel.SetControllerVariable('chShipClass', shipClass)
    154         self.dockedShipItemID = self.playerShipItemID
    155         if model.boosters is not None:
    156             model.boosters.display = True
    157         self.dockMultiEffect.StartControllers()
    158         return model
    159 
    160     def OnShipCosmeticsChanged(self, ship_id, cosmetics_types):
    161         if self.playerShip is not None:
    162             uthread.new(self.cosmeticsLoader.SetCosmeticsOnShip, self.playerShip, cosmetics_types)
    163 
    164     @staticmethod
    165     def GetShipOffset(model, typeID):
    166         localBB = model.GetLocalBoundingBox()
    167         width = abs(localBB[0][2])
    168         return (0.0, 0.0, -2 * width)
    169 
    170     def GetShipCenter(self, model, typeID):
    171         translation = model.translationCurve.currentValue if model.translationCurve is not None else None
    172         modelTranslation = model.translationCurve.currentValue if model.translationCurve is not None else None
    173         return geo2.Vec3Add(translation or (0.0, 0.0, 0.0), modelTranslation or (0.0, 0.0, 0.0))
    174 
    175     def GetAnimEndPosition(self):
    176         return (0.0, 0.0, 0.0)
    177 
    178     def GetAnimStartPosition(self):
    179         return (0.0, 0.0, 0.0)
    180 
    181     def SetFlightPath(self, exit1, hallway1, hallway2, exit2, dockPos):
    182         pass
    183 
    184     def populateDocksWithInventoryShips(self, ships, scene, hangar):
    185         pass
    186 
    187     def UpdateUndockStatus(self, isUndocking):
    188         if self.dockMultiEffect is not None:
    189             self.dockMultiEffect.SetControllerVariable('docked', 1.0 - isUndocking)
    190 
    191     def _ReplaceShipInDock(self, model, dock, skipCleanup = False, skipAnimation = False):
    192 
    193         def cleanUp(hangarScene, ship, multiEffect):
    194             if hangarScene is None:
    195                 return
    196             for param in multiEffect.parameters:
    197                 param.object = None
    198 
    199             multiEffect.bindings.removeAt(-1)
    200             if ship is not None and ship in hangarScene.objects:
    201                 hangarScene.objects.remove(ship)
    202             if multiEffect is not None and multiEffect in hangarScene.objects:
    203                 hangarScene.objects.remove(multiEffect)
    204 
    205         newME = blue.resMan.LoadObject(GetGraphicFile(hConst.DOCKER_CAPITAL_MULTIEFFECT_GRAPHIC_ID))
    206         newExit = newME.curveSets.FindByName('docking_cs').curves.FindByName('exit_point')
    207         oldExit = self.dockMultiEffect.curveSets.FindByName('docking_cs').curves.FindByName('exit_point')
    208         newExit.value = oldExit.value
    209         oldME = self.dockMultiEffect
    210         self.dockMultiEffect = newME
    211         self.hangarScene.objects.append(newME)
    212         newME.SetControllerVariable('materialize', 1.0)
    213         if skipCleanup or skipAnimation:
    214             newME.SetControllerVariable('_previousState', 1.0)
    215             newME.SetControllerVariable('docked', 0.0 if skipCleanup else 1.0)
    216         else:
    217             newME.SetControllerVariable('_previousState', 0.0)
    218             newME.SetControllerVariable('docked', 1.0)
    219             newME.SetControllerVariable('materializeDelay', 4.0)
    220         oldME.SetControllerVariable('materialize', 0.0)
    221         oldShip = oldME.parameters.FindByName('docking_ship').object
    222         if skipAnimation:
    223             oldME.SetControllerVariable('_previousState', 0.0)
    224             oldME.StartControllers()
    225         if not skipCleanup:
    226             call_after_simtime_delay(cleanUp, 15.0, self.hangarScene, oldShip, oldME)
    227         return newME
    228 
    229     def AnimateShipEntry(self, newModel, typeID, scene = None, duration = 5.0):
    230         self.PlaceShip(newModel, typeID)
    231 
    232     def UpdateActiveShipIDs(self, typeID, itemID):
    233         self.playerShipItemID = itemID
    234         self.playerShipTypeID = typeID
    235 
    236     def LoadShipModel(self, itemID, typeID, playerShip = True):
    237         model = self._LoadSOFShipModel(itemID, typeID)
    238         model.name = str(itemID)
    239         if playerShip:
    240             model.FreezeHighDetailMesh()
    241             self.playerShipItemID = itemID
    242             self.playerShipTypeID = typeID
    243             self.SetShipDamage(itemID, model)
    244             self.FitTurrets(itemID, typeID, model)
    245         self.SetShipDirtLevel(itemID, model)
    246         self.SetShipKillCounter(itemID, model)
    247         self.SetupShipAnimation(model, typeID, itemID)
    248         self.SetInHangarVariables(model)
    249         return model
    250 
    251     def ProcessSkinChange(self, newModel):
    252         if self.playerShip is None:
    253             return
    254         if self.playerDock is not None and self.playerDock.dockMultiEffect is not None:
    255             self.playerDock.dockedShip = newModel
    256         if newModel.boosters is not None:
    257             newModel.boosters.display = True
    258         self._AddDetailsToShipModel(self.playerShipItemID, self.playerShipTypeID, newModel, playerShip=False)
    259         self.playerShip = newModel
    260         self.dockMultiEffect.SetParameter('docking_ship', newModel)
    261         self.dockMultiEffect.SetControllerVariable('materialize', 1.0)
    262         self.dockMultiEffect.SetControllerVariable('materializeDelay', 0.0)
    263         self.dockMultiEffect.SetControllerVariable('_previousState', 1.0)
    264         self.dockMultiEffect.SetControllerVariable('skinChange', 1.0)
    265         self.dockMultiEffect.SetControllerVariable('docked', 1.0)
    266         newModel.SetControllerVariable('IsWarping', 0.0)
    267         newModel.StartControllers()
    268         for curveSet in self.dockMultiEffect.curveSets:
    269             curveSet.Play()
    270 
    271         for controller in self.dockMultiEffect.controllers:
    272             controller.Start()
    273 
    274     def ProcessCamera(self, camera, newModel, typeID):
    275         pass
    276 
    277     def _shipRequiresBigDock(self, ship):
    278         pass
    279 
    280     def OnItemChangeProcessed(self, item, itemInfo):
    281         pass
    282 
    283 
    284 class ModularCapitalHangarDroneBehaviour(ModularHangarDroneBehaviour):
    285 
    286     def SetRepairDroneCount(self, boundingRadius):
    287         count = int(math.ceil(boundingRadius / 60.0))
    288         if self.repairDroneBehaviourGroup:
    289             self.repairDroneBehaviourGroup.SetCount(count)