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

destroy_counter.py (7419B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\objectives\client\objective_task\destroy_counter.py
      2 import evetypes
      3 import uthread2
      4 import eveformat
      5 from npcs.client.entitystandings import is_hostile_npc_target
      6 from inventorycommon.const import categoryEntity
      7 import eve.client.script.ui.eveColor as color
      8 from objectives.client.objective_task.base import ObjectiveTask
      9 from objectives.client.ui.objective_task_widget import ProgressBarTaskWidget
     10 from objectives.common.util import value_as_set
     11 import logging
     12 logger = logging.getLogger(__name__)
     13 
     14 class _DestroyTargetsCounterTask(ObjectiveTask):
     15     objective_task_content_id = None
     16     WIDGET = ProgressBarTaskWidget
     17     __notifyevents__ = ['OnDamageStateChange',
     18      'OnObjectExplode',
     19      'DoBallRemove',
     20      'OnBallAdded']
     21 
     22     def __init__(self, *args, **kwargs):
     23         self._targets = set()
     24         self._destroyed_targets = set()
     25         super(_DestroyTargetsCounterTask, self).__init__(hidden=True, *args, **kwargs)
     26 
     27     @property
     28     def progress_bar_color(self):
     29         return color.DANGER_RED
     30 
     31     @property
     32     def progress_bar_color_completed(self):
     33         return color.DANGER_RED
     34 
     35     @property
     36     def progress(self):
     37         goal_value = self.goal_value
     38         if not goal_value:
     39             return 0
     40         return self.current_value / float(goal_value)
     41 
     42     @property
     43     def goal_value(self):
     44         return len(self._targets)
     45 
     46     @property
     47     def current_value(self):
     48         return len(self._targets) - len(self._destroyed_targets)
     49 
     50     @property
     51     def value(self):
     52         if not self._targets:
     53             return ''
     54         return u'{}/{}'.format(eveformat.number(self.current_value, 0), eveformat.number(self.goal_value, 0))
     55 
     56     def OnBallAdded(self, slim_item):
     57         if self._validate_target(slim_item):
     58             self._add_target(slim_item)
     59 
     60     def OnObjectExplode(self, type_id, item_id):
     61         if item_id in self._targets:
     62             self._target_destroyed(item_id)
     63 
     64     def OnDamageStateChange(self, ship_id, damage_state):
     65         if ship_id not in self._targets:
     66             return
     67         _, _, hull, _, _ = damage_state
     68         if hull == 0:
     69             self._target_destroyed(ship_id)
     70 
     71     def DoBallRemove(self, ball, *args, **kwargs):
     72         if ball and ball.id in self._targets:
     73             self._target_destroyed(ball.id)
     74 
     75     def _update(self):
     76         super(_DestroyTargetsCounterTask, self)._update()
     77         self.completed = bool(self._targets) and self.current_value == 0
     78         self.hidden = not bool(self._targets)
     79 
     80     def start(self):
     81         self._targets.clear()
     82         self._destroyed_targets.clear()
     83         if self._is_active:
     84             self.update()
     85         else:
     86             super(_DestroyTargetsCounterTask, self).start()
     87 
     88     def _start(self):
     89         self._find_targets()
     90         super(_DestroyTargetsCounterTask, self)._start()
     91 
     92     def _find_targets(self):
     93         ballpark = sm.GetService('michelle').GetBallpark()
     94         if not ballpark:
     95             return
     96         for ball_id in ballpark.balls.iterkeys():
     97             if ball_id == session.shipid:
     98                 continue
     99             slim_item = ballpark.GetInvItem(ball_id)
    100             if slim_item and self._validate_target(slim_item):
    101                 self._add_target(slim_item)
    102 
    103     def _validate_target(self, slim_item):
    104         return False
    105 
    106     def _add_target(self, slim_item):
    107         self._targets.add(slim_item.itemID)
    108         self.update()
    109 
    110     def _target_destroyed(self, item_id):
    111         self._destroyed_targets.add(item_id)
    112         self.update()
    113 
    114 
    115 class DestroyHostileTargetsTask(_DestroyTargetsCounterTask):
    116     objective_task_content_id = 14
    117 
    118     def _validate_target(self, slim_item):
    119         if getattr(slim_item, 'categoryID', None) != categoryEntity:
    120             return False
    121         return is_hostile_npc_target(slim_item)
    122 
    123 
    124 class DestroyTargetsCounterTask(_DestroyTargetsCounterTask):
    125     objective_task_content_id = 45
    126 
    127     def __init__(self, objective_target_groups = None, type_ids = None, group_ids = None, entity_group_ids = None, type_list_id = None, *args, **kwargs):
    128         self._objective_target_groups = value_as_set(objective_target_groups)
    129         self._type_ids = value_as_set(type_ids)
    130         self._group_ids = value_as_set(group_ids)
    131         self._entity_group_ids = value_as_set(entity_group_ids)
    132         self._type_list_id = None
    133         self._type_ids_from_type_list = set()
    134         if type_list_id:
    135             self._update_type_list()
    136         super(DestroyTargetsCounterTask, self).__init__(*args, **kwargs)
    137 
    138     @property
    139     def objective_target_groups(self):
    140         return self._objective_target_groups
    141 
    142     @objective_target_groups.setter
    143     def objective_target_groups(self, value):
    144         if self._objective_target_groups == value:
    145             return
    146         self._objective_target_groups = value_as_set(value)
    147         self._parameter_updated()
    148 
    149     @property
    150     def type_ids(self):
    151         return self._type_ids
    152 
    153     @type_ids.setter
    154     def type_ids(self, value):
    155         if self._type_ids == value:
    156             return
    157         self._type_ids = value_as_set(value)
    158         self._parameter_updated()
    159 
    160     @property
    161     def group_ids(self):
    162         return self._group_ids
    163 
    164     @group_ids.setter
    165     def group_ids(self, value):
    166         if self._group_ids == value:
    167             return
    168         self._group_ids = value_as_set(value)
    169         self._parameter_updated()
    170 
    171     @property
    172     def entity_group_ids(self):
    173         return self._entity_group_ids
    174 
    175     @entity_group_ids.setter
    176     def entity_group_ids(self, value):
    177         if self._entity_group_ids == value:
    178             return
    179         self._entity_group_ids = value_as_set(value)
    180         self._parameter_updated()
    181 
    182     @property
    183     def type_list_id(self):
    184         return self._type_list_id
    185 
    186     @type_list_id.setter
    187     def type_list_id(self, value):
    188         if self._type_list_id == value:
    189             return
    190         self._type_list_id = value
    191         self._update_type_list()
    192         self._parameter_updated()
    193 
    194     def _update_type_list(self):
    195         if not self._type_list_id:
    196             self._type_ids_from_type_list.clear()
    197         else:
    198             try:
    199                 type_ids = evetypes.GetTypeIDsByListID(self._type_list_id)
    200             except Exception as e:
    201                 logger.exception('%s: Failed to get type list', self.__class__.__name__)
    202                 return
    203 
    204             self._type_ids_from_type_list = set(type_ids)
    205 
    206     @uthread2.debounce(0.1)
    207     def _parameter_updated(self):
    208         self._targets.clear()
    209         self._destroyed_targets.clear()
    210         if self.is_active:
    211             self._find_targets()
    212             self.update()
    213 
    214     def _validate_target(self, slim_item):
    215         slim_type_id = getattr(slim_item, 'typeID', None)
    216         if self._objective_target_groups and getattr(slim_item, 'objectiveTargetGroup', None) in self._objective_target_groups:
    217             return True
    218         if self._type_ids and slim_type_id in self._type_ids:
    219             return True
    220         if self._type_ids_from_type_list and slim_type_id in self._type_ids_from_type_list:
    221             return True
    222         if self._group_ids and getattr(slim_item, 'groupID', None) in self._group_ids:
    223             return True
    224         if self._entity_group_ids and getattr(slim_item, 'entityGroupID', None) in self._entity_group_ids:
    225             return True
    226         return False