diff --git a/entities/entity.cpp b/entities/entity.cpp index c1b71cd..c077053 100644 --- a/entities/entity.cpp +++ b/entities/entity.cpp @@ -1357,6 +1357,12 @@ void Entity::cequip_success(ItemEnums::EquipSlots equip_slot, int bag_slot) { _c_bag->add_item_at(bag_slot, old_equipped_item); setc_equip_slot(equip_slot, old_bag_item); + if (old_equipped_item.is_valid()) + cdeapply_item(old_equipped_item); + + if (old_bag_item.is_valid()) + capply_item(old_bag_item); + con_equip_success(equip_slot, old_bag_item, old_equipped_item, bag_slot); } void Entity::cequip_fail(ItemEnums::EquipSlots equip_slot, int bag_slot) { @@ -1395,7 +1401,9 @@ bool Entity::can_equip_item(ItemEnums::EquipSlots equip_slot, Ref return call("_can_equip_item", equip_slot, item); } bool Entity::_can_equip_item(ItemEnums::EquipSlots equip_slot, Ref item) { - ERR_FAIL_COND_V(!item.is_valid(), false); + //deequip + if (!item.is_valid()) + return true; Ref it = item->get_item_template(); @@ -1414,6 +1422,10 @@ void Entity::sdeapply_item(Ref item) { void Entity::_sapply_item(Ref item) { ERR_FAIL_COND(!item.is_valid()); + Ref it = item->get_item_template(); + + ERR_FAIL_COND(!it.is_valid()); + for (int i = 0; i < item->get_item_stat_modifier_count(); ++i) { Ref mod = item->get_item_stat_modifier(i); @@ -1436,6 +1448,10 @@ void Entity::_sapply_item(Ref item) { void Entity::_sdeapply_item(Ref item) { ERR_FAIL_COND(!item.is_valid()); + Ref it = item->get_item_template(); + + ERR_FAIL_COND(!it.is_valid()); + for (int i = 0; i < item->get_item_stat_modifier_count(); ++i) { Ref mod = item->get_item_stat_modifier(i); @@ -1456,6 +1472,36 @@ void Entity::_sdeapply_item(Ref item) { } } +void Entity::capply_item(Ref item) { + call("_capply_item", item); +} +void Entity::cdeapply_item(Ref item) { + call("_cdeapply_item", item); +} + +void Entity::_capply_item(Ref item) { + ERR_FAIL_COND(!item.is_valid()); + + Ref it = item->get_item_template(); + + ERR_FAIL_COND(!it.is_valid()); + + if (it->get_item_visual().is_valid() && ObjectDB::instance_validate(_character_skeleton)) { + _character_skeleton->add_item_visual(it->get_item_visual()); + } +} +void Entity::_cdeapply_item(Ref item) { + ERR_FAIL_COND(!item.is_valid()); + + Ref it = item->get_item_template(); + + ERR_FAIL_COND(!it.is_valid()); + + if (it->get_item_visual().is_valid() && ObjectDB::instance_validate(_character_skeleton)) { + _character_skeleton->remove_item_visual(it->get_item_visual()); + } +} + //// Resources //// Ref Entity::gets_resource(int index) { @@ -5695,6 +5741,15 @@ void Entity::_bind_methods() { ClassDB::bind_method(D_METHOD("_sapply_item", "item"), &Entity::_sapply_item); ClassDB::bind_method(D_METHOD("_sdeapply_item", "item"), &Entity::_sdeapply_item); + BIND_VMETHOD(MethodInfo("_capply_item", PropertyInfo(Variant::OBJECT, "item", PROPERTY_HINT_RESOURCE_TYPE, "ItemInstance"))); + BIND_VMETHOD(MethodInfo("_cdeapply_item", PropertyInfo(Variant::OBJECT, "item", PROPERTY_HINT_RESOURCE_TYPE, "ItemInstance"))); + + ClassDB::bind_method(D_METHOD("csapply_item", "item"), &Entity::capply_item); + ClassDB::bind_method(D_METHOD("cdeapply_item", "item"), &Entity::cdeapply_item); + + ClassDB::bind_method(D_METHOD("_capply_item", "item"), &Entity::_capply_item); + ClassDB::bind_method(D_METHOD("_cdeapply_item", "item"), &Entity::_cdeapply_item); + //Resources ClassDB::bind_method(D_METHOD("gets_resource", "index"), &Entity::gets_resource); ClassDB::bind_method(D_METHOD("gets_resource_type", "type"), &Entity::gets_resource_type); diff --git a/entities/entity.h b/entities/entity.h index a8b754e..b951a27 100644 --- a/entities/entity.h +++ b/entities/entity.h @@ -333,6 +333,12 @@ public: void _sapply_item(Ref item); void _sdeapply_item(Ref item); + void capply_item(Ref item); + void cdeapply_item(Ref item); + + void _capply_item(Ref item); + void _cdeapply_item(Ref item); + //// Resources //// Ref gets_resource(int index); diff --git a/inventory/bag.cpp b/inventory/bag.cpp index d62ee75..d0f49d9 100644 --- a/inventory/bag.cpp +++ b/inventory/bag.cpp @@ -76,8 +76,6 @@ bool Bag::add_item(Ref item) { } void Bag::add_item_at(int index, Ref item, bool signal) { - ERR_FAIL_COND(!item.is_valid()); - if (has_method("_add_item_at")) { call("_add_item_at", index, item, signal); return; diff --git a/skeleton/character_skeleton_3d.cpp b/skeleton/character_skeleton_3d.cpp index 291e453..072ee55 100644 --- a/skeleton/character_skeleton_3d.cpp +++ b/skeleton/character_skeleton_3d.cpp @@ -86,6 +86,9 @@ void CharacterSkeleton3D::add_item_visual(Ref vis) { } _item_visuals.push_back(vis); + + set_process(true); + _model_dirty = true; } void CharacterSkeleton3D::remove_item_visual(Ref vis) { ERR_FAIL_COND(!vis.is_valid()); @@ -103,15 +106,24 @@ void CharacterSkeleton3D::remove_item_visual(Ref vis) { } _item_visuals.remove(index); + + set_process(true); + _model_dirty = true; } void CharacterSkeleton3D::remove_item_visual_index(int index) { ERR_FAIL_INDEX(index, _item_visuals.size()); + set_process(true); + _model_dirty = true; + _item_visuals.remove(index); } Ref CharacterSkeleton3D::get_item_visual(int index) { ERR_FAIL_INDEX_V(index, _item_visuals.size(), Ref()); + set_process(true); + _model_dirty = true; + return _item_visuals.get(index); } int CharacterSkeleton3D::get_item_visual_count() { diff --git a/skeleton/character_skeleton_3d.h b/skeleton/character_skeleton_3d.h index b776f3d..89e8bb9 100644 --- a/skeleton/character_skeleton_3d.h +++ b/skeleton/character_skeleton_3d.h @@ -74,7 +74,7 @@ protected: return false; } - return (a->get_priority() < b->get_priority()); + return (a->get_priority() > b->get_priority()); } };