ProximityEffect.py (3584B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\environment\effects\ProximityEffect.py 2 import logging 3 from eve.client.script.environment.effects.GenericEffect import GenericEffect 4 import eve.client.script.environment.spaceObject.ship as ship 5 import trinity 6 import os.path as path 7 8 class ProximityEffect(GenericEffect): 9 __guid__ = 'effects.ProximityEffect' 10 11 def __init__(self, trigger, effect = None, graphicFile = None): 12 super(ProximityEffect, self).__init__(trigger, effect, graphicFile) 13 self.log = logging.getLogger(__name__) 14 self.log.info('ProximityEffect: Initialize') 15 self.shipBall = None 16 self.targetMap = dict() 17 fileName = path.basename(self.graphicFile) 18 self.fxName = path.splitext(fileName)[0].lower() 19 20 def Prepare(self): 21 self.log.info('ProximityEffect::Prepare') 22 self.DoPrepare() 23 24 def DoPrepare(self): 25 self.shipBall = self.GetEffectShipBall() 26 newTargets = set(self._GetTargetBalls(self.shipBall)) 27 for ball in newTargets: 28 if ball.model is not None: 29 self._AddEffectToTarget(ball) 30 31 self.log.info('ProximityEffect::DoPrepare() added effect to targets') 32 33 def _GetTargetBalls(self, sourceBall): 34 ballpark = sm.GetService('michelle').GetBallpark() 35 targetBalls = ballpark.GetBallsInRange(sourceBall.id, self.graphicInfo['radius']) 36 targetIDs = set([ x for x in targetBalls if x > 0 ]) 37 targetBalls = [] 38 for targetID in targetIDs: 39 targetBall = sm.GetService('michelle').GetBall(targetID) 40 targetBalls.append(targetBall) 41 42 return targetBalls 43 44 def _AddEffectToTarget(self, targetBall): 45 if not hasattr(targetBall, 'model') or targetBall.model is None: 46 return False 47 if not isinstance(targetBall, ship.Ship): 48 return False 49 if len(targetBall.model.effectChildren) > 0: 50 for child in targetBall.model.effectChildren: 51 if child.name.lower() == self.fxName: 52 return False 53 54 try: 55 effect = trinity.Load(self.graphicFile) 56 self.targetMap[targetBall] = effect 57 targetBall.AddChildEffect(effect) 58 return True 59 except AttributeError: 60 return False 61 62 def Stop(self, reason = None): 63 self.log.info('ProximityEffect: Stop') 64 try: 65 self.shipBall.model.SetControllerVariable('DisplayMe', 0.0) 66 except AttributeError: 67 pass 68 69 for each in self.targetMap.iteritems(): 70 targetBall = each[0] 71 effect = each[1] 72 targetBall.RemoveChildEffect(effect) 73 74 self.shipBall = None 75 self.targetMap = None 76 77 def Repeat(self, duration): 78 self.log.info('ProximityEffect: Repeat') 79 targetsInRange = set(self._GetTargetBalls(self.shipBall)) 80 for targetBall in targetsInRange: 81 self._AddEffectToTarget(targetBall) 82 83 targetsOutsideRange = [ x for x in self.targetMap.keys() if x not in targetsInRange ] 84 self.CleanupShipEffects(targetsOutsideRange) 85 self.UpdateControllers() 86 87 def UpdateControllers(self): 88 self.shipBall.model.SetControllerVariable('visual_active', float(bool(self.targetMap))) 89 90 def CleanupShipEffects(self, targets): 91 for target in targets: 92 effect = self.targetMap[target] 93 target.RemoveChildEffect(effect) 94 95 for target in targets: 96 self.targetMap.pop(target)