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

# Content
1
2 /*
3 * static char *rcsid_c_new_c =
4 * "$Id: c_new.C,v 1.3 2006-09-07 10:01:57 pippijn Exp $";
5 */
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 # 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
42 static int
43 compare_A (const void *a, const void *b)
44 {
45 return strcmp (((CommArray_s *) a)->name, ((CommArray_s *) b)->name);
46 }
47
48 static CommArray_s *
49 find_command_element (char *cmd, CommArray_s * commarray, int commsize)
50 {
51 CommArray_s *asp, dummy;
52
53 dummy.name = cmd;
54 asp = (CommArray_s *) bsearch ((void *) &dummy, (void *) commarray, commsize, sizeof (CommArray_s), compare_A);
55 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
63 execute_newserver_command (object *pl, char *command)
64 {
65 CommArray_s *csp;
66 char *cp;
67
68 pl->contr->has_hit = 0;
69
70 /*
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 }
79 cp = strchr (command, ' ');
80 if (cp)
81 {
82 *(cp++) = '\0';
83 while (*cp == ' ')
84 cp++;
85 }
86
87 csp = find_plugin_command (command, pl);
88
89 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 }
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 }
122
123 int
124 command_run (object *op, char *params)
125 {
126 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 }
134 op->contr->run_on = 1;
135 return move_player (op, dir);
136 }
137
138 int
139 command_run_stop (object *op, char *params)
140 {
141 op->contr->run_on = 0;
142 return 1;
143 }
144
145 int
146 command_fire (object *op, char *params)
147 {
148 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 };
156 op->contr->fire_on = 1;
157 return move_player (op, dir);
158 }
159
160 int
161 command_fire_stop (object *op, char *params)
162 {
163 op->contr->fire_on = 0;
164 return 1;
165 }
166
167 int
168 bad_command (object *op, char *params)
169 {
170 new_draw_info (NDI_UNIQUE, 0, op, "bind and unbind are no longer handled on the server");
171 return 1;
172 }