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

fighterabilities.py (6448B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\behaviors\actions\fighterabilities.py
      2 from ballpark.const import DESTINY_MODE_FOLLOW, DESTINY_MODE_WARP
      3 from behaviors.actions.effects import logger
      4 from behaviors.behaviortree import UnrecoverableBehaviorError
      5 from behaviors.entity import NPCWarpError
      6 from behaviors.tasks import Task
      7 from ccpProfile import TimedFunction
      8 from eve.common.lib.appConst import ACT_IDX_START, ACT_IDX_DURATION
      9 from eve.common.script.mgt.fighterConst import TUBE_STATE_INSPACE
     10 from eve.server.script.mgt.fighters import GetAbilityRegistryForSolarsystem, GetControlledFighterRegistryForSolarsystem, GetTubeLoaderForSolarsystem, GetFighterClientNotifierSingleton
     11 from eve.server.script.mgt.fighters.abilities.activators import StartFighterAbilityDogmaEffect
     12 from eveexceptions import UserError
     13 from fighters import MAX_SCOOP_DISTANCE, FIGHTER_MIN_WARP_DISTANCE
     14 
     15 class ActivateAbilityEffectBaseTask(Task):
     16 
     17     def GetSelfAsItem(self):
     18         return self.context.ballpark.inventory2.GetItem(self.context.myItemId)
     19 
     20     def GetTargetAsItem(self, targetId):
     21         return self.context.ballpark.inventory2.GetItem(targetId)
     22 
     23     @TimedFunction('behaviors::actions::fighterAbilities::ActivateAbilityEffectBaseTask::OnEnter')
     24     def OnEnter(self):
     25         self.SetStatusToFailed()
     26         self.SendBlackboardValue(self.attributes.failureReasonAddress, None)
     27         if self.ActivateAbility():
     28             self.SetStatusToSuccess()
     29             startTime, durationMs = self._GetEffectCycleTiming()
     30             abilityRegistry = GetAbilityRegistryForSolarsystem(self.context.ballpark.solarsystemID)
     31             abilityRegistry.OnAbilityActivationSucceeded(self.context.myItemId, self.attributes.abilitySlotID, startTime, durationMs)
     32 
     33     def ActivateAbility(self):
     34         raise NotImplementedError()
     35 
     36     def _GetEffectCycleTiming(self):
     37         effectID = self.GetLastBlackboardValue(self.attributes.effectIDAddress)
     38         activationData = self.context.dogmaLM.GetActiveEffectData(self.context.myItemId, effectID)
     39         startTime = activationData[ACT_IDX_START]
     40         durationMs = activationData[ACT_IDX_DURATION]
     41         return (startTime, durationMs)
     42 
     43     @TimedFunction('behaviors::actions::fighterAbilities::ActivateAbilityEffectBaseTask::TryActivateEffect')
     44     def TryActivateEffect(self, targetID):
     45         activated = False
     46         selfItem = self.GetSelfAsItem()
     47         if selfItem is None:
     48             return False
     49         effectID = self.GetAbilityEffectID()
     50         if effectID is None:
     51             return False
     52         if targetID is not None:
     53             targetItem = self.GetTargetAsItem(targetID)
     54             if targetItem is None:
     55                 return False
     56             if not self.IsTargetWithinEffectRange(effectID, targetID):
     57                 return False
     58         try:
     59             abilityRegistry = GetAbilityRegistryForSolarsystem(self.context.ballpark.solarsystemID)
     60             activationContext = abilityRegistry.GetActivationContext(self.context.myItemId, self.attributes.abilitySlotID)
     61             if activationContext is not None:
     62                 StartFighterAbilityDogmaEffect(effectID, activationContext, targetID)
     63                 activated = True
     64         except UserError as e:
     65             logger.debug('Entity: %s - failed to activate effect: %s', self.context.myItemId, effectID)
     66             self.SendBlackboardValue(self.attributes.failureReasonAddress, e)
     67 
     68         return activated
     69 
     70     def GetAbilityEffectID(self):
     71         selfItem = self.GetSelfAsItem()
     72         typeID = selfItem.typeID
     73         effectID = self.GetLastBlackboardValue(self.attributes.effectIDAddress)
     74         if effectID is None:
     75             return
     76         if not self.context.ballpark.dogmaLM.dogmaStaticMgr.TypeHasEffect(typeID, effectID):
     77             return
     78         return effectID
     79 
     80     @TimedFunction('behaviors::actions::fighterAbilities::ActivateAbilityEffectBaseTask::IsTargetWithinEffectRange')
     81     def IsTargetWithinEffectRange(self, effectID, targetId):
     82         effect = self.context.ballpark.dogmaLM.dogmaStaticMgr.GetEffect(effectID)
     83         if not effect.falloffAttributeID and effect.rangeAttributeID is not None:
     84             distance = self.context.ballpark.GetSurfaceDist(self.context.myItemId, targetId)
     85             typeEffectRange = self.context.ballpark.dogmaLM.GetAttributeValue(self.context.myItemId, effect.rangeAttributeID)
     86             if distance > typeEffectRange:
     87                 return False
     88         return True
     89 
     90 
     91 class ActivateAbilityEffectOnPoint(ActivateAbilityEffectBaseTask):
     92 
     93     def ActivateAbility(self):
     94         targetPoint = self.GetLastBlackboardValue(self.attributes.targetPoint)
     95         if targetPoint is None:
     96             return False
     97         return self.TryActivateEffect(None)
     98 
     99 
    100 class StopAbilityEffectOnTarget(Task):
    101 
    102     @TimedFunction('behaviors::actions::fighterAbilities::StopAbilityEffectOnTarget::OnEnter')
    103     def OnEnter(self):
    104         self.SetStatusToSuccess()
    105         fighterID = self.context.myItemId
    106         item = self.context.ballpark.inventory2.GetItem(fighterID)
    107         effectID = self.GetLastBlackboardValue(self.attributes.effectIDAddress)
    108         if effectID is not None:
    109             if self.context.dogmaLM.dogmaStaticMgr.TypeHasEffect(item.typeID, effectID):
    110                 self.TryStopEffect(fighterID, effectID)
    111 
    112     @TimedFunction('behaviors::actions::fighterAbilities::StopAbilityEffectOnTarget::TryStopEffect')
    113     def TryStopEffect(self, fighterID, effectID):
    114         try:
    115             if self.context.dogmaLM.GetActiveEffectData(fighterID, effectID) is None:
    116                 failureReason = self.GetLastBlackboardValue(self.attributes.failureReasonAddress)
    117                 abilityRegistry = GetAbilityRegistryForSolarsystem(self.context.ballpark.solarsystemID)
    118                 abilityRegistry.OnAbilityDeactivated(fighterID, self.attributes.abilitySlotID, failureReason)
    119             else:
    120                 self.context.dogmaLM.StopEffect(effectID, fighterID)
    121         except UserError:
    122             pass
    123 
    124 
    125 class NotifyAbilityActivationFailure(Task):
    126 
    127     @TimedFunction('behaviors::actions::fighterAbilities::NotifyAbilityActivationFailure::OnEnter')
    128     def OnEnter(self):
    129         self.SetStatusToSuccess()
    130         abilityRegistry = GetAbilityRegistryForSolarsystem(self.context.ballpark.solarsystemID)
    131         abilityRegistry.OnAbilityActivationFailed(self.context.myItemId, self.attributes.abilitySlotID)