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.3 by pippijn, Thu Sep 7 10:01:57 2006 UTC vs.
Revision 1.8 by root, Tue Dec 12 16:59:35 2006 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines