--- deliantra/server/server/commands.C 2010/04/05 03:22:26 1.64 +++ deliantra/server/server/commands.C 2011/04/23 04:56:55 1.69 @@ -1,7 +1,7 @@ /* * 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 (©) 2005,2006,2007,2008,2009,2010,2011 Marc Alexander Lehmann / Robin Redeker / the Deliantra team * Copyright (©) 2002 Mark Wedel & Crossfire Development Team * Copyright (©) 1992 Frank Tore Johansen * @@ -22,14 +22,8 @@ * 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,10 +31,18 @@ * 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}, @@ -86,17 +88,17 @@ {"northwest", command_northwest, 0.0}, {"mark" , command_mark , 0.0}, - {"run" , command_run , 1.0}, + {"run" , command_run , 0.0}, {"run_stop" , command_run_stop , 0.0}, - {"fire" , command_fire , 1.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}, @@ -126,7 +128,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) @@ -134,10 +136,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); + } }