ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/socket/request.C
(Generate patch)

Comparing deliantra/server/socket/request.C (file contents):
Revision 1.119 by root, Fri Aug 24 00:26:10 2007 UTC vs.
Revision 1.126 by root, Tue Apr 22 07:01:47 2008 UTC

1/* 1/*
2 * This file is part of Crossfire TRT, the Roguelike Realtime MORPG. 2 * This file is part of Deliantra, the Roguelike Realtime MMORPG.
3 * 3 *
4 * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT team 4 * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
5 * Copyright (©) 2001,2007 Mark Wedel 5 * Copyright (©) 2001,2007 Mark Wedel
6 * Copyright (©) 1992,2007 Frank Tore Johansen 6 * Copyright (©) 1992,2007 Frank Tore Johansen
7 * 7 *
8 * Crossfire TRT is free software: you can redistribute it and/or modify 8 * Deliantra 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 3 of the License, or 10 * the Free Software Foundation, either version 3 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,
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, see <http://www.gnu.org/licenses/>. 19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 * 20 *
21 * The authors can be reached via e-mail to <crossfire@schmorp.de> 21 * The authors can be reached via e-mail to <support@deliantra.net>
22 */ 22 */
23 23
24/** 24/**
25 * \file 25 * \file
26 * Client handling. 26 * Client handling.
263{ 263{
264 char *token = buf; 264 char *token = buf;
265 buf += strlen (buf) + 9; 265 buf += strlen (buf) + 9;
266 266
267 // initial map and its origin 267 // initial map and its origin
268 maptile *map = pl->ob->map; 268 maptile *map = pl->observe->map;
269 int mapx = pl->ns->mapx / 2 - pl->ob->x; 269 int mapx = pl->ns->mapx / 2 - pl->observe->x;
270 int mapy = pl->ns->mapy / 2 - pl->ob->y; 270 int mapy = pl->ns->mapy / 2 - pl->observe->y;
271 int max_distance = 8; // limit maximum path length to something generous 271 int max_distance = 8; // limit maximum path length to something generous
272 272
273 while (*buf && map && max_distance) 273 while (*buf && map && max_distance)
274 { 274 {
275 int dir = *buf++ - '1'; 275 int dir = *buf++ - '1';
276 276
277 if (dir >= 0 && dir <= 3) 277 if (dir >= 0 && dir <= 3)
278 { 278 {
279 if (!map->tile_path [dir]) 279 if (!map->tile_path [dir])
280 map = 0; 280 map = 0;
281 else if (map->tile_available (dir)) 281 else if (map->tile_available (dir, false))
282 { 282 {
283 maptile *neigh = map->tile_map [dir]; 283 maptile *neigh = map->tile_map [dir];
284 284
285 switch (dir) 285 switch (dir)
286 { 286 {
300 max_distance = 0; 300 max_distance = 0;
301 } 301 }
302 302
303 if (!max_distance) 303 if (!max_distance)
304 send_packet_printf ("mapinfo %s error", token); 304 send_packet_printf ("mapinfo %s error", token);
305 else if (!map || !map->path[0]) 305 else if (!map || !map->path)
306 send_packet_printf ("mapinfo %s nomap", token); 306 send_packet_printf ("mapinfo %s nomap", token);
307 else 307 else
308 { 308 {
309 int flags = 0; 309 int flags = 0;
310 310
886 886
887/** 887/**
888 * Tells the client that here is a player it should start using. 888 * Tells the client that here is a player it should start using.
889 */ 889 */
890void 890void
891esrv_new_player (player *pl, uint32 weight) 891esrv_new_player (player *pl)
892{ 892{
893 sint32 weight = pl->ob->client_weight ();
894
893 packet sl ("player"); 895 packet sl ("player");
894 896
895 sl << uint32 (pl->ob->count) 897 sl << uint32 (pl->ob->count)
896 << uint32 (weight) 898 << uint32 (weight)
897 << uint32 (pl->ob->face) 899 << uint32 (pl->ob->face)
898 << data8 (pl->ob->name); 900 << data8 (pl->ob->name);
899 901
902#if 0
900 pl->ns->last_weight = weight; 903 pl->ns->last_weight = weight;
904#endif
901 pl->ns->send_packet (sl); 905 pl->ns->send_packet (sl);
902 SET_FLAG (pl->ob, FLAG_CLIENT_SENT); 906 SET_FLAG (pl->ob, FLAG_CLIENT_SENT);
903} 907}
904 908
905/****************************************************************************** 909/******************************************************************************
1031 1035
1032 /* If player is just joining the game, he isn't here yet, so the map 1036 /* If player is just joining the game, he isn't here yet, so the map
1033 * can get swapped out. If so, don't try to send them a map. All will 1037 * can get swapped out. If so, don't try to send them a map. All will
1034 * be OK once they really log in. 1038 * be OK once they really log in.
1035 */ 1039 */
1036 if (!plmap || plmap->in_memory != MAP_IN_MEMORY) 1040 if (!plmap || plmap->in_memory != MAP_ACTIVE)
1037 return; 1041 return;
1038 1042
1039 int x, y, ax, ay, startlen, max_x, max_y, oldlen; 1043 int x, y, ax, ay, startlen, max_x, max_y, oldlen;
1040 int estartlen, eoldlen; 1044 int estartlen, eoldlen;
1041 uint8 eentrysize; 1045 uint8 eentrysize;
1129 1133
1130 if (!m) 1134 if (!m)
1131 { 1135 {
1132 nx = x; ny = y; m = plmap; 1136 nx = x; ny = y; m = plmap;
1133 1137
1134 if (!xy_normalise (m, nx, ny)) 1138 if (xy_normalise (m, nx, ny))
1139 m->touch ();
1140 else
1135 m = 0; 1141 m = 0;
1136 } 1142 }
1137 1143
1138 int emask, mask; 1144 int emask, mask;
1139 emask = mask = (ax & 0x3f) << 10 | (ay & 0x3f) << 4; 1145 emask = mask = (ax & 0x3f) << 10 | (ay & 0x3f) << 4;
1156 } 1162 }
1157 1163
1158 continue; 1164 continue;
1159 } 1165 }
1160 1166
1161 m->touch ();
1162
1163 int d = pl->blocked_los[ax][ay]; 1167 int d = pl->blocked_los[ax][ay];
1164 1168
1165 if (d > 3) 1169 if (d > 3)
1166 { 1170 {
1167 1171
1242 uint8 flags = 0; 1246 uint8 flags = 0;
1243 tag_t player = 0; 1247 tag_t player = 0;
1244 1248
1245 // send hp information, if applicable 1249 // send hp information, if applicable
1246 if (object *op = ms.faces_obj [0]) 1250 if (object *op = ms.faces_obj [0])
1251 if (op->is_head () && !op->invisible)
1247 { 1252 {
1248 if (op->head || op->invisible) 1253 if (op->stats.maxhp > op->stats.hp
1249 ; // do not show 1254 && op->stats.maxhp > 0
1250 else if (op->type == PLAYER 1255 && (op->type == PLAYER
1256 || op->type == DOOR // does not work, have maxhp 0
1251 || QUERY_FLAG (op, FLAG_MONSTER) || QUERY_FLAG (op, FLAG_ALIVE) || QUERY_FLAG (op, FLAG_GENERATOR)) 1257 || QUERY_FLAG (op, FLAG_MONSTER) || QUERY_FLAG (op, FLAG_ALIVE) || QUERY_FLAG (op, FLAG_GENERATOR)))
1252 {
1253 if (op->stats.maxhp > 0 && (unsigned) op->stats.maxhp > (unsigned) op->stats.hp)
1254 { 1258 {
1255 stat_hp = 255 - (op->stats.hp * 255 + 254) / op->stats.maxhp; 1259 stat_hp = 255 - (op->stats.hp * 255 + 254) / op->stats.maxhp;
1256 stat_width = op->arch->max_x - op->arch->x; //TODO: should be upper-left edge 1260 stat_width = op->arch->max_x - op->arch->x; //TODO: should be upper-left edge
1257 } 1261 }
1258 }
1259 1262
1260 if (op->msg && op->msg[0] == '@') 1263 if (op->msg && op->msg[0] == '@')
1261 flags |= 1; 1264 flags |= 1;
1262 1265
1263 if (op->type == PLAYER && op != ob) 1266 if (op->type == PLAYER && op != ob)
1264 player = op->count; 1267 player = op->count;
1265 } 1268 }
1266 1269
1267 if (lastcell.stat_hp != stat_hp) 1270 if (lastcell.stat_hp != stat_hp)
1268 { 1271 {
1269 lastcell.stat_hp = stat_hp; 1272 lastcell.stat_hp = stat_hp;
1270 1273

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines