Added support for item spells.

This commit is contained in:
Relintai 2020-02-25 14:00:55 +01:00
parent 7666d11b2d
commit c5c0f2cddd
5 changed files with 112 additions and 20 deletions

View File

@ -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<ItemTemplate> it = EntityDataManager::get_instance()->get_item_template(item_id);
ERR_FAIL_COND(!it.is_valid());
Ref<Spell> 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<ItemInstance> ii = gets_equip_slot(it->get_equip_slot());
if (!ii.is_valid())
return;
if (ii->get_item_template() != it)
return;
Ref<SpellCastInfo> 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<SpellCastInfo> 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) {

View File

@ -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<Spell> SpellCastInfo::get_spell() const {
return _spell;
}
void SpellCastInfo::set_spell(Ref<Spell> spell) {
void SpellCastInfo::set_spell(const Ref<Spell> &spell) {
_spell = spell;
}
Ref<ItemInstance> SpellCastInfo::get_source_item() const {
return _source_item;
}
void SpellCastInfo::set_source_item(const Ref<ItemInstance> &item) {
_source_item = item;
}
Ref<ItemTemplate> SpellCastInfo::get_source_template() const {
return _source_template;
}
void SpellCastInfo::set_source_template(const Ref<ItemTemplate> &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<Spell>(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);

View File

@ -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<Spell> get_spell() const;
void set_spell(Ref<Spell> spell);
void set_spell(const Ref<Spell> &spell);
Ref<ItemInstance> get_source_item() const;
void set_source_item(const Ref<ItemInstance> &item);
Ref<ItemTemplate> get_source_template() const;
void set_source_template(const Ref<ItemTemplate> &source_template);
bool update_cast_time(float delta);
@ -95,6 +103,8 @@ private:
int _spell_id;
Ref<Spell> _spell;
Ref<ItemInstance> _source_item;
Ref<ItemTemplate> _source_template;
NodePath _target_path;
};

View File

@ -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";

View File

@ -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);