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

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)