--- deliantra/server/server/commands.C 2010/03/26 01:04:44 1.63
+++ deliantra/server/server/commands.C 2018/11/17 23:40:03 1.75
@@ -1,35 +1,30 @@
/*
* This file is part of Deliantra, the Roguelike Realtime MMORPG.
- *
- * Copyright (©) 2005,2006,2007,2008,2009,2010 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
+ *
+ * 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 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,
@@ -37,17 +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? */
- {"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},
@@ -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},
@@ -101,14 +108,11 @@
{"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},
@@ -120,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)
@@ -128,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 ()
+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);
+ }
}