MicroJumpDrive.py (4936B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\environment\effects\MicroJumpDrive.py 2 from eve.client.script.environment.effects.GenericEffect import GenericEffect, ShipEffect, STOP_REASON_BALL_REMOVED, STOP_REASON_DEFAULT 3 import trinity 4 import blue 5 import uthread 6 SECOND = 1000 7 CAMERA_RESET_TIME = 1500 8 MICRO_JUMP_DRIVE_GRAPHIC_ID = 21232 9 MICRO_JUMP_FIELD_GRAPHIC_ID = 21235 10 MICROJUMPDRIVE_SOUND_EVENTS = {MICRO_JUMP_DRIVE_GRAPHIC_ID: 'microjumpdrive_jump_play', 11 MICRO_JUMP_FIELD_GRAPHIC_ID: 'ship_effect_microjump_fieldgenerator_jump_play'} 12 13 class MicroJumpDriveEngage(ShipEffect): 14 __guid__ = 'effects.MicroJumpDriveEngage' 15 16 def __init__(self, trigger, *args): 17 ShipEffect.__init__(self, trigger, *args) 18 self.playerEffect = None 19 self.graphicID = None if args[0] is None else getattr(args[0], 'graphicID', None) 20 21 def Prepare(self): 22 ShipEffect.Prepare(self, False) 23 if session.shipid == self.GetEffectShipID(): 24 self.playerEffect = self.RecycleOrLoad(self.secondaryGraphicFile) 25 self.AddSoundToEffect(2) 26 27 def Stop(self, reason = STOP_REASON_DEFAULT): 28 if reason == STOP_REASON_BALL_REMOVED: 29 ShipEffect.Stop(self, reason) 30 31 def _DelayedStop(self, delay): 32 blue.synchro.SleepSim(delay) 33 if self.playerEffect is not None: 34 self.RemoveFromScene(self.playerEffect) 35 self.playerEffect = None 36 if self.gfx is not None: 37 ShipEffect.Stop(self) 38 39 def Start(self, duration): 40 if self.gfx is None: 41 raise RuntimeError('MicroJumpDriveEngage: no effect defined:' + self.__guid__) 42 self.curveSets = self.gfx.curveSets 43 self.controllerCurve = None 44 length = 0 45 for each in self.gfx.curveSets: 46 length = max(each.GetMaxCurveDuration() * 1000, length) 47 each.Play() 48 if each.name == 'PLAY_START': 49 self.controllerCurve = each.curves[0] 50 51 self.AddToScene(self.gfxModel) 52 if self.playerEffect is None: 53 self._SetCurveTime(duration * 0.001) 54 else: 55 self._SetCurveTime(duration * 0.001 - 0.25) 56 length = 0 57 for each in self.playerEffect.curveSets: 58 length = max(each.GetMaxCurveDuration() * 1000, length) 59 each.Stop() 60 61 triggerDelayPlayer = duration - length 62 uthread.new(self._TriggerPlaybackPlayer, triggerDelayPlayer) 63 uthread.new(self._DelayedStop, duration + 2 * SECOND) 64 65 def _SetCurveTime(self, duration): 66 k1 = list(self.controllerCurve.keys[-1]) 67 k2 = list(self.controllerCurve.keys[-2]) 68 timeDelta = k1[0] - k2[0] 69 k1[0] = duration 70 k2[0] = duration - timeDelta 71 self.controllerCurve.keys[-1] = tuple(k1) 72 self.controllerCurve.keys[-2] = tuple(k2) 73 self.controllerCurve.OnKeysChanged() 74 75 def _TriggerPlaybackPlayer(self, delay): 76 blue.synchro.SleepSim(delay - CAMERA_RESET_TIME) 77 cam = sm.GetService('sceneManager').GetActiveSpaceCamera() 78 if cam.GetLookAtItemID() != session.shipid: 79 cam.LookAt(session.shipid) 80 blue.synchro.SleepSim(CAMERA_RESET_TIME) 81 self.AddToScene(self.playerEffect) 82 for each in self.playerEffect.curveSets: 83 each.Play() 84 85 soundEvent = MICROJUMPDRIVE_SOUND_EVENTS.get(self.graphicID, None) 86 if soundEvent is not None: 87 sm.GetService('audio').SendUIEvent(soundEvent) 88 89 90 class MicroJumpDriveJump(GenericEffect): 91 __guid__ = 'effects.MicroJumpDriveJump' 92 93 def __init__(self, trigger, *args): 94 GenericEffect.__init__(self, trigger, *args) 95 self.position = trigger.graphicInfo 96 self.gfxModel = None 97 98 def Prepare(self): 99 self.ball = self._SpawnClientBall(self.position) 100 gfx = self.RecycleOrLoad(self.graphicFile) 101 if gfx is None: 102 return 103 model = getattr(self.GetEffectShipBall(), 'model', None) 104 if model is None: 105 return 106 radius = model.GetBoundingSphereRadius() 107 gfx.scaling = (radius, radius, radius) 108 self.gfxModel = trinity.EveRootTransform() 109 self.gfxModel.children.append(gfx) 110 self.gfxModel.boundingSphereRadius = radius 111 self.gfxModel.translationCurve = self.ball 112 self.sourceObject = self.gfxModel 113 self.gfx = gfx 114 self.AddSoundToEffect(2) 115 116 def Start(self, duration): 117 if self.gfxModel is not None: 118 self.AddToScene(self.gfxModel) 119 120 def Stop(self, reason = STOP_REASON_DEFAULT): 121 self._DestroyClientBall(self.ball) 122 self.ball = None 123 self.sourceObject = None 124 self.gfx = None 125 if self.gfxModel is not None: 126 self.RemoveFromScene(self.gfxModel) 127 self.gfxModel.translationCurve = None 128 self.gfxModel = None