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)