diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/CMakeLists.txt | 6 | ||||
-rw-r--r-- | src/Makefile.am | 6 | ||||
-rw-r--r-- | src/net/ea/guildhandler.cpp | 489 | ||||
-rw-r--r-- | src/net/ea/guildhandler.h | 49 | ||||
-rw-r--r-- | src/net/ea/guildrecv.cpp | 538 | ||||
-rw-r--r-- | src/net/ea/guildrecv.h | 68 | ||||
-rw-r--r-- | src/net/eathena/guildhandler.cpp | 170 | ||||
-rw-r--r-- | src/net/eathena/guildhandler.h | 13 | ||||
-rw-r--r-- | src/net/eathena/guildrecv.cpp | 152 | ||||
-rw-r--r-- | src/net/eathena/guildrecv.h | 47 | ||||
-rw-r--r-- | src/net/tmwa/guildhandler.cpp | 150 | ||||
-rw-r--r-- | src/net/tmwa/guildhandler.h | 9 | ||||
-rw-r--r-- | src/net/tmwa/guildrecv.cpp | 140 | ||||
-rw-r--r-- | src/net/tmwa/guildrecv.h | 47 |
14 files changed, 1071 insertions, 813 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 926b7512b..2e5c1345a 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1367,6 +1367,8 @@ SET(SRCS_EVOL net/ea/gamerecv.h net/ea/guildhandler.cpp net/ea/guildhandler.h + net/ea/guildrecv.cpp + net/ea/guildrecv.h net/ea/inventoryhandler.cpp net/ea/inventoryhandler.h net/ea/itemhandler.cpp @@ -1423,6 +1425,8 @@ SET(SRCS_TMWA net/tmwa/guildhandler.h net/tmwa/guildmanager.cpp net/tmwa/guildmanager.h + net/tmwa/guildrecv.cpp + net/tmwa/guildrecv.h net/tmwa/inventoryhandler.cpp net/tmwa/inventoryhandler.h net/tmwa/itemhandler.cpp @@ -1599,6 +1603,8 @@ SET(SRCS_EATHENA net/eathena/generalrecv.h net/eathena/guildhandler.cpp net/eathena/guildhandler.h + net/eathena/guildrecv.cpp + net/eathena/guildrecv.h net/eathena/homunculushandler.cpp net/eathena/homunculushandler.h net/eathena/inventoryhandler.cpp diff --git a/src/Makefile.am b/src/Makefile.am index a73b4a464..df9b030e1 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1209,6 +1209,8 @@ manaplus_SOURCES += main.cpp \ net/ea/gamerecv.h \ net/ea/guildhandler.cpp \ net/ea/guildhandler.h \ + net/ea/guildrecv.cpp \ + net/ea/guildrecv.h \ net/ea/inventoryhandler.cpp \ net/ea/inventoryhandler.h \ net/ea/itemhandler.cpp \ @@ -1266,6 +1268,8 @@ manaplus_SOURCES += \ net/tmwa/guildhandler.h \ net/tmwa/guildmanager.cpp \ net/tmwa/guildmanager.h \ + net/tmwa/guildrecv.cpp \ + net/tmwa/guildrecv.h \ net/tmwa/inventoryhandler.cpp \ net/tmwa/inventoryhandler.h \ net/tmwa/itemhandler.cpp \ @@ -1445,6 +1449,8 @@ manaplus_SOURCES += gui/windows/bankwindow.cpp \ net/eathena/generalrecv.h \ net/eathena/guildhandler.cpp \ net/eathena/guildhandler.h \ + net/eathena/guildrecv.cpp \ + net/eathena/guildrecv.h \ net/eathena/homunculushandler.cpp \ net/eathena/homunculushandler.h \ net/eathena/inventoryhandler.cpp \ 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 |