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

fleet.py (7658B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\behaviors\actions\fleet.py
      2 import logging
      3 from ballpark.const import DESTINY_MODE_WARP
      4 from ballpark.messenger.const import MESSAGE_ON_BALL_MODE_CHANGED
      5 from ballpark.warpFormations import FormationPicker
      6 from behaviors.groups.mixin import GroupTaskMixin
      7 from behaviors.tasks import BlockingTask
      8 from behaviors.tasks import Task
      9 from eve.common.script.sys.idCheckers import IsEvePlayerCharacter
     10 logger = logging.getLogger(__name__)
     11 
     12 class FormationWarpGroup(Task, GroupTaskMixin):
     13 
     14     def OnEnter(self):
     15         self.SetStatusToFailed()
     16         formation_picker = self.get_formation_picker()
     17         formation_destination_coordinates = formation_picker.GetDestinationVectors()
     18         jitter_radius = formation_picker.GetJitterRadius()
     19         min_range = formation_picker.GetMinimumRange()
     20         warp_speed = formation_picker.GetMinWarpSpeed()
     21         for ship_id, char_id in formation_picker.GetFleetCandidates():
     22             destination_coordinate = formation_destination_coordinates[ship_id]
     23             if char_id:
     24                 if self.context.ballpark.CancelIfDoingStuff(ship_id):
     25                     logger.error('char %s in ship %s unable to do warp due to CancelIfDoingStuff', char_id, ship_id)
     26                     continue
     27                 self.warp_player(ship_id, destination_coordinate, jitter_radius, min_range, warp_speed)
     28             else:
     29                 self.warp_npc(ship_id, destination_coordinate, jitter_radius, min_range, warp_speed)
     30 
     31         self.SetStatusToSuccess()
     32 
     33     def warp_player(self, ship_id, destination_coordinate, jitter_radius, min_range, warp_speed):
     34         logger.info('fleet warp player: ship_id=%s destination_coordinate=%s jitter_radius=%s min_range=%s warp_speed=%s', ship_id, destination_coordinate, jitter_radius, min_range, warp_speed)
     35         if self.context.ballpark.CancelIfDoingStuff(ship_id):
     36             logger.warning('%s unable to do warp due to CancelIfDoingStuff', ship_id)
     37             return
     38         self.context.ballpark.WarpTo(ship_id, destination_coordinate, minRange=min_range, cheatWarp=False, warpSpeed=warp_speed, jitterRadius=jitter_radius)
     39 
     40     def warp_npc(self, ship_id, destination_coordinate, jitter_radius, min_range, warp_speed):
     41         logger.info('fleet warp npc: ship_id=%s destination_coordinate=%s jitter_radius=%s min_range=%s warp_speed=%s', ship_id, destination_coordinate, jitter_radius, min_range, warp_speed)
     42         ball = self.context.ballpark.balls.get(ship_id)
     43         if ball is None:
     44             logger.warning('Item %s was not found in ballpark', ship_id)
     45             return
     46         if not hasattr(ball, 'NPCWarpTo'):
     47             logger.warning("Item %s does not support 'NPCWarpTo' in order that a behavior fleet warp", ship_id)
     48             return
     49         try:
     50             ball.NPCWarpTo(destination_coordinate, jitterRadius=jitter_radius, warpAtRange=min_range, warpSpeed=warp_speed)
     51         except Exception as e:
     52             logger.exception('item %s failed to warp' % ship_id)
     53 
     54     def get_formation_picker(self):
     55         destination_coordinates = self.GetLastBlackboardValue(self.attributes.destinationCoordinatesAddress)
     56         jump_candidates = self.get_fleet_warp_candidates()
     57         fleet_formation_settings = self.get_formation_settings()
     58         formation_picker = FormationPicker(self.context.ballpark, jump_candidates[0][0], None, destination_coordinates, jump_candidates, 0.0, None, fleet_formation_settings, applySkills=False)
     59         formation_picker.validateFormation = lambda *args: None
     60         return formation_picker
     61 
     62     def get_formation_settings(self):
     63         return {'formationType': self.attributes.formationType,
     64          'formationSpacing': self.attributes.formationSpacing,
     65          'formationSize': self.attributes.formationSize}
     66 
     67     def get_fleet_warp_candidates(self):
     68         fleet_warp_candidates = {member_id:None for member_id in self.GetMemberIdList()}
     69         self.add_additional_fleet_members(fleet_warp_candidates)
     70         return fleet_warp_candidates.items()
     71 
     72     def add_additional_fleet_members(self, fleet_warp_candidates):
     73         additional_candidates = self.GetLastBlackboardValue(self.attributes.additionalFleetMembersAddress)
     74         if additional_candidates:
     75             for member_id in additional_candidates:
     76                 if member_id in fleet_warp_candidates:
     77                     continue
     78                 char_id = None
     79                 slimitem = self.context.ballpark.slims.get(member_id)
     80                 if slimitem is None:
     81                     continue
     82                 if IsEvePlayerCharacter(slimitem.ownerID):
     83                     char_id = slimitem.ownerID
     84                 fleet_warp_candidates[member_id] = char_id
     85 
     86 
     87 class AlignFleet(Task, GroupTaskMixin):
     88 
     89     def OnEnter(self):
     90         self.SetStatusToFailed()
     91         candidates = self.get_fleet_candidates()
     92         destination_coordinates = self.GetLastBlackboardValue(self.attributes.destinationCoordinatesAddress)
     93         ballpark = self.context.ballpark
     94         for member_id in candidates:
     95             try:
     96                 ballpark.GotoPoint(member_id, *destination_coordinates)
     97                 ballpark.SetSpeedFraction(member_id, 1.0)
     98             except Exception as e:
     99                 logger.exception('Failure while trying to align object %s', member_id)
    100 
    101         self.SetStatusToSuccess()
    102 
    103     def get_fleet_candidates(self):
    104         fleet_warp_candidates = [ member_id for member_id in self.GetMemberIdList() ]
    105         self.add_additional_fleet_members(fleet_warp_candidates)
    106         return fleet_warp_candidates
    107 
    108     def add_additional_fleet_members(self, fleet_warp_candidates):
    109         additional_candidates = self.GetLastBlackboardValue(self.attributes.additionalFleetMembersAddress)
    110         if not additional_candidates:
    111             return
    112         for member_id in additional_candidates:
    113             if member_id not in self.context.ballpark.slims:
    114                 continue
    115             fleet_warp_candidates.append(member_id)
    116 
    117 
    118 class BlockWaitUntilWarpComplete(BlockingTask):
    119 
    120     def OnEnter(self):
    121         super(BlockWaitUntilWarpComplete, self).OnEnter()
    122         self.SubscribeItem(self.context.myItemId, MESSAGE_ON_BALL_MODE_CHANGED, self._destiny_mode_change)
    123         self.SetStatusToSuspended()
    124 
    125     def _destiny_mode_change(self, old_mode, new_mode):
    126         if old_mode == DESTINY_MODE_WARP and self.context.ballpark is not None:
    127             self.UnsubscribeItem(self.context.myItemId, MESSAGE_ON_BALL_MODE_CHANGED, self._destiny_mode_change)
    128             self.SetStatusToSuccess()
    129             self.OnStatusUpdate()
    130 
    131     def CleanUp(self):
    132         if not self.IsInvalid():
    133             self.UnsubscribeItem(self.context.myItemId, MESSAGE_ON_BALL_MODE_CHANGED, self._destiny_mode_change)
    134             self.SetStatusToInvalid()
    135 
    136 
    137 class WaitUntilWarpComplete(Task):
    138 
    139     def OnEnter(self):
    140         super(WaitUntilWarpComplete, self).OnEnter()
    141         self.SubscribeItem(self.context.myItemId, MESSAGE_ON_BALL_MODE_CHANGED, self._destiny_mode_change)
    142         self.SetStatusToBlocked()
    143 
    144     def _destiny_mode_change(self, old_mode, new_mode):
    145         if old_mode == DESTINY_MODE_WARP and self.context.ballpark is not None:
    146             self.UnsubscribeItem(self.context.myItemId, MESSAGE_ON_BALL_MODE_CHANGED, self._destiny_mode_change)
    147             self.SetStatusToSuccess()
    148             self.behaviorTree.StartTaskNextTick(self)
    149 
    150     def CleanUp(self):
    151         if not self.IsInvalid():
    152             self.UnsubscribeItem(self.context.myItemId, MESSAGE_ON_BALL_MODE_CHANGED, self._destiny_mode_change)
    153             self.SetStatusToInvalid()