diff options
-rw-r--r-- | src/net/ea/beingrecv.cpp | 9 | ||||
-rw-r--r-- | src/resources/beinginfo.cpp | 3 | ||||
-rw-r--r-- | src/resources/beinginfo.h | 7 | ||||
-rw-r--r-- | src/resources/db/npcdb.cpp | 3 |
4 files changed, 20 insertions, 2 deletions
diff --git a/src/net/ea/beingrecv.cpp b/src/net/ea/beingrecv.cpp index be3cc4cb9..f09979e58 100644 --- a/src/net/ea/beingrecv.cpp +++ b/src/net/ea/beingrecv.cpp @@ -64,6 +64,7 @@ void BeingRecv::processBeingRemove(Net::MessageIn &msg) // A being should be removed or has died const BeingId id = msg.readBeingId("being id"); + const uint8_t type = msg.readUInt8("remove flag"); Being *const dstBeing = actorManager->findBeing(id); if (!dstBeing) { @@ -79,7 +80,7 @@ void BeingRecv::processBeingRemove(Net::MessageIn &msg) if (dstBeing == localPlayer->getTarget()) localPlayer->stopAttack(true); - if (msg.readUInt8("dead flag?") == 1U) + if (type == 1U) { if (dstBeing->getCurrentAction() != BeingAction::DEAD) { @@ -87,6 +88,12 @@ void BeingRecv::processBeingRemove(Net::MessageIn &msg) dstBeing->recalcSpritesOrder(); } } + else if (type == 0U && dstBeing->getType() == ActorType::Npc) + { + const BeingInfo *const info = dstBeing->getInfo(); + if (!info || info->getAllowDelete()) + actorManager->destroy(dstBeing); + } else { if (dstBeing->getType() == ActorType::Player) diff --git a/src/resources/beinginfo.cpp b/src/resources/beinginfo.cpp index 1f1033e3c..5a36892d9 100644 --- a/src/resources/beinginfo.cpp +++ b/src/resources/beinginfo.cpp @@ -90,7 +90,8 @@ BeingInfo::BeingInfo() : mDeadDirectionType(1), mAttackDirectionType(1), mStaticMaxHP(false), - mTargetSelection(true) + mTargetSelection(true), + mAllowDelete(true) { SpriteDisplay display; display.sprites.push_back(SpriteReference::Empty); diff --git a/src/resources/beinginfo.h b/src/resources/beinginfo.h index 3429515e0..ad5f35a85 100644 --- a/src/resources/beinginfo.h +++ b/src/resources/beinginfo.h @@ -311,6 +311,12 @@ class BeingInfo final int getAttackDirectionType() const A_WARN_UNUSED { return mAttackDirectionType; } + void setAllowDelete(const bool b) + { mAllowDelete = b; } + + int getAllowDelete() const A_WARN_UNUSED + { return mAllowDelete; } + void setColorsList(const std::string &name); std::string getColor(const ItemColor idx) const A_WARN_UNUSED; @@ -365,6 +371,7 @@ class BeingInfo final int mAttackDirectionType; bool mStaticMaxHP; bool mTargetSelection; + bool mAllowDelete; }; typedef std::map<BeingTypeId, BeingInfo*> BeingInfos; diff --git a/src/resources/db/npcdb.cpp b/src/resources/db/npcdb.cpp index 8b47d33b4..1d2cf4899 100644 --- a/src/resources/db/npcdb.cpp +++ b/src/resources/db/npcdb.cpp @@ -109,6 +109,9 @@ void NPCDB::loadXmlFile(const std::string &fileName) currentInfo->setAvatarId(fromInt(XML::getProperty( npcNode, "avatar", 0), BeingTypeId)); + currentInfo->setAllowDelete(XML::getBoolProperty(npcNode, + "allowDelete", true)); + SpriteDisplay display; for_each_xml_child_node(spriteNode, npcNode) { |