Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions doc/script_commands.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3232,6 +3232,7 @@ Set an equipment's option index or value for the specified option slot.
<equipment_index> For a list of equipment indexes see getequipid().
<option_slot> can range from 1 to MAX_ITEM_OPTIONS
<type> can be IT_OPT_INDEX (the ID of the option bonus, @see "Id" or "Name" in db/item_options.conf)
removes the equip option if type is 0.
<value> The value of the type to be set.

returns 0 if value couldn't be set, 1 on success.
Expand Down
35 changes: 20 additions & 15 deletions src/map/script.c
Original file line number Diff line number Diff line change
Expand Up @@ -14197,31 +14197,36 @@ BUILDIN(setequipoption)

if (equip_index > 0 && equip_index <= ARRAYLENGTH(script->equip)) {
if ((i = pc->checkequip(sd, script->equip[equip_index - 1])) == -1) {
ShowError("buildin_setequipoptioninfo: No equipment is equipped in the given index %d.\n", equip_index);
ShowError("buildin_setequipoption: No equipment is equipped in the given index %d.\n", equip_index);
script_pushint(st, 0);
return false;
}
} else {
ShowError("buildin_setequipoptioninfo: Invalid equipment index %d provided.\n", equip_index);
ShowError("buildin_setequipoption: Invalid equipment index %d provided.\n", equip_index);
script_pushint(st, 0);
return false;
}

if (sd->status.inventory[i].nameid != 0) {

if ((ito = itemdb->option_exists(opt_index)) == NULL) {
script_pushint(st, 0);
ShowError("buildin_setequipotion: Option index %d does not exist!\n", opt_index);
return false;
} else if (value < -INT16_MAX || value > INT16_MAX) {
script_pushint(st, 0);
ShowError("buildin_setequipotion: Option value %d exceeds maximum limit (%d to %d) for type!\n", value, -INT16_MAX, INT16_MAX);
return false;
if (opt_index == 0) {
// Remove the option
sd->status.inventory[i].option[slot-1].index = 0;
sd->status.inventory[i].option[slot-1].value = 0;
} else {
if ((ito = itemdb->option_exists(opt_index)) == NULL) {
script_pushint(st, 0);
ShowError("buildin_setequipotion: Option index %d does not exist!\n", opt_index);
return false;
} else if (value < -INT16_MAX || value > INT16_MAX) {
script_pushint(st, 0);
ShowError("buildin_setequipotion: Option value %d exceeds maximum limit (%d to %d) for type!\n", value, -INT16_MAX, INT16_MAX);
return false;
}
/* Add Option Index */
sd->status.inventory[i].option[slot-1].index = ito->index;
/* Add Option Value */
sd->status.inventory[i].option[slot-1].value = value;
}
/* Add Option Index */
sd->status.inventory[i].option[slot-1].index = ito->index;
/* Add Option Value */
sd->status.inventory[i].option[slot-1].value = value;

/* Unequip and simulate deletion of the item. */
pc->unequipitem(sd, i, PCUNEQUIPITEM_FORCE); // status calc will happen in pc->equipitem() below
Expand Down