MultiEffect.py (5734B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\environment\effects\MultiEffect.py 2 import blue 3 from carbon.common.lib.const import MSEC 4 from eve.client.script.environment.effects.GenericEffect import GenericEffect 5 from eve.client.script.environment.effects.GenericEffect import STOP_REASON_DEFAULT 6 import logging 7 from fsdBuiltData.client.effectSequences import GetSequence, GetStops 8 from evegraphics.graphicEffects.effectPhasePlayer import PhasePlayer, GetStepsToPlayForPhase 9 log = logging.getLogger(__name__) 10 11 def GetStepNames(sequenceName, phaseName): 12 return [ s.name for s in GetStepsToPlayForPhase(sequenceName, phaseName) ] 13 14 15 def ShouldPhaseBeStoppedOnNewPhase(sequenceName, oldPhaseName, newPhaseName): 16 phases = GetSequence(sequenceName) 17 oldPhaseIndex = -1 18 newPhaseIndex = -1 19 index = 0 20 for phase in phases: 21 if phase.name == oldPhaseName: 22 oldPhaseIndex = index 23 if phase.name == newPhaseName: 24 newPhaseIndex = index 25 if oldPhaseIndex >= 0 and newPhaseIndex >= 0: 26 break 27 index += 1 28 29 if oldPhaseIndex > newPhaseIndex: 30 return True 31 steps = GetStepNames(sequenceName, oldPhaseName) 32 for phase in phases: 33 phaseStops = GetStops(phase, []) 34 if any([ s in phaseStops for s in steps ]): 35 return True 36 if phase.name == newPhaseName: 37 return False 38 39 return False 40 41 42 class EvePhasePlayer(PhasePlayer): 43 44 def GetPosition(self, objectID): 45 p = sm.GetService('michelle').GetBall(objectID).GetVectorAt(blue.os.GetSimTime()) 46 return (p.x, p.y, p.z) 47 48 def MoonMiningCreateCrater(self, step, timeElapsed, objectID): 49 targetID = self.GetStepTargetID(step) 50 target = sm.GetService('michelle').GetBall(targetID) 51 sourceID = self.GetStepSourceID(step) 52 target.SpawnImpactCrater(self.GetDirection(sourceID, targetID), self.GetScaling(step), timeElapsed / 1000.0) 53 54 def GetTurretSet(self, sourceID, turretSetID): 55 ball = sm.GetService('michelle').GetBall(sourceID) 56 if turretSetID not in ball.modules: 57 ball.UnfitHardpoints() 58 ball.FitHardpoints(blocking=True) 59 ts = ball.modules.get(turretSetID, None) 60 if ts is not None: 61 if len(ts.turretSets) > 0: 62 return ts.turretSets[0] 63 log.warning("Could not find turretset '%s' for source '%s'" % (turretSetID, sourceID)) 64 65 def GetTrinityObject(self, identifier): 66 ball = sm.GetService('michelle').GetBall(identifier) 67 if ball is not None: 68 return ball.GetModel() 69 log.warning("Could not find ball '%s'" % identifier) 70 71 def GetTranslationCurve(self, identifier): 72 ball = sm.GetService('michelle').GetBall(identifier) 73 if ball is None: 74 log.warning("Could not find ball '%s'" % identifier) 75 return 76 return ball 77 78 def GetRotationCurve(self, identifier): 79 ball = sm.GetService('michelle').GetBall(identifier) 80 if ball is None: 81 log.warning("Could not find ball '%s'" % identifier) 82 return 83 model = ball.GetModel() 84 if model is None: 85 log.warning("Could not find model '%s'" % identifier) 86 return 87 return model.rotationCurve 88 89 90 class MultiEffect(GenericEffect): 91 __guid__ = 'effects.MultiEffect' 92 93 def __init__(self, trigger, effect = None, graphicFile = None): 94 super(MultiEffect, self).__init__(trigger, effect, graphicFile) 95 graphicInfo = trigger.get('graphicInfo', {}) 96 self.sequence = graphicInfo.get('sequence') 97 phase = graphicInfo.get('phase', None) 98 currentTime = blue.os.GetSimTime() 99 self.timeFromStart = currentTime - graphicInfo.get('effectStarted', currentTime) 100 self.timeFromStart /= MSEC 101 if self.sequence is None: 102 raise RuntimeError('No sequence was given... not sure what I should do') 103 if phase is None: 104 raise RuntimeError('No phase was given... not sure what I should do') 105 self.triggerIds = {} 106 graphicInfo = trigger.get('graphicInfo') 107 if graphicInfo is not None: 108 for ID in graphicInfo['triggers']: 109 self.triggerIds[ID] = trigger.get(ID, graphicInfo.get(ID)) 110 111 self.phasePlayers = [EvePhasePlayer(self.sequence, phase, self.triggerIds)] 112 113 def Start(self, duration): 114 self.phasePlayers[0].Start(self.fxSequencer.GetScene(), timeOffset=self.timeFromStart) 115 116 def Stop(self, reason = STOP_REASON_DEFAULT): 117 for phasePlayer in self.phasePlayers: 118 phasePlayer.Stop() 119 120 self.phasePlayers = [] 121 122 def UpdateGraphicInfo(self, newGraphicInfo): 123 newPhase = newGraphicInfo.get('phase', None) 124 if newPhase is not None: 125 currentTime = blue.os.GetSimTime() 126 self.timeFromStart = currentTime - newGraphicInfo.get('effectStarted', currentTime) 127 self.timeFromStart /= MSEC 128 phasePlayersToStop = [] 129 for phasePlayer in self.phasePlayers: 130 if ShouldPhaseBeStoppedOnNewPhase(self.sequence, phasePlayer.phaseName, newPhase): 131 phasePlayersToStop.append(phasePlayer) 132 133 for phasePlayer in phasePlayersToStop: 134 p = self.phasePlayers.pop(self.phasePlayers.index(phasePlayer)) 135 p.Stop() 136 137 if newPhase not in [ p.phaseName for p in self.phasePlayers ]: 138 newPhasePlayer = EvePhasePlayer(self.sequence, newPhase, self.triggerIds) 139 self.phasePlayers.append(newPhasePlayer) 140 newPhasePlayer.Start(self.fxSequencer.GetScene(), self.timeFromStart)