From 44ef6547161dd3cd2e1bb4053bb5e8619e6dc0d0 Mon Sep 17 00:00:00 2001
From: Andrei Karas <akaras@inbox.ru>
Date: Sun, 4 Mar 2018 01:39:30 +0300
Subject: Add support for hightlight attribute in groups.xml

This attribute allow to highlight gm groups based on groups.xml
---
 src/being/being.cpp            |  6 ++++++
 src/being/localplayer.cpp      |  7 +------
 src/net/eathena/beingrecv.cpp  |  4 ----
 src/net/eathena/playerrecv.cpp |  4 ----
 src/net/tmwa/beingrecv.cpp     | 19 ++++---------------
 src/resources/db/groupdb.cpp   | 14 ++++++++++++++
 src/resources/db/groupdb.h     |  1 +
 src/resources/groupinfo.cpp    |  3 ++-
 src/resources/groupinfo.h      |  1 +
 9 files changed, 29 insertions(+), 30 deletions(-)

diff --git a/src/being/being.cpp b/src/being/being.cpp
index 3b012fd90..d447221f8 100644
--- a/src/being/being.cpp
+++ b/src/being/being.cpp
@@ -5586,5 +5586,11 @@ void Being::setGroupId(const int id)
     {
         mGroupId = id;
         showGmBadge(id != 0);
+        const bool gm = GroupDb::getHighlightName(mGroupId);
+        if (mIsGM != gm)
+        {
+            mIsGM = gm;
+            updateColors();
+        }
     }
 }
diff --git a/src/being/localplayer.cpp b/src/being/localplayer.cpp
index 9f805b21a..240228068 100644
--- a/src/being/localplayer.cpp
+++ b/src/being/localplayer.cpp
@@ -422,19 +422,14 @@ void LocalPlayer::setGroupId(const int id)
 {
     Being::setGroupId(id);
 
-    if (id > 0)
+    if (mIsGM != 0)
     {
-        setGM(true);
         if (chatWindow != nullptr)
         {
             chatWindow->loadGMCommands();
             chatWindow->showGMTab();
         }
     }
-    else
-    {
-        setGM(false);
-    }
     if (statusWindow != nullptr)
         statusWindow->updateLevelLabel();
 }
diff --git a/src/net/eathena/beingrecv.cpp b/src/net/eathena/beingrecv.cpp
index 313c2872b..535f65091 100644
--- a/src/net/eathena/beingrecv.cpp
+++ b/src/net/eathena/beingrecv.cpp
@@ -1783,10 +1783,6 @@ void BeingRecv::processBeingAttrs(Net::MessageIn &msg)
             dstBeing != localPlayer)
         {
             dstBeing->setGroupId(groupId);
-            if (groupId != 0)
-                dstBeing->setGM(true);
-            else
-                dstBeing->setGM(false);
         }
         dstBeing->setHorse(mount);
         dstBeing->setLanguageId(language);
diff --git a/src/net/eathena/playerrecv.cpp b/src/net/eathena/playerrecv.cpp
index d9f85f45b..a85b53c60 100644
--- a/src/net/eathena/playerrecv.cpp
+++ b/src/net/eathena/playerrecv.cpp
@@ -531,10 +531,6 @@ void PlayerRecv::processPlayerAttrs(Net::MessageIn &msg)
         return;
 
     localPlayer->setGroupId(groupId);
-    if (groupId > 0)
-        localPlayer->setGM(true);
-    else
-        localPlayer->setGM(false);
 }
 
 void PlayerRecv::processPlayerStatUpdate7(Net::MessageIn &msg)
diff --git a/src/net/tmwa/beingrecv.cpp b/src/net/tmwa/beingrecv.cpp
index c47b3e2c7..a40bcd1aa 100644
--- a/src/net/tmwa/beingrecv.cpp
+++ b/src/net/tmwa/beingrecv.cpp
@@ -64,25 +64,14 @@ namespace TmwAthena
 static void setGm(Being *const dstBeing,
                   const uint16_t gmstatus)
 {
-    if (dstBeing != localPlayer)
+    if (dstBeing != localPlayer &&
+        gmstatus == 0x80)
     {
-        if (gmstatus == 0x80)
-        {
-            dstBeing->setGroupId(paths.getIntValue("gmDefaultLevel"));
-            dstBeing->setGM(true);
-        }
-        else
-        {
-            dstBeing->setGroupId(gmstatus);
-            dstBeing->setGM(gmstatus != 0);
-        }
+        dstBeing->setGroupId(paths.getIntValue("gmDefaultLevel"));
     }
     else
     {
-        if (gmstatus != 0)
-            dstBeing->setGM(true);
-        else
-            dstBeing->setGM(false);
+        dstBeing->setGroupId(gmstatus);
     }
 }
 
diff --git a/src/resources/db/groupdb.cpp b/src/resources/db/groupdb.cpp
index e09e773aa..1d1d1bffa 100644
--- a/src/resources/db/groupdb.cpp
+++ b/src/resources/db/groupdb.cpp
@@ -314,6 +314,9 @@ void GroupDb::loadXmlFile(const std::string &fileName,
             group->showBadge = XML::getBoolProperty(node,
                 "showBadge",
                 false);
+            group->highlightName = XML::getBoolProperty(node,
+                "highlightName",
+                false);
             loadSubNodes(node, id, group);
             parseInherit(node, id, group);
         }
@@ -364,6 +367,17 @@ bool GroupDb::getShowBadge(const int id)
     return (*it).second->showBadge;
 }
 
+bool GroupDb::getHighlightName(const int id)
+{
+    GroupInfos::const_iterator it = mGroups.find(id);
+    if (it == mGroups.end())
+    {
+        reportAlways("Unknown group id requested: %d", id);
+        return mEmptyGroup.highlightName;
+    }
+    return (*it).second->highlightName;
+}
+
 const std::string &GroupDb::getBadge(const int id)
 {
     GroupInfos::const_iterator it = mGroups.find(id);
diff --git a/src/resources/db/groupdb.h b/src/resources/db/groupdb.h
index a8fd1dcf3..f447baa96 100644
--- a/src/resources/db/groupdb.h
+++ b/src/resources/db/groupdb.h
@@ -41,6 +41,7 @@ namespace GroupDb
     const std::string &getName(const int id) A_WARN_UNUSED;
     const std::string &getLongName(const int id) A_WARN_UNUSED;
     bool getShowBadge(const int id) A_WARN_UNUSED;
+    bool getHighlightName(const int id) A_WARN_UNUSED;
     const std::string &getBadge(const int id) A_WARN_UNUSED;
     const GroupInfo *getGroup(const int id) A_WARN_UNUSED RETURNS_NONNULL;
 
diff --git a/src/resources/groupinfo.cpp b/src/resources/groupinfo.cpp
index 1f0198723..e951330a3 100644
--- a/src/resources/groupinfo.cpp
+++ b/src/resources/groupinfo.cpp
@@ -28,7 +28,8 @@ GroupInfo::GroupInfo() :
     name(),
     longName(),
     badge(),
-    showBadge(false)
+    showBadge(false),
+    highlightName(false)
 {
     for (size_t f = 0; f < CAST_SIZE(ServerCommandType::Max); f ++)
         mCommands[f] = ServerCommandEnable::No;
diff --git a/src/resources/groupinfo.h b/src/resources/groupinfo.h
index 7ef72000f..1162b71e5 100644
--- a/src/resources/groupinfo.h
+++ b/src/resources/groupinfo.h
@@ -45,6 +45,7 @@ struct GroupInfo final
     std::string longName;
     std::string badge;
     bool showBadge;
+    bool highlightName;
 };
 
 #endif  // RESOURCES_GROUPINFO_H
-- 
cgit v1.2.3-70-g09d2