1 | /* |
1 | /* |
2 | * CrossFire, A Multiplayer game for X-windows |
2 | * CrossFire, A Multiplayer game |
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 | * |
… | |
… | |
159 | { |
159 | { |
160 | if (ob->map && ob->map->path[0]) |
160 | if (ob->map && ob->map->path[0]) |
161 | { |
161 | { |
162 | int flags = 0; |
162 | int flags = 0; |
163 | |
163 | |
164 | if (ob->map->tile_path[0]) |
164 | if (ob->map->tile_path[0]) flags |= 1; |
165 | flags |= 1; |
|
|
166 | if (ob->map->tile_path[1]) |
165 | if (ob->map->tile_path[1]) flags |= 2; |
167 | flags |= 2; |
|
|
168 | if (ob->map->tile_path[2]) |
166 | if (ob->map->tile_path[2]) flags |= 4; |
169 | flags |= 4; |
|
|
170 | if (ob->map->tile_path[3]) |
167 | if (ob->map->tile_path[3]) flags |= 8; |
171 | flags |= 8; |
|
|
172 | |
168 | |
173 | 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", |
174 | 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); |
175 | } |
171 | } |
176 | else |
172 | else |
… | |
… | |
325 | snprintf (bigbuf, MAX_BUF, "mapinfo %s error", token); |
321 | snprintf (bigbuf, MAX_BUF, "mapinfo %s error", token); |
326 | else if (map && map->path[0]) |
322 | else if (map && map->path[0]) |
327 | { |
323 | { |
328 | int flags = 0; |
324 | int flags = 0; |
329 | |
325 | |
330 | if (map->tile_path[0]) |
326 | if (map->tile_path[0]) flags |= 1; |
331 | flags |= 1; |
|
|
332 | if (map->tile_path[1]) |
327 | if (map->tile_path[1]) flags |= 2; |
333 | flags |= 2; |
|
|
334 | if (map->tile_path[2]) |
328 | if (map->tile_path[2]) flags |= 4; |
335 | flags |= 4; |
|
|
336 | if (map->tile_path[3]) |
329 | if (map->tile_path[3]) flags |= 8; |
337 | flags |= 8; |
|
|
338 | |
330 | |
339 | 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); |
340 | } |
332 | } |
341 | else |
333 | else |
342 | snprintf (bigbuf, MAX_BUF, "mapinfo %s nomap", token); |
334 | snprintf (bigbuf, MAX_BUF, "mapinfo %s nomap", token); |
… | |
… | |
611 | { |
603 | { |
612 | case ST_PLAYING: |
604 | case ST_PLAYING: |
613 | LOG (llevError, "Got reply message with ST_PLAYING input state\n"); |
605 | LOG (llevError, "Got reply message with ST_PLAYING input state\n"); |
614 | break; |
606 | break; |
615 | |
607 | |
616 | case ST_CHANGE_CLASS: |
|
|
617 | key_change_class (pl->ob, buf[0]); |
|
|
618 | break; |
|
|
619 | |
|
|
620 | case ST_GET_PARTY_PASSWORD: /* Get password for party */ |
608 | case ST_GET_PARTY_PASSWORD: /* Get password for party */ |
621 | receive_party_password (pl->ob, 13); |
609 | receive_party_password (pl->ob, 13); |
622 | break; |
610 | break; |
623 | |
611 | |
624 | default: |
612 | default: |
… | |
… | |
663 | |
651 | |
664 | cp = strchr (cp + 1, ' '); |
652 | cp = strchr (cp + 1, ' '); |
665 | |
653 | |
666 | if (cp) |
654 | if (cp) |
667 | { |
655 | { |
668 | assign (ns->version, cp + 1); |
656 | ns->version = cp + 1; |
669 | |
657 | |
670 | if (ns->sc_version < 1026) |
658 | if (ns->sc_version < 1026) |
671 | ns->send_packet_printf ("drawinfo %d %s", NDI_RED, |
659 | ns->send_packet_printf ("drawinfo %d %s", NDI_RED, |
672 | "**** VERSION WARNING ****\n**** CLIENT IS TOO OLD!! UPDATE THE CLIENT!! ****"); |
660 | "**** VERSION WARNING ****\n**** CLIENT IS TOO OLD!! UPDATE THE CLIENT!! ****"); |
673 | } |
661 | } |
… | |
… | |
738 | send_query (client *ns, uint8 flags, const char *text) |
726 | send_query (client *ns, uint8 flags, const char *text) |
739 | { |
727 | { |
740 | ns->send_packet_printf ("query %d %s", flags, text ? text : ""); |
728 | ns->send_packet_printf ("query %d %s", flags, text ? text : ""); |
741 | } |
729 | } |
742 | |
730 | |
|
|
731 | /** |
|
|
732 | * Get player's current range attack in obuf. |
|
|
733 | */ |
|
|
734 | static void |
|
|
735 | rangetostring (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 | |
743 | #define AddIfInt64(Old,New,Type) if (Old != New) {\ |
757 | #define AddIfInt64(Old,New,Type) if (Old != New) {\ |
744 | Old = New; \ |
758 | Old = New; \ |
745 | sl << uint8 (Type) << uint64 (New); \ |
759 | sl << uint8 (Type) << uint64 (New); \ |
746 | } |
760 | } |
747 | |
761 | |
… | |
… | |
753 | #define AddIfShort(Old,New,Type) if (Old != New) {\ |
767 | #define AddIfShort(Old,New,Type) if (Old != New) {\ |
754 | Old = New; \ |
768 | Old = New; \ |
755 | sl << uint8 (Type) << uint16 (New); \ |
769 | sl << uint8 (Type) << uint16 (New); \ |
756 | } |
770 | } |
757 | |
771 | |
758 | #define AddIfFloat(Old,New,Type) if (Old != New) {\ |
772 | #define AddIfFloat(Old,New,Type,mult) if (Old != New) {\ |
759 | Old = New; \ |
773 | Old = New; \ |
760 | sl << uint8 (Type) << uint32 (New*FLOAT_MULTI); \ |
774 | sl << uint8 (Type) << uint32 (New*FLOAT_MULTI*mult); \ |
761 | } |
775 | } |
762 | |
776 | |
763 | #define AddIfString(Old,New,Type) if (Old == NULL || strcmp(Old,New)) {\ |
777 | #define AddIfString(Old,New,Type) if (Old == NULL || strcmp(Old,New)) {\ |
764 | free(Old); Old = strdup (New);\ |
778 | free(Old); Old = strdup (New);\ |
765 | sl << uint8 (Type) << data8 (New); \ |
779 | sl << uint8 (Type) << data8 (New); \ |
… | |
… | |
818 | AddIfInt64 (ns->last_stats.exp, ob->stats.exp, CS_STAT_EXP64); |
832 | AddIfInt64 (ns->last_stats.exp, ob->stats.exp, CS_STAT_EXP64); |
819 | AddIfShort (ns->last_level, ob->level, CS_STAT_LEVEL); |
833 | AddIfShort (ns->last_level, ob->level, CS_STAT_LEVEL); |
820 | AddIfShort (ns->last_stats.wc, ob->stats.wc, CS_STAT_WC); |
834 | AddIfShort (ns->last_stats.wc, ob->stats.wc, CS_STAT_WC); |
821 | AddIfShort (ns->last_stats.ac, ob->stats.ac, CS_STAT_AC); |
835 | AddIfShort (ns->last_stats.ac, ob->stats.ac, CS_STAT_AC); |
822 | AddIfShort (ns->last_stats.dam, ob->stats.dam, CS_STAT_DAM); |
836 | AddIfShort (ns->last_stats.dam, ob->stats.dam, CS_STAT_DAM); |
823 | AddIfFloat (ns->last_speed, ob->speed, CS_STAT_SPEED); |
837 | AddIfFloat (ns->last_speed, ob->speed, CS_STAT_SPEED, 1.f/TICK); |
824 | AddIfShort (ns->last_stats.food, ob->stats.food, CS_STAT_FOOD); |
838 | AddIfShort (ns->last_stats.food, ob->stats.food, CS_STAT_FOOD); |
825 | 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); |
826 | 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); |
827 | |
841 | |
828 | flags = 0; |
842 | flags = 0; |
829 | |
843 | |
830 | if (pl->fire_on) |
844 | if (pl->fire_on) |
… | |
… | |
852 | 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); |
853 | 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); |
854 | 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); |
855 | } |
869 | } |
856 | |
870 | |
857 | 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 */ |
858 | AddIfString (ns->stats.range, buf, CS_STAT_RANGE); |
872 | AddIfString (ns->stats.range, buf, CS_STAT_RANGE); |
859 | set_title (ob, buf); |
873 | set_title (ob, buf); |
860 | AddIfString (ns->stats.title, buf, CS_STAT_TITLE); |
874 | AddIfString (ns->stats.title, buf, CS_STAT_TITLE); |
861 | |
875 | |
862 | /* Only send it away if we have some actual data */ |
876 | /* Only send it away if we have some actual data */ |