From The Mana World
Revision as of 11:11, 10 May 2009 by Freeyorp (talk | contribs) (New page: <pre> 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 supp...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
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