summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2018-02-10 01:25:51 +0300
committerAndrei Karas <akaras@inbox.ru>2018-02-11 04:28:43 +0300
commit219afd10cf1dc8f7e75273706c2de3a06305e637 (patch)
tree5e1be1c457016104c5ea9bbf0d07ee2f491ef9d8
parentbdf970bde1ce41aa364fc0065ac0cd23e37ec29f (diff)
downloadmanaverse-219afd10cf1dc8f7e75273706c2de3a06305e637.tar.gz
manaverse-219afd10cf1dc8f7e75273706c2de3a06305e637.tar.bz2
manaverse-219afd10cf1dc8f7e75273706c2de3a06305e637.tar.xz
manaverse-219afd10cf1dc8f7e75273706c2de3a06305e637.zip
Add basic support for clans.
-rw-r--r--src/CMakeLists.txt2
-rw-r--r--src/Makefile.am2
-rw-r--r--src/enums/gui/chattabtype.h3
-rw-r--r--src/enums/gui/themecolorid.h6
-rw-r--r--src/gui/theme.cpp6
-rw-r--r--src/gui/widgets/tabs/chat/clantab.cpp56
-rw-r--r--src/gui/widgets/tabs/chat/clantab.h46
-rw-r--r--src/gui/widgets/tabs/setup_audio.cpp2
-rw-r--r--src/net/eathena/clanrecv.cpp50
-rw-r--r--src/net/eathena/clanrecv.h1
-rw-r--r--src/net/eathena/generalhandler.cpp2
-rw-r--r--src/progs/manaplus/actions/chat.cpp7
-rw-r--r--src/progs/manaplus/actions/windows.cpp2
-rw-r--r--src/progs/manaplus/client.cpp2
-rw-r--r--src/utils/chatutils.cpp6
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);