mirror of
https://github.com/Relintai/entity_spell_system.git
synced 2025-04-19 21:33:15 +02:00
Added support for item spells.
This commit is contained in:
parent
7666d11b2d
commit
c5c0f2cddd
@ -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) {
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
};
|
||||
|
@ -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";
|
||||
|
26
item_enums.h
26
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);
|
||||
|
Loading…
Reference in New Issue
Block a user