structures.py (4746B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\behaviors\actions\structures.py 2 from behaviors.utility.standings import classify_standings_between 3 from behaviors.utility.structure import is_structure, can_dock_at_structure 4 from ccpProfile import TimedFunction 5 from eve.common.script.sys.idCheckers import IsNPCCorporation 6 from npcs.common.standings import STANDINGS_NEUTRAL 7 import random 8 from behaviors.groups.mixin import GroupTaskMixin 9 from behaviors.tasks import Task 10 from inventorycommon.const import categoryStructure, categoryStation 11 import logging 12 from npcs.npccorporations import get_corporation_faction_id 13 logger = logging.getLogger(__name__) 14 15 class SelectDockableStructure(Task, GroupTaskMixin): 16 17 @TimedFunction('behaviors::actions::structures::SelectDockableStructure::OnEnter') 18 def OnEnter(self): 19 self.SetStatusToFailed() 20 slim_items = self.get_valid_structure_slim_items() 21 if not slim_items: 22 logger.debug('no valid structures found in system') 23 return 24 selected_structure_id = self.select_dockable_structure_id(slim_items) 25 if not selected_structure_id: 26 logger.debug('no structure found to dock at') 27 return 28 self.SendBlackboardValue(self.attributes.selectedStructureIdAddress, selected_structure_id) 29 self.SetStatusToSuccess() 30 31 @TimedFunction('behaviors::actions::structures::SelectDockableStructure::get_valid_structure_slim_items') 32 def get_valid_structure_slim_items(self): 33 valid_structure_slim_items = [] 34 for slim_item in self.context.ballpark.slims.itervalues(): 35 if slim_item.categoryID not in (categoryStructure, categoryStation): 36 continue 37 valid_structure_slim_items.append(slim_item) 38 39 return valid_structure_slim_items 40 41 @TimedFunction('behaviors::actions::structures::SelectDockableStructure::select_dockable_structure_id') 42 def select_dockable_structure_id(self, slim_items): 43 selected_structure_id = None 44 owner_id = self.GetGroupOwnerId() 45 faction_id = self.GetGroupFactionId() 46 for filter_policy in self.get_prioritized_filter_policies(): 47 valid_structure_ids = filter_policy(slim_items, owner_id, faction_id) 48 if not valid_structure_ids: 49 continue 50 selected_structure_id = random.choice(valid_structure_ids) 51 break 52 53 return selected_structure_id 54 55 def get_prioritized_filter_policies(self): 56 return [self.filter_policy_my_corp_preferred_structure, 57 self.filter_policy_my_corp_structures, 58 self.filter_policy_my_faction_preferred_structure, 59 self.filter_policy_my_faction_structures, 60 self.filter_policy_npc_structures_with_positive_standings, 61 self.filter_policy_player_structures_with_positive_standings] 62 63 def has_structure_preference(self): 64 return hasattr(self.attributes, 'preferredStructureGroupId') and self.attributes.preferredStructureGroupId is not None 65 66 def is_preferred_structure(self, item): 67 return item.groupID == self.attributes.preferredStructureGroupId 68 69 def filter_policy_my_corp_preferred_structure(self, slim_items, owner_id, faction_id): 70 if not self.has_structure_preference(): 71 return [] 72 return [ item.itemID for item in slim_items if item.ownerID == owner_id and self.is_preferred_structure(item) ] 73 74 def filter_policy_my_faction_preferred_structure(self, slim_items, owner_id, faction_id): 75 if not self.has_structure_preference(): 76 return [] 77 return [ item.itemID for item in slim_items if get_corporation_faction_id(item.ownerID) == faction_id and self.is_preferred_structure(item) ] 78 79 def filter_policy_my_corp_structures(self, slim_items, owner_id, faction_id): 80 return [ item.itemID for item in slim_items if item.ownerID == owner_id ] 81 82 def filter_policy_my_faction_structures(self, slim_items, owner_id, faction_id): 83 return [ item.itemID for item in slim_items if get_corporation_faction_id(item.ownerID) == faction_id ] 84 85 def filter_policy_npc_structures_with_positive_standings(self, slim_items, owner_id, faction_id): 86 return [ item.itemID for item in slim_items if IsNPCCorporation(item.ownerID) and classify_standings_between(self, item.ownerID) > STANDINGS_NEUTRAL ] 87 88 def filter_policy_player_structures_with_positive_standings(self, slim_items, owner_id, faction_id): 89 return [ item.itemID for item in slim_items if not IsNPCCorporation(item.ownerID) and classify_standings_between(self, item.ownerID) > STANDINGS_NEUTRAL and (not is_structure(item) or can_dock_at_structure(self, item.itemID)) ]