From 46f4e5fb5c77d01de334e059b88837f8c7fe1f3e Mon Sep 17 00:00:00 2001
From: Andrei Karas <akaras@inbox.ru>
Date: Thu, 25 Feb 2016 22:09:53 +0300
Subject: Add chat command /immortal. Also add it to player context menu.

---
 src/actions/commands.cpp         | 6 ++++++
 src/actions/commands.h           | 1 +
 src/dyetool/actions/commands.cpp | 1 +
 src/enums/input/inputaction.h    | 1 +
 src/gui/popups/popupmenu.cpp     | 4 ++++
 src/input/inputactionmap.h       | 6 ++++++
 src/net/adminhandler.h           | 2 ++
 src/net/eathena/adminhandler.cpp | 5 +++++
 src/net/eathena/adminhandler.h   | 2 ++
 src/net/tmwa/adminhandler.cpp    | 4 ++++
 src/net/tmwa/adminhandler.h      | 2 ++
 11 files changed, 34 insertions(+)

diff --git a/src/actions/commands.cpp b/src/actions/commands.cpp
index 8cc076fba..969807577 100644
--- a/src/actions/commands.cpp
+++ b/src/actions/commands.cpp
@@ -1429,4 +1429,10 @@ impHandler(commandDisguise)
     return true;
 }
 
+impHandler(commandImmortal)
+{
+    adminHandler->immortal(event.args);
+    return true;
+}
+
 }  // namespace Actions
diff --git a/src/actions/commands.h b/src/actions/commands.h
index fa21e942c..1e642ec9e 100644
--- a/src/actions/commands.h
+++ b/src/actions/commands.h
@@ -125,6 +125,7 @@ namespace Actions
     decHandler(commandHeal);
     decHandler(commandAlive);
     decHandler(commandDisguise);
+    decHandler(commandImmortal);
 }  // namespace Actions
 
 #undef decHandler
diff --git a/src/dyetool/actions/commands.cpp b/src/dyetool/actions/commands.cpp
index 9069ee00a..c885e7c48 100644
--- a/src/dyetool/actions/commands.cpp
+++ b/src/dyetool/actions/commands.cpp
@@ -125,5 +125,6 @@ impHandlerVoid(commandKillable)
 impHandlerVoid(commandHeal)
 impHandlerVoid(commandAlive)
 impHandlerVoid(commandDisguise)
+impHandlerVoid(commandImmortal)
 
 }  // namespace Actions
diff --git a/src/enums/input/inputaction.h b/src/enums/input/inputaction.h
index 15ae2db45..6d68d55fb 100644
--- a/src/enums/input/inputaction.h
+++ b/src/enums/input/inputaction.h
@@ -654,6 +654,7 @@ enumStart(InputAction)
     COMMAND_HEAL,
     COMMAND_ALIVE,
     COMMAND_DISGUISE,
+    COMMAND_IMMORTAL,
     TOTAL
 }
 enumEnd(InputAction);
diff --git a/src/gui/popups/popupmenu.cpp b/src/gui/popups/popupmenu.cpp
index e287313d7..20ee37264 100644
--- a/src/gui/popups/popupmenu.cpp
+++ b/src/gui/popups/popupmenu.cpp
@@ -2745,6 +2745,10 @@ void PopupMenu::showPlayerGMCommands()
         // TRANSLATORS: heal player
         mBrowserBox->addRow("/gmheal 'NAME'", _("Heal"));
         // TRANSLATORS: popup menu item
+        // TRANSLATORS: enable immortal mode for player
+        mBrowserBox->addRow("/immortal 'NAME'", _("Immortal"));
+        mBrowserBox->addRow("##3---");
+        // TRANSLATORS: popup menu item
         // TRANSLATORS: set player as killer
         mBrowserBox->addRow("/killer 'NAME'", _("Killer"));
         // TRANSLATORS: popup menu item
diff --git a/src/input/inputactionmap.h b/src/input/inputactionmap.h
index cf2e882fc..d42fda40d 100644
--- a/src/input/inputactionmap.h
+++ b/src/input/inputactionmap.h
@@ -5413,6 +5413,12 @@ static const InputActionData inputActionData
         "disguise",
         UseArgs_true,
         Protected_true},
+    {"keyCommandImmortal",
+        defaultAction(&Actions::commandImmortal),
+        InputCondition::INGAME,
+        "immortal",
+        UseArgs_true,
+        Protected_true},
 };
 
 #undef defaultAction
diff --git a/src/net/adminhandler.h b/src/net/adminhandler.h
index 72b5157da..ab38cdb1a 100644
--- a/src/net/adminhandler.h
+++ b/src/net/adminhandler.h
@@ -150,6 +150,8 @@ class AdminHandler notfinal
         virtual void heal(const std::string &name) const = 0;
 
         virtual void disguise(const std::string &name) const = 0;
+
+        virtual void immortal(const std::string &name) const = 0;
 };
 
 }  // namespace Net
diff --git a/src/net/eathena/adminhandler.cpp b/src/net/eathena/adminhandler.cpp
index bf97226b3..8912750f4 100644
--- a/src/net/eathena/adminhandler.cpp
+++ b/src/net/eathena/adminhandler.cpp
@@ -295,4 +295,9 @@ void AdminHandler::disguise(const std::string &name) const
     Gm::runCommand("disguise", name);
 }
 
+void AdminHandler::immortal(const std::string &name) const
+{
+    Gm::runCharCommand("monsterignore", name);
+}
+
 }  // namespace EAthena
diff --git a/src/net/eathena/adminhandler.h b/src/net/eathena/adminhandler.h
index d495f2aad..79ad2143e 100644
--- a/src/net/eathena/adminhandler.h
+++ b/src/net/eathena/adminhandler.h
@@ -126,6 +126,8 @@ class AdminHandler final : public Ea::AdminHandler
 
         void disguise(const std::string &name) const override final;
 
+        void immortal(const std::string &name) const override final;
+
     protected:
         static std::string mStatsName;
 };
diff --git a/src/net/tmwa/adminhandler.cpp b/src/net/tmwa/adminhandler.cpp
index 8d1276f6e..6bcfcc66f 100644
--- a/src/net/tmwa/adminhandler.cpp
+++ b/src/net/tmwa/adminhandler.cpp
@@ -232,4 +232,8 @@ void AdminHandler::disguise(const std::string &name A_UNUSED) const
 {
 }
 
+void AdminHandler::immortal(const std::string &name A_UNUSED) const
+{
+}
+
 }  // namespace TmwAthena
diff --git a/src/net/tmwa/adminhandler.h b/src/net/tmwa/adminhandler.h
index 0a5e034f7..56511f7a8 100644
--- a/src/net/tmwa/adminhandler.h
+++ b/src/net/tmwa/adminhandler.h
@@ -138,6 +138,8 @@ class AdminHandler final : public Ea::AdminHandler
         void alive(const std::string &name) const override final;
 
         void disguise(const std::string &name) const override final;
+
+        void immortal(const std::string &name) const override final;
 };
 
 }  // namespace TmwAthena
-- 
cgit v1.2.3-70-g09d2