--- deliantra/server/socket/request.C 2006/12/14 00:23:59 1.31 +++ deliantra/server/socket/request.C 2006/12/14 01:59:10 1.34 @@ -43,9 +43,6 @@ * mapcellchanged, compactlayer, compactstack, perform the map compressing * operations * - * esrv_map_doneredraw finishes the map update, and ships across the - * map updates. - * */ #include @@ -104,10 +101,10 @@ int x, y, mx, my; { - char buf[MAXSOCKBUF]; + packet sl; - sprintf (buf, "map_scroll %d %d", dx, dy); - Write_String_To_Socket (ns, buf, strlen (buf)); + sl.printf ("map_scroll %d %d", dx, dy); + ns->send_packet (sl); } /* If we are using the Map1aCmd, we may in fact send @@ -163,7 +160,7 @@ memset (&socket.lastmap, 0, sizeof (socket.lastmap)); if (socket.newmapcmd == 1) - Write_String_To_Socket (&socket, "newmap", 6); + socket.send_packet ("newmap"); socket.update_look = 1; socket.look_position = 0; @@ -204,7 +201,7 @@ else snprintf (buf, MAX_BUF, "mapinfo current"); - Write_String_To_Socket (&socket, buf, strlen (buf)); + socket.send_packet (buf); } } else if (socket.current_x != ob->x || socket.current_y != ob->y) @@ -316,7 +313,7 @@ else snprintf (bigbuf, MAX_BUF, "mapinfo %s unsupported", token); - Write_String_To_Socket (&pl->socket, bigbuf, strlen (bigbuf)); + pl->socket.send_packet (bigbuf); } /** This is the Setup cmd - easy first implementation */ @@ -333,16 +330,19 @@ * The client then must sort this out */ - LOG (llevInfo, "Get SetupCmd:: %s\n", buf); + //LOG (llevInfo, "Get SetupCmd:: %s\n", buf); + strcpy (cmdback, "setup"); - for (s = 0; s < len;) + for (s = 0; s < len; ) { - cmd = &buf[s]; /* find the next space, and put a null there */ - for (; buf[s] && buf[s] != ' '; s++); + for (; buf[s] && buf[s] != ' '; s++) + ; + buf[s++] = 0; + while (buf[s] == ' ') s++; @@ -351,8 +351,11 @@ param = &buf[s]; - for (; buf[s] && buf[s] != ' '; s++); + for (; buf[s] && buf[s] != ' '; s++) + ; + buf[s++] = 0; + while (buf[s] == ' ') s++; @@ -523,8 +526,9 @@ safe_strcat (cmdback, "FALSE", &slen, HUGE_BUF); } } /* for processing all the setup commands */ + LOG (llevInfo, "SendBack SetupCmd:: %s\n", cmdback); - Write_String_To_Socket (ns, cmdback, strlen (cmdback)); + ns->send_packet (cmdback); } /** @@ -540,9 +544,7 @@ oldsettings = settings; if (ns->status != Ns_Add || add_player (ns)) - { - Write_String_To_Socket (ns, "addme_failed", 12); - } + ns->send_packet ("addme_failed"); else { /* Basically, the add_player copies the socket structure into @@ -550,10 +552,11 @@ * is not needed anymore. The write below should still work, as the * stuff in ns is still relevant. */ - Write_String_To_Socket (ns, "addme_success", 13); + ns->send_packet ("addme_success"); socket_info.nconns--; ns->status = Ns_Avail; } + settings = oldsettings; } @@ -607,7 +610,7 @@ strcat (cmdback, "smoothing"); } - Write_String_To_Socket (ns, cmdback, strlen (cmdback)); + ns->send_packet (cmdback); } /* @@ -670,7 +673,7 @@ strcat (cmdback, temp); } - Write_String_To_Socket (ns, cmdback, strlen (cmdback)); + ns->send_packet (cmdback); } /** @@ -701,14 +704,13 @@ ns->faces_sent[face] |= NS_FACESENT_SMOOTH; - SockList sl (MAXSOCKBUF); + packet sl; sl << "smooth " << uint16 (face) << uint16 (smoothface); Send_With_Handling (ns, &sl); - sl.free (); } /** @@ -787,7 +789,7 @@ { int time, repeat; char command[MAX_BUF]; - short packet; + int pktlen; if (len < 7) { @@ -795,7 +797,7 @@ return; } - packet = net_uint16 (buf); + pktlen = net_uint16 (buf); repeat = net_uint32 (buf + 2); /* -1 is special - no repeat, but don't update */ @@ -839,10 +841,9 @@ /* Send confirmation of command execution now */ - SockList sl (MAXSOCKBUF); - sl << "comc " << uint16 (packet) << uint32 (time); + packet sl; + sl << "comc " << uint16 (pktlen) << uint32 (time); Send_With_Handling (&pl->socket, &sl); - sl.free (); } @@ -968,7 +969,7 @@ { sprintf (version_warning, "drawinfo %d %s", NDI_RED, "**** VERSION WARNING ****\n**** CLIENT IS TOO OLD!! UPDATE THE CLIENT!! ****"); - Write_String_To_Socket (ns, version_warning, strlen (version_warning)); + ns->send_packet (version_warning); } } @@ -1050,7 +1051,7 @@ char buf[MAX_BUF]; sprintf (buf, "query %d %s", flags, text ? text : ""); - Write_String_To_Socket (ns, buf, strlen (buf)); + ns->send_packet (buf); } #define AddIfInt64(Old,New,Type) if (Old != New) {\ @@ -1090,7 +1091,7 @@ char buf[MAX_BUF]; uint16 flags; - SockList sl (MAXSOCKBUF); + packet sl; sl << "stats "; if (pl->ob != NULL) @@ -1182,15 +1183,8 @@ AddIfString (pl->socket.stats.title, buf, CS_STAT_TITLE); /* Only send it away if we have some actual data */ - if (sl.len > 6) - { -#ifdef ESRV_DEBUG - LOG (llevDebug, "Sending stats command, %d bytes long.\n", sl.len); -#endif - Send_With_Handling (&pl->socket, &sl); - } - - sl.free (); + if (sl.length () > 6) + Send_With_Handling (&pl->socket, &sl); } /** @@ -1201,7 +1195,7 @@ { pl->last_weight = weight; - SockList sl (MAXSOCKBUF); + packet sl; sl << "player "; sl << uint32 (pl->ob->count) @@ -1210,7 +1204,6 @@ << data8 (pl->ob->name); Send_With_Handling (&pl->socket, &sl); - sl.free (); SET_FLAG (pl->ob, FLAG_CLIENT_SENT); } @@ -1236,7 +1229,7 @@ return; } - SockList sl (MAXSOCKBUF); + packet sl; sl << "anim " << uint16 (anim_num) @@ -1253,7 +1246,6 @@ } Send_With_Handling (ns, &sl); - sl.free (); ns->anims_sent[anim_num] = 1; } @@ -1393,39 +1385,6 @@ return cur; } -static void -esrv_map_doneredraw (NewSocket * ns, struct Map *newmap) -{ - static long frames, bytes, tbytes, tframes; - char *cur; - - SockList sl (MAXSOCKBUF); - sl << "map "; - - cur = (char *) compactlayer (ns, (unsigned char *) sl.buf + sl.len, MAP_LAYERS, newmap); - sl.len = cur - (char *) sl.buf; - -/* LOG(llevDebug, "Sending map command.\n");*/ - - if (sl.len > (int) strlen ("map ") || ns->sent_scroll) - { - /* All of this is just accounting stuff */ - if (tframes > 100) - tframes = tbytes = 0; - - tframes++; - frames++; - tbytes += sl.len; - bytes += sl.len; - memcpy (&ns->lastmap, newmap, sizeof (struct Map)); - Send_With_Handling (ns, &sl); - ns->sent_scroll = 0; - } - - sl.free (); -} - - /** Clears a map cell */ static void map_clearcell (struct MapCell *cell, int face0, int face1, int face2, int count) @@ -1474,7 +1433,7 @@ * sent, it returns zero. */ static int -check_head (SockList &sl, NewSocket &ns, int ax, int ay, int layer) +check_head (packet &sl, NewSocket &ns, int ax, int ay, int layer) { short face_num; @@ -1518,7 +1477,7 @@ */ static int -update_space (SockList &sl, NewSocket &ns, maptile *mp, int mx, int my, int sx, int sy, int layer) +update_space (packet &sl, NewSocket &ns, maptile *mp, int mx, int my, int sx, int sy, int layer) { object *ob, *head; uint16 face_num; @@ -1741,7 +1700,7 @@ */ static inline int -update_smooth (SockList &sl, NewSocket &ns, maptile *mp, int mx, int my, int sx, int sy, int layer) +update_smooth (packet &sl, NewSocket &ns, maptile *mp, int mx, int my, int sx, int sy, int layer) { object *ob; int smoothlevel; /* old face_num; */ @@ -1835,11 +1794,11 @@ check_map_change (pl->contr); - SockList sl (MAXSOCKBUF); - SockList esl (MAXSOCKBUF); + packet sl; + packet esl; sl << (socket.mapmode == Map1Cmd ? "map1 " : "map1a "); - startlen = sl.len; + startlen = sl.length (); /*Extendedmapinfo structure initialisation */ if (socket.ext_mapinfos) @@ -1849,14 +1808,15 @@ if (socket.EMI_smooth) extendedinfos |= EMI_SMOOTH; - ewhatstart = esl.len; + ewhatstart = esl.length (); ewhatflag = extendedinfos; /*The EMI_NOREDRAW bit could need to be taken away */ eentrysize = getExtendedMapInfoSize (&socket); esl << "mapextended " << uint8 (extendedinfos) << uint8 (eentrysize); - estartlen = esl.len; + + estartlen = esl.length (); } else { @@ -1904,7 +1864,7 @@ { int i, got_one; - oldlen = sl.len; + oldlen = sl.length (); sl << uint16 (mask); @@ -1918,7 +1878,7 @@ * space. */ got_one = 0; - for (i = oldlen + 2; i < sl.len; i++) + for (i = oldlen + 2; i < sl.length (); i++) if (sl.buf[i]) got_one = 1; @@ -1927,9 +1887,9 @@ else { /*either all faces blank, either no face at all */ if (mask & 0xf) /*at least 1 face, we know it's blank, only send coordinates */ - sl.len = oldlen + 2; + sl.reset (oldlen + 2); else - sl.len = oldlen; + sl.reset (oldlen); } /*What concerns extendinfos, nothing to be done for now @@ -1969,7 +1929,7 @@ * reason. Still may need to send the head for this space. */ - oldlen = sl.len; + oldlen = sl.length (); sl << uint16 (mask); @@ -2001,7 +1961,7 @@ if ((mask & 0xf) || need_send) sl.buf[oldlen + 1] = mask & 0xff; else - sl.len = oldlen; + sl.reset (oldlen); } else { @@ -2013,15 +1973,15 @@ * need to send is, then form the packet after that, * we presume that we will in fact form a packet, and update * the bits by what we do actually send. If we send nothing, - * we just back out sl.len to the old value, and no harm + * we just back out sl.length () to the old value, and no harm * is done. * I think this is simpler than doing a bunch of checks to see * what if anything we need to send, setting the bits, then * doing those checks again to add the real data. */ - oldlen = sl.len; + oldlen = sl.length (); mask = (ax & 0x3f) << 10 | (ay & 0x3f) << 4; - eoldlen = esl.len; + eoldlen = esl.length (); emask = (ax & 0x3f) << 10 | (ay & 0x3f) << 4; sl << uint16 (mask); @@ -2039,7 +1999,7 @@ if (socket.extmap) { *last_ext |= 0x80; - last_ext = sl.buf + sl.len; + last_ext = sl.buf + sl.length (); sl << uint8 (d); } else @@ -2083,14 +2043,14 @@ mask |= 0x8; *last_ext |= 0x80; - last_ext = sl.buf + sl.len; + last_ext = sl.buf + sl.length (); sl << uint8 (5) << uint8 (stat_hp); if (stat_width > 1) { *last_ext |= 0x80; - last_ext = sl.buf + sl.len; + last_ext = sl.buf + sl.length (); sl << uint8 (6) << uint8 (stat_width); } @@ -2102,7 +2062,7 @@ mask |= 0x8; *last_ext |= 0x80; - last_ext = sl.buf + sl.len; + last_ext = sl.buf + sl.length (); sl << uint8 (0x47) << uint8 (8) << (uint64)player; } @@ -2113,7 +2073,7 @@ mask |= 0x8; *last_ext |= 0x80; - last_ext = sl.buf + sl.len; + last_ext = sl.buf + sl.length (); sl << uint8 (8) << uint8 (flags); } @@ -2167,12 +2127,12 @@ if (mask & 0xf) sl.buf[oldlen + 1] = mask & 0xff; else - sl.len = oldlen; + sl.reset (oldlen); if (emask & 0xf) esl.buf[eoldlen + 1] = emask & 0xff; else - esl.len = eoldlen; + esl.reset (eoldlen); } /* else this is a viewable space */ } /* for x loop */ } /* for y loop */ @@ -2180,7 +2140,7 @@ /* Verify that we in fact do need to send this */ if (socket.ext_mapinfos) { - if (!(sl.len > startlen || socket.sent_scroll)) + if (!(sl.length () > startlen || socket.sent_scroll)) { /* No map data will follow, so don't say the client * it doesn't need draw! @@ -2189,18 +2149,15 @@ esl.buf[ewhatstart + 1] = ewhatflag & 0xff; } - if (esl.len > estartlen) + if (esl.length () > estartlen) Send_With_Handling (&socket, &esl); } - if (sl.len > startlen || socket.sent_scroll) + if (sl.length () > startlen || socket.sent_scroll) { Send_With_Handling (&socket, &sl); socket.sent_scroll = 0; } - - sl.free (); - esl.free (); } /** @@ -2261,73 +2218,8 @@ pl->contr->do_los = 0; } - if (pl->contr->socket.mapmode == Map1Cmd || pl->contr->socket.mapmode == Map1aCmd) - { - /* Big maps need a different drawing mechanism to work */ - draw_client_map1 (pl); - return; - } - - if (pl->invisible & (pl->invisible < 50 ? 4 : 1)) - { - esrv_map_setbelow (&pl->contr->socket, pl->contr->socket.mapx / 2, pl->contr->socket.mapy / 2, pl->face->number, &newmap); - } - - /* j and i are the y and x coordinates of the real map (which is - * basically some number of spaces around the player) - * ax and ay are values from within the viewport (ie, 0, 0 is upper - * left corner) and are thus disconnected from the map values. - * Subtract 1 from the max values so that we properly handle cases where - * player has specified an even map. Otherwise, we try to send them too - * much, ie, if mapx is 10, we would try to send from -5 to 5, which is actually - * 11 spaces. Now, we would send from -5 to 4, which is properly. If mapx is - * odd, this still works fine. - */ - ay = 0; - for (j = pl->y - pl->contr->socket.mapy / 2; j <= pl->y + (pl->contr->socket.mapy - 1) / 2; j++, ay++) - { - ax = 0; - for (i = pl->x - pl->contr->socket.mapx / 2; i <= pl->x + (pl->contr->socket.mapx - 1) / 2; i++, ax++) - { - - d = pl->contr->blocked_los[ax][ay]; - /* note the out_of_map and d>3 checks are both within the same - * negation check. - */ - nx = i; - ny = j; - m = get_map_from_coord (pm, &nx, &ny); - if (m && d < 4) - { - face = GET_MAP_FACE (m, nx, ny, 0); - floor2 = GET_MAP_FACE (m, nx, ny, 1); - floor = GET_MAP_FACE (m, nx, ny, 2); - - /* If all is blank, send a blank face. */ - if ((!face || face == blank_face) && (!floor2 || floor2 == blank_face) && (!floor || floor == blank_face)) - { - esrv_map_setbelow (&pl->contr->socket, ax, ay, blank_face->number, &newmap); - } - else - { /* actually have something interesting */ - /* send the darkness mask, if any. */ - if (d && pl->contr->socket.darkness) - esrv_map_setbelow (&pl->contr->socket, ax, ay, dark_faces[d - 1]->number, &newmap); - - if (face && face != blank_face) - esrv_map_setbelow (&pl->contr->socket, ax, ay, face->number, &newmap); - if (floor2 && floor2 != blank_face) - esrv_map_setbelow (&pl->contr->socket, ax, ay, floor2->number, &newmap); - if (floor && floor != blank_face) - esrv_map_setbelow (&pl->contr->socket, ax, ay, floor->number, &newmap); - } - } /* Is a valid space */ - } - } - - esrv_map_doneredraw (&pl->contr->socket, &newmap); - - check_map_change (pl->contr); + /* Big maps need a different drawing mechanism to work */ + draw_client_map1 (pl); } @@ -2343,7 +2235,7 @@ void send_plugin_custom_message (object *pl, char *buf) { - cs_write_string (&pl->contr->socket, buf, strlen (buf)); + pl->contr->socket.send_packet (buf); } /** @@ -2353,20 +2245,19 @@ void send_skill_info (NewSocket *ns, char *params) { - SockList sl (MAXSOCKBUF); + packet sl; sl << "replyinfo skill_info\n"; for (int i = 1; i < NUM_SKILLS; i++) sl.printf ("%d:%s\n", i + CS_STAT_SKILLINFO, &skill_names[i]); - if (sl.len >= MAXSOCKBUF) + if (sl.length () >= MAXSOCKBUF) { LOG (llevError, "Buffer overflow in send_skill_info!\n"); fatal (0); } Send_With_Handling (ns, &sl); - sl.free (); } /** @@ -2376,21 +2267,20 @@ void send_spell_paths (NewSocket * ns, char *params) { - SockList sl (MAXSOCKBUF); + packet sl; sl << "replyinfo spell_paths\n"; for (int i = 0; i < NRSPELLPATHS; i++) sl.printf ("%d:%s\n", 1 << i, spellpathnames[i]); - if (sl.len >= MAXSOCKBUF) + if (sl.length () >= MAXSOCKBUF) { LOG (llevError, "Buffer overflow in send_spell_paths!\n"); fatal (0); } Send_With_Handling (ns, &sl); - sl.free (); } /** @@ -2430,7 +2320,7 @@ if (flags) { - SockList sl (MAXSOCKBUF); + packet sl; sl << "updspell " << uint8 (flags) @@ -2441,7 +2331,6 @@ if (flags & UPD_SP_DAMAGE) sl << uint16 (spell->last_eat); Send_With_Handling (&pl->socket, &sl); - sl.free (); } } } @@ -2459,18 +2348,17 @@ return; } - SockList sl (MAXSOCKBUF); + packet sl; sl << "delspell " << uint32 (spell->count); Send_With_Handling (&pl->socket, &sl); - sl.free (); } /* appends the spell *spell to the Socklist we will send the data to. */ static void -append_spell (player *pl, SockList &sl, object *spell) +append_spell (player *pl, packet &sl, object *spell) { int len, i, skill = 0; @@ -2526,7 +2414,7 @@ if (!pl->socket.monitor_spells) return; - SockList sl (MAXSOCKBUF); + packet sl; sl << "addspell "; @@ -2550,11 +2438,12 @@ if (spell->type != SPELL) continue; - if (sl.len >= (MAXSOCKBUF - (26 + strlen (spell->name) + (spell->msg ? strlen (spell->msg) : 0)))) + if (sl.length () >= (MAXSOCKBUF - (26 + strlen (spell->name) + (spell->msg ? strlen (spell->msg) : 0)))) { Send_With_Handling (&pl->socket, &sl); - strcpy ((char *) sl.buf, "addspell "); - sl.len = strlen ((char *) sl.buf); + + sl.reset (); + sl << "addspell "; } append_spell (pl, sl, spell); @@ -2577,6 +2466,5 @@ /* finally, we can send the packet */ Send_With_Handling (&pl->socket, &sl); - sl.free (); }