dogmatic.py (8066B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\behaviors\utility\dogmatic.py 2 import uthread2 3 from behaviors.utility.inventory import get_type_id_by_item_id 4 from ccpProfile import TimedFunction 5 import logging 6 from behaviors.utility.ballparks import is_ball_in_range 7 from behaviors.utility.owner import get_owner_id 8 from carbon.common.lib.const import SECONDS_IN_MILLISECOND 9 from dogma.const import attributeDisallowAssistance, attributeRemoteRepairImpedance, attributeExplosionDelay 10 from dogma.const import effecttargetABCAttack 11 from dogma.const import attributeEntityMissileTypeID, attributeMissileEntityVelocityMultiplier, attributeMissileEntityFlightTimeMultiplier 12 from dogma.const import attributeMaxVelocity 13 from dogma.effects.restricted.util import get_effect_range_falloff_modifier_at_distance 14 from eveexceptions import UserError 15 logger = logging.getLogger(__name__) 16 17 def get_my_attribute_value(task, attribute_id): 18 return get_attribute_value(task, task.context.myItemId, attribute_id) 19 20 21 @TimedFunction('behaviors::utility::dogmatic::get_attribute_value') 22 def get_attribute_value(task, item_id, attribute_id): 23 return task.context.dogmaLM.GetAttributeValue(item_id, attribute_id) 24 25 26 def get_my_type_attribute_value(task, attribute_id): 27 return get_type_attribute_value(task, task.context.mySlimItem.typeID, attribute_id) 28 29 30 @TimedFunction('behaviors::utility::dogmatic::get_type_attribute_value') 31 def get_type_attribute_value(task, type_id, attribute_id): 32 return task.context.dogmaLM.dogmaStaticMgr.GetTypeAttribute2(type_id, attribute_id) 33 34 35 def type_has_effect(task, type_id, effect_id): 36 return task.context.dogmaLM.dogmaStaticMgr.TypeHasEffect(type_id, effect_id) 37 38 39 def self_has_effect(task, effect_id): 40 return type_has_effect(task, task.context.mySlimItem.typeID, effect_id) 41 42 43 def is_effect_active(task, item_id, effect_id): 44 return task.context.dogmaLM.GetActiveEffectData(item_id, effect_id) is not None 45 46 47 def is_my_effect_active(task, effect_id): 48 return is_effect_active(task, task.context.myItemId, effect_id) 49 50 51 @TimedFunction('behaviors::utility::dogmatic::is_my_effect_active_on_target') 52 def is_my_effect_active_on_target(task, effect_id, target_id): 53 effect_environment = task.context.dogmaLM.GetActiveEffectEnvironment(task.context.myItemId, effect_id) 54 if effect_environment is None: 55 return False 56 return effect_environment.targetID == target_id 57 58 59 def get_my_locked_targets(task): 60 return task.context.dogmaLM.GetTargets(task.context.myItemId) 61 62 63 @TimedFunction('behaviors::utility::dogmatic::try_activate_effect') 64 def try_activate_effect(task, effect_id, repeats, target_id = None, context = None, module_id = None, cycles = 0, delay = 0): 65 module_id = module_id or task.context.myItemId 66 owner_id = get_owner_id(task) 67 try: 68 if cycles > 0: 69 uthread2.start_tasklet(stop_effect, task, effect_id, module_id, cycles) 70 if delay > 0: 71 uthread2.sleep(delay) 72 task.context.dogmaLM.ActivateWithContext(owner_id, module_id, effect_id, targetid=target_id, repeat=repeats, context=context) 73 logger.debug('try_activate_effect: entity=%s started effect=%s on target=%s', module_id, effect_id, target_id) 74 except UserError as e: 75 logger.debug('try_activate_effect: entity=%s failed effect=%s due to UserError=%s', module_id, effect_id, e) 76 except ReferenceError: 77 logger.debug('try_activate_effect: entity=%s failed effect=%s due to ReferenceError, it most likely died while sleeping', module_id, effect_id) 78 except RuntimeError as e: 79 logger.exception('try_activate_effect: entity=%s failed effect=%s due to RuntimeError=%s', module_id, effect_id, e) 80 81 82 def stop_effect(task, effect_id, module_id, cycles): 83 if effect_id is None: 84 module_type_id = get_type_id_by_item_id(task, module_id) 85 effect_id = task.context.dogmaLM.dogmaStaticMgr.GetDefaultEffect(module_type_id) 86 if module_id is None: 87 module_id = task.context.myItemId 88 effect = task.context.dogmaLM.dogmaStaticMgr.GetEffect(effect_id) 89 duration_attribute_id = effect.durationAttributeID 90 single_cycle_duration = task.context.dogmaLM.GetAttributeValue(module_id, duration_attribute_id) 91 seconds_until_stop = single_cycle_duration * cycles / 1000.0 92 logger.debug('behavior::dogmatic::stop_effect: entity=%s shutting down module=%s with effect=%s after cycles=%s and duration=%s', task.context.myItemId, module_id, effect_id, cycles, seconds_until_stop) 93 uthread2.SleepSim(seconds_until_stop) 94 try: 95 bool(task.context) 96 except ReferenceError: 97 return 98 99 try: 100 task.context.dogmaLM.StopEffect(effect_id, module_id, forceStopRepeating=True) 101 except UserError: 102 pass 103 104 task.behaviorTree.RequestReset(requestedBy=task) 105 logger.debug('behavior::dogmatic::stop_effect: entity=%s stopped using module=%s with effect=%s', task.context.myItemId, module_id, effect_id) 106 107 108 def _get_single_cycle_duration_for_module_or_effect(task, effect_id, module_id): 109 effect = task.context.dogmaLM.dogmaStaticMgr.GetEffect(effect_id) 110 duration_attribute_id = effect.durationAttributeID 111 return task.context.dogmaLM.GetAttributeValue(module_id, duration_attribute_id) 112 113 114 def is_assistance_disallowed(task, item_id): 115 return get_attribute_value(task, item_id, attributeDisallowAssistance) > 0 116 117 118 def get_remote_repair_impedance(task, item_id): 119 return get_attribute_value(task, item_id, attributeRemoteRepairImpedance) 120 121 122 @TimedFunction('behaviors::utility::dogmatic::get_range_falloff_multiplier_at_distance') 123 def get_range_falloff_multiplier_at_distance(task, effect_id, distance): 124 source_id = task.context.myItemId 125 return get_effect_range_falloff_modifier_at_distance(task.context.dogmaLM, effect_id, source_id, distance) 126 127 128 def get_default_effect_id_for_type(task, type_id): 129 return task.context.dogmaLM.dogmaStaticMgr.GetDefaultEffect(type_id) 130 131 132 def can_activate_effect_on_target(task, type_id, effect_id, target_id): 133 if effect_id not in task.context.ballpark.dogmaLM.dogmaStaticMgr.effects: 134 return False 135 if not task.context.ballpark.dogmaLM.dogmaStaticMgr.TypeHasEffect(type_id, effect_id): 136 return False 137 effect = task.context.ballpark.dogmaLM.dogmaStaticMgr.effects[effect_id] 138 if not effect.falloffAttributeID and effect.rangeAttributeID is not None and effect_id != effecttargetABCAttack: 139 effect_range = get_my_attribute_value(task, effect.rangeAttributeID) 140 return is_ball_in_range(task, task.context.myItemId, target_id, effect_range) 141 return True 142 143 144 def get_entity_max_missile_range(task, type_id): 145 missile_type_id = get_type_attribute_value(task, type_id, attributeEntityMissileTypeID) 146 missile_base_velocity = get_type_attribute_value(task, missile_type_id, attributeMaxVelocity) 147 missile_explosion_delay = get_type_attribute_value(task, missile_type_id, attributeExplosionDelay) 148 velocity_multiplier = get_type_attribute_value(task, type_id, attributeMissileEntityVelocityMultiplier) 149 flight_time_multiplier = get_type_attribute_value(task, type_id, attributeMissileEntityFlightTimeMultiplier) 150 missile_velocity = missile_base_velocity * flight_time_multiplier 151 flight_time = missile_explosion_delay * velocity_multiplier * SECONDS_IN_MILLISECOND 152 return missile_velocity * flight_time 153 154 155 def get_dogma_lm(task): 156 return task.context.dogmaLM 157 158 159 def is_module_fitted_from_group_id_set(task, item_id, group_id_set): 160 fitted_module_group_ids = get_dogma_lm(task).GetFittedModulesGroupIdsForShip(item_id) 161 return not group_id_set.isdisjoint(fitted_module_group_ids) 162 163 164 def try_stop_effect(task, effect_id, forced = False): 165 try: 166 task.context.dogmaLM.StopEffect(effect_id, task.context.myItemId, forced=forced) 167 logger.debug('Behavior=%s stopped effect=%s', task.context.myItemId, effect_id) 168 except UserError: 169 pass 170 171 172 def remove_my_target(task, target_id): 173 task.context.dogmaLM.RemoveTarget(task.context.myItemId, target_id)