/*************************************************************************/ /* spell.cpp */ /*************************************************************************/ /* This file is part of: */ /* PANDEMONIUM ENGINE */ /* https://github.com/Relintai/pandemonium_engine */ /*************************************************************************/ /* Copyright (c) 2022-present Péter Magyar. */ /* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ /* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ /* */ /* Permission is hereby granted, free of charge, to any person obtaining */ /* a copy of this software and associated documentation files (the */ /* "Software"), to deal in the Software without restriction, including */ /* without limitation the rights to use, copy, modify, merge, publish, */ /* distribute, sublicense, and/or sell copies of the Software, and to */ /* permit persons to whom the Software is furnished to do so, subject to */ /* the following conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ #include "spell.h" #include "../../entities/auras/aura_data.h" #include "../../entities/resources/entity_resource_cost_data.h" #include "../../entities/skills/entity_skill_data.h" #include "../items/craft_recipe.h" #include "../../entities/auras/aura_data.h" #include "../../entities/data/entity_data.h" #include "../../infos/aura_infos.h" #include "../auras/aura_group.h" #include "../../singletons/ess.h" #include "../../pipelines/spell_damage_info.h" #include "../../pipelines/spell_heal_info.h" #include "../../defines.h" int Spell::get_id() const { return _id; } void Spell::set_id(const int value) { _id = value; } int Spell::spell_type_get() const { return _spell_type; } void Spell::spell_type_set(int value) { _spell_type = value; } SpellEnums::SpellCategory Spell::get_spell_category() const { return _spell_category; } void Spell::set_spell_category(SpellEnums::SpellCategory value) { _spell_category = value; } bool Spell::get_hide_from_actionbar() const { return _hide_from_actionbar; } void Spell::set_hide_from_actionbar(const bool value) { _hide_from_actionbar = value; } float Spell::get_cooldown() const { return _cooldown; } void Spell::set_cooldown(const float value) { _cooldown = value; } Spell::SpellTargetType Spell::get_target_type() const { return _target_type; } void Spell::set_target_type(const SpellTargetType value) { _target_type = value; } Spell::TargetRelationType Spell::get_target_relation_type() const { return _target_relation_type; } void Spell::set_target_relation_type(const TargetRelationType value) { _target_relation_type = value; } int Spell::get_level() const { return _level; } void Spell::set_level(const int value) { _level = value; } int Spell::get_rank() const { return _rank; } void Spell::set_rank(const int value) { _rank = value; } bool Spell::get_scale_with_level() const { return _scale_with_level; } void Spell::set_scale_with_level(const bool value) { _scale_with_level = value; } Ref Spell::get_item_cost() { return _item_cost; } void Spell::set_item_cost(const Ref &value) { _item_cost = value; } Ref Spell::get_required_item() { return _required_item; } void Spell::set_required_item(const Ref &value) { _required_item = value; } Ref Spell::get_resource_cost() { return _resource_cost; } void Spell::set_resource_cost(const Ref &value) { _resource_cost = value; } Ref Spell::get_resource_give() { return _resource_give; } void Spell::set_resource_give(const Ref &value) { _resource_give = value; } bool Spell::get_global_cooldown_enabled() const { return _global_cooldown_enabled; } void Spell::set_global_cooldown_enabled(const bool value) { _global_cooldown_enabled = value; } bool Spell::get_is_local_spell() const { return _is_local_spell; } void Spell::set_is_local_spell(const bool value) { _is_local_spell = value; } Ref Spell::get_icon() { return _icon; } void Spell::set_icon(const Ref &value) { _icon = Ref(value); } String Spell::get_text_translation_key() const { return _text_translation_key; } void Spell::set_text_translation_key(const String &value) { _text_translation_key = value; } String Spell::get_text_description() const { return _text_description; } void Spell::set_text_description(const String &value) { _text_description = value; } Ref Spell::get_visual_spell_effects() { return _visual_spell_effects; } void Spell::set_visual_spell_effects(const Ref &value) { _visual_spell_effects = value; } Ref Spell::get_teaches_craft_recipe() { return _teaches_craft_recipe; } void Spell::set_teaches_craft_recipe(const Ref &value) { _teaches_craft_recipe = value; } //// Caster Aura Apply //// int Spell::spells_cast_on_caster_num_get() const { return _spells_cast_on_caster.size(); } void Spell::spells_cast_on_caster_num_set(const int value) { _spells_cast_on_caster.resize(value); } Ref Spell::spell_cast_on_caster_get(const int index) { ERR_FAIL_INDEX_V(index, _spells_cast_on_caster.size(), Ref()); return _spells_cast_on_caster[index]; } void Spell::spell_cast_on_caster_set(const int index, const Ref &spell) { ERR_FAIL_INDEX(index, _spells_cast_on_caster.size()); _spells_cast_on_caster.set(index, Ref(spell)); } Vector Spell::spells_cast_on_caster_get() { VARIANT_ARRAY_GET(_spells_cast_on_caster); } void Spell::spells_cast_on_caster_set(const Vector &spells) { VARIANT_ARRAY_SET(spells, _spells_cast_on_caster, Spell); } //// Target Aura Apply //// int Spell::spells_cast_on_target_num_get() const { return _spells_cast_on_target.size(); } void Spell::spells_cast_on_target_num_set(const int value) { _spells_cast_on_target.resize(value); } Ref Spell::spell_cast_on_target_get(const int index) { ERR_FAIL_INDEX_V(index, _spells_cast_on_target.size(), Ref()); return _spells_cast_on_target[index]; } void Spell::spell_cast_on_target_set(const int index, const Ref &spell) { ERR_FAIL_INDEX(index, _spells_cast_on_target.size()); _spells_cast_on_target.set(index, Ref(spell)); } Vector Spell::spells_cast_on_target_get() { VARIANT_ARRAY_GET(_spells_cast_on_target); } void Spell::spells_cast_on_target_set(const Vector &spells) { VARIANT_ARRAY_SET(spells, _spells_cast_on_target, Spell); } //// Apply Auras On Learn //// int Spell::on_learn_cast_spells_num_get() const { return _on_learn_cast_spells.size(); } void Spell::on_learn_cast_spells_num_set(const int value) { _on_learn_cast_spells.resize(value); } Ref Spell::spell_cast_on_learn_get(int index) { ERR_FAIL_INDEX_V(index, _on_learn_cast_spells.size(), Ref()); return _on_learn_cast_spells[index]; } void Spell::spell_cast_on_learn_set(const int index, const Ref &spell) { ERR_FAIL_INDEX(index, _on_learn_cast_spells.size()); _on_learn_cast_spells.set(index, Ref(spell)); } Vector Spell::spells_cast_on_learn_get() { VARIANT_ARRAY_GET(_on_learn_cast_spells); } void Spell::spells_cast_on_learn_set(const Vector &spells) { VARIANT_ARRAY_SET(spells, _on_learn_cast_spells, Spell); } //// Range //// bool Spell::range_get_enabled() const { return _range_enabled; } void Spell::range_set_enabled(const bool value) { _range_enabled = value; } float Spell::range_get() const { return _range; } void Spell::range_set(const float value) { _range = value; } bool Spell::cast_time_get_enabled() const { return _cast_time_enabled; } void Spell::cast_time_set_enabled(const bool value) { _cast_time_enabled = value; } float Spell::cast_time_get() const { return _cast_time; } void Spell::cast_time_set(const float value) { _cast_time = value; } bool Spell::projectile_get_use_time() const { return _projectile_use_time; } void Spell::projectile_set_use_time(const bool value) { _projectile_use_time = value; } float Spell::projectile_get_time() const { return _projectile_time; } void Spell::projectile_set_time(const float value) { _projectile_time = value; } bool Spell::projectile_get_use_speed() const { return _projectile_use_speed; } void Spell::projectile_set_use_speed(const bool value) { _projectile_use_speed = value; } float Spell::projectile_get_speed() const { return _projectile_speed; } void Spell::projectile_set_speed(const float value) { _projectile_speed = value; } Ref Spell::projectile_get_scene() const { return _projectile_scene; } void Spell::projectile_set_scene(const Ref &value) { _projectile_scene = value; } bool Spell::damage_get_enabled() const { return _damage_enabled; } void Spell::damage_set_enabled(const bool value) { _damage_enabled = value; } int Spell::damage_get_type() const { return _damage_type; } void Spell::damage_set_type(const int value) { _damage_type = value; } int Spell::damage_get_min() const { return _damage_min; } void Spell::damage_set_min(const int value) { _damage_min = value; } int Spell::damage_get_max() const { return _damage_max; } void Spell::damage_set_max(const int value) { _damage_max = value; } int Spell::damage_get_scale_stat() const { return _damage_scale_stat; } void Spell::damage_set_scale_stat(const int value) { _damage_scale_stat = value; } float Spell::damage_get_scale_coeff() const { return _damage_scale_coeff; } void Spell::damage_set_scale_coeff(const float value) { _damage_scale_coeff = value; } bool Spell::heal_get_enabled() const { return _heal_enabled; } void Spell::heal_set_enabled(const bool value) { _heal_enabled = value; } int Spell::heal_get_min() const { return _heal_min; } void Spell::heal_set_min(const int value) { _heal_min = value; } int Spell::heal_get_max() const { return _heal_max; } void Spell::heal_set_max(const int value) { _heal_max = value; } int Spell::heal_get_scale_stat() const { return _heal_scale_stat; } void Spell::heal_set_scale_stat(const int value) { _heal_scale_stat = value; } float Spell::heal_get_scale_coeff() const { return _heal_scale_coeff; } void Spell::heal_set_scale_coeff(const float value) { _heal_scale_coeff = value; } bool Spell::dispell_get_enabled() const { return _dispell_enabled; } void Spell::dispell_set_enabled(const bool value) { _dispell_enabled = value; } int Spell::dispell_get_count_min() const { return _dispell_count_min; } void Spell::dispell_set_count_min(const int value) { _dispell_count_min = value; } int Spell::dispell_get_count_max() const { return _dispell_count_max; } void Spell::dispell_set_count_max(const int value) { _dispell_count_max = value; } int Spell::dispell_get_aura_types() const { return _dispell_aura_types; } void Spell::dispell_set_aura_types(const int value) { _dispell_aura_types = value; } bool Spell::get_needs_target() const { return _needs_target; } void Spell::set_needs_target(const bool value) { _needs_target = value; } bool Spell::get_can_move_while_casting() const { return _can_move_while_casting; } void Spell::set_can_move_while_casting(const bool value) { _can_move_while_casting = value; } bool Spell::get_interrupt_enabled() const { return _interrupt_enabled; } void Spell::set_interrupt_enabled(const bool value) { _interrupt_enabled = value; } float Spell::get_interrupt_time() const { return _interrupt_time; } void Spell::set_interrupt_time(const float value) { _interrupt_time = value; } bool Spell::get_is_aoe() const { return _is_aoe; } void Spell::set_is_aoe(const bool value) { _is_aoe = value; } Spell::SpellAOETargetType Spell::get_aoe_target_type() const { return _aoe_targetType; } void Spell::set_aoe_target_type(const SpellAOETargetType value) { _aoe_targetType = value; } SpellEnums::ColliderType Spell::get_aoe_collider_type() const { return _aoe_colliderType; } void Spell::set_aoe_collider_type(const SpellEnums::ColliderType value) { _aoe_colliderType = value; } float Spell::get_aoe_radius() const { return _aoe_radius; } void Spell::set_aoe_radius(float value) { _aoe_radius = value; } Vector3 Spell::get_aoe_box_extents() const { return _aoe_box_extents; } void Spell::set_aoe_box_extents(Vector3 value) { _aoe_box_extents = value; } int Spell::get_spell_cooldown_mainpulation_data_count() const { return _spell_cooldown_mainpulation_data_count; } void Spell::set_spell_cooldown_mainpulation_data_count(int value) { _spell_cooldown_mainpulation_data_count = value; } int Spell::get_training_cost() const { return _training_cost; } void Spell::set_training_cost(const int value) { _training_cost = value; } Ref Spell::get_training_required_spell() { return _training_required_spell; } void Spell::set_training_required_spell(const Ref &spell) { _training_required_spell = spell; } Ref Spell::get_training_required_skill() { return _training_required_skill; } void Spell::set_training_required_skill(const Ref &skill) { _training_required_skill = skill; } int Spell::get_training_required_skill_level() const { return _training_required_skill_level; } void Spell::set_training_required_skill_level(const int value) { _training_required_skill_level = value; } // Aura bool Spell::aura_get_permanent() const { return _aura_permanent; } void Spell::aura_set_permanent(const bool value) { _aura_permanent = value; } float Spell::aura_get_time() const { return _aura_time; } void Spell::aura_set_time(const float value) { _aura_time = value; } float Spell::aura_get_tick() const { return _aura_tick; } void Spell::aura_set_tick(const float value) { _aura_tick = value; } Ref Spell::aura_get_aura_group() { return _aura_group; } void Spell::aura_set_aura_group(const Ref &value) { _aura_group = value; } bool Spell::aura_get_is_debuff() const { return _aura_is_debuff; } void Spell::aura_set_is_debuff(const bool value) { _aura_is_debuff = value; } SpellEnums::AuraType Spell::aura_get_aura_type() const { return _aura_type; } void Spell::aura_set_aura_type(SpellEnums::AuraType value) { _aura_type = value; } bool Spell::aura_get_scale_with_level() const { return _aura_scale_with_level; } void Spell::aura_set_scale_with_level(const bool value) { _aura_scale_with_level = value; } String Spell::aura_get_text_translation_key() const { return _aura_text_translation_key; } void Spell::aura_set_text_translation_key(const String &value) { _aura_text_translation_key = value; } String Spell::aura_get_text_description() const { return _aura_text_description; } void Spell::aura_set_text_description(const String description) { _aura_text_description = description; } bool Spell::aura_get_hide() const { return _aura_hide; } void Spell::aura_set_hide(const bool value) { _aura_hide = value; } Ref Spell::aura_get_visual_spell_effects() { return _aura_visual_spell_effects; } void Spell::aura_set_visual_spell_effects(const Ref &value) { _aura_visual_spell_effects = value; } int Spell::aura_get_ability_scale_data_id() const { return _aura_ability_scale_data_id; } void Spell::aura_set_ability_scale_data_id(const int value) { _aura_ability_scale_data_id = value; } float Spell::aura_damage_get_scale_for_level(const int level) const { //return this->getDamageLevelScaling()->Evaluate((float)(level)); return 1; } float Spell::aura_heal_get_scale_for_level(const int level) const { //return this->getHealLevelScaling()->Evaluate((float)(level)); return 1; } float Spell::aura_absorb_get_scale_for_level(const int level) const { //return this->getAbsorbLevelScaling()->Evaluate((float)(level)); return 1; } bool Spell::aura_diminishing_return_enabled_get() const { return _aura_diminishing_return_enabled; } void Spell::aura_diminishing_return_enabled_set(const bool value) { _aura_diminishing_return_enabled = value; } int Spell::aura_diminishing_return_category_get() const { return _aura_diminishing_return_category; } void Spell::aura_diminishing_return_category_set(const int value) { _aura_diminishing_return_category = value; } Ref Spell::aura_get_teaches_spell() { return _aura_teaches_spell; } void Spell::aura_set_teaches_spell(const Ref &spell) { _aura_teaches_spell = spell; } /* void Spell::SetScalingData(AbilityScalingData *scalingData) { scalingData->getDamageCurve(); scalingData->getAbsorbCurve(); scalingData->getHealingCurve(); }*/ /* void Spell::OnAuraAbilityScalingDataLoaded(AbilityScalingDataLoaderHelper *h) { this->SetScalingData(h->getData()); } */ //Damage bool Spell::aura_damage_get_enabled() const { return _aura_damage_enabled; } void Spell::aura_damage_set_enabled(const bool value) { _aura_damage_enabled = value; } int Spell::aura_damage_get_type() const { return _aura_damage_type; } void Spell::aura_damage_set_type(const int value) { _aura_damage_type = value; } int Spell::aura_damage_get_min() const { return _aura_damage_min; } void Spell::aura_damage_set_min(const int value) { _aura_damage_min = value; } int Spell::aura_damage_get_max() const { return _aura_damage_max; } void Spell::aura_damage_set_max(const int value) { _aura_damage_max = value; } bool Spell::aura_damage_get_can_crit() const { return _aura_damage_can_crit; } void Spell::aura_damage_set_can_crit(const bool value) { _aura_damage_can_crit = value; } void Spell::aura_damage_set(const int min, const int max, const bool can_crit) { aura_damage_set_enabled(true); aura_damage_set_min(min); aura_damage_set_max(max); aura_damage_set_can_crit(can_crit); } //Absorb bool Spell::aura_absorb_get_enabled() const { return _aura_absorb_enabled; } void Spell::aura_absorb_set_enabled(const bool value) { _aura_absorb_enabled = value; } int Spell::aura_absorb_damage_get_type() const { return _aura_absorb_damage_type; } void Spell::aura_absorb_damage_set_type(const int value) { _aura_absorb_damage_type = value; } int Spell::aura_absorb_get_min() const { return _aura_absorb_min; } void Spell::aura_absorb_set_min(const int value) { _aura_absorb_min = value; } int Spell::aura_absorb_get_max() const { return _aura_absorb_max; } void Spell::aura_absorb_set_max(const int value) { _aura_absorb_max = value; } //Heal bool Spell::aura_heal_get_enabled() const { return _aura_heal_enabled; } void Spell::aura_heal_set_enabled(const bool value) { _aura_heal_enabled = value; } int Spell::aura_heal_get_min() const { return _aura_heal_min; } void Spell::aura_heal_set_min(const int value) { _aura_heal_min = value; } int Spell::aura_heal_get_max() const { return _aura_heal_max; } void Spell::aura_heal_set_max(const int value) { _aura_heal_max = value; } bool Spell::aura_heal_get_can_crit() const { return _aura_heal_can_crit; } void Spell::aura_heal_set_can_crit(const bool value) { _aura_heal_can_crit = value; } void Spell::aura_heal_set(const int min, const int max, const bool can_crit) { aura_heal_set_enabled(true); aura_heal_set_min(min); aura_heal_set_max(max); aura_heal_set_can_crit(can_crit); } //Dispel bool Spell::aura_dispell_get_enabled() const { return _aura_dispell_enabled; } void Spell::aura_dispell_set_enabled(const bool value) { _aura_dispell_enabled = value; } int Spell::aura_dispell_get_count_min() const { return _aura_dispell_count_min; } void Spell::aura_dispell_set_count_min(const int value) { _aura_dispell_count_min = value; } int Spell::aura_dispell_get_count_max() const { return _aura_dispell_count_max; } void Spell::aura_dispell_set_count_max(const int value) { _aura_dispell_count_max = value; } int Spell::aura_dispell_get_aura_types() const { return _aura_dispell_aura_types; } void Spell::aura_dispell_set_aura_types(const int value) { _aura_dispell_aura_types = value; } Ref Spell::aura_get_resource_cost() { return _aura_resource_cost; } void Spell::aura_set_resource_cost(const Ref &value) { _aura_resource_cost = value; } Ref Spell::aura_get_resource_give() { return _aura_resource_give; } void Spell::aura_set_resource_give(const Ref &value) { _aura_resource_give = value; } ////// Triggers /////// int Spell::aura_trigger_get_count() const { return _aura_trigger_count; } void Spell::aura_trigger_set_count(const int count) { ERR_FAIL_COND(count < 0 || count > MAX_TRIGGER_DATA); _aura_trigger_count = count; } SpellEnums::TriggerNotificationType Spell::aura_trigger_get_notification_type(const int index) const { ERR_FAIL_INDEX_V(index, _aura_trigger_count, SpellEnums::TRIGGER_NOTIFICATION_TYPE_AURA); return _aura_trigger_datas[index].notification_type; } void Spell::aura_trigger_set_notification_type(const int index, const SpellEnums::TriggerNotificationType value) { ERR_FAIL_COND(index < 0 || index > _aura_trigger_count); _aura_trigger_datas[index].notification_type = value; } int Spell::aura_trigger_get_notification_data(const int index) const { ERR_FAIL_INDEX_V(index, _aura_trigger_count, 0); return _aura_trigger_datas[index].notification_data; } void Spell::aura_trigger_set_notification_data(const int index, const int value) { ERR_FAIL_COND(index < 0 || index > _aura_trigger_count); _aura_trigger_datas[index].notification_data = value; } SpellEnums::TriggerType Spell::aura_trigger_get_trigger_type(const int index) const { ERR_FAIL_INDEX_V(index, _aura_trigger_count, SpellEnums::TRIGGER_TYPE_NONE); return _aura_trigger_datas[index].trigger_type; } void Spell::aura_trigger_set_trigger_type(const int index, const SpellEnums::TriggerType value) { ERR_FAIL_COND(index < 0 || index > _aura_trigger_count); _aura_trigger_datas[index].trigger_type = value; } float Spell::aura_trigger_get_trigger_type_data(const int index) const { ERR_FAIL_INDEX_V(index, _aura_trigger_count, 0); return _aura_trigger_datas[index].trigger_type_data; } void Spell::aura_trigger_set_trigger_type_data(const int index, const float value) { ERR_FAIL_COND(index < 0 || index > _aura_trigger_count); _aura_trigger_datas[index].trigger_type_data = value; } Ref Spell::aura_trigger_get_spell(const int index) const { ERR_FAIL_INDEX_V(index, _aura_trigger_count, Ref()); return _aura_trigger_datas[index].spell; } void Spell::aura_trigger_set_spell(const int index, const Ref &value) { ERR_FAIL_COND(index < 0 || index > _aura_trigger_count); _aura_trigger_datas[index].spell = value; } //// Talent //// Ref Spell::aura_get_talent_required_talent() const { return _aura_talent_required_talent; } void Spell::aura_set_talent_required_talent(const Ref rank) { _aura_talent_required_talent = rank; } Ref Spell::aura_get_talent_required_spell() const { return _aura_talent_required_talent; } void Spell::aura_set_talent_required_spell(const Ref spell) { _aura_talent_required_spell = spell; } ////// Aura Stat Attributes ////// int Spell::aura_stat_attribute_get_count() const { return _aura_stat_attribute_count; } void Spell::aura_stat_attribute_set_count(int count) { ERR_FAIL_COND(count < 0 || count > MAX_AURA_STATS); _aura_stat_attribute_count = count; } int Spell::aura_stat_attribute_get_stat(int index) const { ERR_FAIL_INDEX_V(index, MAX_AURA_STATS, 0); return _aura_stat_attributes[index].stat; } void Spell::aura_stat_attribute_set_stat(int index, const int value) { ERR_FAIL_INDEX(index, MAX_AURA_STATS); _aura_stat_attributes[index].stat = value; } float Spell::aura_stat_attribute_get_base_mod(int index) const { ERR_FAIL_INDEX_V(index, MAX_AURA_STATS, 0); return _aura_stat_attributes[index].base_mod; } void Spell::aura_stat_attribute_set_base_mod(int index, float value) { ERR_FAIL_INDEX(index, MAX_AURA_STATS); _aura_stat_attributes[index].base_mod = value; } float Spell::aura_stat_attribute_get_bonus_mod(int index) const { ERR_FAIL_INDEX_V(index, MAX_AURA_STATS, 0); return _aura_stat_attributes[index].bonus_mod; } void Spell::aura_stat_attribute_set_bonus_mod(int index, float value) { ERR_FAIL_INDEX(index, MAX_AURA_STATS); _aura_stat_attributes[index].bonus_mod = value; } float Spell::aura_stat_attribute_get_percent_mod(int index) const { ERR_FAIL_INDEX_V(index, MAX_AURA_STATS, 0); return _aura_stat_attributes[index].percent_mod; } void Spell::aura_stat_attribute_set_percent_mod(int index, float value) { ERR_FAIL_INDEX(index, MAX_AURA_STATS); _aura_stat_attributes[index].percent_mod = value; } //// Spell System //// void Spell::cast_starts_simple(Entity *caster, float spell_scale) { ERR_FAIL_COND(!caster || !ObjectDB::instance_validate(caster)); Ref info = Ref(memnew(SpellCastInfo())); info->caster_set(caster); info->target_set(caster->target_gets()); info->has_cast_time_set(cast_time_get_enabled()); info->cast_time_set(cast_time_get()); info->spell_scale_set(spell_scale); info->set_spell(Ref(this)); cast_starts(info); } void Spell::cast_interrupts_simple(Entity *caster) { ERR_FAIL_COND(!caster || !ObjectDB::instance_validate(caster)); Ref info(memnew(SpellCastInfo())); info->caster_set(caster); info->set_spell(Ref(this)); cast_interrupts(info); } void Spell::cast_starts_triggered_simple(Entity *caster) { ERR_FAIL_COND(!caster || !ObjectDB::instance_validate(caster)); Ref info(memnew(SpellCastInfo())); info->caster_set(caster); info->set_spell(Ref(this)); cast_starts_triggered(info); } void Spell::aura_sapply_simple(Entity *caster, Entity *target, float spell_scale) { ERR_FAIL_COND(caster == NULL || target == NULL); Ref info(memnew(AuraApplyInfo(caster, target, spell_scale, this))); aura_sapply(info); } //Script methods void Spell::cast_starts(Ref info) { ERR_FAIL_COND(!info.is_valid()); //Auto self cast. Note: Remove needs_target, and skip this if spell should only target enemies. if (info->target_get() == NULL) { info->target_set(info->caster_get()); } if (has_method("_cast_starts")) { call("_cast_starts", info); } } void Spell::cast_starts_triggered(Ref info) { ERR_FAIL_COND(!info.is_valid()); if (has_method("_cast_starts_triggered")) { call("_cast_starts_triggered", info); } } void Spell::cast_interrupts(Ref info) { ERR_FAIL_COND(!info.is_valid()); if (has_method("_cast_interrupts")) { call("_cast_interrupts", info); } } void Spell::cast_finishs(Ref info) { ERR_FAIL_COND(!info.is_valid()); if (has_method("_cast_finishs")) { call("_cast_finishs", info); } } void Spell::aura_sapply(Ref info) { ERR_FAIL_COND(!info.is_valid()); //always exists call("_aura_sapply", info); } void Spell::aura_sdeapply(Ref info) { ERR_FAIL_COND(!info.is_valid()); //always exists call("_aura_sdeapply", info); } void Spell::aura_sadd(Ref aura) { ERR_FAIL_COND(!aura.is_valid()); //always exists call("_aura_sadd", aura); } void Spell::aura_sremove(Ref aura) { ERR_FAIL_COND(!aura.is_valid()); //always exists call("_aura_sremove", aura); } void Spell::aura_removes_expired(Ref aura) { ERR_FAIL_COND(!aura.is_valid()); //always exists call("_aura_removes_expired", aura); } void Spell::aura_removes_dispell(Ref aura) { ERR_FAIL_COND(!aura.is_valid()); //always exists call("_aura_removes_dispell", aura); } void Spell::aura_supdate(Ref aura, float delta) { ERR_FAIL_COND(!aura.is_valid()); //always exists call("_aura_supdate", aura, delta); } //eventhandlers void Spell::son_cast_player_moved(Ref info) { ERR_FAIL_COND(!info.is_valid()); if (has_method("_son_cast_player_moved")) { call("_son_cast_player_moved", info); } } void Spell::son_cast_damage_received(Ref info) { ERR_FAIL_COND(!info.is_valid()); if (has_method("_son_cast_damage_received")) { call("_son_cast_damage_received", info); } } void Spell::son_spell_hit(Ref info) { ERR_FAIL_COND(!info.is_valid()); if (has_method("_son_spell_hit")) { call("_son_spell_hit", info); } } void Spell::son_physics_process(Ref info, float delta) { ERR_FAIL_COND(!info.is_valid()); if (has_method("_son_physics_process")) { call("_son_physics_process", info, delta); } } void Spell::notification_scast(int what, Ref info) { ERR_FAIL_COND(!info.is_valid()); if (has_method("_notification_scast")) { call("_notification_scast", what, info); } } void Spell::notification_ccast(int what, Ref info) { ERR_FAIL_COND(!info.is_valid()); if (has_method("_notification_ccast")) { call("_notification_ccast", what, info); } } void Spell::notification_saura(int what, Ref data) { ERR_FAIL_COND(!data.is_valid()); if (has_method("_notification_saura")) call("_notification_saura", what, data); } void Spell::notification_sheal(int what, Ref aura, Ref data) { ERR_FAIL_COND(!aura.is_valid()); ERR_FAIL_COND(!data.is_valid()); if (has_method("_notification_sheal")) call("_notification_sheal", what, aura, data); } void Spell::notification_aura_scast(int what, Ref aura, Ref info) { ERR_FAIL_COND(!aura.is_valid()); ERR_FAIL_COND(!info.is_valid()); if (has_method("_notification_aura_scast")) call("_notification_aura_scast", what, aura, info); } void Spell::notification_sdamage(int what, Ref aura, Ref data) { ERR_FAIL_COND(!aura.is_valid()); ERR_FAIL_COND(!data.is_valid()); if (has_method("_notification_sdamage")) call("_notification_sdamage", what, aura, data); } void Spell::son_remove_expired(Ref aura) { ERR_FAIL_COND(!aura.is_valid()); if (has_method("_son_remove_expired")) call("_son_remove_expired", aura); } void Spell::son_remove(Ref aura) { ERR_FAIL_COND(!aura.is_valid()); if (has_method("_son_remove")) call("_son_remove", aura); } void Spell::son_remove_dispell(Ref aura) { ERR_FAIL_COND(!aura.is_valid()); if (has_method("_son_remove_dispell")) call("_son_remove_dispell", aura); } void Spell::notification_sdeath(Ref data) { if (has_method("_notification_sdeath")) call("_notification_sdeath", data); } void Spell::notification_scooldown_added(Ref data, int id, float value) { if (has_method("_notification_scooldown_added")) call("_notification_scooldown_added", data, id, value); } void Spell::notification_scooldown_removed(Ref data, int id, float value) { if (has_method("_notification_scooldown_removed")) call("_notification_scooldown_removed", data, id, value); } void Spell::notification_scategory_cooldown_added(Ref data, int id, float value) { if (has_method("_notification_scategory_cooldown_added")) call("_notification_scategory_cooldown_added", data, id, value); } void Spell::notification_scategory_cooldown_removed(Ref data, int id, float value) { if (has_method("_notification_scategory_cooldown_removed")) call("_notification_scategory_cooldown_removed", data, id, value); } void Spell::notification_sgcd_started(Ref data, float gcd) { ERR_FAIL_COND(!data.is_valid()); if (has_method("_notification_sgcd_started")) call("_notification_sgcd_started", data, gcd); } void Spell::notification_sgcd_finished(Ref data) { ERR_FAIL_COND(!data.is_valid()); if (has_method("_notification_sgcd_finished")) call("_notification_sgcd_finished", data); } void Spell::son_physics_process_aura(Ref data) { ERR_FAIL_COND(!data.is_valid()); if (has_method("_son_physics_process_aura")) call("_son_physics_process_aura", data); } void Spell::notification_sxp_gained(Ref data, int value) { ERR_FAIL_COND(!data.is_valid()); if (has_method("_notification_sxp_gained")) call("_notification_sxp_gained", data, value); } void Spell::notification_slevel_up(Ref data, int value) { ERR_FAIL_COND(!data.is_valid()); if (has_method("_notification_slevel_up")) call("_notification_slevel_up", data, value); } void Spell::notification_sentity_resource_added(Ref data, Ref resource) { ERR_FAIL_COND(!data.is_valid()); ERR_FAIL_COND(!resource.is_valid()); if (has_method("_notification_sentity_resource_added")) call("_notification_sentity_resource_added", data, resource); } void Spell::notification_sentity_resource_removed(Ref data, Ref resource) { ERR_FAIL_COND(!data.is_valid()); ERR_FAIL_COND(!resource.is_valid()); if (has_method("_notification_sentity_resource_removed")) call("_notification_sentity_resource_removed", data, resource); } void Spell::notification_caura(int what, Ref data) { ERR_FAIL_COND(!data.is_valid()); if (has_method("_notification_caura")) call("_notification_caura", what, data); } void Spell::notification_cheal(int what, Ref aura, Ref data) { ERR_FAIL_COND(!aura.is_valid()); ERR_FAIL_COND(!data.is_valid()); if (has_method("_notification_cheal")) call("_notification_cheal", what, aura, data); } void Spell::notification_aura_ccast(int what, Ref aura, Ref info) { ERR_FAIL_COND(!aura.is_valid()); ERR_FAIL_COND(!info.is_valid()); if (has_method("_notification_aura_ccast")) call("_notification_aura_ccast", what, aura, info); } void Spell::notification_cdamage(int what, Ref aura, Ref data) { ERR_FAIL_COND(!aura.is_valid()); ERR_FAIL_COND(!data.is_valid()); if (has_method("_notification_cdamage")) call("_notification_cdamage", what, aura, data); } void Spell::notification_cdeath(Ref data) { if (has_method("_notification_cdeath")) call("_notification_cdeath", data); } void Spell::notification_ccooldown_added(Ref data, int id, float value) { if (has_method("_notification_ccooldown_added")) call("_notification_ccooldown_added", data, id, value); } void Spell::notification_ccooldown_removed(Ref data, int id, float value) { if (has_method("_notification_ccooldown_removed")) call("_notification_ccooldown_removed", data, id, value); } void Spell::notification_ccategory_cooldown_added(Ref data, int id, float value) { if (has_method("_notification_ccategory_cooldown_added")) call("_notification_ccategory_cooldown_added", data, id, value); } void Spell::notification_ccategory_cooldown_removed(Ref data, int id, float value) { if (has_method("_notification_ccategory_cooldown_removed")) call("_notification_ccategory_cooldown_removed", data, id, value); } void Spell::notification_cgcd_started(Ref data, float gcd) { ERR_FAIL_COND(!data.is_valid()); if (has_method("_notification_cgcd_started")) call("_notification_cgcd_started", data, gcd); } void Spell::notification_cgcd_finished(Ref data) { ERR_FAIL_COND(!data.is_valid()); if (has_method("_notification_cgcd_finished")) call("_notification_cgcd_finished", data); } void Spell::notification_cxp_gained(Ref data, int value) { ERR_FAIL_COND(!data.is_valid()); if (has_method("_notification_cxp_gained")) call("_notification_cxp_gained", data, value); } void Spell::notification_clevel_up(Ref data, int value) { ERR_FAIL_COND(!data.is_valid()); if (has_method("_notification_clevel_up")) call("_notification_clevel_up", data, value); } void Spell::notification_centity_resource_added(Ref data, Ref resource) { ERR_FAIL_COND(!data.is_valid()); ERR_FAIL_COND(!resource.is_valid()); if (has_method("_notification_centity_resource_added")) call("_notification_centity_resource_added", data, resource); } void Spell::notification_centity_resource_removed(Ref data, Ref resource) { ERR_FAIL_COND(!data.is_valid()); ERR_FAIL_COND(!resource.is_valid()); if (has_method("_notification_centity_resource_removed")) call("_notification_centity_resource_removed", data, resource); } //Equipment bool Spell::equip_should_deny(Ref data, int equip_slot, Ref item) { ERR_FAIL_COND_V(!data.is_valid(), false); if (has_method("_equip_should_deny")) if (call("_equip_should_deny", data, equip_slot, item)) return true; return false; } void Spell::equip_son_success(Ref data, int equip_slot, Ref item, Ref old_item, int bag_slot) { ERR_FAIL_COND(!data.is_valid()); if (has_method("_equip_son_success")) call("_equip_son_success", data, equip_slot, item, old_item, bag_slot); } void Spell::equip_son_fail(Ref data, int equip_slot, Ref item, Ref old_item, int bag_slot) { ERR_FAIL_COND(!data.is_valid()); if (has_method("_equip_son_fail")) call("_equip_son_fail", data, equip_slot, item, old_item, bag_slot); } void Spell::equip_con_success(Ref data, int equip_slot, Ref item, Ref old_item, int bag_slot) { ERR_FAIL_COND(!data.is_valid()); if (has_method("_equip_con_success")) call("_equip_con_success", data, equip_slot, item, old_item, bag_slot); } void Spell::equip_con_fail(Ref data, int equip_slot, Ref item, Ref old_item, int bag_slot) { ERR_FAIL_COND(!data.is_valid()); if (has_method("_equip_con_fail")) call("_equip_con_fail", data, equip_slot, item, old_item, bag_slot); } //Calculations / Queries void Spell::calculate_initial_damage(Ref data) { ERR_FAIL_COND(!data.is_valid() || data->receiver_get() == NULL); call("_calculate_initial_damage", data); } void Spell::handle_spell_damage(Ref data) { ERR_FAIL_COND(!data.is_valid() || data->receiver_get() == NULL); call("_handle_spell_damage", data); } void Spell::calculate_initial_heal(Ref data) { ERR_FAIL_COND(!data.is_valid() || data->receiver_get() == NULL); call("_calculate_initial_heal", data); } void Spell::handle_spell_heal(Ref data) { ERR_FAIL_COND(!data.is_valid() || data->receiver_get() == NULL); call("_handle_spell_heal", data); } void Spell::handle_projectile(Ref info) { ERR_FAIL_COND(!info.is_valid()); call("_handle_projectile", info); } void Spell::handle_effect(Ref info) { ERR_FAIL_COND(!info.is_valid()); call("_handle_effect", info); } void Spell::handle_gcd(Ref info) { ERR_FAIL_COND(!info.is_valid()); if (_global_cooldown_enabled && _cast_time_enabled) { float gcd = info->caster_get()->stat_gets_current(ESS::get_singleton()->stat_get_id("Global Cooldown")); info->caster_get()->gcd_starts(gcd); } } void Spell::handle_cooldown(Ref info) { ERR_FAIL_COND(!info.is_valid()); if (_cooldown > 0.00001) { info->caster_get()->cooldown_adds(_id, _cooldown); } } void Spell::setup_aura_data(Ref data, Ref info) { ERR_FAIL_COND(!data.is_valid() || !info.is_valid()); //always exists call("_setup_aura_data", data, info); } void Spell::aura_sapply_passives_damage_receive(Ref info) { ERR_FAIL_COND(!info.is_valid()); //always exists call("_aura_sapply_passives_damage_receive", info); } void Spell::aura_sapply_passives_damage_deal(Ref info) { ERR_FAIL_COND(!info.is_valid()); //always exists call("_aura_sapply_passives_damage_deal", info); } void Spell::aura_calculate_initial_damage(Ref aura_data, Ref info) { ERR_FAIL_COND(!aura_data.is_valid() || !info.is_valid()); //always exists call("_aura_calculate_initial_damage", aura_data, info); } void Spell::handle_aura_damage(Ref aura_data, Ref info) { ERR_FAIL_COND(!aura_data.is_valid() || !info.is_valid()); //always exists call("_handle_aura_damage", aura_data, info); } void Spell::aura_sapply_passives_heal_receive(Ref data) { ERR_FAIL_COND(!data.is_valid()); //always exists call("_aura_sapply_passives_heal_receive", data); } void Spell::aura_sapply_passives_heal_deal(Ref data) { ERR_FAIL_COND(!data.is_valid()); //always exists call("_aura_sapply_passives_heal_deal", data); } void Spell::aura_calculate_initial_heal(Ref aura_data, Ref info) { ERR_FAIL_COND(!aura_data.is_valid() || !info.is_valid()); //always exists call("_aura_calculate_initial_heal", aura_data, info); } void Spell::handle_aura_heal(Ref aura_data, Ref data) { ERR_FAIL_COND(!aura_data.is_valid() || !data.is_valid()); //always exists call("_handle_aura_heal", aura_data, data); } String Spell::get_name_translated() const { if (_text_translation_key != "") { return tr(_text_translation_key); } return get_name(); } String Spell::get_description(const int class_level, const int character_level) { return call("_get_description", class_level, character_level); } String Spell::_get_description(const int class_level, const int character_level) { String str; if (_text_translation_key != "") { str = tr(_text_translation_key + "_DESC"); } str = _text_description; int pos = str.find_char('%'); while (pos > 0) { if (pos == str.size() - 1) break; CharType o = str[pos + 1]; if (o == '#' || o == '$' || o == '%') { int nsp = str.find_char(' ', pos + 1); if (pos < 0) break; String prop = str.substr(pos + 2, nsp - pos - 2); StringName psm = prop; bool valid = false; Variant value = get(psm, &valid); if (valid) { if (o == '#') { value = Variant::evaluate(Variant::OP_MULTIPLY, value, class_level / static_cast(ESS::get_singleton()->get_max_class_level())); value = static_cast(value); } if (o == '$') { value = Variant::evaluate(Variant::OP_MULTIPLY, value, character_level / static_cast(ESS::get_singleton()->get_max_character_level())); value = static_cast(value); } str = str.replace(str.substr(pos, nsp - pos) + " ", value); } } pos = str.find_char('%', pos + 1); } return str; } String Spell::aura_get_name_translated() const { if (_aura_text_translation_key != "") { return tr(_aura_text_translation_key); } return get_name(); } String Spell::aura_get_description(const int class_level, const int character_level) { return call("_aura_get_description", class_level, character_level); } String Spell::_aura_get_description(const int class_level, const int character_level) { String str; if (_aura_text_translation_key != "") { str = tr(_aura_text_translation_key + "_DESC"); } str = _aura_text_description; int pos = str.find_char('%'); while (pos > 0) { if (pos == str.size() - 1) break; CharType o = str[pos + 1]; if (o == '#' || o == '$' || o == '%') { int nsp = str.find_char(' ', pos + 1); if (pos < 0) break; String prop = str.substr(pos + 2, nsp - pos - 2); StringName psm = prop; bool valid = false; Variant value = get(psm, &valid); if (valid) { if (o == '#') { value = Variant::evaluate(Variant::OP_MULTIPLY, value, class_level / static_cast(ESS::get_singleton()->get_max_class_level())); value = static_cast(value); } if (o == '$') { value = Variant::evaluate(Variant::OP_MULTIPLY, value, character_level / static_cast(ESS::get_singleton()->get_max_character_level())); value = static_cast(value); } str = str.replace(str.substr(pos, nsp - pos) + " ", value); } } pos = str.find_char('%', pos + 1); } return str; } Spell::Spell() { PLAYER_HIT_RADIUS = (float)0.5; _id = 1; _spell_type = SpellEnums::SPELL_TYPE_NONE; _spell_category = SpellEnums::SPELL_CATEGORY_NORMAL; _hide_from_actionbar = false; _cooldown = 0; _cast_time = 0; _target_type = SpellTargetType::SPELL_TARGET_TYPE_TARGET; _target_relation_type = TargetRelationType::TARGET_ENEMY; _level = 1; _rank = 0; if (ESS::get_singleton()) { _scale_with_level = ESS::get_singleton()->get_scale_spells_by_default(); } _global_cooldown_enabled = true; _is_local_spell = false; _range_enabled = false; _range = 0; _damage_enabled = false; _damage_type = 0; _damage_min = 0; _damage_max = 0; _damage_scale_stat = 0; _damage_scale_coeff = 0; _heal_enabled = false; _heal_min = 0; _heal_max = 0; _heal_scale_stat = 0; _heal_scale_coeff = 0; _dispell_enabled = false; _dispell_count_min = 0; _dispell_count_max = 0; _dispell_aura_types = 0; _cast_time_enabled = false; _cast_time = 0; _needs_target = false; _can_move_while_casting = false; _interrupt_enabled = false; _interrupt_time = 0; _is_aoe = false; _aoe_targetType = SpellAOETargetType::SPELL_AOE_TARGET_TYPE_CASTER; _aoe_colliderType = SpellEnums::COLLIDER_TYPE_NONE; _aoe_radius = 0; _spell_cooldown_mainpulation_data_count = 0; _training_cost = 0; _training_required_skill_level = 0; _projectile_use_time = false; _projectile_time = 0; _projectile_use_speed = false; _projectile_speed = 0; _aura_permanent = false; _aura_ability_scale_data_id = 1; _aura_time = 0; _aura_tick = 0; _aura_type = SpellEnums::AURA_TYPE_NONE; _aura_is_debuff = false; _aura_hide = false; if (ESS::get_singleton()) { _aura_scale_with_level = ESS::get_singleton()->get_scale_spells_by_default(); } _aura_damage_enabled = false; _aura_damage_type = 0; _aura_damage_min = 0; _aura_damage_max = 0; _aura_damage_can_crit = false; _aura_absorb_enabled = false; _aura_absorb_damage_type = 0; _aura_absorb_min = 0; _aura_absorb_max = 0; _aura_heal_enabled = false; _aura_heal_min = 0; _aura_heal_max = 0; _aura_heal_can_crit = false; _aura_dispell_enabled = false; _aura_dispell_count_min = 0; _aura_dispell_count_max = 0; _aura_dispell_aura_types = 0; _aura_add_states = 0; _aura_remove_effects_with_states = 0; _aura_supress_states = 0; _aura_stat_attribute_count = 0; _aura_trigger_count = 0; _aura_diminishing_return_enabled = false; _aura_diminishing_return_category = 0; } Spell::~Spell() { _spells_cast_on_caster.clear(); _spells_cast_on_target.clear(); _on_learn_cast_spells.clear(); _item_cost.unref(); _required_item.unref(); _resource_cost.unref(); _resource_give.unref(); _icon.unref(); _visual_spell_effects.unref(); _teaches_craft_recipe.unref(); _training_required_spell.unref(); _training_required_skill.unref(); _projectile_scene.unref(); _aura_teaches_spell.unref(); _aura_visual_spell_effects.unref(); _aura_damage_scaling_curve.unref(); _aura_absorb_scaling_curve.unref(); _aura_heal_scaling_curve.unref(); for (int i = 0; i < MAX_TRIGGER_DATA; ++i) { _aura_trigger_datas[i].spell.unref(); } _aura_talent_required_talent.unref(); _aura_talent_required_spell.unref(); } void Spell::_cast_starts(Ref info) { ERR_FAIL_COND(!info.is_valid()); ERR_FAIL_COND(!info->caster_get()); if (info->caster_get()->cast_is_castings()) { return; } if ((get_global_cooldown_enabled() && info->caster_get()->gcd_hass()) || info->caster_get()->category_cooldown_hass(spell_type_get()) || info->caster_get()->cooldown_hass(get_id())) { return; } if (!info->caster_get()->spell_hass_id(get_id())) { return; } if (cast_time_get_enabled()) { info->caster_get()->cast_starts(info); return; } info->caster_get()->cast_spell_successs(info); info->target_get()->notification_scast(SpellEnums::NOTIFICATION_CAST_FINISHED_TARGET, info); //if (get_projectile().is_valid()) { // handle_projectile(info); //} else { // handle_effect(info); //} handle_cooldown(info); handle_gcd(info); } void Spell::_cast_finishs(Ref info) { ERR_FAIL_COND(!info.is_valid()); ERR_FAIL_COND(!info->caster_get()); info->caster_get()->notification_scast(SpellEnums::NOTIFICATION_CAST_FINISHED, info); info->caster_get()->cast_spell_successs(info); if (ObjectDB::instance_validate(info->target_get())) { info->target_get()->notification_scast(SpellEnums::NOTIFICATION_CAST_FINISHED_TARGET, info); } //if (get_projectile().is_valid()) { // handle_projectile(info); //} else { // handle_effect(info); //} handle_cooldown(info); } void Spell::_son_cast_player_moved(Ref info) { ERR_FAIL_COND(!info.is_valid()); ERR_FAIL_COND(!info->caster_get()); if (get_can_move_while_casting()) { info->caster_get()->cast_fails(); } } void Spell::_son_spell_hit(Ref info) { ERR_FAIL_COND(!info.is_valid()); handle_effect(info); } void Spell::_calculate_initial_damage(Ref data) { ERR_FAIL_COND(!data.is_valid()); Math::randomize(); data->damage_set(damage_get_min() + (damage_get_max() - damage_get_min()) * Math::randf()); } void Spell::_handle_spell_damage(Ref data) { ERR_FAIL_COND(!data.is_valid()); calculate_initial_damage(data); data->dealer_get()->sdeal_damage_to(data); } void Spell::_calculate_initial_heal(Ref data) { ERR_FAIL_COND(!data.is_valid()); Math::randomize(); data->heal_set(heal_get_min() + (heal_get_max() - heal_get_min()) * Math::randf()); } void Spell::_handle_spell_heal(Ref data) { ERR_FAIL_COND(!data.is_valid()); calculate_initial_heal(data); data->dealer_get()->sdeal_heal_to(data); } void Spell::_handle_projectile(Ref info) { ERR_FAIL_COND(!info.is_valid()); if (_projectile_scene.is_valid()) { Node *projectile = _projectile_scene->instance(); Node *p = info->caster_get()->get_parent(); ERR_FAIL_COND(!ObjectDB::instance_validate(p)); p->add_child(projectile); if (projectile->has_method("setup_projectile")) projectile->call("setup_projectile", info); } } void Spell::_handle_effect(Ref info) { ERR_FAIL_COND(!info.is_valid()); /* # var ok : bool = false # if (target_relation_type & TARGET_SELF): # ok = true # if not ok and (target_relation_type & TARGET_ENEMY and info.target is Entity): # ok = true # # if not ok and (target_relation_type & TARGET_FRIENDLY and info.target is Player): # ok = true # if not ok: # return */ bool has_target = ObjectDB::instance_validate(info->target_get()); if (_target_type == SPELL_TARGET_TYPE_TARGET) { if (!has_target) return; } else if (_target_type == SPELL_TARGET_TYPE_SELF) { info->target_set(info->caster_get()); } if (_damage_enabled && has_target) { Ref sdi; sdi.instance(); sdi->spell_source_set(Ref(this)); sdi->dealer_set(info->caster_get()); sdi->receiver_set(info->target_get()); handle_spell_damage(sdi); } if (is_aura()) { Ref ad; if (aura_get_aura_group().is_valid()) { ad = info->target_get()->aura_gets_with_group_by_bind(info->caster_get(), aura_get_aura_group()); } else { ad = info->target_get()->aura_gets_by(info->caster_get(), get_id()); } if (ad.is_valid()) { info->target_get()->aura_removes_exact(ad); } Ref aai; aai.instance(); aai->caster_set(info->caster_get()); aai->target_set(info->target_get()); aai->spell_scale_set(1); aai->set_aura(Ref(this)); aura_sapply(aai); } for (int i = 0; i < _spells_cast_on_caster.size(); ++i) { Ref spell = _spells_cast_on_caster.get(i); if (!spell.is_valid()) { continue; } Ref sci; sci.instance(); sci->caster_set(info->caster_get()); sci->target_set(info->caster_get()); sci->has_cast_time_set(spell->cast_time_get_enabled()); sci->cast_time_set(spell->cast_time_get()); sci->spell_scale_set(info->spell_scale_get()); sci->set_spell(spell); spell->cast_starts(sci); } if (has_target) { for (int i = 0; i < _spells_cast_on_target.size(); ++i) { Ref spell = _spells_cast_on_target.get(i); if (!spell.is_valid()) { continue; } Ref sci; sci.instance(); sci->caster_set(info->caster_get()); sci->target_set(info->target_get()); sci->has_cast_time_set(spell->cast_time_get_enabled()); sci->cast_time_set(spell->cast_time_get()); sci->spell_scale_set(info->spell_scale_get()); sci->set_spell(spell); spell->cast_starts(sci); } } } void Spell::_aura_sapply(Ref info) { ERR_FAIL_COND(!info.is_valid()); ERR_FAIL_COND(info->target_get() == NULL || info->caster_get() == NULL || !info->get_aura().is_valid()); Ref ad = info->target_get()->aura_gets_by(info->caster_get(), _id); if (!ad.is_valid()) { ad.instance(); setup_aura_data(ad, info); Entity *owner = ad->get_owner(); for (int i = 0; i < _aura_stat_attribute_count; ++i) { owner->stat_mod(_aura_stat_attributes[i].stat, _aura_stat_attributes[i].base_mod, _aura_stat_attributes[i].bonus_mod, _aura_stat_attributes[i].percent_mod); } if (_aura_add_states != 0) { for (int i = 0; i < EntityEnums::ENTITY_STATE_TYPE_INDEX_MAX; ++i) { int t = 1 << i; if ((_aura_add_states & t) != 0) { info->target_get()->state_ref_adds(i); } } } info->target_get()->aura_adds(ad); } else { ad->set_remaining_time(_aura_time); } } void Spell::_aura_sdeapply(Ref data) { ERR_FAIL_COND(!data.is_valid()); ERR_FAIL_COND(data->get_owner() == NULL || data->caster_get() == NULL || !data->get_aura().is_valid()); Entity *owner = data->get_owner(); for (int i = 0; i < _aura_stat_attribute_count; ++i) { owner->stat_mod(_aura_stat_attributes[i].stat, -_aura_stat_attributes[i].base_mod, -_aura_stat_attributes[i].bonus_mod, -_aura_stat_attributes[i].percent_mod); } if (_aura_add_states != 0) { for (int i = 0; i < EntityEnums::ENTITY_STATE_TYPE_INDEX_MAX; ++i) { int t = 1 << i; if ((_aura_add_states & t) != 0) { data->get_owner()->state_ref_removes(i); } } } } void Spell::_aura_sadd(Ref aura) { ERR_FAIL_COND(!aura.is_valid()); ERR_FAIL_COND(aura->get_owner() == NULL); //sapply(aura); aura->get_owner()->aura_removes(aura); aura->get_owner()->aura_adds(aura); } void Spell::_aura_sremove(Ref aura) { ERR_FAIL_COND(!aura.is_valid()); ERR_FAIL_COND(aura->get_owner() == NULL); aura_sdeapply(aura); aura->get_owner()->aura_removes(aura); } void Spell::_aura_removes_expired(Ref aura) { ERR_FAIL_COND(!aura.is_valid()); ERR_FAIL_COND(aura->get_owner() == NULL); aura_sdeapply(aura); aura->get_owner()->aura_removes_expired(aura); } void Spell::_aura_removes_dispell(Ref aura) { ERR_FAIL_COND(!aura.is_valid()); ERR_FAIL_COND(aura->get_owner() == NULL); aura_sdeapply(aura); aura->get_owner()->aura_removes_dispelled(aura); } void Spell::_aura_supdate(Ref aura, float delta) { ERR_FAIL_COND(!aura.is_valid()); bool remove = false; remove = aura->update(delta); //ontick while (aura->get_unhandled_ticks() > 0) { if (aura->damage_get() != 0) { Ref dpd = Ref(memnew(SpellDamageInfo())); dpd->aura_source_set(Ref(this)); dpd->dealer_set(aura->caster_get()); dpd->receiver_set(aura->get_owner()); handle_aura_damage(aura, dpd); } if (aura->heal_get() != 0) { Ref shi = Ref(memnew(SpellHealInfo())); shi->aura_source_set(Ref(this)); shi->dealer_set(aura->caster_get()); shi->receiver_set(aura->get_owner()); handle_aura_heal(aura, shi); } aura->set_unhandled_ticks(aura->get_unhandled_ticks() - 1); } if (remove) { aura_removes_expired(aura); } } void Spell::_setup_aura_data(Ref data, Ref info) { ERR_FAIL_COND(!data.is_valid()); ERR_FAIL_COND(!info.is_valid()); ERR_FAIL_COND(!ObjectDB::instance_validate(info->caster_get())); data->set_aura(Ref(this)); data->set_aura_id(get_id()); data->set_owner(info->target_get()); data->caster_set(info->caster_get()); data->set_tick(info->get_aura()->aura_get_tick()); if (aura_get_time() > 0.2) { data->set_is_timed(true); data->set_remaining_time(aura_get_time()); } else { data->set_is_timed(false); } if (aura_damage_get_enabled()) { aura_calculate_initial_damage(data, info); } if (aura_heal_get_enabled()) { aura_calculate_initial_heal(data, info); } } void Spell::_aura_sapply_passives_damage_receive(Ref info) { } void Spell::_aura_sapply_passives_damage_deal(Ref info) { } void Spell::_aura_calculate_initial_damage(Ref aura_data, Ref info) { ERR_FAIL_COND(!aura_data.is_valid()); ERR_FAIL_COND(!info.is_valid()); int min_damage = aura_damage_get_min(); int max_damage = aura_damage_get_max(); int mmm = (max_damage - min_damage); int damage = min_damage; if (mmm > 0) { Math::randomize(); damage = min_damage + (Math::rand() % mmm); if (aura_get_scale_with_level()) { damage = static_cast(damage * static_cast(info->caster_get()->gets_level()) / static_cast(ESS::get_singleton()->get_max_character_level())); } } aura_data->damage_set(damage); } void Spell::_handle_aura_damage(Ref aura_data, Ref info) { ERR_FAIL_COND(!aura_data.is_valid()); ERR_FAIL_COND(!info.is_valid()); ERR_FAIL_COND(!info->receiver_get()); if (info->dealer_get() && !ObjectDB::instance_validate(info->dealer_get())) { info->dealer_set(NULL); } info->damage_set(aura_data->damage_get()); info->aura_source_set(Ref(this)); if (info->dealer_get()) { info->dealer_get()->sdeal_damage_to(info); } else { info->receiver_get()->stake_damage(info); } } void Spell::_aura_sapply_passives_heal_receive(Ref data) { ERR_FAIL_COND(!data.is_valid()); } void Spell::_aura_sapply_passives_heal_deal(Ref data) { ERR_FAIL_COND(!data.is_valid()); } void Spell::_aura_calculate_initial_heal(Ref aura_data, Ref info) { ERR_FAIL_COND(!aura_data.is_valid()); ERR_FAIL_COND(!info.is_valid()); int min_heal = aura_heal_get_min(); int max_heal = aura_heal_get_max(); int mmm = (max_heal - min_heal); int heal = min_heal; if (mmm > 0) { Math::randomize(); heal = min_heal + (Math::rand() % mmm); if (aura_get_scale_with_level()) { heal = static_cast(heal * static_cast(info->caster_get()->gets_level()) / static_cast(ESS::get_singleton()->get_max_character_level())); } } aura_data->heal_set(heal); } void Spell::_handle_aura_heal(Ref aura_data, Ref info) { ERR_FAIL_COND(!aura_data.is_valid()); ERR_FAIL_COND(!info.is_valid()); ERR_FAIL_COND(!info->receiver_get()); if (info->dealer_get() && !ObjectDB::instance_validate(info->dealer_get())) { info->dealer_set(NULL); } info->heal_set(aura_data->heal_get()); if (info->dealer_get()) { info->dealer_get()->sdeal_heal_to(info); } else { info->receiver_get()->stake_heal(info); } } void Spell::_validate_property(PropertyInfo &property) const { String prop = property.name; if (prop.begins_with("aura_stat_attribute_")) { if (prop.ends_with("count")) { return; } int frame = prop.get_slicec('/', 0).get_slicec('_', 3).to_int(); if (frame >= _aura_stat_attribute_count) { property.usage = 0; } if (property.name.ends_with("stat")) { property.hint_string = ESS::get_singleton()->stat_get_string(); } } else if (prop == "diminishing_return_category") { property.hint_string = ESS::get_singleton()->dminishing_return_categories_get(); } else if (prop.begins_with("aura_trigger_")) { if (prop.ends_with("count")) { return; } int frame = prop.get_slicec('/', 0).get_slicec('_', 2).to_int(); if (frame >= _aura_trigger_count) { property.usage = 0; } else { if (prop.ends_with("notification_data")) { switch (_aura_trigger_datas[frame].notification_type) { case SpellEnums::TRIGGER_NOTIFICATION_TYPE_AURA: property.hint = PROPERTY_HINT_ENUM; property.hint_string = SpellEnums::BINDING_STRING_NOTIFICATION_AURAS; break; case SpellEnums::TRIGGER_NOTIFICATION_TYPE_DAMAGE: property.hint = PROPERTY_HINT_ENUM; property.hint_string = SpellEnums::BINDING_STRING_NOTIFICATION_DAMAGES; break; case SpellEnums::TRIGGER_NOTIFICATION_TYPE_HEAL: property.hint = PROPERTY_HINT_ENUM; property.hint_string = SpellEnums::BINDING_STRING_NOTIFICATION_HEALS; break; case SpellEnums::TRIGGER_NOTIFICATION_TYPE_CAST: property.hint = PROPERTY_HINT_ENUM; property.hint_string = SpellEnums::BINDING_STRING_NOTIFICATION_CASTS; break; case SpellEnums::TRIGGER_NOTIFICATION_TYPE_DEATH: property.hint = PROPERTY_HINT_NONE; property.hint_string = ""; break; case SpellEnums::TRIGGER_NOTIFICATION_TYPE_COOLDOWN_ADDED: property.hint = PROPERTY_HINT_NONE; property.hint_string = ""; break; case SpellEnums::TRIGGER_NOTIFICATION_TYPE_COOLDOWN_REMOVED: property.hint = PROPERTY_HINT_NONE; property.hint_string = ""; break; case SpellEnums::TRIGGER_NOTIFICATION_TYPE_CATEGORY_COOLDOWN_ADDED: property.hint = PROPERTY_HINT_NONE; property.hint_string = ""; break; case SpellEnums::TRIGGER_NOTIFICATION_TYPE_CATEGORY_COOLDOWN_REMOVED: property.hint = PROPERTY_HINT_NONE; property.hint_string = ""; break; case SpellEnums::TRIGGER_NOTIFICATION_TYPE_GCD_STARTED: property.hint = PROPERTY_HINT_NONE; property.hint_string = ""; break; case SpellEnums::TRIGGER_NOTIFICATION_TYPE_GCD_FINISHED: property.hint = PROPERTY_HINT_NONE; property.hint_string = ""; break; case SpellEnums::TRIGGER_NOTIFICATION_TYPE_XP_GAINED: property.hint = PROPERTY_HINT_NONE; property.hint_string = ""; break; case SpellEnums::TRIGGER_NOTIFICATION_TYPE_CLASS_LEVELUP: property.hint = PROPERTY_HINT_NONE; property.hint_string = ""; break; case SpellEnums::TRIGGER_NOTIFICATION_TYPE_CHARACTER_LEVELUP: property.hint = PROPERTY_HINT_NONE; property.hint_string = ""; break; case SpellEnums::TRIGGER_NOTIFICATION_TYPE_ENTITY_RESOURCE_ADDED: property.hint = PROPERTY_HINT_NONE; property.hint_string = ""; break; case SpellEnums::TRIGGER_NOTIFICATION_TYPE_ENTITY_RESOURCE_REMOVED: property.hint = PROPERTY_HINT_NONE; property.hint_string = ""; break; case SpellEnums::TRIGGER_NOTIFICATION_TYPE_AURA_CUSTOM: property.hint = PROPERTY_HINT_NONE; property.hint_string = ""; break; case SpellEnums::TRIGGER_NOTIFICATION_TYPE_DAMAGE_CUSTOM: property.hint = PROPERTY_HINT_NONE; property.hint_string = ""; break; case SpellEnums::TRIGGER_NOTIFICATION_TYPE_HEAL_CUSTOM: property.hint = PROPERTY_HINT_NONE; property.hint_string = ""; break; case SpellEnums::TRIGGER_NOTIFICATION_TYPE_CAST_CUSTOM: property.hint = PROPERTY_HINT_NONE; property.hint_string = ""; break; case SpellEnums::TRIGGER_NOTIFICATION_TYPE_CUSTOM: property.hint = PROPERTY_HINT_NONE; property.hint_string = ""; break; default: break; } } } } else if (property.name.ends_with("_stat")) { property.hint_string = ESS::get_singleton()->stat_get_string(); } } void Spell::_bind_methods() { //Commands ClassDB::bind_method(D_METHOD("cast_starts", "info"), &Spell::cast_starts); ClassDB::bind_method(D_METHOD("cast_starts_triggered", "info"), &Spell::cast_starts_triggered); ClassDB::bind_method(D_METHOD("cast_interrupts", "info"), &Spell::cast_interrupts); ClassDB::bind_method(D_METHOD("cast_finishs", "info"), &Spell::cast_finishs); BIND_VMETHOD(MethodInfo("_cast_starts", PropertyInfo(Variant::OBJECT, "info", PROPERTY_HINT_RESOURCE_TYPE, "SpellCastInfo"))); BIND_VMETHOD(MethodInfo("_cast_starts_triggered", PropertyInfo(Variant::OBJECT, "info", PROPERTY_HINT_RESOURCE_TYPE, "SpellCastInfo"))); BIND_VMETHOD(MethodInfo("_cast_interrupts", PropertyInfo(Variant::OBJECT, "info", PROPERTY_HINT_RESOURCE_TYPE, "SpellCastInfo"))); BIND_VMETHOD(MethodInfo("_cast_finishs", PropertyInfo(Variant::OBJECT, "info", PROPERTY_HINT_RESOURCE_TYPE, "SpellCastInfo"))); //Aura Commands ClassDB::bind_method(D_METHOD("aura_sapply", "info"), &Spell::aura_sapply); ClassDB::bind_method(D_METHOD("aura_sdeapply", "aura"), &Spell::aura_sdeapply); ClassDB::bind_method(D_METHOD("aura_sadd", "aura"), &Spell::aura_sadd); ClassDB::bind_method(D_METHOD("aura_sremove", "aura"), &Spell::aura_sremove); ClassDB::bind_method(D_METHOD("aura_removes_expired", "aura"), &Spell::aura_removes_expired); ClassDB::bind_method(D_METHOD("aura_removes_dispell", "aura"), &Spell::aura_removes_dispell); ClassDB::bind_method(D_METHOD("aura_supdate", "aura", "delta"), &Spell::aura_supdate); BIND_VMETHOD(MethodInfo("_aura_sapply", PropertyInfo(Variant::OBJECT, "info", PROPERTY_HINT_RESOURCE_TYPE, "AuraApplyInfo"))); BIND_VMETHOD(MethodInfo("_aura_sdeapply", PropertyInfo(Variant::OBJECT, "info", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"))); BIND_VMETHOD(MethodInfo("_aura_sadd", PropertyInfo(Variant::OBJECT, "aura", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"))); BIND_VMETHOD(MethodInfo("_aura_sremove", PropertyInfo(Variant::OBJECT, "aura", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"))); BIND_VMETHOD(MethodInfo("_aura_removes_expired", PropertyInfo(Variant::OBJECT, "info", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"))); BIND_VMETHOD(MethodInfo("_aura_removes_dispell", PropertyInfo(Variant::OBJECT, "info", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"))); BIND_VMETHOD(MethodInfo("_aura_supdate", PropertyInfo(Variant::OBJECT, "info", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"), PropertyInfo(Variant::REAL, "delta"))); ClassDB::bind_method(D_METHOD("_aura_sapply", "info"), &Spell::_aura_sapply); ClassDB::bind_method(D_METHOD("_aura_sdeapply", "aura"), &Spell::_aura_sdeapply); ClassDB::bind_method(D_METHOD("_aura_sadd", "aura"), &Spell::_aura_sadd); ClassDB::bind_method(D_METHOD("_aura_sremove", "aura"), &Spell::_aura_sremove); ClassDB::bind_method(D_METHOD("_aura_removes_expired", "aura"), &Spell::_aura_removes_expired); ClassDB::bind_method(D_METHOD("_aura_removes_dispell", "aura"), &Spell::_aura_removes_dispell); ClassDB::bind_method(D_METHOD("_aura_supdate", "aura", "delta"), &Spell::_aura_supdate); //Eventhandlers ClassDB::bind_method(D_METHOD("son_cast_player_moved", "info"), &Spell::son_cast_player_moved); ClassDB::bind_method(D_METHOD("son_cast_damage_received", "info"), &Spell::son_cast_damage_received); ClassDB::bind_method(D_METHOD("son_spell_hit", "info"), &Spell::son_spell_hit); ClassDB::bind_method(D_METHOD("son_physics_process", "info", "delta"), &Spell::son_physics_process); BIND_VMETHOD(MethodInfo("_son_cast_player_moved", PropertyInfo(Variant::OBJECT, "info", PROPERTY_HINT_RESOURCE_TYPE, "SpellCastInfo"))); BIND_VMETHOD(MethodInfo("_son_cast_damage_received", PropertyInfo(Variant::OBJECT, "info", PROPERTY_HINT_RESOURCE_TYPE, "SpellCastInfo"))); BIND_VMETHOD(MethodInfo("_son_spell_hit", PropertyInfo(Variant::OBJECT, "info", PROPERTY_HINT_RESOURCE_TYPE, "SpellCastInfo"))); BIND_VMETHOD(MethodInfo("_son_physics_process", PropertyInfo(Variant::OBJECT, "info", PROPERTY_HINT_RESOURCE_TYPE, "SpellCastInfo"), PropertyInfo(Variant::REAL, "delta"))); //Clientside Event Handlers BIND_VMETHOD(MethodInfo("_notification_scast", PropertyInfo(Variant::INT, "what"), PropertyInfo(Variant::OBJECT, "info", PROPERTY_HINT_RESOURCE_TYPE, "SpellCastInfo"))); ClassDB::bind_method(D_METHOD("notification_scast", "what", "info"), &Spell::notification_scast); BIND_VMETHOD(MethodInfo("_notification_ccast", PropertyInfo(Variant::INT, "what"), PropertyInfo(Variant::OBJECT, "info", PROPERTY_HINT_RESOURCE_TYPE, "SpellCastInfo"))); ClassDB::bind_method(D_METHOD("notification_ccast", "what", "info"), &Spell::notification_ccast); //Aura EventHandlers BIND_VMETHOD(MethodInfo("_notification_saura", PropertyInfo(Variant::INT, "what"), PropertyInfo(Variant::OBJECT, "aura_data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"))); BIND_VMETHOD(MethodInfo("_notification_sheal", PropertyInfo(Variant::INT, "what"), PropertyInfo(Variant::OBJECT, "aura_data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"), PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "SpellHealInfo"))); BIND_VMETHOD(MethodInfo("_notification_aura_scast", PropertyInfo(Variant::INT, "what"), PropertyInfo(Variant::OBJECT, "aura_data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"), PropertyInfo(Variant::OBJECT, "info", PROPERTY_HINT_RESOURCE_TYPE, "SpellCastInfo"))); BIND_VMETHOD(MethodInfo("_notification_sdamage", PropertyInfo(Variant::INT, "what"), PropertyInfo(Variant::OBJECT, "aura_data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"), PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "SpellDamageInfo"))); ClassDB::bind_method(D_METHOD("notification_saura", "what", "data"), &Spell::notification_saura); ClassDB::bind_method(D_METHOD("notification_sheal", "what", "aura", "info"), &Spell::notification_sheal); ClassDB::bind_method(D_METHOD("notification_aura_scast", "what", "aura", "info"), &Spell::notification_aura_scast); ClassDB::bind_method(D_METHOD("notification_sdamage", "what", "aura", "info"), &Spell::notification_sdamage); ClassDB::bind_method(D_METHOD("son_remove", "aura"), &Spell::son_remove); ClassDB::bind_method(D_METHOD("son_remove_expired", "aura"), &Spell::son_remove_expired); ClassDB::bind_method(D_METHOD("son_remove_dispell", "aura"), &Spell::son_remove_dispell); ClassDB::bind_method(D_METHOD("notification_sdeath", "data"), &Spell::notification_sdeath); ClassDB::bind_method(D_METHOD("notification_scooldown_added", "data", "cooldown"), &Spell::notification_scooldown_added); ClassDB::bind_method(D_METHOD("notification_scooldown_removed", "data", "cooldown"), &Spell::notification_scooldown_removed); ClassDB::bind_method(D_METHOD("notification_scategory_cooldown_added", "data", "category_cooldown"), &Spell::notification_scategory_cooldown_added); ClassDB::bind_method(D_METHOD("notification_scategory_cooldown_removed", "data", "category_cooldown"), &Spell::notification_scategory_cooldown_removed); ClassDB::bind_method(D_METHOD("notification_sgcd_started", "data", "gcd"), &Spell::notification_sgcd_started); ClassDB::bind_method(D_METHOD("notification_sgcd_finished", "data"), &Spell::notification_sgcd_finished); ClassDB::bind_method(D_METHOD("son_physics_process_aura", "data"), &Spell::son_physics_process_aura); ClassDB::bind_method(D_METHOD("notification_sxp_gained", "data", "value"), &Spell::notification_sxp_gained); ClassDB::bind_method(D_METHOD("notification_slevel_up", "data", "value"), &Spell::notification_slevel_up); ClassDB::bind_method(D_METHOD("notification_sentity_resource_added", "data", "value"), &Spell::notification_sentity_resource_added); ClassDB::bind_method(D_METHOD("notification_sentity_resource_removed", "data", "value"), &Spell::notification_sentity_resource_removed); BIND_VMETHOD(MethodInfo("_son_remove", PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"))); BIND_VMETHOD(MethodInfo("_son_remove_expired", PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"))); BIND_VMETHOD(MethodInfo("_son_remove_dispell", PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"))); BIND_VMETHOD(MethodInfo("_notification_sdeath", PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"))); BIND_VMETHOD(MethodInfo("_notification_scooldown_added", PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"), PropertyInfo(Variant::INT, "id"), PropertyInfo(Variant::REAL, "value"))); BIND_VMETHOD(MethodInfo("_notification_scooldown_removed", PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"), PropertyInfo(Variant::INT, "id"), PropertyInfo(Variant::REAL, "value"))); BIND_VMETHOD(MethodInfo("_notification_scategory_cooldown_added", PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"), PropertyInfo(Variant::INT, "id"), PropertyInfo(Variant::REAL, "value"))); BIND_VMETHOD(MethodInfo("_notification_scategory_cooldown_removed", PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"), PropertyInfo(Variant::INT, "id"), PropertyInfo(Variant::REAL, "value"))); BIND_VMETHOD(MethodInfo("_notification_sgcd_started", PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"), PropertyInfo(Variant::REAL, "gcd"))); BIND_VMETHOD(MethodInfo("_notification_sgcd_finished", PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"))); BIND_VMETHOD(MethodInfo("_son_physics_process_aura", PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"))); BIND_VMETHOD(MethodInfo("_notification_sxp_gained", PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"), PropertyInfo(Variant::INT, "value"))); BIND_VMETHOD(MethodInfo("_notification_slevel_up", PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"), PropertyInfo(Variant::INT, "value"))); BIND_VMETHOD(MethodInfo("_notification_sentity_resource_added", PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"), PropertyInfo(Variant::INT, "value"))); BIND_VMETHOD(MethodInfo("_notification_sentity_resource_removed", PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"), PropertyInfo(Variant::INT, "value"))); //Aura Clientside Event Handlers BIND_VMETHOD(MethodInfo("_notification_caura", PropertyInfo(Variant::INT, "what"), PropertyInfo(Variant::OBJECT, "aura_data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"))); BIND_VMETHOD(MethodInfo("_notification_cheal", PropertyInfo(Variant::INT, "what"), PropertyInfo(Variant::OBJECT, "aura_data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"), PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "SpellHealInfo"))); BIND_VMETHOD(MethodInfo("_notification_aura_ccast", PropertyInfo(Variant::INT, "what"), PropertyInfo(Variant::OBJECT, "aura_data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"), PropertyInfo(Variant::OBJECT, "info", PROPERTY_HINT_RESOURCE_TYPE, "SpellCastInfo"))); BIND_VMETHOD(MethodInfo("_notification_cdamage", PropertyInfo(Variant::INT, "what"), PropertyInfo(Variant::OBJECT, "aura_data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"), PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "SpellDamageInfo"))); ClassDB::bind_method(D_METHOD("notification_caura", "what", "data"), &Spell::notification_caura); ClassDB::bind_method(D_METHOD("notification_cheal", "what", "aura", "info"), &Spell::notification_cheal); ClassDB::bind_method(D_METHOD("notification_aura_ccast", "what", "aura", "info"), &Spell::notification_aura_ccast); ClassDB::bind_method(D_METHOD("notification_cdamage", "what", "aura", "info"), &Spell::notification_cdamage); ClassDB::bind_method(D_METHOD("notification_cdeath", "data"), &Spell::notification_cdeath); ClassDB::bind_method(D_METHOD("notification_ccooldown_added", "data", "info"), &Spell::notification_ccooldown_added); ClassDB::bind_method(D_METHOD("notification_ccooldown_removed", "data", "info"), &Spell::notification_ccooldown_removed); ClassDB::bind_method(D_METHOD("notification_ccategory_cooldown_added", "data", "info"), &Spell::notification_ccategory_cooldown_added); ClassDB::bind_method(D_METHOD("notification_ccategory_cooldown_removed", "data", "info"), &Spell::notification_ccategory_cooldown_removed); ClassDB::bind_method(D_METHOD("notification_cgcd_started", "data", "info"), &Spell::notification_cgcd_started); ClassDB::bind_method(D_METHOD("notification_cgcd_finished", "data"), &Spell::notification_cgcd_finished); ClassDB::bind_method(D_METHOD("notification_cxp_gained", "data", "value"), &Spell::notification_cxp_gained); ClassDB::bind_method(D_METHOD("notification_clevel_up", "data", "value"), &Spell::notification_clevel_up); ClassDB::bind_method(D_METHOD("notification_centity_resource_added", "data", "value"), &Spell::notification_centity_resource_added); ClassDB::bind_method(D_METHOD("notification_centity_resource_removed", "data", "value"), &Spell::notification_centity_resource_removed); BIND_VMETHOD(MethodInfo("_con_cast_failed", PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"), PropertyInfo(Variant::OBJECT, "info", PROPERTY_HINT_RESOURCE_TYPE, "SpellCastInfo"))); BIND_VMETHOD(MethodInfo("_con_cast_started", PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"), PropertyInfo(Variant::OBJECT, "info", PROPERTY_HINT_RESOURCE_TYPE, "SpellCastInfo"))); BIND_VMETHOD(MethodInfo("_con_cast_state_changed", PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"), PropertyInfo(Variant::OBJECT, "info", PROPERTY_HINT_RESOURCE_TYPE, "SpellCastInfo"))); BIND_VMETHOD(MethodInfo("_con_cast_finished", PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"), PropertyInfo(Variant::OBJECT, "info", PROPERTY_HINT_RESOURCE_TYPE, "SpellCastInfo"))); BIND_VMETHOD(MethodInfo("_con_spell_cast_success", PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"), PropertyInfo(Variant::OBJECT, "info", PROPERTY_HINT_RESOURCE_TYPE, "SpellCastInfo"))); BIND_VMETHOD(MethodInfo("_notification_cdeath", PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"))); BIND_VMETHOD(MethodInfo("_notification_ccooldown_added", PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"), PropertyInfo(Variant::INT, "id"), PropertyInfo(Variant::REAL, "value"))); BIND_VMETHOD(MethodInfo("_notification_ccooldown_removed", PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"), PropertyInfo(Variant::INT, "id"), PropertyInfo(Variant::REAL, "value"))); BIND_VMETHOD(MethodInfo("_notification_ccategory_cooldown_added", PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"), PropertyInfo(Variant::INT, "id"), PropertyInfo(Variant::REAL, "value"))); BIND_VMETHOD(MethodInfo("_notification_ccategory_cooldown_removed", PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"), PropertyInfo(Variant::INT, "id"), PropertyInfo(Variant::REAL, "value"))); BIND_VMETHOD(MethodInfo("_con_aura_added", PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"))); BIND_VMETHOD(MethodInfo("_con_aura_removed", PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"))); BIND_VMETHOD(MethodInfo("_con_aura_refresh", PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"))); BIND_VMETHOD(MethodInfo("_con_damage_dealt", PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"), PropertyInfo(Variant::OBJECT, "info", PROPERTY_HINT_RESOURCE_TYPE, "SpellDamageInfo"))); BIND_VMETHOD(MethodInfo("_con_dealt_damage", PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"), PropertyInfo(Variant::OBJECT, "info", PROPERTY_HINT_RESOURCE_TYPE, "SpellDamageInfo"))); BIND_VMETHOD(MethodInfo("_con_heal_dealt", PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"), PropertyInfo(Variant::OBJECT, "info", PROPERTY_HINT_RESOURCE_TYPE, "SpellHealInfo"))); BIND_VMETHOD(MethodInfo("_con_dealt_heal", PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"), PropertyInfo(Variant::OBJECT, "info", PROPERTY_HINT_RESOURCE_TYPE, "SpellHealInfo"))); BIND_VMETHOD(MethodInfo("_notification_cgcd_started", PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"), PropertyInfo(Variant::REAL, "gcd"))); BIND_VMETHOD(MethodInfo("_notification_cgcd_finished", PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"))); BIND_VMETHOD(MethodInfo("_notification_cxp_gained", PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"), PropertyInfo(Variant::INT, "value"))); BIND_VMETHOD(MethodInfo("_notification_clevel_up", PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"), PropertyInfo(Variant::INT, "value"))); BIND_VMETHOD(MethodInfo("_notification_centity_resource_added", PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"), PropertyInfo(Variant::INT, "value"))); BIND_VMETHOD(MethodInfo("_notification_centity_resource_removed", PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"), PropertyInfo(Variant::INT, "value"))); //Equipment BIND_VMETHOD(MethodInfo(PropertyInfo(Variant::BOOL, "ret"), "_equip_should_deny", PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"), PropertyInfo(Variant::INT, "equip_slot"), PropertyInfo(Variant::OBJECT, "item", PROPERTY_HINT_RESOURCE_TYPE, "ItemInstance"))); BIND_VMETHOD(MethodInfo("_equip_son_success", PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"), PropertyInfo(Variant::INT, "equip_slot"), PropertyInfo(Variant::OBJECT, "item", PROPERTY_HINT_RESOURCE_TYPE, "ItemInstance"), PropertyInfo(Variant::OBJECT, "old_item", PROPERTY_HINT_RESOURCE_TYPE, "ItemInstance"), PropertyInfo(Variant::INT, "bag_slot"))); BIND_VMETHOD(MethodInfo("_equip_son_fail", PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"), PropertyInfo(Variant::INT, "equip_slot"), PropertyInfo(Variant::OBJECT, "item", PROPERTY_HINT_RESOURCE_TYPE, "ItemInstance"), PropertyInfo(Variant::OBJECT, "old_item", PROPERTY_HINT_RESOURCE_TYPE, "ItemInstance"), PropertyInfo(Variant::INT, "bag_slot"))); BIND_VMETHOD(MethodInfo("_equip_con_success", PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"), PropertyInfo(Variant::INT, "equip_slot"), PropertyInfo(Variant::OBJECT, "item", PROPERTY_HINT_RESOURCE_TYPE, "ItemInstance"), PropertyInfo(Variant::OBJECT, "old_item", PROPERTY_HINT_RESOURCE_TYPE, "ItemInstance"), PropertyInfo(Variant::INT, "bag_slot"))); BIND_VMETHOD(MethodInfo("_equip_con_fail", PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"), PropertyInfo(Variant::INT, "equip_slot"), PropertyInfo(Variant::OBJECT, "item", PROPERTY_HINT_RESOURCE_TYPE, "ItemInstance"), PropertyInfo(Variant::OBJECT, "old_item", PROPERTY_HINT_RESOURCE_TYPE, "ItemInstance"), PropertyInfo(Variant::INT, "bag_slot"))); ClassDB::bind_method(D_METHOD("equip_should_deny", "data", "equip_slot", "item"), &Spell::equip_should_deny); ClassDB::bind_method(D_METHOD("equip_son_success", "data", "equip_slot", "item", "old_item", "bag_slot"), &Spell::equip_son_success); ClassDB::bind_method(D_METHOD("equip_son_fail", "data", "equip_slot", "item", "old_item", "bag_slot"), &Spell::equip_son_fail); ClassDB::bind_method(D_METHOD("equip_con_success", "data", "equip_slot", "item", "old_item", "bag_slot"), &Spell::equip_con_success); ClassDB::bind_method(D_METHOD("equip_con_fail", "data", "equip_slot", "item", "old_item", "bag_slot"), &Spell::equip_con_fail); //Calculations / Queries ClassDB::bind_method(D_METHOD("calculate_initial_damage", "data"), &Spell::calculate_initial_damage); ClassDB::bind_method(D_METHOD("handle_spell_damage", "data"), &Spell::handle_spell_damage); BIND_VMETHOD(MethodInfo("_calculate_initial_damage", PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "SpellDamageInfo"))); BIND_VMETHOD(MethodInfo("_handle_spell_damage", PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "SpellDamageInfo"))); ClassDB::bind_method(D_METHOD("calculate_initial_heal", "data"), &Spell::calculate_initial_heal); ClassDB::bind_method(D_METHOD("handle_spell_heal", "data"), &Spell::handle_spell_heal); BIND_VMETHOD(MethodInfo("_calculate_initial_heal", PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "SpellHealInfo"))); BIND_VMETHOD(MethodInfo("_handle_spell_heal", PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "SpellHealInfo"))); ClassDB::bind_method(D_METHOD("handle_projectile", "info"), &Spell::handle_projectile); ClassDB::bind_method(D_METHOD("handle_effect", "info"), &Spell::handle_effect); BIND_VMETHOD(MethodInfo("_handle_projectile", PropertyInfo(Variant::OBJECT, "info", PROPERTY_HINT_RESOURCE_TYPE, "SpellCastInfo"))); BIND_VMETHOD(MethodInfo("_handle_effect", PropertyInfo(Variant::OBJECT, "info", PROPERTY_HINT_RESOURCE_TYPE, "SpellCastInfo"))); ClassDB::bind_method(D_METHOD("handle_gcd", "info"), &Spell::handle_gcd); ClassDB::bind_method(D_METHOD("handle_cooldown", "info"), &Spell::handle_cooldown); //Implementations ClassDB::bind_method(D_METHOD("_cast_starts", "info"), &Spell::_cast_starts); ClassDB::bind_method(D_METHOD("_cast_finishs", "info"), &Spell::_cast_finishs); ClassDB::bind_method(D_METHOD("_son_cast_player_moved", "info"), &Spell::_son_cast_player_moved); ClassDB::bind_method(D_METHOD("_son_spell_hit", "info"), &Spell::_son_spell_hit); ClassDB::bind_method(D_METHOD("_calculate_initial_damage", "info"), &Spell::_calculate_initial_damage); ClassDB::bind_method(D_METHOD("_handle_spell_damage", "info"), &Spell::_handle_spell_damage); ClassDB::bind_method(D_METHOD("_calculate_initial_heal", "info"), &Spell::_calculate_initial_heal); ClassDB::bind_method(D_METHOD("_handle_spell_heal", "info"), &Spell::_handle_spell_heal); ClassDB::bind_method(D_METHOD("_handle_projectile", "info"), &Spell::_handle_projectile); ClassDB::bind_method(D_METHOD("_handle_effect", "info"), &Spell::_handle_effect); //Aura Calculations / Queries ClassDB::bind_method(D_METHOD("setup_aura_data", "data", "info"), &Spell::setup_aura_data); BIND_VMETHOD(MethodInfo("_setup_aura_data", PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"), PropertyInfo(Variant::OBJECT, "info", PROPERTY_HINT_RESOURCE_TYPE, "AuraApplyInfo"))); ClassDB::bind_method(D_METHOD("_setup_aura_data", "data", "info"), &Spell::_setup_aura_data); //damage ClassDB::bind_method(D_METHOD("aura_sapply_passives_damage_receive", "data"), &Spell::aura_sapply_passives_damage_receive); ClassDB::bind_method(D_METHOD("aura_sapply_passives_damage_deal", "data"), &Spell::aura_sapply_passives_damage_deal); ClassDB::bind_method(D_METHOD("aura_calculate_initial_damage", "aura_data", "info"), &Spell::aura_calculate_initial_damage); ClassDB::bind_method(D_METHOD("handle_aura_damage", "aura_data", "data"), &Spell::handle_aura_damage); BIND_VMETHOD(MethodInfo("_aura_sapply_passives_damage_receive", PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "SpellDamageInfo"))); BIND_VMETHOD(MethodInfo("_aura_sapply_passives_damage_deal", PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "SpellDamageInfo"))); BIND_VMETHOD(MethodInfo("_aura_calculate_initial_damage", PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"), PropertyInfo(Variant::OBJECT, "info", PROPERTY_HINT_RESOURCE_TYPE, "AuraApplyInfo"))); BIND_VMETHOD(MethodInfo("_handle_aura_damage", PropertyInfo(Variant::OBJECT, "data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"), PropertyInfo(Variant::OBJECT, "info", PROPERTY_HINT_RESOURCE_TYPE, "SpellDamageInfo"))); ClassDB::bind_method(D_METHOD("_aura_sapply_passives_damage_receive", "info"), &Spell::_aura_sapply_passives_damage_receive); ClassDB::bind_method(D_METHOD("_aura_sapply_passives_damage_deal", "info"), &Spell::_aura_sapply_passives_damage_deal); ClassDB::bind_method(D_METHOD("_aura_calculate_initial_damage", "aura_data", "info"), &Spell::_aura_calculate_initial_damage); ClassDB::bind_method(D_METHOD("_handle_aura_damage", "aura_data", "info"), &Spell::_handle_aura_damage); //heal ClassDB::bind_method(D_METHOD("aura_sapply_passives_heal_receive", "data"), &Spell::aura_sapply_passives_heal_receive); ClassDB::bind_method(D_METHOD("aura_sapply_passives_heal_deal", "data"), &Spell::aura_sapply_passives_heal_deal); ClassDB::bind_method(D_METHOD("aura_calculate_initial_heal", "aura_data", "info"), &Spell::aura_calculate_initial_heal); ClassDB::bind_method(D_METHOD("handle_aura_heal", "aura_data", "data"), &Spell::handle_aura_heal); BIND_VMETHOD(MethodInfo("_aura_sapply_passives_heal_receive", PropertyInfo(Variant::OBJECT, "info", PROPERTY_HINT_RESOURCE_TYPE, "SpellDamageInfo"))); BIND_VMETHOD(MethodInfo("_aura_sapply_passives_heal_deal", PropertyInfo(Variant::OBJECT, "info", PROPERTY_HINT_RESOURCE_TYPE, "SpellDamageInfo"))); BIND_VMETHOD(MethodInfo("_aura_calculate_initial_heal", PropertyInfo(Variant::OBJECT, "aura_data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"), PropertyInfo(Variant::OBJECT, "info", PROPERTY_HINT_RESOURCE_TYPE, "AuraApplyInfo"))); BIND_VMETHOD(MethodInfo("_handle_aura_heal", PropertyInfo(Variant::OBJECT, "aura_data", PROPERTY_HINT_RESOURCE_TYPE, "AuraData"), PropertyInfo(Variant::OBJECT, "spell_heal_info", PROPERTY_HINT_RESOURCE_TYPE, "SpellHealInfo"))); ClassDB::bind_method(D_METHOD("_aura_sapply_passives_heal_receive", "info"), &Spell::_aura_sapply_passives_heal_receive); ClassDB::bind_method(D_METHOD("_aura_sapply_passives_heal_deal", "info"), &Spell::_aura_sapply_passives_heal_deal); ClassDB::bind_method(D_METHOD("_aura_calculate_initial_heal", "aura_data", "info"), &Spell::_aura_calculate_initial_heal); ClassDB::bind_method(D_METHOD("_handle_aura_heal", "aura_data", "info"), &Spell::_handle_aura_heal); //Properties ClassDB::bind_method(D_METHOD("get_id"), &Spell::get_id); ClassDB::bind_method(D_METHOD("set_id", "value"), &Spell::set_id); ADD_PROPERTY(PropertyInfo(Variant::INT, "id"), "set_id", "get_id"); ClassDB::bind_method(D_METHOD("spell_type_get"), &Spell::spell_type_get); ClassDB::bind_method(D_METHOD("spell_type_set", "value"), &Spell::spell_type_set); ADD_PROPERTY(PropertyInfo(Variant::INT, "spell_type", PROPERTY_HINT_FLAGS, SpellEnums::BINDING_STRING_SPELL_TYPES), "spell_type_set", "spell_type_get"); ClassDB::bind_method(D_METHOD("get_spell_category"), &Spell::get_spell_category); ClassDB::bind_method(D_METHOD("set_spell_category", "value"), &Spell::set_spell_category); ADD_PROPERTY(PropertyInfo(Variant::INT, "spell_category", PROPERTY_HINT_ENUM, SpellEnums::BINDING_STRING_SPELL_CATEGORY), "set_spell_category", "get_spell_category"); ClassDB::bind_method(D_METHOD("get_hide_from_actionbar"), &Spell::get_hide_from_actionbar); ClassDB::bind_method(D_METHOD("set_hide_from_actionbar", "value"), &Spell::set_hide_from_actionbar); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "hide_from_actionbar"), "set_hide_from_actionbar", "get_hide_from_actionbar"); ClassDB::bind_method(D_METHOD("get_target_type"), &Spell::get_target_type); ClassDB::bind_method(D_METHOD("set_target_type", "value"), &Spell::set_target_type); ADD_PROPERTY(PropertyInfo(Variant::INT, "target_type", PROPERTY_HINT_ENUM, "Self, Target, Around, Front, Around Target"), "set_target_type", "get_target_type"); ClassDB::bind_method(D_METHOD("get_target_relation_type"), &Spell::get_target_relation_type); ClassDB::bind_method(D_METHOD("set_target_relation_type", "value"), &Spell::set_target_relation_type); ADD_PROPERTY(PropertyInfo(Variant::INT, "target_relation_type", PROPERTY_HINT_FLAGS, "Self, Enemy, Friendly"), "set_target_relation_type", "get_target_relation_type"); ClassDB::bind_method(D_METHOD("get_level"), &Spell::get_level); ClassDB::bind_method(D_METHOD("set_level", "value"), &Spell::set_level); ADD_PROPERTY(PropertyInfo(Variant::INT, "level"), "set_level", "get_level"); ClassDB::bind_method(D_METHOD("get_rank"), &Spell::get_rank); ClassDB::bind_method(D_METHOD("set_rank", "value"), &Spell::set_rank); ADD_PROPERTY(PropertyInfo(Variant::INT, "rank"), "set_rank", "get_rank"); ClassDB::bind_method(D_METHOD("get_is_local_spell"), &Spell::get_is_local_spell); ClassDB::bind_method(D_METHOD("set_is_local_spell", "value"), &Spell::set_is_local_spell); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "is_local_spell"), "set_is_local_spell", "get_is_local_spell"); ClassDB::bind_method(D_METHOD("get_icon"), &Spell::get_icon); ClassDB::bind_method(D_METHOD("set_icon", "value"), &Spell::set_icon); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "icon", PROPERTY_HINT_RESOURCE_TYPE, "Texture"), "set_icon", "get_icon"); ClassDB::bind_method(D_METHOD("get_needs_target"), &Spell::get_needs_target); ClassDB::bind_method(D_METHOD("set_needs_target", "value"), &Spell::set_needs_target); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "needs_target"), "set_needs_target", "get_needs_target"); ClassDB::bind_method(D_METHOD("get_scale_with_level"), &Spell::get_scale_with_level); ClassDB::bind_method(D_METHOD("set_scale_with_level", "value"), &Spell::set_scale_with_level); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "scale_with_level"), "set_scale_with_level", "get_scale_with_level"); ClassDB::bind_method(D_METHOD("get_visual_spell_effects"), &Spell::get_visual_spell_effects); ClassDB::bind_method(D_METHOD("set_visual_spell_effects", "value"), &Spell::set_visual_spell_effects); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "visual_spell_effects", PROPERTY_HINT_RESOURCE_TYPE, "SpellEffectVisual"), "set_visual_spell_effects", "get_visual_spell_effects"); ClassDB::bind_method(D_METHOD("get_teaches_craft_recipe"), &Spell::get_teaches_craft_recipe); ClassDB::bind_method(D_METHOD("set_teaches_craft_recipe", "value"), &Spell::set_teaches_craft_recipe); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "teaches_craft_recipe", PROPERTY_HINT_RESOURCE_TYPE, "CraftRecipe"), "set_teaches_craft_recipe", "get_teaches_craft_recipe"); ADD_GROUP("Spells Cast", "spells_cast_"); //ADD_GROUP("Caster Aura Applies", "caster_aura_applys"); ClassDB::bind_method(D_METHOD("spells_cast_on_caster_num_get"), &Spell::spells_cast_on_caster_num_get); ClassDB::bind_method(D_METHOD("spells_cast_on_caster_num_set", "value"), &Spell::spells_cast_on_caster_num_set); ClassDB::bind_method(D_METHOD("spell_cast_on_caster_get", "index"), &Spell::spell_cast_on_caster_get); ClassDB::bind_method(D_METHOD("spell_cast_on_caster_set", "index", "spell"), &Spell::spell_cast_on_caster_set); ClassDB::bind_method(D_METHOD("spells_cast_on_caster_get"), &Spell::spells_cast_on_caster_get); ClassDB::bind_method(D_METHOD("spells_cast_on_caster_set", "caster_aura_applys"), &Spell::spells_cast_on_caster_set); ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "spells_cast_on_caster", PROPERTY_HINT_NONE, "23/20:Spell", PROPERTY_USAGE_DEFAULT, "Spell"), "spells_cast_on_caster_set", "spells_cast_on_caster_get"); //ADD_GROUP("Target Aura Apply", "target_aura_applys"); ClassDB::bind_method(D_METHOD("spells_cast_on_target_num_get"), &Spell::spells_cast_on_target_num_get); ClassDB::bind_method(D_METHOD("spells_cast_on_target_num_set", "value"), &Spell::spells_cast_on_target_num_set); ClassDB::bind_method(D_METHOD("spell_cast_on_target_get", "index"), &Spell::spell_cast_on_target_get); ClassDB::bind_method(D_METHOD("spell_cast_on_target_set", "index", "spell"), &Spell::spell_cast_on_target_set); ClassDB::bind_method(D_METHOD("spells_cast_on_target_get"), &Spell::spells_cast_on_target_get); ClassDB::bind_method(D_METHOD("spells_cast_on_target_set", "target_aura_applys"), &Spell::spells_cast_on_target_set); ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "spells_cast_on_target", PROPERTY_HINT_NONE, "23/20:Spell", PROPERTY_USAGE_DEFAULT, "Spell"), "spells_cast_on_target_set", "spells_cast_on_target_get"); //ADD_GROUP("Apply Auras On Learn", "on_learn_auras"); ClassDB::bind_method(D_METHOD("on_learn_cast_spells_num_get"), &Spell::on_learn_cast_spells_num_get); ClassDB::bind_method(D_METHOD("on_learn_cast_spells_num_set", "value"), &Spell::on_learn_cast_spells_num_set); ClassDB::bind_method(D_METHOD("spell_cast_on_learn_get", "index"), &Spell::spell_cast_on_learn_get); ClassDB::bind_method(D_METHOD("spell_cast_on_learn_set", "index", "spell"), &Spell::spell_cast_on_learn_set); ClassDB::bind_method(D_METHOD("spells_cast_on_learn_get"), &Spell::spells_cast_on_learn_get); ClassDB::bind_method(D_METHOD("spells_cast_on_learn_set", "spells"), &Spell::spells_cast_on_learn_set); ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "spells_cast_on_learn", PROPERTY_HINT_NONE, "23/20:Spell", PROPERTY_USAGE_DEFAULT, "Spell"), "spells_cast_on_learn_set", "spells_cast_on_learn_get"); ADD_GROUP("Texts", "text"); BIND_VMETHOD(MethodInfo(PropertyInfo(Variant::STRING, "desc"), "_get_description", PropertyInfo(Variant::INT, "class_level"), PropertyInfo(Variant::INT, "character_level"))); ADD_PROPERTY(PropertyInfo(Variant::STRING, "text_name"), "set_name", "get_name"); ClassDB::bind_method(D_METHOD("get_text_translation_key"), &Spell::get_text_translation_key); ClassDB::bind_method(D_METHOD("set_text_translation_key", "value"), &Spell::set_text_description); ADD_PROPERTY(PropertyInfo(Variant::STRING, "text_translation_key"), "set_text_translation_key", "get_text_translation_key"); ClassDB::bind_method(D_METHOD("get_text_description"), &Spell::get_text_description); ClassDB::bind_method(D_METHOD("set_text_description", "value"), &Spell::set_text_description); ADD_PROPERTY(PropertyInfo(Variant::STRING, "text_description", PROPERTY_HINT_MULTILINE_TEXT), "set_text_description", "get_text_description"); ClassDB::bind_method(D_METHOD("get_name_translated"), &Spell::get_name_translated); ClassDB::bind_method(D_METHOD("get_description", "class_level", "character_level"), &Spell::get_description); ClassDB::bind_method(D_METHOD("_get_description", "class_level", "character_level"), &Spell::_get_description); ADD_GROUP("Cooldown", "cooldown"); ClassDB::bind_method(D_METHOD("get_cooldown"), &Spell::get_cooldown); ClassDB::bind_method(D_METHOD("set_cooldown", "value"), &Spell::set_cooldown); ADD_PROPERTY(PropertyInfo(Variant::REAL, "cooldown_cooldown"), "set_cooldown", "get_cooldown"); ClassDB::bind_method(D_METHOD("get_global_cooldown_enabled"), &Spell::get_global_cooldown_enabled); ClassDB::bind_method(D_METHOD("set_global_cooldown_enabled", "value"), &Spell::set_global_cooldown_enabled); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "cooldown_global_cooldown_enabled"), "set_global_cooldown_enabled", "get_global_cooldown_enabled"); ADD_GROUP("Range", "range"); ClassDB::bind_method(D_METHOD("range_get_enabled"), &Spell::range_get_enabled); ClassDB::bind_method(D_METHOD("range_set_enabled", "value"), &Spell::range_set_enabled); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "range_enabled"), "range_set_enabled", "range_get_enabled"); ClassDB::bind_method(D_METHOD("range_get"), &Spell::range_get); ClassDB::bind_method(D_METHOD("range_set", "value"), &Spell::range_set); ADD_PROPERTY(PropertyInfo(Variant::REAL, "range_range"), "range_set", "range_get"); ADD_GROUP("Cast", "cast"); ClassDB::bind_method(D_METHOD("cast_time_get_enabled"), &Spell::cast_time_get_enabled); ClassDB::bind_method(D_METHOD("cast_time_set_enabled", "value"), &Spell::cast_time_set_enabled); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "cast_enabled"), "cast_time_set_enabled", "cast_time_get_enabled"); ClassDB::bind_method(D_METHOD("cast_time_get"), &Spell::cast_time_get); ClassDB::bind_method(D_METHOD("cast_time_set", "value"), &Spell::cast_time_set); ADD_PROPERTY(PropertyInfo(Variant::REAL, "cast_cast_time"), "cast_time_set", "cast_time_get"); ClassDB::bind_method(D_METHOD("get_can_move_while_casting"), &Spell::get_can_move_while_casting); ClassDB::bind_method(D_METHOD("set_can_move_while_casting", "value"), &Spell::set_can_move_while_casting); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "cast_can_move_while_casting"), "set_can_move_while_casting", "get_can_move_while_casting"); ADD_GROUP("Projectile", "projectile"); ClassDB::bind_method(D_METHOD("projectile_get_use_time"), &Spell::projectile_get_use_time); ClassDB::bind_method(D_METHOD("projectile_set_use_time", "value"), &Spell::projectile_set_use_time); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "projectile_use_time"), "projectile_set_use_time", "projectile_get_use_time"); ClassDB::bind_method(D_METHOD("projectile_get_time"), &Spell::projectile_get_time); ClassDB::bind_method(D_METHOD("projectile_set_time", "value"), &Spell::projectile_set_time); ADD_PROPERTY(PropertyInfo(Variant::INT, "projectile_time"), "projectile_set_time", "projectile_get_time"); ClassDB::bind_method(D_METHOD("projectile_get_use_speed"), &Spell::projectile_get_use_speed); ClassDB::bind_method(D_METHOD("projectile_set_use_speed", "value"), &Spell::projectile_set_use_speed); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "projectile_use_speed"), "projectile_set_use_speed", "projectile_get_use_speed"); ClassDB::bind_method(D_METHOD("projectile_get_speed"), &Spell::projectile_get_speed); ClassDB::bind_method(D_METHOD("projectile_set_speed", "value"), &Spell::projectile_set_speed); ADD_PROPERTY(PropertyInfo(Variant::INT, "projectile_speed"), "projectile_set_speed", "projectile_get_speed"); ClassDB::bind_method(D_METHOD("projectile_get_scene"), &Spell::projectile_get_scene); ClassDB::bind_method(D_METHOD("projectile_set_scene", "value"), &Spell::projectile_set_scene); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "projectile_scene", PROPERTY_HINT_RESOURCE_TYPE, "PackedScene"), "projectile_set_scene", "projectile_get_scene"); ADD_GROUP("Damage", "damage"); ClassDB::bind_method(D_METHOD("damage_get_enabled"), &Spell::damage_get_enabled); ClassDB::bind_method(D_METHOD("damage_set_enabled", "value"), &Spell::damage_set_enabled); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "damage_enabled"), "damage_set_enabled", "damage_get_enabled"); ClassDB::bind_method(D_METHOD("damage_get_type"), &Spell::damage_get_type); ClassDB::bind_method(D_METHOD("damage_set_type", "value"), &Spell::damage_set_type); ADD_PROPERTY(PropertyInfo(Variant::INT, "damage_type", PROPERTY_HINT_FLAGS, SpellEnums::BINDING_STRING_DAMAGE_TYPES), "damage_set_type", "damage_get_type"); ClassDB::bind_method(D_METHOD("damage_get_min"), &Spell::damage_get_min); ClassDB::bind_method(D_METHOD("damage_set_min", "value"), &Spell::damage_set_min); ADD_PROPERTY(PropertyInfo(Variant::INT, "damage_min"), "damage_set_min", "damage_get_min"); ClassDB::bind_method(D_METHOD("damage_get_max"), &Spell::damage_get_max); ClassDB::bind_method(D_METHOD("damage_set_max", "value"), &Spell::damage_set_max); ADD_PROPERTY(PropertyInfo(Variant::INT, "damage_max"), "damage_set_max", "damage_get_max"); ClassDB::bind_method(D_METHOD("damage_get_scale_stat"), &Spell::damage_get_scale_stat); ClassDB::bind_method(D_METHOD("damage_set_scale_stat", "value"), &Spell::damage_set_scale_stat); ADD_PROPERTY(PropertyInfo(Variant::INT, "damage_scale_stat", PROPERTY_HINT_ENUM, ""), "damage_set_scale_stat", "damage_get_scale_stat"); ClassDB::bind_method(D_METHOD("damage_get_scale_coeff"), &Spell::damage_get_scale_coeff); ClassDB::bind_method(D_METHOD("damage_set_scale_coeff", "value"), &Spell::damage_set_scale_coeff); ADD_PROPERTY(PropertyInfo(Variant::REAL, "damage_scale_coeff"), "damage_set_scale_coeff", "damage_get_scale_coeff"); ADD_GROUP("Heal", "heal"); ClassDB::bind_method(D_METHOD("heal_get_enabled"), &Spell::heal_get_enabled); ClassDB::bind_method(D_METHOD("heal_set_enabled", "value"), &Spell::heal_set_enabled); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "heal_enabled"), "heal_set_enabled", "heal_get_enabled"); ClassDB::bind_method(D_METHOD("heal_get_min"), &Spell::heal_get_min); ClassDB::bind_method(D_METHOD("heal_set_min", "value"), &Spell::heal_set_min); ADD_PROPERTY(PropertyInfo(Variant::INT, "heal_min"), "heal_set_min", "heal_get_min"); ClassDB::bind_method(D_METHOD("heal_get_max"), &Spell::heal_get_max); ClassDB::bind_method(D_METHOD("heal_set_max", "value"), &Spell::heal_set_max); ADD_PROPERTY(PropertyInfo(Variant::INT, "heal_max"), "heal_set_max", "heal_get_max"); ClassDB::bind_method(D_METHOD("heal_get_scale_stat"), &Spell::heal_get_scale_stat); ClassDB::bind_method(D_METHOD("heal_set_scale_stat", "value"), &Spell::heal_set_scale_stat); ADD_PROPERTY(PropertyInfo(Variant::INT, "heal_scale_stat", PROPERTY_HINT_ENUM, ""), "heal_set_scale_stat", "heal_get_scale_stat"); ClassDB::bind_method(D_METHOD("heal_get_scale_coeff"), &Spell::heal_get_scale_coeff); ClassDB::bind_method(D_METHOD("heal_set_scale_coeff", "value"), &Spell::heal_set_scale_coeff); ADD_PROPERTY(PropertyInfo(Variant::REAL, "heal_scale_coeff"), "heal_set_scale_coeff", "heal_get_scale_coeff"); ADD_GROUP("Dispel", "dispel"); ClassDB::bind_method(D_METHOD("dispell_get_enabled"), &Spell::dispell_get_enabled); ClassDB::bind_method(D_METHOD("dispell_set_enabled", "value"), &Spell::dispell_set_enabled); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "dispell_enabled"), "dispell_set_enabled", "dispell_get_enabled"); ClassDB::bind_method(D_METHOD("dispell_get_count_min"), &Spell::dispell_get_count_min); ClassDB::bind_method(D_METHOD("dispell_set_count_min", "value"), &Spell::dispell_set_count_min); ADD_PROPERTY(PropertyInfo(Variant::INT, "dispell_count_min"), "dispell_set_count_min", "dispell_get_count_min"); ClassDB::bind_method(D_METHOD("dispell_get_count_max"), &Spell::dispell_get_count_max); ClassDB::bind_method(D_METHOD("dispell_set_count_max", "value"), &Spell::dispell_set_count_max); ADD_PROPERTY(PropertyInfo(Variant::INT, "dispell_count_max"), "dispell_set_count_max", "dispell_get_count_max"); ClassDB::bind_method(D_METHOD("dispell_get_aura_types"), &Spell::dispell_get_aura_types); ClassDB::bind_method(D_METHOD("dispell_set_aura_types", "value"), &Spell::dispell_set_aura_types); ADD_PROPERTY(PropertyInfo(Variant::INT, "dispell_aura_types", PROPERTY_HINT_FLAGS, SpellEnums::BINDING_STRING_AURA_FLAG_TYPES), "dispell_set_aura_types", "dispell_get_aura_types"); ADD_GROUP("Interrupt", "interrupt"); ClassDB::bind_method(D_METHOD("get_interrupt_enabled"), &Spell::get_interrupt_enabled); ClassDB::bind_method(D_METHOD("set_interrupt_enabled", "value"), &Spell::set_interrupt_enabled); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "interrupt_enabled"), "set_interrupt_enabled", "get_interrupt_enabled"); ClassDB::bind_method(D_METHOD("get_interrupt_time"), &Spell::get_interrupt_time); ClassDB::bind_method(D_METHOD("set_interrupt_time", "value"), &Spell::set_interrupt_time); ADD_PROPERTY(PropertyInfo(Variant::REAL, "interrupt_time"), "set_interrupt_time", "get_interrupt_time"); ADD_GROUP("Cost", "cost"); ClassDB::bind_method(D_METHOD("get_item_cost"), &Spell::get_item_cost); ClassDB::bind_method(D_METHOD("set_item_cost", "value"), &Spell::set_item_cost); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "cost_item", PROPERTY_HINT_RESOURCE_TYPE, "ItemTemplate"), "set_item_cost", "get_item_cost"); ClassDB::bind_method(D_METHOD("get_required_item"), &Spell::get_required_item); ClassDB::bind_method(D_METHOD("set_required_item", "value"), &Spell::set_required_item); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "cost_required_item", PROPERTY_HINT_RESOURCE_TYPE, "ItemTemplate"), "set_required_item", "get_required_item"); ADD_GROUP("Resources", "resource"); ClassDB::bind_method(D_METHOD("get_resource_cost"), &Spell::get_resource_cost); ClassDB::bind_method(D_METHOD("set_resource_cost", "value"), &Spell::set_resource_cost); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "resource_cost", PROPERTY_HINT_RESOURCE_TYPE, "EntityResourceCostData"), "set_resource_cost", "get_resource_cost"); ClassDB::bind_method(D_METHOD("get_resource_give"), &Spell::get_resource_give); ClassDB::bind_method(D_METHOD("set_resource_give", "value"), &Spell::set_resource_give); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "resource_give", PROPERTY_HINT_RESOURCE_TYPE, "EntityResourceCostData"), "set_resource_give", "get_resource_give"); ADD_GROUP("AOE", "aoe"); ClassDB::bind_method(D_METHOD("get_is_aoe"), &Spell::get_is_aoe); ClassDB::bind_method(D_METHOD("set_is_aoe", "value"), &Spell::set_is_aoe); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "aoe"), "set_is_aoe", "get_is_aoe"); ClassDB::bind_method(D_METHOD("get_aoe_target_type"), &Spell::get_aoe_target_type); ClassDB::bind_method(D_METHOD("set_aoe_target_type", "value"), &Spell::set_aoe_target_type); ADD_PROPERTY(PropertyInfo(Variant::INT, "aoe_targetType", PROPERTY_HINT_ENUM, "Caster, Target, Ground Target Selection, Random"), "set_aoe_target_type", "get_aoe_target_type"); ClassDB::bind_method(D_METHOD("get_aoe_collider_type"), &Spell::get_aoe_collider_type); ClassDB::bind_method(D_METHOD("set_aoe_collider_type", "value"), &Spell::set_aoe_collider_type); ADD_PROPERTY(PropertyInfo(Variant::INT, "aoe_colliderType", PROPERTY_HINT_ENUM, SpellEnums::BINDING_STRING_COLLIDER_TYPE), "set_aoe_collider_type", "get_aoe_collider_type"); ClassDB::bind_method(D_METHOD("get_aoe_radius"), &Spell::get_aoe_radius); ClassDB::bind_method(D_METHOD("set_aoe_radius", "value"), &Spell::set_aoe_radius); ADD_PROPERTY(PropertyInfo(Variant::REAL, "aoe_radius"), "set_aoe_radius", "get_aoe_radius"); ClassDB::bind_method(D_METHOD("get_aoe_box_extents"), &Spell::get_aoe_box_extents); ClassDB::bind_method(D_METHOD("set_aoe_box_extents", "value"), &Spell::set_aoe_box_extents); ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "aoe_box_extents"), "set_aoe_box_extents", "get_aoe_box_extents"); ADD_GROUP("Spell Cooldown Mainpulation", "spell_cooldown_mainpulation"); ClassDB::bind_method(D_METHOD("get_spell_cooldown_mainpulation_data_count"), &Spell::get_spell_cooldown_mainpulation_data_count); ClassDB::bind_method(D_METHOD("set_spell_cooldown_mainpulation_data_count", "value"), &Spell::set_spell_cooldown_mainpulation_data_count); ADD_PROPERTY(PropertyInfo(Variant::INT, "spell_cooldown_mainpulation_data_count"), "set_spell_cooldown_mainpulation_data_count", "get_spell_cooldown_mainpulation_data_count"); ADD_GROUP("Training", "training"); ClassDB::bind_method(D_METHOD("get_training_cost"), &Spell::get_training_cost); ClassDB::bind_method(D_METHOD("set_training_cost", "value"), &Spell::set_training_cost); ADD_PROPERTY(PropertyInfo(Variant::INT, "training_cost"), "set_training_cost", "get_training_cost"); ClassDB::bind_method(D_METHOD("get_training_required_spell"), &Spell::get_training_required_spell); ClassDB::bind_method(D_METHOD("set_training_required_spell", "curspellve"), &Spell::set_training_required_spell); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "training_required_spell", PROPERTY_HINT_RESOURCE_TYPE, "Spell"), "set_training_required_spell", "get_training_required_spell"); ClassDB::bind_method(D_METHOD("get_training_required_skill"), &Spell::get_training_required_skill); ClassDB::bind_method(D_METHOD("set_training_required_skill", "curve"), &Spell::set_training_required_skill); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "training_required_skill", PROPERTY_HINT_RESOURCE_TYPE, "EntitySkillData"), "set_training_required_skill", "get_training_required_skill"); ClassDB::bind_method(D_METHOD("get_training_required_skill_level"), &Spell::get_training_required_skill_level); ClassDB::bind_method(D_METHOD("set_training_required_skill_level", "value"), &Spell::set_training_required_skill_level); ADD_PROPERTY(PropertyInfo(Variant::INT, "training_required_skill_level"), "set_training_required_skill_level", "get_training_required_skill_level"); ADD_GROUP("Aura", "aura"); ClassDB::bind_method(D_METHOD("aura_get_permanent"), &Spell::aura_get_permanent); ClassDB::bind_method(D_METHOD("aura_set_permanent", "value"), &Spell::aura_set_permanent); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "aura_permanent"), "aura_set_permanent", "aura_get_permanent"); ClassDB::bind_method(D_METHOD("aura_get_time"), &Spell::aura_get_time); ClassDB::bind_method(D_METHOD("aura_set_time", "value"), &Spell::aura_set_time); ADD_PROPERTY(PropertyInfo(Variant::REAL, "aura_time"), "aura_set_time", "aura_get_time"); ClassDB::bind_method(D_METHOD("aura_get_tick"), &Spell::aura_get_tick); ClassDB::bind_method(D_METHOD("aura_set_tick", "value"), &Spell::aura_set_tick); ADD_PROPERTY(PropertyInfo(Variant::REAL, "aura_tick"), "aura_set_tick", "aura_get_tick"); ClassDB::bind_method(D_METHOD("aura_get_is_debuff"), &Spell::aura_get_is_debuff); ClassDB::bind_method(D_METHOD("aura_set_is_debuff", "value"), &Spell::aura_set_is_debuff); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "aura_debuff"), "aura_set_is_debuff", "aura_get_is_debuff"); ClassDB::bind_method(D_METHOD("aura_get_scale_with_level"), &Spell::aura_get_scale_with_level); ClassDB::bind_method(D_METHOD("aura_set_scale_with_level", "value"), &Spell::aura_set_scale_with_level); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "aura_scale_with_level"), "aura_set_scale_with_level", "aura_get_scale_with_level"); ClassDB::bind_method(D_METHOD("aura_get_aura_type"), &Spell::aura_get_aura_type); ClassDB::bind_method(D_METHOD("aura_set_aura_type", "value"), &Spell::aura_set_aura_type); ADD_PROPERTY(PropertyInfo(Variant::INT, "aura_type", PROPERTY_HINT_ENUM, SpellEnums::BINDING_STRING_AURA_TYPES), "aura_set_aura_type", "aura_get_aura_type"); ClassDB::bind_method(D_METHOD("aura_get_aura_group"), &Spell::aura_get_aura_group); ClassDB::bind_method(D_METHOD("aura_set_aura_group", "value"), &Spell::aura_set_aura_group); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "aura_group", PROPERTY_HINT_RESOURCE_TYPE, "AuraGroup"), "aura_set_aura_group", "aura_get_aura_group"); ClassDB::bind_method(D_METHOD("aura_get_hide"), &Spell::aura_get_hide); ClassDB::bind_method(D_METHOD("aura_set_hide", "value"), &Spell::aura_set_hide); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "aura_hide"), "aura_set_hide", "aura_get_hide"); ClassDB::bind_method(D_METHOD("aura_get_ability_scale_data_id"), &Spell::aura_get_ability_scale_data_id); ClassDB::bind_method(D_METHOD("aura_set_ability_scale_data_id", "value"), &Spell::aura_set_ability_scale_data_id); ADD_PROPERTY(PropertyInfo(Variant::INT, "aura_ability_scale_data_id"), "aura_set_ability_scale_data_id", "aura_get_ability_scale_data_id"); ClassDB::bind_method(D_METHOD("aura_get_visual_spell_effects"), &Spell::aura_get_visual_spell_effects); ClassDB::bind_method(D_METHOD("aura_set_visual_spell_effects", "value"), &Spell::aura_set_visual_spell_effects); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "aura_visual_spell_effects", PROPERTY_HINT_RESOURCE_TYPE, "SpellEffectVisual"), "aura_set_visual_spell_effects", "aura_get_visual_spell_effects"); BIND_VMETHOD(MethodInfo(PropertyInfo(Variant::STRING, "desc"), "_aura_get_description", PropertyInfo(Variant::INT, "class_level"), PropertyInfo(Variant::INT, "character_level"))); ADD_GROUP("Aura Texts", "aura_text"); ClassDB::bind_method(D_METHOD("aura_get_text_translation_key"), &Spell::aura_get_text_translation_key); ClassDB::bind_method(D_METHOD("aura_set_text_translation_key", "value"), &Spell::aura_set_text_translation_key); ADD_PROPERTY(PropertyInfo(Variant::STRING, "aura_text_translation_key"), "aura_set_text_translation_key", "aura_get_text_translation_key"); ClassDB::bind_method(D_METHOD("aura_get_text_description"), &Spell::aura_get_text_description); ClassDB::bind_method(D_METHOD("aura_set_text_description", "value"), &Spell::aura_set_text_description); ADD_PROPERTY(PropertyInfo(Variant::STRING, "aura_text_description", PROPERTY_HINT_MULTILINE_TEXT), "aura_set_text_description", "aura_get_text_description"); ClassDB::bind_method(D_METHOD("aura_get_name_translated"), &Spell::aura_get_name_translated); ClassDB::bind_method(D_METHOD("aura_get_description", "class_level", "character_level"), &Spell::aura_get_description); ClassDB::bind_method(D_METHOD("_aura_get_description", "class_level", "character_level"), &Spell::_aura_get_description); ADD_GROUP("Aura Damage", "aura_damage"); //Damage ClassDB::bind_method(D_METHOD("aura_damage_get_enabled"), &Spell::aura_damage_get_enabled); ClassDB::bind_method(D_METHOD("aura_damage_set_enabled", "value"), &Spell::aura_damage_set_enabled); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "aura_damage_enabled"), "aura_damage_set_enabled", "aura_damage_get_enabled"); ClassDB::bind_method(D_METHOD("aura_damage_get_type"), &Spell::aura_damage_get_type); ClassDB::bind_method(D_METHOD("aura_damage_set_type", "value"), &Spell::aura_damage_set_type); ADD_PROPERTY(PropertyInfo(Variant::INT, "aura_damage_type", PROPERTY_HINT_FLAGS, SpellEnums::BINDING_STRING_DAMAGE_TYPES), "aura_damage_set_type", "aura_damage_get_type"); ClassDB::bind_method(D_METHOD("aura_damage_get_min"), &Spell::aura_damage_get_min); ClassDB::bind_method(D_METHOD("aura_damage_set_min", "value"), &Spell::aura_damage_set_min); ADD_PROPERTY(PropertyInfo(Variant::INT, "aura_damage_min"), "aura_damage_set_min", "aura_damage_get_min"); ClassDB::bind_method(D_METHOD("aura_damage_get_max"), &Spell::aura_damage_get_max); ClassDB::bind_method(D_METHOD("aura_damage_set_max", "value"), &Spell::aura_damage_set_max); ADD_PROPERTY(PropertyInfo(Variant::INT, "aura_damage_max"), "aura_damage_set_max", "aura_damage_get_max"); ClassDB::bind_method(D_METHOD("aura_damage_get_can_crit"), &Spell::aura_damage_get_can_crit); ClassDB::bind_method(D_METHOD("aura_damage_set_can_crit", "value"), &Spell::aura_damage_set_can_crit); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "aura_damage_can_crit"), "aura_damage_set_can_crit", "aura_damage_get_can_crit"); ClassDB::bind_method(D_METHOD("aura_damage_set", "min", "max", "can_crit"), &Spell::aura_damage_set); ClassDB::bind_method(D_METHOD("aura_damage_get_scaling_curve"), &Spell::aura_damage_get_scaling_curve); ClassDB::bind_method(D_METHOD("aura_damage_set_scaling_curve", "curve"), &Spell::aura_damage_set_scaling_curve); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "aura_damage_scaling_curve", PROPERTY_HINT_RESOURCE_TYPE, "Curve"), "aura_damage_set_scaling_curve", "aura_damage_get_scaling_curve"); ADD_GROUP("Aura Absorb", "aura_absorb"); //Absorb ClassDB::bind_method(D_METHOD("aura_absorb_get_enabled"), &Spell::aura_absorb_get_enabled); ClassDB::bind_method(D_METHOD("aura_absorb_set_enabled", "value"), &Spell::aura_absorb_set_enabled); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "aura_absorb_enabled"), "aura_absorb_set_enabled", "aura_absorb_get_enabled"); ClassDB::bind_method(D_METHOD("aura_absorb_damage_get_type"), &Spell::aura_absorb_damage_get_type); ClassDB::bind_method(D_METHOD("aura_absorb_damage_set_type", "value"), &Spell::aura_absorb_damage_set_type); ADD_PROPERTY(PropertyInfo(Variant::INT, "aura_absorb_damage_type", PROPERTY_HINT_FLAGS, SpellEnums::BINDING_STRING_DAMAGE_TYPES), "aura_absorb_damage_set_type", "aura_absorb_damage_get_type"); ClassDB::bind_method(D_METHOD("aura_absorb_get_min"), &Spell::aura_absorb_get_min); ClassDB::bind_method(D_METHOD("aura_absorb_set_min", "value"), &Spell::aura_absorb_set_min); ADD_PROPERTY(PropertyInfo(Variant::INT, "aura_absorb_min"), "aura_absorb_set_min", "aura_absorb_get_min"); ClassDB::bind_method(D_METHOD("aura_absorb_get_max"), &Spell::aura_absorb_get_max); ClassDB::bind_method(D_METHOD("aura_absorb_set_max", "value"), &Spell::aura_absorb_set_max); ADD_PROPERTY(PropertyInfo(Variant::INT, "aura_absorb_max"), "aura_absorb_set_max", "aura_absorb_get_max"); ClassDB::bind_method(D_METHOD("aura_absorb_get_scaling_curve"), &Spell::aura_absorb_get_scaling_curve); ClassDB::bind_method(D_METHOD("aura_absorb_set_scaling_curve", "curve"), &Spell::aura_absorb_set_scaling_curve); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "aura_absorb_scaling_curve", PROPERTY_HINT_RESOURCE_TYPE, "Curve"), "aura_absorb_set_scaling_curve", "aura_absorb_get_scaling_curve"); ADD_GROUP("Aura Heal", "aura_heal"); //Heal ClassDB::bind_method(D_METHOD("aura_heal_get_enabled"), &Spell::aura_heal_get_enabled); ClassDB::bind_method(D_METHOD("aura_heal_set_enabled", "value"), &Spell::aura_heal_set_enabled); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "aura_heal_enabled"), "aura_heal_set_enabled", "aura_heal_get_enabled"); ClassDB::bind_method(D_METHOD("aura_heal_get_min"), &Spell::aura_heal_get_min); ClassDB::bind_method(D_METHOD("aura_heal_set_min", "value"), &Spell::aura_heal_set_min); ADD_PROPERTY(PropertyInfo(Variant::INT, "aura_heal_min"), "aura_heal_set_min", "aura_heal_get_min"); ClassDB::bind_method(D_METHOD("aura_heal_get_max"), &Spell::aura_heal_get_max); ClassDB::bind_method(D_METHOD("aura_heal_set_max", "value"), &Spell::aura_heal_set_max); ADD_PROPERTY(PropertyInfo(Variant::INT, "aura_heal_max"), "aura_heal_set_max", "aura_heal_get_max"); ClassDB::bind_method(D_METHOD("aura_heal_get_can_crit"), &Spell::aura_heal_get_can_crit); ClassDB::bind_method(D_METHOD("aura_heal_set_can_crit", "value"), &Spell::aura_heal_set_can_crit); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "aura_heal_can_crit"), "aura_heal_set_can_crit", "aura_heal_get_can_crit"); ClassDB::bind_method(D_METHOD("aura_heal_set", "min", "max", "can_crit"), &Spell::aura_heal_set); ClassDB::bind_method(D_METHOD("aura_heal_get_scaling_curve"), &Spell::aura_heal_get_scaling_curve); ClassDB::bind_method(D_METHOD("aura_heal_set_scaling_curve", "curve"), &Spell::aura_heal_set_scaling_curve); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "aura_heal_scaling_curve", PROPERTY_HINT_RESOURCE_TYPE, "Curve"), "aura_heal_set_scaling_curve", "aura_heal_get_scaling_curve"); ADD_GROUP("Aura Dispel", "aura_dispell"); ClassDB::bind_method(D_METHOD("aura_dispell_get_enabled"), &Spell::aura_dispell_get_enabled); ClassDB::bind_method(D_METHOD("aura_dispell_set_enabled", "value"), &Spell::aura_dispell_set_enabled); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "aura_dispell_enabled"), "aura_dispell_set_enabled", "aura_dispell_get_enabled"); ClassDB::bind_method(D_METHOD("aura_dispell_get_count_min"), &Spell::aura_dispell_get_count_min); ClassDB::bind_method(D_METHOD("aura_dispell_set_count_min", "value"), &Spell::aura_dispell_set_count_min); ADD_PROPERTY(PropertyInfo(Variant::INT, "aura_dispell_count_min"), "aura_dispell_set_count_min", "aura_dispell_get_count_min"); ClassDB::bind_method(D_METHOD("aura_dispell_get_count_max"), &Spell::aura_dispell_get_count_max); ClassDB::bind_method(D_METHOD("aura_dispell_set_count_max", "value"), &Spell::aura_dispell_set_count_max); ADD_PROPERTY(PropertyInfo(Variant::INT, "aura_dispell_count_max"), "aura_dispell_set_count_max", "aura_dispell_get_count_max"); ClassDB::bind_method(D_METHOD("aura_dispell_get_aura_types"), &Spell::aura_dispell_get_aura_types); ClassDB::bind_method(D_METHOD("aura_dispell_set_aura_types", "value"), &Spell::aura_dispell_set_aura_types); ADD_PROPERTY(PropertyInfo(Variant::INT, "aura_dispell_aura_types", PROPERTY_HINT_FLAGS, SpellEnums::BINDING_STRING_AURA_FLAG_TYPES), "aura_dispell_set_aura_types", "aura_dispell_get_aura_types"); //Resources ADD_GROUP("Aura Resources", "aura_resource"); ClassDB::bind_method(D_METHOD("aura_get_resource_cost"), &Spell::aura_get_resource_cost); ClassDB::bind_method(D_METHOD("aura_set_resource_cost", "value"), &Spell::aura_set_resource_cost); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "aura_resource_cost", PROPERTY_HINT_RESOURCE_TYPE, "EntityResourceCostData"), "aura_set_resource_cost", "aura_get_resource_cost"); ClassDB::bind_method(D_METHOD("aura_get_resource_give"), &Spell::aura_get_resource_give); ClassDB::bind_method(D_METHOD("aura_set_resource_give", "value"), &Spell::aura_set_resource_give); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "aura_resource_give", PROPERTY_HINT_RESOURCE_TYPE, "EntityResourceCostData"), "aura_set_resource_give", "aura_get_resource_give"); ADD_GROUP("Aura States", "aura_states"); ClassDB::bind_method(D_METHOD("aura_get_add_states"), &Spell::aura_get_add_states); ClassDB::bind_method(D_METHOD("aura_set_add_states", "value"), &Spell::aura_set_add_states); ADD_PROPERTY(PropertyInfo(Variant::INT, "aura_states_add", PROPERTY_HINT_FLAGS, EntityEnums::BINDING_STRING_ENTITY_STATE_TYPES), "aura_set_add_states", "aura_get_add_states"); ClassDB::bind_method(D_METHOD("aura_get_remove_effects_with_states"), &Spell::aura_get_remove_effects_with_states); ClassDB::bind_method(D_METHOD("aura_set_remove_effects_with_states", "value"), &Spell::aura_set_remove_effects_with_states); ADD_PROPERTY(PropertyInfo(Variant::INT, "aura_states_remove_effects", PROPERTY_HINT_FLAGS, EntityEnums::BINDING_STRING_ENTITY_STATE_TYPES), "aura_set_remove_effects_with_states", "aura_get_remove_effects_with_states"); ClassDB::bind_method(D_METHOD("aura_get_supress_states"), &Spell::aura_get_supress_states); ClassDB::bind_method(D_METHOD("aura_set_supress_states", "value"), &Spell::aura_set_supress_states); ADD_PROPERTY(PropertyInfo(Variant::INT, "aura_states_supress", PROPERTY_HINT_FLAGS, EntityEnums::BINDING_STRING_ENTITY_STATE_TYPES), "aura_set_supress_states", "aura_get_supress_states"); //Diminishing Returns ADD_GROUP("Aura Diminishing Returns", "aura_diminishing_return"); ClassDB::bind_method(D_METHOD("aura_diminishing_return_enabled_get"), &Spell::aura_diminishing_return_enabled_get); ClassDB::bind_method(D_METHOD("aura_diminishing_return_enabled_set", "value"), &Spell::aura_diminishing_return_enabled_set); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "aura_diminishing_return_enabled"), "aura_diminishing_return_enabled_set", "aura_diminishing_return_enabled_get"); ClassDB::bind_method(D_METHOD("aura_diminishing_return_category_get"), &Spell::aura_diminishing_return_category_get); ClassDB::bind_method(D_METHOD("aura_diminishing_return_category_set", "value"), &Spell::aura_diminishing_return_category_set); ADD_PROPERTY(PropertyInfo(Variant::INT, "aura_diminishing_return_category", PROPERTY_HINT_ENUM, ""), "aura_diminishing_return_category_set", "aura_diminishing_return_category_get"); //// Talents //// ADD_GROUP("Aura Talent", "aura_talent"); ClassDB::bind_method(D_METHOD("aura_get_talent_required_talent"), &Spell::aura_get_talent_required_talent); ClassDB::bind_method(D_METHOD("aura_set_talent_required_talent", "next_rank"), &Spell::aura_set_talent_required_talent); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "aura_talent_required_talent", PROPERTY_HINT_RESOURCE_TYPE, "Spell"), "aura_set_talent_required_talent", "aura_get_talent_required_talent"); ClassDB::bind_method(D_METHOD("aura_get_talent_required_spell"), &Spell::aura_get_talent_required_spell); ClassDB::bind_method(D_METHOD("aura_set_talent_required_spell", "next_rank"), &Spell::aura_set_talent_required_spell); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "aura_talent_required_spell", PROPERTY_HINT_RESOURCE_TYPE, "Spell"), "aura_set_talent_required_spell", "aura_get_talent_required_spell"); ADD_GROUP("Aura Teaches", "aura_teaches"); ClassDB::bind_method(D_METHOD("aura_get_teaches_spell"), &Spell::aura_get_teaches_spell); ClassDB::bind_method(D_METHOD("aura_set_teaches_spell", "next_rank"), &Spell::aura_set_teaches_spell); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "aura_teaches_spell", PROPERTY_HINT_RESOURCE_TYPE, "Spell"), "aura_set_teaches_spell", "aura_get_teaches_spell"); //// Triggers //// ADD_GROUP("Aura Triggers", "aura_trigger"); ClassDB::bind_method(D_METHOD("aura_trigger_get_count"), &Spell::aura_trigger_get_count); ClassDB::bind_method(D_METHOD("aura_trigger_set_count", "count"), &Spell::aura_trigger_set_count); ClassDB::bind_method(D_METHOD("aura_trigger_get_notification_type", "index"), &Spell::aura_trigger_get_notification_type); ClassDB::bind_method(D_METHOD("aura_trigger_set_notification_type", "index", "value"), &Spell::aura_trigger_set_notification_type); ClassDB::bind_method(D_METHOD("aura_trigger_get_notification_data", "index"), &Spell::aura_trigger_get_notification_data); ClassDB::bind_method(D_METHOD("aura_trigger_set_notification_data", "index", "value"), &Spell::aura_trigger_set_notification_data); ClassDB::bind_method(D_METHOD("aura_trigger_get_trigger_type", "index"), &Spell::aura_trigger_get_trigger_type); ClassDB::bind_method(D_METHOD("aura_trigger_set_trigger_type", "index", "value"), &Spell::aura_trigger_set_trigger_type); ClassDB::bind_method(D_METHOD("aura_trigger_get_trigger_type_data", "index"), &Spell::aura_trigger_get_trigger_type_data); ClassDB::bind_method(D_METHOD("aura_trigger_set_trigger_type_data", "index", "value"), &Spell::aura_trigger_set_trigger_type_data); ClassDB::bind_method(D_METHOD("aura_trigger_get_spell", "index"), &Spell::aura_trigger_get_spell); ClassDB::bind_method(D_METHOD("aura_trigger_set_spell", "index", "value"), &Spell::aura_trigger_set_spell); ADD_PROPERTY(PropertyInfo(Variant::INT, "aura_trigger_count", PROPERTY_HINT_RANGE, "0," + itos(MAX_TRIGGER_DATA), PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), "aura_trigger_set_count", "aura_trigger_get_count"); for (int i = 0; i < MAX_TRIGGER_DATA; i++) { ADD_PROPERTYI(PropertyInfo(Variant::INT, "aura_trigger_" + itos(i) + "/notification_type", PROPERTY_HINT_ENUM, SpellEnums::BINDING_STRING_TRIGGER_NOTIFICATION_TYPE, PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_INTERNAL | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), "aura_trigger_set_notification_type", "aura_trigger_get_notification_type", i); ADD_PROPERTYI(PropertyInfo(Variant::INT, "aura_trigger_" + itos(i) + "/notification_data", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_INTERNAL), "aura_trigger_set_notification_data", "aura_trigger_get_notification_data", i); ADD_PROPERTYI(PropertyInfo(Variant::INT, "aura_trigger_" + itos(i) + "/trigger_type", PROPERTY_HINT_ENUM, SpellEnums::BINDING_STRING_TRIGGER_TYPE, PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_INTERNAL), "aura_trigger_set_trigger_type", "aura_trigger_get_trigger_type", i); ADD_PROPERTYI(PropertyInfo(Variant::REAL, "aura_trigger_" + itos(i) + "/trigger_type_data", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_INTERNAL), "aura_trigger_set_trigger_type_data", "aura_trigger_get_trigger_type_data", i); ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "aura_trigger_" + itos(i) + "/spell", PROPERTY_HINT_RESOURCE_TYPE, "Spell", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_INTERNAL), "aura_trigger_set_spell", "aura_trigger_get_spell", i); } ADD_GROUP("Aura Stat Attributes", "aura_stat_attribute"); //AuraStatAttributes ClassDB::bind_method(D_METHOD("aura_stat_attribute_get_count"), &Spell::aura_stat_attribute_get_count); ClassDB::bind_method(D_METHOD("aura_stat_attribute_set_count", "count"), &Spell::aura_stat_attribute_set_count); ClassDB::bind_method(D_METHOD("aura_stat_attribute_get_stat", "index"), &Spell::aura_stat_attribute_get_stat); ClassDB::bind_method(D_METHOD("aura_stat_attribute_set_stat", "index", "value"), &Spell::aura_stat_attribute_set_stat); ClassDB::bind_method(D_METHOD("aura_stat_attribute_get_base_mod", "index"), &Spell::aura_stat_attribute_get_base_mod); ClassDB::bind_method(D_METHOD("aura_stat_attribute_set_base_mod", "index", "value"), &Spell::aura_stat_attribute_set_base_mod); ClassDB::bind_method(D_METHOD("aura_stat_attribute_get_bonus_mod", "index"), &Spell::aura_stat_attribute_get_bonus_mod); ClassDB::bind_method(D_METHOD("aura_stat_attribute_set_bonus_mod", "index", "value"), &Spell::aura_stat_attribute_set_bonus_mod); ClassDB::bind_method(D_METHOD("aura_stat_attribute_get_percent_mod", "index"), &Spell::aura_stat_attribute_get_percent_mod); ClassDB::bind_method(D_METHOD("aura_stat_attribute_set_percent_mod", "index", "value"), &Spell::aura_stat_attribute_set_percent_mod); ADD_PROPERTY(PropertyInfo(Variant::INT, "aura_stat_attribute_count", PROPERTY_HINT_RANGE, "0," + itos(MAX_AURA_STATS), PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), "aura_stat_attribute_set_count", "aura_stat_attribute_get_count"); for (int i = 0; i < MAX_AURA_STATS; i++) { ADD_PROPERTYI(PropertyInfo(Variant::INT, "aura_stat_attribute_" + itos(i) + "/stat", PROPERTY_HINT_ENUM, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_INTERNAL), "aura_stat_attribute_set_stat", "aura_stat_attribute_get_stat", i); ADD_PROPERTYI(PropertyInfo(Variant::REAL, "aura_stat_attribute_" + itos(i) + "/base_mod", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_INTERNAL), "aura_stat_attribute_set_base_mod", "aura_stat_attribute_get_base_mod", i); ADD_PROPERTYI(PropertyInfo(Variant::REAL, "aura_stat_attribute_" + itos(i) + "/bonus_mod", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_INTERNAL), "aura_stat_attribute_set_bonus_mod", "aura_stat_attribute_get_bonus_mod", i); ADD_PROPERTYI(PropertyInfo(Variant::REAL, "aura_stat_attribute_" + itos(i) + "/percent_mod", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_INTERNAL), "aura_stat_attribute_set_percent_mod", "aura_stat_attribute_get_percent_mod", i); } ClassDB::bind_method(D_METHOD("is_aura"), &Spell::is_aura); ClassDB::bind_method(D_METHOD("aura_is_talent"), &Spell::aura_is_talent); BIND_ENUM_CONSTANT(TARGET_SELF); BIND_ENUM_CONSTANT(TARGET_ENEMY); BIND_ENUM_CONSTANT(TARGET_FRIENDLY); BIND_ENUM_CONSTANT(SPELL_TARGET_TYPE_SELF); BIND_ENUM_CONSTANT(SPELL_TARGET_TYPE_TARGET); BIND_ENUM_CONSTANT(SPELL_TARGET_TYPE_AROUND); BIND_ENUM_CONSTANT(SPELL_TARGET_TYPE_FRONT); BIND_ENUM_CONSTANT(SPELL_TARGET_TYPE_AROUND_TARGET); BIND_ENUM_CONSTANT(SPELL_AOE_TARGET_TYPE_CASTER); BIND_ENUM_CONSTANT(SPELL_AOE_TARGET_TYPE_TARGET); BIND_ENUM_CONSTANT(SPELL_AOE_TARGET_TYPE_GOUND_TARGET_SELECTION); BIND_ENUM_CONSTANT(SPELL_AOE_TARGET_TYPE_RANDOM); BIND_CONSTANT(MAX_AURA_STATS); BIND_CONSTANT(MAX_TRIGGER_DATA); }