From f0e374ea23f2a61dc020520177d137c88f1ba707 Mon Sep 17 00:00:00 2001 From: Vincent Stumpf Date: Mon, 20 Mar 2023 10:08:04 -0700 Subject: [PATCH] Fixes getrefine failing in OnEquip/OnUnequip scripts (#7592) --- src/map/pc.cpp | 18 ++++++++++++++---- src/map/script.cpp | 5 ++++- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/map/pc.cpp b/src/map/pc.cpp index 196bf97984..dc76f0d340 100755 --- a/src/map/pc.cpp +++ b/src/map/pc.cpp @@ -11955,6 +11955,8 @@ bool pc_equipitem(map_session_data *sd,short n,int req_pos,bool equipswitch) //OnEquip script [Skotlex] if (id) { + current_equip_item_index = n; + current_equip_card_id = 0; //only run the script if item isn't restricted if (id->equip_script && (pc_has_permission(sd,PC_PERM_USE_ALL_EQUIPMENT) || !itemdb_isNoEquip(id,sd->bl.m))) run_script(id->equip_script,0,sd->bl.id,fake_nd->bl.id); @@ -11964,15 +11966,18 @@ bool pc_equipitem(map_session_data *sd,short n,int req_pos,bool equipswitch) for( i = 0; i < MAX_SLOTS; i++ ) { if (!sd->inventory.u.items_inventory[n].card[i]) continue; - std::shared_ptr data = item_db.find(sd->inventory.u.items_inventory[n].card[i]); if ( data != nullptr ) { - if (data->equip_script && (pc_has_permission(sd,PC_PERM_USE_ALL_EQUIPMENT) || !itemdb_isNoEquip(data.get(), sd->bl.m))) + if (data->equip_script && (pc_has_permission(sd,PC_PERM_USE_ALL_EQUIPMENT) || !itemdb_isNoEquip(data.get(), sd->bl.m))) { + current_equip_card_id = sd->inventory.u.items_inventory[n].card[i]; run_script(data->equip_script,0,sd->bl.id,fake_nd->bl.id); + } } + current_equip_card_id = 0; } } + current_equip_item_index = -1; } sd->npc_item_flag = iflag; @@ -12050,6 +12055,8 @@ static void pc_unequipitem_sub(map_session_data *sd, int n, int flag) { //OnUnEquip script [Skotlex] if (sd->inventory_data[n]) { + current_equip_item_index = n; + current_equip_card_id = 0; if (sd->inventory_data[n]->unequip_script) run_script(sd->inventory_data[n]->unequip_script, 0, sd->bl.id, fake_nd->bl.id); if (itemdb_isspecial(sd->inventory.u.items_inventory[n].card[0])) @@ -12062,12 +12069,15 @@ static void pc_unequipitem_sub(map_session_data *sd, int n, int flag) { std::shared_ptr data = item_db.find(sd->inventory.u.items_inventory[n].card[i]); if (data != nullptr) { - if (data->unequip_script) + if (data->unequip_script) { + current_equip_card_id = sd->inventory.u.items_inventory[n].card[i]; run_script(data->unequip_script, 0, sd->bl.id, fake_nd->bl.id); + } } - + current_equip_card_id = 0; } } + current_equip_item_index = -1; } sd->npc_item_flag = iflag; diff --git a/src/map/script.cpp b/src/map/script.cpp index df8eb35b27..69a8d606cb 100644 --- a/src/map/script.cpp +++ b/src/map/script.cpp @@ -4132,8 +4132,11 @@ int run_func(struct script_state *st) } #endif - if (str_data[func].func(st) == SCRIPT_CMD_FAILURE) //Report error + if (str_data[func].func(st) == SCRIPT_CMD_FAILURE) { + //Report error + ShowWarning("Script command '%s' returned failure.\n", get_str(func)); script_reportsrc(st); + } } else { ShowError("script:run_func: '%s' (id=%d type=%s) has no C function. please report this!!!\n", get_str(func), func, script_op2name(str_data[func].type)); script_reportsrc(st);