logistics.py (3541B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\behaviors\monitors\logistics.py 2 from ballpark.messenger.const import MESSAGE_ON_EFFECT_STOPPED 3 from behaviors.groups.mixin import GroupTaskMixin 4 from behaviors.tasks import Task 5 from behaviors.utility.dogmatic import is_my_effect_active, get_my_locked_targets, try_activate_effect 6 from behaviors.utility.logistics import get_damage_state_function_by_effect_id, get_damage_state_modifier, get_base_logistics_priority 7 from evemath import weighted_choice 8 import logging 9 from ccpProfile import TimedFunction 10 logger = logging.getLogger(__name__) 11 12 class ManageRemoteRepairEffect(Task, GroupTaskMixin): 13 14 @TimedFunction('behaviors::monitors::logistics::ManageRemoteRepairEffect::OnEnter') 15 def OnEnter(self): 16 self.repair_effect_id = self.GetLastBlackboardValue(self.attributes.repairEffectIdAddress) 17 self._get_damage_state = get_damage_state_function_by_effect_id(self.repair_effect_id) 18 if not is_my_effect_active(self, self.repair_effect_id): 19 self._apply_effect_on_best_target() 20 self._start_monitor_effect() 21 self.SetStatusToSuccess() 22 23 def CleanUp(self): 24 self._stop_monitoring_effects() 25 self.SetStatusToInvalid() 26 27 def _start_monitor_effect(self): 28 self.SubscribeItem(self.context.myItemId, MESSAGE_ON_EFFECT_STOPPED, self._apply_effect_on_best_target_if_repair_effect) 29 30 def _stop_monitoring_effects(self): 31 self.UnsubscribeItem(self.context.myItemId, MESSAGE_ON_EFFECT_STOPPED, self._apply_effect_on_best_target_if_repair_effect) 32 33 def _apply_effect_on_best_target_if_repair_effect(self, effect_id): 34 if effect_id != self.repair_effect_id: 35 return 36 self._apply_effect_on_best_target() 37 38 @TimedFunction('behaviors::monitors::logistics::ManageRemoteRepairEffect::_apply_effect_on_best_target') 39 def _apply_effect_on_best_target(self): 40 prioritized_watchlist = self.GetLastBlackboardValue(self.attributes.prioritizedWatchlistAddress) 41 if not prioritized_watchlist: 42 logger.debug('ManageRemoteRepairEffect: %s has no prioritized watchlist to work with', self.context.myItemId) 43 return 44 locked_target_ids = get_my_locked_targets(self) 45 if not locked_target_ids: 46 logger.debug('ManageRemoteRepairEffect: %s has no locked targets to work with', self.context.myItemId) 47 return 48 candidates = self._generate_candidates(locked_target_ids, prioritized_watchlist) 49 if not candidates: 50 logger.debug('ManageRemoteRepairEffect: %s found no suitable candidates', self.context.myItemId) 51 return 52 item_id = weighted_choice(candidates) 53 try_activate_effect(self, self.repair_effect_id, 0, target_id=item_id) 54 logger.debug('ManageRemoteRepairEffect: %s activated effect %s on %s', self.context.myItemId, self.repair_effect_id, item_id) 55 56 @TimedFunction('behaviors::monitors::logistics::ManageRemoteRepairEffect::_generate_candidates') 57 def _generate_candidates(self, locked_target_ids, prioritized_watchlist): 58 candidates = [] 59 for priority, item_id in prioritized_watchlist: 60 if item_id in locked_target_ids: 61 weight = get_damage_state_modifier(self, item_id, self._get_damage_state) 62 if weight > 0.0: 63 weight += get_base_logistics_priority(self, item_id) 64 candidates.append((item_id, weight)) 65 66 return candidates