forked from Sokomine/yl_speak_up
actually handle partial taking of items
This commit is contained in:
parent
75cc01904e
commit
d0e7b23127
@ -68,6 +68,7 @@ yl_speak_up.execute_all_relevant_effects = function(player, effects, o_id, actio
|
|||||||
local alternate_text = nil
|
local alternate_text = nil
|
||||||
local last_result = action_was_successful
|
local last_result = action_was_successful
|
||||||
local res = true
|
local res = true
|
||||||
|
local refuse_items = true
|
||||||
for i, k in ipairs(sorted_key_list) do
|
for i, k in ipairs(sorted_key_list) do
|
||||||
local r = effects[ k ]
|
local r = effects[ k ]
|
||||||
yl_speak_up.debug_msg(player, n_id, o_id, "..executing "..
|
yl_speak_up.debug_msg(player, n_id, o_id, "..executing "..
|
||||||
@ -82,6 +83,12 @@ yl_speak_up.execute_all_relevant_effects = function(player, effects, o_id, actio
|
|||||||
" -> Effect failed to execute.")
|
" -> Effect failed to execute.")
|
||||||
alternate_text = r.alternate_text
|
alternate_text = r.alternate_text
|
||||||
end
|
end
|
||||||
|
if(r and r.r_type and r.r_type == "deal_with_offered_item") then
|
||||||
|
refuse_items = true
|
||||||
|
if(not(r.r_value) or r.r_value == "do_nothing") then
|
||||||
|
refuse_items = false
|
||||||
|
end
|
||||||
|
end
|
||||||
else
|
else
|
||||||
-- in edit mode: assume that the effect was successful
|
-- in edit mode: assume that the effect was successful
|
||||||
res = true
|
res = true
|
||||||
@ -102,6 +109,14 @@ yl_speak_up.execute_all_relevant_effects = function(player, effects, o_id, actio
|
|||||||
end
|
end
|
||||||
-- all preconditions are true
|
-- all preconditions are true
|
||||||
yl_speak_up.debug_msg(player, n_id, o_id, "Finished executing effects.")
|
yl_speak_up.debug_msg(player, n_id, o_id, "Finished executing effects.")
|
||||||
|
-- make sure to give unwanted items back if needed
|
||||||
|
if(refuse_items) then
|
||||||
|
-- check if there is actually something that needs to be given back
|
||||||
|
local trade_inv = minetest.get_inventory({type="detached", name="yl_speak_up_player_"..pname})
|
||||||
|
if(not(trade_inv:is_empty("npc_wants"))) then
|
||||||
|
target_dialog = "d_got_item"
|
||||||
|
end
|
||||||
|
end
|
||||||
return {next_dialog = target_dialog, alternate_text = alternate_text}
|
return {next_dialog = target_dialog, alternate_text = alternate_text}
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -242,6 +257,50 @@ yl_speak_up.execute_effect = function(player, n_id, o_id, r)
|
|||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
return false
|
return false
|
||||||
|
elseif(r.r_type == "deal_with_offered_item") then
|
||||||
|
-- possible r_value: "do_nothing", "take_as_wanted", "take_all", "refuse_all"}
|
||||||
|
if(not(r.r_value) or r.r_value == "do_nothing") then
|
||||||
|
return true -- we're good at doing nothing
|
||||||
|
end
|
||||||
|
local pname = player:get_player_name()
|
||||||
|
local inv = minetest.get_inventory({type="detached", name="yl_speak_up_player_"..pname})
|
||||||
|
local stack_got = inv:get_stack("npc_wants",1)
|
||||||
|
if(stack_got:is_empty()) then
|
||||||
|
yl_speak_up.debug_msg(player, n_id, o_id, tostring(r.r_id).." "..
|
||||||
|
r.r_type..": The offered stack is empty.")
|
||||||
|
return false -- the player gave nothing
|
||||||
|
end
|
||||||
|
-- get the inventory of the npc
|
||||||
|
local npc_inv = minetest.get_inventory({type="detached",
|
||||||
|
name="yl_speak_up_npc_"..tostring(n_id)})
|
||||||
|
-- shall we take all or just as much as the NPC wants?
|
||||||
|
local stack_wanted = ItemStack(p.p_value)
|
||||||
|
local amount = 0
|
||||||
|
if(r.r_value == "take_all") then
|
||||||
|
amount = stack_got:get_count()
|
||||||
|
elseif(r.r_value == "takeas_wanted") then
|
||||||
|
amount = stack_wanted:get_count()
|
||||||
|
-- the NPC didn't get enough
|
||||||
|
if(amount > stack_got:get_count()) then
|
||||||
|
yl_speak_up.debug_msg(player, n_id, o_id, tostring(r.r_id).." "..
|
||||||
|
r.r_type..": The offered stack \""..tostring(stack_got)..
|
||||||
|
"is smaller than what the NPC wanted: \""..
|
||||||
|
tostring(stack_wanted).."\".")
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
local take_stack = stack_got:get_name().." "..tostring(amount)
|
||||||
|
if(not(npc_inv:room_for_item("npc_main", take_stack))) then
|
||||||
|
yl_speak_up.debug_msg(player, n_id, o_id, tostring(r.r_id).." "..
|
||||||
|
r.r_type..": The NPC has not enough room for \""..tostring(take_stack).."\".")
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
-- actually transfer the item from the player to the NPC's inventory
|
||||||
|
npc_inv:add_item("npc_main", take_stack)
|
||||||
|
inv:remove_item("npc_wants", take_stack)
|
||||||
|
-- returning of any leftover items needs to happen after *all* effects
|
||||||
|
-- are executed; we don't need to take any special preparations here
|
||||||
|
|
||||||
elseif(r.r_type == "dialog"
|
elseif(r.r_type == "dialog"
|
||||||
or r.r_type == "on_failure") then
|
or r.r_type == "on_failure") then
|
||||||
-- this needs to be handled in the calling function
|
-- this needs to be handled in the calling function
|
||||||
|
Loading…
Reference in New Issue
Block a user