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

combatmodules.py (4830B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\behaviors\actions\combatmodules.py
      2 from random import randrange
      3 from behaviors.utility.ballparks import is_ball_in_park, is_ship
      4 from behaviors.utility.item_modules import has_fitted_from_type_list
      5 from ccpProfile import TimedFunction
      6 from collections import defaultdict
      7 import uthread2
      8 from behaviors.tasks import Task
      9 from behaviors.utility.dogmatic import try_activate_effect, can_activate_effect_on_target
     10 from behaviors.utility.dogmatic import get_default_effect_id_for_type
     11 from behaviors.utility.inventory import get_inventory_item, get_type_id_by_item_id
     12 import logging
     13 logger = logging.getLogger(__name__)
     14 
     15 class ActivateModuleTypeOnTarget(Task):
     16 
     17     @TimedFunction('behaviors::actions::combatmodules::ActivateModuleTypeOnTarget::OnEnter')
     18     def OnEnter(self):
     19         self.SetStatusToFailed()
     20         assigned_module_id = self._get_my_module()
     21         my_target_id = self._get_my_target()
     22         if my_target_id is None:
     23             return
     24         module_type_id = get_inventory_item(self, assigned_module_id).typeID
     25         effect_id = get_default_effect_id_for_type(self, module_type_id)
     26         if can_activate_effect_on_target(self, module_type_id, effect_id, my_target_id):
     27             self.SetStatusToSuccess()
     28             uthread2.start_tasklet(self._start_module_on_target, assigned_module_id, my_target_id)
     29 
     30     def _get_my_module(self):
     31         return self.GetLastBlackboardValue(self.attributes.moduleAddress)
     32 
     33     def _get_my_target(self):
     34         return self.GetLastBlackboardValue(self.attributes.targetAddress)
     35 
     36     def _start_module_on_target(self, module_id, my_target):
     37         cycles = self._get_cycles()
     38         try_activate_effect(self, None, self.attributes.repeats, target_id=my_target, module_id=module_id, cycles=cycles)
     39 
     40     def _get_cycles(self):
     41         min_cycles = max_cycles = 0
     42         if self.HasAttribute('min_cycles'):
     43             min_cycles = self.attributes.min_cycles
     44         if self.HasAttribute('max_cycles'):
     45             max_cycles = self.attributes.max_cycles
     46         return randrange(min_cycles, max_cycles)
     47 
     48 
     49 class FindAndRegisterModule(Task):
     50 
     51     @TimedFunction('behaviors::actions::combatmodules::FindAndRegisterModule::OnEnter')
     52     def OnEnter(self):
     53         self.SetStatusToSuccess()
     54         registered_modules = self._get_registered_modules() or set()
     55         assigned_module_id = self._get_my_module(registered_modules)
     56         if assigned_module_id is None:
     57             logger.info('Behavior %s tried registering more modules of group %s than has fitted', self.behaviorTree.GetBehaviorId(), self.attributes.moduleTypeId)
     58             self.SetStatusToFailed()
     59             return
     60         self.SendBlackboardValue(self.attributes.moduleAddress, assigned_module_id)
     61         registered_modules.add(assigned_module_id)
     62         self.SendBlackboardValue(self.attributes.registeredModulesAddress, registered_modules)
     63 
     64     def _get_registered_modules(self):
     65         return self.GetLastBlackboardValue(self.attributes.registeredModulesAddress)
     66 
     67     def _get_my_module(self, registered_modules):
     68         fitted_modules = self._get_fitted_modules() or set()
     69         for module_id in fitted_modules.get(self.attributes.moduleTypeId, []):
     70             if self._is_module_available(module_id, registered_modules):
     71                 return module_id
     72 
     73     def _get_fitted_modules(self):
     74         fitted_modules = defaultdict(set)
     75         for module_item_key in self._get_my_fitted_modules():
     76             if isinstance(module_item_key, tuple):
     77                 module_item_id = module_item_key[0]
     78             else:
     79                 module_item_id = module_item_key
     80             fitted_modules[get_type_id_by_item_id(self, module_item_id)].add(module_item_id)
     81 
     82         return fitted_modules
     83 
     84     def _get_my_fitted_modules(self):
     85         return self._get_dogma_item().GetFittedItems()
     86 
     87     def _get_dogma_item(self):
     88         return self.context.dogmaLM.dogmaItems.get(self.context.myItemId)
     89 
     90     def _is_module_available(self, module_id, registered_modules):
     91         return not registered_modules or module_id not in registered_modules
     92 
     93 
     94 class FilterItemsWithModules(Task):
     95 
     96     @TimedFunction('behaviors::actions::combatmodules::FilterItemsWithModules::OnEnter')
     97     def OnEnter(self):
     98         self.SetStatusToSuccess()
     99         source_item_set = self.GetLastBlackboardValue(self.attributes.sourceItemSetAddress)
    100         target_item_set = set()
    101         if source_item_set:
    102             for item_id in source_item_set:
    103                 if is_ball_in_park(self, item_id) and is_ship(self, item_id) and has_fitted_from_type_list(self, item_id, self.attributes.typeListId):
    104                     target_item_set.add(item_id)
    105 
    106         self.SendBlackboardValue(self.attributes.targetItemSetAddress, target_item_set)