Index: include/sproto.h =================================================================== RCS file: /cvsroot/crossfire/crossfire/include/sproto.h,v retrieving revision 1.152 diff -C5 -r1.152 sproto.h *** include/sproto.h 9 Nov 2005 19:34:17 -0000 1.152 --- include/sproto.h 23 Nov 2005 14:01:00 -0000 *************** *** 682,691 **** --- 682,692 ---- double shop_specialisation_ratio(object *item, mapstruct *map); double shop_greed(mapstruct *map); double shopkeeper_approval(mapstruct *map, object *player); int describe_shop(object *op); void shop_listing(object *op); + void drop_all_unpaid(object *op); /* skills.c */ int steal(object *op, int dir, object *skill); int pick_lock(object *pl, int dir, object *skill); int hide(object *op, object *skill); int jump(object *pl, int dir, object *skill); Index: server/shop.c =================================================================== RCS file: /cvsroot/crossfire/crossfire/server/shop.c,v retrieving revision 1.49 diff -C5 -r1.49 shop.c *** server/shop.c 9 Nov 2005 15:37:29 -0000 1.49 --- server/shop.c 23 Nov 2005 14:01:03 -0000 *************** *** 1124,1128 **** --- 1124,1144 ---- free(items[i].item_real); } } free(items); } + + /* if we need to quickly make a player leave everything that they are carrying that + * hasn't been paid for we call this, used with the dm summon command, and dead connections */ + void drop_all_unpaid(object *op) { + object *item; + for (item = op->inv;item;) { + if QUERY_FLAG(item, FLAG_UNPAID) drop(op, item); + if (item->inv) item = item->inv; + else if (item->below) item = item->below; + else if (item->env && item->env != op && item->env->below) item = item->env->below; + else item = NULL; + } + + + + } Index: socket/loop.c =================================================================== RCS file: /cvsroot/crossfire/crossfire/socket/loop.c,v retrieving revision 1.34 diff -C5 -r1.34 loop.c *** socket/loop.c 28 Oct 2005 19:08:53 -0000 1.34 --- socket/loop.c 23 Nov 2005 14:01:03 -0000 *************** *** 534,543 **** --- 534,544 ---- player *npl=pl->next; save_player(pl->ob, 0); if(!QUERY_FLAG(pl->ob,FLAG_REMOVED)) { terminate_all_pets(pl->ob); + drop_all_unpaid(pl->ob); remove_ob(pl->ob); } leave(pl,1); final_free_player(pl); pl=npl; *************** *** 647,656 **** --- 648,658 ---- if (FD_ISSET(pl->socket.fd,&tmp_exceptions)) { save_player(pl->ob, 0); if(!QUERY_FLAG(pl->ob,FLAG_REMOVED)) { terminate_all_pets(pl->ob); + drop_all_unpaid(pl->ob); remove_ob(pl->ob); } leave(pl,1); final_free_player(pl); } *************** *** 663,672 **** --- 665,675 ---- */ if (pl->socket.status==Ns_Dead) { save_player(pl->ob, 0); if(!QUERY_FLAG(pl->ob,FLAG_REMOVED)) { terminate_all_pets(pl->ob); + drop_all_unpaid(pl->ob); remove_ob(pl->ob); } leave(pl,1); final_free_player(pl); } else {