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

ballparks.py (9562B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\behaviors\conditions\ballparks.py
      2 import logging
      3 import geo2
      4 from ballpark.const import DESTINY_MODE_ORBIT
      5 from ballpark.warpDisruptionBalls import GetWarpBubbleItemIdsWithinRangeOfCoordinate
      6 from behaviors import status
      7 from behaviors.tasks import Task
      8 from behaviors.utility.ballparks import is_ball_cloaked, get_my_position, is_ball_in_park, get_ball
      9 from ccpProfile import TimedFunction
     10 from eve.common.lib.appConst import shipNotWarping, minWarpDistance
     11 from eveexceptions import UserError
     12 logger = logging.getLogger(__name__)
     13 
     14 class IsCoordinateInSameBubbleCondition(Task):
     15 
     16     @TimedFunction('behaviors::conditions::ballparks::IsCoordinateInSameBubbleCondition::OnEnter')
     17     def OnEnter(self):
     18         coordinates = self.GetLastBlackboardValue(self.attributes.coordinateAddress)
     19         returnStatus = status.TaskFailureStatus
     20         if coordinates is not None:
     21             bubbleID = self.context.ballpark.GetBubbleAtCoordinates(*coordinates)
     22             if bubbleID == self.context.myBall.newBubbleId:
     23                 returnStatus = status.TaskSuccessStatus
     24         self.status = returnStatus
     25 
     26 
     27 class IsCoordinateWithinDistance(Task):
     28 
     29     @TimedFunction('behaviors::conditions::ballparks::IsCoordinateWithinDistance::OnEnter')
     30     def OnEnter(self):
     31         coordinates = self.GetLastBlackboardValue(self.attributes.coordinateAddress)
     32         self.SetStatusToFailed()
     33         if coordinates is not None:
     34             myBall = self.context.myBall
     35             myCoordinates = (myBall.x, myBall.y, myBall.z)
     36             vecToCoord = geo2.Vec3SubtractD(coordinates, myCoordinates)
     37             distance = geo2.Vec3Length(vecToCoord)
     38             self.SetStatusToSuccessIfTrueElseToFailed(distance <= self.GetMaxDistance())
     39 
     40     def GetMaxDistance(self):
     41         return self.attributes.maxDistance
     42 
     43 
     44 class IsCoordinateWithinDistanceByAddress(IsCoordinateWithinDistance):
     45 
     46     def GetMaxDistance(self):
     47         maxDistance = self.GetLastBlackboardValue(self.attributes.maxDistanceAddress)
     48         if self.HasAttribute('fudgeDistanceAddress'):
     49             fudgeDistance = self.GetLastBlackboardValue(self.attributes.fudgeDistanceAddress)
     50             if fudgeDistance is not None:
     51                 maxDistance += self.GetLastBlackboardValue(self.attributes.fudgeDistanceAddress)
     52         return maxDistance
     53 
     54 
     55 class IsBallPresentInMyBubbleCondition(Task):
     56 
     57     def OnEnter(self):
     58         ballId = self.GetLastBlackboardValue(self.attributes.ballIdAddress)
     59         ball = self.context.ballpark.balls.get(ballId)
     60         if ball and ball.newBubbleId == self.context.myBall.newBubbleId:
     61             self.SetStatusToSuccess()
     62         else:
     63             self.SetStatusToFailed()
     64 
     65 
     66 class IsBallPresentInBubbleByAddress(Task):
     67 
     68     def OnEnter(self):
     69         bubbleId = self.GetLastBlackboardValue(self.attributes.bubbleIdAddress)
     70         ballId = self.GetLastBlackboardValue(self.attributes.ballIdAddress)
     71         ball = self.context.ballpark.balls.get(ballId)
     72         if ball and ball.newBubbleId == bubbleId:
     73             self.SetStatusToSuccess()
     74         else:
     75             self.SetStatusToFailed()
     76 
     77 
     78 class IsBallWithInDistanceCondition(Task):
     79 
     80     @TimedFunction('behaviors::conditions::ballparks::IsBallWithInDistanceCondition::OnEnter')
     81     def OnEnter(self):
     82         self.SetStatusToFailed()
     83         ballId = self.GetLastBlackboardValue(self.attributes.ballIdAddress)
     84         source_ball_id = self._get_source_ball_id()
     85         distance = self.context.ballpark.GetSurfaceDist(source_ball_id, ballId)
     86         if distance <= self.attributes.maxDistance:
     87             self.SetStatusToSuccess()
     88 
     89     def _get_source_ball_id(self):
     90         return self.context.myItemId
     91 
     92 
     93 class IsBallWithinDistanceOfBallCondition(IsBallWithInDistanceCondition):
     94 
     95     def _get_source_ball_id(self):
     96         return self.GetLastBlackboardValue(self.attributes.sourceBallIdAddress)
     97 
     98 
     99 class AreItemsWithInDistanceCondition(Task):
    100 
    101     def OnEnter(self):
    102         self.SetStatusToFailed()
    103         itemId = self.GetLastBlackboardValue(self.attributes.itemIdAddress)
    104         otherItemIdAddress = getattr(self.attributes, 'otherItemIdAddress', None)
    105         if otherItemIdAddress is None:
    106             otherItemId = self.context.myItemId
    107         else:
    108             otherItemId = self.GetLastBlackboardValue(self.attributes.otherItemIdAddress)
    109         distance = self.context.ballpark.GetSurfaceDist(itemId, otherItemId)
    110         maxDistance = self.GetLastBlackboardValue(self.attributes.maxDistanceAddress)
    111         maxDistanceMultiplier = getattr(self.attributes, 'maxDistanceMultiplier', None) or 1.0
    112         maxDistance *= maxDistanceMultiplier
    113         if distance <= maxDistance:
    114             self.SetStatusToSuccess()
    115 
    116 
    117 class IsOrbitingTargetCondition(Task):
    118 
    119     def IsOrbitingTarget(self, targetId):
    120         if targetId is None:
    121             return False
    122         if self.context.myBall.mode != DESTINY_MODE_ORBIT:
    123             return False
    124         if self.context.myBall.followId != targetId:
    125             return False
    126         return True
    127 
    128     @TimedFunction('behaviors::conditions::ballparks::IsOrbitingTargetCondition::OnEnter')
    129     def OnEnter(self):
    130         targetId = self.GetLastBlackboardValue(self.attributes.targetAddress)
    131         isOrbitingTarget = self.IsOrbitingTarget(targetId)
    132         if isOrbitingTarget:
    133             self.status = status.TaskSuccessStatus
    134         else:
    135             self.status = status.TaskFailureStatus
    136 
    137 
    138 class IsBallCloakedCondition(Task):
    139 
    140     @TimedFunction('behaviors::conditions::ballparks::IsBallCloakedCondition::OnEnter')
    141     def OnEnter(self):
    142         ballId = self.GetLastBlackboardValue(self.attributes.ballIdAddress)
    143         isCloaked = is_ball_cloaked(self, ballId)
    144         if isCloaked:
    145             self.status = status.TaskSuccessStatus
    146         else:
    147             self.status = status.TaskFailureStatus
    148 
    149 
    150 class IsBallInWarpCondition(Task):
    151 
    152     @TimedFunction('behaviors::conditions::ballparks::IsBallInWarpCondition::OnEnter')
    153     def OnEnter(self):
    154         self.SetStatusToFailed()
    155         ballId = self.GetLastBlackboardValue(self.attributes.ballIdAddress)
    156         try:
    157             warpState = self.context.ballpark.IsWarping(ballId)
    158             if warpState != shipNotWarping:
    159                 self.SetStatusToSuccess()
    160         except UserError:
    161             pass
    162 
    163 
    164 class IsLocationWithinWarpDistance(Task):
    165 
    166     @TimedFunction('behaviors::conditions::ballparks::IsBallWithinWarpDistance::OnEnter')
    167     def OnEnter(self):
    168         self.SetStatusToFailed()
    169         targetCoordinates = self.GetLastBlackboardValue(self.attributes.coordinateAddress)
    170         if targetCoordinates:
    171             myCoordinates = (self.context.myBall.x, self.context.myBall.y, self.context.myBall.z)
    172             distance = geo2.Vec3DistanceD(targetCoordinates, myCoordinates)
    173             if distance > minWarpDistance:
    174                 self.SetStatusToSuccess()
    175 
    176 
    177 class IsBallWithinWarpDistance(Task):
    178 
    179     @TimedFunction('behaviors::conditions::ballparks::IsBallWithinWarpDistance::OnEnter')
    180     def OnEnter(self):
    181         self.SetStatusToFailed()
    182         target_ball_id = self.GetLastBlackboardValue(self.attributes.ballIdAddress)
    183         if not is_ball_in_park(self, target_ball_id):
    184             return
    185         distance = self.context.ballpark.GetSurfaceDist(target_ball_id, self.context.myBall.id)
    186         if distance > minWarpDistance:
    187             self.SetStatusToSuccess()
    188 
    189 
    190 class HasValidBallTarget(Task):
    191 
    192     @TimedFunction('behaviors::conditions::ballparks::HasValidBallTarget::OnEnter')
    193     def OnEnter(self):
    194         self.SetStatusToFailed()
    195         hasBall = self.context.ballpark.HasBall(self.GetLastBlackboardValue(self.attributes.ballIdAddress))
    196         if hasBall:
    197             self.SetStatusToSuccess()
    198 
    199 
    200 class IsPathToCoordinatesClearOfBubbles(Task):
    201 
    202     @TimedFunction('behaviors::conditions::ballparks::IsPathToCoordinatesClearOfBubbles::OnEnter')
    203     def OnEnter(self):
    204         self.SetStatusToFailed()
    205         coordinates = self._get_my_warp_to_coordinates()
    206         if coordinates is None:
    207             return
    208         if self._is_path_to_coordinates_clear(coordinates):
    209             self.SetStatusToSuccess()
    210 
    211     def _get_my_warp_to_coordinates(self):
    212         return self.GetLastBlackboardValue(self.attributes.coordinateAddress)
    213 
    214     def _is_path_to_coordinates_clear(self, coordinates):
    215         try:
    216             warp_disruptor_id, _ = self._get_closest_warp_disruptor_and_intersection_in_path(coordinates)
    217         except UserError:
    218             logger.debug('Behavior=%s for entity=%s warp path blocked by bubble that is too close to entity for warping there', self.behaviorTree.GetBehaviorId(), self.context.myItemId)
    219             return False
    220 
    221         if warp_disruptor_id is None:
    222             return True
    223         return self._is_warp_disruptor_at_end_coordinate(warp_disruptor_id, coordinates)
    224 
    225     def _get_closest_warp_disruptor_and_intersection_in_path(self, coordinates):
    226         return self.context.ballpark.GetClosestDisruptorAndIntersectionInWarpPath(get_my_position(self), coordinates)
    227 
    228     def _is_warp_disruptor_at_end_coordinate(self, warp_disruptor_id, coordinates):
    229         warp_disruption_probe_ids, warp_disruption_ship_ids = self._get_warp_bubble_ids_at_coordinates(coordinates)
    230         return warp_disruptor_id in warp_disruption_probe_ids or warp_disruptor_id in warp_disruption_ship_ids
    231 
    232     def _get_warp_bubble_ids_at_coordinates(self, coordinates):
    233         return GetWarpBubbleItemIdsWithinRangeOfCoordinate(self.context.ballpark, coordinates)