--- deliantra/server/socket/item.C 2010/03/26 00:59:22 1.87
+++ deliantra/server/socket/item.C 2012/10/29 23:55:57 1.100
@@ -1,24 +1,24 @@
/*
* This file is part of Deliantra, the Roguelike Realtime MMORPG.
- *
- * Copyright (©) 2005,2006,2007,2008 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
+ *
+ * Copyright (©) 2005,2006,2007,2008,2009,2010,2011,2012 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
* Copyright (©) 2002 Mark Wedel & Crossfire Development Team
* Copyright (©) 1992 Frank Tore Johansen
- *
+ *
* Deliantra is free software: you can redistribute it and/or modify it under
* the terms of the Affero GNU General Public License as published by 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
* GNU General Public License for more details.
- *
+ *
* You should have received a copy of the Affero GNU General Public License
* and the GNU General Public License along with this program. If not, see
* .
- *
+ *
* The authors can be reached via e-mail to
*/
@@ -55,7 +55,7 @@
{
unsigned int flags = 0;
- if (QUERY_FLAG (op, FLAG_APPLIED))
+ if (op->flag [FLAG_APPLIED])
switch (op->type)
{
case BOW:
@@ -91,19 +91,19 @@
if (op->is_open_container ())
flags |= F_OPEN;
- if (QUERY_FLAG (op, FLAG_KNOWN_CURSED))
+ if (op->flag [FLAG_KNOWN_CURSED])
{
- if (QUERY_FLAG (op, FLAG_DAMNED))
+ if (op->flag [FLAG_DAMNED])
flags |= F_DAMNED;
- else if (QUERY_FLAG (op, FLAG_CURSED))
+ else if (op->flag [FLAG_CURSED])
flags |= F_CURSED;
}
- if (QUERY_FLAG (op, FLAG_KNOWN_MAGICAL) && !QUERY_FLAG (op, FLAG_IDENTIFIED))
+ if (op->flag [FLAG_KNOWN_MAGICAL] && !op->flag [FLAG_IDENTIFIED])
flags |= F_MAGIC;
- if (QUERY_FLAG (op, FLAG_UNPAID))
+ if (op->flag [FLAG_UNPAID])
flags |= F_UNPAID;
- if (QUERY_FLAG (op, FLAG_INV_LOCKED))
+ if (op->flag [FLAG_INV_LOCKED])
flags |= F_LOCKED;
return flags;
@@ -118,18 +118,17 @@
{
int flags = query_flags (head);
- if (QUERY_FLAG (head, FLAG_NO_PICK))
+ if (head->flag [FLAG_NO_PICK])
flags |= F_NOPICK;
ns.send_face (head->face, -50);
- ns.flush_fx ();
- if (QUERY_FLAG (head, FLAG_ANIMATE) && !ns.anims_sent[head->animation_id])
+ if (head->flag [FLAG_ANIMATE] && !ns.anims_sent[head->animation_id])
ns.send_animation (head->animation_id);
sl << uint32 (head->count)
<< uint32 (flags)
- << uint32 (QUERY_FLAG (head, FLAG_NO_PICK) ? -1 : head->client_weight ())
+ << uint32 (head->flag [FLAG_NO_PICK] ? -1 : head->client_weight ())
<< uint32 (head->face);
if (!head->custom_name)
@@ -145,7 +144,7 @@
}
else
{
- int len = min (head->custom_name.length (), 127);
+ int len = min (127, head->custom_name.length ());
sl << uint8 (len * 2 + 1)
<< data (head->custom_name, len)
@@ -196,16 +195,24 @@
return;
}
- pl->ns->update_look = 0;
+ if (pl->ns->need_delinv0)
+ {
+ pl->ns->need_delinv0 = 0;
+ pl->ns->send_packet ("delinv 0");
+ }
+
+ if (pl->run_on)
+ return;
+
+ pl->ns->update_look = 0;
+ pl->ns->need_delinv0 = 1;
- if (QUERY_FLAG (ob, FLAG_REMOVED)
+ if (ob->flag [FLAG_REMOVED]
|| !ob->map
- || ob->map->in_memory != MAP_ACTIVE
+ || ob->map->state != MAP_ACTIVE
|| out_of_map (ob->map, ob->x, ob->y))
return;
- pl->ns->send_packet ("delinv 0");
-
packet sl;
sl.printf ("item%d ", pl->ns->itemcmd);
@@ -281,6 +288,7 @@
// if packet got too large, send it and begin a new one
if (sl.length () > MAXSOCKBUF - MAXITEMLEN)
{
+ pl->ns->flush_fx ();
pl->ns->send_packet (sl);
sl.reset ();
@@ -309,7 +317,10 @@
}
if (dirty)
- pl->ns->send_packet (sl);
+ {
+ pl->ns->flush_fx ();
+ pl->ns->send_packet (sl);
+ }
}
/**
@@ -351,6 +362,7 @@
*/
if (sl.length () > MAXSOCKBUF - MAXITEMLEN)
{
+ pl->contr->ns->flush_fx ();
pl->contr->ns->send_packet (sl);
sl.reset ();
@@ -362,7 +374,10 @@
}
if (got_one)
- pl->contr->ns->send_packet (sl);
+ {
+ pl->contr->ns->flush_fx ();
+ pl->contr->ns->send_packet (sl);
+ }
}
/**
@@ -443,7 +458,7 @@
{
int anim_speed = 0;
- if (QUERY_FLAG (op, FLAG_ANIMATE))
+ if (op->flag [FLAG_ANIMATE])
{
if (op->anim_speed)
anim_speed = op->anim_speed;
@@ -493,6 +508,7 @@
add_object_to_socklist (*pl->contr->ns, sl, op);
+ pl->contr->ns->flush_fx ();
pl->contr->ns->send_packet (sl);
}
@@ -613,15 +629,9 @@
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);
+ // the object might be legally gone already
+ if (object *op = esrv_get_ob_from_count (pl->ob, tag))
+ pl->ob->apply (op, AP_TOGGLE);
}
/** Client wants to lock some object. Lets do so. */
@@ -639,9 +649,9 @@
}
if (!flag)
- CLEAR_FLAG (op, FLAG_INV_LOCKED);
+ op->clr_flag (FLAG_INV_LOCKED);
else
- SET_FLAG (op, FLAG_INV_LOCKED);
+ op->set_flag (FLAG_INV_LOCKED);
esrv_update_item (UPD_FLAGS, pl->ob, op);
}
@@ -712,7 +722,7 @@
if (pos.normalise ())
for (object *tmp = pos->top; tmp; tmp = tmp->below)
{
- if (tmp->invisible && !QUERY_FLAG (ob, FLAG_WIZ))
+ if (tmp->invisible && !ob->flag [FLAG_WIZ])
continue;
if (wiz)
@@ -724,10 +734,10 @@
if (head->inv)
if ((head->type != CONTAINER && head->type != FLESH)
- || QUERY_FLAG (ob, FLAG_WIZ))
+ || ob->flag [FLAG_WIZ])
buf << head->query_inventory (ob, " ");
- if (QUERY_FLAG (tmp, FLAG_IS_FLOOR) && !wiz) /* don't continue under the floor */
+ if (tmp->flag [FLAG_IS_FLOOR] && !wiz) /* don't continue under the floor */
break;
}
}
@@ -772,7 +782,7 @@
/* If it is an active container, then we should drop all objects
* in the container and not the container itself.
*/
- if (op->inv && QUERY_FLAG (op, FLAG_APPLIED))
+ if (op->inv && op->flag [FLAG_APPLIED])
{
int cnt = MAX_ITEM_PER_ACTION;