diff options
author | Lupus <Lupus@54d463be-8e91-2dee-dedb-b68131a5f0ec> | 2004-11-15 23:14:55 +0000 |
---|---|---|
committer | Lupus <Lupus@54d463be-8e91-2dee-dedb-b68131a5f0ec> | 2004-11-15 23:14:55 +0000 |
commit | 857da3729e76c8d92eb58f63b29f0aec74b44712 (patch) | |
tree | 6ba6f21a86dafc27e71d2655bf54ad6ea4c16658 /src | |
parent | c3ff8eceecee1046d6472d8c28800c677dec359d (diff) | |
download | hercules-857da3729e76c8d92eb58f63b29f0aec74b44712.tar.gz hercules-857da3729e76c8d92eb58f63b29f0aec74b44712.tar.bz2 hercules-857da3729e76c8d92eb58f63b29f0aec74b44712.tar.xz hercules-857da3729e76c8d92eb58f63b29f0aec74b44712.zip |
Fixed 2 bugs in DELITEM script command. [Lupus]
- added deleting priority: If you have some items with the same ID and want to delete some of them, then at first it'll delete common items then, if necessary, delete the rest items but upgraded/named/with cards.
git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/athena@200 54d463be-8e91-2dee-dedb-b68131a5f0ec
Diffstat (limited to 'src')
-rw-r--r-- | src/map/script.c | 60 |
1 files changed, 39 insertions, 21 deletions
diff --git a/src/map/script.c b/src/map/script.c index b0f495d55..6e69bb5d0 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -2458,12 +2458,12 @@ int buildin_makeitem(struct script_state *st) return 0; } /*========================================== - * + * script DELITEM command (fixed 2 bugs by Lupus, added deletion priority by Lupus) *------------------------------------------ */ int buildin_delitem(struct script_state *st) { - int nameid=0,amount,i; + int nameid=0,amount,i,important_item=0; struct map_session_data *sd; struct script_data *data; @@ -2487,35 +2487,53 @@ int buildin_delitem(struct script_state *st) return 0; } sd=script_rid2sd(st); - + //1st pass + //here we won't delete items with CARDS, named items but we count them for(i=0;i<MAX_INVENTORY;i++){ + //we don't delete wrong item or equipped item if(sd->status.inventory[i].nameid<=0 || sd->inventory_data[i] == NULL || - sd->inventory_data[i]->type!=7 || - sd->status.inventory[i].amount<=0) + sd->status.inventory[i].amount<=0 || sd->status.inventory[i].nameid!=nameid ) continue; - if(sd->status.inventory[i].nameid == nameid){ - if(sd->status.inventory[i].card[0] == (short)0xff00){ - if(search_petDB_index(nameid, PET_EGG) >= 0){ - intif_delete_petdata(*((long *)(&sd->status.inventory[i].card[1]))); - break; - } - } + //1 egg uses 1 cell in the inventory. so it's ok to delete 1 pet / per cycle + if(sd->inventory_data[i]->type==7 && sd->status.inventory[i].card[0] == (short)0xff00 && search_petDB_index(nameid, PET_EGG) >= 0 ){ + intif_delete_petdata(*((long *)(&sd->status.inventory[i].card[1]))); + //clear egg flag. so it won't be put in IMPORTANT items (eggs look like item with 2 cards ^_^) + sd->status.inventory[i].card[1] = sd->status.inventory[i].card[0] = 0; + //now this egg'll be deleted as a common unimportant item + } + //is this item important? does it have cards? or Player's name? or Refined/Upgraded + if( sd->status.inventory[i].card[0] || sd->status.inventory[i].card[1] || + sd->status.inventory[i].card[2] || sd->status.inventory[i].card[3] || sd->status.inventory[i].refine) { + //this is important item, count it + important_item++; + continue; + } + + if(sd->status.inventory[i].amount>=amount){ + pc_delitem(sd,i,amount,0); + return 0; //we deleted exact amount of items. now exit + } else { + amount-=sd->status.inventory[i].amount; + pc_delitem(sd,i,sd->status.inventory[i].amount,0); } } - for(i=0;i<MAX_INVENTORY;i++){ - if(sd->status.inventory[i].nameid==nameid){ + //2nd pass + //now if there WERE items with CARDs/REFINED/NAMED... and if we still have to delete some items. we'll delete them finally + if (important_item>0 && amount>0) + for(i=0;i<MAX_INVENTORY;i++){ + //we don't delete wrong item + if(sd->status.inventory[i].nameid<=0 || sd->inventory_data[i] == NULL || + sd->status.inventory[i].amount<=0 || sd->status.inventory[i].nameid!=nameid ) + continue; + if(sd->status.inventory[i].amount>=amount){ - pc_delitem(sd,i,amount,0); - break; + pc_delitem(sd,i,amount,0); + return 0; //we deleted exact amount of items. now exit } else { amount-=sd->status.inventory[i].amount; - if(amount==0) - amount=sd->status.inventory[i].amount; - pc_delitem(sd,i,amount,0); - break; + pc_delitem(sd,i,sd->status.inventory[i].amount,0); } } - } return 0; } |