forked from Sokomine/yl_speak_up
added yl_speak_up.input_add_trade_simple
This commit is contained in:
parent
39632a71f4
commit
2e2ede2ebf
106
trade_simple.lua
106
trade_simple.lua
@ -5,7 +5,89 @@ yl_speak_up.trade_fail_fs = "size[6,2]"..
|
|||||||
"label[0.2,0.5;Ups! The trade is not possible.\nPlease notify an admin.]"..
|
"label[0.2,0.5;Ups! The trade is not possible.\nPlease notify an admin.]"..
|
||||||
"button_exit[2,1.5;1,0.9;exit;Exit]"
|
"button_exit[2,1.5;1,0.9;exit;Exit]"
|
||||||
|
|
||||||
-- TODO: when closing the formspec: give the items in the pay slot back
|
|
||||||
|
-- the player wants to add a simple trade; handle formspec input
|
||||||
|
yl_speak_up.input_add_trade_simple = function(player, formname, fields)
|
||||||
|
if(not(player)) then
|
||||||
|
return 0
|
||||||
|
end
|
||||||
|
local pname = player:get_player_name()
|
||||||
|
-- the trade can only be changed in edit mode
|
||||||
|
if(yl_speak_up.edit_mode[pname] ~= yl_speak_up.speak_to[pname].n_id
|
||||||
|
or not(yl_speak_up.speak_to[pname].n_id)) then
|
||||||
|
return 0
|
||||||
|
end
|
||||||
|
|
||||||
|
-- we return from showing an error message (the player may not have noticed
|
||||||
|
-- a chat message while viewing a formspec)
|
||||||
|
if(fields.back_from_error_msg) then
|
||||||
|
minetest.show_formspec(pname, "yl_speak_up:add_trade_simple",
|
||||||
|
yl_speak_up.get_fs_trade_simple(player))
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
-- which trade are we talking about?
|
||||||
|
local trade = yl_speak_up.trade[pname]
|
||||||
|
|
||||||
|
local d_id = yl_speak_up.speak_to[pname].d_id
|
||||||
|
local n_id = yl_speak_up.speak_to[pname].n_id
|
||||||
|
|
||||||
|
-- this also contains the inventory list "setup" where the player placed the items
|
||||||
|
local trade_inv = minetest.get_inventory({type="detached", name="yl_speak_up_player_"..pname})
|
||||||
|
|
||||||
|
-- fields.abort_trade_simple can be ignored as it is similar to ESC
|
||||||
|
|
||||||
|
local pay = trade_inv:get_stack("setup", 1)
|
||||||
|
local buy = trade_inv:get_stack("setup", 2)
|
||||||
|
|
||||||
|
-- store the new trade
|
||||||
|
if(fields.store_trade_simple) then
|
||||||
|
local error_msg = ""
|
||||||
|
-- check for error conditions
|
||||||
|
if(pay:is_empty()) then
|
||||||
|
error_msg = "What shall the customer pay?\nWe don't give away stuff for free here!"
|
||||||
|
elseif(buy:is_empty()) then
|
||||||
|
error_msg = "What shall your NPC sell?\nCustomers won't pay for nothing!"
|
||||||
|
elseif(pay:get_wear() > 0 or buy:get_wear() > 0) then
|
||||||
|
error_msg = "Selling used items is not possible."
|
||||||
|
elseif(not(minetest.registered_items[ pay:get_name() ])
|
||||||
|
or not(minetest.registered_items[ buy:get_name() ])) then
|
||||||
|
error_msg = "Unkown items cannot be traded."
|
||||||
|
elseif(pay:get_name() == buy:get_name()) then
|
||||||
|
error_msg = "Selling *and* buying the same item\nat the same time makes no sense."
|
||||||
|
else
|
||||||
|
-- TODO: *can* we store the trade?
|
||||||
|
-- TODO no trade stored for that option yet?
|
||||||
|
error_msg = "So far so good!"
|
||||||
|
end
|
||||||
|
-- show error message (that leads back to this formspec)
|
||||||
|
if(error_msg) then
|
||||||
|
minetest.show_formspec(pname, "yl_speak_up:add_trade_simple",
|
||||||
|
"size[6,2]"..
|
||||||
|
"label[0.2,0.5;"..error_msg.."]"..
|
||||||
|
"button[2,1.5;1,0.9;back_from_error_msg;Back]")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- give the items back to the player (he took them from his inventory and had no
|
||||||
|
-- real chance to put them elsewhere - so there really ought to be room enough)
|
||||||
|
local player_inv = player:get_inventory()
|
||||||
|
if( player_inv:room_for_item("main", pay)) then
|
||||||
|
player_inv:add_item("main", pay)
|
||||||
|
trade_inv:set_stack("setup", 1, "")
|
||||||
|
end
|
||||||
|
if( player_inv:room_for_item("main", buy)) then
|
||||||
|
player_inv:add_item("main", buy)
|
||||||
|
trade_inv:set_stack("setup", 2, "")
|
||||||
|
end
|
||||||
|
|
||||||
|
-- TODO: or show the trade we just stored directly?
|
||||||
|
-- ..and go back to the edit options formspec
|
||||||
|
minetest.show_formspec(pname, "yl_speak_up:edit_option_dialog",
|
||||||
|
yl_speak_up.get_fs_edit_option_dialog(player, n_id, d_id, trade.o_id))
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
-- can this trade be made? called in allow_take
|
-- can this trade be made? called in allow_take
|
||||||
yl_speak_up.can_trade_simple = function(player, count)
|
yl_speak_up.can_trade_simple = function(player, count)
|
||||||
@ -140,8 +222,9 @@ yl_speak_up.get_fs_trade_simple = function(player, player_gives, npc_gives)
|
|||||||
-- the NPCs' inventory
|
-- the NPCs' inventory
|
||||||
local npc_inv = minetest.get_inventory({type="detached", name="yl_speak_up_npc_"..tostring(trade.n_id)})
|
local npc_inv = minetest.get_inventory({type="detached", name="yl_speak_up_npc_"..tostring(trade.n_id)})
|
||||||
|
|
||||||
-- show edit button for the owner
|
-- show edit button for the owner if in edit_mode
|
||||||
if(yl_speak_up.may_edit_npc(player, trade.n_id)) then
|
if(yl_speak_up.may_edit_npc(player, trade.n_id)
|
||||||
|
and (yl_speak_up.edit_mode[pname] == yl_speak_up.speak_to[pname].n_id)) then
|
||||||
formspec = formspec..
|
formspec = formspec..
|
||||||
"button[0.2,1.6;0.8,0.9;edit_trade_simple;Edit]"..
|
"button[0.2,1.6;0.8,0.9;edit_trade_simple;Edit]"..
|
||||||
"tooltip[edit_trade_simple;Edit this trade. You can do so only "..
|
"tooltip[edit_trade_simple;Edit this trade. You can do so only "..
|
||||||
@ -242,6 +325,23 @@ minetest.register_on_joinplayer(function(player, last_login)
|
|||||||
if(listname == "buy") then
|
if(listname == "buy") then
|
||||||
return 0
|
return 0
|
||||||
end
|
end
|
||||||
|
-- do not allow used items or items with metadata in the setup slots
|
||||||
|
-- (they can't really be traded later on anyway)
|
||||||
|
if(listname == "setup") then
|
||||||
|
if(stack:get_wear() > 0) then
|
||||||
|
minetest.chat_send_player(player:get_player_name(),
|
||||||
|
"Your NPC accepts only undammaged items. "..
|
||||||
|
"Trading dammaged items would be unfair.")
|
||||||
|
return 0
|
||||||
|
end
|
||||||
|
-- items with metadata cannot be traded
|
||||||
|
if(yl_speak_up.check_stack_has_meta(player, stack)) then
|
||||||
|
minetest.chat_send_player(player:get_player_name(),
|
||||||
|
"Your NPC cannot sell items that contain "..
|
||||||
|
"additional (meta-) data.")
|
||||||
|
return 0
|
||||||
|
end
|
||||||
|
end
|
||||||
return stack:get_count()
|
return stack:get_count()
|
||||||
end,
|
end,
|
||||||
allow_take = function(inv, listname, index, stack, player)
|
allow_take = function(inv, listname, index, stack, player)
|
||||||
|
Loading…
Reference in New Issue
Block a user