--- deliantra/server/socket/request.C 2007/07/02 02:29:34 1.113 +++ deliantra/server/socket/request.C 2007/07/29 19:11:47 1.118 @@ -192,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); } } @@ -203,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; } @@ -238,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 @@ -939,7 +933,7 @@ if (ob) ns.send_faces (ob); else - ns.send_face (face_num); + ns.send_face (face_num, 10); sl << uint16 (face_num); return 1; @@ -1396,7 +1390,7 @@ for (int i = 1; i < NUM_SKILLS; i++) sl.printf ("%d:%s\n", i + CS_STAT_SKILLINFO, &skill_names[i]); - if (sl.length () >= MAXSOCKBUF) + if (sl.length () > MAXSOCKBUF) { LOG (llevError, "Buffer overflow in send_skill_info!\n"); fatal (0); @@ -1419,7 +1413,7 @@ for (int i = 0; i < NRSPELLPATHS; i++) sl.printf ("%d:%s\n", 1 << i, spellpathnames[i]); - if (sl.length () >= MAXSOCKBUF) + if (sl.length () > MAXSOCKBUF) { LOG (llevError, "Buffer overflow in send_spell_paths!\n"); fatal (0); @@ -1538,6 +1532,8 @@ spell->face = face_find ("burnout.x11", blank_face); } + pl->ns->send_face (spell->face); + /* send the current values */ sl << uint32 (spell->count) << uint16 (spell->level) @@ -1582,16 +1578,17 @@ * won't take us over the length limit for the socket, if it does, * we need to send what we already have, and restart packet formation */ + if (spell->type != SPELL) + continue; + /* Seeing crashes by overflowed buffers. Quick arithemetic seems * to show add_spell is 26 bytes + 2 strings. However, the overun * is hundreds of bytes off, so correcting 22 vs 26 doesn't seem * like it will fix this */ - if (spell->type != SPELL) - continue; - - if (sl.length () >= (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)))) { + pl->ns->flush_fx (); pl->ns->send_packet (sl); sl.reset (); @@ -1609,13 +1606,14 @@ else append_spell (pl, sl, spell); - if (sl.length () >= MAXSOCKBUF) + if (sl.length () > MAXSOCKBUF) { LOG (llevError, "Buffer overflow in esrv_add_spells!\n"); fatal (0); } /* finally, we can send the packet */ + pl->ns->flush_fx (); pl->ns->send_packet (sl); }