take items back into npc inventory when npc_gives failed instead of forgetting them
This commit is contained in:
parent
bfeed37767
commit
0316afdfa9
@ -312,6 +312,22 @@ yl_speak_up.get_action_by_player = function(player)
|
||||
end
|
||||
|
||||
|
||||
-- did the NPC try to give something to the player already - and the player didn't take it?
|
||||
-- then give that old item back to the NPC
|
||||
yl_speak_up.action_take_back_failed_npc_gives = function(trade_inv, npc_inv)
|
||||
if(not(trade_inv) or not(npc_inv)) then
|
||||
return
|
||||
end
|
||||
local last_stack = trade_inv:get_stack("npc_gives", 1)
|
||||
if(not(last_stack:is_empty())) then
|
||||
-- strip any metadata to avoid stacking problems
|
||||
npc_inv:add_item("npc_main", last_stack:get_name().." "..last_stack:get_count())
|
||||
-- clear the stack
|
||||
trade_inv:set_stack("npc_gives", 1, "")
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
-- Create the quest item by taking a raw item (i.e. a general piece of paper) out
|
||||
-- of the NPC's inventory, applying a description (if given) and quest id (if
|
||||
-- given); place the quest item in the trade inv of the player in the npc_gives slot.
|
||||
@ -331,6 +347,10 @@ yl_speak_up.action_quest_item_prepare = function(player)
|
||||
local stack = ItemStack(a.a_value)
|
||||
-- get the inventory of the NPC
|
||||
local npc_inv = minetest.get_inventory({type="detached", name="yl_speak_up_npc_"..tostring(n_id)})
|
||||
|
||||
local trade_inv = minetest.get_inventory({type="detached", name="yl_speak_up_player_"..pname})
|
||||
yl_speak_up.action_take_back_failed_npc_gives(trade_inv, npc_inv)
|
||||
|
||||
-- does the NPC have the item we are looking for?
|
||||
if(not(npc_inv:contains_item("npc_main", stack))) then
|
||||
local o_id = yl_speak_up.speak_to[pname].o_id
|
||||
@ -360,7 +380,6 @@ yl_speak_up.action_quest_item_prepare = function(player)
|
||||
-- put the stack in the npc_gives-slot of the trade inventory of the player
|
||||
-- (as that slot is managed by the NPC alone we don't have to worry about
|
||||
-- anything else in the slot)
|
||||
local trade_inv = minetest.get_inventory({type="detached", name="yl_speak_up_player_"..pname})
|
||||
-- actually put the stack in there
|
||||
trade_inv:set_stack("npc_gives", 1, new_stack)
|
||||
return true
|
||||
|
@ -33,6 +33,10 @@ yl_speak_up.input_fs_action_npc_gives = function(player, formname, fields)
|
||||
-- the npc_gives slot does not accept input - so we don't have to check for any misplaced items
|
||||
-- but if the player aborts, give the item back to the NPC
|
||||
if(fields.back_to_talk) then
|
||||
-- actually take the item back into the NPC's inventory
|
||||
local n_id = yl_speak_up.speak_to[pname].n_id
|
||||
local npc_inv = minetest.get_inventory({type="detached", name="yl_speak_up_npc_"..tostring(n_id)})
|
||||
yl_speak_up.action_take_back_failed_npc_gives(trade_inv, npc_inv)
|
||||
-- strip the quest item info from the stack (so that it may stack again)
|
||||
-- and give that (hopefully) stackable stack back to the NPC
|
||||
yl_speak_up.action_quest_item_take_back(player)
|
||||
|
Loading…
Reference in New Issue
Block a user