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