--- deliantra/server/socket/request.C 2007/03/14 04:12:29 1.75 +++ deliantra/server/socket/request.C 2007/07/11 15:57:31 1.115 @@ -1,25 +1,24 @@ /* - * CrossFire, A Multiplayer game for X-windows + * This file is part of Crossfire TRT, the Roguelike Realtime MORPG. * - * Copyright (C) 2005, 2006, 2007 Marc Lehmann & Crossfire+ Development Team - * Copyright (C) 2001 Mark Wedel - * Copyright (C) 1992 Frank Tore Johansen + * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT team + * Copyright (©) 2001,2007 Mark Wedel + * Copyright (©) 1992,2007 Frank Tore Johansen * - * This program is free software; you can redistribute it and/or modify + * Crossfire TRT is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or + * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * The author can be reached via e-mail to + * along with this program. If not, see . + * + * The authors can be reached via e-mail to */ /** @@ -134,6 +133,8 @@ { memset (&pl->ns->lastmap, 0, sizeof (pl->ns->lastmap)); + pl->ns->force_newmap = false; + if (pl->ns->newmapcmd == 1) pl->ns->send_packet ("newmap"); @@ -145,14 +146,12 @@ check_map_change (player *pl) { client &socket = *pl->ns; - object *ob = pl->ob; - char buf[MAX_BUF]; /* eauugggh */ + object *ob = pl->observe; - if (socket.current_map != ob->map) + if (socket.current_map != ob->map || socket.force_newmap) { - socket.current_map = ob->map; - clear_map (pl); + socket.current_map = ob->map; if (socket.mapinfocmd) { @@ -160,22 +159,17 @@ { int flags = 0; - if (ob->map->tile_path[0]) - flags |= 1; - if (ob->map->tile_path[1]) - flags |= 2; - if (ob->map->tile_path[2]) - flags |= 4; - if (ob->map->tile_path[3]) - flags |= 8; - - snprintf (buf, MAX_BUF, "mapinfo - spatial %d %d %d %d %d %s", - flags, socket.mapx / 2 - ob->x, socket.mapy / 2 - ob->y, ob->map->width, ob->map->height, &ob->map->path); + if (ob->map->tile_path[0]) flags |= 1; + if (ob->map->tile_path[1]) flags |= 2; + if (ob->map->tile_path[2]) flags |= 4; + if (ob->map->tile_path[3]) flags |= 8; + + socket.send_packet_printf ("mapinfo - spatial %d %d %d %d %d %s", + flags, socket.mapx / 2 - ob->x, socket.mapy / 2 - ob->y, + ob->map->width, ob->map->height, &ob->map->path); } else - snprintf (buf, MAX_BUF, "mapinfo current"); - - socket.send_packet (buf); + socket.send_packet ("mapinfo current"); } } else if (socket.current_x != ob->x || socket.current_y != ob->y) @@ -198,8 +192,8 @@ region *reg = ob->region (); if (socket.current_region != reg) { + INVOKE_PLAYER (REGION_CHANGE, pl, ARG_REGION (reg), ARG_REGION (socket.current_region)); socket.current_region = reg; - socket.send_packet_printf ("drawinfo 0 You are now %s.\n(use whereami for more details)", ®->longname); } } @@ -209,29 +203,17 @@ * that information. */ void -RequestInfo (char *buf, int len, client * ns) +RequestInfo (char *buf, int len, client *ns) { - char *params = NULL, *cp; - - /* No match */ - char bigbuf[MAX_BUF]; - int slen; - - /* Set up replyinfo before we modify any of the buffers - this is used - * if we don't find a match. - */ - strcpy (bigbuf, "replyinfo "); - slen = strlen (bigbuf); - safe_strcat (bigbuf, buf, &slen, MAX_BUF); + char *params; /* find the first space, make it null, and update the * params pointer. */ - for (cp = buf; *cp != '\0'; cp++) - if (*cp == ' ') + for (params = buf; *params; params++) + if (*params == ' ') { - *cp = '\0'; - params = cp + 1; + *params++ = 0; break; } @@ -244,7 +226,13 @@ else if (!strcmp (buf, "spell_paths")) send_spell_paths (ns, params); else - ns->send_packet (bigbuf, len); + { + // undo tokenisation above and send replyinfo with the request unchanged + if (*params) + *--params = ' '; + + ns->send_packet_printf ("replyinfo %s", buf); + } } void @@ -326,14 +314,10 @@ { int flags = 0; - if (map->tile_path[0]) - flags |= 1; - if (map->tile_path[1]) - flags |= 2; - if (map->tile_path[2]) - flags |= 4; - if (map->tile_path[3]) - flags |= 8; + if (map->tile_path[0]) flags |= 1; + if (map->tile_path[1]) flags |= 2; + if (map->tile_path[2]) flags |= 4; + if (map->tile_path[3]) flags |= 8; snprintf (bigbuf, MAX_BUF, "mapinfo %s spatial %d %d %d %d %d %s", token, flags, mapx, mapy, map->width, map->height, &map->path); } @@ -346,214 +330,11 @@ pl->ns->send_packet (bigbuf); } -/** This is the Setup cmd - easy first implementation */ +/** This is the Setup cmd */ void SetUp (char *buf, int len, client * ns) { - int s, slen; - char *cmd, *param, cmdback[HUGE_BUF]; - - /* run through the cmds of setup - * syntax is setup ... - * - * we send the status of the cmd back, or a FALSE is the cmd is the server unknown - * The client then must sort this out - */ - - //LOG (llevInfo, "Get SetupCmd:: %s\n", buf); - - strcpy (cmdback, "setup"); - for (s = 0; s < len; ) - { - cmd = &buf[s]; - - /* find the next space, and put a null there */ - for (; buf[s] && buf[s] != ' '; s++) - ; - - buf[s++] = 0; - - while (buf[s] == ' ') - s++; - - if (s >= len) - break; - - param = &buf[s]; - - for (; buf[s] && buf[s] != ' '; s++) - ; - - buf[s++] = 0; - - while (buf[s] == ' ') - s++; - - slen = strlen (cmdback); - safe_strcat (cmdback, " ", &slen, HUGE_BUF); - safe_strcat (cmdback, cmd, &slen, HUGE_BUF); - safe_strcat (cmdback, " ", &slen, HUGE_BUF); - - if (!strcmp (cmd, "sound")) - { - ns->sound = atoi (param); - safe_strcat (cmdback, param, &slen, HUGE_BUF); - } - else if (!strcmp (cmd, "exp64")) - safe_strcat (cmdback, param, &slen, HUGE_BUF); - else if (!strcmp (cmd, "spellmon")) - { - ns->monitor_spells = atoi (param); - safe_strcat (cmdback, param, &slen, HUGE_BUF); - } - else if (!strcmp (cmd, "darkness")) - { - ns->darkness = atoi (param); - safe_strcat (cmdback, param, &slen, HUGE_BUF); - } - else if (!strcmp (cmd, "map1cmd")) - { - if (atoi (param)) - ns->mapmode = Map1Cmd; - /* if beyond this size, need to use map1cmd no matter what */ - if (ns->mapx > 11 || ns->mapy > 11) - ns->mapmode = Map1Cmd; - safe_strcat (cmdback, ns->mapmode == Map1Cmd ? "1" : "0", &slen, HUGE_BUF); - } - else if (!strcmp (cmd, "map1acmd")) - { - if (atoi (param)) - ns->mapmode = Map1aCmd; - /* if beyond this size, need to use map1acmd no matter what */ - if (ns->mapx > 11 || ns->mapy > 11) - ns->mapmode = Map1aCmd; - safe_strcat (cmdback, ns->mapmode == Map1aCmd ? "1" : "0", &slen, HUGE_BUF); - } - else if (!strcmp (cmd, "newmapcmd")) - { - ns->newmapcmd = atoi (param); - safe_strcat (cmdback, param, &slen, HUGE_BUF); - } - else if (!strcmp (cmd, "mapinfocmd")) - { - ns->mapinfocmd = atoi (param); - safe_strcat (cmdback, "1", &slen, HUGE_BUF); - } - else if (!strcmp (cmd, "extcmd")) - { - ns->extcmd = atoi (param); - safe_strcat (cmdback, "1", &slen, HUGE_BUF); - } - else if (!strcmp (cmd, "extmap")) - { - ns->extmap = atoi (param); - safe_strcat (cmdback, "1", &slen, HUGE_BUF); - } - else if (!strcmp (cmd, "facecache")) - { - ns->facecache = atoi (param); - safe_strcat (cmdback, param, &slen, HUGE_BUF); - } - else if (!strcmp (cmd, "faceset")) - { - char tmpbuf[20]; - int q = atoi (param); - - if (is_valid_faceset (q)) - ns->faceset = q; - sprintf (tmpbuf, "%d", ns->faceset); - safe_strcat (cmdback, tmpbuf, &slen, HUGE_BUF); - /* if the client is using faceset, it knows about image2 command */ - ns->image2 = 1; - } - else if (!strcmp (cmd, "itemcmd")) - { - /* Version of the item protocol command to use. Currently, - * only supported versions are 1 and 2. Using a numeric - * value will make it very easy to extend this in the future. - */ - char tmpbuf[20]; - int q = atoi (param); - - if (q < 1 || q > 2) - { - strcpy (tmpbuf, "FALSE"); - } - else - { - ns->itemcmd = q; - sprintf (tmpbuf, "%d", ns->itemcmd); - } - safe_strcat (cmdback, tmpbuf, &slen, HUGE_BUF); - } - else if (!strcmp (cmd, "mapsize")) - { - int x, y = 0; - char tmpbuf[MAX_BUF], *cp; - - x = atoi (param); - for (cp = param; *cp != 0; cp++) - if (*cp == 'x' || *cp == 'X') - { - y = atoi (cp + 1); - break; - } - - if (x < 9 || y < 9 || x > MAP_CLIENT_X || y > MAP_CLIENT_Y) - { - sprintf (tmpbuf, " %dx%d", MAP_CLIENT_X, MAP_CLIENT_Y); - safe_strcat (cmdback, tmpbuf, &slen, HUGE_BUF); - } - else - { - ns->mapx = x; - ns->mapy = y; - /* better to send back what we are really using and not the - * param as given to us in case it gets parsed differently. - */ - sprintf (tmpbuf, "%dx%d", x, y); - safe_strcat (cmdback, tmpbuf, &slen, HUGE_BUF); - /* If beyond this size and still using orig map command, need to - * go to map1cmd. - */ - if ((x > 11 || y > 11) && ns->mapmode == Map0Cmd) - ns->mapmode = Map1Cmd; - } - } - else if (!strcmp (cmd, "extendedMapInfos")) - { - /* Added by tchize - * prepare to use the mapextended command - */ - char tmpbuf[20]; - - ns->ext_mapinfos = (atoi (param)); - sprintf (tmpbuf, "%d", ns->ext_mapinfos); - safe_strcat (cmdback, tmpbuf, &slen, HUGE_BUF); - } - else if (!strcmp (cmd, "extendedTextInfos")) - { - /* Added by tchize - * prepare to use the extended text commands - * Client toggle this to non zero to get exttext - */ - char tmpbuf[20]; - - ns->has_readable_type = (atoi (param)); - sprintf (tmpbuf, "%d", ns->has_readable_type); - safe_strcat (cmdback, tmpbuf, &slen, HUGE_BUF); - } - else - { - /* Didn't get a setup command we understood - - * report a failure to the client. - */ - safe_strcat (cmdback, "FALSE", &slen, HUGE_BUF); - } - } /* for processing all the setup commands */ - - LOG (llevInfo, "SendBack SetupCmd:: %s\n", cmdback); - ns->send_packet (cmdback); + INVOKE_CLIENT (SETUP, ns, ARG_DATA (buf, len)); } /** @@ -563,7 +344,7 @@ * it either has to be here or init_sockets needs to be exported. */ void -AddMeCmd (char *buf, int len, client * ns) +AddMeCmd (char *buf, int len, client *ns) { INVOKE_CLIENT (ADDME, ns, ARG_DATA (buf, len)); } @@ -685,16 +466,6 @@ } /** - * Tells client the picture it has to use - * to smooth a picture number given as argument. - */ -void -AskSmooth (char *buf, int len, client *ns) -{ - ns->send_face (atoi (buf)); -} - -/** * This handles the general commands from the client (ie, north, fire, cast, * etc.) */ @@ -725,7 +496,6 @@ pl->count = 0; } - /** * This handles the general commands from the client (ie, north, fire, cast, * etc.). It is a lot like PlayerCmd above, but is called with the @@ -737,7 +507,7 @@ { if (len <= 6) { - LOG (llevDebug, "Corrupt ncom command <%s> not long enough - discarding\n", buf); + LOG (llevDebug, "%s: corrupt ncom command <%s>: not long enough (%d) - discarding\n", pl->ns->host, buf, len); return; } @@ -804,10 +574,6 @@ LOG (llevError, "Got reply message with ST_PLAYING input state\n"); break; - case ST_CHANGE_CLASS: - key_change_class (pl->ob, buf[0]); - break; - case ST_GET_PARTY_PASSWORD: /* Get password for party */ receive_party_password (pl->ob, 13); break; @@ -856,7 +622,7 @@ if (cp) { - assign (ns->version, cp + 1); + ns->version = cp + 1; if (ns->sc_version < 1026) ns->send_packet_printf ("drawinfo %d %s", NDI_RED, @@ -926,11 +692,39 @@ * it needs to send something back (vs just printing out a message) */ void -send_query (client *ns, uint8 flags, char *text) +send_query (client *ns, uint8 flags, const char *text) { ns->send_packet_printf ("query %d %s", flags, text ? text : ""); } +/** + * Get player's current range attack in obuf. + */ +static void +rangetostring (player *pl, char *obuf) +{ + dynbuf_text buf; + + if (pl->ranged_ob) + buf << " Range" << (pl->ob->current_weapon == pl->ranged_ob ? "*" : "") << ": " << pl->ranged_ob->name; + + if (pl->combat_ob) + buf << " Combat" << (pl->ob->current_weapon == pl->combat_ob ? "*" : "") << ": " << pl->combat_ob->name; + +#if 0 + //TODO: remove this when slot system is working, this is only for debugging + if (pl->ob->chosen_skill) + buf << " Skill*: " << pl->ob->chosen_skill->name; +#endif + + //TODO: maybe golem should become the current_weapon, quite simply? + if (pl->golem) + buf << " Golem*: " << pl->golem->name; + + buf << '\0'; + buf.linearise (obuf); +} + #define AddIfInt64(Old,New,Type) if (Old != New) {\ Old = New; \ sl << uint8 (Type) << uint64 (New); \ @@ -946,9 +740,9 @@ sl << uint8 (Type) << uint16 (New); \ } -#define AddIfFloat(Old,New,Type) if (Old != New) {\ +#define AddIfFloat(Old,New,Type,mult) if (Old != New) {\ Old = New; \ - sl << uint8 (Type) << uint32 (New*FLOAT_MULTI); \ + sl << uint8 (Type) << uint32 (New*FLOAT_MULTI*mult); \ } #define AddIfString(Old,New,Type) if (Old == NULL || strcmp(Old,New)) {\ @@ -972,10 +766,12 @@ if (!ns) return; - object *ob = pl->ob; + object *ob = pl->observe; if (!ob) return; + player *opl = ob->contr ? static_cast(ob->contr) : pl; + packet sl ("stats"); AddIfShort (ns->last_stats.hp, ob->stats.hp, CS_STAT_HP); @@ -993,7 +789,7 @@ AddIfShort (ns->last_stats.Cha, ob->stats.Cha, CS_STAT_CHA); for (int s = 0; s < NUM_SKILLS; s++) - if (object *skill = pl->last_skill_ob[s]) + if (object *skill = opl->last_skill_ob[s]) if (skill->stats.exp != ns->last_skill_exp [s]) { ns->last_skill_exp [s] = skill->stats.exp; @@ -1011,17 +807,17 @@ AddIfShort (ns->last_stats.wc, ob->stats.wc, CS_STAT_WC); AddIfShort (ns->last_stats.ac, ob->stats.ac, CS_STAT_AC); AddIfShort (ns->last_stats.dam, ob->stats.dam, CS_STAT_DAM); - AddIfFloat (ns->last_speed, ob->speed, CS_STAT_SPEED); + AddIfFloat (ns->last_speed, ob->speed, CS_STAT_SPEED, 1.f/TICK); AddIfShort (ns->last_stats.food, ob->stats.food, CS_STAT_FOOD); - AddIfFloat (ns->last_weapon_sp, pl->weapon_sp, CS_STAT_WEAP_SP); + AddIfFloat (ns->last_weapon_sp, pl->weapon_sp, CS_STAT_WEAP_SP, 1.f/TICK); AddIfInt (ns->last_weight_limit, weight_limit[ob->stats.Str], CS_STAT_WEIGHT_LIM); flags = 0; - if (pl->fire_on) + if (opl->fire_on) flags |= SF_FIREON; - if (pl->run_on) + if (opl->run_on) flags |= SF_RUNON; AddIfShort (ns->last_flags, flags, CS_STAT_FLAGS); @@ -1045,7 +841,7 @@ AddIfInt (ns->last_path_denied, ob->path_denied, CS_STAT_SPELL_DENY); } - rangetostring (ob, buf); /* we want use the new fire & run system in new client */ + rangetostring (opl, buf); /* we want use the new fire & run system in new client */ AddIfString (ns->stats.range, buf, CS_STAT_RANGE); set_title (ob, buf); AddIfString (ns->stats.title, buf, CS_STAT_TITLE); @@ -1189,45 +985,66 @@ } /** - * This function uses the new map1 protocol command to send the map - * to the client. It is necessary because the old map command supports - * a maximum map size of 15x15. - * This function is much simpler than the old one. This is because - * the old function optimized to send as few face identifiers as possible, - * at the expense of sending more coordinate location (coordinates were - * only 1 byte, faces 2 bytes, so this was a worthwhile savings). Since - * we need 2 bytes for coordinates and 2 bytes for faces, such a trade off - * maps no sense. Instead, we actually really only use 12 bits for coordinates, - * and use the other 4 bits for other informatiion. For full documentation - * of what we send, see the doc/Protocol file. - * I will describe internally what we do: - * the ns->lastmap shows how the map last looked when sent to the client. - * in the lastmap structure, there is a cells array, which is set to the - * maximum viewable size (As set in config.h). - * in the cells, there are faces and a count value. - * we use the count value to hold the darkness value. If -1, then this space - * is not viewable. - * we use faces[0] faces[1] faces[2] to hold what the three layers - * look like. + * Draws client map. */ void -draw_client_map1 (object *pl) +draw_client_map (player *pl) { + object *ob = pl->observe; + if (!ob->active) + return; + + maptile *plmap = ob->map; + + /* If player is just joining the game, he isn't here yet, so the map + * can get swapped out. If so, don't try to send them a map. All will + * be OK once they really log in. + */ + if (!plmap || plmap->in_memory != MAP_IN_MEMORY) + return; + int x, y, ax, ay, startlen, max_x, max_y, oldlen; - sint16 nx, ny; int estartlen, eoldlen; uint8 eentrysize; uint16 ewhatstart, ewhatflag; uint8 extendedinfos; - maptile *m; - client &socket = *pl->contr->ns; + check_map_change (pl); + prefetch_surrounding_maps (pl->ob); - if (!pl->active) - return; + /* do LOS after calls to update_position */ + if (ob != pl->ob) + clear_los (pl); + else if (pl->do_los) + { + update_los (ob); + pl->do_los = 0; + } + + /** + * This function uses the new map1 protocol command to send the map + * to the client. It is necessary because the old map command supports + * a maximum map size of 15x15. + * This function is much simpler than the old one. This is because + * the old function optimized to send as few face identifiers as possible, + * at the expense of sending more coordinate location (coordinates were + * only 1 byte, faces 2 bytes, so this was a worthwhile savings). Since + * we need 2 bytes for coordinates and 2 bytes for faces, such a trade off + * maps no sense. Instead, we actually really only use 12 bits for coordinates, + * and use the other 4 bits for other informatiion. For full documentation + * of what we send, see the doc/Protocol file. + * I will describe internally what we do: + * the ns->lastmap shows how the map last looked when sent to the client. + * in the lastmap structure, there is a cells array, which is set to the + * maximum viewable size (As set in config.h). + * in the cells, there are faces and a count value. + * we use the count value to hold the darkness value. If -1, then this space + * is not viewable. + * we use faces[0] faces[1] faces[2] to hold what the three layers + * look like. + */ - check_map_change (pl->contr); - prefetch_surrounding_maps (pl); + client &socket = *pl->ns; packet sl (socket.mapmode == Map1Cmd ? "map1" : "map1a"); packet esl; @@ -1252,13 +1069,6 @@ estartlen = esl.length (); } - else - { - /* suppress compiler warnings */ - ewhatstart = 0; - ewhatflag = 0; - estartlen = 0; - } /* x,y are the real map locations. ax, ay are viewport relative * locations. @@ -1268,14 +1078,30 @@ /* We could do this logic as conditionals in the if statement, * but that started to get a bit messy to look at. */ - max_x = pl->x + (socket.mapx + 1) / 2; - max_y = pl->y + (socket.mapy + 1) / 2; + max_x = ob->x + (socket.mapx + 1) / 2; + max_y = ob->y + (socket.mapy + 1) / 2; - for (y = pl->y - socket.mapy / 2; y < max_y; y++, ay++) + for (y = ob->y - socket.mapy / 2; y < max_y; y++, ay++) { + sint16 nx, ny; + maptile *m = 0; + ax = 0; - for (x = pl->x - socket.mapx / 2; x < max_x; x++, ax++) + for (x = ob->x - socket.mapx / 2; x < max_x; x++, ax++) { + // check to see if we can simply go one right quickly + ++nx; + if (m && nx >= m->width) + m = 0; + + if (!m) + { + nx = x; ny = y; m = plmap; + + if (!xy_normalise (m, nx, ny)) + m = 0; + } + int emask, mask; emask = mask = (ax & 0x3f) << 10 | (ay & 0x3f) << 4; @@ -1284,10 +1110,6 @@ /* If the coordinates are not valid, or it is too dark to see, * we tell the client as such */ - nx = x; - ny = y; - m = get_map_from_coord (pl->map, &nx, &ny); - if (!m) { /* space is out of map. Update space and clear values @@ -1305,7 +1127,7 @@ m->touch (); - int d = pl->contr->blocked_los[ax][ay]; + int d = pl->blocked_los[ax][ay]; if (d > 3) { @@ -1378,13 +1200,14 @@ lastcell.count = d; mapspace &ms = m->at (nx, ny); + ms.update (); if (socket.extmap) { - uint8 stat_hp = 0; + uint8 stat_hp = 0; uint8 stat_width = 0; - uint8 flags = 0; - UUID player = 0; + uint8 flags = 0; + tag_t player = 0; // send hp information, if applicable if (object *op = ms.faces_obj [0]) @@ -1397,14 +1220,14 @@ if (op->stats.maxhp > 0 && (unsigned) op->stats.maxhp > (unsigned) op->stats.hp) { stat_hp = 255 - (op->stats.hp * 255 + 254) / op->stats.maxhp; - stat_width = op->arch->tail_x; + stat_width = op->arch->max_x - op->arch->x; //TODO: should be upper-left edge } } if (op->msg && op->msg[0] == '@') flags |= 1; - if (op->type == PLAYER && op != pl) + if (op->type == PLAYER && op != ob) player = op->count; } @@ -1435,7 +1258,7 @@ *last_ext |= 0x80; last_ext = &sl[sl.length ()]; - sl << uint8 (0x47) << uint8 (8) << (uint64)player; + sl << uint8 (0x47) << uint8 (4) << (uint32)player; } if (lastcell.flags != flags) @@ -1458,24 +1281,23 @@ if (update_space (sl, socket, ms, lastcell, 1)) mask |= 0x2; - if (ms.player () == pl - && (pl->invisible & (pl->invisible < 50 ? 1 : 7))) + if (ms.player () == ob + && (ob->invisible & (ob->invisible < 50 ? 1 : 7))) { // force player to be visible to himself if invisible - if (lastcell.faces[0] != pl->face) + if (lastcell.faces[0] != ob->face) { - lastcell.faces[0] = pl->face; + lastcell.faces[0] = ob->face; mask |= 0x1; - sl << uint16 (pl->face); + sl << uint16 (ob->face); - socket.send_faces (pl); + socket.send_faces (ob); } } /* Top face */ else if (update_space (sl, socket, ms, lastcell, 0)) mask |= 0x1; - /* Check to see if we are in fact sending anything for this * space by checking the mask. If so, update the mask. @@ -1519,6 +1341,8 @@ } /* for x loop */ } /* for y loop */ + socket.flush_fx (); + /* Verify that we in fact do need to send this */ if (socket.ext_mapinfos) { @@ -1542,74 +1366,10 @@ } } -/** - * Draws client map. - */ -void -draw_client_map (object *pl) -{ - int i, j; - sint16 ax, ay; /* ax and ay goes from 0 to max-size of arrays */ - int mflags; - struct Map newmap; - maptile *m, *pm; - - if (pl->type != PLAYER) - { - LOG (llevError, "draw_client_map called with non player/non eric-server\n"); - return; - } - - pm = pl->map; - - /* If player is just joining the game, he isn't here yet, so the map - * can get swapped out. If so, don't try to send them a map. All will - * be OK once they really log in. - */ - if (pm == NULL || pm->in_memory != MAP_IN_MEMORY) - return; - - memset (&newmap, 0, sizeof (struct Map)); - - for (j = (pl->y - pl->contr->ns->mapy / 2); j < (pl->y + (pl->contr->ns->mapy + 1) / 2); j++) - for (i = (pl->x - pl->contr->ns->mapx / 2); i < (pl->x + (pl->contr->ns->mapx + 1) / 2); i++) - { - ax = i; - ay = j; - m = pm; - mflags = get_map_flags (m, &m, ax, ay, &ax, &ay); - - if (mflags & P_OUT_OF_MAP) - continue; - - /* If a map is visible to the player, we don't want to swap it out - * just to reload it. This should really call something like - * swap_map, but this is much more efficient and 'good enough' - */ - if (mflags & P_NEW_MAP) - m->timeout = 50; - } - - /* do LOS after calls to update_position */ - if (pl->contr->do_los) - { - update_los (pl); - pl->contr->do_los = 0; - } - - /* Big maps need a different drawing mechanism to work */ - draw_client_map1 (pl); -} - - /*****************************************************************************/ - /* GROS: The following one is used to allow a plugin to send a generic cmd to*/ - /* a player. Of course, the client need to know the command to be able to */ - /* manage it ! */ - /*****************************************************************************/ void send_plugin_custom_message (object *pl, char *buf)