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
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()
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
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
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