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

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)) ]