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

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()