Performance Improvement; Server shut down, instance clear up, and @cleanmap are now all faster. Instead of wasting time doing a dbmap lookup (of a data it already possessed!) on each floor item being deleted, it'll use the data to clean the item.
git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@16901 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
parent
58f563d8c5
commit
e242d2b5a9
@ -6156,7 +6156,7 @@ ACMD_FUNC(mobsearch)
|
||||
static int atcommand_cleanmap_sub(struct block_list *bl, va_list ap)
|
||||
{
|
||||
nullpo_ret(bl);
|
||||
map_clearflooritem(bl->id);
|
||||
map_clearflooritem(bl);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -271,7 +271,7 @@ int instance_cleanup_sub(struct block_list *bl, va_list ap) {
|
||||
//There is no need for this, the pet is removed together with the player. [Skotlex]
|
||||
break;
|
||||
case BL_ITEM:
|
||||
map_clearflooritem(bl->id);
|
||||
map_clearflooritem(bl);
|
||||
break;
|
||||
case BL_SKILL:
|
||||
skill_delunit((struct skill_unit *) bl);
|
||||
|
||||
@ -1302,14 +1302,11 @@ int map_clearflooritem_timer(int tid, unsigned int tick, int id, intptr_t data)
|
||||
{
|
||||
struct flooritem_data* fitem = (struct flooritem_data*)idb_get(id_db, id);
|
||||
|
||||
if (fitem == NULL || fitem->bl.type != BL_ITEM || (!data && fitem->cleartimer != tid))
|
||||
{
|
||||
if (fitem == NULL || fitem->bl.type != BL_ITEM || (fitem->cleartimer != tid)) {
|
||||
ShowError("map_clearflooritem_timer : error\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (data)
|
||||
delete_timer(fitem->cleartimer,map_clearflooritem_timer);
|
||||
|
||||
if (search_petDB_index(fitem->item_data.nameid, PET_EGG) >= 0)
|
||||
intif_delete_petdata(MakeDWord(fitem->item_data.card[1], fitem->item_data.card[2]));
|
||||
@ -1321,6 +1318,21 @@ int map_clearflooritem_timer(int tid, unsigned int tick, int id, intptr_t data)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* clears a single bl item out of the bazooonga.
|
||||
*/
|
||||
void map_clearflooritem(struct block_list *bl) {
|
||||
struct flooritem_data* fitem = (struct flooritem_data*)bl;
|
||||
|
||||
if( fitem->cleartimer )
|
||||
delete_timer(fitem->cleartimer,map_clearflooritem_timer);
|
||||
|
||||
clif_clearflooritem(fitem, 0);
|
||||
map_deliddb(&fitem->bl);
|
||||
map_delblock(&fitem->bl);
|
||||
map_freeblock(&fitem->bl);
|
||||
}
|
||||
|
||||
/*==========================================
|
||||
* (m,x,y) locates a random available free cell around the given coordinates
|
||||
* to place an BL_ITEM object. Scan area is 9x9, returns 1 on success.
|
||||
@ -3550,7 +3562,7 @@ int cleanup_sub(struct block_list *bl, va_list ap)
|
||||
//There is no need for this, the pet is removed together with the player. [Skotlex]
|
||||
break;
|
||||
case BL_ITEM:
|
||||
map_clearflooritem(bl->id);
|
||||
map_clearflooritem(bl);
|
||||
break;
|
||||
case BL_SKILL:
|
||||
skill_delunit((struct skill_unit *) bl);
|
||||
|
||||
@ -658,7 +658,7 @@ bool map_addnpc(int,struct npc_data *);
|
||||
// map item
|
||||
int map_clearflooritem_timer(int tid, unsigned int tick, int id, intptr_t data);
|
||||
int map_removemobs_timer(int tid, unsigned int tick, int id, intptr_t data);
|
||||
#define map_clearflooritem(id) map_clearflooritem_timer(0,0,id,1)
|
||||
void map_clearflooritem(struct block_list* bl);
|
||||
int map_addflooritem(struct item *item_data,int amount,int m,int x,int y,int first_charid,int second_charid,int third_charid,int flags);
|
||||
|
||||
// player to map session
|
||||
|
||||
@ -1629,7 +1629,7 @@ static bool mob_ai_sub_hard(struct mob_data *md, unsigned int tick)
|
||||
unit_set_walkdelay(&md->bl, tick, md->status.amotion, 1);
|
||||
}
|
||||
//Clear item.
|
||||
map_clearflooritem (tbl->id);
|
||||
map_clearflooritem (tbl);
|
||||
mob_unlocktarget (md,tick);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -3977,7 +3977,7 @@ int pc_takeitem(struct map_session_data *sd,struct flooritem_data *fitem)
|
||||
//Display pickup animation.
|
||||
pc_stop_attack(sd);
|
||||
clif_takeitem(&sd->bl,&fitem->bl);
|
||||
map_clearflooritem(fitem->bl.id);
|
||||
map_clearflooritem(&fitem->bl);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
@ -922,7 +922,7 @@ static int pet_ai_sub_hard(struct pet_data *pd, struct map_session_data *sd, uns
|
||||
if(pd->loot->count < pd->loot->max){
|
||||
memcpy(&pd->loot->item[pd->loot->count++],&fitem->item_data,sizeof(pd->loot->item[0]));
|
||||
pd->loot->weight += itemdb_weight(fitem->item_data.nameid)*fitem->item_data.amount;
|
||||
map_clearflooritem(target->id);
|
||||
map_clearflooritem(target);
|
||||
}
|
||||
//Target is unlocked regardless of whether it was picked or not.
|
||||
pet_unlocktarget(pd);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user