ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/server/c_new.C
(Generate patch)

Comparing deliantra/server/server/c_new.C (file contents):
Revision 1.4 by root, Sun Sep 10 15:59:57 2006 UTC vs.
Revision 1.11 by pippijn, Sat Jan 6 14:42:30 2007 UTC

1
2/*
3 * static char *rcsid_c_new_c =
4 * "$Id: c_new.C,v 1.4 2006/09/10 15:59:57 root Exp $";
5 */
6
7/* 1/*
8 CrossFire, A Multiplayer game for X-windows 2 CrossFire, A Multiplayer game for X-windows
9 3
4 Copyright (C) 2005, 2006, 2007 Marc Lehmann & Crossfire+ Development Team
10 Copyright (C) 2002 Mark Wedel & Crossfire Development Team 5 Copyright (C) 2002 Mark Wedel & Crossfire Development Team
11 Copyright (C) 1992 Frank Tore Johansen 6 Copyright (C) 1992 Frank Tore Johansen
12 7
13 This program is free software; you can redistribute it and/or modify 8 This program is free software; you can redistribute it and/or modify
14 it under the terms of the GNU General Public License as published by 9 it under the terms of the GNU General Public License as published by
22 17
23 You should have received a copy of the GNU General Public License 18 You should have received a copy of the GNU General Public License
24 along with this program; if not, write to the Free Software 19 along with this program; if not, write to the Free Software
25 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26 21
27 The author can be reached via e-mail to crossfire-devel@real-time.com 22 The author can be reached via e-mail to <crossfire@schmorp.de>
28*/ 23*/
29 24
30/* This file deals with administrative commands from the client. */ 25/* This file deals with administrative commands from the client. */
31#include <global.h> 26#include <global.h>
32#include <commands.h> 27#include <commands.h>
33#ifndef __CEXTRACT__
34# include <sproto.h> 28#include <sproto.h>
35#endif
36
37#ifndef tolower
38# define tolower(C) (((C) >= 'A' && (C) <= 'Z')? (C) - 'A' + 'a': (C))
39#endif
40
41 29
42static int 30static int
43compare_A (const void *a, const void *b) 31compare_A (const void *a, const void *b)
44{ 32{
45 return strcmp (((CommArray_s *) a)->name, ((CommArray_s *) b)->name); 33 return strcmp (((CommArray_s *)a)->name, ((CommArray_s *)b)->name);
46} 34}
47 35
48static CommArray_s * 36static CommArray_s *
49find_command_element (char *cmd, CommArray_s * commarray, int commsize) 37find_command_element (char *cmd, CommArray_s *commarray, int commsize)
50{ 38{
51 CommArray_s *asp, dummy; 39 CommArray_s *asp, dummy;
52 40
53 dummy.name = cmd; 41 dummy.name = cmd;
54 asp = (CommArray_s *) bsearch ((void *) &dummy, (void *) commarray, commsize, sizeof (CommArray_s), compare_A); 42 asp = (CommArray_s *) bsearch ((void *) &dummy, (void *) commarray, commsize, sizeof (CommArray_s), compare_A);
57 45
58/* This function is called from the new client/server code. 46/* This function is called from the new client/server code.
59 * pl is the player who is issuing the command, command is the 47 * pl is the player who is issuing the command, command is the
60 * command. 48 * command.
61 */ 49 */
62int 50void
63execute_newserver_command (object *pl, char *command) 51execute_newserver_command (object *pl, char *command)
64{ 52{
65 CommArray_s *csp; 53 CommArray_s *csp;
66 char *cp; 54 char *cp;
67 55
74 while ((cp >= command) && (*cp == ' ')) 62 while ((cp >= command) && (*cp == ' '))
75 { 63 {
76 *cp = '\0'; 64 *cp = '\0';
77 cp--; 65 cp--;
78 } 66 }
67
79 cp = strchr (command, ' '); 68 cp = strchr (command, ' ');
80 if (cp) 69 if (cp)
81 { 70 {
82 *(cp++) = '\0'; 71 *(cp++) = '\0';
83 while (*cp == ' ') 72 while (*cp == ' ')
84 cp++; 73 cp++;
85 } 74 }
86 75
87 csp = find_plugin_command (command, pl); 76 if (!INVOKE_PLAYER (COMMAND, pl->contr, ARG_STRING (command), ARG_STRING (cp)))
77 {
78 csp = find_command_element (command, NewServerCommands, NewServerCommandSize);
79 if (!csp) csp = find_command_element (command, Commands, CommandsSize);
80 if (!csp) csp = find_command_element (command, CommunicationCommands, CommunicationCommandSize);
81 if (!csp && QUERY_FLAG (pl, FLAG_WIZ))
82 csp = find_command_element (command, WizCommands, WizCommandsSize);
88 83
89 if (!csp) 84 if (!csp)
90 csp = find_command_element (command, NewServerCommands, NewServerCommandSize); 85 {
91 if (!csp) 86 new_draw_info_format (NDI_UNIQUE, 0, pl, "'%s' is not a valid command.", command);
92 csp = find_command_element (command, Commands, CommandsSize); 87 return;
93 if (!csp) 88 }
94 csp = find_command_element (command, CommunicationCommands, CommunicationCommandSize);
95 if (!csp && QUERY_FLAG (pl, FLAG_WIZ))
96 csp = find_command_element (command, WizCommands, WizCommandsSize);
97 89
98 if (csp == NULL) 90 pl->speed_left -= csp->time;
99 { 91
100 new_draw_info_format (NDI_UNIQUE, 0, pl, "'%s' is not a valid command.", command); 92 csp->func (pl, cp);
101 return 0;
102 } 93 }
103
104 pl->speed_left -= csp->time;
105
106 /* A character time can never exceed his speed (which in many cases,
107 * if wearing armor, is less than one.) Thus, in most cases, if
108 * the command takes 1.0, the player's speed will be less than zero.
109 * it is only really an issue if time goes below -1
110 * Due to various reasons that are too long to go into here, we will
111 * actually still execute player even if his time is less than 0,
112 * but greater than -1. This is to improve the performance of the
113 * new client/server. In theory, it shouldn't make much difference.
114 */
115
116 if (csp->time && pl->speed_left < -2.0)
117 {
118 LOG (llevDebug, "execute_newclient_command: Player issued command that takes more time than he has left.\n");
119 }
120 return csp->func (pl, cp);
121} 94}
122 95
123int 96int
124command_run (object *op, char *params) 97command_run (object *op, char *params)
125{ 98{
129 if (dir < 0 || dir >= 9) 102 if (dir < 0 || dir >= 9)
130 { 103 {
131 new_draw_info (NDI_UNIQUE, 0, op, "Can't run into a non adjacent square."); 104 new_draw_info (NDI_UNIQUE, 0, op, "Can't run into a non adjacent square.");
132 return 0; 105 return 0;
133 } 106 }
107
134 op->contr->run_on = 1; 108 op->contr->run_on = 1;
135 return move_player (op, dir); 109 return move_player (op, dir);
136} 110}
137 111
138int 112int

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines