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)