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

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)