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()