ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/server/c_new.C
Revision: 1.4
Committed: Sun Sep 10 15:59:57 2006 UTC (17 years, 8 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.3: +93 -79 lines
Log Message:
indent

File Contents

# User Rev Content
1 root 1.4
2 elmex 1.1 /*
3     * static char *rcsid_c_new_c =
4 root 1.4 * "$Id: c_new.C,v 1.3 2006-09-07 10:01:57 pippijn Exp $";
5 elmex 1.1 */
6    
7     /*
8     CrossFire, A Multiplayer game for X-windows
9    
10     Copyright (C) 2002 Mark Wedel & Crossfire Development Team
11     Copyright (C) 1992 Frank Tore Johansen
12    
13     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
15     the Free Software Foundation; either version 2 of the License, or
16     (at your option) any later version.
17    
18     This program is distributed in the hope that it will be useful,
19     but WITHOUT ANY WARRANTY; without even the implied warranty of
20     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21     GNU General Public License for more details.
22    
23     You should have received a copy of the GNU General Public License
24     along with this program; if not, write to the Free Software
25     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26    
27     The author can be reached via e-mail to crossfire-devel@real-time.com
28     */
29    
30     /* This file deals with administrative commands from the client. */
31     #include <global.h>
32     #include <commands.h>
33     #ifndef __CEXTRACT__
34 root 1.4 # include <sproto.h>
35 elmex 1.1 #endif
36    
37     #ifndef tolower
38 root 1.4 # define tolower(C) (((C) >= 'A' && (C) <= 'Z')? (C) - 'A' + 'a': (C))
39 elmex 1.1 #endif
40    
41    
42 root 1.4 static int
43     compare_A (const void *a, const void *b)
44 elmex 1.1 {
45 root 1.4 return strcmp (((CommArray_s *) a)->name, ((CommArray_s *) b)->name);
46 elmex 1.1 }
47    
48 root 1.4 static CommArray_s *
49     find_command_element (char *cmd, CommArray_s * commarray, int commsize)
50 elmex 1.1 {
51     CommArray_s *asp, dummy;
52    
53 root 1.4 dummy.name = cmd;
54     asp = (CommArray_s *) bsearch ((void *) &dummy, (void *) commarray, commsize, 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 root 1.4 int
63     execute_newserver_command (object *pl, char *command)
64 elmex 1.1 {
65 root 1.4 CommArray_s *csp;
66     char *cp;
67 elmex 1.1
68 root 1.4 pl->contr->has_hit = 0;
69 elmex 1.1
70 root 1.4 /*
71     * remove trailing spaces from commant
72     */
73     cp = command + strlen (command) - 1;
74     while ((cp >= command) && (*cp == ' '))
75     {
76     *cp = '\0';
77     cp--;
78 elmex 1.1 }
79 root 1.4 cp = strchr (command, ' ');
80     if (cp)
81     {
82     *(cp++) = '\0';
83     while (*cp == ' ')
84     cp++;
85 elmex 1.1 }
86    
87 root 1.4 csp = find_plugin_command (command, pl);
88 elmex 1.1
89 root 1.4 if (!csp)
90     csp = find_command_element (command, NewServerCommands, NewServerCommandSize);
91     if (!csp)
92     csp = find_command_element (command, Commands, CommandsSize);
93     if (!csp)
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    
98     if (csp == NULL)
99     {
100     new_draw_info_format (NDI_UNIQUE, 0, pl, "'%s' is not a valid command.", command);
101     return 0;
102 elmex 1.1 }
103    
104 root 1.4 pl->speed_left -= csp->time;
105 elmex 1.1
106 root 1.4 /* 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 elmex 1.1 }
120 root 1.4 return csp->func (pl, cp);
121 elmex 1.1 }
122    
123 root 1.4 int
124     command_run (object *op, char *params)
125 elmex 1.1 {
126 root 1.4 int dir;
127    
128     dir = params ? atoi (params) : 0;
129     if (dir < 0 || dir >= 9)
130     {
131     new_draw_info (NDI_UNIQUE, 0, op, "Can't run into a non adjacent square.");
132     return 0;
133 elmex 1.1 }
134 root 1.4 op->contr->run_on = 1;
135     return move_player (op, dir);
136 elmex 1.1 }
137    
138 root 1.4 int
139     command_run_stop (object *op, char *params)
140 elmex 1.1 {
141 root 1.4 op->contr->run_on = 0;
142     return 1;
143 elmex 1.1 }
144    
145 root 1.4 int
146     command_fire (object *op, char *params)
147 elmex 1.1 {
148 root 1.4 int dir;
149    
150     dir = params ? atoi (params) : 0;
151     if (dir < 0 || dir >= 9)
152     {
153     new_draw_info (NDI_UNIQUE, 0, op, "Can't fire to a non adjacent square.");
154     return 0;
155 elmex 1.1 };
156 root 1.4 op->contr->fire_on = 1;
157     return move_player (op, dir);
158 elmex 1.1 }
159    
160 root 1.4 int
161     command_fire_stop (object *op, char *params)
162 elmex 1.1 {
163 root 1.4 op->contr->fire_on = 0;
164     return 1;
165 elmex 1.1 }
166    
167 root 1.4 int
168     bad_command (object *op, char *params)
169 elmex 1.1 {
170 root 1.4 new_draw_info (NDI_UNIQUE, 0, op, "bind and unbind are no longer handled on the server");
171     return 1;
172 elmex 1.1 }