Crossfire Server, Trunk
commands.cpp
Go to the documentation of this file.
1 /*
2  * Crossfire -- cooperative multi-player graphical RPG and adventure game
3  *
4  * Copyright (c) 1999-2022 the Crossfire Development Team
5  * Copyright (c) 1992 Frank Tore Johansen
6  *
7  * Crossfire is free software and comes with ABSOLUTELY NO WARRANTY. You are
8  * welcome to redistribute it under certain conditions. For details, please
9  * see COPYING and LICENSE.
10  *
11  * The authors can be reached via e-mail at <crossfire@metalforge.org>.
12  */
13 
19 #include "global.h"
20 
21 #include <ctype.h>
22 #include <stdlib.h>
23 #include <string.h>
24 
25 #include "commands.h"
26 #include "sproto.h"
27 #include "assert.h"
28 
29 #include <map>
30 #include <string>
31 
37  char *extra;
38  float time;
39  uint8_t type;
40 };
41 
45 static std::map<std::string, std::vector<registered_command *> > registered_commands;
46 
59 static command_registration do_register(const char *name, uint8_t type, command_function func_std, command_function_extra func_extra, const char *extra, float time) {
60  if (type > COMMAND_TYPE_WIZARD) {
62  }
63  auto existing = registered_commands.find(name);
64  if (existing != registered_commands.end()) {
65  assert(!existing->second.empty());
66  if (existing->second.back()->type != type) {
67  return 0;
68  }
69  }
70 
74  add->type = type;
75  add->func_std = func_std;
76  add->func_extra = func_extra;
77  add->extra = extra ? strdup(extra) : nullptr;
78  add->time = time;
79  registered_commands[name].push_back(add);
80  return add->registration;
81 }
82 
83 static void command_partial_commands(object *op, const char *params) {
84  if (strcmp(params, "1") == 0 || strcmp(params, "on") == 0) {
85  op->contr->partial_commands = 1;
86  }
87  if (strcmp(params, "0") == 0 || strcmp(params, "off") == 0) {
88  op->contr->partial_commands = 0;
89  }
90  draw_ext_info_format(NDI_UNIQUE, 0, op, MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_INFO, "Partial commands %s.", op->contr->partial_commands ? "enabled" : "disabled");
91 }
92 
103  return do_register(name, type, func, nullptr, nullptr, time);
104 }
105 
109 void commands_init(void) {
110 #define RN(name, func, time) command_register(name, COMMAND_TYPE_NORMAL, func, time)
111 #define RC(name, func, time) command_register(name, COMMAND_TYPE_COMMUNICATION, func, time)
112 #define RW(name, func, time) command_register(name, COMMAND_TYPE_WIZARD, func, time)
113 
114  /* Normal game commands. */
115  RN("afk", command_afk, 0.0);
116  RN("apply", command_apply, 1.0); /* should be variable */
117  RN("applymode", command_applymode, 1.0); /* should be variable */
118  RN("body", command_body, 0.0);
119  RN("bowmode", command_bowmode, 0.0);
120  RN("brace", command_brace, 0.0);
121  RN("cast", command_cast, 0.2); /* Is this right? */
122  RN("delete", command_delete, 0.0);
123  RN("disarm", command_disarm, 1.0);
124  RN("dm", command_dm, 0.0);
125  RN("dmhide", command_dmhide, 0.0); /* Like dm, but don't tell a dm arrived, hide player */
126  RN("drop", command_drop, 1.0);
127  RN("dropall", command_dropall, 1.0);
128  RN("empty", command_empty, 1.0);
129  RN("examine", command_examine, 0.5);
130  RN("fix_me", command_fix_me, 0.0);
131  RN("follow", command_follow, 0.0);
132  RN("forget_spell", command_forget_spell, 0.0);
133  RN("get", command_take, 1.0);
134  RN("help", command_help, 0.0);
135  RN("hiscore", command_hiscore, 0.0);
136  RN("inventory", command_inventory, 0.0);
137  RN("invoke", command_invoke, 1.0);
138  RN("killpets", command_kill_pets, 0.0);
139  RN("language", command_language, 0.0);
140  RN("listen", command_listen, 0.0);
141  RN("lock", command_lock_item, 0.0);
142  RN("maps", command_maps, 0.0);
143  RN("mapinfo", command_mapinfo, 0.0);
144  RN("mark", command_mark, 0.0);
145  RN("motd", command_motd, 0.0);
146  RN("news", command_news, 0.0);
147  RN("partial_commands", command_partial_commands, 0.0);
148  RN("party", command_party, 0.0);
149  RN("party_rejoin", command_party_rejoin, 0.0);
150  RN("passwd", command_passwd, 0.0);
151  RN("peaceful", command_peaceful, 0.0);
152  RN("petmode", command_petmode, 0.0);
153  RN("pickup", command_pickup, 1.0);
154  RN("prepare", command_cast, 1.0);
155  RN("printlos", command_printlos, 0.0);
156  RN("quit", command_quit, 0.0);
157  RN("ready_skill", command_rskill, 1.0);
158  RN("rename", command_rename_item, 0.0);
159  RN("resistances", command_resistances, 0.0);
160  RN("rotateshoottype", command_rotateshoottype, 0.0);
161  RN("rules", command_rules, 0.0);
162  RN("save", command_save, 0.0);
163  RN("skills", command_skills, 0.0); /* shows player list of skills */
164  RN("use_skill", command_uskill, 1.0);
165  RN("search", command_search, 1.0);
166  RN("search-items", command_search_items, 0.0);
167  RN("showpets", command_showpets, 1.0);
168  RN("sound", command_sound, 0.0);
169  RN("statistics", command_statistics, 0.0);
170  RN("take", command_take, 1.0);
171  RN("throw", command_throw, 1.0);
172  RN("time", command_time, 0.0);
173  RN("title", command_title, 0.0);
174  RN("use", command_use, 1.0);
175  RN("usekeys", command_usekeys, 0.0);
176  RN("whereabouts", command_whereabouts, 0.0);
177  RN("whereami", command_whereami, 0.0);
178  RN("unarmed_skill", command_unarmed_skill, 0.0);
179 #ifdef DEBUG_MALLOC_LEVEL
180  RN("verify", command_malloc_verify, 0.0);
181 #endif
182  RN("version", command_version, 0.0);
183  RN("wimpy", command_wimpy, 0.0);
184  RN("who", command_who, 0.0);
185  /*
186  * directional commands
187  */
188  RN("stay", command_stay, 1.0); /* 1.0 because it is used when using a
189  * skill on yourself */
190  RN("north", command_north, 1.0);
191  RN("east", command_east, 1.0);
192  RN("south", command_south, 1.0);
193  RN("west", command_west, 1.0);
194  RN("northeast", command_northeast, 1.0);
195  RN("southeast", command_southeast, 1.0);
196  RN("southwest", command_southwest, 1.0);
197  RN("northwest", command_northwest, 1.0);
198  RN("run", command_run, 1.0);
199  RN("run_stop", command_run_stop, 0.0);
200  RN("fire", command_fire, 1.0);
201  RN("fire_stop", command_fire_stop, 0.0);
202  RN("face", command_face, 0.0);
203  RN("quest", command_quest, 0.0);
204  RN("knowledge", command_knowledge, 0.0);
205 
206  /* Chat/shout related commands. */
207  RC("tell", command_tell, 0.1);
208  RC("reply", command_reply, 0.0);
209  RC("say", command_say, 0.1);
210  RC("gsay", command_gsay, 1.0);
211  RC("shout", command_shout, 0.1);
212  RC("chat", command_chat, 0.1);
213  RC("me", command_me, 0.1);
214  RC("cointoss", command_cointoss, 0.0);
215  RC("orcknuckle", command_orcknuckle, 0.0);
216  /*
217  * begin emotions
218  */
219  RC("nod", command_nod, 0.0);
220  RC("dance", command_dance, 0.0);
221  RC("kiss", command_kiss, 0.0);
222  RC("bounce", command_bounce, 0.0);
223  RC("smile", command_smile, 0.0);
224  RC("cackle", command_cackle, 0.0);
225  RC("laugh", command_laugh, 0.0);
226  RC("giggle", command_giggle, 0.0);
227  RC("shake", command_shake, 0.0);
228  RC("puke", command_puke, 0.0);
229  RC("growl", command_growl, 0.0);
230  RC("scream", command_scream, 0.0);
231  RC("sigh", command_sigh, 0.0);
232  RC("sulk", command_sulk, 0.0);
233  RC("hug", command_hug, 0.0);
234  RC("cry", command_cry, 0.0);
235  RC("poke", command_poke, 0.0);
236  RC("accuse", command_accuse, 0.0);
237  RC("grin", command_grin, 0.0);
238  RC("bow", command_bow, 0.0);
239  RC("clap", command_clap, 0.0);
240  RC("blush", command_blush, 0.0);
241  RC("burp", command_burp, 0.0);
242  RC("chuckle", command_chuckle, 0.0);
243  RC("cough", command_cough, 0.0);
244  RC("flip", command_flip, 0.0);
245  RC("frown", command_frown, 0.0);
246  RC("gasp", command_gasp, 0.0);
247  RC("glare", command_glare, 0.0);
248  RC("groan", command_groan, 0.0);
249  RC("hiccup", command_hiccup, 0.0);
250  RC("lick", command_lick, 0.0);
251  RC("pout", command_pout, 0.0);
252  RC("shiver", command_shiver, 0.0);
253  RC("shrug", command_shrug, 0.0);
254  RC("slap", command_slap, 0.0);
255  RC("smirk", command_smirk, 0.0);
256  RC("snap", command_snap, 0.0);
257  RC("sneeze", command_sneeze, 0.0);
258  RC("snicker", command_snicker, 0.0);
259  RC("sniff", command_sniff, 0.0);
260  RC("snore", command_snore, 0.0);
261  RC("spit", command_spit, 0.0);
262  RC("strut", command_strut, 0.0);
263  RC("thank", command_thank, 0.0);
264  RC("twiddle", command_twiddle, 0.0);
265  RC("wave", command_wave, 0.0);
266  RC("whistle", command_whistle, 0.0);
267  RC("wink", command_wink, 0.0);
268  RC("yawn", command_yawn, 0.0);
269  RC("beg", command_beg, 0.0);
270  RC("bleed", command_bleed, 0.0);
271  RC("cringe", command_cringe, 0.0);
272  RC("think", command_think, 0.0);
273 
275  RW("abil", command_abil, 0.0);
276  RW("accountpasswd", command_accountpasswd, 0.0);
277  RW("addexp", command_addexp, 0.0);
278  RW("arrest", command_arrest, 0.0);
279  RW("banish", command_banish, 0.0);
280  RW("create", command_create, 0.0);
281  RW("debug", command_debug, 0.0);
282  RW("diff", command_diff, 0.0);
283  RW("dmtell", command_dmtell, 0.0);
284  RW("dump", command_dump, 0.0);
285  RW("dumpabove", command_dumpabove, 0.0);
286  RW("dumpbelow", command_dumpbelow, 0.0);
287  RW("dumpfriendlyobjects", command_dumpfriendlyobjects, 0.0);
288  RW("dumpallarchetypes", command_dumpallarchetypes, 0.0);
289  RW("dumpallmaps", command_dumpallmaps, 0.0);
290  RW("dumpallobjects", command_dumpallobjects, 0.0);
291  RW("dumpmap", command_dumpmap, 0.0);
292  RW("free", command_free, 0.0);
293  RW("freeze", command_freeze, 0.0);
294  RW("goto", command_goto, 0.0);
295  RW("hide", command_hide, 0.0);
296  RW("insert_into", command_insert_into, 0.0);
297  RW("invisible", command_invisible, 0.0);
298  RW("kick", command_kick, 0.0);
299  RW("learn_special_prayer", command_learn_special_prayer, 0.0);
300  RW("learn_spell", command_learn_spell, 0.0);
301  RW("malloc", command_malloc, 0.0);
302  RW("nodm", command_nowiz, 0.0);
303  RW("nowiz", command_nowiz, 0.0);
304  RW("patch", command_patch, 0.0);
305  RW("players", command_players, 0.0);
306  RW("plugin", command_loadplugin, 0.0);
307  RW("pluglist", command_listplugins, 0.0);
308  RW("plugout", command_unloadplugin, 0.0);
309  RW("purge_quest_state", command_purge_quest, 0.0);
310  RW("purge_quests", command_purge_quest_definitions, 0.0);
311  RW("recollect", command_recollect, 0.0);
312  RW("remove", command_remove, 0.0);
313  RW("reset", command_reset, 0.0);
314  RW("set_god", command_setgod, 0.0);
315  RW("settings", command_settings, 0.0);
316  RW("server_speed", command_speed, 0.0);
317  RW("shutdown", command_shutdown, 0.0);
318  RW("ssdumptable", command_ssdumptable, 0.0);
319  RW("stack_clear", command_stack_clear, 0.0);
320  RW("stack_list", command_stack_list, 0.0);
321  RW("stack_pop", command_stack_pop, 0.0);
322  RW("stack_push", command_stack_push, 0.0);
323  RW("stats", command_stats, 0.0);
324  RW("strings", command_strings, 0.0);
325  RW("style_info", command_style_map_info, 0.0); /* Costly command, so make it wiz only */
326  RW("summon", command_summon, 0.0);
327  RW("teleport", command_teleport, 0.0);
328  RW("toggle_shout", command_toggle_shout, 0.0);
329  RW("wizpass", command_wizpass, 0.0);
330  RW("wizcast", command_wizcast, 0.0);
331  RW("overlay_save", command_overlay_save, 0.0);
332  RW("overlay_reset", command_overlay_reset, 0.0);
333  /* RW("possess", command_possess, 0.0); */
334  RW("mon_aggr", command_mon_aggr, 0.0);
335  RW("loadtest", command_loadtest, 0.0);
336 
337 #undef RN
338 #undef RC
339 #undef RW
340 }
341 
346  for (auto cmd = registered_commands.begin(); cmd != registered_commands.end(); cmd++) {
347  for (auto h = cmd->second.begin(); h != cmd->second.end(); h++) {
348  free((*h)->extra);
349  delete *h;
350  }
351  cmd->second.clear();
352  }
353  registered_commands.clear();
354 
355  next_registration = 1;
356 }
357 
368 static void show_commands(object *op, uint8_t type, const char *legend) {
369  char line[HUGE_BUF];
370 
372 
373  line[0] = '\0';
374  std::for_each(registered_commands.begin(), registered_commands.end(), [&type, &line] (auto cmd) {
375  if (cmd.second.back()->type == type) {
376  strcat(line, cmd.first.c_str());
377  strcat(line, " ");
378  }
379  });
381 }
382 
389 void command_list(object *pl, bool is_dm) {
390  show_commands(pl, COMMAND_TYPE_NORMAL, " Commands:");
392  show_commands(pl, COMMAND_TYPE_COMMUNICATION, " Communication commands:");
393  if (is_dm) {
395  show_commands(pl, COMMAND_TYPE_WIZARD, " Wiz commands:");
396  }
397 }
398 
406 static registered_command *command_find(const char *name, object *pl) {
407  auto existing = registered_commands.find(name);
408  if (existing != registered_commands.end()) {
409  if (!QUERY_FLAG(pl, FLAG_WIZ) && existing->second.back()->type == COMMAND_TYPE_WIZARD) {
411  "'%s' is not a valid command.", name);
412  return nullptr;
413  }
414  return existing->second.back();
415  }
416 
417  if (pl->contr->partial_commands) {
418  size_t len = strlen(name);
419  registered_command *candidate = nullptr;
420  std::string matches;
421  bool multiple = false;
422  for (auto command : registered_commands) {
423  if ((command.second.back()->type != COMMAND_TYPE_WIZARD || QUERY_FLAG(pl, FLAG_WIZ)) && command.first.length() >= len && command.first.compare(0, len, name) == 0) {
424  if (candidate) {
425  matches += ", " + command.first;
426  multiple = true;
427  } else {
428  candidate = command.second.back();
429  matches = command.first;
430  }
431  }
432  }
433  if (multiple) {
435  "'%s' is ambiguous and may be %s.", name, matches.c_str());
436  return nullptr;
437  }
438  if (candidate) {
439  return candidate;
440  }
441  }
443  "'%s' is not a valid command.", name);
444  return nullptr;
445 }
446 
455 void command_execute(object *pl, char *command) {
456  registered_command *csp;
457  char *cp, *low;
458 
459  pl->contr->has_hit = 0;
460 
461  /*
462  * remove trailing spaces from commant
463  */
464  cp = command+strlen(command)-1;
465  while ((cp >= command) && (*cp == ' ')) {
466  *cp = '\0';
467  cp--;
468  }
469  cp = strchr(command, ' ');
470  if (cp) {
471  *(cp++) = '\0';
472  while (*cp == ' ')
473  cp++;
474  } else {
475  cp = strchr(command, '\0');
476  }
477 
478  if (strlen(command) == 0) {
479  return;
480  }
481 
482  for (low = command; *low; low++)
483  *low = tolower(*low);
484 
485  csp = command_find(command, pl);
486 
487  if (csp == nullptr) {
488  return;
489  }
490 
491  pl->speed_left -= csp->time;
492 
493  /* A character time can never exceed his speed (which in many cases,
494  * if wearing armor, is less than one.) Thus, in most cases, if
495  * the command takes 1.0, the player's speed will be less than zero.
496  * it is only really an issue if time goes below -1
497  * Due to various reasons that are too long to go into here, we will
498  * actually still execute player even if his time is less than 0,
499  * but greater than -1. This is to improve the performance of the
500  * new client/server. In theory, it shouldn't make much difference.
501  */
502 
503  if (csp->time && pl->speed_left < -2.0) {
504  LOG(llevDebug, "execute_newclient_command: Player issued command that takes more time than he has left.\n");
505  }
506  if (csp->extra) {
507  csp->func_extra(pl, cp, csp->extra);
508  } else {
509  csp->func_std(pl, cp);
510  }
511 }
512 
525 command_registration command_register_extra(const char *name, const char *extra, uint8_t type, command_function_extra func, float time) {
526  assert(extra);
527  return do_register(name, type, nullptr, func, extra, time);
528 }
529 
535  for (auto cmd = registered_commands.begin(); cmd != registered_commands.end(); cmd++) {
536  for (auto h = cmd->second.begin(); h != cmd->second.end(); h++) {
537  if ((*h)->registration == command) {
538  free((*h)->extra);
539  delete (*h);
540  cmd->second.erase(h);
541  if (cmd->second.empty()) {
542  registered_commands.erase(cmd);
543  }
544  return;
545  }
546  }
547  }
548 }
registered_command::registration
command_registration registration
Definition: commands.cpp:34
command_stack_pop
void command_stack_pop(object *op, const char *params)
Definition: c_wiz.cpp:2495
command_style_map_info
void command_style_map_info(object *op, const char *params)
Definition: c_wiz.cpp:2724
command_dance
void command_dance(object *op, const char *params)
Definition: c_chat.cpp:733
global.h
command_shutdown
void command_shutdown(object *op, const char *params)
Definition: c_wiz.cpp:658
line
Install Bug reporting Credits so make sure you have version or later There are files involved in the automatic convert convertall and filelist py GuildList has the list of guilds for the server GuildLocations is what is used by the install script for setting up the maps It has columns in the first is the name of the no spaces The second is the region of the the third is the destination folder for the the fourth is the exit the fifth and sixth are the x and y coords within the exit the seventh eighth and ninth are the exit location for the storage hall If field seven is then it uses the same exit map as for the guild hall itself filelist py has a list of which files to process for each guild hall convert py takes all the files in filelist py and customises them to the specific guild then outputs them into a in the same order that they are listed in GuildLocations convertall py reads the lines from GuildLocations and runs line by line
Definition: README.txt:12
command_cackle
void command_cackle(object *op, const char *params)
Definition: c_chat.cpp:777
command_stack_push
void command_stack_push(object *op, const char *params)
Definition: c_wiz.cpp:2508
command_northeast
void command_northeast(object *op, const char *params)
Definition: c_move.cpp:79
command_sound
void command_sound(object *op, const char *params)
Definition: c_misc.cpp:1910
command_bleed
void command_bleed(object *op, const char *params)
Definition: c_chat.cpp:1283
command_glare
void command_glare(object *op, const char *params)
Definition: c_chat.cpp:1030
command_delete
void command_delete(object *op, const char *params)
Definition: c_misc.cpp:1889
command_dumpallmaps
void command_dumpallmaps(object *op, const char *params)
Definition: c_misc.cpp:1047
command_players
void command_players(object *op, const char *params)
Definition: c_misc.cpp:1227
command_nowiz
void command_nowiz(object *op, const char *params)
Definition: c_wiz.cpp:2041
command_snore
void command_snore(object *op, const char *params)
Definition: c_chat.cpp:1173
command_remove
void command_remove(object *op, const char *params)
Definition: c_wiz.cpp:1540
command_dumpfriendlyobjects
void command_dumpfriendlyobjects(object *op, const char *params)
Definition: c_misc.cpp:991
command_wizcast
void command_wizcast(object *op, const char *params)
Definition: c_misc.cpp:947
command_growl
void command_growl(object *op, const char *params)
Definition: c_chat.cpp:832
command_search_items
void command_search_items(object *op, const char *params)
Definition: c_object.cpp:2477
command_say
void command_say(object *op, const char *params)
Definition: c_chat.cpp:34
LOG
void LOG(LogLevel logLevel, const char *format,...)
Definition: logger.cpp:51
command_sulk
void command_sulk(object *op, const char *params)
Definition: c_chat.cpp:865
command_whistle
void command_whistle(object *op, const char *params)
Definition: c_chat.cpp:1239
command_cringe
void command_cringe(object *op, const char *params)
Definition: c_chat.cpp:1294
command_unarmed_skill
void command_unarmed_skill(object *op, const char *params)
Definition: c_misc.cpp:1381
command_clap
void command_clap(object *op, const char *params)
Definition: c_chat.cpp:942
command_cough
void command_cough(object *op, const char *params)
Definition: c_chat.cpp:986
next_registration
static command_registration next_registration
Definition: commands.cpp:43
command_spit
void command_spit(object *op, const char *params)
Definition: c_chat.cpp:1184
command_poke
void command_poke(object *op, const char *params)
Definition: c_chat.cpp:898
QUERY_FLAG
#define QUERY_FLAG(xyz, p)
Definition: define.h:226
command_shrug
void command_shrug(object *op, const char *params)
Definition: c_chat.cpp:1096
command_time
void command_time(object *op, const char *params)
Definition: c_misc.cpp:868
command_groan
void command_groan(object *op, const char *params)
Definition: c_chat.cpp:1041
command_wave
void command_wave(object *op, const char *params)
Definition: c_chat.cpp:1228
command_beg
void command_beg(object *op, const char *params)
Definition: c_chat.cpp:1272
command_hiccup
void command_hiccup(object *op, const char *params)
Definition: c_chat.cpp:1052
command_me
void command_me(object *op, const char *params)
Definition: c_chat.cpp:47
command_south
void command_south(object *op, const char *params)
Definition: c_move.cpp:101
command_kiss
void command_kiss(object *op, const char *params)
Definition: c_chat.cpp:744
command_shout
void command_shout(object *op, const char *params)
Definition: c_chat.cpp:210
command_thank
void command_thank(object *op, const char *params)
Definition: c_chat.cpp:1206
command_disarm
void command_disarm(object *op, const char *params)
Definition: c_object.cpp:224
command_snap
void command_snap(object *op, const char *params)
Definition: c_chat.cpp:1129
command_party
void command_party(object *op, const char *params)
Definition: c_party.cpp:97
command_wink
void command_wink(object *op, const char *params)
Definition: c_chat.cpp:1250
do_register
static command_registration do_register(const char *name, uint8_t type, command_function func_std, command_function_extra func_extra, const char *extra, float time)
Definition: commands.cpp:59
command_recollect
void command_recollect(object *op, const char *params)
Definition: c_wiz.cpp:1511
command_run_stop
void command_run_stop(object *op, const char *params)
Definition: c_new.cpp:64
show_commands
static void show_commands(object *op, uint8_t type, const char *legend)
Definition: commands.cpp:368
command_printlos
void command_printlos(object *op, const char *params)
Definition: c_misc.cpp:1061
command_usekeys
void command_usekeys(object *op, const char *params)
Definition: c_misc.cpp:1556
command_party_rejoin
void command_party_rejoin(object *op, const char *params)
Definition: c_party.cpp:307
command_partial_commands
static void command_partial_commands(object *op, const char *params)
Definition: commands.cpp:83
command_lock_item
void command_lock_item(object *op, const char *params)
Definition: c_object.cpp:2708
command
Crossfire Protocol most of the time after the actual code was already omit certain important and possibly make life miserable any new developer or curious player should be able to find most of the relevant information here If inconsistencies are found or this documentation proves to be consider the latest server side protocol code in the public source code repository as the authoritative reference Introduction If you were ever curious enough to telnet or netcat to a Crossfire chances are you were sorely disappointed While the protocol may seem to use plain text at it actually uses a mix of ASCII and binary data This handbook attempts to document various aspects of the Crossfire protocol As consult the README file to find out how to get in touch with helpful people via mailing and more History the communications plan was set to be a text based system It was up to the server and client to parse these messages and determine what to do These messages were assumed to be line per message At a reasonably early stage of Eric Anderson wrote a then the data itself you could send many data and after the other end could decode these commands This works fairly but I think the creation of numerous sub packets has some performance hit the eutl was not especially well so writing a client for a different platform became more Eric left to work on other products shortly after writing his which didn t really leave anyone with a full understanding of the socket code I have decided to remove the eutl dependency At least one advantage is that having this network related code directly in the client and server makes error handling a bit easier cleaner Packet Format the outside packet method the byte size for the size information is not included here Eutl originally used bytes for the size to bytes seems it makes a least some sense The actual data is something of the nature of the commands listed below It is a text command
Definition: protocol.txt:63
time
non standard information is not specified or uptime this means how long since the executable has been started A particular host may have been running a server for quite a long time
Definition: arch-handbook.txt:206
draw_ext_info_format
void draw_ext_info_format(int flags, int pri, const object *pl, uint8_t type, uint8_t subtype, const char *format,...) PRINTF_ARGS(6
COMMAND_TYPE_COMMUNICATION
#define COMMAND_TYPE_COMMUNICATION
Definition: commands.h:37
command_hiscore
void command_hiscore(object *op, const char *params)
Definition: c_misc.cpp:881
command_invoke
void command_invoke(object *op, const char *params)
Definition: c_range.cpp:38
command_twiddle
void command_twiddle(object *op, const char *params)
Definition: c_chat.cpp:1217
command_statistics
void command_statistics(object *pl, const char *params)
Definition: c_misc.cpp:1121
command_northwest
void command_northwest(object *op, const char *params)
Definition: c_move.cpp:90
command_diff
void command_diff(object *op, const char *params)
Definition: c_wiz.cpp:2583
command_who
void command_who(object *op, const char *params)
Definition: c_misc.cpp:623
command_overlay_reset
void command_overlay_reset(object *op, const char *params)
Definition: c_wiz.cpp:589
command_throw
void command_throw(object *op, const char *params)
Definition: c_object.cpp:239
tolower
#define tolower(C)
Definition: c_new.cpp:30
registered_commands
static std::map< std::string, std::vector< registered_command * > > registered_commands
Definition: commands.cpp:45
command_puke
void command_puke(object *op, const char *params)
Definition: c_chat.cpp:821
COMMAND_TYPE_NORMAL
#define COMMAND_TYPE_NORMAL
Definition: commands.h:35
command_debug
void command_debug(object *op, const char *params)
Definition: c_misc.cpp:893
command_execute
void command_execute(object *pl, char *command)
Definition: commands.cpp:455
command_whereami
void command_whereami(object *op, const char *params)
Definition: c_misc.cpp:822
MSG_TYPE_COMMAND_ERROR
#define MSG_TYPE_COMMAND_ERROR
Definition: newclient.h:518
command_overlay_save
void command_overlay_save(object *op, const char *params)
Definition: c_wiz.cpp:568
command_arrest
void command_arrest(object *op, const char *params)
Definition: c_wiz.cpp:821
command_hug
void command_hug(object *op, const char *params)
Definition: c_chat.cpp:876
command_face
void command_face(object *op, const char *params)
Definition: c_new.cpp:111
command_rename_item
void command_rename_item(object *op, const char *params)
Definition: c_object.cpp:2522
command_petmode
void command_petmode(object *op, const char *params)
Definition: c_misc.cpp:1437
command_rules
void command_rules(object *op, const char *params)
Definition: c_misc.cpp:230
HUGE_BUF
#define HUGE_BUF
Definition: define.h:37
command_grin
void command_grin(object *op, const char *params)
Definition: c_chat.cpp:920
MSG_TYPE_COMMAND
#define MSG_TYPE_COMMAND
Definition: newclient.h:393
command_stack_clear
void command_stack_clear(object *op, const char *params)
Definition: c_wiz.cpp:2557
command_nod
void command_nod(object *op, const char *params)
Definition: c_chat.cpp:722
name
Plugin animator file specs[Config] name
Definition: animfiles.txt:4
command_west
void command_west(object *op, const char *params)
Definition: c_move.cpp:134
draw_ext_info
vs only yadda is in because all tags get reset on the next draw_ext_info In the second since it is all in one draw_ext_info
Definition: media-tags.txt:61
command_quit
void command_quit(object *op, const char *params)
Definition: c_misc.cpp:1873
command_rskill
void command_rskill(object *pl, const char *params)
Definition: c_object.cpp:161
command_unregister
void command_unregister(command_registration command)
Definition: commands.cpp:534
command_malloc
void command_malloc(object *op, const char *params)
Definition: c_misc.cpp:796
command_banish
void command_banish(object *op, const char *params)
Definition: c_wiz.cpp:502
command_inventory
void command_inventory(object *op, const char *params)
Definition: c_wiz.cpp:1315
command_kill_pets
void command_kill_pets(object *op, const char *params)
Definition: c_misc.cpp:2196
command_accountpasswd
void command_accountpasswd(object *op, const char *params)
Definition: c_wiz.cpp:1613
command_forget_spell
void command_forget_spell(object *op, const char *params)
Definition: c_wiz.cpp:2376
command_mark
void command_mark(object *op, const char *params)
Definition: c_object.cpp:1567
command_teleport
void command_teleport(object *op, const char *params)
Definition: c_wiz.cpp:913
command_uskill
void command_uskill(object *pl, const char *params)
Definition: c_object.cpp:144
command_dump
void command_dump(object *op, const char *params)
Definition: c_wiz.cpp:1357
command_take
void command_take(object *op, const char *params)
Definition: c_object.cpp:845
command_north
void command_north(object *op, const char *params)
Definition: c_move.cpp:68
command_save
void command_save(object *op, const char *params)
Definition: c_misc.cpp:2098
commands_clear
void commands_clear()
Definition: commands.cpp:345
command_mon_aggr
void command_mon_aggr(object *op, const char *params)
Definition: c_wiz.cpp:1385
command_dropall
void command_dropall(object *op, const char *params)
Definition: c_object.cpp:1230
command_ssdumptable
void command_ssdumptable(object *op, const char *params)
Definition: c_misc.cpp:1019
MSG_TYPE_COMMAND_INFO
#define MSG_TYPE_COMMAND_INFO
Definition: newclient.h:515
command_listen
void command_listen(object *op, const char *params)
Definition: c_misc.cpp:1090
command_loadplugin
void command_loadplugin(object *op, const char *params)
Definition: c_wiz.cpp:2419
command_scream
void command_scream(object *op, const char *params)
Definition: c_chat.cpp:843
command_follow
void command_follow(object *op, const char *params)
Definition: c_wiz.cpp:2770
command_strut
void command_strut(object *op, const char *params)
Definition: c_chat.cpp:1195
command_chuckle
void command_chuckle(object *op, const char *params)
Definition: c_chat.cpp:975
command_unloadplugin
void command_unloadplugin(object *op, const char *params)
Definition: c_wiz.cpp:2451
command_think
void command_think(object *op, const char *params)
Definition: c_chat.cpp:1305
command_help
void command_help(object *op, const char *params)
Definition: c_misc.cpp:1772
command_examine
void command_examine(object *op, const char *params)
Definition: c_object.cpp:1489
registered_command::time
float time
Definition: commands.cpp:38
command_free
void command_free(object *op, const char *params)
Definition: c_wiz.cpp:1587
RN
#define RN(name, func, time)
command_cry
void command_cry(object *op, const char *params)
Definition: c_chat.cpp:887
RW
#define RW(name, func, time)
command_kick
void command_kick(object *op, const char *params)
Definition: c_wiz.cpp:556
command_pout
void command_pout(object *op, const char *params)
Definition: c_chat.cpp:1074
command_orcknuckle
void command_orcknuckle(object *op, const char *params)
Definition: c_chat.cpp:108
command_search
void command_search(object *op, const char *params)
Definition: c_object.cpp:212
command_abil
void command_abil(object *op, const char *params)
Definition: c_wiz.cpp:1794
command_flip
void command_flip(object *op, const char *params)
Definition: c_chat.cpp:997
sproto.h
command_language
void command_language(object *op, const char *params)
Definition: c_misc.cpp:132
command_dumpallobjects
void command_dumpallobjects(object *op, const char *params)
Definition: c_misc.cpp:977
command_giggle
void command_giggle(object *op, const char *params)
Definition: c_chat.cpp:799
command_hide
void command_hide(object *op, const char *params)
Definition: c_wiz.cpp:389
command_accuse
void command_accuse(object *op, const char *params)
Definition: c_chat.cpp:909
command_stay
void command_stay(object *op, const char *params)
Definition: c_move.cpp:145
command_dumpmap
void command_dumpmap(object *op, const char *params)
Definition: c_misc.cpp:1033
command_settings
void command_settings(object *op, const char *ignored)
Definition: c_wiz.cpp:2875
command_purge_quest_definitions
void command_purge_quest_definitions(object *op, const char *param)
Definition: c_wiz.cpp:2820
command_east
void command_east(object *op, const char *params)
Definition: c_move.cpp:57
COMMAND_TYPE_WIZARD
#define COMMAND_TYPE_WIZARD
Definition: commands.h:39
command_dumpbelow
void command_dumpbelow(object *op, const char *params)
Definition: c_wiz.cpp:2848
command_peaceful
void command_peaceful(object *op, const char *params)
Definition: c_misc.cpp:2124
command_list
void command_list(object *pl, bool is_dm)
Definition: commands.cpp:389
command_wimpy
void command_wimpy(object *op, const char *params)
Definition: c_misc.cpp:2142
command_bow
void command_bow(object *op, const char *params)
Definition: c_chat.cpp:931
command_drop
void command_drop(object *op, const char *params)
Definition: c_object.cpp:1354
command_shake
void command_shake(object *op, const char *params)
Definition: c_chat.cpp:810
command_use
void command_use(object *op, const char *params)
Definition: c_object.cpp:2751
command_fire_stop
void command_fire_stop(object *op, const char *params)
Definition: c_new.cpp:98
command_motd
void command_motd(object *op, const char *params)
Definition: c_misc.cpp:217
command_loadtest
void command_loadtest(object *op, const char *params)
Definition: c_wiz.cpp:306
command_smile
void command_smile(object *op, const char *params)
Definition: c_chat.cpp:766
command_learn_special_prayer
void command_learn_special_prayer(object *op, const char *params)
Definition: c_wiz.cpp:2363
command_applymode
void command_applymode(object *op, const char *params)
Definition: c_misc.cpp:1277
FLAG_WIZ
#define FLAG_WIZ
Definition: define.h:231
command_news
void command_news(object *op, const char *params)
Definition: c_misc.cpp:243
command_quest
void command_quest(object *op, const char *params)
Definition: quest.cpp:738
command_whereabouts
void command_whereabouts(object *op, const char *params)
Definition: c_misc.cpp:484
NDI_UNIQUE
#define NDI_UNIQUE
Definition: newclient.h:251
command_afk
void command_afk(object *op, const char *params)
Definition: c_misc.cpp:775
command_summon
void command_summon(object *op, const char *params)
Definition: c_wiz.cpp:866
command_knowledge
void command_knowledge(object *pl, const char *params)
Definition: knowledge.cpp:1210
command_reset
void command_reset(object *op, const char *params)
Definition: c_wiz.cpp:1860
command_learn_spell
void command_learn_spell(object *op, const char *params)
Definition: c_wiz.cpp:2351
command_version
void command_version(object *op, const char *params)
Definition: c_misc.cpp:1076
command_frown
void command_frown(object *op, const char *params)
Definition: c_chat.cpp:1008
command_toggle_shout
void command_toggle_shout(object *op, const char *params)
Definition: c_wiz.cpp:615
registered_command::extra
char * extra
Definition: commands.cpp:37
command_snicker
void command_snicker(object *op, const char *params)
Definition: c_chat.cpp:1151
registered_command
Definition: commands.cpp:33
command_reply
void command_reply(object *op, const char *params)
Definition: c_chat.cpp:336
command_strings
void command_strings(object *op, const char *params)
Definition: c_misc.cpp:847
command_yawn
void command_yawn(object *op, const char *params)
Definition: c_chat.cpp:1261
command_setgod
void command_setgod(object *op, const char *params)
Definition: c_wiz.cpp:418
command_pickup
void command_pickup(object *op, const char *params)
Definition: c_object.cpp:2359
give.op
op
Definition: give.py:33
command_skills
void command_skills(object *op, const char *params)
Definition: c_wiz.cpp:1345
command_patch
void command_patch(object *op, const char *params)
Definition: c_wiz.cpp:1473
command_dmtell
void command_dmtell(object *op, const char *params)
Definition: c_chat.cpp:320
command_rotateshoottype
void command_rotateshoottype(object *op, const char *params)
Definition: c_range.cpp:351
command_shiver
void command_shiver(object *op, const char *params)
Definition: c_chat.cpp:1085
command_stats
void command_stats(object *op, const char *params)
Definition: c_wiz.cpp:1737
command_lick
void command_lick(object *op, const char *params)
Definition: c_chat.cpp:1063
roll-o-matic.params
params
Definition: roll-o-matic.py:193
command_chat
void command_chat(object *op, const char *params)
Definition: c_chat.cpp:221
command_southwest
void command_southwest(object *op, const char *params)
Definition: c_move.cpp:123
command_bounce
void command_bounce(object *op, const char *params)
Definition: c_chat.cpp:755
command_smirk
void command_smirk(object *op, const char *params)
Definition: c_chat.cpp:1118
command_resistances
void command_resistances(object *op, const char *params)
Definition: c_misc.cpp:1597
command_slap
void command_slap(object *op, const char *params)
Definition: c_chat.cpp:1107
command_stack_list
void command_stack_list(object *op, const char *params)
Definition: c_wiz.cpp:2526
command_fire
void command_fire(object *op, const char *params)
Definition: c_new.cpp:77
command_find
static registered_command * command_find(const char *name, object *pl)
Definition: commands.cpp:406
command_invisible
void command_invisible(object *op, const char *params)
Definition: c_wiz.cpp:2187
command_purge_quest
void command_purge_quest(object *op, const char *param)
Definition: c_wiz.cpp:2814
command_run
void command_run(object *op, const char *params)
Definition: c_new.cpp:41
command_freeze
void command_freeze(object *op, const char *params)
Definition: c_wiz.cpp:745
command_register_extra
command_registration command_register_extra(const char *name, const char *extra, uint8_t type, command_function_extra func, float time)
Definition: commands.cpp:525
command_maps
void command_maps(object *op, const char *params)
Definition: c_misc.cpp:835
command_dumpabove
void command_dumpabove(object *op, const char *params)
Definition: c_wiz.cpp:2863
command_function_extra
void(* command_function_extra)(object *op, const char *params, const char *extra)
Definition: commands.h:29
command_dumpallarchetypes
void command_dumpallarchetypes(object *op, const char *params)
Definition: c_misc.cpp:1005
command_speed
void command_speed(object *op, const char *params)
Definition: c_wiz.cpp:1707
command_fix_me
void command_fix_me(object *op, const char *params)
Definition: c_misc.cpp:1213
command_registration
uint64_t command_registration
Definition: commands.h:32
command_dm
void command_dm(object *op, const char *params)
Definition: c_wiz.cpp:2175
command_addexp
void command_addexp(object *op, const char *params)
Definition: c_wiz.cpp:1651
command_goto
void command_goto(object *op, const char *params)
Definition: c_wiz.cpp:724
command_empty
void command_empty(object *op, const char *params)
Definition: c_object.cpp:1450
commands.h
command_cointoss
void command_cointoss(object *op, const char *params)
Definition: c_chat.cpp:64
command_tell
void command_tell(object *op, const char *params)
Definition: c_chat.cpp:308
commands_init
void commands_init(void)
Definition: commands.cpp:109
command_showpets
void command_showpets(object *op, const char *params)
Definition: c_misc.cpp:1481
command_gsay
void command_gsay(object *op, const char *params)
Definition: c_party.cpp:75
command_mapinfo
void command_mapinfo(object *op, const char *params)
Definition: c_misc.cpp:809
command_gasp
void command_gasp(object *op, const char *params)
Definition: c_chat.cpp:1019
command_brace
void command_brace(object *op, const char *params)
Definition: c_misc.cpp:2172
command_body
void command_body(object *op, const char *params)
Definition: c_misc.cpp:175
command_passwd
void command_passwd(object *pl, const char *params)
Definition: c_misc.cpp:2239
command_function
void(* command_function)(object *op, const char *params)
Definition: commands.h:17
registered_command::func_std
command_function func_std
Definition: commands.cpp:35
command_sniff
void command_sniff(object *op, const char *params)
Definition: c_chat.cpp:1162
command_insert_into
void command_insert_into(object *op, const char *params)
Definition: c_wiz.cpp:2647
RC
#define RC(name, func, time)
altar_valkyrie.pl
pl
Definition: altar_valkyrie.py:28
command_apply
void command_apply(object *op, const char *params)
Definition: c_object.cpp:251
command_cast
void command_cast(object *op, const char *params)
Definition: c_range.cpp:50
command_listplugins
void command_listplugins(object *op, const char *params)
Definition: c_wiz.cpp:2404
command_bowmode
void command_bowmode(object *op, const char *params)
Definition: c_misc.cpp:1318
command_title
void command_title(object *op, const char *params)
Definition: c_misc.cpp:2047
matches
static int matches(const char *exp, const char *text)
Definition: dialog.cpp:79
command_wizpass
void command_wizpass(object *op, const char *params)
Definition: c_misc.cpp:917
registered_command::func_extra
command_function_extra func_extra
Definition: commands.cpp:36
command_create
void command_create(object *op, const char *params)
Definition: c_wiz.cpp:979
llevDebug
@ llevDebug
Definition: logger.h:13
command_dmhide
void command_dmhide(object *op, const char *params)
Definition: c_wiz.cpp:2480
command_blush
void command_blush(object *op, const char *params)
Definition: c_chat.cpp:953
is_valid_types_gen.type
list type
Definition: is_valid_types_gen.py:25
command_register
command_registration command_register(const char *name, uint8_t type, command_function func, float time)
Definition: commands.cpp:102
command_sneeze
void command_sneeze(object *op, const char *params)
Definition: c_chat.cpp:1140
command_burp
void command_burp(object *op, const char *params)
Definition: c_chat.cpp:964
registered_command::type
uint8_t type
Definition: commands.cpp:39
command_southeast
void command_southeast(object *op, const char *params)
Definition: c_move.cpp:112
command_laugh
void command_laugh(object *op, const char *params)
Definition: c_chat.cpp:788
command_sigh
void command_sigh(object *op, const char *params)
Definition: c_chat.cpp:854