--- deliantra/server/socket/item.C 2006/09/14 22:34:05 1.7 +++ deliantra/server/socket/item.C 2006/12/14 00:13:26 1.13 @@ -137,7 +137,7 @@ * animation of face to the client. */ static void -add_object_to_socklist (NewSocket * ns, SockList * sl, object *head) +add_object_to_socklist (NewSocket &ns, SockList &sl, object *head) { int flags, len, anim_speed; char item_n[MAX_BUF]; @@ -147,16 +147,16 @@ if (QUERY_FLAG (head, FLAG_NO_PICK)) flags |= F_NOPICK; - if (!(ns->faces_sent[head->face->number] & NS_FACESENT_FACE)) - esrv_send_face (ns, head->face->number, 0); + if (!(ns.faces_sent[head->face->number] & NS_FACESENT_FACE)) + esrv_send_face (&ns, head->face->number, 0); - if (QUERY_FLAG (head, FLAG_ANIMATE) && !ns->anims_sent[head->animation_id]) - esrv_send_animation (ns, head->animation_id); + if (QUERY_FLAG (head, FLAG_ANIMATE) && !ns.anims_sent[head->animation_id]) + esrv_send_animation (&ns, head->animation_id); - SockList_AddInt (sl, head->count); - SockList_AddInt (sl, flags); - SockList_AddInt (sl, QUERY_FLAG (head, FLAG_NO_PICK) ? -1 : WEIGHT (head)); - SockList_AddInt (sl, head->face->number); + sl << uint32 (head->count) + << uint32 (flags) + << uint32 (QUERY_FLAG (head, FLAG_NO_PICK) ? -1 : WEIGHT (head)) + << uint32 (head->face->number); if (!head->custom_name) { @@ -172,14 +172,14 @@ len = strlen (item_n); item_p = head->custom_name; } + strncpy (item_n + len + 1, item_p, 127); item_n[254] = 0; len += strlen (item_n + 1 + len) + 1; - SockList_AddChar (sl, (char) len); - memcpy (sl->buf + sl->len, item_n, len); - sl->len += len; - SockList_AddShort (sl, head->animation_id); + sl << data8 (item_n, len) + << uint16 (head->animation_id); + anim_speed = 0; if (QUERY_FLAG (head, FLAG_ANIMATE)) { @@ -194,14 +194,16 @@ else anim_speed = (int) (1.0 / FABS (head->speed)); } + if (anim_speed > 255) anim_speed = 255; } - SockList_AddChar (sl, (char) anim_speed); - SockList_AddInt (sl, head->nrof); - if (ns->itemcmd == 2) - SockList_AddShort (sl, head->client_type); + sl << uint8 (anim_speed) + << uint32 (head->nrof); + + if (ns.itemcmd == 2) + sl << uint16 (head->client_type); SET_FLAG (head, FLAG_CLIENT_SENT); } @@ -218,7 +220,6 @@ { object *tmp, *last; int got_one = 0, start_look = 0, end_look = 0; - SockList sl; char buf[MAX_BUF]; if (!pl->contr->socket.update_look) @@ -227,39 +228,42 @@ return; } else - { - pl->contr->socket.update_look = 0; - } + pl->contr->socket.update_look = 0; - if (QUERY_FLAG (pl, FLAG_REMOVED) || pl->map == NULL || pl->map->in_memory != MAP_IN_MEMORY || out_of_map (pl->map, pl->x, pl->y)) + if (QUERY_FLAG (pl, FLAG_REMOVED) + || !pl->map + || pl->map->in_memory != MAP_IN_MEMORY + || out_of_map (pl->map, pl->x, pl->y)) return; for (tmp = get_map_ob (pl->map, pl->x, pl->y); tmp && tmp->above; tmp = tmp->above); - sl.buf = (unsigned char *) malloc (MAXSOCKBUF); + SockList sl (MAXSOCKBUF); - Write_String_To_Socket (&pl->contr->socket, "delinv 0", strlen ("delinv 0")); - sprintf ((char *) sl.buf, "item%d ", pl->contr->socket.itemcmd); - sl.len = strlen ((char *) sl.buf); + Write_String_To_Socket (&pl->contr->socket, "delinv 0", sizeof ("delinv 0") - 1); + + sl.printf ("item%d ", pl->contr->socket.itemcmd); - SockList_AddInt (&sl, 0); + sl << uint32 (0); if (!(pl->contr->socket.faces_sent[empty_face->number] & NS_FACESENT_FACE)) esrv_send_face (&pl->contr->socket, empty_face->number, 0); if (pl->contr->socket.look_position) { - SockList_AddInt (&sl, 0x80000000 | (pl->contr->socket.look_position - NUM_LOOK_OBJECTS)); - SockList_AddInt (&sl, 0); - SockList_AddInt (&sl, (uint32) - 1); - SockList_AddInt (&sl, empty_face->number); - sprintf (buf, "Click here to see %d previous items", NUM_LOOK_OBJECTS); - add_stringlen_to_sockbuf (buf, &sl); - SockList_AddShort (&sl, 0); - SockList_AddChar (&sl, 0); - SockList_AddInt (&sl, 0); + sl << uint32 (0x80000000 | (pl->contr->socket.look_position - NUM_LOOK_OBJECTS)) + << uint32 (0) + << sint32 (-1) + << uint32 (empty_face->number); + + sl.printf ("Click here to see %d previous items", NUM_LOOK_OBJECTS); + + sl << uint16 (0) + << uint8 (0) + << uint32 (0); + if (pl->contr->socket.itemcmd == 2) - SockList_AddShort (&sl, 0); + sl << uint16 (0); } for (last = NULL; tmp != last; tmp = tmp->below) @@ -272,11 +276,14 @@ if (last && QUERY_FLAG (last, FLAG_IS_FLOOR)) last = last->below; } + if (LOOK_OBJ (tmp)) { if (++start_look < pl->contr->socket.look_position) continue; + end_look++; + if (end_look > NUM_LOOK_OBJECTS) { /* What we basically do is make a 'fake' object - when the user applies it, @@ -300,7 +307,7 @@ else head = tmp; - add_object_to_socklist (&pl->contr->socket, &sl, head); + add_object_to_socklist (pl->contr->socket, sl, head); got_one++; if (sl.len >= (MAXSOCKBUF - MAXITEMLEN)) @@ -313,10 +320,11 @@ } } /* If LOOK_OBJ() */ } + if (got_one) Send_With_Handling (&pl->contr->socket, &sl); - free (sl.buf); + sl.free (); } /** @@ -351,7 +359,7 @@ if (LOOK_OBJ (head)) { - add_object_to_socklist (&pl->contr->socket, &sl, head); + add_object_to_socklist (pl->contr->socket, sl, head); got_one++; @@ -371,7 +379,7 @@ } if (got_one) Send_With_Handling (&pl->contr->socket, &sl); - free (sl.buf); + sl.free (); } /** @@ -397,6 +405,7 @@ * order. */ } + if (!QUERY_FLAG (op, FLAG_CLIENT_SENT)) { /* FLAG_CLIENT_SENT is debug only. We are using it to see where @@ -405,6 +414,7 @@ */ LOG (llevDebug, "We have not sent item %s (%d)\n", &op->name, op->count); } + sl.buf = (unsigned char *) malloc (MAXSOCKBUF); strcpy ((char *) sl.buf, "upditem "); @@ -440,6 +450,7 @@ esrv_send_face (&pl->contr->socket, op->face->number, 0); SockList_AddInt (&sl, op->face->number); } + if (flags & UPD_NAME) { int len; @@ -468,6 +479,7 @@ memcpy (sl.buf + sl.len, item_n, len); sl.len += len; } + if (flags & UPD_ANIM) SockList_AddShort (&sl, op->animation_id); @@ -497,7 +509,7 @@ SockList_AddInt (&sl, op->nrof); Send_With_Handling (&pl->contr->socket, &sl); - free (sl.buf); + sl.free (); } /** @@ -534,11 +546,12 @@ SockList_AddInt (&sl, op->env ? op->env->count : 0); - add_object_to_socklist (&pl->contr->socket, &sl, op); + add_object_to_socklist (pl->contr->socket, sl, op); Send_With_Handling (&pl->contr->socket, &sl); SET_FLAG (op, FLAG_CLIENT_SENT); - free (sl.buf); + + sl.free (); } /** @@ -558,7 +571,7 @@ SockList_AddInt (&sl, tag); Send_With_Handling (&pl->socket, &sl); - free (sl.buf); + sl.free (); } @@ -607,7 +620,12 @@ void ExamineCmd (char *buf, int len, player *pl) { - long tag = atoi (buf); + tag_t tag = atoi (buf); + + /* If the high bit is set, player examined a pseudo object. */ + if (tag & 0x80000000) + return; + object *op = esrv_get_ob_from_count (pl->ob, tag); if (!op) @@ -615,6 +633,7 @@ LOG (llevDebug, "Player '%s' tried to examine the unknown object (%ld)\n", &pl->ob->name, tag); return; } + examine (pl->ob, op); } @@ -622,8 +641,7 @@ void ApplyCmd (char *buf, int len, player *pl) { - uint32 tag = atoi (buf); - object *op = esrv_get_ob_from_count (pl->ob, tag); + tag_t tag = atoi (buf); /* sort of a hack, but if the player saves and the player then manually * applies a savebed (or otherwise tries to do stuff), we run into trouble. @@ -639,34 +657,36 @@ return; } + object *op = esrv_get_ob_from_count (pl->ob, tag); + if (!op) { LOG (llevDebug, "Player '%s' tried to apply the unknown object (%d)\n", &pl->ob->name, tag); return; } + player_apply (pl->ob, op, 0, 0); } /** Client wants to apply some object. Lets do so. */ void -LockItem (uint8 * data, int len, player *pl) +LockItem (uint8 *data, int len, player *pl) { - int flag, tag; - object *op; - - flag = data[0]; - tag = GetInt_String (data + 1); - op = esrv_get_ob_from_count (pl->ob, tag); + int flag = data[0]; + tag_t tag = net_uint32 (data + 1); + object *op = esrv_get_ob_from_count (pl->ob, tag); if (!op) { new_draw_info (NDI_UNIQUE, 0, pl->ob, "Could not find object to lock/unlock"); return; } + if (!flag) CLEAR_FLAG (op, FLAG_INV_LOCKED); else SET_FLAG (op, FLAG_INV_LOCKED); + esrv_update_item (UPD_FLAGS, pl->ob, op); } @@ -674,22 +694,19 @@ void MarkItem (uint8 * data, int len, player *pl) { - int tag; - object *op; + tag_t tag = net_uint32 (data); + object *op = esrv_get_ob_from_count (pl->ob, tag); - tag = GetInt_String (data); - op = esrv_get_ob_from_count (pl->ob, tag); if (!op) { new_draw_info (NDI_UNIQUE, 0, pl->ob, "Could not find object to mark"); return; } + pl->mark = op; - pl->mark_count = op->count; new_draw_info_format (NDI_UNIQUE, 0, pl->ob, "Marked item %s", query_name (op)); } - /** * look_at prints items on the specified square. * @@ -702,7 +719,7 @@ object *tmp; int flag = 0; sint16 x, y; - mapstruct *m; + maptile *m; x = op->x + dx; y = op->y + dy;