shop/init.lua

228 lines
6.6 KiB
Lua

local function get_register_formspec(pos)
local meta = minetest.get_meta(pos)
local spos = pos.x.. "," ..pos.y .. "," .. pos.z
local formspec =
"size[8,6]" ..
--default.gui_bg ..
--default.gui_bg_img ..
--default.gui_slots ..
"button[0,0;2,1;stock;SELLING]" ..
"button[3,0;2,1;register;BUYING]" ..
--"button_exit[7,0;1,1;exit;X]" ..
"button[7,0;1,1;ok;TRADE]" ..
"list[nodemeta:" .. spos .. ";sell;2,0;1,1;]" ..
"list[nodemeta:" .. spos .. ";buy;5,0;1,1;]" ..
"list[current_player;main;0,2;8,4;]"
return formspec
end
local formspec_register =
"size[8,9]" ..
--default.gui_bg ..
--default.gui_bg_img ..
--default.gui_slots ..
"label[0,0;Register]" ..
"list[current_name;register;0,0.75;8,4;]" ..
"list[current_player;main;0,5.25;8,4;]" ..
"listring[]"
local formspec_stock =
"size[8,9]" ..
--default.gui_bg ..
--default.gui_bg_img ..
--default.gui_slots ..
"label[0,0;Stock]" ..
"list[current_name;stock;0,0.75;8,4;]" ..
"list[current_player;main;0,5.25;8,4;]" ..
"listring[]"
minetest.register_privilege("shop_admin", "Shop administration and maintainence")
minetest.register_node("shop:shop", {
description = "Shop",
tiles = {
"shop_shop_topbottom.png",
"shop_shop_topbottom.png",
"shop_shop_side.png",
"shop_shop_side.png",
"shop_shop_side.png",
"shop_shop_front.png",
},
groups = {choppy = 3, oddly_breakable_by_hand = 1},
paramtype2 = "facedir",
after_place_node = function(pos, placer, itemstack, pointed_thing)
local meta = minetest.get_meta(pos)
local owner = placer:get_player_name()
meta:set_string("owner", owner)
meta:set_string("infotext", "Uncofigured Shop (Owned by " .. owner .. ")")
meta:set_string("formspec", get_register_formspec(pos))
if minetest.check_player_privs(owner, "privs") then
meta:set_int("admin_shop",1);
end
local inv = meta:get_inventory()
inv:set_size("buy", 1)
inv:set_size("sell", 1)
inv:set_size("stock", 8*4)
inv:set_size("register", 8*4)
end,
on_receive_fields = function(pos, formname, fields, sender)
local meta = minetest.get_meta(pos)
local owner = meta:get_string("owner")
local player = sender:get_player_name()
local inv = meta:get_inventory()
local s = inv:get_list("sell")
local b = inv:get_list("buy")
local stk = inv:get_list("stock")
local reg = inv:get_list("register")
local pinv = sender:get_inventory()
if fields.register then
if player ~= owner and (not minetest.check_player_privs(player, "shop_admin")) then
minetest.chat_send_player(player, "Only the shop owner can open the register.")
return
else
minetest.show_formspec(player, "shop:shop", formspec_register)
meta:set_string("infotext", "\nSELLING: " .. s[1]:to_string() .. "\nBUYING : " .. b[1]:to_string() .. "\n".. "owner " .. owner)
end
elseif fields.stock then
if player ~= owner and (not minetest.check_player_privs(player, "shop_admin")) then
minetest.chat_send_player(player, "Only the shop owner can open the stock.")
return
else
minetest.show_formspec(player, "shop:shop", formspec_stock)
meta:set_string("infotext", "\nSELLING: " .. s[1]:to_string() .. "\nBUYING : " .. b[1]:to_string() .. "\n".. "owner " .. owner)
end
elseif fields.ok then
if player==owner and not minetest.check_player_privs(player, "shop_admin") then
minetest.chat_send_player(player, "Can't trade with yourself")
return
end
local err = "";
if meta:get_int("admin_shop")~=1 then -- check shop
if inv:is_empty("sell") or
inv:is_empty("buy") or
(not inv:room_for_item("register", b[1])) then
minetest.chat_send_player(player, "Shop inventory is empty/full.")
return
end
if not inv:contains_item("stock", s[1]) then
err = "Error. Shop out of stock.";
meta:set_string("infotext", err);
end
if not inv:room_for_item("register", b[1]) then
err = "Error. Shop register full.";
meta:set_string("infotext", err);
end
end
if not pinv:room_for_item("main", s[1]) then
err = "Error. You dont have space in your inventory.";
end
if not pinv:contains_item("main", b[1]) then
err = "Error. You dont have enough items to pay.";
end
if err~="" then
minetest.chat_send_player(player,err);
return
end
pinv:remove_item("main", b[1])
inv:add_item("register", b[1])
inv:remove_item("stock", s[1])
pinv:add_item("main", s[1])
minetest.chat_send_player(player, "Sold " .. s[1]:to_string() .. " for " .. b[1]:to_string())
end
end,
allow_metadata_inventory_put = function(pos, listname, index, stack, player)
local meta = minetest.get_meta(pos)
local owner = meta:get_string("owner")
local inv = meta:get_inventory()
local s = inv:get_list("sell")
local n = stack:get_name()
local playername = player:get_player_name()
if playername ~= owner and
(not minetest.check_player_privs(playername, "shop_admin")) then
return 0
else
return stack:get_count()
end
end,
allow_metadata_inventory_take = function(pos, listname, index, stack, player)
local meta = minetest.get_meta(pos)
local owner = meta:get_string("owner")
local playername = player:get_player_name()
if playername ~= owner and
(not minetest.check_player_privs(playername, "shop_admin"))then
return 0
else
return stack:get_count()
end
end,
allow_metadata_inventory_move = function(pos, _, _, _, _, count, player)
local meta = minetest.get_meta(pos)
local owner = meta:get_string("owner")
local playername = player:get_player_name()
if playername ~= owner and
(not minetest.check_player_privs(playername, "shop_admin")) then
return 0
else
return count
end
end,
can_dig = function(pos, player)
local meta = minetest.get_meta(pos)
local owner = meta:get_string("owner")
local inv = meta:get_inventory()
return player:get_player_name() == owner and
inv:is_empty("register") and
inv:is_empty("stock") and
inv:is_empty("buy") and
inv:is_empty("sell")
end,
})
-- minetest.register_craftitem("shop:coin", {
-- description = "Gold Coin",
-- inventory_image = "shop_coin.png",
-- })
-- minetest.register_craft({
-- output = "shop:coin 9",
-- recipe = {
-- {"default:gold_ingot"},
-- }
-- })
minetest.register_craft({
output = "default:gold_ingot",
recipe = {
{"shop:coin", "shop:coin", "shop:coin"},
{"shop:coin", "shop:coin", "shop:coin"},
{"shop:coin", "shop:coin", "shop:coin"}
}
})
minetest.register_craft({
output = "shop:shop",
recipe = {
{"group:wood", "group:wood", "group:wood"},
{"group:wood", "default:goldblock", "group:wood"},
{"group:wood", "group:wood", "group:wood"}
}
})