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.2 by root, Tue Aug 29 08:01:37 2006 UTC vs.
Revision 1.11 by pippijn, Sat Jan 6 14:42:30 2007 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines