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

baseActivationController.py (5714B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\abyss\baseActivationController.py
      2 import abc
      3 import abyss
      4 import blue
      5 import eveexceptions
      6 import signals
      7 import threadutils
      8 import uthread
      9 
     10 class BaseActivationController(object):
     11     __metaclass__ = abc.ABCMeta
     12     __notifyevents__ = ['OnAddFX',
     13      'OnPvpTimerUpdate',
     14      'OnInvulnCancelled',
     15      'OnInvulunOnUndockingUpdated',
     16      'OnRemoveFX',
     17      'OnRestoringInvulnUpdated',
     18      'OnSafetyLevelChanged',
     19      'OnSessionChanged',
     20      'OnSlimItemChange',
     21      'OnClientEvent_WarpStarted',
     22      'OnClientEvent_WarpFinished',
     23      'ProcessActiveShipChanged']
     24     _monitoredEffects = ('effects.Cloak', 'effects.CloakingCovertOps', 'effects.CloakingPrototype', 'effects.CloakingWarpSafe', 'effects.CloakNoAmim', 'effects.Tethering', 'effects.Uncloak')
     25 
     26     def __init__(self, itemID, validator):
     27         self._errors = None
     28         self._isFinished = False
     29         self._isActivating = False
     30         self._itemID = itemID
     31         self._remote_errors = []
     32         self._sessionChangeThread = None
     33         self._validator = validator
     34         self.onChange = signals.Signal(signalName='onChange')
     35         sm.RegisterNotify(self)
     36 
     37     @abc.abstractmethod
     38     def GetText(self):
     39         pass
     40 
     41     @abc.abstractmethod
     42     def _Validate(self):
     43         pass
     44 
     45     @abc.abstractmethod
     46     def _Activate(self):
     47         pass
     48 
     49     @property
     50     def errors(self):
     51         if self._errors is None:
     52             self.Validate()
     53         return set(self._errors + self._remote_errors)
     54 
     55     @property
     56     def itemID(self):
     57         return self._itemID
     58 
     59     @property
     60     def isFinished(self):
     61         return self._isFinished
     62 
     63     @property
     64     def isActivating(self):
     65         return self._isActivating
     66 
     67     @property
     68     def isReady(self):
     69         return not self._errors and not self.isActivating and not self.isFinished
     70 
     71     @property
     72     def isSuspicious(self):
     73         return self._validator.is_suspicious()
     74 
     75     def Validate(self):
     76         self._remote_errors = []
     77         self._errors, existing = [], self._errors
     78         try:
     79             self._Validate()
     80         except abyss.Error as error:
     81             self._errors = error.errors
     82         except eveexceptions.UserError:
     83             raise
     84         except Exception:
     85             self._errors.append((abyss.Error.UNKNOWN_ERROR, ()))
     86             raise
     87 
     88         if any((error == abyss.Error.SESSION_CHANGE_IN_PROGRESS for error, args in self._errors)):
     89             self.ValidateOnNextSessionChange()
     90         if existing != self._errors:
     91             self.onChange()
     92 
     93     @threadutils.throttled(2.0)
     94     def Activate(self):
     95         if not self.isReady:
     96             return
     97         try:
     98             self._remote_errors = []
     99             self._isActivating = True
    100             self.onChange()
    101             activateTasklet = uthread.newJoinable(self._Activate)
    102             uthread.waitForJoinable(activateTasklet, timeout=None)
    103         except eveexceptions.UserError as error:
    104             if error.msg == 'AbyssError':
    105                 self._remote_errors = error.dict['errors']
    106             else:
    107                 raise
    108         except Exception:
    109             self._remote_errors = [(abyss.Error.UNKNOWN_ERROR, ())]
    110             raise
    111         finally:
    112             self._isActivating = False
    113             self.onChange()
    114 
    115     def Close(self):
    116         sm.UnregisterNotify(self)
    117         self.onChange.clear()
    118 
    119     def OnAddFX(self, effectGuid, ballID):
    120         if ballID == session.shipid and effectGuid in self._monitoredEffects:
    121             if effectGuid == 'effects.Cloak':
    122                 self._validator.set_cloaking(True)
    123             self.Validate()
    124 
    125     def OnInvulnCancelled(self, shipID):
    126         if shipID == session.shipid:
    127             self._validator.set_invulnerable(False)
    128             self.Validate()
    129 
    130     def OnInvulunOnUndockingUpdated(self, shipID, endTime, duration):
    131         if shipID == session.shipid:
    132             self._validator.set_invulnerable(True)
    133             self.Validate()
    134 
    135     def OnPvpTimerUpdate(self, state, expiryTime):
    136         self.Validate()
    137 
    138     def OnRemoveFX(self, effectGuid, ballID):
    139         if ballID == session.shipid and effectGuid in self._monitoredEffects:
    140             if effectGuid == 'effects.Cloak':
    141                 self._validator.set_cloaking(False)
    142             self.Validate()
    143 
    144     def OnRestoringInvulnUpdated(self, shipID, endTime, duration):
    145         if shipID == session.shipid:
    146             self._validator.set_invulnerable(True)
    147             self.Validate()
    148 
    149     def OnSafetyLevelChanged(self, safetyLevel):
    150         self.Validate()
    151 
    152     def OnSessionChanged(self, isRemote, session, change):
    153         if any((x in change for x in ('structureid', 'stationid'))):
    154             self._isFinished = True
    155         self.Validate()
    156         if session.nextSessionChange is not None and not self.isFinished:
    157             self.ValidateOnNextSessionChange()
    158 
    159     def OnSlimItemChange(self, oldSlim, newSlim):
    160         if newSlim.itemID in (session.shipid, self._validator.get_gate_id()):
    161             self.Validate()
    162 
    163     def OnClientEvent_WarpStarted(self, *args):
    164         self.Validate()
    165 
    166     def OnClientEvent_WarpFinished(self, *args):
    167         self.Validate()
    168 
    169     def ValidateOnNextSessionChange(self):
    170         if self._sessionChangeThread is not None:
    171             return
    172         self._sessionChangeThread = uthread.new(self._ValidateOnNextSessionChange)
    173 
    174     def _ValidateOnNextSessionChange(self):
    175         while blue.os.GetSimTime() < session.nextSessionChange:
    176             blue.synchro.Yield()
    177 
    178         self.Validate()
    179         self._sessionChangeThread = None
    180 
    181     def ProcessActiveShipChanged(self, shipID, oldShipID):
    182         self.Validate()