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

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)