diff --git a/entities/entity.cpp b/entities/entity.cpp index a3689c4..2f79e43 100644 --- a/entities/entity.cpp +++ b/entities/entity.cpp @@ -2372,6 +2372,59 @@ void Entity::crequest_use_item(int item_id) { RPCS(suse_item, item_id); } void Entity::_suse_item(int item_id) { + Ref it = EntityDataManager::get_instance()->get_item_template(item_id); + + ERR_FAIL_COND(!it.is_valid()); + + Ref sp = it->get_use_spell(); + + ERR_FAIL_COND(!sp.is_valid()); + + ItemEnums::ItemType type = it->get_item_type(); + + if (type == ItemEnums::ITEM_TYPE_EQUIPMENT) { + Ref ii = gets_equip_slot(it->get_equip_slot()); + + if (!ii.is_valid()) + return; + + if (ii->get_item_template() != it) + return; + + Ref info; + info.instance(); + + info->set_caster(this); + info->set_target(gets_target()); + info->set_has_cast_time(sp->get_cast_time_enabled()); + info->set_cast_time(sp->get_cast_time()); + info->set_spell_scale(1); + info->set_spell(sp); + info->set_source_item(ii); + info->set_source_template(it); + + sstart_casting(info); + + sp->sstart_casting(info); + } else { + if (!gets_bag()->has_item(it, 1)) + return; + + Ref info; + info.instance(); + + info->set_caster(this); + info->set_target(gets_target()); + info->set_has_cast_time(sp->get_cast_time_enabled()); + info->set_cast_time(sp->get_cast_time()); + info->set_spell_scale(1); + info->set_spell(sp); + info->set_source_template(it); + + sstart_casting(info); + + sp->sstart_casting(info); + } } void Entity::update_auras(float delta) { diff --git a/infos/spell_cast_info.cpp b/infos/spell_cast_info.cpp index 1322854..df86ea9 100644 --- a/infos/spell_cast_info.cpp +++ b/infos/spell_cast_info.cpp @@ -22,10 +22,12 @@ SOFTWARE. #include "spell_cast_info.h" +#include "../data/items/item_instance.h" +#include "../data/items/item_template.h" #include "../data/spells/spell.h" #include "../entities/entity.h" -#include "../world_spells/world_spell.h" #include "../singletons/entity_data_manager.h" +#include "../world_spells/world_spell.h" //// SpellCastInfo //// @@ -146,10 +148,24 @@ void SpellCastInfo::set_spell_scale(float value) { Ref SpellCastInfo::get_spell() const { return _spell; } -void SpellCastInfo::set_spell(Ref spell) { +void SpellCastInfo::set_spell(const Ref &spell) { _spell = spell; } +Ref SpellCastInfo::get_source_item() const { + return _source_item; +} +void SpellCastInfo::set_source_item(const Ref &item) { + _source_item = item; +} + +Ref SpellCastInfo::get_source_template() const { + return _source_template; +} +void SpellCastInfo::set_source_template(const Ref &source_template) { + _source_template = source_template; +} + bool SpellCastInfo::update_cast_time(float delta) { _current_cast_time += delta; @@ -203,6 +219,8 @@ Dictionary SpellCastInfo::to_dict() { dict["spell_id"] = _spell->get_id(); + //item serialization not needed + return dict; } void SpellCastInfo::from_dict(const Dictionary &dict) { @@ -216,6 +234,8 @@ void SpellCastInfo::from_dict(const Dictionary &dict) { _is_casting = dict.get("is_casting", true); _spell_id = dict.get("spell_id", 0); + + //item serialization not needed } SpellCastInfo::SpellCastInfo() { @@ -238,7 +258,10 @@ SpellCastInfo::SpellCastInfo() { SpellCastInfo::~SpellCastInfo() { _caster = NULL; _target = NULL; - //_spell = Ref(NULL); + + _spell.unref(); + _source_item.unref(); + _source_template.unref(); } void SpellCastInfo::_bind_methods() { @@ -282,6 +305,14 @@ void SpellCastInfo::_bind_methods() { ClassDB::bind_method(D_METHOD("set_spell", "spell"), &SpellCastInfo::set_spell); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "spell", PROPERTY_HINT_RESOURCE_TYPE, "Spell"), "set_spell", "get_spell"); + ClassDB::bind_method(D_METHOD("get_source_item"), &SpellCastInfo::get_source_item); + ClassDB::bind_method(D_METHOD("set_source_item", "spell"), &SpellCastInfo::set_source_item); + ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "source_item", PROPERTY_HINT_RESOURCE_TYPE, "ItemInstance"), "set_source_item", "get_source_item"); + + ClassDB::bind_method(D_METHOD("get_source_template"), &SpellCastInfo::get_source_template); + ClassDB::bind_method(D_METHOD("set_source_template", "spell"), &SpellCastInfo::set_source_template); + ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "source_template", PROPERTY_HINT_RESOURCE_TYPE, "ItemTemplate"), "set_source_template", "get_source_template"); + ClassDB::bind_method(D_METHOD("update_cast_time", "delta"), &SpellCastInfo::update_cast_time); ClassDB::bind_method(D_METHOD("from_dict", "dict"), &SpellCastInfo::from_dict); diff --git a/infos/spell_cast_info.h b/infos/spell_cast_info.h index cf7633c..7db4daf 100644 --- a/infos/spell_cast_info.h +++ b/infos/spell_cast_info.h @@ -28,6 +28,8 @@ SOFTWARE. class Spell; class Entity; class WorldSpell; +class ItemInstance; +class ItemTemplate; class SpellCastInfo : public Reference { GDCLASS(SpellCastInfo, Reference); @@ -64,7 +66,13 @@ public: void set_spell_scale(float value); Ref get_spell() const; - void set_spell(Ref spell); + void set_spell(const Ref &spell); + + Ref get_source_item() const; + void set_source_item(const Ref &item); + + Ref get_source_template() const; + void set_source_template(const Ref &source_template); bool update_cast_time(float delta); @@ -95,6 +103,8 @@ private: int _spell_id; Ref _spell; + Ref _source_item; + Ref _source_template; NodePath _target_path; }; diff --git a/item_enums.cpp b/item_enums.cpp index 8125e40..c7a0aa3 100644 --- a/item_enums.cpp +++ b/item_enums.cpp @@ -24,8 +24,8 @@ SOFTWARE. const String ItemEnums::BINDING_STRING_RARITY = "None,Common,Uncommon,Superior,Heroic,Mythic,Artifact"; const String ItemEnums::BINDING_STRING_RARITY_FLAG = "Common,Uncommon,Superior,Heroic,Mythic,Artifact"; -const String ItemEnums::BINDING_STRING_ITEM_TYPE = "None,Equipment,Weapon,Potion,Herb,Ore,Gemstone,Food,Alchemy,Engineering,Enchanting,Tailoring,Recipe,Currency,Bag"; -const String ItemEnums::BINDING_STRING_ITEM_TYPE_FLAGS = "Equipment,Weapon,Potion,Herb,Ore,Gemstone,Food,Alchemy,Engineering,Enchanting,Tailoring,Recipe,Currency,Bag"; +const String ItemEnums::BINDING_STRING_ITEM_TYPE = "None,Equipment,Potion,Herb,Ore,Gemstone,Food,Alchemy,Engineering,Enchanting,Tailoring,Recipe,Currency,Bag"; +const String ItemEnums::BINDING_STRING_ITEM_TYPE_FLAGS = "Equipment,Potion,Herb,Ore,Gemstone,Food,Alchemy,Engineering,Enchanting,Tailoring,Recipe,Currency,Bag"; const String ItemEnums::BINDING_STRING_ITEM_SUB_TYPE = "None,Sword,Axe,Mace,Dagger,Bow,Crossbow,Gun,Wand,Quest Item"; const String ItemEnums::BINDING_STRING_ITEM_SUB_SUB_TYPE = "None,Two Hand,One Hand,Left Hand,Right Hand"; const String ItemEnums::BINDING_STRING_EQUIP_SLOTS = "Head,Neck,Shoulders,Chest,Gloves,Belt,Legs,Feet,Ring 1,Ring 2,Trinket 1,Trinket 2,Main Hand,Off Hand,None"; diff --git a/item_enums.h b/item_enums.h index ebbf111..cd7d209 100644 --- a/item_enums.h +++ b/item_enums.h @@ -63,19 +63,18 @@ public: enum ItemType { ITEM_TYPE_NONE = 0, ITEM_TYPE_EQUIPMENT = 1 << 0, - ITEM_TYPE_WEAPON = 1 << 1, - ITEM_TYPE_POTION = 1 << 2, - ITEM_TYPE_HERB = 1 << 3, - ITEM_TYPE_ORE = 1 << 4, - ITEM_TYPE_GEMSTONE = 1 << 5, - ITEM_TYPE_FOOD = 1 << 6, - ITEM_TYPE_ALCHEMY = 1 << 7, - ITEM_TYPE_ENGINEERING = 1 << 8, - ITEM_TYPE_ENCHANTING = 1 << 9, - ITEM_TYPE_TAILORING = 1 << 10, - ITEM_TYPE_RECIPE = 1 << 11, - ITEM_TYPE_CURRENCY = 1 << 12, - ITEM_TYPE_BAG = 1 << 13, + ITEM_TYPE_POTION = 1 << 1, + ITEM_TYPE_HERB = 1 << 2, + ITEM_TYPE_ORE = 1 << 3, + ITEM_TYPE_GEMSTONE = 1 << 4, + ITEM_TYPE_FOOD = 1 << 5, + ITEM_TYPE_ALCHEMY = 1 << 6, + ITEM_TYPE_ENGINEERING = 1 << 7, + ITEM_TYPE_ENCHANTING = 1 << 8, + ITEM_TYPE_TAILORING = 1 << 9, + ITEM_TYPE_RECIPE = 1 << 10, + ITEM_TYPE_CURRENCY = 1 << 11, + ITEM_TYPE_BAG = 1 << 12, }; enum ItemSubtype { @@ -172,7 +171,6 @@ protected: BIND_ENUM_CONSTANT(ITEM_TYPE_NONE); BIND_ENUM_CONSTANT(ITEM_TYPE_EQUIPMENT); - BIND_ENUM_CONSTANT(ITEM_TYPE_WEAPON); BIND_ENUM_CONSTANT(ITEM_TYPE_POTION); BIND_ENUM_CONSTANT(ITEM_TYPE_HERB); BIND_ENUM_CONSTANT(ITEM_TYPE_ORE);