--- deliantra/server/server/commands.C 2008/12/19 22:47:30 1.55
+++ deliantra/server/server/commands.C 2018/11/17 23:40:03 1.75
@@ -1,34 +1,30 @@
/*
* This file is part of Deliantra, the Roguelike Realtime MMORPG.
- *
- * Copyright (©) 2005,2006,2007,2008 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
- * Copyright (©) 2002,2007 Mark Wedel & Crossfire Development Team
- * Copyright (©) 1992,2007 Frank Tore Johansen
- *
- * Deliantra 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 3 of the License, or
- * (at your option) any later version.
- *
+ *
+ * Copyright (©) 2017,2018 Marc Alexander Lehmann / the Deliantra team
+ * Copyright (©) 2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
+ * Copyright (©) 2002 Mark Wedel & Crossfire Development Team
+ * Copyright (©) 1992 Frank Tore Johansen
+ *
+ * Deliantra is free software: you can redistribute it and/or modify it under
+ * the terms of the Affero GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) 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 .
- *
+ *
+ * You should have received a copy of the Affero GNU General Public License
+ * and the GNU General Public License along with this program. If not, see
+ * .
+ *
* The authors can be reached via e-mail to
*/
-/*
- * Command parser
- */
-
-#include
-
+/* This file deals with administrative commands from the client. */
#include
-#include
#include
/* Added times to all the commands. However, this was quickly done,
@@ -36,18 +32,23 @@
* take 0 time.
*/
+typedef int (*CommFunc)(object *op, char *params);
+
+struct CommArray_s { /* global list's structure */
+ const char *name;
+ CommFunc func;
+ float time; /* How long it takes to execute this command */
+};
+
/*
* Normal game commands
*/
-CommArray_s Commands[] = {
+static CommArray_s Commands[] = {
{"party", command_party, 1.0},
{"gsay", command_gsay, 1.0},
{"apply", command_apply, 1.0}, /* should be variable */
{"cast", command_cast, 1.0}, /* Is this right? */
- {"disarm", command_disarm, 1.0},
- {"dm", command_dm, 0.0},
- {"dmhide", command_dmhide, 0.0}, /* Like dm, but don't tell a dm arrived, hide player */
{"drop", command_drop, 1.0},
{"dropall", command_dropall, 0.5 / TICK},
{"examine", command_examine, 0.5 / TICK},
@@ -55,15 +56,15 @@
{"get", command_take, 1.0},
{"invoke", command_invoke, 1.0},
{"killpets", command_kill_pets, 1.0},
- {"motd", command_motd, 0.5 / TICK},
+ {"lock", command_lock, 1.0}, /* locks items in inventory with command line or macro */
{"pickup", command_pickup, 1.0},
{"prepare", command_prepare, 1.0},
{"resistances", command_resistances, 1.0},
{"rotateshoottype", command_rotateshoottype, 1.0},
{"skills", command_skills, 0.5 / TICK}, /* shows player list of skills */
+ {"unlock", command_unlock, 1.0}, /* unlock items in inventory with command line or in macro */
{"use_skill", command_uskill, 1.0},
{"ready_skill", command_rskill, 1.0},
- {"search", command_search, 1.0},
{"search-items", command_search_items, 1.0},
{"showpets", command_showpets, 1.0},
{"statistics", command_statistics, 1.0},
@@ -84,13 +85,19 @@
{"southeast", command_southeast, 0.0},
{"southwest", command_southwest, 0.0},
{"northwest", command_northwest, 0.0},
+
+ {"mark" , command_mark , 0.0},
+ {"run" , command_run , 0.0},
+ {"run_stop" , command_run_stop , 0.0},
+ {"fire" , command_fire , 0.0},
+ {"fire_stop", command_fire_stop, 0.0},
};
-const int CommandsSize = sizeof (Commands) / sizeof (CommArray_s);
+static const int CommandsSize = array_length (Commands);
/*
* Wizard commands (for both)
*/
-CommArray_s WizCommands[] = {
+static CommArray_s WizCommands[] = {
{"abil", command_abil, 0.0},
{"addexp", command_addexp, 0.0},
{"arrest", command_arrest, 0.0},
@@ -98,18 +105,14 @@
{"debug", command_debug, 0.0},
{"dump", command_dump, 0.0},
{"dumpbelow", command_dumpbelow, 0.0},
- {"dumpfriendlyobjects", command_dumpfriendlyobjects, 0.0},
{"forget_spell", command_forget_spell, 0.0},
{"free", command_free, 0.0},
{"freeze", command_freeze, 0.0},
- {"hide", command_hide, 0.0},
{"insert_into", command_insert_into, 0.0},
{"inventory", command_inventory, 0.0},
{"invisible", command_invisible, 0.0},
{"learn_special_prayer", command_learn_special_prayer, 0.0},
{"learn_spell", command_learn_spell, 0.0},
- {"nodm", command_nowiz, 0.0},
- {"nowiz", command_nowiz, 0.0},
{"patch", command_patch, 0.0},
{"remove", command_remove, 0.0},
{"set_god", command_setgod, 0.0},
@@ -121,7 +124,7 @@
{"summon", command_summon, 0.0},
//{"overlay_save", command_save_overlay, 0.0},
};
-const int WizCommandsSize = sizeof (WizCommands) / sizeof (CommArray_s);
+static const int WizCommandsSize = array_length (WizCommands);
static int
compare_A (const void *a, const void *b)
@@ -129,10 +132,67 @@
return strcmp (((CommArray_s *)a)->name, ((CommArray_s *)b)->name);
}
+static struct init_commands
+{
+ init_commands ()
+ {
+ qsort (Commands, CommandsSize, sizeof (CommArray_s), compare_A);
+ qsort (WizCommands, WizCommandsSize, sizeof (CommArray_s), compare_A);
+ }
+} init_commands;
+
+static CommArray_s *
+find_command_element (char *cmd, CommArray_s *commarray, int commsize)
+{
+ CommArray_s *asp, dummy;
+
+ dummy.name = cmd;
+ asp = (CommArray_s *)bsearch ((void *)&dummy, (void *)commarray, commsize, sizeof (CommArray_s), compare_A);
+ return asp;
+}
+
+/* This function is called from the new client/server code.
+ * pl is the player who is issuing the command, command is the
+ * command.
+ */
void
-init_commands (void)
+execute_newserver_command (object *pl, char *command)
{
- qsort (Commands, CommandsSize, sizeof (CommArray_s), compare_A);
- qsort (WizCommands, WizCommandsSize, sizeof (CommArray_s), compare_A);
+ CommArray_s *csp;
+ char *cp;
+
+ /*
+ * remove trailing spaces from command
+ */
+ cp = command + strlen (command) - 1;
+ while ((cp >= command) && (*cp == ' '))
+ {
+ *cp = '\0';
+ cp--;
+ }
+
+ cp = strchr (command, ' ');
+ if (cp)
+ {
+ *(cp++) = '\0';
+ while (*cp == ' ')
+ cp++;
+ }
+
+ if (!INVOKE_PLAYER (COMMAND, pl->contr, ARG_STRING (command), ARG_STRING (cp)))
+ {
+ csp = find_command_element (command, Commands, CommandsSize);
+
+ if (!csp && pl->flag [FLAG_WIZ])
+ csp = find_command_element (command, WizCommands, WizCommandsSize);
+
+ if (csp)
+ {
+ pl->speed_left -= csp->time;
+ csp->func (pl, cp);
+ }
+ else if (!INVOKE_PLAYER (UNKNOWN_COMMAND, pl->contr, ARG_STRING (command), ARG_STRING (cp)))
+ pl->failmsgf ("'%s' is not a valid command.", command);
+ }
}