diff options
author | Haru <haru@dotalux.com> | 2019-06-02 15:26:57 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-06-02 15:26:57 +0200 |
commit | db4a29905f97016a4945db2670b15452e4e8ad20 (patch) | |
tree | d30966cf77043637c64a5e8ec7fe5424463a5518 | |
parent | 1e1942ccc51b7a4b27bb3d8deea5e5a1178b8531 (diff) | |
parent | 858e732e15c495f3073c8037b9612c6c20390f76 (diff) | |
download | hercules-db4a29905f97016a4945db2670b15452e4e8ad20.tar.gz hercules-db4a29905f97016a4945db2670b15452e4e8ad20.tar.bz2 hercules-db4a29905f97016a4945db2670b15452e4e8ad20.tar.xz hercules-db4a29905f97016a4945db2670b15452e4e8ad20.zip |
Merge pull request #2394 from bWolfie/buildin_delitemidx
Adds BUILDIN(delitemidx), which deletes an item at the given index.
-rw-r--r-- | doc/script_commands.txt | 28 | ||||
-rw-r--r-- | src/map/script.c | 43 |
2 files changed, 71 insertions, 0 deletions
diff --git a/doc/script_commands.txt b/doc/script_commands.txt index 9e5045c9c..bdcc11712 100644 --- a/doc/script_commands.txt +++ b/doc/script_commands.txt @@ -5361,6 +5361,34 @@ Check getitem2() to understand its expanded parameters. --------------------------------------- +*delitemidx(<index>{, <amount>{, <account id>}}) + +This command will remove an item at the given inventory index. Unlike the +'delitem()' counterpart, this doesn't check invalid Item ID, making it useful to remove +invalid item IDs in player's inventory. + +If <amount> is not specified, this will remove all of the items at the specified index. +Note that items with the 'ForceSerial' flag, not yet merged through 'mergeitem()', will only +be removed at the given index. + +The only way to get the inventory index is by using 'getinventorylist()'. After deleting +an item at the given index, that index can remain empty until the player relogs, so you +should recall 'getinventorylist()' again. If you try to delete an item at an invalid index, the +script will terminate with an error. + +This command is also useful to remove rental/bound items because 'delitem()' +does not discriminate at choosing which item to remove. + +Example: + + // This will remove all invalid Item ID in player's inventory + getinventorylist(); + for (.@i = 0; .@i < @inventorylist_count; ++.@i) + if (getiteminfo(@inventorylist_id[.@i], ITEMINFO_TYPE) == -1) + delitemidx(@inventorylist_idx[.@i]); + +--------------------------------------- + *countitem(<item id>) *countitem("<item name>") diff --git a/src/map/script.c b/src/map/script.c index d9c3660d0..86674be25 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -8631,6 +8631,48 @@ static BUILDIN(delitem2) return false; } +/** + * Deletes item at given index. + * delitem(<index>{, <amount{, <account id>}}); + */ +static BUILDIN(delitemidx) +{ + struct map_session_data *sd; + + if (script_hasdata(st, 4)) { + if ((sd = script->id2sd(st, script_getnum(st, 4))) == NULL) { + st->state = END; + return true; + } + } else { + if ((sd = script->rid2sd(st)) == NULL) + return true; + } + + int i = script_getnum(st, 2); + if (i < 0 || i >= sd->status.inventorySize) { + ShowError("buildin_delitemidx: Index (%d) should be from 0-%d.\n", i, sd->status.inventorySize - 1); + st->state = END; + return false; + } + + if (itemdb->exists(sd->status.inventory[i].nameid) == NULL) + ShowWarning("buildin_delitemidx: Deleting invalid Item ID (%d).\n", sd->status.inventory[i].nameid); + + int amount = 0; + if (script_hasdata(st, 3)) { + if ((amount = script_getnum(st, 3)) > sd->status.inventory[i].amount) + amount = sd->status.inventory[i].amount; + } else { + amount = sd->status.inventory[i].amount; + } + + if (amount > 0) + script->buildin_delitem_delete(sd, i, &amount, true); + + return true; +} + /*========================================== * Enables/Disables use of items while in an NPC [Skotlex] *------------------------------------------*/ @@ -25558,6 +25600,7 @@ static void script_parse_builtin(void) BUILDIN_DEF(makeitem2,"viiiiiiii????"), BUILDIN_DEF(delitem,"vi?"), BUILDIN_DEF(delitem2,"viiiiiiii?"), + BUILDIN_DEF(delitemidx, "i??"), BUILDIN_DEF2(enableitemuse,"enable_items",""), BUILDIN_DEF2(disableitemuse,"disable_items",""), BUILDIN_DEF(cutin,"si"), |