1 | /* |
1 | /* |
2 | CrossFire, A Multiplayer game for X-windows |
2 | * CrossFire, A Multiplayer game for X-windows |
3 | |
3 | * |
4 | Copyright (C) 2005, 2006, 2007 Marc Lehmann & Crossfire+ Development Team |
4 | * Copyright (C) 2005, 2006, 2007 Marc Lehmann & Crossfire+ Development Team |
5 | Copyright (C) 2001 Mark Wedel |
5 | * Copyright (C) 2001 Mark Wedel |
6 | Copyright (C) 1992 Frank Tore Johansen |
6 | * Copyright (C) 1992 Frank Tore Johansen |
7 | |
7 | * |
8 | 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 |
9 | 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 |
10 | the Free Software Foundation; either version 2 of the License, or |
10 | * the Free Software Foundation; either version 2 of the License, or |
11 | (at your option) any later version. |
11 | * (at your option) any later version. |
12 | |
12 | * |
13 | This program is distributed in the hope that it will be useful, |
13 | * This program is distributed in the hope that it will be useful, |
14 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
16 | GNU General Public License for more details. |
16 | * GNU General Public License for more details. |
17 | |
17 | * |
18 | 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 |
19 | along with this program; if not, write to the Free Software |
19 | * along with this program; if not, write to the Free Software |
20 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
20 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
21 | |
21 | * |
22 | The author can be reached via e-mail to <crossfire@schmorp.de> |
22 | * The author can be reached via e-mail to <crossfire@schmorp.de> |
23 | */ |
23 | */ |
24 | |
24 | |
25 | /** |
25 | /** |
26 | * \file |
26 | * \file |
27 | * Client handling. |
27 | * Client handling. |
28 | * |
28 | * |
… | |
… | |
36 | * have the prototype of (char *data, int datalen, int client_num). This |
36 | * have the prototype of (char *data, int datalen, int client_num). This |
37 | * way, we can use one dispatch table. |
37 | * way, we can use one dispatch table. |
38 | * |
38 | * |
39 | * esrv_map_new starts updating the map |
39 | * esrv_map_new starts updating the map |
40 | * |
40 | * |
41 | * esrv_map_setbelow allows filling in all of the faces for the map. |
|
|
42 | * if a face has not already been sent to the client, it is sent now. |
|
|
43 | * |
|
|
44 | */ |
41 | */ |
45 | |
42 | |
46 | #include <global.h> |
43 | #include <global.h> |
47 | #include <sproto.h> |
44 | #include <sproto.h> |
48 | |
45 | |
… | |
… | |
147 | pl->ns->send_packet ("newmap"); |
144 | pl->ns->send_packet ("newmap"); |
148 | |
145 | |
149 | pl->ns->floorbox_reset (); |
146 | pl->ns->floorbox_reset (); |
150 | } |
147 | } |
151 | |
148 | |
152 | /** check for map change and send new map data */ |
149 | /** check for map/region change and send new map data */ |
153 | static void |
150 | static void |
154 | check_map_change (player *pl) |
151 | check_map_change (player *pl) |
155 | { |
152 | { |
156 | client &socket = *pl->ns; |
153 | client &socket = *pl->ns; |
157 | object *ob = pl->ob; |
154 | object *ob = pl->ob; |
… | |
… | |
201 | } |
198 | } |
202 | } |
199 | } |
203 | |
200 | |
204 | socket.current_x = ob->x; |
201 | socket.current_x = ob->x; |
205 | socket.current_y = ob->y; |
202 | socket.current_y = ob->y; |
|
|
203 | |
|
|
204 | region *reg = ob->region (); |
|
|
205 | if (socket.current_region != reg) |
|
|
206 | { |
|
|
207 | socket.current_region = reg; |
|
|
208 | socket.send_packet_printf ("drawinfo 0 You are now %s.\n(use whereami for more details)", ®->longname); |
|
|
209 | } |
206 | } |
210 | } |
207 | |
211 | |
208 | /** |
212 | /** |
209 | * RequestInfo is sort of a meta command. There is some specific |
213 | * RequestInfo is sort of a meta command. There is some specific |
210 | * request of information, but we call other functions to provide |
214 | * request of information, but we call other functions to provide |
… | |
… | |
798 | * commands. |
802 | * commands. |
799 | */ |
803 | */ |
800 | pl->count = 0; |
804 | pl->count = 0; |
801 | |
805 | |
802 | //TODO: schmorp thinks whatever this calculates, it makes no sense at all |
806 | //TODO: schmorp thinks whatever this calculates, it makes no sense at all |
803 | int time = FABS (pl->ob->speed) < 0.001 |
807 | int time = fabs (pl->ob->speed) < 0.001 |
804 | ? time = MAX_TIME * 100 |
808 | ? time = MAX_TIME * 100 |
805 | : time = (int) (MAX_TIME / FABS (pl->ob->speed)); |
809 | : time = (int) (MAX_TIME / fabs (pl->ob->speed)); |
806 | |
810 | |
807 | /* Send confirmation of command execution now */ |
811 | /* Send confirmation of command execution now */ |
808 | packet sl ("comc"); |
812 | packet sl ("comc"); |
809 | sl << uint16 (cmdid) << uint32 (time); |
813 | sl << uint16 (cmdid) << uint32 (time); |
810 | pl->ns->send_packet (sl); |
814 | pl->ns->send_packet (sl); |
… | |
… | |
1159 | /****************************************************************************** |
1163 | /****************************************************************************** |
1160 | * |
1164 | * |
1161 | * Start of map related commands. |
1165 | * Start of map related commands. |
1162 | * |
1166 | * |
1163 | ******************************************************************************/ |
1167 | ******************************************************************************/ |
1164 | |
|
|
1165 | /** |
|
|
1166 | * This adds face_num to a map cell at x,y. If the client doesn't have |
|
|
1167 | * the face yet, we will also send it. |
|
|
1168 | */ |
|
|
1169 | static void |
|
|
1170 | esrv_map_setbelow (client * ns, int x, int y, short face_num, struct Map *newmap) |
|
|
1171 | { |
|
|
1172 | if (newmap->cells[x][y].count >= MAP_LAYERS) |
|
|
1173 | { |
|
|
1174 | //TODO: one or the other, can't both have abort and return, verify and act |
|
|
1175 | LOG (llevError, "Too many faces in map cell %d %d\n", x, y); |
|
|
1176 | return; |
|
|
1177 | abort (); |
|
|
1178 | } |
|
|
1179 | |
|
|
1180 | newmap->cells[x][y].faces[newmap->cells[x][y].count] = face_num; |
|
|
1181 | newmap->cells[x][y].count++; |
|
|
1182 | |
|
|
1183 | if (!(ns->faces_sent[face_num] & NS_FACESENT_FACE)) |
|
|
1184 | esrv_send_face (ns, face_num, 0); |
|
|
1185 | } |
|
|
1186 | |
1168 | |
1187 | /** Clears a map cell */ |
1169 | /** Clears a map cell */ |
1188 | static void |
1170 | static void |
1189 | map_clearcell (struct MapCell *cell, int face0, int face1, int face2, int count) |
1171 | map_clearcell (struct MapCell *cell, int face0, int face1, int face2, int count) |
1190 | { |
1172 | { |
… | |
… | |
1991 | */ |
1973 | */ |
1992 | void |
1974 | void |
1993 | draw_client_map (object *pl) |
1975 | draw_client_map (object *pl) |
1994 | { |
1976 | { |
1995 | int i, j; |
1977 | int i, j; |
1996 | sint16 ax, ay, nx, ny; /* ax and ay goes from 0 to max-size of arrays */ |
1978 | sint16 ax, ay; /* ax and ay goes from 0 to max-size of arrays */ |
1997 | New_Face *face, *floor; |
|
|
1998 | New_Face *floor2; |
|
|
1999 | int d, mflags; |
1979 | int mflags; |
2000 | struct Map newmap; |
1980 | struct Map newmap; |
2001 | maptile *m, *pm; |
1981 | maptile *m, *pm; |
2002 | |
1982 | |
2003 | if (pl->type != PLAYER) |
1983 | if (pl->type != PLAYER) |
2004 | { |
1984 | { |
… | |
… | |
2185 | |
2165 | |
2186 | /* appends the spell *spell to the Socklist we will send the data to. */ |
2166 | /* appends the spell *spell to the Socklist we will send the data to. */ |
2187 | static void |
2167 | static void |
2188 | append_spell (player *pl, packet &sl, object *spell) |
2168 | append_spell (player *pl, packet &sl, object *spell) |
2189 | { |
2169 | { |
2190 | int len, i, skill = 0; |
2170 | int i, skill = 0; |
2191 | |
2171 | |
2192 | if (!(spell->name)) |
2172 | if (!(spell->name)) |
2193 | { |
2173 | { |
2194 | LOG (llevError, "item number %d is a spell with no name.\n", spell->count); |
2174 | LOG (llevError, "item number %d is a spell with no name.\n", spell->count); |
2195 | return; |
2175 | return; |