diff options
-rw-r--r-- | src/being/being.cpp | 3 | ||||
-rw-r--r-- | src/being/being.h | 9 | ||||
-rw-r--r-- | src/gui/popups/popupmenu.cpp | 24 | ||||
-rw-r--r-- | src/net/eathena/beingrecv.cpp | 6 |
4 files changed, 38 insertions, 4 deletions
diff --git a/src/being/being.cpp b/src/being/being.cpp index f1617e64e..9b8be8ec8 100644 --- a/src/being/being.cpp +++ b/src/being/being.cpp @@ -236,6 +236,9 @@ Being::Being(const BeingId id, mKarma(0), mManner(0), mAreaSize(11), +#ifdef EATHENA_SUPPORT + mCreatorId(BeingId_zero), +#endif mTeamId(0U), mLook(0U), mBadgesCount(0U), diff --git a/src/being/being.h b/src/being/being.h index 585b59a43..31c28d28f 100644 --- a/src/being/being.h +++ b/src/being/being.h @@ -925,6 +925,12 @@ class Being notfinal : public ActorSprite, { return mSpiritBalls; } void stopCast(const bool b) override final; + + void setCreatorId(const BeingId id) + { mCreatorId = id; } + + BeingId getCreatorId() const noexcept A_WARN_UNUSED + { return mCreatorId; } #endif void setKarma(const int karma) restrict2 noexcept @@ -1170,6 +1176,9 @@ class Being notfinal : public ActorSprite, int mKarma; int mManner; int mAreaSize; +#ifdef EATHENA_SUPPORT + BeingId mCreatorId; +#endif uint16_t mTeamId; uint16_t mLook; uint16_t mBadgesCount; diff --git a/src/gui/popups/popupmenu.cpp b/src/gui/popups/popupmenu.cpp index 2405743c5..811efc881 100644 --- a/src/gui/popups/popupmenu.cpp +++ b/src/gui/popups/popupmenu.cpp @@ -160,7 +160,12 @@ void PopupMenu::showPopup(const int x, const int y, const Being *const being) mY = y; const std::string &name = mName; - mBrowserBox->addRow(name + being->getGenderSignWithSpace()); +#ifdef EATHENA_SUPPORT + if (being->getType() != ActorType::SkillUnit) +#endif + { + mBrowserBox->addRow(name + being->getGenderSignWithSpace()); + } switch (being->getType()) { @@ -409,8 +414,23 @@ void PopupMenu::showPopup(const int x, const int y, const Being *const being) } break; case ActorType::SkillUnit: - // +++ need impliment menu + { + const BeingId id = being->getCreatorId(); + std::string creatorName; + Being *const creator = actorManager->findBeing(id); + if (creator) + creatorName = creator->getName(); + else + creatorName = actorManager->getSeenPlayerById(id); + + if (creatorName.empty()) + creatorName = strprintf("?%d", CAST_S32(id)); + + mBrowserBox->addRow(strprintf("%s (%s)", + name.c_str(), + creatorName.c_str())); break; + } #endif case ActorType::Avatar: case ActorType::Unknown: diff --git a/src/net/eathena/beingrecv.cpp b/src/net/eathena/beingrecv.cpp index c5c7acfcc..18c8c11b5 100644 --- a/src/net/eathena/beingrecv.cpp +++ b/src/net/eathena/beingrecv.cpp @@ -1186,7 +1186,7 @@ void BeingRecv::processSkillEntry(Net::MessageIn &msg) { msg.readInt16("len"); const BeingId id = msg.readBeingId("skill unit id"); - msg.readBeingId("creator accound id"); + const BeingId creatorId = msg.readBeingId("creator accound id"); const int x = msg.readInt16("x"); const int y = msg.readInt16("y"); const int job = msg.readInt32("job"); @@ -1199,6 +1199,7 @@ void BeingRecv::processSkillEntry(Net::MessageIn &msg) dstBeing->setAction(BeingAction::STAND, 0); dstBeing->setTileCoords(x, y); dstBeing->setLevel(level); + dstBeing->setCreatorId(creatorId); } void BeingRecv::processPlaterStatusChange(Net::MessageIn &msg) @@ -1757,7 +1758,7 @@ void BeingRecv::processSolveCharName(Net::MessageIn &msg) void BeingRecv::processGraffiti(Net::MessageIn &msg) { const BeingId id = msg.readBeingId("graffiti id"); - msg.readBeingId("creator id"); + const BeingId creatorId = msg.readBeingId("creator id"); const int x = msg.readInt16("x"); const int y = msg.readInt16("y"); const int job = msg.readUInt8("job"); @@ -1773,6 +1774,7 @@ void BeingRecv::processGraffiti(Net::MessageIn &msg) dstBeing->setTileCoords(x, y); dstBeing->setShowName(true); dstBeing->setName(text); + dstBeing->setCreatorId(creatorId); } void BeingRecv::applyPlayerAction(Net::MessageIn &msg, |