2019-04-20 14:02:55 +02:00
|
|
|
#ifndef SPELL_H
|
|
|
|
#define SPELL_H
|
|
|
|
|
|
|
|
#include "core/resource.h"
|
2019-05-30 00:26:02 +02:00
|
|
|
#include "scene/resources/texture.h"
|
2019-04-20 14:02:55 +02:00
|
|
|
|
|
|
|
#include "../entity_enums.h"
|
|
|
|
#include "../spell_enums.h"
|
|
|
|
|
2019-07-23 13:55:11 +02:00
|
|
|
#include "../infos/spell_cast_info.h"
|
2019-04-20 14:02:55 +02:00
|
|
|
|
|
|
|
#include "../entities/entity.h"
|
2019-12-29 01:58:25 +01:00
|
|
|
#include "../entities/stats/stat.h"
|
2019-04-20 14:02:55 +02:00
|
|
|
|
|
|
|
#include "../pipelines/spell_damage_info.h"
|
2019-07-23 13:55:11 +02:00
|
|
|
#include "../infos/aura_infos.h"
|
2019-04-20 14:02:55 +02:00
|
|
|
|
2019-08-26 20:10:26 +02:00
|
|
|
#include "spell_effect_visual.h"
|
2019-12-09 21:23:57 +01:00
|
|
|
|
|
|
|
#include "../world_spells/world_spell_data.h"
|
2019-08-26 20:10:26 +02:00
|
|
|
|
2019-04-20 14:02:55 +02:00
|
|
|
class Entity;
|
|
|
|
class Aura;
|
|
|
|
class SpellCastInfo;
|
|
|
|
class Spell;
|
2019-10-07 18:29:25 +02:00
|
|
|
class CraftRecipe;
|
2019-12-01 00:24:38 +01:00
|
|
|
class EntityResourceCostData;
|
2019-12-01 18:00:09 +01:00
|
|
|
class EntitySkillData;
|
2019-04-20 14:02:55 +02:00
|
|
|
|
|
|
|
enum TargetRelationType {
|
2019-06-24 13:12:33 +02:00
|
|
|
TARGET_SELF = 1 << 0,
|
|
|
|
TARGET_ENEMY = 1 << 1,
|
|
|
|
TARGET_FRIENDLY = 1 << 2
|
2019-04-20 14:02:55 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
VARIANT_ENUM_CAST(TargetRelationType);
|
|
|
|
|
|
|
|
enum SpellTargetType {
|
|
|
|
SPELL_TARGET_TYPE_SELF,
|
|
|
|
SPELL_TARGET_TYPE_TARGET,
|
|
|
|
SPELL_TARGET_TYPE_AROUND,
|
|
|
|
SPELL_TARGET_TYPE_FRONT,
|
|
|
|
SPELL_TARGET_TYPE_AROUND_TARGET
|
|
|
|
};
|
|
|
|
|
|
|
|
VARIANT_ENUM_CAST(SpellTargetType);
|
|
|
|
|
|
|
|
enum SpellAOETargetType {
|
|
|
|
SPELL_AOE_TARGET_TYPE_CASTER,
|
|
|
|
SPELL_AOE_TARGET_TYPE_TARGET,
|
|
|
|
SPELL_AOE_TARGET_TYPE_GOUND_TARGET_SELECTION,
|
|
|
|
SPELL_AOE_TARGET_TYPE_RANDOM
|
|
|
|
};
|
|
|
|
|
|
|
|
VARIANT_ENUM_CAST(SpellAOETargetType);
|
|
|
|
|
|
|
|
class Spell : public Resource {
|
|
|
|
GDCLASS(Spell, Resource);
|
|
|
|
|
|
|
|
public:
|
2019-10-19 12:47:30 +02:00
|
|
|
int get_id();
|
|
|
|
void set_id(int value);
|
2019-04-20 14:02:55 +02:00
|
|
|
|
2019-05-29 20:03:41 +02:00
|
|
|
int get_spell_type();
|
|
|
|
void set_spell_type(int value);
|
2019-04-20 14:02:55 +02:00
|
|
|
|
2019-09-12 23:06:24 +02:00
|
|
|
SpellEnums::SpellCategory get_spell_category();
|
|
|
|
void set_spell_category(SpellEnums::SpellCategory value);
|
|
|
|
|
2019-05-29 20:03:41 +02:00
|
|
|
bool get_hide_from_actionbar();
|
|
|
|
void set_hide_from_actionbar(bool value);
|
2019-04-20 14:02:55 +02:00
|
|
|
|
2019-05-29 20:03:41 +02:00
|
|
|
float get_cooldown();
|
|
|
|
void set_cooldown(float value);
|
2019-04-20 14:02:55 +02:00
|
|
|
|
2019-05-29 20:03:41 +02:00
|
|
|
SpellTargetType get_target_type();
|
|
|
|
void set_target_type(SpellTargetType value);
|
2019-04-20 14:02:55 +02:00
|
|
|
|
2019-06-24 13:12:33 +02:00
|
|
|
TargetRelationType get_target_relation_type();
|
|
|
|
void set_target_relation_type(TargetRelationType value);
|
|
|
|
|
2019-05-29 20:03:41 +02:00
|
|
|
int get_level();
|
|
|
|
void set_level(int value);
|
2019-04-20 14:02:55 +02:00
|
|
|
|
2019-05-30 00:26:02 +02:00
|
|
|
int get_rank();
|
|
|
|
void set_rank(int value);
|
|
|
|
|
2019-12-29 01:58:25 +01:00
|
|
|
bool get_scale_with_level();
|
|
|
|
void set_scale_with_level(bool value);
|
|
|
|
|
2019-05-29 20:03:41 +02:00
|
|
|
int get_item_cost();
|
|
|
|
void set_item_cost(int value);
|
2019-04-20 14:02:55 +02:00
|
|
|
|
2019-05-29 20:03:41 +02:00
|
|
|
int get_craft_material_cost();
|
|
|
|
void set_craft_material_cost(int value);
|
2019-04-20 14:02:55 +02:00
|
|
|
|
2019-05-29 20:03:41 +02:00
|
|
|
int get_required_item();
|
|
|
|
void set_required_item(int value);
|
2019-04-20 14:02:55 +02:00
|
|
|
|
2019-12-01 00:24:38 +01:00
|
|
|
Ref<EntityResourceCostData> get_resource_cost();
|
|
|
|
void set_resource_cost(Ref<EntityResourceCostData> value);
|
2019-04-20 14:02:55 +02:00
|
|
|
|
2019-12-01 00:24:38 +01:00
|
|
|
Ref<EntityResourceCostData> get_resource_give();
|
|
|
|
void set_resource_give(Ref<EntityResourceCostData> value);
|
2019-04-20 14:02:55 +02:00
|
|
|
|
2019-12-29 01:58:25 +01:00
|
|
|
bool get_global_cooldown_enabled();
|
|
|
|
void set_global_cooldown_enabled(bool value);
|
2019-04-20 14:02:55 +02:00
|
|
|
|
2019-05-29 20:03:41 +02:00
|
|
|
bool get_is_local_spell();
|
|
|
|
void set_is_local_spell(bool value);
|
2019-04-20 14:02:55 +02:00
|
|
|
|
2019-05-29 20:03:41 +02:00
|
|
|
Ref<Texture> get_icon();
|
|
|
|
void set_icon(Ref<Texture> value);
|
2019-04-20 14:02:55 +02:00
|
|
|
|
2019-10-19 12:12:09 +02:00
|
|
|
String get_text_description();
|
|
|
|
void set_text_description(String value);
|
2019-04-20 14:02:55 +02:00
|
|
|
|
2019-08-26 20:10:26 +02:00
|
|
|
Ref<SpellEffectVisual> get_visual_spell_effects();
|
|
|
|
void set_visual_spell_effects(Ref<SpellEffectVisual> value);
|
|
|
|
|
2019-12-29 01:58:25 +01:00
|
|
|
Ref<WorldSpellData> get_projectile();
|
|
|
|
void set_projectile(Ref<WorldSpellData> value);
|
2019-08-26 20:10:26 +02:00
|
|
|
|
2019-10-07 18:29:25 +02:00
|
|
|
Ref<CraftRecipe> get_teaches_craft_recipe();
|
|
|
|
void set_teaches_craft_recipe(Ref<CraftRecipe> value);
|
|
|
|
|
2019-09-12 23:28:18 +02:00
|
|
|
//Caster Aura Apply
|
|
|
|
int get_num_caster_aura_applys();
|
|
|
|
void set_num_caster_aura_applys(int value);
|
|
|
|
|
|
|
|
Ref<Aura> get_caster_aura_apply(int index) const;
|
|
|
|
void set_caster_aura_apply(int index, Ref<Aura> caster_aura_apply);
|
|
|
|
|
|
|
|
Vector<Variant> get_caster_aura_applys();
|
|
|
|
void set_caster_aura_applys(const Vector<Variant> &caster_aura_applys);
|
|
|
|
|
|
|
|
//Target Aura Apply
|
|
|
|
int get_num_target_aura_applys();
|
|
|
|
void set_num_target_aura_applys(int value);
|
|
|
|
|
|
|
|
Ref<Aura> get_target_aura_apply(int index) const;
|
|
|
|
void set_target_aura_apply(int index, Ref<Aura> target_aura_apply);
|
|
|
|
|
|
|
|
Vector<Variant> get_target_aura_applys();
|
|
|
|
void set_target_aura_applys(const Vector<Variant> &target_aura_applys);
|
|
|
|
|
|
|
|
//Apply Auras On Learn
|
|
|
|
int get_num_on_learn_auras();
|
|
|
|
void set_num_on_learn_auras(int value);
|
|
|
|
|
|
|
|
Ref<Aura> get_on_learn_aura(int index) const;
|
|
|
|
void set_on_learn_aura(int index, Ref<Aura> on_learn_aura);
|
|
|
|
|
|
|
|
Vector<Variant> get_on_learn_auras();
|
|
|
|
void set_on_learn_auras(const Vector<Variant> &on_learn_auras);
|
|
|
|
|
|
|
|
//Range
|
2019-12-29 01:58:25 +01:00
|
|
|
bool get_range_enabled();
|
|
|
|
void set_range_enabled(bool value);
|
2019-04-20 14:02:55 +02:00
|
|
|
|
2019-05-29 20:03:41 +02:00
|
|
|
float get_range();
|
|
|
|
void set_range(float value);
|
2019-04-20 14:02:55 +02:00
|
|
|
|
2019-12-29 01:58:25 +01:00
|
|
|
bool get_cast_time_enabled();
|
|
|
|
void set_cast_time_enabled(bool value);
|
2019-04-20 14:02:55 +02:00
|
|
|
|
2019-05-29 20:03:41 +02:00
|
|
|
float get_cast_time();
|
|
|
|
void set_cast_time(float value);
|
2019-04-20 14:02:55 +02:00
|
|
|
|
2019-12-29 01:58:25 +01:00
|
|
|
bool get_damage_enabled();
|
|
|
|
void set_damage_enabled(bool value);
|
2019-04-20 14:02:55 +02:00
|
|
|
|
2019-05-29 20:03:41 +02:00
|
|
|
int get_damage_type();
|
|
|
|
void set_damage_type(int value);
|
2019-04-20 14:02:55 +02:00
|
|
|
|
2019-05-29 20:03:41 +02:00
|
|
|
int get_damage_min();
|
|
|
|
void set_damage_min(int value);
|
2019-04-20 14:02:55 +02:00
|
|
|
|
2019-05-29 20:03:41 +02:00
|
|
|
int get_damage_max();
|
|
|
|
void set_damage_max(int value);
|
2019-04-20 14:02:55 +02:00
|
|
|
|
2019-12-29 01:58:25 +01:00
|
|
|
Stat::StatId get_damage_scale_stat();
|
|
|
|
void set_damage_scale_stat(Stat::StatId value);
|
2019-04-20 14:02:55 +02:00
|
|
|
|
2019-12-29 01:58:25 +01:00
|
|
|
float get_damage_scale_coeff();
|
|
|
|
void set_damage_scale_coeff(float value);
|
|
|
|
|
|
|
|
bool get_heal_enabled();
|
|
|
|
void set_heal_enabled(bool value);
|
2019-04-20 14:02:55 +02:00
|
|
|
|
2019-05-29 20:03:41 +02:00
|
|
|
int get_heal_min();
|
|
|
|
void set_heal_min(int value);
|
2019-04-20 14:02:55 +02:00
|
|
|
|
2019-05-29 20:03:41 +02:00
|
|
|
int get_heal_max();
|
|
|
|
void set_heal_max(int value);
|
2019-04-20 14:02:55 +02:00
|
|
|
|
2019-12-29 01:58:25 +01:00
|
|
|
Stat::StatId get_heal_scale_stat();
|
|
|
|
void set_heal_scale_stat(Stat::StatId value);
|
|
|
|
|
|
|
|
float get_heal_scale_coeff();
|
|
|
|
void set_heal_scale_coeff(float value);
|
|
|
|
|
|
|
|
//Dispells
|
|
|
|
bool get_dispell_enabled();
|
|
|
|
void set_dispell_enabled(bool value);
|
|
|
|
|
|
|
|
int get_dispell_count_min();
|
|
|
|
void set_dispell_count_min(int value);
|
2019-04-20 14:02:55 +02:00
|
|
|
|
2019-12-29 01:58:25 +01:00
|
|
|
int get_dispell_count_max();
|
|
|
|
void set_dispell_count_max(int value);
|
|
|
|
|
|
|
|
int get_dispell_aura_types();
|
|
|
|
void set_dispell_aura_types(int value);
|
|
|
|
|
|
|
|
//Target
|
2019-05-29 20:03:41 +02:00
|
|
|
bool get_needs_target();
|
|
|
|
void set_needs_target(bool value);
|
2019-04-20 14:02:55 +02:00
|
|
|
|
2019-05-29 20:03:41 +02:00
|
|
|
bool get_can_move_while_casting();
|
|
|
|
void set_can_move_while_casting(bool value);
|
2019-04-20 14:02:55 +02:00
|
|
|
|
2019-12-29 01:58:25 +01:00
|
|
|
bool get_interrupt_enabled();
|
|
|
|
void set_interrupt_enabled(bool value);
|
2019-04-20 14:02:55 +02:00
|
|
|
|
2019-05-29 20:03:41 +02:00
|
|
|
float get_interrupt_time();
|
|
|
|
void set_interrupt_time(float value);
|
2019-04-20 14:02:55 +02:00
|
|
|
|
2019-12-13 09:35:14 +01:00
|
|
|
//AOE
|
2019-05-29 20:03:41 +02:00
|
|
|
bool get_is_aoe();
|
|
|
|
void set_is_aoe(bool value);
|
2019-04-20 14:02:55 +02:00
|
|
|
|
2019-05-29 20:03:41 +02:00
|
|
|
SpellAOETargetType get_aoe_target_type();
|
|
|
|
void set_aoe_target_type(SpellAOETargetType value);
|
2019-04-20 14:02:55 +02:00
|
|
|
|
2019-12-13 09:35:14 +01:00
|
|
|
SpellEnums::ColliderType get_aoe_collider_type();
|
|
|
|
void set_aoe_collider_type(SpellEnums::ColliderType value);
|
2019-04-20 14:02:55 +02:00
|
|
|
|
2019-12-13 09:35:14 +01:00
|
|
|
float get_aoe_radius();
|
|
|
|
void set_aoe_radius(float value);
|
2019-04-20 14:02:55 +02:00
|
|
|
|
2019-12-13 09:35:14 +01:00
|
|
|
Vector3 get_aoe_box_extents();
|
|
|
|
void set_aoe_box_extents(Vector3 value);
|
2019-04-20 14:02:55 +02:00
|
|
|
|
2019-05-29 20:03:41 +02:00
|
|
|
int get_spell_cooldown_mainpulation_data_count();
|
|
|
|
void set_spell_cooldown_mainpulation_data_count(int value);
|
2019-04-20 14:02:55 +02:00
|
|
|
|
2019-09-12 23:43:53 +02:00
|
|
|
int get_training_cost();
|
|
|
|
void set_training_cost(int value);
|
|
|
|
|
|
|
|
Ref<Spell> get_training_required_spell();
|
|
|
|
void set_training_required_spell(Ref<Spell> spell);
|
|
|
|
|
2019-12-01 18:00:09 +01:00
|
|
|
Ref<EntitySkillData> get_training_required_skill();
|
|
|
|
void set_training_required_skill(Ref<EntitySkillData> skill);
|
2019-09-12 23:43:53 +02:00
|
|
|
|
|
|
|
int get_training_required_skill_level();
|
|
|
|
void set_training_required_skill_level(int value);
|
|
|
|
|
2019-04-20 14:02:55 +02:00
|
|
|
//// Spell Script ////
|
|
|
|
|
|
|
|
float PLAYER_HIT_RADIUS;
|
|
|
|
|
2019-05-03 23:19:10 +02:00
|
|
|
//Commands, c++ only
|
|
|
|
void sstart_casting_simple(Entity *caster, float spell_scale);
|
|
|
|
void sinterrupt_cast_simple(Entity *caster);
|
|
|
|
void sstart_casting_triggered_simple(Entity *caster);
|
|
|
|
|
|
|
|
//Commands
|
|
|
|
void sstart_casting(Ref<SpellCastInfo> info);
|
|
|
|
void sstart_casting_triggered(Ref<SpellCastInfo> info);
|
|
|
|
void sinterrupt_cast(Ref<SpellCastInfo> info);
|
|
|
|
void sfinish_cast(Ref<SpellCastInfo> info);
|
|
|
|
|
|
|
|
virtual void _sstart_casting(Ref<SpellCastInfo> info);
|
|
|
|
|
|
|
|
//eventhandlers
|
2019-05-30 00:26:02 +02:00
|
|
|
void son_cast_player_moved(Ref<SpellCastInfo> info);
|
2019-05-03 23:19:10 +02:00
|
|
|
void son_cast_damage_received(Ref<SpellCastInfo> info);
|
|
|
|
void son_spell_hit(Ref<SpellCastInfo> info);
|
2019-12-12 16:44:43 +01:00
|
|
|
void son_physics_process(Ref<SpellCastInfo> info, float delta);
|
2019-05-03 23:19:10 +02:00
|
|
|
|
|
|
|
//Clientside Event Handlers
|
|
|
|
void con_spell_cast_started(Ref<SpellCastInfo> info);
|
|
|
|
void con_spell_cast_success(Ref<SpellCastInfo> info);
|
|
|
|
void con_spell_cast_failed(Ref<SpellCastInfo> info);
|
|
|
|
void con_spell_cast_ended(Ref<SpellCastInfo> info);
|
|
|
|
void con_spell_cast_interrupted(Ref<SpellCastInfo> info);
|
|
|
|
|
|
|
|
//Calculations / Queries
|
2019-05-02 02:18:44 +02:00
|
|
|
void calculate_initial_damage(Ref<SpellDamageInfo> data);
|
|
|
|
void handle_spell_damage(Ref<SpellDamageInfo> data);
|
|
|
|
|
|
|
|
virtual void _calculate_initial_damage(Ref<SpellDamageInfo> data);
|
|
|
|
virtual void _handle_spell_damage(Ref<SpellDamageInfo> data);
|
|
|
|
|
|
|
|
String get_description(int level);
|
2019-04-20 14:02:55 +02:00
|
|
|
|
|
|
|
Spell();
|
|
|
|
~Spell();
|
|
|
|
|
|
|
|
protected:
|
|
|
|
static void _bind_methods();
|
|
|
|
|
|
|
|
private:
|
2019-10-19 12:47:30 +02:00
|
|
|
int _id;
|
2019-04-20 14:02:55 +02:00
|
|
|
int _spell_type;
|
2019-09-12 23:06:24 +02:00
|
|
|
SpellEnums::SpellCategory _spell_category;
|
2019-04-20 14:02:55 +02:00
|
|
|
|
|
|
|
bool _hide_from_actionbar;
|
|
|
|
float _cooldown;
|
|
|
|
SpellTargetType _target_type;
|
2019-06-24 13:12:33 +02:00
|
|
|
TargetRelationType _target_relation_type;
|
2019-04-20 14:02:55 +02:00
|
|
|
|
2019-09-12 23:28:18 +02:00
|
|
|
Vector<Ref<Aura> > _caster_aura_applys;
|
|
|
|
Vector<Ref<Aura> > _target_aura_applys;
|
|
|
|
Vector<Ref<Aura> > _on_learn_auras;
|
2019-04-20 14:02:55 +02:00
|
|
|
|
|
|
|
int _level;
|
2019-05-30 00:26:02 +02:00
|
|
|
int _rank;
|
2019-12-29 01:58:25 +01:00
|
|
|
bool _scale_with_level;
|
2019-04-20 14:02:55 +02:00
|
|
|
int _item_cost;
|
|
|
|
int _craft_material_cost;
|
|
|
|
int _required_item;
|
2019-12-01 00:24:38 +01:00
|
|
|
|
|
|
|
Ref<EntityResourceCostData> _resource_cost;
|
|
|
|
Ref<EntityResourceCostData> _resource_give;
|
|
|
|
|
2019-12-29 01:58:25 +01:00
|
|
|
bool _global_cooldown_enabled;
|
2019-04-20 14:02:55 +02:00
|
|
|
bool _is_local_spell;
|
|
|
|
Ref<Texture> _icon;
|
2019-10-19 12:12:09 +02:00
|
|
|
|
|
|
|
String _text_description;
|
2019-04-20 14:02:55 +02:00
|
|
|
|
2019-08-26 20:10:26 +02:00
|
|
|
Ref<SpellEffectVisual> _visual_spell_effects;
|
2019-12-09 21:23:57 +01:00
|
|
|
|
|
|
|
Ref<WorldSpellData> _world_spell_data;
|
2019-10-07 18:29:25 +02:00
|
|
|
Ref<CraftRecipe> _teaches_craft_recipe;
|
2019-08-26 20:10:26 +02:00
|
|
|
|
2019-12-29 01:58:25 +01:00
|
|
|
bool _range_enabled;
|
2019-04-20 14:02:55 +02:00
|
|
|
float _range;
|
|
|
|
|
2019-12-29 01:58:25 +01:00
|
|
|
bool _damage_enabled;
|
2019-04-20 14:02:55 +02:00
|
|
|
int _damage_type;
|
|
|
|
int _damage_min;
|
|
|
|
int _damage_max;
|
2019-12-29 01:58:25 +01:00
|
|
|
Stat::StatId _damage_scale_stat;
|
|
|
|
float _damage_scale_coeff;
|
2019-04-20 14:02:55 +02:00
|
|
|
|
2019-12-29 01:58:25 +01:00
|
|
|
bool _heal_enabled;
|
2019-04-20 14:02:55 +02:00
|
|
|
int _heal_min;
|
|
|
|
int _heal_max;
|
2019-12-29 01:58:25 +01:00
|
|
|
Stat::StatId _heal_scale_stat;
|
|
|
|
float _heal_scale_coeff;
|
|
|
|
|
|
|
|
bool _dispell_enabled;
|
|
|
|
int _dispell_count_min;
|
|
|
|
int _dispell_count_max;
|
|
|
|
int _dispell_aura_types;
|
2019-04-20 14:02:55 +02:00
|
|
|
|
2019-12-29 01:58:25 +01:00
|
|
|
bool _cast_time_enabled;
|
2019-04-20 14:02:55 +02:00
|
|
|
float _cast_time;
|
|
|
|
|
|
|
|
bool _needs_target;
|
|
|
|
bool _can_move_while_casting;
|
|
|
|
|
2019-12-29 01:58:25 +01:00
|
|
|
bool _interrupt_enabled;
|
2019-04-20 14:02:55 +02:00
|
|
|
float _interrupt_time;
|
|
|
|
|
|
|
|
bool _is_aoe;
|
|
|
|
SpellAOETargetType _aoe_targetType;
|
2019-12-13 09:35:14 +01:00
|
|
|
SpellEnums::ColliderType _aoe_colliderType;
|
|
|
|
float _aoe_radius;
|
|
|
|
Vector3 _aoe_box_extents;
|
|
|
|
|
|
|
|
Ref<WorldSpellData> _projectile;
|
2019-04-20 14:02:55 +02:00
|
|
|
|
|
|
|
int _spell_cooldown_mainpulation_data_count;
|
2019-09-12 23:43:53 +02:00
|
|
|
|
|
|
|
int _training_cost;
|
|
|
|
Ref<Spell> _training_required_spell;
|
2019-12-01 18:00:09 +01:00
|
|
|
Ref<EntitySkillData> _training_required_skill;
|
2019-09-12 23:43:53 +02:00
|
|
|
int _training_required_skill_level;
|
2019-04-20 14:02:55 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|