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