shipEjector.py (9272B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\environment\effects\shipEjector.py 2 import trinity 3 import blue 4 import uthread 5 from eve.client.script.environment.effects.GenericEffect import GenericEffect, STOP_REASON_DEFAULT, STOP_REASON_BALL_REMOVED 6 import inventorycommon.const as invC 7 from fsdBuiltData.common.graphicIDs import GetGraphicFile 8 SHIP_SIZE_CLASS_LOOKUP_DICTIONARY = {} 9 10 class ShipEjector(GenericEffect): 11 __guid__ = 'effects.ShipEjector' 12 13 def __init__(self, trigger, effect = None, graphicFile = None): 14 super(ShipEjector, self).__init__(trigger, effect, graphicFile) 15 shipBall = self.fxSequencer.GetBall(trigger.targetID) 16 carrierBall = self.fxSequencer.GetBall(trigger.shipID) 17 self.ship = self.effRoot = self.effRoot = gIDOverride = None 18 self.lingerOnDeathTime = 10 19 if shipBall is not None: 20 self.ship = shipBall.GetModel() 21 if carrierBall is not None: 22 self.carrier = carrierBall.GetModel() 23 if trigger.graphicInfo is not None: 24 self.lingerOnDeathTime = trigger.graphicInfo.get('deathTimer', 10) 25 gIDOverride = trigger.graphicInfo.get('graphicIDOverride', None) 26 self.multiEffectPath = graphicFile 27 self.sizeClass = self._AssignSizeClass(shipBall) 28 self.isReversed = False 29 if trigger.graphicInfo is not None: 30 rev = trigger.graphicInfo.get('reversed') 31 if rev is not None: 32 self.isReversed = rev 33 if gIDOverride is not None: 34 graphicFilePath = GetGraphicFile(gIDOverride) 35 if graphicFilePath is not None: 36 self.multiEffectPath = graphicFilePath 37 38 def Prepare(self): 39 self.gfx = self.RecycleOrLoad(self.multiEffectPath) 40 if self.gfx is None: 41 raise RuntimeError('shipEjector: no effect defined: %s' % getattr(self, 'graphicFile', 'None')) 42 if self.carrier is None: 43 raise RuntimeError('shipEjector: the SuperCarrier no longer exists') 44 if self.ship is None: 45 raise RuntimeError('shipEjector: ship being built no longer exists') 46 self.AddToScene(self.gfx) 47 if self.ship.modelTranslationCurve is None: 48 self.ship.modelTranslationCurve = trinity.Tr2CurveVector3() 49 self.gfx.SetParameter('sourceShip', self.carrier) 50 self.gfx.SetParameter('objectBeingBuilt', self.ship) 51 self.gfx.SetControllerVariable('Build', 1) 52 self.gfx.SetControllerVariable('shipSize', self.sizeClass) 53 self.carrier.SetControllerVariable('isSpawning', 1) 54 if self.isReversed: 55 self.gfx.SetControllerVariable('Reversed', 1) 56 effLoad = trinity.EveEffectRoot2() 57 effLoad.name = 'carrierLink_' + self.ship.name 58 effLoad.translation = self.carrier.worldPosition 59 self.AddToScene(effLoad) 60 if effLoad is not None: 61 self.effRoot = effLoad 62 self.gfx.SetParameter('buildLink', self.effRoot) 63 self._SetupLineSet() 64 65 def Start(self, duration): 66 if self.gfx is None: 67 raise RuntimeError('shipEjector: no effect defined: %s' % getattr(self, 'graphicFile', 'None')) 68 self.gfx.StartControllers() 69 70 def Stop(self, reason = STOP_REASON_DEFAULT): 71 if self.gfx is None: 72 raise RuntimeError('shipEjector: no effect defined: ' + str(getattr(self, 'graphicFile', 'None'))) 73 self.RemoveFromScene(self.effRoot) 74 self.effRoot = None 75 scene = self.fxSequencer.GetScene() 76 if reason == STOP_REASON_BALL_REMOVED: 77 if self.lingerOnDeathTime is not None: 78 uthread.new(ShipEjector._DelayedCleanUp, self.lingerOnDeathTime, self.gfx, scene) 79 else: 80 self._CleanUp(self.gfx, scene) 81 82 @staticmethod 83 def _DelayedCleanUp(timeInSec, model, scene): 84 blue.synchro.SleepSim(timeInSec * 1000) 85 ShipEjector._CleanUp(model, scene) 86 87 @staticmethod 88 def _CleanUp(model, scene): 89 if scene is not None and model is not None: 90 scene.objects.fremove(model) 91 92 def _GetPoseID(self): 93 defaultPosID = 0 94 if not isinstance(self.graphicInfo, dict): 95 return defaultPosID 96 return self.graphicInfo.get('poseID', defaultPosID) 97 98 def _SetupLineSet(self): 99 locatorSetName = 'spawn' 100 bestIndex = self.carrier.GetCloseLocatorIndex(self.ship.modelWorldPosition, locatorSetName) 101 emitLocation = self.carrier.GetLocatorPositionFromSet(bestIndex, True, locatorSetName) 102 if emitLocation == (0.0, 0.0, 0.0): 103 locatorSetName = 'damage' 104 bestIndex = self.carrier.GetCloseLocatorIndex(self.ship.modelWorldPosition, locatorSetName) 105 emitLocation = self.carrier.GetLocatorPositionFromSet(bestIndex, True, locatorSetName) 106 emitLocation = tuple([emitLocation[0] - self.carrier.worldPosition[0], emitLocation[1] - self.carrier.worldPosition[1], emitLocation[2] - self.carrier.worldPosition[2]]) 107 direction = self.carrier.GetLocatorRotationFromSet(bestIndex, True, locatorSetName) 108 cs = self.gfx.curveSets.FindByName('builder') 109 if cs is not None: 110 c1 = cs.curves.FindByName('BuildLink_Point1_Offset') 111 if c1 is not None: 112 c1.input1 = emitLocation[0] 113 c1.input2 = emitLocation[1] 114 c1.input3 = emitLocation[2] 115 c2 = cs.curves.FindByName('BuildLink_BezierPoint_Offset') 116 if c2 is not None: 117 c2.input1 = emitLocation[0] + self.carrier.boundingSphereRadius * direction[0] 118 c2.input2 = emitLocation[1] + self.carrier.boundingSphereRadius * direction[1] 119 c2.input3 = emitLocation[2] + self.carrier.boundingSphereRadius * direction[2] 120 c3 = cs.curves.FindByName('TimeScale_ Multiplier') 121 if c3 is not None: 122 c3.input1 = 1.0 / blue.os.desiredSimDilation 123 124 def _AssignSizeClass(self, shipBall): 125 targetGID = shipBall.typeData.get('groupID') 126 assignedGroup = SHIP_SIZE_CLASS_LOOKUP_DICTIONARY.get(targetGID) 127 if assignedGroup is not None: 128 return assignedGroup 129 assignedGroup = 0 130 rad = self.ship.boundingSphereRadius or 200 131 for i in [70, 132 115, 133 170, 134 215]: 135 if rad > i: 136 assignedGroup += 1 137 138 return assignedGroup 139 140 141 class CapsuleFlare(GenericEffect): 142 __guid__ = 'effects.CapsuleFlare' 143 144 def __init__(self, trigger, effect = None, graphicFile = None): 145 super(CapsuleFlare, self).__init__(trigger, effect, graphicFile) 146 self.gfxPath = graphicFile 147 self.gfx = self.ship = None 148 shipBall = self.fxSequencer.GetBall(trigger.shipID) 149 if shipBall is not None: 150 self.ship = shipBall.GetModel() 151 152 def Prepare(self): 153 self.gfx = self.RecycleOrLoad(self.gfxPath) 154 if self.gfx is None: 155 raise RuntimeError('CapsuleFlare: no effect defined: %s' % getattr(self, 'graphicFile', 'None')) 156 if self.gfx.translation is not None and self.ship is not None: 157 self.gfx.translation = self.ship.worldPosition 158 self.AddToScene(self.gfx) 159 self.gfx.StartControllers() 160 161 def Start(self, duration): 162 if self.gfx is None: 163 raise RuntimeError('CapsuleFlare: no effect defined: %s' % getattr(self, 'graphicFile', 'None')) 164 165 def Stop(self, reason = STOP_REASON_DEFAULT): 166 if self.gfx is None: 167 raise RuntimeError('CapsuleFlare: no effect defined: ' + str(getattr(self, 'graphicFile', 'None'))) 168 self.RemoveFromScene(self.gfx) 169 self.gfx = None 170 171 def _GetPoseID(self): 172 defaultPosID = 0 173 if not isinstance(self.graphicInfo, dict): 174 return defaultPosID 175 return self.graphicInfo.get('poseID', defaultPosID) 176 177 178 def _CreateShipSizeClassLookUpTable(): 179 sizeMapping = [[invC.groupCorvette, 180 invC.groupShuttle, 181 invC.groupFrigate, 182 invC.groupAssaultFrigate], 183 [invC.groupInterceptor, 184 invC.groupCommandDestroyer, 185 invC.groupTacticalDestroyer, 186 invC.groupDestroyer], 187 [invC.groupCruiser, 188 invC.groupBlockadeRunner, 189 invC.groupStealthBomber, 190 invC.groupLogisticsFrigate, 191 invC.groupCombatReconShip, 192 invC.groupCommandShip, 193 invC.groupElectronicAttackShips], 194 [invC.groupBattlecruiser, 195 invC.groupAttackBattlecruiser, 196 invC.groupInterdictor, 197 invC.groupHeavyAssaultCruiser, 198 invC.groupHeavyInterdictors, 199 invC.groupStrategicCruiser, 200 invC.groupBlackOps, 201 invC.groupMarauders, 202 invC.groupExpeditionCommandShip], 203 [invC.groupBattleship, 204 invC.groupJumpFreighter, 205 invC.groupLogistics, 206 invC.groupDreadnought, 207 invC.groupTitan, 208 invC.groupCarrier, 209 invC.groupSupercarrier, 210 invC.groupCommandCarrier, 211 invC.groupForceAux, 212 invC.groupLancerDreadnought]] 213 classMapping = [] 214 for i in range(0, len(sizeMapping)): 215 classMapping = classMapping + [i] * len(sizeMapping[i]) 216 217 return dict(zip(sum(sizeMapping, []), classMapping)) 218 219 220 SHIP_SIZE_CLASS_LOOKUP_DICTIONARY = _CreateShipSizeClassLookUpTable()