diff options
Diffstat (limited to 'src/map/script.c')
-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; } |