User:Freeyorp/Patches/Add support for viewing the health and maximum health of other nearby members of your party/
From The Mana World
From 2b7cab4137930eec96fe6485d04ccc6160f75142 Mon Sep 17 00:00:00 2001
From: Freeyorp <Freeyorp101@NOSPAM@hotmail.com>
Date: Sun, 10 May 2009 22:56:06 +1200
Subject: [PATCH] Add support for viewing the health and maximum health of other nearby members of your party.
---
src/gui/partywindow.cpp | 14 +++++++++---
src/gui/partywindow.h | 5 ++++
src/gui/widgets/avatar.cpp | 44 ++++++++++++++++++++++++++++++++++++++++--
src/gui/widgets/avatar.h | 9 ++++++++
src/net/ea/partyhandler.cpp | 7 +++--
5 files changed, 69 insertions(+), 10 deletions(-)
diff --git a/src/gui/partywindow.cpp b/src/gui/partywindow.cpp
index b3c6c74..5172f4b 100644
--- a/src/gui/partywindow.cpp
+++ b/src/gui/partywindow.cpp
@@ -34,12 +34,12 @@ PartyWindow::PartyWindow() : Window(_("Party"))
{
setWindowName("Party");
setVisible(false);
- setResizable(false);
+ setResizable(true);
setSaveVisible(true);
setCloseButton(true);
- setMinWidth(110);
+ setMinWidth(200);
setMinHeight(200);
- setDefaultSize(620, 300, 110, 200);
+ setDefaultSize(620, 300, 200, 200);
loadWindowState();
setVisible(false); // Do not start out visible
@@ -58,7 +58,6 @@ void PartyWindow::draw(gcn::Graphics *graphics)
PartyMember *PartyWindow::findMember(int id) const
{
PartyList::const_iterator it = mMembers.find(id);
-
if (it == mMembers.end())
return NULL;
else
@@ -114,6 +113,13 @@ void PartyWindow::updateMember(int id, const std::string &memberName,
}
}
+void PartyWindow::updateMemberHP(int id, int hp, int maxhp)
+{
+ PartyMember *player = findOrCreateMember(id);
+ player->avatar->setHp(hp);
+ player->avatar->setMaxHp(maxhp);
+}
+
void PartyWindow::removeMember(int id)
{
mMembers.erase(id);
diff --git a/src/gui/partywindow.h b/src/gui/partywindow.h
index c915d9c..2af4ea1 100644
--- a/src/gui/partywindow.h
+++ b/src/gui/partywindow.h
@@ -85,6 +85,11 @@ class PartyWindow : public Window, gcn::ActionListener
bool leader = false, bool online = true);
/**
+ * Update a member's HP and Max HP
+ */
+ void updateMemberHP(int id, int hp, int maxhp);
+
+ /**
* Remove party member with the given id.
*/
void removeMember(int id);
diff --git a/src/gui/widgets/avatar.cpp b/src/gui/widgets/avatar.cpp
index 8cb23a3..620a70b 100644
--- a/src/gui/widgets/avatar.cpp
+++ b/src/gui/widgets/avatar.cpp
@@ -19,6 +19,8 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
+#include "localplayer.h"
+
#include "gui/widgets/avatar.h"
#include "gui/widgets/icon.h"
@@ -27,6 +29,11 @@
#include "resources/image.h"
#include "resources/resourcemanager.h"
+#include "utils/gettext.h"
+#include "utils/stringutils.h"
+
+#include <stdio.h>
+
namespace {
Image *avatarStatusOffline;
Image *avatarStatusOnline;
@@ -38,6 +45,8 @@ Avatar::Avatar(const std::string &name):
{
setOpaque(false);
setSize(200, 12);
+ mHpState = "???";
+ mMaxHpState = "???";
if (avatarCount == 0)
{
@@ -52,8 +61,11 @@ Avatar::Avatar(const std::string &name):
mStatus = new Icon(avatarStatusOffline);
mStatus->setSize(12, 12);
add(mStatus, 1, 0);
-
- mLabel = new Label(name);
+ if (mName != player_node->getName())
+ mAvatarLabel = mName + " " + mHpState + "/" + mMaxHpState;
+ else
+ mAvatarLabel = mName + " " + strprintf("%i", player_node->getHp()) + "/" + strprintf("%i",player_node->getMaxHp());
+ mLabel = new Label(mAvatarLabel);
mLabel->setSize(174, 12);
add(mLabel, 16, 0);
}
@@ -69,10 +81,36 @@ Avatar::~Avatar()
void Avatar::setName(const std::string &name)
{
mName = name;
- mLabel->setCaption(name);
+ updateAvatarLabel();
}
void Avatar::setOnline(bool online)
{
mStatus->setImage(online ? avatarStatusOnline : avatarStatusOffline);
}
+
+void Avatar::setHp(int hp)
+{
+ if (hp)
+ mHpState = strprintf("%i", hp);
+ else
+ mHpState = "???";
+ updateAvatarLabel();
+}
+
+void Avatar::setMaxHp(int maxhp)
+{
+ if (maxhp)
+ mMaxHpState = strprintf("%i", maxhp);
+ else
+ mMaxHpState = "???";
+ updateAvatarLabel();
+}
+
+void Avatar::updateAvatarLabel() {
+ if (mName != player_node->getName())
+ mAvatarLabel = mName + " " + mHpState + "/" + mMaxHpState;
+ else
+ mAvatarLabel = mName + " " + strprintf("%i", player_node->getHp()) + "/" + strprintf("%i",player_node->getMaxHp());
+ mLabel->setCaption(mAvatarLabel);
+}
diff --git a/src/gui/widgets/avatar.h b/src/gui/widgets/avatar.h
index 550e43b..223f89e 100644
--- a/src/gui/widgets/avatar.h
+++ b/src/gui/widgets/avatar.h
@@ -52,8 +52,17 @@ public:
*/
void setOnline(bool online);
+ void setHp(int hp);
+
+ void setMaxHp(int maxhp);
+
+ void updateAvatarLabel();
+
private:
std::string mName;
+ std::string mHpState;
+ std::string mMaxHpState;
+ std::string mAvatarLabel;
Icon *mStatus;
gcn::Label *mLabel;
};
diff --git a/src/net/ea/partyhandler.cpp b/src/net/ea/partyhandler.cpp
index 1a0a9e3..cb42ec7 100644
--- a/src/net/ea/partyhandler.cpp
+++ b/src/net/ea/partyhandler.cpp
@@ -239,9 +239,10 @@ void PartyHandler::handleMessage(MessageIn &msg)
}
case SMSG_PARTY_UPDATE_HP:
{
- msg.readInt32(); // id
- msg.readInt16(); // hp
- msg.readInt16(); // hpMax
+ int id = msg.readInt32();
+ int hp = msg.readInt16();
+ int maxhp = msg.readInt16();
+ partyWindow->updateMemberHP(id, hp, maxhp);
}
break;
case SMSG_PARTY_UPDATE_COORDS:
--
1.6.0.4