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)