ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/server/c_new.C
Revision: 1.3
Committed: Thu Sep 7 10:01:57 2006 UTC (17 years, 9 months ago) by pippijn
Content type: text/plain
Branch: MAIN
Changes since 1.2: +1 -2 lines
Log Message:
Some cleanups.

File Contents

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