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

pointDefense.py (5203B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\environment\effects\pointDefense.py
      2 import evetypes
      3 from eve.client.script.environment.effects.GenericEffect import GenericEffect
      4 import math
      5 
      6 class PointDefense(GenericEffect):
      7     __guid__ = 'effects.PointDefense'
      8     START_STOP_CHECK_TIME = 20000
      9 
     10     def __init__(self, trigger, *args):
     11         GenericEffect.__init__(self, trigger, *args)
     12         self.ballIDs = [trigger.shipID]
     13         self.ballpark = sm.GetService('michelle').GetBallpark()
     14         self.trigger = trigger
     15         self.gfx = None
     16         self.candidateTypes = self._GetCandidateTypesFromTypeList()
     17         self.hitRange = self._GetHitRange()
     18         self.trackTargets = self._TrackTargets()
     19         self.bulletStormEffect = None
     20         self.active = None
     21         self.activeStates = []
     22         self._nextStateIndex = None
     23 
     24     def Prepare(self):
     25         self.gfx = self.RecycleOrLoad(self.graphicFile)
     26         structureID = self.ballIDs[0]
     27         structureBall = self.fxSequencer.GetBall(structureID)
     28         fx = self.gfx.effectChildren[0]
     29         fx.sourceObject = getattr(structureBall, 'model', None)
     30         self.AddSoundToEffect(scaler=1, model=fx.sourceObject)
     31         self.gfx.translationCurve = getattr(fx.sourceObject, 'translationCurve')
     32         self.gfx.rotationCurve = getattr(fx.sourceObject, 'rotationCurve')
     33         scene = self.fxSequencer.GetScene()
     34         scene.objects.append(self.gfx)
     35         self.bulletStormEffect = self.gfx.effectChildren[0]
     36         self.bulletStormEffect.display = False
     37         self.active = False
     38         self.activeStates = [False] * int(self.START_STOP_CHECK_TIME / self.duration)
     39         self._nextStateIndex = 0
     40 
     41     def Start(self, duration):
     42         if self.gfx is not None:
     43             self.UpdateTargets()
     44 
     45     def Repeat(self, duration):
     46         if self.gfx is not None:
     47             self.UpdateTargets()
     48 
     49     def Stop(self, reason = None):
     50         if self.gfx is not None:
     51             scene = self.fxSequencer.GetScene()
     52             scene.objects.fremove(self.gfx)
     53             self.gfx = None
     54             self.bulletStormEffect = None
     55             self.SendAudioEvent('point_defense_battery_stop')
     56 
     57     def AddState(self, state):
     58         self.activeStates[self._nextStateIndex] = state
     59         self._nextStateIndex = int(math.fmod(self._nextStateIndex + 1, len(self.activeStates)))
     60 
     61     def ShouldChangeState(self):
     62         states = [ state != self.active for state in self.activeStates ]
     63         if not self.active:
     64             shouldChangeState = any(states)
     65         else:
     66             shouldChangeState = all(states)
     67         return shouldChangeState and self.bulletStormEffect.CanChangeState()
     68 
     69     def UpdateTargets(self):
     70         if isinstance(self.candidateTypes, list) and len(self.candidateTypes) == 0:
     71             self.bulletStormEffect.display = True
     72             if not self.active:
     73                 self._StartEffect()
     74             return
     75         ballIDs = self.ballpark.GetBallsInRange(self.trigger.shipID, self.hitRange)
     76         shipModels = []
     77         for bID in ballIDs:
     78             b = self.fxSequencer.GetBall(bID)
     79             m = getattr(b, 'model', None)
     80             slimItem = self.fxSequencer.GetItem(bID)
     81             if self.candidateTypes is None or getattr(slimItem, 'typeID', None) in self.candidateTypes:
     82                 if m is not None:
     83                     shipModels.append(m)
     84 
     85         self.AddState(self.candidateTypes is not None and len(shipModels) != 0)
     86         if self.ShouldChangeState():
     87             self.bulletStormEffect.display = True
     88             if not self.active:
     89                 self._StartEffect()
     90             else:
     91                 self._StopEffect()
     92         if self.trackTargets:
     93             del self.bulletStormEffect.targetObjects[:]
     94             for m in shipModels:
     95                 self.bulletStormEffect.targetObjects.append(m)
     96 
     97     def _StartEffect(self):
     98         self.bulletStormEffect.StartEffect()
     99         self.SendAudioEvent('point_defense_battery_play')
    100         self.active = True
    101 
    102     def _StopEffect(self):
    103         self.bulletStormEffect.StopEffect()
    104         self.SendAudioEvent('point_defense_battery_stop')
    105         self.active = False
    106 
    107     def _TrackTargets(self):
    108         return self.graphicInfo is None or self.graphicInfo.get('trackTargets', True)
    109 
    110     def _GetCandidateTypesFromTypeList(self):
    111         if self.graphicInfo is None or 'candidateTypeListId' not in self.graphicInfo:
    112             return
    113         candidateTypeListId = self.graphicInfo['candidateTypeListId']
    114         if candidateTypeListId < 0:
    115             return []
    116         return evetypes.GetTypeIDsByListID(candidateTypeListId)
    117 
    118     def _GetHitRange(self):
    119         empFieldRange = self.fxSequencer.GetTypeAttribute(self.trigger.moduleTypeID, const.attributeEmpFieldRange)
    120         if self.graphicInfo is None:
    121             return empFieldRange
    122         return self.graphicInfo.get('hitRange', empFieldRange)
    123 
    124     def UpdateGraphicInfo(self, newGraphicInfo):
    125         self.graphicInfo = newGraphicInfo
    126         self.candidateTypes = self._GetCandidateTypesFromTypeList()
    127         self.hitRange = self._GetHitRange()
    128         self.trackTargets = self._TrackTargets()