summaryrefslogtreecommitdiff
path: root/src/net
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-08-26 21:39:30 +0300
committerAndrei Karas <akaras@inbox.ru>2015-08-26 21:39:30 +0300
commit1fa2a62572a46f34f7216e12814c0e932f5bd2ca (patch)
treec913d536da80b96104d95ce0ce64680e0353485a /src/net
parentda649050e6a92a199e1ba6ec09f456b184e51809 (diff)
downloadmanaplus-1fa2a62572a46f34f7216e12814c0e932f5bd2ca.tar.gz
manaplus-1fa2a62572a46f34f7216e12814c0e932f5bd2ca.tar.bz2
manaplus-1fa2a62572a46f34f7216e12814c0e932f5bd2ca.tar.xz
manaplus-1fa2a62572a46f34f7216e12814c0e932f5bd2ca.zip
Move receive code from guildhandler into separate file.
Diffstat (limited to 'src/net')
-rw-r--r--src/net/ea/guildhandler.cpp489
-rw-r--r--src/net/ea/guildhandler.h49
-rw-r--r--src/net/ea/guildrecv.cpp538
-rw-r--r--src/net/ea/guildrecv.h68
-rw-r--r--src/net/eathena/guildhandler.cpp170
-rw-r--r--src/net/eathena/guildhandler.h13
-rw-r--r--src/net/eathena/guildrecv.cpp152
-rw-r--r--src/net/eathena/guildrecv.h47
-rw-r--r--src/net/tmwa/guildhandler.cpp150
-rw-r--r--src/net/tmwa/guildhandler.h9
-rw-r--r--src/net/tmwa/guildrecv.cpp140
-rw-r--r--src/net/tmwa/guildrecv.h47
12 files changed, 1059 insertions, 813 deletions
diff --git a/src/net/ea/guildhandler.cpp b/src/net/ea/guildhandler.cpp
index d68953e37..2bc7ba02d 100644
--- a/src/net/ea/guildhandler.cpp
+++ b/src/net/ea/guildhandler.cpp
@@ -34,6 +34,8 @@
#include "net/messagein.h"
+#include "net/ea/guildrecv.h"
+
#include "gui/widgets/tabs/chat/guildtab.h"
#include "utils/delete2.h"
@@ -46,13 +48,9 @@ GuildTab *guildTab = nullptr;
namespace Ea
{
-Guild *taGuild = nullptr;
-
-bool GuildHandler::showBasicInfo = false;
-
GuildHandler::GuildHandler()
{
- showBasicInfo = false;
+ Ea::GuildRecv::showBasicInfo = false;
}
GuildHandler::~GuildHandler()
@@ -60,448 +58,6 @@ GuildHandler::~GuildHandler()
delete2(guildTab);
}
-void GuildHandler::processGuildCreateResponse(Net::MessageIn &msg)
-{
- const uint8_t flag = msg.readUInt8("flag");
-
- switch (flag)
- {
- case 0:
- // Success
- NotifyManager::notify(NotifyTypes::GUILD_CREATED);
- break;
-
- case 1:
- // Already in a guild
- NotifyManager::notify(NotifyTypes::GUILD_ALREADY);
- break;
-
- case 2:
- // Unable to make (likely name already in use)
- NotifyManager::notify(NotifyTypes::GUILD_ALREADY);
- break;
-
- case 3:
- // Emperium check failed
- NotifyManager::notify(NotifyTypes::GUILD_EMPERIUM_CHECK_FAILED);
- break;
-
- default:
- // Unknown response
- NotifyManager::notify(NotifyTypes::GUILD_ERROR);
- break;
- }
-}
-
-void GuildHandler::processGuildMasterOrMember(Net::MessageIn &msg)
-{
- msg.readInt32("type"); // Type (0x57 for member, 0xd7 for master)
-}
-
-void GuildHandler::processGuildBasicInfo(Net::MessageIn &msg)
-{
- const int guildId = msg.readInt32("guild id");
- const int level = msg.readInt32("guild level");
- const int members = msg.readInt32("connect member");
- const int maxMembers = msg.readInt32("max member");
- const int avgLevel = msg.readInt32("average level");
- const int exp = msg.readInt32("exp");
- const int nextExp = msg.readInt32("next exp");
- msg.skip(12, "unused");
- const int emblem = msg.readInt32("emblem id");
- std::string name = msg.readString(24, "guild name");
- std::string master = msg.readString(24, "master name");
- std::string castle = msg.readString(16, "castles");
- msg.readInt32("unused");
-
- if (guildTab && showBasicInfo)
- {
- showBasicInfo = false;
- // TRANSLATORS: guild info message
- guildTab->chatLog(strprintf(_("Guild name: %s"),
- name.c_str()), ChatMsgType::BY_SERVER);
- // TRANSLATORS: guild info message
- guildTab->chatLog(strprintf(_("Guild master: %s"),
- master.c_str()), ChatMsgType::BY_SERVER);
- // TRANSLATORS: guild info message
- guildTab->chatLog(strprintf(_("Guild level: %d"), level),
- ChatMsgType::BY_SERVER);
- // TRANSLATORS: guild info message
- guildTab->chatLog(strprintf(_("Online members: %d"),
- members), ChatMsgType::BY_SERVER);
- // TRANSLATORS: guild info message
- guildTab->chatLog(strprintf(_("Max members: %d"),
- maxMembers), ChatMsgType::BY_SERVER);
- // TRANSLATORS: guild info message
- guildTab->chatLog(strprintf(_("Average level: %d"),
- avgLevel), ChatMsgType::BY_SERVER);
- // TRANSLATORS: guild info message
- guildTab->chatLog(strprintf(_("Guild exp: %d"), exp),
- ChatMsgType::BY_SERVER);
- // TRANSLATORS: guild info message
- guildTab->chatLog(strprintf(_("Guild next exp: %d"),
- nextExp), ChatMsgType::BY_SERVER);
- // TRANSLATORS: guild info message
- guildTab->chatLog(strprintf(_("Guild castle: %s"),
- castle.c_str()), ChatMsgType::BY_SERVER);
- }
-
- Guild *const g = Guild::getGuild(static_cast<int16_t>(guildId));
- if (!g)
- return;
- g->setName(name);
- g->setEmblemId(emblem);
-}
-
-void GuildHandler::processGuildAlianceInfo(Net::MessageIn &msg)
-{
- const int length = msg.readInt16("len");
- if (length < 4)
- return;
- const int count = (length - 4) / 32;
-
- for (int i = 0; i < count; i++)
- {
- msg.readInt32("opposition");
- msg.readInt32("guild id");
- msg.readString(24, "guild name");
- }
-}
-
-void GuildHandler::processGuildMemberList(Net::MessageIn &msg)
-{
- const int length = msg.readInt16("len");
- if (length < 4)
- return;
- const int count = (length - 4) / 104;
- if (!taGuild)
- {
- logger->log1("!taGuild");
- return;
- }
-
- taGuild->clearMembers();
-
- int onlineNum = 0;
- int totalNum = 0;
- for (int i = 0; i < count; i++)
- {
- const BeingId id = msg.readBeingId("account id");
- const int charId = msg.readInt32("char id");
- msg.readInt16("hair");
- msg.readInt16("hair color");
- const int gender = msg.readInt16("gender");
- const int race = msg.readInt16("class");
- const int level = msg.readInt16("level");
- const int exp = msg.readInt32("exp");
- const int online = msg.readInt32("online");
- const int pos = msg.readInt32("position");
- msg.skip(50, "unused");
- std::string name = msg.readString(24, "name");
-
- GuildMember *const m = taGuild->addMember(id, charId, name);
- if (m)
- {
- m->setOnline(online);
- m->setID(id);
- m->setCharId(charId);
- m->setGender(Being::intToGender(static_cast<uint8_t>(gender)));
- m->setLevel(level);
- m->setExp(exp);
- m->setPos(pos);
- m->setRace(race);
- if (actorManager)
- {
- Being *const being = actorManager->findBeingByName(
- name, ActorType::Player);
- if (being)
- {
- being->setGuildName(taGuild->getName());
- if (being->getLevel() != level)
- {
- being->setLevel(level);
- being->updateName();
- }
- }
- }
- if (online)
- onlineNum ++;
- totalNum ++;
- }
- }
- taGuild->sort();
- if (actorManager)
- {
- actorManager->updatePlayerGuild();
- actorManager->updatePlayerColors();
- }
- if (socialWindow)
- socialWindow->updateGuildCounter(onlineNum, totalNum);
-}
-
-void GuildHandler::processGuildPosNameList(Net::MessageIn &msg)
-{
- if (!taGuild)
- {
- logger->log1("!taGuild");
- return;
- }
-
- const int length = msg.readInt16("len");
- if (length < 4)
- return;
- const int count = (length - 4) / 28;
-
- for (int i = 0; i < count; i++)
- {
- const int id = msg.readInt32("position id");
- const std::string name = msg.readString(24, "position name");
- taGuild->addPos(id, name);
- }
-}
-
-void GuildHandler::processGuildPosInfoList(Net::MessageIn &msg)
-{
- const int length = msg.readInt16("len");
- if (length < 4)
- return;
- const int count = (length - 4) / 16;
-
- for (int i = 0; i < count; i++)
- {
- msg.readInt32("id");
- msg.readInt32("mode");
- msg.readInt32("same id");
- msg.readInt32("exp mode");
- }
-}
-
-void GuildHandler::processGuildPositionChanged(Net::MessageIn &msg)
-{
- UNIMPLIMENTEDPACKET;
- msg.readInt16("len");
- msg.readInt32("id");
- msg.readInt32("mode");
- msg.readInt32("same ip");
- msg.readInt32("exp mode");
- msg.readString(24, "name");
-}
-
-void GuildHandler::processGuildMemberPosChange(Net::MessageIn &msg)
-{
- msg.readInt16("len");
- const BeingId accountId = msg.readBeingId("account id");
- const int charId = msg.readInt32("char id");
- const int pos = msg.readInt32("position");
- if (taGuild)
- {
- GuildMember *const m = taGuild->getMember(accountId, charId);
- if (m)
- m->setPos(pos);
- }
-}
-
-void GuildHandler::processGuildEmblemData(Net::MessageIn &msg)
-{
- UNIMPLIMENTEDPACKET;
- const int length = msg.readInt16("len");
-
- msg.readInt32("guild id");
- msg.readInt32("emblem id");
- if (length < 12)
- return;
- msg.skip(length - 12, "emblem data");
-}
-
-void GuildHandler::processGuildSkillInfo(Net::MessageIn &msg)
-{
- const int count = (msg.readInt16("len") - 6) / 37;
- msg.readInt16("skill points");
-
- if (skillDialog)
- skillDialog->hideSkills(SkillOwner::Guild);
- for (int i = 0; i < count; i++)
- {
- const int skillId = msg.readInt16("skill id");
- const SkillType::SkillType inf = static_cast<SkillType::SkillType>(
- msg.readInt32("inf"));
- const int level = msg.readInt16("skill level");
- const int sp = msg.readInt16("sp");
- const int range = msg.readInt16("range");
- const std::string name = msg.readString(24, "skill name");
- const Modifiable up = fromBool(msg.readUInt8("up flag"), Modifiable);
- PlayerInfo::setSkillLevel(skillId, level);
- if (skillDialog)
- {
- if (!skillDialog->updateSkill(skillId, range, up, inf, sp))
- {
- skillDialog->addSkill(SkillOwner::Guild,
- skillId, name, level, range, up, inf, sp);
- }
- }
- }
- if (skillDialog)
- skillDialog->updateModels();
-}
-
-void GuildHandler::processGuildNotice(Net::MessageIn &msg)
-{
- const std::string msg1 = msg.readString(60, "msg1");
- const std::string msg2 = msg.readString(120, "msg2");
- if (guildTab)
- {
- guildTab->chatLog(msg1, ChatMsgType::BY_SERVER);
- guildTab->chatLog(msg2, ChatMsgType::BY_SERVER);
- }
-}
-
-void GuildHandler::processGuildInvite(Net::MessageIn &msg)
-{
- const int guildId = msg.readInt32("guild id");
- const std::string guildName = msg.readString(24, "guild name");
-
- if (socialWindow)
- socialWindow->showGuildInvite(guildName, guildId, "");
-}
-
-void GuildHandler::processGuildInviteAck(Net::MessageIn &msg)
-{
- const uint8_t flag = msg.readUInt8("flag");
- if (!guildTab)
- return;
-
- switch (flag)
- {
- case 0:
- NotifyManager::notify(NotifyTypes::GUILD_INVITE_FAILED);
- break;
-
- case 1:
- NotifyManager::notify(NotifyTypes::GUILD_INVITE_REJECTED);
- break;
-
- case 2:
- NotifyManager::notify(NotifyTypes::GUILD_INVITE_JOINED);
- break;
-
- case 3:
- NotifyManager::notify(NotifyTypes::GUILD_INVITE_FULL);
- break;
-
- default:
- NotifyManager::notify(NotifyTypes::GUILD_INVITE_ERROR);
- break;
- }
-}
-
-void GuildHandler::processGuildLeave(Net::MessageIn &msg)
-{
- const std::string nick = msg.readString(24, "nick");
- msg.readString(40, "message");
-
- if (taGuild)
- taGuild->removeMember(nick);
-
- if (!localPlayer)
- return;
-
- if (nick == localPlayer->getName())
- {
- if (taGuild)
- {
- taGuild->removeFromMembers();
- taGuild->clearMembers();
- }
- NotifyManager::notify(NotifyTypes::GUILD_LEFT);
- delete2(guildTab)
-
- if (socialWindow && taGuild)
- socialWindow->removeTab(taGuild);
- if (actorManager)
- actorManager->updatePlayerColors();
- }
- else
- {
- NotifyManager::notify(NotifyTypes::GUILD_USER_LEFT, nick);
- if (actorManager)
- {
- Being *const b = actorManager->findBeingByName(
- nick, ActorType::Player);
-
- if (b)
- b->clearGuilds();
- if (taGuild)
- taGuild->removeMember(nick);
- }
- }
-}
-
-void GuildHandler::processGuildMessage(Net::MessageIn &msg)
-{
- const int msgLength = msg.readInt16("len") - 4;
-
- if (msgLength <= 0)
- return;
- if (guildTab)
- {
- std::string chatMsg = msg.readString(msgLength, "message");
- const size_t pos = chatMsg.find(" : ", 0);
- if (pos != std::string::npos)
- {
- const std::string sender_name = chatMsg.substr(0, pos);
- chatMsg.erase(0, pos + 3);
- trim(chatMsg);
- guildTab->chatLog(sender_name, chatMsg);
- }
- else
- {
- guildTab->chatLog(chatMsg, ChatMsgType::BY_SERVER);
- }
- }
-}
-
-void GuildHandler::processGuildSkillUp(Net::MessageIn &msg)
-{
- UNIMPLIMENTEDPACKET;
- msg.readInt16("skill id");
- msg.readInt16("level");
- msg.readInt16("sp");
- msg.readInt16("range");
- msg.readUInt8("unused?");
-}
-
-void GuildHandler::processGuildReqAlliance(Net::MessageIn &msg)
-{
- UNIMPLIMENTEDPACKET;
- msg.readInt32("id");
- msg.readString(24, "name");
-}
-
-void GuildHandler::processGuildReqAllianceAck(Net::MessageIn &msg)
-{
- UNIMPLIMENTEDPACKET;
- msg.readInt32("flag");
-}
-
-void GuildHandler::processGuildDelAlliance(Net::MessageIn &msg)
-{
- UNIMPLIMENTEDPACKET;
- msg.readInt32("guild id");
- msg.readInt32("flag");
-}
-
-void GuildHandler::processGuildOppositionAck(Net::MessageIn &msg)
-{
- UNIMPLIMENTEDPACKET;
- msg.readUInt8("flag");
-}
-
-void GuildHandler::processGuildBroken(Net::MessageIn &msg)
-{
- UNIMPLIMENTEDPACKET;
- msg.readInt32("flag");
-}
-
void GuildHandler::clear() const
{
taGuild = nullptr;
@@ -512,43 +68,4 @@ ChatTab *GuildHandler::getTab() const
return guildTab;
}
-void GuildHandler::processGuildExpulsionContinue(const std::string &nick)
-{
- if (taGuild)
- taGuild->removeMember(nick);
-
- if (!localPlayer)
- return;
-
- if (nick == localPlayer->getName())
- {
- if (taGuild)
- {
- taGuild->removeFromMembers();
- taGuild->clearMembers();
- }
- NotifyManager::notify(NotifyTypes::GUILD_KICKED);
- delete2(guildTab)
-
- if (socialWindow && taGuild)
- socialWindow->removeTab(taGuild);
- if (actorManager)
- actorManager->updatePlayerColors();
- }
- else
- {
- NotifyManager::notify(NotifyTypes::GUILD_USER_KICKED, nick);
- if (actorManager)
- {
- Being *const b = actorManager->findBeingByName(
- nick, ActorType::Player);
-
- if (b)
- b->clearGuilds();
- if (taGuild)
- taGuild->removeMember(nick);
- }
- }
-}
-
} // namespace Ea
diff --git a/src/net/ea/guildhandler.h b/src/net/ea/guildhandler.h
index db7f94fa4..a03ff5b64 100644
--- a/src/net/ea/guildhandler.h
+++ b/src/net/ea/guildhandler.h
@@ -42,58 +42,9 @@ class GuildHandler notfinal : public Net::GuildHandler
virtual ~GuildHandler();
- static void processGuildCreateResponse(Net::MessageIn &msg);
-
- static void processGuildMasterOrMember(Net::MessageIn &msg);
-
- static void processGuildBasicInfo(Net::MessageIn &msg);
-
- static void processGuildAlianceInfo(Net::MessageIn &msg);
-
- static void processGuildMemberList(Net::MessageIn &msg);
-
- static void processGuildPosNameList(Net::MessageIn &msg);
-
- static void processGuildPosInfoList(Net::MessageIn &msg);
-
- static void processGuildPositionChanged(Net::MessageIn &msg);
-
- static void processGuildMemberPosChange(Net::MessageIn &msg);
-
- static void processGuildEmblemData(Net::MessageIn &msg);
-
- static void processGuildSkillInfo(Net::MessageIn &msg);
-
- static void processGuildNotice(Net::MessageIn &msg);
-
- static void processGuildInvite(Net::MessageIn &msg);
-
- static void processGuildInviteAck(Net::MessageIn &msg);
-
- static void processGuildLeave(Net::MessageIn &msg);
-
- static void processGuildMessage(Net::MessageIn &msg);
-
- static void processGuildSkillUp(Net::MessageIn &msg);
-
- static void processGuildReqAlliance(Net::MessageIn &msg);
-
- static void processGuildReqAllianceAck(Net::MessageIn &msg);
-
- static void processGuildDelAlliance(Net::MessageIn &msg);
-
- static void processGuildOppositionAck(Net::MessageIn &msg);
-
- static void processGuildBroken(Net::MessageIn &msg);
-
- static void processGuildExpulsionContinue(const std::string &nick);
-
void clear() const override final;
ChatTab *getTab() const override final;
-
- protected:
- static bool showBasicInfo;
};
extern Guild *taGuild;
diff --git a/src/net/ea/guildrecv.cpp b/src/net/ea/guildrecv.cpp
new file mode 100644
index 000000000..a28818924
--- /dev/null
+++ b/src/net/ea/guildrecv.cpp
@@ -0,0 +1,538 @@
+/*
+ * The ManaPlus Client
+ * Copyright (C) 2009-2010 The Mana Developers
+ * Copyright (C) 2011-2015 The ManaPlus Developers
+ *
+ * This file is part of The ManaPlus Client.
+ *
+ * This program 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.
+ *
+ * This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "net/ea/guildrecv.h"
+
+#include "actormanager.h"
+#include "notifymanager.h"
+
+#include "being/localplayer.h"
+#include "being/playerinfo.h"
+
+#include "enums/resources/notifytypes.h"
+
+#include "gui/windows/skilldialog.h"
+#include "gui/windows/socialwindow.h"
+
+#include "net/messagein.h"
+
+#include "gui/widgets/tabs/chat/guildtab.h"
+
+#include "utils/delete2.h"
+#include "utils/gettext.h"
+#include "utils/stringutils.h"
+
+#include "debug.h"
+
+extern GuildTab *guildTab;
+
+namespace Ea
+{
+
+Guild *taGuild = nullptr;
+
+namespace GuildRecv
+{
+ bool showBasicInfo = false;
+} // namespace GuildRecv
+
+void GuildRecv::processGuildCreateResponse(Net::MessageIn &msg)
+{
+ const uint8_t flag = msg.readUInt8("flag");
+
+ switch (flag)
+ {
+ case 0:
+ // Success
+ NotifyManager::notify(NotifyTypes::GUILD_CREATED);
+ break;
+
+ case 1:
+ // Already in a guild
+ NotifyManager::notify(NotifyTypes::GUILD_ALREADY);
+ break;
+
+ case 2:
+ // Unable to make (likely name already in use)
+ NotifyManager::notify(NotifyTypes::GUILD_ALREADY);
+ break;
+
+ case 3:
+ // Emperium check failed
+ NotifyManager::notify(NotifyTypes::GUILD_EMPERIUM_CHECK_FAILED);
+ break;
+
+ default:
+ // Unknown response
+ NotifyManager::notify(NotifyTypes::GUILD_ERROR);
+ break;
+ }
+}
+
+void GuildRecv::processGuildMasterOrMember(Net::MessageIn &msg)
+{
+ msg.readInt32("type"); // Type (0x57 for member, 0xd7 for master)
+}
+
+void GuildRecv::processGuildBasicInfo(Net::MessageIn &msg)
+{
+ const int guildId = msg.readInt32("guild id");
+ const int level = msg.readInt32("guild level");
+ const int members = msg.readInt32("connect member");
+ const int maxMembers = msg.readInt32("max member");
+ const int avgLevel = msg.readInt32("average level");
+ const int exp = msg.readInt32("exp");
+ const int nextExp = msg.readInt32("next exp");
+ msg.skip(12, "unused");
+ const int emblem = msg.readInt32("emblem id");
+ std::string name = msg.readString(24, "guild name");
+ std::string master = msg.readString(24, "master name");
+ std::string castle = msg.readString(16, "castles");
+ msg.readInt32("unused");
+
+ if (guildTab && showBasicInfo)
+ {
+ showBasicInfo = false;
+ // TRANSLATORS: guild info message
+ guildTab->chatLog(strprintf(_("Guild name: %s"),
+ name.c_str()), ChatMsgType::BY_SERVER);
+ // TRANSLATORS: guild info message
+ guildTab->chatLog(strprintf(_("Guild master: %s"),
+ master.c_str()), ChatMsgType::BY_SERVER);
+ // TRANSLATORS: guild info message
+ guildTab->chatLog(strprintf(_("Guild level: %d"), level),
+ ChatMsgType::BY_SERVER);
+ // TRANSLATORS: guild info message
+ guildTab->chatLog(strprintf(_("Online members: %d"),
+ members), ChatMsgType::BY_SERVER);
+ // TRANSLATORS: guild info message
+ guildTab->chatLog(strprintf(_("Max members: %d"),
+ maxMembers), ChatMsgType::BY_SERVER);
+ // TRANSLATORS: guild info message
+ guildTab->chatLog(strprintf(_("Average level: %d"),
+ avgLevel), ChatMsgType::BY_SERVER);
+ // TRANSLATORS: guild info message
+ guildTab->chatLog(strprintf(_("Guild exp: %d"), exp),
+ ChatMsgType::BY_SERVER);
+ // TRANSLATORS: guild info message
+ guildTab->chatLog(strprintf(_("Guild next exp: %d"),
+ nextExp), ChatMsgType::BY_SERVER);
+ // TRANSLATORS: guild info message
+ guildTab->chatLog(strprintf(_("Guild castle: %s"),
+ castle.c_str()), ChatMsgType::BY_SERVER);
+ }
+
+ Guild *const g = Guild::getGuild(static_cast<int16_t>(guildId));
+ if (!g)
+ return;
+ g->setName(name);
+ g->setEmblemId(emblem);
+}
+
+void GuildRecv::processGuildAlianceInfo(Net::MessageIn &msg)
+{
+ const int length = msg.readInt16("len");
+ if (length < 4)
+ return;
+ const int count = (length - 4) / 32;
+
+ for (int i = 0; i < count; i++)
+ {
+ msg.readInt32("opposition");
+ msg.readInt32("guild id");
+ msg.readString(24, "guild name");
+ }
+}
+
+void GuildRecv::processGuildMemberList(Net::MessageIn &msg)
+{
+ const int length = msg.readInt16("len");
+ if (length < 4)
+ return;
+ const int count = (length - 4) / 104;
+ if (!taGuild)
+ {
+ logger->log1("!taGuild");
+ return;
+ }
+
+ taGuild->clearMembers();
+
+ int onlineNum = 0;
+ int totalNum = 0;
+ for (int i = 0; i < count; i++)
+ {
+ const BeingId id = msg.readBeingId("account id");
+ const int charId = msg.readInt32("char id");
+ msg.readInt16("hair");
+ msg.readInt16("hair color");
+ const int gender = msg.readInt16("gender");
+ const int race = msg.readInt16("class");
+ const int level = msg.readInt16("level");
+ const int exp = msg.readInt32("exp");
+ const int online = msg.readInt32("online");
+ const int pos = msg.readInt32("position");
+ msg.skip(50, "unused");
+ std::string name = msg.readString(24, "name");
+
+ GuildMember *const m = taGuild->addMember(id, charId, name);
+ if (m)
+ {
+ m->setOnline(online);
+ m->setID(id);
+ m->setCharId(charId);
+ m->setGender(Being::intToGender(static_cast<uint8_t>(gender)));
+ m->setLevel(level);
+ m->setExp(exp);
+ m->setPos(pos);
+ m->setRace(race);
+ if (actorManager)
+ {
+ Being *const being = actorManager->findBeingByName(
+ name, ActorType::Player);
+ if (being)
+ {
+ being->setGuildName(taGuild->getName());
+ if (being->getLevel() != level)
+ {
+ being->setLevel(level);
+ being->updateName();
+ }
+ }
+ }
+ if (online)
+ onlineNum ++;
+ totalNum ++;
+ }
+ }
+ taGuild->sort();
+ if (actorManager)
+ {
+ actorManager->updatePlayerGuild();
+ actorManager->updatePlayerColors();
+ }
+ if (socialWindow)
+ socialWindow->updateGuildCounter(onlineNum, totalNum);
+}
+
+void GuildRecv::processGuildPosNameList(Net::MessageIn &msg)
+{
+ if (!taGuild)
+ {
+ logger->log1("!taGuild");
+ return;
+ }
+
+ const int length = msg.readInt16("len");
+ if (length < 4)
+ return;
+ const int count = (length - 4) / 28;
+
+ for (int i = 0; i < count; i++)
+ {
+ const int id = msg.readInt32("position id");
+ const std::string name = msg.readString(24, "position name");
+ taGuild->addPos(id, name);
+ }
+}
+
+void GuildRecv::processGuildPosInfoList(Net::MessageIn &msg)
+{
+ const int length = msg.readInt16("len");
+ if (length < 4)
+ return;
+ const int count = (length - 4) / 16;
+
+ for (int i = 0; i < count; i++)
+ {
+ msg.readInt32("id");
+ msg.readInt32("mode");
+ msg.readInt32("same id");
+ msg.readInt32("exp mode");
+ }
+}
+
+void GuildRecv::processGuildPositionChanged(Net::MessageIn &msg)
+{
+ UNIMPLIMENTEDPACKET;
+ msg.readInt16("len");
+ msg.readInt32("id");
+ msg.readInt32("mode");
+ msg.readInt32("same ip");
+ msg.readInt32("exp mode");
+ msg.readString(24, "name");
+}
+
+void GuildRecv::processGuildMemberPosChange(Net::MessageIn &msg)
+{
+ msg.readInt16("len");
+ const BeingId accountId = msg.readBeingId("account id");
+ const int charId = msg.readInt32("char id");
+ const int pos = msg.readInt32("position");
+ if (taGuild)
+ {
+ GuildMember *const m = taGuild->getMember(accountId, charId);
+ if (m)
+ m->setPos(pos);
+ }
+}
+
+void GuildRecv::processGuildEmblemData(Net::MessageIn &msg)
+{
+ UNIMPLIMENTEDPACKET;
+ const int length = msg.readInt16("len");
+
+ msg.readInt32("guild id");
+ msg.readInt32("emblem id");
+ if (length < 12)
+ return;
+ msg.skip(length - 12, "emblem data");
+}
+
+void GuildRecv::processGuildSkillInfo(Net::MessageIn &msg)
+{
+ const int count = (msg.readInt16("len") - 6) / 37;
+ msg.readInt16("skill points");
+
+ if (skillDialog)
+ skillDialog->hideSkills(SkillOwner::Guild);
+ for (int i = 0; i < count; i++)
+ {
+ const int skillId = msg.readInt16("skill id");
+ const SkillType::SkillType inf = static_cast<SkillType::SkillType>(
+ msg.readInt32("inf"));
+ const int level = msg.readInt16("skill level");
+ const int sp = msg.readInt16("sp");
+ const int range = msg.readInt16("range");
+ const std::string name = msg.readString(24, "skill name");
+ const Modifiable up = fromBool(msg.readUInt8("up flag"), Modifiable);
+ PlayerInfo::setSkillLevel(skillId, level);
+ if (skillDialog)
+ {
+ if (!skillDialog->updateSkill(skillId, range, up, inf, sp))
+ {
+ skillDialog->addSkill(SkillOwner::Guild,
+ skillId, name, level, range, up, inf, sp);
+ }
+ }
+ }
+ if (skillDialog)
+ skillDialog->updateModels();
+}
+
+void GuildRecv::processGuildNotice(Net::MessageIn &msg)
+{
+ const std::string msg1 = msg.readString(60, "msg1");
+ const std::string msg2 = msg.readString(120, "msg2");
+ if (guildTab)
+ {
+ guildTab->chatLog(msg1, ChatMsgType::BY_SERVER);
+ guildTab->chatLog(msg2, ChatMsgType::BY_SERVER);
+ }
+}
+
+void GuildRecv::processGuildInvite(Net::MessageIn &msg)
+{
+ const int guildId = msg.readInt32("guild id");
+ const std::string guildName = msg.readString(24, "guild name");
+
+ if (socialWindow)
+ socialWindow->showGuildInvite(guildName, guildId, "");
+}
+
+void GuildRecv::processGuildInviteAck(Net::MessageIn &msg)
+{
+ const uint8_t flag = msg.readUInt8("flag");
+ if (!guildTab)
+ return;
+
+ switch (flag)
+ {
+ case 0:
+ NotifyManager::notify(NotifyTypes::GUILD_INVITE_FAILED);
+ break;
+
+ case 1:
+ NotifyManager::notify(NotifyTypes::GUILD_INVITE_REJECTED);
+ break;
+
+ case 2:
+ NotifyManager::notify(NotifyTypes::GUILD_INVITE_JOINED);
+ break;
+
+ case 3:
+ NotifyManager::notify(NotifyTypes::GUILD_INVITE_FULL);
+ break;
+
+ default:
+ NotifyManager::notify(NotifyTypes::GUILD_INVITE_ERROR);
+ break;
+ }
+}
+
+void GuildRecv::processGuildLeave(Net::MessageIn &msg)
+{
+ const std::string nick = msg.readString(24, "nick");
+ msg.readString(40, "message");
+
+ if (taGuild)
+ taGuild->removeMember(nick);
+
+ if (!localPlayer)
+ return;
+
+ if (nick == localPlayer->getName())
+ {
+ if (taGuild)
+ {
+ taGuild->removeFromMembers();
+ taGuild->clearMembers();
+ }
+ NotifyManager::notify(NotifyTypes::GUILD_LEFT);
+ delete2(guildTab)
+
+ if (socialWindow && taGuild)
+ socialWindow->removeTab(taGuild);
+ if (actorManager)
+ actorManager->updatePlayerColors();
+ }
+ else
+ {
+ NotifyManager::notify(NotifyTypes::GUILD_USER_LEFT, nick);
+ if (actorManager)
+ {
+ Being *const b = actorManager->findBeingByName(
+ nick, ActorType::Player);
+
+ if (b)
+ b->clearGuilds();
+ if (taGuild)
+ taGuild->removeMember(nick);
+ }
+ }
+}
+
+void GuildRecv::processGuildMessage(Net::MessageIn &msg)
+{
+ const int msgLength = msg.readInt16("len") - 4;
+
+ if (msgLength <= 0)
+ return;
+ if (guildTab)
+ {
+ std::string chatMsg = msg.readString(msgLength, "message");
+ const size_t pos = chatMsg.find(" : ", 0);
+ if (pos != std::string::npos)
+ {
+ const std::string sender_name = chatMsg.substr(0, pos);
+ chatMsg.erase(0, pos + 3);
+ trim(chatMsg);
+ guildTab->chatLog(sender_name, chatMsg);
+ }
+ else
+ {
+ guildTab->chatLog(chatMsg, ChatMsgType::BY_SERVER);
+ }
+ }
+}
+
+void GuildRecv::processGuildSkillUp(Net::MessageIn &msg)
+{
+ UNIMPLIMENTEDPACKET;
+ msg.readInt16("skill id");
+ msg.readInt16("level");
+ msg.readInt16("sp");
+ msg.readInt16("range");
+ msg.readUInt8("unused?");
+}
+
+void GuildRecv::processGuildReqAlliance(Net::MessageIn &msg)
+{
+ UNIMPLIMENTEDPACKET;
+ msg.readInt32("id");
+ msg.readString(24, "name");
+}
+
+void GuildRecv::processGuildReqAllianceAck(Net::MessageIn &msg)
+{
+ UNIMPLIMENTEDPACKET;
+ msg.readInt32("flag");
+}
+
+void GuildRecv::processGuildDelAlliance(Net::MessageIn &msg)
+{
+ UNIMPLIMENTEDPACKET;
+ msg.readInt32("guild id");
+ msg.readInt32("flag");
+}
+
+void GuildRecv::processGuildOppositionAck(Net::MessageIn &msg)
+{
+ UNIMPLIMENTEDPACKET;
+ msg.readUInt8("flag");
+}
+
+void GuildRecv::processGuildBroken(Net::MessageIn &msg)
+{
+ UNIMPLIMENTEDPACKET;
+ msg.readInt32("flag");
+}
+
+void GuildRecv::processGuildExpulsionContinue(const std::string &nick)
+{
+ if (taGuild)
+ taGuild->removeMember(nick);
+
+ if (!localPlayer)
+ return;
+
+ if (nick == localPlayer->getName())
+ {
+ if (taGuild)
+ {
+ taGuild->removeFromMembers();
+ taGuild->clearMembers();
+ }
+ NotifyManager::notify(NotifyTypes::GUILD_KICKED);
+ delete2(guildTab)
+
+ if (socialWindow && taGuild)
+ socialWindow->removeTab(taGuild);
+ if (actorManager)
+ actorManager->updatePlayerColors();
+ }
+ else
+ {
+ NotifyManager::notify(NotifyTypes::GUILD_USER_KICKED, nick);
+ if (actorManager)
+ {
+ Being *const b = actorManager->findBeingByName(
+ nick, ActorType::Player);
+
+ if (b)
+ b->clearGuilds();
+ if (taGuild)
+ taGuild->removeMember(nick);
+ }
+ }
+}
+
+} // namespace Ea
diff --git a/src/net/ea/guildrecv.h b/src/net/ea/guildrecv.h
new file mode 100644
index 000000000..542243c83
--- /dev/null
+++ b/src/net/ea/guildrecv.h
@@ -0,0 +1,68 @@
+/*
+ * The ManaPlus Client
+ * Copyright (C) 2009-2010 The Mana Developers
+ * Copyright (C) 2011-2015 The ManaPlus Developers
+ *
+ * This file is part of The ManaPlus Client.
+ *
+ * This program 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.
+ *
+ * This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef NET_EA_GUILDRECV_H
+#define NET_EA_GUILDRECV_H
+
+#include "net/guildhandler.h"
+
+namespace Net
+{
+ class MessageIn;
+}
+
+class GuildTab;
+
+namespace Ea
+{
+ namespace GuildRecv
+ {
+ extern bool showBasicInfo;
+
+ void processGuildCreateResponse(Net::MessageIn &msg);
+ void processGuildMasterOrMember(Net::MessageIn &msg);
+ void processGuildBasicInfo(Net::MessageIn &msg);
+ void processGuildAlianceInfo(Net::MessageIn &msg);
+ void processGuildMemberList(Net::MessageIn &msg);
+ void processGuildPosNameList(Net::MessageIn &msg);
+ void processGuildPosInfoList(Net::MessageIn &msg);
+ void processGuildPositionChanged(Net::MessageIn &msg);
+ void processGuildMemberPosChange(Net::MessageIn &msg);
+ void processGuildEmblemData(Net::MessageIn &msg);
+ void processGuildSkillInfo(Net::MessageIn &msg);
+ void processGuildNotice(Net::MessageIn &msg);
+ void processGuildInvite(Net::MessageIn &msg);
+ void processGuildInviteAck(Net::MessageIn &msg);
+ void processGuildLeave(Net::MessageIn &msg);
+ void processGuildMessage(Net::MessageIn &msg);
+ void processGuildSkillUp(Net::MessageIn &msg);
+ void processGuildReqAlliance(Net::MessageIn &msg);
+ void processGuildReqAllianceAck(Net::MessageIn &msg);
+ void processGuildDelAlliance(Net::MessageIn &msg);
+ void processGuildOppositionAck(Net::MessageIn &msg);
+ void processGuildBroken(Net::MessageIn &msg);
+ void processGuildExpulsionContinue(const std::string &nick);
+ } // namespace GuildRecv
+
+ extern Guild *taGuild;
+} // namespace Ea
+
+#endif // NET_EA_GUILDRECV_H
diff --git a/src/net/eathena/guildhandler.cpp b/src/net/eathena/guildhandler.cpp
index 31f1edba7..d6a07091d 100644
--- a/src/net/eathena/guildhandler.cpp
+++ b/src/net/eathena/guildhandler.cpp
@@ -32,6 +32,11 @@
#include "gui/widgets/tabs/chat/guildtab.h"
+#include "net/ea/guildrecv.h"
+
+#include "net/ea/guildrecv.h"
+
+#include "net/eathena/guildrecv.h"
#include "net/eathena/messageout.h"
#include "net/eathena/protocol.h"
@@ -92,115 +97,115 @@ void GuildHandler::handleMessage(Net::MessageIn &msg)
switch (msg.getId())
{
case SMSG_GUILD_CREATE_RESPONSE:
- processGuildCreateResponse(msg);
+ Ea::GuildRecv::processGuildCreateResponse(msg);
break;
case SMSG_GUILD_POSITION_INFO:
- processGuildPositionInfo(msg);
+ GuildRecv::processGuildPositionInfo(msg);
break;
case SMSG_GUILD_MEMBER_LOGIN:
- processGuildMemberLogin(msg);
+ GuildRecv::processGuildMemberLogin(msg);
break;
case SMSG_GUILD_MASTER_OR_MEMBER:
- processGuildMasterOrMember(msg);
+ Ea::GuildRecv::processGuildMasterOrMember(msg);
break;
case SMSG_GUILD_BASIC_INFO:
- processGuildBasicInfo(msg);
+ Ea::GuildRecv::processGuildBasicInfo(msg);
break;
case SMSG_GUILD_ALIANCE_INFO:
- processGuildAlianceInfo(msg);
+ Ea::GuildRecv::processGuildAlianceInfo(msg);
break;
case SMSG_GUILD_MEMBER_LIST:
- processGuildMemberList(msg);
+ Ea::GuildRecv::processGuildMemberList(msg);
break;
case SMSG_GUILD_POS_NAME_LIST:
- processGuildPosNameList(msg);
+ Ea::GuildRecv::processGuildPosNameList(msg);
break;
case SMSG_GUILD_POS_INFO_LIST:
- processGuildPosInfoList(msg);
+ Ea::GuildRecv::processGuildPosInfoList(msg);
break;
case SMSG_GUILD_POSITION_CHANGED:
- processGuildPositionChanged(msg);
+ Ea::GuildRecv::processGuildPositionChanged(msg);
break;
case SMSG_GUILD_MEMBER_POS_CHANGE:
- processGuildMemberPosChange(msg);
+ Ea::GuildRecv::processGuildMemberPosChange(msg);
break;
case SMSG_GUILD_EMBLEM_DATA:
- processGuildEmblemData(msg);
+ Ea::GuildRecv::processGuildEmblemData(msg);
break;
case SMSG_GUILD_SKILL_INFO:
- processGuildSkillInfo(msg);
+ Ea::GuildRecv::processGuildSkillInfo(msg);
break;
case SMSG_GUILD_NOTICE:
- processGuildNotice(msg);
+ Ea::GuildRecv::processGuildNotice(msg);
break;
case SMSG_GUILD_INVITE:
- processGuildInvite(msg);
+ Ea::GuildRecv::processGuildInvite(msg);
break;
case SMSG_GUILD_INVITE_ACK:
- processGuildInviteAck(msg);
+ Ea::GuildRecv::processGuildInviteAck(msg);
break;
case SMSG_GUILD_LEAVE:
- processGuildLeave(msg);
+ Ea::GuildRecv::processGuildLeave(msg);
break;
case SMSG_GUILD_EXPULSION:
- processGuildExpulsion(msg);
+ GuildRecv::processGuildExpulsion(msg);
break;
case SMSG_GUILD_EXPULSION_LIST:
- processGuildExpulsionList(msg);
+ GuildRecv::processGuildExpulsionList(msg);
break;
case SMSG_GUILD_MESSAGE:
- processGuildMessage(msg);
+ Ea::GuildRecv::processGuildMessage(msg);
break;
case SMSG_GUILD_SKILL_UP:
- processGuildSkillUp(msg);
+ Ea::GuildRecv::processGuildSkillUp(msg);
break;
case SMSG_GUILD_REQ_ALLIANCE:
- processGuildReqAlliance(msg);
+ Ea::GuildRecv::processGuildReqAlliance(msg);
break;
case SMSG_GUILD_REQ_ALLIANCE_ACK:
- processGuildReqAllianceAck(msg);
+ Ea::GuildRecv::processGuildReqAllianceAck(msg);
break;
case SMSG_GUILD_DEL_ALLIANCE:
- processGuildDelAlliance(msg);
+ Ea::GuildRecv::processGuildDelAlliance(msg);
break;
case SMSG_GUILD_OPPOSITION_ACK:
- processGuildOppositionAck(msg);
+ Ea::GuildRecv::processGuildOppositionAck(msg);
break;
case SMSG_GUILD_BROKEN:
- processGuildBroken(msg);
+ Ea::GuildRecv::processGuildBroken(msg);
break;
case SMSG_GUILD_UPDATE_COORDS:
- processGuildUpdateCoords(msg);
+ GuildRecv::processGuildUpdateCoords(msg);
break;
case SMSG_GUILD_EMBLEM:
- processGuildEmblem(msg);
+ GuildRecv::processGuildEmblem(msg);
break;
default:
@@ -208,22 +213,6 @@ void GuildHandler::handleMessage(Net::MessageIn &msg)
}
}
-void GuildHandler::processGuildUpdateCoords(Net::MessageIn &msg)
-{
- const BeingId id = msg.readBeingId("account id");
- const int x = msg.readInt16("x");
- const int y = msg.readInt16("y");
- if (Ea::taGuild)
- {
- GuildMember *const m = Ea::taGuild->getMember(id);
- if (m)
- {
- m->setX(x);
- m->setY(y);
- }
- }
-}
-
void GuildHandler::create(const std::string &name) const
{
createOutPacket(CMSG_GUILD_CREATE);
@@ -326,7 +315,7 @@ void GuildHandler::info()
// 3 = skill info
// 4 = expulsion list
- showBasicInfo = true;
+ Ea::GuildRecv::showBasicInfo = true;
createOutPacket(CMSG_GUILD_REQUEST_INFO);
outMsg.writeInt32(0, "action"); // Request basic info
}
@@ -359,97 +348,6 @@ void GuildHandler::checkMaster() const
createOutPacket(CMSG_GUILD_CHECK_MASTER);
}
-void GuildHandler::processGuildPositionInfo(Net::MessageIn &msg)
-{
- const int guildId = msg.readInt32("guild id");
- const int emblem = msg.readInt32("elblem id");
- PlayerInfo::setGuildPositionFlags(
- static_cast<GuildPositionFlags::Type>(msg.readInt32("mode")));
- msg.readUInt8("guild master");
- msg.readInt32("unused");
- std::string guildName = msg.readString(24, "guild name");
-
- Guild *const g = Guild::getGuild(static_cast<int16_t>(guildId));
- if (!g)
- return;
-
- g->setName(guildName);
- g->setEmblemId(emblem);
- if (!Ea::taGuild)
- Ea::taGuild = g;
- if (!guildTab && chatWindow)
- {
- guildTab = new GuildTab(chatWindow);
- if (config.getBoolValue("showChatHistory"))
- guildTab->loadFromLogFile("#Guild");
- if (localPlayer)
- localPlayer->addGuild(Ea::taGuild);
- guildHandler->memberList();
- }
-
- if (localPlayer)
- {
- localPlayer->setGuild(g);
- localPlayer->setGuildName(g->getName());
- }
-}
-
-void GuildHandler::processGuildMemberLogin(Net::MessageIn &msg)
-{
- const BeingId accountId = msg.readBeingId("account id");
- const int charId = msg.readInt32("char id");
- const int online = msg.readInt32("flag");
- const GenderT gender = Being::intToGender(static_cast<uint8_t>(
- msg.readInt16("sex")));
- msg.readInt16("hair");
- msg.readInt16("hair color");
- if (Ea::taGuild)
- {
- GuildMember *const m = Ea::taGuild->getMember(accountId, charId);
- if (m)
- {
- m->setOnline(online);
- if (online)
- m->setGender(gender);
- if (guildTab)
- guildTab->showOnline(m->getName(), fromBool(online, Online));
- if (socialWindow)
- socialWindow->updateGuildCounter();
- }
- }
-}
-
-void GuildHandler::processGuildExpulsion(Net::MessageIn &msg)
-{
- const std::string nick = msg.readString(24, "name");
- msg.readString(40, "message");
-
- processGuildExpulsionContinue(nick);
-}
-
-void GuildHandler::processGuildExpulsionList(Net::MessageIn &msg)
-{
- const int length = msg.readInt16("len");
- if (length < 4)
- return;
-
- const int count = (length - 4) / 64;
-
- for (int i = 0; i < count; i++)
- {
- msg.readString(24, "name");
- msg.readString(40, "message");
- }
-}
-
-void GuildHandler::processGuildEmblem(Net::MessageIn &msg)
-{
- UNIMPLIMENTEDPACKET;
- msg.readBeingId("being id");
- msg.readInt32("guild id");
- msg.readInt16("emblem id");
-}
-
void GuildHandler::requestAlliance(const Being *const being) const
{
if (!being)
diff --git a/src/net/eathena/guildhandler.h b/src/net/eathena/guildhandler.h
index 4f2add867..5d6ed40e0 100644
--- a/src/net/eathena/guildhandler.h
+++ b/src/net/eathena/guildhandler.h
@@ -91,19 +91,6 @@ class GuildHandler final : public Ea::GuildHandler, public MessageHandler
void changeEmblem(std::string emblem) const override final;
void requestEmblem(const int guildId) const override final;
-
- protected:
- static void processGuildUpdateCoords(Net::MessageIn &msg);
-
- static void processGuildPositionInfo(Net::MessageIn &msg);
-
- static void processGuildMemberLogin(Net::MessageIn &msg);
-
- static void processGuildExpulsion(Net::MessageIn &msg);
-
- static void processGuildExpulsionList(Net::MessageIn &msg);
-
- static void processGuildEmblem(Net::MessageIn &msg);
};
} // namespace EAthena
diff --git a/src/net/eathena/guildrecv.cpp b/src/net/eathena/guildrecv.cpp
new file mode 100644
index 000000000..007bff852
--- /dev/null
+++ b/src/net/eathena/guildrecv.cpp
@@ -0,0 +1,152 @@
+/*
+ * The ManaPlus Client
+ * Copyright (C) 2009-2010 The Mana Developers
+ * Copyright (C) 2011-2015 The ManaPlus Developers
+ *
+ * This file is part of The ManaPlus Client.
+ *
+ * This program 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.
+ *
+ * This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "net/eathena/guildrecv.h"
+
+#include "actormanager.h"
+#include "configuration.h"
+
+#include "being/localplayer.h"
+#include "being/playerinfo.h"
+
+#include "gui/windows/chatwindow.h"
+#include "gui/windows/socialwindow.h"
+
+#include "gui/widgets/tabs/chat/guildtab.h"
+
+#include "net/ea/guildrecv.h"
+
+#include "net/eathena/messageout.h"
+#include "net/eathena/protocol.h"
+
+#include "debug.h"
+
+namespace EAthena
+{
+
+void GuildRecv::processGuildUpdateCoords(Net::MessageIn &msg)
+{
+ const BeingId id = msg.readBeingId("account id");
+ const int x = msg.readInt16("x");
+ const int y = msg.readInt16("y");
+ if (Ea::taGuild)
+ {
+ GuildMember *const m = Ea::taGuild->getMember(id);
+ if (m)
+ {
+ m->setX(x);
+ m->setY(y);
+ }
+ }
+}
+
+void GuildRecv::processGuildPositionInfo(Net::MessageIn &msg)
+{
+ const int guildId = msg.readInt32("guild id");
+ const int emblem = msg.readInt32("elblem id");
+ PlayerInfo::setGuildPositionFlags(
+ static_cast<GuildPositionFlags::Type>(msg.readInt32("mode")));
+ msg.readUInt8("guild master");
+ msg.readInt32("unused");
+ std::string guildName = msg.readString(24, "guild name");
+
+ Guild *const g = Guild::getGuild(static_cast<int16_t>(guildId));
+ if (!g)
+ return;
+
+ g->setName(guildName);
+ g->setEmblemId(emblem);
+ if (!Ea::taGuild)
+ Ea::taGuild = g;
+ if (!guildTab && chatWindow)
+ {
+ guildTab = new GuildTab(chatWindow);
+ if (config.getBoolValue("showChatHistory"))
+ guildTab->loadFromLogFile("#Guild");
+ if (localPlayer)
+ localPlayer->addGuild(Ea::taGuild);
+ guildHandler->memberList();
+ }
+
+ if (localPlayer)
+ {
+ localPlayer->setGuild(g);
+ localPlayer->setGuildName(g->getName());
+ }
+}
+
+void GuildRecv::processGuildMemberLogin(Net::MessageIn &msg)
+{
+ const BeingId accountId = msg.readBeingId("account id");
+ const int charId = msg.readInt32("char id");
+ const int online = msg.readInt32("flag");
+ const GenderT gender = Being::intToGender(static_cast<uint8_t>(
+ msg.readInt16("sex")));
+ msg.readInt16("hair");
+ msg.readInt16("hair color");
+ if (Ea::taGuild)
+ {
+ GuildMember *const m = Ea::taGuild->getMember(accountId, charId);
+ if (m)
+ {
+ m->setOnline(online);
+ if (online)
+ m->setGender(gender);
+ if (guildTab)
+ guildTab->showOnline(m->getName(), fromBool(online, Online));
+ if (socialWindow)
+ socialWindow->updateGuildCounter();
+ }
+ }
+}
+
+void GuildRecv::processGuildExpulsion(Net::MessageIn &msg)
+{
+ const std::string nick = msg.readString(24, "name");
+ msg.readString(40, "message");
+
+ Ea::GuildRecv::processGuildExpulsionContinue(nick);
+}
+
+void GuildRecv::processGuildExpulsionList(Net::MessageIn &msg)
+{
+ const int length = msg.readInt16("len");
+ if (length < 4)
+ return;
+
+ const int count = (length - 4) / 64;
+
+ for (int i = 0; i < count; i++)
+ {
+ msg.readString(24, "name");
+ msg.readString(40, "message");
+ }
+}
+
+void GuildRecv::processGuildEmblem(Net::MessageIn &msg)
+{
+ UNIMPLIMENTEDPACKET;
+ msg.readBeingId("being id");
+ msg.readInt32("guild id");
+ msg.readInt16("emblem id");
+}
+
+} // namespace EAthena
diff --git a/src/net/eathena/guildrecv.h b/src/net/eathena/guildrecv.h
new file mode 100644
index 000000000..57bb18f49
--- /dev/null
+++ b/src/net/eathena/guildrecv.h
@@ -0,0 +1,47 @@
+/*
+ * The ManaPlus Client
+ * Copyright (C) 2009-2010 The Mana Developers
+ * Copyright (C) 2011-2015 The ManaPlus Developers
+ *
+ * This file is part of The ManaPlus Client.
+ *
+ * This program 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.
+ *
+ * This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef NET_EATHENA_GUILDRECV_H
+#define NET_EATHENA_GUILDRECV_H
+
+#include "net/ea/guildhandler.h"
+
+#include "net/eathena/messagehandler.h"
+
+namespace EAthena
+{
+ namespace GuildRecv
+ {
+ void processGuildUpdateCoords(Net::MessageIn &msg);
+ void processGuildPositionInfo(Net::MessageIn &msg);
+ void processGuildMemberLogin(Net::MessageIn &msg);
+ void processGuildExpulsion(Net::MessageIn &msg);
+ void processGuildExpulsionList(Net::MessageIn &msg);
+ void processGuildEmblem(Net::MessageIn &msg);
+ } // namespace GuildRecv
+} // namespace EAthena
+
+namespace Ea
+{
+ extern Guild *taGuild;
+}
+
+#endif // NET_EATHENA_GUILDRECV_H
diff --git a/src/net/tmwa/guildhandler.cpp b/src/net/tmwa/guildhandler.cpp
index 4bd0e800c..40beafcb3 100644
--- a/src/net/tmwa/guildhandler.cpp
+++ b/src/net/tmwa/guildhandler.cpp
@@ -34,6 +34,9 @@
#include "gui/widgets/tabs/chat/guildtab.h"
+#include "net/ea/guildrecv.h"
+
+#include "net/tmwa/guildrecv.h"
#include "net/tmwa/messageout.h"
#include "net/tmwa/protocol.h"
@@ -96,107 +99,107 @@ void GuildHandler::handleMessage(Net::MessageIn &msg)
switch (msg.getId())
{
case SMSG_GUILD_CREATE_RESPONSE:
- processGuildCreateResponse(msg);
+ Ea::GuildRecv::processGuildCreateResponse(msg);
break;
case SMSG_GUILD_POSITION_INFO:
- processGuildPositionInfo(msg);
+ GuildRecv::processGuildPositionInfo(msg);
break;
case SMSG_GUILD_MEMBER_LOGIN:
- processGuildMemberLogin(msg);
+ GuildRecv::processGuildMemberLogin(msg);
break;
case SMSG_GUILD_MASTER_OR_MEMBER:
- processGuildMasterOrMember(msg);
+ Ea::GuildRecv::processGuildMasterOrMember(msg);
break;
case SMSG_GUILD_BASIC_INFO:
- processGuildBasicInfo(msg);
+ Ea::GuildRecv::processGuildBasicInfo(msg);
break;
case SMSG_GUILD_ALIANCE_INFO:
- processGuildAlianceInfo(msg);
+ Ea::GuildRecv::processGuildAlianceInfo(msg);
break;
case SMSG_GUILD_MEMBER_LIST:
- processGuildMemberList(msg);
+ Ea::GuildRecv::processGuildMemberList(msg);
break;
case SMSG_GUILD_POS_NAME_LIST:
- processGuildPosNameList(msg);
+ Ea::GuildRecv::processGuildPosNameList(msg);
break;
case SMSG_GUILD_POS_INFO_LIST:
- processGuildPosInfoList(msg);
+ Ea::GuildRecv::processGuildPosInfoList(msg);
break;
case SMSG_GUILD_POSITION_CHANGED:
- processGuildPositionChanged(msg);
+ Ea::GuildRecv::processGuildPositionChanged(msg);
break;
case SMSG_GUILD_MEMBER_POS_CHANGE:
- processGuildMemberPosChange(msg);
+ Ea::GuildRecv::processGuildMemberPosChange(msg);
break;
case SMSG_GUILD_EMBLEM_DATA:
- processGuildEmblemData(msg);
+ Ea::GuildRecv::processGuildEmblemData(msg);
break;
case SMSG_GUILD_SKILL_INFO:
- processGuildSkillInfo(msg);
+ Ea::GuildRecv::processGuildSkillInfo(msg);
break;
case SMSG_GUILD_NOTICE:
- processGuildNotice(msg);
+ Ea::GuildRecv::processGuildNotice(msg);
break;
case SMSG_GUILD_INVITE:
- processGuildInvite(msg);
+ Ea::GuildRecv::processGuildInvite(msg);
break;
case SMSG_GUILD_INVITE_ACK:
- processGuildInviteAck(msg);
+ Ea::GuildRecv::processGuildInviteAck(msg);
break;
case SMSG_GUILD_LEAVE:
- processGuildLeave(msg);
+ Ea::GuildRecv::processGuildLeave(msg);
break;
case SMSG_GUILD_EXPULSION:
- processGuildExpulsion(msg);
+ GuildRecv::processGuildExpulsion(msg);
break;
case SMSG_GUILD_EXPULSION_LIST:
- processGuildExpulsionList(msg);
+ GuildRecv::processGuildExpulsionList(msg);
break;
case SMSG_GUILD_MESSAGE:
- processGuildMessage(msg);
+ Ea::GuildRecv::processGuildMessage(msg);
break;
case SMSG_GUILD_SKILL_UP:
- processGuildSkillUp(msg);
+ Ea::GuildRecv::processGuildSkillUp(msg);
break;
case SMSG_GUILD_REQ_ALLIANCE:
- processGuildReqAlliance(msg);
+ Ea::GuildRecv::processGuildReqAlliance(msg);
break;
case SMSG_GUILD_REQ_ALLIANCE_ACK:
- processGuildReqAllianceAck(msg);
+ Ea::GuildRecv::processGuildReqAllianceAck(msg);
break;
case SMSG_GUILD_DEL_ALLIANCE:
- processGuildDelAlliance(msg);
+ Ea::GuildRecv::processGuildDelAlliance(msg);
break;
case SMSG_GUILD_OPPOSITION_ACK:
- processGuildOppositionAck(msg);
+ Ea::GuildRecv::processGuildOppositionAck(msg);
break;
case SMSG_GUILD_BROKEN:
- processGuildBroken(msg);
+ Ea::GuildRecv::processGuildBroken(msg);
break;
default:
@@ -305,7 +308,7 @@ void GuildHandler::info()
// 3 = skill info
// 4 = expulsion list
- showBasicInfo = true;
+ Ea::GuildRecv::showBasicInfo = true;
createOutPacket(CMSG_GUILD_REQUEST_INFO);
outMsg.writeInt32(0, "action"); // Request basic info
}
@@ -338,99 +341,6 @@ void GuildHandler::checkMaster() const
createOutPacket(CMSG_GUILD_CHECK_MASTER);
}
-void GuildHandler::processGuildPositionInfo(Net::MessageIn &msg)
-{
- const int guildId = msg.readInt32("guild id");
- const int emblem = msg.readInt32("emblem");
- const int posMode = msg.readInt32("position");
- msg.readInt32("unused");
- msg.readUInt8("usused");
- std::string guildName = msg.readString(24, "guild name");
-
- PlayerInfo::setGuildPositionFlags(GuildPositionFlags::Invite);
-
- Guild *const g = Guild::getGuild(static_cast<int16_t>(guildId));
- if (!g)
- return;
-
- g->setName(guildName);
- g->setEmblemId(emblem);
- if (!Ea::taGuild)
- Ea::taGuild = g;
- if (!guildTab && chatWindow)
- {
- guildTab = new GuildTab(chatWindow);
- if (config.getBoolValue("showChatHistory"))
- guildTab->loadFromLogFile("#Guild");
- if (localPlayer)
- localPlayer->addGuild(Ea::taGuild);
- guildHandler->memberList();
- }
-
- if (localPlayer)
- {
- localPlayer->setGuild(g);
- localPlayer->setGuildName(g->getName());
- }
-
- logger->log("Guild position info: %d %d %d %s\n", guildId,
- emblem, posMode, guildName.c_str());
-}
-
-void GuildHandler::processGuildMemberLogin(Net::MessageIn &msg)
-{
- const BeingId accountId = msg.readBeingId("account id");
- const int charId = msg.readInt32("char id");
- const int online = msg.readInt32("flag");
- if (Ea::taGuild)
- {
- GuildMember *const m = Ea::taGuild->getMember(accountId, charId);
- if (m)
- {
- m->setOnline(online);
- if (guildTab)
- guildTab->showOnline(m->getName(), fromBool(online, Online));
- if (socialWindow)
- socialWindow->updateGuildCounter();
- }
- }
-}
-
-void GuildHandler::processGuildExpulsion(Net::MessageIn &msg)
-{
- std::string nick;
- if (serverFeatures->haveNewGuild())
- {
- nick = msg.readString(24, "name");
- msg.readString(40, "reason");
- msg.readString(24, "kicker name");
- }
- else
- {
- msg.readInt16("len?");
- nick = msg.readString(24, "name?");
- msg.skip(24, "player name");
- msg.readString(44, "message");
- }
- processGuildExpulsionContinue(nick);
-}
-
-void GuildHandler::processGuildExpulsionList(Net::MessageIn &msg)
-{
- const int length = msg.readInt16("len");
- if (length < 4)
- return;
-
- const int count = (length - 4) / 88;
-
- for (int i = 0; i < count; i++)
- {
- msg.readString(24, "name of expulsed");
- msg.readString(24, "name of expluser");
- msg.readString(24, "message");
- }
-}
-
void GuildHandler::requestAlliance(const Being *const being A_UNUSED) const
{
}
diff --git a/src/net/tmwa/guildhandler.h b/src/net/tmwa/guildhandler.h
index 2c27ac3f5..7bc9e5fef 100644
--- a/src/net/tmwa/guildhandler.h
+++ b/src/net/tmwa/guildhandler.h
@@ -91,15 +91,6 @@ class GuildHandler final : public Ea::GuildHandler, public MessageHandler
void changeEmblem(std::string emblem) const override final;
void requestEmblem(const int guildId) const override final;
-
- protected:
- static void processGuildPositionInfo(Net::MessageIn &msg);
-
- static void processGuildMemberLogin(Net::MessageIn &msg);
-
- static void processGuildExpulsion(Net::MessageIn &msg);
-
- static void processGuildExpulsionList(Net::MessageIn &msg);
};
} // namespace TmwAthena
diff --git a/src/net/tmwa/guildrecv.cpp b/src/net/tmwa/guildrecv.cpp
new file mode 100644
index 000000000..8e547d6b5
--- /dev/null
+++ b/src/net/tmwa/guildrecv.cpp
@@ -0,0 +1,140 @@
+/*
+ * The ManaPlus Client
+ * Copyright (C) 2009-2010 The Mana Developers
+ * Copyright (C) 2011-2015 The ManaPlus Developers
+ *
+ * This file is part of The ManaPlus Client.
+ *
+ * This program 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.
+ *
+ * This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "net/tmwa/guildrecv.h"
+
+#include "actormanager.h"
+#include "configuration.h"
+
+#include "being/localplayer.h"
+#include "being/playerinfo.h"
+
+#include "gui/windows/chatwindow.h"
+#include "gui/windows/socialwindow.h"
+
+#include "net/serverfeatures.h"
+
+#include "gui/widgets/tabs/chat/guildtab.h"
+
+#include "net/ea/guildrecv.h"
+
+#include "net/tmwa/messageout.h"
+#include "net/tmwa/protocol.h"
+
+#include "debug.h"
+
+namespace TmwAthena
+{
+
+void GuildRecv::processGuildPositionInfo(Net::MessageIn &msg)
+{
+ const int guildId = msg.readInt32("guild id");
+ const int emblem = msg.readInt32("emblem");
+ const int posMode = msg.readInt32("position");
+ msg.readInt32("unused");
+ msg.readUInt8("usused");
+ std::string guildName = msg.readString(24, "guild name");
+
+ PlayerInfo::setGuildPositionFlags(GuildPositionFlags::Invite);
+
+ Guild *const g = Guild::getGuild(static_cast<int16_t>(guildId));
+ if (!g)
+ return;
+
+ g->setName(guildName);
+ g->setEmblemId(emblem);
+ if (!Ea::taGuild)
+ Ea::taGuild = g;
+ if (!guildTab && chatWindow)
+ {
+ guildTab = new GuildTab(chatWindow);
+ if (config.getBoolValue("showChatHistory"))
+ guildTab->loadFromLogFile("#Guild");
+ if (localPlayer)
+ localPlayer->addGuild(Ea::taGuild);
+ guildHandler->memberList();
+ }
+
+ if (localPlayer)
+ {
+ localPlayer->setGuild(g);
+ localPlayer->setGuildName(g->getName());
+ }
+
+ logger->log("Guild position info: %d %d %d %s\n", guildId,
+ emblem, posMode, guildName.c_str());
+}
+
+void GuildRecv::processGuildMemberLogin(Net::MessageIn &msg)
+{
+ const BeingId accountId = msg.readBeingId("account id");
+ const int charId = msg.readInt32("char id");
+ const int online = msg.readInt32("flag");
+ if (Ea::taGuild)
+ {
+ GuildMember *const m = Ea::taGuild->getMember(accountId, charId);
+ if (m)
+ {
+ m->setOnline(online);
+ if (guildTab)
+ guildTab->showOnline(m->getName(), fromBool(online, Online));
+ if (socialWindow)
+ socialWindow->updateGuildCounter();
+ }
+ }
+}
+
+void GuildRecv::processGuildExpulsion(Net::MessageIn &msg)
+{
+ std::string nick;
+ if (serverFeatures->haveNewGuild())
+ {
+ nick = msg.readString(24, "name");
+ msg.readString(40, "reason");
+ msg.readString(24, "kicker name");
+ }
+ else
+ {
+ msg.readInt16("len?");
+ nick = msg.readString(24, "name?");
+ msg.skip(24, "player name");
+ msg.readString(44, "message");
+ }
+ Ea::GuildRecv::processGuildExpulsionContinue(nick);
+}
+
+void GuildRecv::processGuildExpulsionList(Net::MessageIn &msg)
+{
+ const int length = msg.readInt16("len");
+ if (length < 4)
+ return;
+
+ const int count = (length - 4) / 88;
+
+ for (int i = 0; i < count; i++)
+ {
+ msg.readString(24, "name of expulsed");
+ msg.readString(24, "name of expluser");
+ msg.readString(24, "message");
+ }
+}
+
+} // namespace TmwAthena
diff --git a/src/net/tmwa/guildrecv.h b/src/net/tmwa/guildrecv.h
new file mode 100644
index 000000000..83d25bbaa
--- /dev/null
+++ b/src/net/tmwa/guildrecv.h
@@ -0,0 +1,47 @@
+/*
+ * The ManaPlus Client
+ * Copyright (C) 2009-2010 The Mana Developers
+ * Copyright (C) 2011-2015 The ManaPlus Developers
+ *
+ * This file is part of The ManaPlus Client.
+ *
+ * This program 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.
+ *
+ * This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef NET_TMWA_GUILDRECV_H
+#define NET_TMWA_GUILDRECV_H
+
+#include "net/ea/guildhandler.h"
+
+#include "net/tmwa/messagehandler.h"
+
+namespace TmwAthena
+{
+ namespace GuildRecv
+ {
+ void processGuildPositionInfo(Net::MessageIn &msg);
+ void processGuildMemberLogin(Net::MessageIn &msg);
+ void processGuildExpulsion(Net::MessageIn &msg);
+ void processGuildExpulsionList(Net::MessageIn &msg);
+ } // namespace GuildRecv
+} // namespace TmwAthena
+
+extern GuildTab *guildTab;
+
+namespace Ea
+{
+ extern Guild *taGuild;
+}
+
+#endif // NET_TMWA_GUILDRECV_H