diff options
author | Andrei Karas <akaras@inbox.ru> | 2018-02-10 01:25:51 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2018-02-11 04:28:43 +0300 |
commit | 219afd10cf1dc8f7e75273706c2de3a06305e637 (patch) | |
tree | 5e1be1c457016104c5ea9bbf0d07ee2f491ef9d8 | |
parent | bdf970bde1ce41aa364fc0065ac0cd23e37ec29f (diff) | |
download | mv-219afd10cf1dc8f7e75273706c2de3a06305e637.tar.gz mv-219afd10cf1dc8f7e75273706c2de3a06305e637.tar.bz2 mv-219afd10cf1dc8f7e75273706c2de3a06305e637.tar.xz mv-219afd10cf1dc8f7e75273706c2de3a06305e637.zip |
Add basic support for clans.
-rw-r--r-- | src/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/Makefile.am | 2 | ||||
-rw-r--r-- | src/enums/gui/chattabtype.h | 3 | ||||
-rw-r--r-- | src/enums/gui/themecolorid.h | 6 | ||||
-rw-r--r-- | src/gui/theme.cpp | 6 | ||||
-rw-r--r-- | src/gui/widgets/tabs/chat/clantab.cpp | 56 | ||||
-rw-r--r-- | src/gui/widgets/tabs/chat/clantab.h | 46 | ||||
-rw-r--r-- | src/gui/widgets/tabs/setup_audio.cpp | 2 | ||||
-rw-r--r-- | src/net/eathena/clanrecv.cpp | 50 | ||||
-rw-r--r-- | src/net/eathena/clanrecv.h | 1 | ||||
-rw-r--r-- | src/net/eathena/generalhandler.cpp | 2 | ||||
-rw-r--r-- | src/progs/manaplus/actions/chat.cpp | 7 | ||||
-rw-r--r-- | src/progs/manaplus/actions/windows.cpp | 2 | ||||
-rw-r--r-- | src/progs/manaplus/client.cpp | 2 | ||||
-rw-r--r-- | src/utils/chatutils.cpp | 6 |
15 files changed, 184 insertions, 9 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 4181bcd5b..2cc8313d8 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -139,6 +139,8 @@ SET(SRCS gui/widgets/tabs/debugwindowtabs.h gui/widgets/tabs/chat/chattab.cpp gui/widgets/tabs/chat/chattab.h + gui/widgets/tabs/chat/clantab.cpp + gui/widgets/tabs/chat/clantab.h gui/widgets/chatinput.h gui/widgets/checkbox.cpp gui/widgets/checkbox.h diff --git a/src/Makefile.am b/src/Makefile.am index a33e140fd..972892ceb 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1129,6 +1129,8 @@ SRC = ${BASE_SRC} \ gui/widgets/tabs/debugwindowtabs.h \ gui/widgets/tabs/chat/chattab.cpp \ gui/widgets/tabs/chat/chattab.h \ + gui/widgets/tabs/chat/clantab.cpp \ + gui/widgets/tabs/chat/clantab.h \ gui/widgets/tabs/chat/gmtab.cpp \ gui/widgets/tabs/chat/gmtab.h \ gui/widgets/tabs/chat/langtab.cpp \ diff --git a/src/enums/gui/chattabtype.h b/src/enums/gui/chattabtype.h index 4c9becfc6..471b41a3f 100644 --- a/src/enums/gui/chattabtype.h +++ b/src/enums/gui/chattabtype.h @@ -42,7 +42,8 @@ enumStart(ChatTabType) BATTLE, LANG, GM, - CHANNEL + CHANNEL, + CLAN } enumEnd(ChatTabType); diff --git a/src/enums/gui/themecolorid.h b/src/enums/gui/themecolorid.h index 9f17960b6..c6d0bc5f2 100644 --- a/src/enums/gui/themecolorid.h +++ b/src/enums/gui/themecolorid.h @@ -88,6 +88,8 @@ enumStart(ThemeColorId) GUILD_SOCIAL_TAB_OUTLINE, GM_CHAT_TAB, GM_CHAT_TAB_OUTLINE, + CLAN_CHAT_TAB, + CLAN_CHAT_TAB_OUTLINE, BATTLE_CHAT_TAB_HIGHLIGHTED, BATTLE_CHAT_TAB_HIGHLIGHTED_OUTLINE, CHANNEL_CHAT_TAB_HIGHLIGHTED, @@ -102,6 +104,8 @@ enumStart(ThemeColorId) GUILD_SOCIAL_TAB_HIGHLIGHTED_OUTLINE, GM_CHAT_TAB_HIGHLIGHTED, GM_CHAT_TAB_HIGHLIGHTED_OUTLINE, + CLAN_CHAT_TAB_HIGHLIGHTED, + CLAN_CHAT_TAB_HIGHLIGHTED_OUTLINE, BATTLE_CHAT_TAB_SELECTED, BATTLE_CHAT_TAB_SELECTED_OUTLINE, CHANNEL_CHAT_TAB_SELECTED, @@ -116,6 +120,8 @@ enumStart(ThemeColorId) GUILD_SOCIAL_TAB_SELECTED_OUTLINE, GM_CHAT_TAB_SELECTED, GM_CHAT_TAB_SELECTED_OUTLINE, + CLAN_CHAT_TAB_SELECTED, + CLAN_CHAT_TAB_SELECTED_OUTLINE, BACKGROUND, BACKGROUND_GRAY, SCROLLBAR_GRAY, diff --git a/src/gui/theme.cpp b/src/gui/theme.cpp index 675ad8e86..4829b6789 100644 --- a/src/gui/theme.cpp +++ b/src/gui/theme.cpp @@ -726,6 +726,8 @@ static int readColorType(const std::string &type) "GUILD_SOCIAL_TAB_OUTLINE", "GM_CHAT_TAB", "GM_CHAT_TAB_OUTLINE", + "CLAN_CHAT_TAB", + "CLAN_CHAT_TAB_OUTLINE", "BATTLE_CHAT_TAB_HIGHLIGHTED", "BATTLE_CHAT_TAB_HIGHLIGHTED_OUTLINE", "CHANNEL_CHAT_TAB_HIGHLIGHTED", @@ -740,6 +742,8 @@ static int readColorType(const std::string &type) "GUILD_SOCIAL_TAB_HIGHLIGHTED_OUTLINE", "GM_CHAT_TAB_HIGHLIGHTED", "GM_CHAT_TAB_HIGHLIGHTED_OUTLINE", + "CLAN_CHAT_TAB_HIGHLIGHTED", + "CLAN_CHAT_TAB_HIGHLIGHTED_OUTLINE", "BATTLE_CHAT_TAB_SELECTED", "BATTLE_CHAT_TAB_SELECTED_OUTLINE", "CHANNEL_CHAT_TAB_SELECTED", @@ -754,6 +758,8 @@ static int readColorType(const std::string &type) "GUILD_SOCIAL_TAB_SELECTED_OUTLINE", "GM_CHAT_TAB_SELECTED", "GM_CHAT_TAB_SELECTED_OUTLINE", + "CLAN_CHAT_TAB_SELECTED", + "CLAN_CHAT_TAB_SELECTED_OUTLINE", "BACKGROUND", "BACKGROUND_GRAY", "SCROLLBAR_GRAY", diff --git a/src/gui/widgets/tabs/chat/clantab.cpp b/src/gui/widgets/tabs/chat/clantab.cpp new file mode 100644 index 000000000..0f34d30c3 --- /dev/null +++ b/src/gui/widgets/tabs/chat/clantab.cpp @@ -0,0 +1,56 @@ +/* + * The ManaPlus Client + * Copyright (C) 2011-2018 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 "gui/widgets/tabs/chat/clantab.h" + +#include "soundmanager.h" + +#include "const/sound.h" + +#include "gui/windows/chatwindow.h" + +#include "net/clanhandler.h" + +#include "utils/gettext.h" + +#include "debug.h" + +ClanTab *clanTab = nullptr; + +ClanTab::ClanTab(const Widget2 *const widget) : + // TRANSLATORS: clan chat tab name + ChatTab(widget, _("Clan"), "", "#Clan", ChatTabType::CLAN) +{ + setTabColors(ThemeColorId::CLAN_CHAT_TAB); +} + +ClanTab::~ClanTab() +{ +} + +void ClanTab::handleInput(const std::string &msg) +{ + clanHandler->chat(ChatWindow::doReplace(msg)); +} + +void ClanTab::playNewMessageSound() const +{ + soundManager.playGuiSound(SOUND_GUILD); +} diff --git a/src/gui/widgets/tabs/chat/clantab.h b/src/gui/widgets/tabs/chat/clantab.h new file mode 100644 index 000000000..0b6b1df13 --- /dev/null +++ b/src/gui/widgets/tabs/chat/clantab.h @@ -0,0 +1,46 @@ +/* + * The ManaPlus Client + * Copyright (C) 2011-2018 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 GUI_WIDGETS_TABS_CHAT_CLANTAB_H +#define GUI_WIDGETS_TABS_CHAT_CLANTAB_H + +#include "gui/widgets/tabs/chat/chattab.h" + +/** + * A tab for a clan chat channel. + */ +class ClanTab final : public ChatTab +{ + public: + explicit ClanTab(const Widget2 *const widget); + + A_DELETE_COPY(ClanTab) + + ~ClanTab() override final; + + void playNewMessageSound() const override final; + + protected: + void handleInput(const std::string &msg) override final; +}; + +extern ClanTab *clanTab; + +#endif // GUI_WIDGETS_TABS_CHAT_CLANTAB_H diff --git a/src/gui/widgets/tabs/setup_audio.cpp b/src/gui/widgets/tabs/setup_audio.cpp index 8d52c4fdb..b11a67287 100644 --- a/src/gui/widgets/tabs/setup_audio.cpp +++ b/src/gui/widgets/tabs/setup_audio.cpp @@ -140,7 +140,7 @@ Setup_Audio::Setup_Audio(const Widget2 *const widget) : 150, OnTheFly_false, MainConfig_true); // TRANSLATORS: settings option - new SetupItemSound(_("Guild / Party message sound"), "", + new SetupItemSound(_("Guild / party / clan message sound"), "", "soundguild", this, "soundguildEvent", mSoundModel, 150, OnTheFly_false, MainConfig_true); diff --git a/src/net/eathena/clanrecv.cpp b/src/net/eathena/clanrecv.cpp index bf16627b2..d70d7d876 100644 --- a/src/net/eathena/clanrecv.cpp +++ b/src/net/eathena/clanrecv.cpp @@ -20,11 +20,19 @@ #include "net/eathena/clanrecv.h" +#include "configuration.h" +#include "logger.h" + #include "being/claninfo.h" +#include "gui/widgets/tabs/chat/clantab.h" + +#include "gui/windows/chatwindow.h" + #include "net/messagein.h" -#include "logger.h" +#include "utils/checkutils.h" +#include "utils/delete2.h" #include "debug.h" @@ -50,6 +58,7 @@ void ClanRecv::processClanInfo(Net::MessageIn &msg) clanInfo.antagonistClans.push_back( msg.readString(24, "antagonist clan name")); } + createTab(); } void ClanRecv::processClanOnlineCount(Net::MessageIn &msg) @@ -58,20 +67,47 @@ void ClanRecv::processClanOnlineCount(Net::MessageIn &msg) clanInfo.totalMembers = msg.readInt16("total members count"); } -void ClanRecv::processClanLeave(Net::MessageIn &msg) +void ClanRecv::processClanLeave(Net::MessageIn &msg A_UNUSED) { - UNIMPLEMENTEDPACKET; + delete2(clanTab); } void ClanRecv::processClanChat(Net::MessageIn &msg) { - UNIMPLEMENTEDPACKET; const int chatMsgLength = msg.readInt16("len") - 4 - 24; if (chatMsgLength <= 0) return; - msg.readInt16("len"); - msg.readString(24, "player name"); - msg.readString(chatMsgLength, "message"); + msg.readString(24, "player name (unused)"); + std::string chatMsg = msg.readString(chatMsgLength, "message"); + if (clanTab == nullptr) + { + reportAlways("received clan chat messages without clan."); + return; + } + 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); + clanTab->chatLog(sender_name, chatMsg); + } + else + { + clanTab->chatLog(chatMsg, + ChatMsgType::BY_SERVER, + IgnoreRecord_false, + TryRemoveColors_true); + } +} + +void ClanRecv::createTab() +{ + if (clanTab != nullptr) + return; + clanTab = new ClanTab(chatWindow); + if (config.getBoolValue("showChatHistory")) + clanTab->loadFromLogFile("#Clan"); } } // namespace EAthena diff --git a/src/net/eathena/clanrecv.h b/src/net/eathena/clanrecv.h index 6f864bfcc..02e3b7d48 100644 --- a/src/net/eathena/clanrecv.h +++ b/src/net/eathena/clanrecv.h @@ -34,6 +34,7 @@ namespace EAthena void processClanOnlineCount(Net::MessageIn &msg); void processClanLeave(Net::MessageIn &msg); void processClanChat(Net::MessageIn &msg); + void createTab(); } // namespace ClanRecv } // namespace EAthena diff --git a/src/net/eathena/generalhandler.cpp b/src/net/eathena/generalhandler.cpp index aaf762d3f..4f1d0c086 100644 --- a/src/net/eathena/generalhandler.cpp +++ b/src/net/eathena/generalhandler.cpp @@ -28,6 +28,7 @@ #include "gui/windows/skilldialog.h" #include "gui/windows/socialwindow.h" +#include "gui/widgets/tabs/chat/clantab.h" #include "gui/widgets/tabs/chat/guildtab.h" #include "gui/widgets/tabs/chat/partytab.h" @@ -243,6 +244,7 @@ void GeneralHandler::gameEnded() const delete2(guildTab); delete2(partyTab); + delete2(clanTab); } } // namespace EAthena diff --git a/src/progs/manaplus/actions/chat.cpp b/src/progs/manaplus/actions/chat.cpp index 0644f9c02..bbfefc826 100644 --- a/src/progs/manaplus/actions/chat.cpp +++ b/src/progs/manaplus/actions/chat.cpp @@ -36,6 +36,7 @@ #include "net/charserverhandler.h" #include "net/chathandler.h" +#include "net/clanhandler.h" #include "net/guildhandler.h" #include "net/net.h" #include "net/partyhandler.h" @@ -74,6 +75,12 @@ static void outString(ChatTab *const tab, switch (tab->getType()) { + case ChatTabType::CLAN: + { + if (clanHandler != nullptr) + clanHandler->chat(str); + break; + } case ChatTabType::PARTY: { if (partyHandler != nullptr) diff --git a/src/progs/manaplus/actions/windows.cpp b/src/progs/manaplus/actions/windows.cpp index 816a1952d..7368ec287 100644 --- a/src/progs/manaplus/actions/windows.cpp +++ b/src/progs/manaplus/actions/windows.cpp @@ -133,6 +133,8 @@ impHandler(helpWindowShow) return showHelpPage("chatgm", true); case ChatTabType::CHANNEL: return showHelpPage("chatchannel", true); + case ChatTabType::CLAN: + return showHelpPage("chatclan", true); default: case ChatTabType::UNKNOWN: case ChatTabType::INPUT: diff --git a/src/progs/manaplus/client.cpp b/src/progs/manaplus/client.cpp index 5946f01d5..f1273c7a1 100644 --- a/src/progs/manaplus/client.cpp +++ b/src/progs/manaplus/client.cpp @@ -34,6 +34,7 @@ #include "soundmanager.h" #include "spellmanager.h" +#include "being/claninfo.h" #include "being/localplayer.h" #include "being/playerinfo.h" #include "being/playerrelations.h" @@ -1985,6 +1986,7 @@ void Client::unloadData() ResourceManager::clearCache(); loginData.clearUpdateHost(); + clanInfo.clear(); serverVersion = 0; packetVersion = 0; tmwServerVersion = 0; diff --git a/src/utils/chatutils.cpp b/src/utils/chatutils.cpp index a47652f9a..0e2d7e2cb 100644 --- a/src/utils/chatutils.cpp +++ b/src/utils/chatutils.cpp @@ -30,6 +30,7 @@ #include "gui/widgets/tabs/chat/whispertab.h" #include "net/chathandler.h" +#include "net/clanhandler.h" #include "net/guildhandler.h" #include "net/partyhandler.h" @@ -59,6 +60,11 @@ void outStringNormal(ChatTab *const tab, switch (tab->getType()) { + case ChatTabType::CLAN: + { + clanHandler->chat(str); + break; + } case ChatTabType::PARTY: { partyHandler->chat(str); |