示例#1
0
    def __init__(self,
                 spell,
                 caster_obj,
                 initial_target,
                 target_mask,
                 source_item=None):
        self.spell_entry = spell
        self.spell_caster = caster_obj
        self.source_item = source_item
        self.initial_target = initial_target
        self.spell_target_mask = target_mask
        self.duration_entry = DbcDatabaseManager.spell_duration_get_by_id(
            spell.DurationIndex)
        self.range_entry = DbcDatabaseManager.spell_range_get_by_id(
            spell.RangeIndex)  # TODO RangeMin is never used
        self.cast_time_entry = DbcDatabaseManager.spell_cast_time_get_by_id(
            spell.CastingTimeIndex)
        self.cast_end_timestamp = self.get_base_cast_time() / 1000 + time.time(
        )
        self.caster_effective_level = self.calculate_effective_level(
            self.spell_caster.level)

        self.spell_attack_type = -1  # Assigned on cast TODO Next ranged spells
        self.cast_state = SpellState.SPELL_STATE_PREPARING
        self.spell_impact_timestamps = {}

        if ObjectTypes.TYPE_PLAYER in caster_obj.object_type:
            self.targeted_unit_on_cast_start = MapManager.get_surrounding_unit_by_guid(
                self.spell_caster,
                self.spell_caster.current_selection,
                include_players=True)

        self.load_effects()

        self.cast_flags = SpellCastFlags.CAST_FLAG_NONE  # TODO Ammo/proc flag
示例#2
0
    def __init__(self,
                 spell,
                 caster,
                 initial_target,
                 target_mask,
                 source_item=None,
                 triggered=False):
        self.spell_entry = spell
        self.spell_caster = caster
        self.source_item = source_item
        self.initial_target = initial_target
        self.spell_target_mask = target_mask
        self.triggered = triggered

        self.duration_entry = DbcDatabaseManager.spell_duration_get_by_id(
            spell.DurationIndex)
        self.range_entry = DbcDatabaseManager.spell_range_get_by_id(
            spell.RangeIndex)
        self.cast_time_entry = DbcDatabaseManager.spell_cast_time_get_by_id(
            spell.CastingTimeIndex)
        self.cast_end_timestamp = self.get_base_cast_time() / 1000 + time.time(
        )
        self.spell_visual_entry = DbcDatabaseManager.spell_visual_get_by_id(
            spell.SpellVisualID)

        if self.spell_caster.object_type_mask & ObjectTypeFlags.TYPE_UNIT:
            self.caster_effective_level = self.calculate_effective_level(
                self.spell_caster.level)
        else:
            self.caster_effective_level = 0

        # Resolve the weapon required for the spell.
        self.spell_attack_type = -1
        # Item target casts (enchants) have target item info in equipment requirements - ignore.
        if spell.EquippedItemClass == ItemClasses.ITEM_CLASS_WEAPON and not self.initial_target_is_item(
        ):
            self.spell_attack_type = AttackTypes.RANGED_ATTACK if self.is_ranged_weapon_attack(
            ) else AttackTypes.BASE_ATTACK

        self.cast_state = SpellState.SPELL_STATE_PREPARING
        self.spell_impact_timestamps = {}

        if caster.get_type_id() == ObjectTypeIds.ID_PLAYER:
            selection_guid = self.spell_caster.current_selection if self.spell_caster.current_selection else caster.guid
            self.targeted_unit_on_cast_start = MapManager.get_surrounding_unit_by_guid(
                self.spell_caster, selection_guid, include_players=True)

        if self.is_fishing_spell():
            # Locate liquid vector in front of the caster.
            self.initial_target = MapManager.find_liquid_location_in_range(
                self.spell_caster, self.range_entry.RangeMin,
                self.range_entry.RangeMax)
        self.cast_flags = SpellCastFlags.CAST_FLAG_NONE

        # Ammo needs to be resolved on initialization since it's needed for validation and spell cast packets.
        self.used_ranged_attack_item = self.get_ammo_for_cast()
        if self.used_ranged_attack_item:
            self.cast_flags |= SpellCastFlags.CAST_FLAG_HAS_AMMO

        self.load_effects()
示例#3
0
 def _get_search_range(search_range=None, spell_template=None):
     if not search_range:
         if not spell_template:
             return 30.0
         range_index = spell_template.RangeIndex
         range_entry = DbcDatabaseManager.spell_range_get_by_id(range_index)
         return range_entry.RangeMax
     else:
         return search_range
示例#4
0
    def __init__(self, spell, caster_obj, initial_target_unit, target_results, target_mask):
        self.spell_entry = spell
        self.spell_caster = caster_obj
        self.initial_target_unit = initial_target_unit
        self.target_results = target_results
        self.spell_target_mask = target_mask
        self.duration_entry = DbcDatabaseManager.spell_duration_get_by_id(spell.DurationIndex)
        self.range_entry = DbcDatabaseManager.spell_range_get_by_id(spell.RangeIndex)
        self.cast_time_entry = DbcDatabaseManager.spell_cast_time_get_by_id(spell.CastingTimeIndex)
        self.cast_end_timestamp = self.get_base_cast_time()/1000 + time.time()

        self.spell_attack_type = AttackTypes.RANGED_ATTACK if self.is_ranged() else AttackTypes.BASE_ATTACK

        self.cast_state = SpellState.SPELL_STATE_PREPARING
示例#5
0
    def __init__(self, spell, caster_obj, initial_target, target_mask):
        self.spell_entry = spell
        self.spell_caster = caster_obj
        self.initial_target = initial_target
        self.spell_target_mask = target_mask
        self.duration_entry = DbcDatabaseManager.spell_duration_get_by_id(
            spell.DurationIndex)
        self.range_entry = DbcDatabaseManager.spell_range_get_by_id(
            spell.RangeIndex)
        self.cast_time_entry = DbcDatabaseManager.spell_cast_time_get_by_id(
            spell.CastingTimeIndex)
        self.cast_end_timestamp = self.get_base_cast_time() / 1000 + time.time(
        )
        self.caster_effective_level = self.calculate_effective_level(
            self.spell_caster.level)

        self.spell_attack_type = AttackTypes.RANGED_ATTACK if self.is_ranged(
        ) else AttackTypes.BASE_ATTACK
        self.cast_state = SpellState.SPELL_STATE_PREPARING
        self.effects = self.load_effects()

        self.cast_flags = SpellCastFlags.CAST_FLAG_NONE  # TODO Ammo/proc flag