summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--src/gui/guildwindow.cpp6
-rw-r--r--src/gui/partywindow.cpp46
-rw-r--r--src/gui/partywindow.h3
-rw-r--r--src/gui/widgets/avatar.cpp61
-rw-r--r--src/gui/widgets/avatar.h61
-rw-r--r--src/net/partyhandler.cpp26
-rw-r--r--src/net/protocol.h6
-rw-r--r--tmw.cbp2
9 files changed, 194 insertions, 24 deletions
diff --git a/ChangeLog b/ChangeLog
index d5039586..33c05b0b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2008-11-13 David Athay <ko2fan@gmail.com>
+
+ * src/gui/widgets/avatar.cpp, src/gui/widgets/avatar.h,
+ src/gui/guildwindow.cpp, src/gui/partywindow.h, src/gui/partywindow.cpp,
+ src/net/partyhandler.cpp, src/net/protocol.h, tmw.cbp: Added avatars to
+ party window.
+
2008-11-12 David Athay <ko2fan@gmail.com>
* src/main.cpp: Fixed Icon loading.
diff --git a/src/gui/guildwindow.cpp b/src/gui/guildwindow.cpp
index a50bd219..3319489c 100644
--- a/src/gui/guildwindow.cpp
+++ b/src/gui/guildwindow.cpp
@@ -47,10 +47,10 @@
#include <guichan/widgets/tab.hpp>
GuildWindow::GuildWindow():
- Window(player_node->getName()),
+ Window(_("Guild")),
mFocus(false)
{
- setCaption("Guild");
+ setCaption(_("Guild"));
setResizable(false);
setCloseButton(true);
setMinWidth(200);
@@ -74,7 +74,7 @@ GuildWindow::GuildWindow():
layout.setColWidth(0, 48);
layout.setColWidth(1, 65);
- loadWindowState(player_node->getName());
+ loadWindowState("Guild");
}
GuildWindow::~GuildWindow()
diff --git a/src/gui/partywindow.cpp b/src/gui/partywindow.cpp
index 484d81b0..1b963dae 100644
--- a/src/gui/partywindow.cpp
+++ b/src/gui/partywindow.cpp
@@ -24,51 +24,61 @@
#include "partywindow.h"
#include "chat.h"
+#include "widgets/avatar.h"
+
#include "../utils/gettext.h"
#include "../net/chatserver/party.h"
PartyWindow::PartyWindow() : Window(_("Party"))
{
setVisible(false);
+ setResizable(false);
+ setCaption(_("Party"));
+ setCloseButton(true);
+ setMinWidth(110);
+ setMinHeight(200);
+ setDefaultSize(620, 300, 110, 200);
+
+ loadWindowState("Party");
}
PartyWindow::~PartyWindow()
{
- PartyList::iterator itr = mPartyMembers.begin(),
- itr_end = mPartyMembers.end();
-
- while (itr != itr_end)
- {
- delete (*itr);
- }
-
mPartyMembers.clear();
}
void PartyWindow::draw(gcn::Graphics *graphics)
{
-
+ Window::draw(graphics);
}
void PartyWindow::addPartyMember(const std::string &memberName)
{
- PartyMember *player = new PartyMember;
+ // check to see if player is already in the party
PartyList::iterator itr = mPartyMembers.begin(),
itr_end = mPartyMembers.end();
while (itr != itr_end)
{
- if ((*itr)->name == memberName)
+ if ((*itr).name == memberName)
{
+ // already in the party, dont add
return;
}
++itr;
}
- player->name = memberName;
+ // create new party member
+ PartyMember player;
+ player.name = memberName;
mPartyMembers.push_back(player);
- if (mPartyMembers.size() > 1)
+ // add avatar of the new member to window
+ Avatar *avatar = new Avatar(memberName);
+ add(avatar, 0, (mPartyMembers.size() - 1)*14);
+
+ // show the window
+ if (mPartyMembers.size() > 0)
{
setVisible(true);
}
@@ -76,12 +86,13 @@ void PartyWindow::addPartyMember(const std::string &memberName)
void PartyWindow::removePartyMember(const std::string &memberName)
{
+ // remove the party member
PartyList::iterator itr = mPartyMembers.begin(),
itr_end = mPartyMembers.end();
while (itr != itr_end)
{
- if ((*itr)->name == memberName)
+ if ((*itr).name == memberName)
{
mPartyMembers.erase(itr);
break;
@@ -89,6 +100,7 @@ void PartyWindow::removePartyMember(const std::string &memberName)
++itr;
}
+ // if no-one left, remove the party window
if (mPartyMembers.size() < 1)
{
setVisible(false);
@@ -97,15 +109,19 @@ void PartyWindow::removePartyMember(const std::string &memberName)
void PartyWindow::showPartyInvite(const std::string &inviter)
{
+ // check there isnt already an invite showing
if (mPartyInviter != "")
{
chatWindow->chatLog("Received party request, but one already exists",
BY_SERVER);
return;
}
+
+ // log invite
std::string msg = inviter + " has invited you to join their party";
chatWindow->chatLog(msg, BY_SERVER);
+ // show invite
acceptDialog = new ConfirmDialog("Accept Party Invite", msg, this);
acceptDialog->addActionListener(this);
@@ -116,8 +132,10 @@ void PartyWindow::action(const gcn::ActionEvent &event)
{
const std::string &eventId = event.getId();
+ // check if they accepted the invite
if (eventId == "yes")
{
+ chatWindow->chatLog("Accepted invite from " + mPartyInviter);
Net::ChatServer::Party::acceptInvite(mPartyInviter);
mPartyInviter = "";
}
diff --git a/src/gui/partywindow.h b/src/gui/partywindow.h
index fe126c2e..f09eeb6a 100644
--- a/src/gui/partywindow.h
+++ b/src/gui/partywindow.h
@@ -40,6 +40,7 @@
struct PartyMember
{
std::string name;
+ int vitality;
};
/**
@@ -86,7 +87,7 @@ class PartyWindow : public Window, gcn::ActionListener
void action(const gcn::ActionEvent &event);
private:
- typedef std::vector<PartyMember*> PartyList;
+ typedef std::vector<PartyMember> PartyList;
PartyList mPartyMembers;
std::string mPartyInviter;
ConfirmDialog *acceptDialog;
diff --git a/src/gui/widgets/avatar.cpp b/src/gui/widgets/avatar.cpp
new file mode 100644
index 00000000..03fa1aeb
--- /dev/null
+++ b/src/gui/widgets/avatar.cpp
@@ -0,0 +1,61 @@
+/*
+ * The Mana World
+ * Copyright 2008 The Mana World Development Team
+ *
+ * This file is part of The Mana World.
+ *
+ * The Mana World is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * any later version.
+ *
+ * The Mana World is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with The Mana World; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * $Id$
+ */
+
+#include "avatar.h"
+
+#include "../icon.h"
+
+#include "../../resources/image.h"
+#include "../../resources/resourcemanager.h"
+
+Avatar::Avatar(const std::string &name):
+ mName(name)
+{
+ setSize(110, 12);
+ mLabel = new gcn::Label(name);
+ mLabel->setSize(85, 12);
+ mLabel->setPosition(25, 0);
+ mStatusOffline = ResourceManager::getInstance()->getImage("graphics/gui/circle-gray.png");
+ mStatusOnline = ResourceManager::getInstance()->getImage("graphics/gui/circle-green.png");
+ mStatus = new Icon(mStatusOffline);
+ mStatus->setSize(25, 12);
+ mStatus->setPosition(0, 0);
+}
+
+void Avatar::setOnline(bool status)
+{
+ if (status)
+ {
+ mStatus->setImage(mStatusOnline);
+ }
+ else
+ {
+ mStatus->setImage(mStatusOffline);
+ }
+}
+
+void Avatar::draw(gcn::Graphics *g)
+{
+ mLabel->draw(g);
+ mStatus->draw(g);
+}
diff --git a/src/gui/widgets/avatar.h b/src/gui/widgets/avatar.h
new file mode 100644
index 00000000..3707e8f8
--- /dev/null
+++ b/src/gui/widgets/avatar.h
@@ -0,0 +1,61 @@
+/*
+ * The Mana World
+ * Copyright 2008 The Mana World Development Team
+ *
+ * This file is part of The Mana World.
+ *
+ * The Mana World is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * any later version.
+ *
+ * The Mana World is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with The Mana World; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * $Id$
+ */
+
+#ifndef _TMW_AVATAR_H
+#define _TMW_AVATAR_H
+
+#include <string>
+#include <guichan/widget.hpp>
+#include <guichan/widgets/label.hpp>
+
+class Image;
+class Icon;
+
+class Avatar : public gcn::Widget
+{
+public:
+ /**
+ * Constructor
+ * @param name Character name
+ */
+ Avatar(const std::string &name);
+
+ /**
+ * Set the avatar online status
+ */
+ void setOnline(bool status);
+
+ /**
+ * Draws the Avatar
+ */
+ void draw(gcn::Graphics *g);
+
+private:
+ std::string mName;
+ Icon *mStatus;
+ Image *mStatusOnline;
+ Image *mStatusOffline;
+ gcn::Label *mLabel;
+};
+
+#endif
diff --git a/src/net/partyhandler.cpp b/src/net/partyhandler.cpp
index f3a2e2f5..af5190a3 100644
--- a/src/net/partyhandler.cpp
+++ b/src/net/partyhandler.cpp
@@ -41,6 +41,8 @@ PartyHandler::PartyHandler()
CPMSG_PARTY_INVITED,
CPMSG_PARTY_ACCEPT_INVITE_RESPONSE,
CPMSG_PARTY_QUIT_RESPONSE,
+ CPMSG_PARTY_NEW_MEMBER,
+ CPMSG_PARTY_MEMBER_LEFT,
0
};
handledMessages = _messages;
@@ -55,10 +57,7 @@ void PartyHandler::handleMessage(MessageIn &msg)
{
if (msg.readInt8() == ERRMSG_OK)
{
- if (!player_node->getInParty())
- player_node->setInParty(true);
- std::string memberName = msg.readString();
- partyWindow->addPartyMember(memberName);
+
}
} break;
@@ -73,6 +72,7 @@ void PartyHandler::handleMessage(MessageIn &msg)
if (msg.readInt8() == ERRMSG_OK)
{
player_node->setInParty(true);
+ chatWindow->chatLog("Joined party");
}
}
@@ -83,5 +83,23 @@ void PartyHandler::handleMessage(MessageIn &msg)
player_node->setInParty(false);
}
} break;
+
+ case CPMSG_PARTY_NEW_MEMBER:
+ {
+ int id = msg.readInt16();
+ std::string name = msg.readString();
+
+ chatWindow->chatLog(name + " joined the party");
+
+ if (!player_node->getInParty())
+ player_node->setInParty(true);
+
+ partyWindow->addPartyMember(name);
+ } break;
+
+ case CPMSG_PARTY_MEMBER_LEFT:
+ {
+ partyWindow->removePartyMember(msg.readString());
+ } break;
}
}
diff --git a/src/net/protocol.h b/src/net/protocol.h
index c0bffb50..2ed414a8 100644
--- a/src/net/protocol.h
+++ b/src/net/protocol.h
@@ -157,12 +157,14 @@ enum {
// Party
PCMSG_PARTY_INVITE = 0x03A0, // S name
- CPMSG_PARTY_INVITE_RESPONSE = 0x03A1, // B error, S name
+ CPMSG_PARTY_INVITE_RESPONSE = 0x03A1, // B error
CPMSG_PARTY_INVITED = 0x03A2, // S name
PCMSG_PARTY_ACCEPT_INVITE = 0x03A5, // S name
- CPMSG_PARTY_ACCEPT_INVITE_RESPONSE = 0x03A6, // B error
+ CPMSG_PARTY_ACCEPT_INVITE_RESPONSE = 0x03A6, // B error, { S name }
PCMSG_PARTY_QUIT = 0x03AA, // -
CPMSG_PARTY_QUIT_RESPONSE = 0x03AB, // B error
+ CPMSG_PARTY_NEW_MEMBER = 0x03B0, // W being id, S name
+ CPMSG_PARTY_MEMBER_LEFT = 0x03B1, // W being id
// Chat
CPMSG_ERROR = 0x0401, // B error
diff --git a/tmw.cbp b/tmw.cbp
index 9af35d94..8aa65fd4 100644
--- a/tmw.cbp
+++ b/tmw.cbp
@@ -415,6 +415,8 @@
<Unit filename="src/gui/viewport.h">
<Option target="default" />
</Unit>
+ <Unit filename="src/gui/widgets/avatar.cpp" />
+ <Unit filename="src/gui/widgets/avatar.h" />
<Unit filename="src/gui/widgets/dropdown.cpp" />
<Unit filename="src/gui/widgets/dropdown.h">
<Option target="default" />