entity_spell_system/entities/entity.h

1033 lines
30 KiB
C
Raw Normal View History

2019-04-20 14:02:55 +02:00
#ifndef ENTITY_H
#define ENTITY_H
2019-06-11 15:20:05 +02:00
#include "core/io/networked_multiplayer_peer.h"
2019-05-07 15:05:55 +02:00
#ifdef ENTITIES_2D
#include "scene/2d/physics_body_2d.h"
#else
#include "scene/3d/physics_body.h"
#endif
#include "../data/craft_recipe.h"
2019-09-12 13:26:52 +02:00
#include "../data/item_instance.h"
2019-04-20 14:02:55 +02:00
#include "../data/spell.h"
#include "../data/xp_data.h"
2019-09-12 13:26:52 +02:00
#include "./data/entity_data.h"
2019-04-20 14:02:55 +02:00
#include "core/hash_map.h"
#include "core/object.h"
#include "core/ustring.h"
#include "core/vector.h"
2019-05-07 15:05:55 +02:00
2019-04-20 14:02:55 +02:00
#include "../data/spell.h"
2019-10-28 14:45:38 +01:00
#include "entity_resource.h"
2019-04-20 14:02:55 +02:00
#include "stats/stat.h"
#include "../entity_data_manager.h"
2019-04-20 14:02:55 +02:00
#include "../entity_enums.h"
2019-05-01 02:49:06 +02:00
#include "../skeleton/character_skeleton.h"
#include "../utility/entity_create_info.h"
2019-10-28 14:45:38 +01:00
#include "../inventory/bag.h"
#include "../utility/category_cooldown.h"
2019-09-12 13:26:52 +02:00
#include "../utility/cooldown.h"
2019-09-11 17:24:22 +02:00
#include "./data/entity_data_container.h"
#include "./skills/entity_skill.h"
#include "../profile_manager/actionbar/action_bar_profile.h"
2019-10-31 01:35:29 +01:00
#include "../ai/ai_fsm_action.h"
#include "../data/aura_group.h"
2019-11-04 01:38:27 +01:00
#include "../profile_manager/input/input_profile.h"
#include "../profile_manager/profile_manager.h"
class EntityData;
2019-04-20 14:02:55 +02:00
class AuraData;
class Spell;
class SpellDamageInfo;
2019-05-06 02:07:51 +02:00
class SpellHealInfo;
2019-04-20 14:02:55 +02:00
class SpellCastInfo;
class EntityCreateInfo;
class TalentRowData;
class CharacterSpec;
2019-04-20 14:02:55 +02:00
enum SpellCastDataSignals {
CastFailed,
StartCasting,
CastFinished,
SetTarget
};
VARIANT_ENUM_CAST(SpellCastDataSignals);
enum PlayerStates {
STATE_FREEZE,
STATE_NORMAL
};
VARIANT_ENUM_CAST(PlayerStates);
enum PlayerSendFlags {
SEND_FLAG_NONE,
SEND_FLAG_INVENTORY,
SEND_FLAG_SPELL_DATA,
SEND_FLAG_AURAS,
};
2019-10-28 14:45:38 +01:00
#define ISSERVER() (is_inside_tree() && (!get_tree()->has_network_peer() || (get_tree()->has_network_peer() && get_tree()->is_network_server())))
2019-10-29 13:36:33 +01:00
#define ISCLIENT() (is_inside_tree() && get_tree()->has_network_peer() && !get_tree()->is_network_server())
2019-10-28 14:45:38 +01:00
2019-06-18 02:32:39 +02:00
#define SET_RPC_OFF(p_method_name) rpc_config(p_method_name, MultiplayerAPI::RPC_MODE_DISABLED);
2019-06-11 15:20:05 +02:00
#define SET_RPC_REMOTE(p_method_name) rpc_config(p_method_name, MultiplayerAPI::RPC_MODE_REMOTE);
#define SET_RPC_MASTER(p_method_name) rpc_config(p_method_name, MultiplayerAPI::RPC_MODE_MASTER);
#define SET_RPC_PUPPET(p_method_name) rpc_config(p_method_name, MultiplayerAPI::RPC_MODE_PUPPET);
2019-06-18 02:32:39 +02:00
#define SET_RPC_REMOTESYNC(p_method_name) rpc_config(p_method_name, MultiplayerAPI::RPC_MODE_REMOTESYNC);
#define SET_RPC_MASTERSYNC(p_method_name) rpc_config(p_method_name, MultiplayerAPI::RPC_MODE_MASTERSYNC);
#define SET_RPC_PUPPETSYNC(p_method_name) rpc_config(p_method_name, MultiplayerAPI::RPC_MODE_PUPPETSYNC);
2019-06-11 15:20:05 +02:00
2019-10-28 14:45:38 +01:00
// f.e. RPC(method, arg0, arg1, etc)
2019-10-28 21:48:50 +01:00
#define RPC(func, ...) \
if (is_inside_tree() && get_tree()->has_network_peer()) { \
rpc(#func, ##__VA_ARGS__); \
2019-10-28 21:48:50 +01:00
} \
2019-10-28 14:45:38 +01:00
func(__VA_ARGS__);
2019-10-28 21:48:50 +01:00
#define VRPC(func, ...) \
if (is_inside_tree() && get_tree()->has_network_peer()) { \
vrpc(#func, ##__VA_ARGS__); \
2019-10-28 21:48:50 +01:00
} \
2019-10-28 14:45:38 +01:00
func(__VA_ARGS__);
2019-06-17 00:07:38 +02:00
2019-10-28 21:48:50 +01:00
#define ORPC(func, ...) \
if (is_inside_tree() && get_tree()->has_network_peer()) { \
if (get_tree()->is_network_server() && get_network_master() != 1) \
rpc_id(get_network_master(), #func, ##__VA_ARGS__); \
2019-10-28 21:48:50 +01:00
} \
2019-10-28 14:45:38 +01:00
func(__VA_ARGS__);
2019-10-28 21:48:50 +01:00
#define RPCS(func, ...) \
if (is_inside_tree() && get_tree()->has_network_peer()) { \
if (get_tree()->is_network_server()) { \
func(__VA_ARGS__); \
} else { \
rpc_id(1, #func, ##__VA_ARGS__); \
2019-10-28 21:48:50 +01:00
} \
} else { \
func(__VA_ARGS__); \
}
//RPC Objects
#define RPCOBJ(rpcfunc, rpc_var, normalfunc, normal_var) \
if (is_inside_tree() && get_tree()->has_network_peer()) { \
rpc(#rpcfunc, rpc_var); \
} \
normalfunc(normal_var);
#define VRPCOBJ(rpcfunc, rpc_var, normalfunc, normal_var) \
if (is_inside_tree() && get_tree()->has_network_peer()) { \
vrpc(#rpcfunc, rpc_var); \
} \
normalfunc(normal_var);
#define ORPCOBJ(rpcfunc, rpc_var, normalfunc, normal_var) \
if (is_inside_tree() && get_tree()->has_network_peer()) { \
if (get_tree()->is_network_server() && get_network_master() != 1) \
rpc_id(get_network_master(), #rpcfunc, rpc_var); \
} \
normalfunc(normal_var);
#define RPCSOBJ(rpcfunc, rpc_var, normalfunc, normal_var) \
if (is_inside_tree() && get_tree()->has_network_peer()) { \
if (get_tree()->is_network_server()) { \
normalfunc(normal_var); \
} else { \
rpc_id(1, #rpcfunc, rpc_var); \
} \
} else { \
normalfunc(normal_var); \
2019-06-18 15:33:28 +02:00
}
2019-06-11 15:20:05 +02:00
2019-11-04 16:50:53 +01:00
#define ORPCOBJP(rpcfunc, rpc_var1, rpc_var2, normalfunc, normal_var1, normal_var2) \
if (is_inside_tree() && get_tree()->has_network_peer()) { \
if (get_tree()->is_network_server() && get_network_master() != 1) \
rpc_id(get_network_master(), #rpcfunc, rpc_var1, rpc_var2); \
} \
normalfunc(normal_var1, normal_var2);
2019-10-28 14:45:38 +01:00
// f.e. RSET(rset("property", "value"), property, value)
2019-10-28 21:48:50 +01:00
#define RSET(rset_func, variable, value) \
if (is_inside_tree() && get_tree()->has_network_peer()) { \
rset_func; \
} \
2019-09-12 13:26:52 +02:00
variable = value;
2019-06-11 15:20:05 +02:00
2019-04-20 19:09:22 +02:00
#ifdef ENTITIES_2D
class Entity : public KinematicBody2D {
GDCLASS(Entity, KinematicBody2D);
2019-04-20 19:09:22 +02:00
#else
2019-04-20 19:09:22 +02:00
class Entity : public KinematicBody {
GDCLASS(Entity, KinematicBody);
2019-04-20 19:09:22 +02:00
#endif
2019-04-20 14:02:55 +02:00
public:
void initialize(Ref<EntityCreateInfo> info);
2019-04-20 14:02:55 +02:00
//// Base ////
2019-05-01 02:49:06 +02:00
NodePath get_character_skeleton_path();
void set_character_skeleton_path(NodePath value);
CharacterSkeleton *get_character_skeleton();
//EntityType
2019-04-20 14:02:55 +02:00
EntityEnums::EntityType gets_entity_type();
void sets_entity_type(EntityEnums::EntityType value);
EntityEnums::EntityType getc_entity_type();
void setc_entity_type(EntityEnums::EntityType value);
2019-09-12 13:26:52 +02:00
//EntityInteractionType
EntityEnums::EntityInteractionType gets_entity_interaction_type();
void sets_entity_interaction_type(EntityEnums::EntityInteractionType value);
EntityEnums::EntityInteractionType getc_entity_interaction_type();
void setc_entity_interaction_type(EntityEnums::EntityInteractionType value);
2019-09-12 13:26:52 +02:00
int gets_immunity_flags();
void sets_immunity_flags(int value);
2019-09-12 13:26:52 +02:00
int gets_entity_flags();
void sets_entity_flags(int value);
int getc_entity_flags();
void setc_entity_flags(int value);
2019-09-12 13:26:52 +02:00
EntityEnums::EntityController gets_entity_controller();
void sets_entity_controller(EntityEnums::EntityController value);
2019-04-20 14:02:55 +02:00
String gets_entity_name();
void sets_entity_name(String value);
2019-04-20 14:02:55 +02:00
String getc_entity_name();
void setc_entity_name(String value);
2019-04-20 14:02:55 +02:00
EntityEnums::EntityGender gets_gender();
void sets_gender(EntityEnums::EntityGender value);
2019-04-20 14:02:55 +02:00
EntityEnums::EntityGender getc_gender();
void setc_gender(EntityEnums::EntityGender value);
2019-04-20 14:02:55 +02:00
int gets_level();
void sets_level(int value);
int getc_level();
void setc_level(int value);
int gets_xp();
void sets_xp(int value);
int getc_xp();
void setc_xp(int value);
2019-09-12 13:26:52 +02:00
int gets_money();
2019-09-11 13:06:04 +02:00
void sets_money(int value);
int getc_money();
void setc_money(int value);
2019-04-20 14:02:55 +02:00
2019-10-28 14:45:38 +01:00
Ref<EntityData> gets_entity_data();
void sets_entity_data(Ref<EntityData> value);
Ref<EntityData> getc_entity_data();
void setc_entity_data(Ref<EntityData> value);
2019-04-20 14:02:55 +02:00
2019-10-28 14:45:38 +01:00
int gets_entity_data_id();
void sets_entity_data_id(int value);
int getc_entity_data_id();
void setc_entity_data_id(int value);
2019-04-20 14:02:55 +02:00
2019-11-04 01:38:27 +01:00
EntityEnums::AIStates gets_ai_state() const;
void sets_ai_state(EntityEnums::AIStates state);
int gets_seed();
void sets_seed(int value);
int getc_seed();
void setc_seed(int value);
2019-04-20 14:02:55 +02:00
//// Stats ////
_FORCE_INLINE_ Ref<Stat> get_health() { return _stats[Stat::STAT_ID_HEALTH]; }
_FORCE_INLINE_ Ref<Stat> get_mana() { return _stats[Stat::STAT_ID_MANA]; }
_FORCE_INLINE_ Ref<Stat> get_energy() { return _stats[Stat::STAT_ID_RAGE]; }
_FORCE_INLINE_ Ref<Stat> get_rage() { return _stats[Stat::STAT_ID_ENERGY]; }
_FORCE_INLINE_ Ref<Stat> get_speed() { return _stats[Stat::STAT_ID_SPEED]; }
_FORCE_INLINE_ Ref<Stat> get_gcd() { return _stats[Stat::STAT_ID_GLOBAL_COOLDOWN]; }
_FORCE_INLINE_ Ref<Stat> get_melee_crit() { return _stats[Stat::STAT_ID_MELEE_CRIT]; }
_FORCE_INLINE_ Ref<Stat> get_melee_crit_bonus() { return _stats[Stat::STAT_ID_MELEE_CRIT_BONUS]; }
_FORCE_INLINE_ Ref<Stat> get_spell_crit() { return _stats[Stat::STAT_ID_SPELL_CRIT]; }
_FORCE_INLINE_ Ref<Stat> get_spell_crit_bonus() { return _stats[Stat::STAT_ID_SPELL_CRIT_BONUS]; }
_FORCE_INLINE_ Ref<Stat> get_block() { return _stats[Stat::STAT_ID_BLOCK]; }
_FORCE_INLINE_ Ref<Stat> get_parry() { return _stats[Stat::STAT_ID_PARRY]; }
_FORCE_INLINE_ Ref<Stat> get_damage_reduction() { return _stats[Stat::STAT_ID_DAMAGE_REDUCTION]; }
_FORCE_INLINE_ Ref<Stat> get_melee_damage_reduction() { return _stats[Stat::STAT_ID_MELEE_DAMAGE_REDUCTION]; }
_FORCE_INLINE_ Ref<Stat> get_spell_damage_reduction() { return _stats[Stat::STAT_ID_SPELL_DAMAGE_REDUCTION]; }
_FORCE_INLINE_ Ref<Stat> get_damage_taken() { return _stats[Stat::STAT_ID_DAMAGE_TAKEN]; }
_FORCE_INLINE_ Ref<Stat> get_heal_taken() { return _stats[Stat::STAT_ID_HEAL_TAKEN]; }
_FORCE_INLINE_ Ref<Stat> get_melee_damage() { return _stats[Stat::STAT_ID_MELEE_DAMAGE]; }
_FORCE_INLINE_ Ref<Stat> get_spell_damage() { return _stats[Stat::STAT_ID_SPELL_DAMAGE]; }
2019-04-20 14:02:55 +02:00
Ref<Stat> get_stat_int(int index);
void set_stat_int(int index, Ref<Stat> entry);
Ref<Stat> get_stat_enum(Stat::StatId stat_id);
void set_stat_enum(Stat::StatId stat_id, Ref<Stat> entry);
2019-09-12 13:26:52 +02:00
void sdie();
void cdie();
2019-04-20 14:02:55 +02:00
void ons_stat_changed(Ref<Stat> stat);
void onc_stat_changed(Ref<Stat> stat);
2019-10-28 21:48:50 +01:00
void ssend_stat(int id, int ccurrent, int cmax);
void creceive_stat(int id, int ccurrent, int cmax);
2019-10-07 00:29:05 +02:00
//// Equip Slots ////
2019-10-13 22:48:25 +02:00
bool should_deny_equip(ItemEnums::EquipSlots equip_slot, Ref<ItemInstance> item);
void son_equip_success(ItemEnums::EquipSlots equip_slot, Ref<ItemInstance> item, Ref<ItemInstance> old_item, int bag_slot);
void son_equip_fail(ItemEnums::EquipSlots equip_slot, Ref<ItemInstance> item, Ref<ItemInstance> old_item, int bag_slot);
void con_equip_success(ItemEnums::EquipSlots equip_slot, Ref<ItemInstance> item, Ref<ItemInstance> old_item, int bag_slot);
void con_equip_fail(ItemEnums::EquipSlots equip_slot, Ref<ItemInstance> item, Ref<ItemInstance> old_item, int bag_slot);
2019-10-13 13:53:03 +02:00
void crequest_equip(ItemEnums::EquipSlots equip_slot, int bag_slot);
void sequip(ItemEnums::EquipSlots equip_slot, int bag_slot);
void _sequip(ItemEnums::EquipSlots equip_slot, int bag_slot);
2019-10-13 13:53:03 +02:00
void cequip_success(ItemEnums::EquipSlots equip_slot, int bag_slot);
void cequip_fail(ItemEnums::EquipSlots equip_slot, int bag_slot);
Ref<ItemInstance> gets_equip_slot(int index);
2019-10-13 13:53:03 +02:00
void sets_equip_slot(int index, Ref<ItemInstance> item);
Ref<ItemInstance> getc_equip_slot(int index);
2019-10-13 13:53:03 +02:00
void setc_equip_slot(int index, Ref<ItemInstance> item);
void sapply_item_stats(Ref<ItemInstance> item);
void sdeapply_item_stats(Ref<ItemInstance> item);
void _sapply_item_stats(Ref<ItemInstance> item);
void _sdeapply_item_stats(Ref<ItemInstance> item);
2019-10-07 00:29:05 +02:00
//// Resources ////
Ref<EntityResource> gets_resource(int index);
Ref<EntityResource> gets_resource_type(int type);
void adds_resource(Ref<EntityResource> resource);
int gets_resource_count();
void removes_resource(int index);
void clears_resource();
Ref<EntityResource> getc_resource(int index);
Ref<EntityResource> getc_resource_type(int type);
void addc_resource(Ref<EntityResource> resource);
int getc_resource_count();
void removec_resource(int index);
void clearc_resource();
2019-10-07 00:29:05 +02:00
//// Global Cooldown ////
bool getc_has_global_cooldown();
bool gets_has_global_cooldown();
bool getc_global_cooldown();
bool gets_global_cooldown();
void sstart_global_cooldown(float value);
void cstart_global_cooldown(float value);
//// States ////
int getc_state();
void setc_state(int state);
int gets_state();
void sets_state(int state);
void sadd_state_ref(int state_index);
void sremove_state_ref(int state_index);
2019-04-20 14:02:55 +02:00
//// Crafting System ////
void crequest_craft(int id);
void scraft(int id);
bool hass_craft_recipe(Ref<CraftRecipe> craft_recipe);
2019-11-04 01:16:50 +01:00
bool hass_craft_recipe_id(int id);
void adds_craft_recipe(Ref<CraftRecipe> craft_recipe);
2019-11-04 01:16:50 +01:00
void adds_craft_recipe_id(int id);
void removes_craft_recipe(Ref<CraftRecipe> craft_recipe);
2019-11-04 01:16:50 +01:00
void removes_craft_recipe_id(int id);
Ref<CraftRecipe> gets_craft_recipe(int index);
2019-11-04 01:16:50 +01:00
Ref<CraftRecipe> gets_craft_recipe_id(int id);
int gets_craft_recipe_count();
bool hasc_craft_recipe(Ref<CraftRecipe> craft_recipe);
2019-11-04 01:16:50 +01:00
bool hasc_craft_recipe_id(int id);
void addc_craft_recipe(Ref<CraftRecipe> craft_recipe);
2019-11-04 01:16:50 +01:00
void addc_craft_recipe_id(int id);
void removec_craft_recipe(Ref<CraftRecipe> craft_recipe);
2019-11-04 01:16:50 +01:00
void removec_craft_recipe_id(int id);
Ref<CraftRecipe> getc_craft_recipe(int index);
int getc_craft_recipe_count();
//// SpellSystem ////
//EventHandlers
void son_before_aura_applied(Ref<AuraData> data);
void son_after_aura_applied(Ref<AuraData> data);
2019-09-12 13:26:52 +02:00
2019-09-11 11:01:30 +02:00
void son_before_damage_hit(Ref<SpellDamageInfo> info);
2019-09-12 13:26:52 +02:00
void son_hit(Ref<SpellDamageInfo> info);
void son_before_damage(Ref<SpellDamageInfo> info);
void son_damage_receive(Ref<SpellDamageInfo> info);
void son_dealt_damage(Ref<SpellDamageInfo> info);
void son_damage_dealt(Ref<SpellDamageInfo> info);
2019-09-12 13:26:52 +02:00
void son_before_heal_hit(Ref<SpellHealInfo> info);
void son_before_heal(Ref<SpellHealInfo> info);
void son_heal_receive(Ref<SpellHealInfo> info);
void son_dealt_heal(Ref<SpellHealInfo> info);
void son_heal_dealt(Ref<SpellHealInfo> info);
2019-05-06 02:07:51 +02:00
void son_before_cast(Ref<SpellCastInfo> info);
void son_before_cast_target(Ref<SpellCastInfo> info);
void son_cast_finished_target(Ref<SpellCastInfo> info);
void son_cast_finished(Ref<SpellCastInfo> info);
void son_cast_started(Ref<SpellCastInfo> info);
void son_cast_failed(Ref<SpellCastInfo> info);
void son_spell_cast_success(Ref<SpellCastInfo> info);
2019-09-12 13:26:52 +02:00
void son_death();
2019-06-17 00:07:38 +02:00
void son_cooldown_added(Ref<Cooldown> cooldown);
void son_cooldown_removed(Ref<Cooldown> cooldown);
void son_category_cooldown_added(Ref<CategoryCooldown> category_cooldown);
void son_category_cooldown_removed(Ref<CategoryCooldown> category_cooldown);
2019-09-12 13:26:52 +02:00
void son_gcd_started();
void son_gcd_finished();
void con_gcd_started();
void con_gcd_finished();
2019-09-12 13:26:52 +02:00
void son_physics_process();
void son_xp_gained(int value);
void son_level_up(int value);
//Clientside EventHandlers
void con_cast_failed(Ref<SpellCastInfo> info);
void con_cast_started(Ref<SpellCastInfo> info);
void con_cast_state_changed(Ref<SpellCastInfo> info);
void con_cast_finished(Ref<SpellCastInfo> info);
void con_spell_cast_success(Ref<SpellCastInfo> info);
2019-09-12 13:26:52 +02:00
void con_death();
void con_cooldown_added(Ref<Cooldown> cooldown);
void con_cooldown_removed(Ref<Cooldown> cooldown);
void con_category_cooldown_added(Ref<CategoryCooldown> category_cooldown);
void con_category_cooldown_removed(Ref<CategoryCooldown> category_cooldown);
2019-09-12 13:26:52 +02:00
void con_aura_added(Ref<AuraData> data);
void con_aura_removed(Ref<AuraData> data);
void con_aura_refresh(Ref<AuraData> data);
2019-09-12 13:26:52 +02:00
void con_damage_dealt(Ref<SpellDamageInfo> info);
void con_dealt_damage(Ref<SpellDamageInfo> info);
void con_heal_dealt(Ref<SpellHealInfo> info);
void con_dealt_heal(Ref<SpellHealInfo> info);
2019-09-12 13:26:52 +02:00
void con_xp_gained(int value);
void con_level_up(int value);
//Modifiers/Requesters
void sapply_passives_damage_receive(Ref<SpellDamageInfo> info);
void sapply_passives_damage_deal(Ref<SpellDamageInfo> info);
2019-04-20 14:02:55 +02:00
void sapply_passives_heal_receive(Ref<SpellHealInfo> info);
void sapply_passives_heal_deal(Ref<SpellHealInfo> info);
2019-09-12 13:26:52 +02:00
//Spell operations
void scast_spell(int spell_id);
void crequest_spell_cast(int spell_id);
//Damage Operations
void stake_damage(Ref<SpellDamageInfo> info);
void sdeal_damage_to(Ref<SpellDamageInfo> info);
2019-04-20 14:02:55 +02:00
2019-05-06 02:07:51 +02:00
//Heal Operations
void stake_heal(Ref<SpellHealInfo> info);
void sdeal_heal_to(Ref<SpellHealInfo> info);
2019-09-12 13:26:52 +02:00
//Damage, Heal RPCs
void cdamage_dealt_rpc(String data);
void cdealt_damage_rpc(String data);
void cheal_dealt_rpc(String data);
void cdealt_heal_rpc(String data);
2019-09-12 13:26:52 +02:00
//Interactions
bool cans_interact();
void sinteract();
bool canc_interact();
void crequest_interact();
2019-05-06 02:07:51 +02:00
void ssend_open_loot_window();
void ssend_open_container_window();
void ssend_open_vendor_window();
void copen_loot_window();
void copen_container_window();
void copen_vendor_window();
2019-09-12 13:26:52 +02:00
//XP Operations
void adds_xp(int value);
void addc_xp(int value);
void slevelup(int value);
void clevelup(int value);
2019-09-12 13:26:52 +02:00
//Aura Manipulation
void sadd_aura(Ref<AuraData> aura);
2019-04-20 14:02:55 +02:00
void sremove_aura(Ref<AuraData> aura);
void sremove_aura_exact(Ref<AuraData> aura);
void sremove_aura_expired(Ref<AuraData> aura);
void sremove_aura_dispelled(Ref<AuraData> aura);
void saura_refreshed(Ref<AuraData> aura);
2019-10-29 00:24:37 +01:00
2019-10-28 21:48:50 +01:00
void cadd_aura_rpc(String data);
void cremove_aura_rpc(String data);
void cremove_aura_exact_rpc(String data);
void cremove_aura_expired_rpc(String data);
void cremove_aura_dispelled_rpc(String data);
void caura_refreshed_rpc(String data);
void cadd_aura(Ref<AuraData> aura);
2019-04-20 14:02:55 +02:00
void cremove_aura(Ref<AuraData> aura);
void cremove_aura_exact(Ref<AuraData> aura);
void cremove_aura_expired(Ref<AuraData> aura);
void cremove_aura_dispelled(Ref<AuraData> aura);
void caura_refreshed(Ref<AuraData> aura);
2019-04-20 14:02:55 +02:00
void sremove_auras_with_group(Ref<AuraGroup> aura_group);
2019-09-12 13:26:52 +02:00
//NOTE: No reason for shas_aura_by, just query it, and check for null.
int sget_aura_count();
Ref<AuraData> sget_aura(int index);
Ref<AuraData> sget_aura_by(Entity *caster, int aura_id);
Ref<AuraData> sget_aura_by_bind(Node *caster, int aura_id);
2019-09-12 13:26:52 +02:00
Ref<AuraData> sget_aura_with_group_by(Entity *caster, Ref<AuraGroup> aura_group);
Ref<AuraData> sget_aura_with_group_by_bind(Node *caster, Ref<AuraGroup> aura_group);
int cget_aura_count();
Ref<AuraData> cget_aura(int index);
2019-04-20 14:02:55 +02:00
//Hooks
void moved();
2019-09-12 13:26:52 +02:00
2019-09-25 12:59:21 +02:00
void onc_mouse_enter();
void onc_mouse_exit();
void onc_targeted();
void onc_untargeted();
//Update
void update_auras(float delta);
2019-09-12 13:26:52 +02:00
2019-04-20 14:02:55 +02:00
bool gets_is_dead();
bool getc_is_dead();
//// Casting System ////
2019-09-12 13:26:52 +02:00
bool sis_casting();
bool cis_casting();
Ref<SpellCastInfo> gets_spell_cast_info();
void sets_spell_cast_info(Ref<SpellCastInfo> info);
Ref<SpellCastInfo> getc_spell_cast_info();
void setc_spell_cast_info(Ref<SpellCastInfo> info);
2019-04-20 14:02:55 +02:00
void sstart_casting(Ref<SpellCastInfo> info);
void sfail_cast();
void sdelay_cast();
void sfinish_cast();
void sinterrupt_cast();
2019-10-28 21:48:50 +01:00
void cstart_casting_rpc(String data);
2019-04-20 14:02:55 +02:00
void cstart_casting(Ref<SpellCastInfo> info);
void cfail_cast();
void cdelay_cast();
void cfinish_cast();
void cinterrupt_cast();
void sspell_cast_success(Ref<SpellCastInfo> info);
2019-10-28 21:48:50 +01:00
void cspell_cast_success_rpc(String data);
void cspell_cast_success(Ref<SpellCastInfo> info);
//// Cooldowns ////
Vector<Ref<Cooldown> > *gets_cooldowns();
Vector<Ref<Cooldown> > *getc_cooldowns();
HashMap<int, Ref<Cooldown> > *gets_cooldown_map();
HashMap<int, Ref<Cooldown> > *getc_cooldown_map();
bool hass_cooldown(int spell_id);
void adds_cooldown(int spell_id, float value);
void removes_cooldown(int spell_id);
Ref<Cooldown> gets_cooldown(int spell_id);
Ref<Cooldown> gets_cooldown_index(int index);
int gets_cooldown_count();
bool hasc_cooldown(int spell_id);
void addc_cooldown(int spell_id, float value);
void removec_cooldown(int spell_id);
Ref<Cooldown> getc_cooldown(int spell_id);
Ref<Cooldown> getc_cooldown_index(int index);
int getc_cooldown_count();
//Category Cooldowns
Vector<Ref<CategoryCooldown> > gets_category_cooldowns();
Vector<Ref<CategoryCooldown> > getc_category_cooldowns();
2019-09-12 13:26:52 +02:00
2019-06-17 00:07:38 +02:00
bool hass_category_cooldown(int category_id);
void adds_category_cooldown(int category_id, float value);
void removes_category_cooldown(int category_id);
Ref<CategoryCooldown> gets_category_cooldown(int category_id);
Ref<CategoryCooldown> gets_category_cooldown_index(int index);
int gets_category_cooldown_count();
2019-06-17 00:07:38 +02:00
bool hasc_category_cooldown(int category_id);
void addc_category_cooldown(int category_id, float value);
void removec_category_cooldown(int spell_id);
Ref<CategoryCooldown> getc_category_cooldown(int category_id);
Ref<CategoryCooldown> getc_category_cooldown_index(int index);
int getc_category_cooldown_count();
//Known Spells
int gets_free_spell_points();
void sets_free_spell_points(int value);
int getc_free_spell_points();
void setc_free_spell_points(int value);
void crequest_spell_learn(int id);
void slearn_spell(int id);
bool hass_spell(Ref<Spell> spell);
bool hass_spell_id(int id);
void adds_spell(Ref<Spell> spell);
void removes_spell(Ref<Spell> spell);
Ref<Spell> gets_spell(int index);
int gets_spell_count();
bool hasc_spell(Ref<Spell> spell);
bool hasc_spell_id(int id);
void addc_spell(Ref<Spell> spell);
void removec_spell(Ref<Spell> spell);
Ref<Spell> getc_spell(int index);
int getc_spell_count();
2019-10-28 21:48:50 +01:00
void addc_spell_rpc(int id);
void removec_spell_rpc(int id);
//Skills
bool hass_skill(Ref<EntitySkill> skill);
void adds_skill(Ref<EntitySkill> skill);
void removes_skill(Ref<EntitySkill> skill);
Ref<EntitySkill> gets_skill(int skill);
int gets_skill_count();
bool hasc_skill(Ref<EntitySkill> skill);
void addc_skill(Ref<EntitySkill> skill);
void removec_skill(Ref<EntitySkill> skill);
Ref<EntitySkill> getc_skill(int index);
int getc_skill_count();
//// Target ////
2019-04-20 14:02:55 +02:00
2019-06-22 01:57:43 +02:00
void crequest_target_change(NodePath path);
2019-06-18 15:33:28 +02:00
void net_sets_target(NodePath path);
void net_setc_target(NodePath path);
2019-04-20 14:02:55 +02:00
Entity *gets_target();
void sets_target(Node *p_target);
Entity *getc_target();
void setc_target(Node *p_target);
//// Talents ////
2019-04-20 14:02:55 +02:00
int gets_free_talent_points();
void sets_free_talent_points(int value);
int getc_free_talent_points();
void setc_free_talent_points(int value);
void crequest_talent_learn(int spec_index, int talent_row, int talent_culomn);
void sreceive_talent_learn_request(int spec_index, int talent_row, int talent_culomn);
void _sreceive_talent_learn_request(int spec_index, int talent_row, int talent_culomn);
void crequest_talent_reset();
void sreceive_reset_talent_request();
void _sreceive_reset_talent_request();
void sreset_talents();
void creset_talents();
void adds_talent(int talent);
void removes_talent(int talent);
bool hass_talent(int talent);
int gets_talent(int index);
int gets_talent_count();
void sclear_talents();
void addc_talent(int talent);
void removec_talent(int talent);
bool hasc_talent(int talent);
int getc_talent(int index);
int getc_talent_count();
void cclear_talents();
2019-09-12 13:26:52 +02:00
//// Inventory ////
Ref<Bag> gets_bag() const;
void sets_bag(const Ref<Bag> bag);
2019-10-09 14:37:23 +02:00
Ref<Bag> getc_bag() const;
void setc_bag(const Ref<Bag> bag);
Ref<Bag> gets_target_bag() const;
void sets_target_bag(const Ref<Bag> bag);
Ref<Bag> getc_target_bag() const;
void setc_target_bag(const Ref<Bag> bag);
2019-10-29 00:15:52 +01:00
void setc_bag_rpc(String data);
void setc_target_bag_rpc(String data);
2019-10-02 13:23:04 +02:00
void crequest_loot(int index);
void sloot(int index);
2019-11-04 16:50:53 +01:00
void cloot(int index);
void ons_item_added(Ref<Bag> bag, Ref<ItemInstance> item, int slot_id);
void cadd_item_rpc(int slot_id, String item_data);
void cadd_item(int slot_id, Ref<ItemInstance> item);
//Bag
void ons_item_removed(Ref<Bag> bag, Ref<ItemInstance> item, int slot_id);
void sremove_item(const int slot_id);
void cremove_item(const int slot_id);
void cdenyremove_item(const int slot_id);
void crequest_remove_item(const int slot_id);
void ons_items_swapped(Ref<Bag> bag, int slot_id_1, int slot_id_2);
void sswap_items(int slot_id_1, int slot_id_2);
void cswap_items(int slot_id_1, int slot_id_2);
void cdeny_item_swap(int slot_id_1, int slot_id_2);
void crequest_item_swap(int slot_id_1, int slot_id_2);
void ons_item_count_changed(Ref<Bag> bag, Ref<ItemInstance> item, int slot_id);
void cchange_item_count(int slot_id, int new_count);
void ons_overburdened(Ref<Bag> bag);
void ons_overburden_removed(Ref<Bag> bag);
//Target Bag
void ons_target_item_added(Ref<Bag> bag, Ref<ItemInstance> item, int slot_id);
void cadd_target_item_rpc(int slot_id, String item_data);
void cadd_target_item(int slot_id, Ref<ItemInstance> item);
void ons_target_item_removed(Ref<Bag> bag, Ref<ItemInstance> item, int slot_id);
void sremove_target_item(const int slot_id);
void cremove_target_item(const int slot_id);
void cdenyremove_target_item(const int slot_id);
void crequest_target_remove_item(const int slot_id);
void ons_target_items_swapped(Ref<Bag> bag, int slot_id_1, int slot_id_2);
void sswap_target_items(int slot_id_1, int slot_id_2);
void cswap_target_items(int slot_id_1, int slot_id_2);
void cdeny_target_item_swap(int slot_id_1, int slot_id_2);
void crequest_target_item_swap(int slot_id_1, int slot_id_2);
void ons_target_item_count_changed(Ref<Bag> bag, Ref<ItemInstance> item, int slot_id);
void cchange_target_item_count(int slot_id, int new_count);
2019-10-02 13:23:04 +02:00
2019-09-12 13:26:52 +02:00
//// Data ////
2019-09-11 15:06:30 +02:00
void adds_data(Ref<EntityDataContainer> data);
void removes_data(int index);
Ref<EntityDataContainer> gets_data(int index);
int gets_data_count();
2019-09-12 13:26:52 +02:00
void addc_data(Ref<EntityDataContainer> data);
2019-09-11 15:06:30 +02:00
void removec_data(int index);
Ref<EntityDataContainer> getc_data(int index);
int getc_data_count();
//// Actionbars ////
bool get_actionbar_locked();
void set_actionbar_locked(bool value);
Ref<ActionBarProfile> get_action_bar_profile();
2019-04-20 14:02:55 +02:00
void loaded();
2019-09-12 13:26:52 +02:00
2019-04-20 14:02:55 +02:00
String random_name();
2019-09-12 13:26:52 +02:00
void setup();
virtual void _setup();
2019-11-04 01:38:27 +01:00
void setup_actionbars();
2019-09-12 13:26:52 +02:00
2019-10-31 01:35:29 +01:00
//// AI ////
int get_formation_index();
void set_formation_index(int value);
2019-10-31 11:52:56 +01:00
Ref<AIFSMAction> gets_ai();
void sets_ai(Ref<AIFSMAction> value);
2019-10-31 01:35:29 +01:00
2019-10-15 18:34:19 +02:00
//// Serialization ////
bool is_deserialized();
2019-09-13 09:26:53 +02:00
Dictionary to_dict();
void from_dict(const Dictionary &dict);
2019-10-06 00:25:12 +02:00
virtual Dictionary _to_dict();
virtual void _from_dict(const Dictionary &dict);
2019-09-13 09:26:53 +02:00
2019-10-31 01:35:29 +01:00
// Networking
Entity *gets_sees(int index);
void removes_sees_index(int index);
void removes_sees(Entity *entity);
void removes_sees_bind(Node *entity);
void adds_sees(Entity *entity);
void adds_sees_bind(Node *entity);
int gets_sees_count();
2019-10-29 00:15:52 +01:00
Entity *gets_seen_by(int index);
void removes_seen_by_index(int index);
void removes_seen_by(Entity *entity);
void removes_seen_by_bind(Node *entity);
void adds_seen_by(Entity *entity);
void adds_seen_by_bind(Node *entity);
int gets_seen_by_count();
void vrpc(const StringName &p_method, VARIANT_ARG_LIST);
Variant _vrpc_bind(const Variant **p_args, int p_argcount, Variant::CallError &r_error);
2019-10-28 14:45:38 +01:00
2019-10-28 21:48:50 +01:00
Dictionary data_as_dict(String &data);
Entity();
~Entity();
2019-04-20 14:02:55 +02:00
protected:
static void _bind_methods();
2019-05-01 02:49:06 +02:00
virtual void _notification(int p_what);
2019-04-20 14:02:55 +02:00
virtual void update(float delta);
private:
const float SAVE_BASE_SECONDS = 10.0;
bool _deserialized;
2019-04-20 14:02:55 +02:00
2019-05-01 02:49:06 +02:00
//// Paths ////
NodePath _character_skeleton_path;
CharacterSkeleton *_character_skeleton;
2019-04-20 14:02:55 +02:00
//// PlayerData ////
int _s_guid;
int _c_guid;
int _s_class_id;
int _c_class_id;
int _s_type;
int _c_type;
EntityEnums::EntityGender _s_gender;
EntityEnums::EntityGender _c_gender;
2019-04-20 14:02:55 +02:00
int _s_level;
int _c_level;
int _s_xp;
int _c_xp;
2019-09-12 13:26:52 +02:00
int _s_money;
int _c_money;
2019-04-20 14:02:55 +02:00
Ref<EntityData> _s_entity_data;
Ref<EntityData> _c_entity_data;
2019-04-20 14:02:55 +02:00
int _s_send_flag;
String _s_entity_name;
String _c_entity_name;
2019-04-20 14:02:55 +02:00
EntityEnums::EntityInteractionType _s_interaction_type;
EntityEnums::EntityInteractionType _c_interaction_type;
2019-10-31 01:35:29 +01:00
int _s_is_dead;
int _c_is_dead;
2019-11-04 01:38:27 +01:00
EntityEnums::AIStates _sai_state;
int _s_seed;
int _c_seed;
2019-04-20 14:02:55 +02:00
//// Stats ////
Ref<Stat> _stats[Stat::STAT_ID_TOTAL_STATS];
2019-10-07 00:29:05 +02:00
//// Equipment ////
Ref<ItemInstance> _s_equipment[ItemEnums::EQUIP_SLOT_EQUIP_SLOT_MAX];
Ref<ItemInstance> _c_equipment[ItemEnums::EQUIP_SLOT_EQUIP_SLOT_MAX];
2019-10-07 00:29:05 +02:00
//// Resources ////
Vector<Ref<EntityResource> > _s_resources;
Vector<Ref<EntityResource> > _c_resources;
//// GCD ////
2019-10-07 00:29:05 +02:00
float _s_gcd;
float _c_gcd;
//// States ////
2019-10-07 00:29:05 +02:00
int _s_states[EntityEnums::ENTITY_STATE_TYPE_INDEX_MAX];
int _s_state;
int _c_state;
2019-04-20 14:02:55 +02:00
//// SpellCastData ////
Ref<SpellCastInfo> _s_spell_cast_info;
Ref<SpellCastInfo> _c_spell_cast_info;
//// AuraComponent ////
Vector<Ref<AuraData> > _s_auras;
Vector<Ref<AuraData> > _c_auras;
2019-04-20 14:02:55 +02:00
EntityEnums::EntityType _s_entity_type;
EntityEnums::EntityType _c_entity_type;
2019-09-12 13:26:52 +02:00
int _s_immunity_flags;
int _s_entity_flags;
int _c_entity_flags;
EntityEnums::EntityController _s_entity_controller;
//// Cooldowns ////
Vector<Ref<Cooldown> > _s_cooldowns;
Vector<Ref<Cooldown> > _c_cooldowns;
HashMap<int, Ref<Cooldown> > _s_cooldown_map;
HashMap<int, Ref<Cooldown> > _c_cooldown_map;
Vector<Ref<CategoryCooldown> > _s_category_cooldowns;
Vector<Ref<CategoryCooldown> > _c_category_cooldowns;
2019-09-12 13:26:52 +02:00
int _s_active_category_cooldowns;
int _c_active_category_cooldowns;
//// Targeting ////
2019-04-20 14:02:55 +02:00
int _s_target_guid;
Entity *_s_target;
Entity *_c_target;
//// Talents ////
2019-04-20 14:02:55 +02:00
int _s_free_talent_points;
int _c_free_talent_points;
Vector<int> _s_talents;
Vector<int> _c_talents;
2019-09-12 13:26:52 +02:00
//// Data ////
2019-09-12 13:26:52 +02:00
Vector<Ref<EntityDataContainer> > _s_data;
2019-09-11 15:06:30 +02:00
Vector<Ref<EntityDataContainer> > _c_data;
//// Actionbars ////
bool _actionbar_locked;
Ref<ActionBarProfile> _action_bar_profile;
//// Crafting System ////
Vector<Ref<CraftRecipe> > _s_craft_recipes;
Vector<Ref<CraftRecipe> > _c_craft_recipes;
//// Known Spells ////
int _s_free_spell_points;
int _c_free_spell_points;
Vector<Ref<Spell> > _s_spells;
Vector<Ref<Spell> > _c_spells;
//// Skills ////
2019-10-07 00:29:05 +02:00
Vector<Ref<EntitySkill> > _s_skills;
Vector<Ref<EntitySkill> > _c_skills;
//// Stat Allocations ////
2019-10-07 00:29:05 +02:00
//int _unallocated_stats;
//int _stat_allocations[Stat::STAT_ID_TOTAL_STATS];
//// Inventory ////
Ref<Bag> _s_bag;
Ref<Bag> _c_bag;
Ref<Bag> _s_target_bag;
Ref<Bag> _c_target_bag;
2019-10-28 14:45:38 +01:00
2019-10-31 01:35:29 +01:00
//AI
int _formation_index;
2019-10-31 11:52:56 +01:00
Ref<AIFSMAction> _s_ai;
2019-10-31 01:35:29 +01:00
2019-10-28 14:45:38 +01:00
//Networking
2019-10-31 01:35:29 +01:00
2019-10-28 14:45:38 +01:00
Vector<Entity *> _s_sees;
2019-10-29 00:15:52 +01:00
Vector<Entity *> _s_seen_by;
2019-04-20 14:02:55 +02:00
};
#endif