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

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