From 80792e881942a1cdbc10050177df888bbad44a9e Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Wed, 8 Nov 2017 23:40:50 +0300 Subject: Add npc option for allow equipment. New option: allowEquipment Default value: false --- src/being/being.cpp | 4 +++- src/being/being.h | 4 ++++ src/net/eathena/beingrecv.cpp | 25 ++++++++++++++----------- src/resources/beinginfo.cpp | 3 ++- src/resources/beinginfo.h | 7 +++++++ src/resources/db/npcdb.cpp | 3 +++ 6 files changed, 33 insertions(+), 13 deletions(-) diff --git a/src/being/being.cpp b/src/being/being.cpp index 4f115a6d3..429201cf2 100644 --- a/src/being/being.cpp +++ b/src/being/being.cpp @@ -272,7 +272,8 @@ Being::Being(const BeingId id, mAway(false), mInactive(false), mNeedPosUpdate(true), - mBotAi(true) + mBotAi(true), + mAllowNpcEquipment(false) { for (int f = 0; f < 20; f ++) { @@ -462,6 +463,7 @@ void Being::setSubtype(const BeingTypeId subtype, DisplayType::Item, std::string()); mYDiff = mInfo->getSortOffsetY(); + mAllowNpcEquipment = mInfo->getAllowEquipment(); } break; case ActorType::Avatar: diff --git a/src/being/being.h b/src/being/being.h index 775c875f9..feb686740 100644 --- a/src/being/being.h +++ b/src/being/being.h @@ -1097,6 +1097,9 @@ class Being notfinal : public ActorSprite, void fixDirectionOffsets(int &offsetX, int &offsetY) const; + bool getAllowNpcEquipment() const noexcept2 A_WARN_UNUSED + { return mAllowNpcEquipment; } + static Being *createBeing(const BeingId id, const ActorTypeT type, const BeingTypeId subtype, @@ -1377,6 +1380,7 @@ class Being notfinal : public ActorSprite, bool mInactive; bool mNeedPosUpdate; bool mBotAi; + bool mAllowNpcEquipment; }; extern std::list beingInfoCache; diff --git a/src/net/eathena/beingrecv.cpp b/src/net/eathena/beingrecv.cpp index 7a91b413b..b1daece88 100644 --- a/src/net/eathena/beingrecv.cpp +++ b/src/net/eathena/beingrecv.cpp @@ -131,17 +131,20 @@ static void setBasicFields(Being *restrict const dstBeing, { dstBeing->setGender(Being::intToGender(gender)); } - dstBeing->setHairColor(hairColor); - dstBeing->setHairStyle(SPRITE_HAIR_COLOR, -hairStyle); - // for npc not checking updateSlots flag, - // probably because npc missing visible packet if moving - dstBeing->updateSprite(SPRITE_WEAPON, headBottom); - dstBeing->updateSprite(SPRITE_HEAD_BOTTOM, headMid); - dstBeing->updateSprite(SPRITE_CLOTHES_COLOR, headTop); - dstBeing->updateSprite(SPRITE_HAIR, shoes); - dstBeing->updateSprite(SPRITE_SHOES, gloves); - dstBeing->updateSprite(SPRITE_BODY, weapon); - dstBeing->setWeaponId(weapon); + if (dstBeing->getAllowNpcEquipment()) + { + dstBeing->setHairColor(hairColor); + dstBeing->setHairStyle(SPRITE_HAIR_COLOR, -hairStyle); + // for npc not checking updateSlots flag, + // probably because npc missing visible packet if moving + dstBeing->updateSprite(SPRITE_WEAPON, headBottom); + dstBeing->updateSprite(SPRITE_HEAD_BOTTOM, headMid); + dstBeing->updateSprite(SPRITE_CLOTHES_COLOR, headTop); + dstBeing->updateSprite(SPRITE_HAIR, shoes); + dstBeing->updateSprite(SPRITE_SHOES, gloves); + dstBeing->updateSprite(SPRITE_BODY, weapon); + dstBeing->setWeaponId(weapon); + } break; default: case ActorType::Monster: diff --git a/src/resources/beinginfo.cpp b/src/resources/beinginfo.cpp index 6c082d85f..6e28e37be 100644 --- a/src/resources/beinginfo.cpp +++ b/src/resources/beinginfo.cpp @@ -106,7 +106,8 @@ BeingInfo::BeingInfo() : mQuickActionEffectId(-1), mStaticMaxHP(false), mTargetSelection(true), - mAllowDelete(true) + mAllowDelete(true), + mAllowEquipment(false) { SpriteDisplay display; display.sprites.push_back(SpriteReference::Empty); diff --git a/src/resources/beinginfo.h b/src/resources/beinginfo.h index bd60131c8..b4139d0b4 100644 --- a/src/resources/beinginfo.h +++ b/src/resources/beinginfo.h @@ -320,6 +320,12 @@ class BeingInfo final int getAllowDelete() const noexcept2 A_WARN_UNUSED { return static_cast(mAllowDelete); } + void setAllowEquipment(const bool b) + { mAllowEquipment = b; } + + bool getAllowEquipment() const noexcept2 A_WARN_UNUSED + { return mAllowEquipment; } + void setQuickActionEffectId(const int n) { mQuickActionEffectId = n; } @@ -396,6 +402,7 @@ class BeingInfo final bool mStaticMaxHP; bool mTargetSelection; bool mAllowDelete; + bool mAllowEquipment; }; typedef std::map BeingInfos; diff --git a/src/resources/db/npcdb.cpp b/src/resources/db/npcdb.cpp index 26034de12..3432ed4b5 100644 --- a/src/resources/db/npcdb.cpp +++ b/src/resources/db/npcdb.cpp @@ -118,6 +118,9 @@ void NPCDB::loadXmlFile(const std::string &fileName, currentInfo->setAllowDelete(XML::getBoolProperty(npcNode, "allowDelete", true)); + currentInfo->setAllowEquipment(XML::getBoolProperty(npcNode, + "allowEquipment", false)); + const std::string currency = XML::getProperty(npcNode, "currency", "default"); if (UnitsDb::existsCurrency(currency) == false) -- cgit v1.2.3-70-g09d2