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.83 by root, Mon Apr 2 18:04:47 2007 UTC vs.
Revision 1.100 by root, Mon May 28 21:22:26 2007 UTC

1/* 1/*
2 * CrossFire, A Multiplayer game for X-windows 2 * This file is part of Crossfire TRT, the Multiplayer Online Role Playing Game.
3 * 3 *
4 * Copyright (C) 2005, 2006, 2007 Marc Lehmann & Crossfire+ Development Team 4 * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT team
5 * Copyright (C) 2001 Mark Wedel 5 * Copyright (©) 2001,2007 Mark Wedel
6 * Copyright (C) 1992 Frank Tore Johansen 6 * Copyright (©) 1992,2007 Frank Tore Johansen
7 * 7 *
8 * This program is free software; you can redistribute it and/or modify 8 * Crossfire TRT is free software; you can redistribute it and/or modify it
9 * it under the terms of the GNU General Public License as published by 9 * under the terms of the GNU General Public License as published by the Free
10 * the Free Software Foundation; either version 2 of the License, or 10 * Software Foundation; either version 2 of the License, or (at your option)
11 * (at your option) any later version. 11 * 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, but
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 * GNU General Public License for more details. 16 * 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 along
19 * along with this program; if not, write to the Free Software 19 * with Crossfire TRT; if not, write to the Free Software Foundation, Inc. 51
20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 20 * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 * 21 *
22 * The author can be reached via e-mail to <crossfire@schmorp.de> 22 * The authors 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.
148{ 148{
149 client &socket = *pl->ns; 149 client &socket = *pl->ns;
150 object *ob = pl->ob; 150 object *ob = pl->ob;
151 char buf[MAX_BUF]; /* eauugggh */ 151 char buf[MAX_BUF]; /* eauugggh */
152 152
153 if (socket.force_newmap) 153 if (socket.current_map != ob->map || socket.force_newmap)
154 {
155 // force newmap is used for clients that do not redraw their map
156 // after image uploads.
157 socket.current_map = ob->map;
158 clear_map (pl);
159 }
160 else if (socket.current_map != ob->map)
161 { 154 {
162 clear_map (pl); 155 clear_map (pl);
163 socket.current_map = ob->map; 156 socket.current_map = ob->map;
164 157
165 if (socket.mapinfocmd) 158 if (socket.mapinfocmd)
166 { 159 {
167 if (ob->map && ob->map->path[0]) 160 if (ob->map && ob->map->path[0])
168 { 161 {
169 int flags = 0; 162 int flags = 0;
170 163
171 if (ob->map->tile_path[0]) 164 if (ob->map->tile_path[0]) flags |= 1;
172 flags |= 1;
173 if (ob->map->tile_path[1]) 165 if (ob->map->tile_path[1]) flags |= 2;
174 flags |= 2;
175 if (ob->map->tile_path[2]) 166 if (ob->map->tile_path[2]) flags |= 4;
176 flags |= 4;
177 if (ob->map->tile_path[3]) 167 if (ob->map->tile_path[3]) flags |= 8;
178 flags |= 8;
179 168
180 snprintf (buf, MAX_BUF, "mapinfo - spatial %d %d %d %d %d %s", 169 snprintf (buf, MAX_BUF, "mapinfo - spatial %d %d %d %d %d %s",
181 flags, socket.mapx / 2 - ob->x, socket.mapy / 2 - ob->y, ob->map->width, ob->map->height, &ob->map->path); 170 flags, socket.mapx / 2 - ob->x, socket.mapy / 2 - ob->y, ob->map->width, ob->map->height, &ob->map->path);
182 } 171 }
183 else 172 else
332 snprintf (bigbuf, MAX_BUF, "mapinfo %s error", token); 321 snprintf (bigbuf, MAX_BUF, "mapinfo %s error", token);
333 else if (map && map->path[0]) 322 else if (map && map->path[0])
334 { 323 {
335 int flags = 0; 324 int flags = 0;
336 325
337 if (map->tile_path[0]) 326 if (map->tile_path[0]) flags |= 1;
338 flags |= 1;
339 if (map->tile_path[1]) 327 if (map->tile_path[1]) flags |= 2;
340 flags |= 2;
341 if (map->tile_path[2]) 328 if (map->tile_path[2]) flags |= 4;
342 flags |= 4;
343 if (map->tile_path[3]) 329 if (map->tile_path[3]) flags |= 8;
344 flags |= 8;
345 330
346 snprintf (bigbuf, MAX_BUF, "mapinfo %s spatial %d %d %d %d %d %s", token, flags, mapx, mapy, map->width, map->height, &map->path); 331 snprintf (bigbuf, MAX_BUF, "mapinfo %s spatial %d %d %d %d %d %s", token, flags, mapx, mapy, map->width, map->height, &map->path);
347 } 332 }
348 else 333 else
349 snprintf (bigbuf, MAX_BUF, "mapinfo %s nomap", token); 334 snprintf (bigbuf, MAX_BUF, "mapinfo %s nomap", token);
505 */ 490 */
506void 491void
507AskSmooth (char *buf, int len, client *ns) 492AskSmooth (char *buf, int len, client *ns)
508{ 493{
509 ns->send_face (atoi (buf)); 494 ns->send_face (atoi (buf));
495 ns->flush_fx ();
510} 496}
511 497
512/** 498/**
513 * This handles the general commands from the client (ie, north, fire, cast, 499 * This handles the general commands from the client (ie, north, fire, cast,
514 * etc.) 500 * etc.)
617 { 603 {
618 case ST_PLAYING: 604 case ST_PLAYING:
619 LOG (llevError, "Got reply message with ST_PLAYING input state\n"); 605 LOG (llevError, "Got reply message with ST_PLAYING input state\n");
620 break; 606 break;
621 607
622 case ST_CHANGE_CLASS:
623 key_change_class (pl->ob, buf[0]);
624 break;
625
626 case ST_GET_PARTY_PASSWORD: /* Get password for party */ 608 case ST_GET_PARTY_PASSWORD: /* Get password for party */
627 receive_party_password (pl->ob, 13); 609 receive_party_password (pl->ob, 13);
628 break; 610 break;
629 611
630 default: 612 default:
669 651
670 cp = strchr (cp + 1, ' '); 652 cp = strchr (cp + 1, ' ');
671 653
672 if (cp) 654 if (cp)
673 { 655 {
674 assign (ns->version, cp + 1); 656 ns->version = cp + 1;
675 657
676 if (ns->sc_version < 1026) 658 if (ns->sc_version < 1026)
677 ns->send_packet_printf ("drawinfo %d %s", NDI_RED, 659 ns->send_packet_printf ("drawinfo %d %s", NDI_RED,
678 "**** VERSION WARNING ****\n**** CLIENT IS TOO OLD!! UPDATE THE CLIENT!! ****"); 660 "**** VERSION WARNING ****\n**** CLIENT IS TOO OLD!! UPDATE THE CLIENT!! ****");
679 } 661 }
744send_query (client *ns, uint8 flags, const char *text) 726send_query (client *ns, uint8 flags, const char *text)
745{ 727{
746 ns->send_packet_printf ("query %d %s", flags, text ? text : ""); 728 ns->send_packet_printf ("query %d %s", flags, text ? text : "");
747} 729}
748 730
731/**
732 * Get player's current range attack in obuf.
733 */
734static void
735rangetostring (player *pl, char *obuf)
736{
737 dynbuf_text buf;
738
739 if (pl->ranged_ob)
740 buf << " Range" << (pl->ob->current_weapon == pl->ranged_ob ? "*" : "") << ": " << pl->ranged_ob->name;
741
742 if (pl->combat_ob)
743 buf << " Combat" << (pl->ob->current_weapon == pl->combat_ob ? "*" : "") << ": " << pl->combat_ob->name;
744
745 //TODO: remove this when slot system is working, this is only for debugging
746 if (pl->ob->chosen_skill)
747 buf << " Skill*: " << pl->ob->chosen_skill->name;
748
749 //TODO: maybe golem should become the current_weapon, quite simply?
750 if (pl->golem)
751 buf << " Golem*: " << pl->golem->name;
752
753 buf.linearise (obuf);
754 obuf [buf.size ()] = 0;
755}
756
749#define AddIfInt64(Old,New,Type) if (Old != New) {\ 757#define AddIfInt64(Old,New,Type) if (Old != New) {\
750 Old = New; \ 758 Old = New; \
751 sl << uint8 (Type) << uint64 (New); \ 759 sl << uint8 (Type) << uint64 (New); \
752 } 760 }
753 761
759#define AddIfShort(Old,New,Type) if (Old != New) {\ 767#define AddIfShort(Old,New,Type) if (Old != New) {\
760 Old = New; \ 768 Old = New; \
761 sl << uint8 (Type) << uint16 (New); \ 769 sl << uint8 (Type) << uint16 (New); \
762 } 770 }
763 771
764#define AddIfFloat(Old,New,Type) if (Old != New) {\ 772#define AddIfFloat(Old,New,Type,mult) if (Old != New) {\
765 Old = New; \ 773 Old = New; \
766 sl << uint8 (Type) << uint32 (New*FLOAT_MULTI); \ 774 sl << uint8 (Type) << uint32 (New*FLOAT_MULTI*mult); \
767 } 775 }
768 776
769#define AddIfString(Old,New,Type) if (Old == NULL || strcmp(Old,New)) {\ 777#define AddIfString(Old,New,Type) if (Old == NULL || strcmp(Old,New)) {\
770 free(Old); Old = strdup (New);\ 778 free(Old); Old = strdup (New);\
771 sl << uint8 (Type) << data8 (New); \ 779 sl << uint8 (Type) << data8 (New); \
824 AddIfInt64 (ns->last_stats.exp, ob->stats.exp, CS_STAT_EXP64); 832 AddIfInt64 (ns->last_stats.exp, ob->stats.exp, CS_STAT_EXP64);
825 AddIfShort (ns->last_level, ob->level, CS_STAT_LEVEL); 833 AddIfShort (ns->last_level, ob->level, CS_STAT_LEVEL);
826 AddIfShort (ns->last_stats.wc, ob->stats.wc, CS_STAT_WC); 834 AddIfShort (ns->last_stats.wc, ob->stats.wc, CS_STAT_WC);
827 AddIfShort (ns->last_stats.ac, ob->stats.ac, CS_STAT_AC); 835 AddIfShort (ns->last_stats.ac, ob->stats.ac, CS_STAT_AC);
828 AddIfShort (ns->last_stats.dam, ob->stats.dam, CS_STAT_DAM); 836 AddIfShort (ns->last_stats.dam, ob->stats.dam, CS_STAT_DAM);
829 AddIfFloat (ns->last_speed, ob->speed, CS_STAT_SPEED); 837 AddIfFloat (ns->last_speed, ob->speed, CS_STAT_SPEED, 1.f/TICK);
830 AddIfShort (ns->last_stats.food, ob->stats.food, CS_STAT_FOOD); 838 AddIfShort (ns->last_stats.food, ob->stats.food, CS_STAT_FOOD);
831 AddIfFloat (ns->last_weapon_sp, pl->weapon_sp, CS_STAT_WEAP_SP); 839 AddIfFloat (ns->last_weapon_sp, pl->weapon_sp, CS_STAT_WEAP_SP, 1.f/TICK);
832 AddIfInt (ns->last_weight_limit, weight_limit[ob->stats.Str], CS_STAT_WEIGHT_LIM); 840 AddIfInt (ns->last_weight_limit, weight_limit[ob->stats.Str], CS_STAT_WEIGHT_LIM);
833 841
834 flags = 0; 842 flags = 0;
835 843
836 if (pl->fire_on) 844 if (pl->fire_on)
858 AddIfInt (ns->last_path_attuned, ob->path_attuned, CS_STAT_SPELL_ATTUNE); 866 AddIfInt (ns->last_path_attuned, ob->path_attuned, CS_STAT_SPELL_ATTUNE);
859 AddIfInt (ns->last_path_repelled, ob->path_repelled, CS_STAT_SPELL_REPEL); 867 AddIfInt (ns->last_path_repelled, ob->path_repelled, CS_STAT_SPELL_REPEL);
860 AddIfInt (ns->last_path_denied, ob->path_denied, CS_STAT_SPELL_DENY); 868 AddIfInt (ns->last_path_denied, ob->path_denied, CS_STAT_SPELL_DENY);
861 } 869 }
862 870
863 rangetostring (ob, buf); /* we want use the new fire & run system in new client */ 871 rangetostring (pl, buf); /* we want use the new fire & run system in new client */
864 AddIfString (ns->stats.range, buf, CS_STAT_RANGE); 872 AddIfString (ns->stats.range, buf, CS_STAT_RANGE);
865 set_title (ob, buf); 873 set_title (ob, buf);
866 AddIfString (ns->stats.title, buf, CS_STAT_TITLE); 874 AddIfString (ns->stats.title, buf, CS_STAT_TITLE);
867 875
868 /* Only send it away if we have some actual data */ 876 /* Only send it away if we have some actual data */
1189 1197
1190 mapspace &ms = m->at (nx, ny); 1198 mapspace &ms = m->at (nx, ny);
1191 1199
1192 if (socket.extmap) 1200 if (socket.extmap)
1193 { 1201 {
1194 uint8 stat_hp = 0; 1202 uint8 stat_hp = 0;
1195 uint8 stat_width = 0; 1203 uint8 stat_width = 0;
1196 uint8 flags = 0; 1204 uint8 flags = 0;
1197 UUID player = 0; 1205 tag_t player = 0;
1198 1206
1199 // send hp information, if applicable 1207 // send hp information, if applicable
1200 if (object *op = ms.faces_obj [0]) 1208 if (object *op = ms.faces_obj [0])
1201 { 1209 {
1202 if (op->head || op->invisible) 1210 if (op->head || op->invisible)
1243 1251
1244 mask |= 0x8; 1252 mask |= 0x8;
1245 *last_ext |= 0x80; 1253 *last_ext |= 0x80;
1246 last_ext = &sl[sl.length ()]; 1254 last_ext = &sl[sl.length ()];
1247 1255
1248 sl << uint8 (0x47) << uint8 (8) << (uint64)player; 1256 sl << uint8 (0x47) << uint8 (4) << (uint32)player;
1249 } 1257 }
1250 1258
1251 if (lastcell.flags != flags) 1259 if (lastcell.flags != flags)
1252 { 1260 {
1253 lastcell.flags = flags; 1261 lastcell.flags = flags;
1326 esl.reset (eoldlen); 1334 esl.reset (eoldlen);
1327 } 1335 }
1328 } /* else this is a viewable space */ 1336 } /* else this is a viewable space */
1329 } /* for x loop */ 1337 } /* for x loop */
1330 } /* for y loop */ 1338 } /* for y loop */
1339
1340 socket.flush_fx ();
1331 1341
1332 /* Verify that we in fact do need to send this */ 1342 /* Verify that we in fact do need to send this */
1333 if (socket.ext_mapinfos) 1343 if (socket.ext_mapinfos)
1334 { 1344 {
1335 if (!(sl.length () > startlen || socket.sent_scroll)) 1345 if (!(sl.length () > startlen || socket.sent_scroll))

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines