summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/actions/commands.cpp9
-rw-r--r--src/actions/commands.h1
-rw-r--r--src/dyetool/actions/commands.cpp1
-rw-r--r--src/enums/input/inputaction.h1
-rw-r--r--src/gui/popups/popupmenu.cpp5
-rw-r--r--src/input/inputactionmap.h6
-rw-r--r--src/net/adminhandler.h2
-rw-r--r--src/net/eathena/adminhandler.cpp5
-rw-r--r--src/net/eathena/adminhandler.h2
-rw-r--r--src/net/tmwa/adminhandler.cpp4
-rw-r--r--src/net/tmwa/adminhandler.h2
11 files changed, 38 insertions, 0 deletions
diff --git a/src/actions/commands.cpp b/src/actions/commands.cpp
index d23eb5c12..1df8407bf 100644
--- a/src/actions/commands.cpp
+++ b/src/actions/commands.cpp
@@ -1341,4 +1341,13 @@ impHandler(commandSpawnSlave)
return true;
}
+impHandler(commandSpawnClone)
+{
+ const std::string args = event.args;
+ if (args.empty())
+ return false;
+ adminHandler->spawnClone(args);
+ return true;
+}
+
} // namespace Actions
diff --git a/src/actions/commands.h b/src/actions/commands.h
index ebdb73534..7b03da782 100644
--- a/src/actions/commands.h
+++ b/src/actions/commands.h
@@ -113,6 +113,7 @@ namespace Actions
decHandler(commandShowAccountInfo);
decHandler(commandSpawn);
decHandler(commandSpawnSlave);
+ decHandler(commandSpawnClone);
} // namespace Actions
#undef decHandler
diff --git a/src/dyetool/actions/commands.cpp b/src/dyetool/actions/commands.cpp
index ad91220df..b9da16a17 100644
--- a/src/dyetool/actions/commands.cpp
+++ b/src/dyetool/actions/commands.cpp
@@ -113,5 +113,6 @@ impHandlerVoid(locatePlayer)
impHandlerVoid(commandShowAccountInfo)
impHandlerVoid(commandSpawn)
impHandlerVoid(commandSpawnSlave)
+impHandlerVoid(commandSpawnClone)
} // namespace Actions
diff --git a/src/enums/input/inputaction.h b/src/enums/input/inputaction.h
index 4016bd6dd..c0fb202b4 100644
--- a/src/enums/input/inputaction.h
+++ b/src/enums/input/inputaction.h
@@ -642,6 +642,7 @@ enumStart(InputAction)
COMMAND_SHOW_ACCOUNT_INFO,
COMMAND_SPAWN,
COMMAND_SPAWN_SLAVE,
+ COMMAND_SPAWN_CLONE,
TOTAL
}
enumEnd(InputAction);
diff --git a/src/gui/popups/popupmenu.cpp b/src/gui/popups/popupmenu.cpp
index ec5d07a1e..9273240d0 100644
--- a/src/gui/popups/popupmenu.cpp
+++ b/src/gui/popups/popupmenu.cpp
@@ -2699,8 +2699,13 @@ void PopupMenu::showPlayerGMCommands()
// TRANSLATORS: popup menu item
// TRANSLATORS: revive player
mBrowserBox->addRow("revive", _("Revive"));
+ mBrowserBox->addRow("##3---");
+ // TRANSLATORS: popup menu item
+ // TRANSLATORS: spawn player clone
+ mBrowserBox->addRow("/spawnclone 'NAME'", _("Spawn clone"));
if (mBeingId != BeingId_zero)
{
+ mBrowserBox->addRow("##3---");
// TRANSLATORS: popup menu item
// TRANSLATORS: kick player
mBrowserBox->addRow("/kick :'BEINGID'", _("Kick"));
diff --git a/src/input/inputactionmap.h b/src/input/inputactionmap.h
index 8b8e9929b..e615d4cf2 100644
--- a/src/input/inputactionmap.h
+++ b/src/input/inputactionmap.h
@@ -5341,6 +5341,12 @@ static const InputActionData inputActionData
"spawnslave|monsterslave|summon",
UseArgs_true,
Protected_true},
+ {"keyCommandSpawnClone",
+ defaultAction(&Actions::commandSpawnClone),
+ InputCondition::INGAME,
+ "spawnclone|playerclone|clone",
+ UseArgs_true,
+ Protected_true},
};
#undef defaultAction
diff --git a/src/net/adminhandler.h b/src/net/adminhandler.h
index 271d6882e..6ebf7c867 100644
--- a/src/net/adminhandler.h
+++ b/src/net/adminhandler.h
@@ -128,6 +128,8 @@ class AdminHandler notfinal
virtual void spawn(const std::string &name) const = 0;
virtual void spawnSlave(const std::string &name) const = 0;
+
+ virtual void spawnClone(const std::string &name) const = 0;
};
} // namespace Net
diff --git a/src/net/eathena/adminhandler.cpp b/src/net/eathena/adminhandler.cpp
index 5a91149a2..f0f787499 100644
--- a/src/net/eathena/adminhandler.cpp
+++ b/src/net/eathena/adminhandler.cpp
@@ -258,4 +258,9 @@ void AdminHandler::spawnSlave(const std::string &name) const
chatHandler->talk("@summon " + name, GENERAL_CHANNEL);
}
+void AdminHandler::spawnClone(const std::string &name) const
+{
+ chatHandler->talk("@clone " + name, GENERAL_CHANNEL);
+}
+
} // namespace EAthena
diff --git a/src/net/eathena/adminhandler.h b/src/net/eathena/adminhandler.h
index ae89ce38c..505cb16ed 100644
--- a/src/net/eathena/adminhandler.h
+++ b/src/net/eathena/adminhandler.h
@@ -102,6 +102,8 @@ class AdminHandler final : public Ea::AdminHandler
void spawnSlave(const std::string &name) const override final;
+ void spawnClone(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 1b19567d4..914265295 100644
--- a/src/net/tmwa/adminhandler.cpp
+++ b/src/net/tmwa/adminhandler.cpp
@@ -186,4 +186,8 @@ void AdminHandler::spawnSlave(const std::string &name A_UNUSED) const
{
}
+void AdminHandler::spawnClone(const std::string &name A_UNUSED) const
+{
+}
+
} // namespace TmwAthena
diff --git a/src/net/tmwa/adminhandler.h b/src/net/tmwa/adminhandler.h
index c5b5d076c..c3c7cc31e 100644
--- a/src/net/tmwa/adminhandler.h
+++ b/src/net/tmwa/adminhandler.h
@@ -110,6 +110,8 @@ class AdminHandler final : public Ea::AdminHandler
A_CONST;
void spawnSlave(const std::string &name) const override final A_CONST;
+
+ void spawnClone(const std::string &name) const override final A_CONST;
};
} // namespace TmwAthena