mirror of
https://github.com/sys4-fr/server-nalc.git
synced 2024-11-05 10:00:26 +01:00
70b5263459
- Solves #140
219 lines
10 KiB
Lua
Executable File
219 lines
10 KiB
Lua
Executable File
--[[
|
|
Mod by Kotolegokot and Xiong (2012-2013)
|
|
Rev. kilbith and nerzhul (2015)
|
|
]]
|
|
|
|
money = {}
|
|
|
|
dofile(minetest.get_modpath("money") .. "/settings.txt") -- Loading settings.
|
|
|
|
local function has_shop_privilege(meta, player)--Does player have permissions for this shop?
|
|
return player:get_player_name() == meta:get_string("owner") or minetest.get_player_privs(player:get_player_name())["money_admin"]
|
|
end
|
|
|
|
minetest.register_craft({
|
|
output = "money:shop",
|
|
recipe = {
|
|
{"default:wood", "default:wood", "default:wood"},
|
|
{"default:wood", "default:mese", "default:wood"},
|
|
{"default:wood", "default:wood", "default:wood"},
|
|
},
|
|
})
|
|
|
|
minetest.register_alias("shop", "money:shop")
|
|
|
|
minetest.register_privilege("money_admin", {
|
|
description = "Has access to admin shops",
|
|
give_to_singleplayer = false
|
|
})
|
|
|
|
--Barter shop.
|
|
minetest.register_node("money:barter_shop", {
|
|
description = "Barter Shop",
|
|
tiles = {"money_barter_shop.png"},
|
|
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
|
|
sounds = default.node_sound_wood_defaults(),
|
|
paramtype2 = "facedir",
|
|
after_place_node = function(pos, placer)
|
|
local meta = minetest.get_meta(pos)
|
|
meta:set_string("owner", placer:get_player_name())
|
|
meta:set_string("infotext", "Untuned Barter Shop (owned by " .. placer:get_player_name() .. ")")
|
|
end,
|
|
on_construct = function(pos)
|
|
local meta = minetest.get_meta(pos)
|
|
meta:set_string("formspec", "size[8,5.6]"..
|
|
"field[0.256,0.5;8,1;bartershopname;Name of your barter shop:;]"..
|
|
"field[0.256,1.5;8,1;nodename1;What kind of a node do you want to exchange:;]"..
|
|
"field[0.256,2.5;8,1;nodename2;for:;]"..
|
|
"field[0.256,3.5;8,1;amount1;Amount of first kind of node:;]"..
|
|
"field[0.256,4.5;8,1;amount2;Amount of second kind of node:;]"..
|
|
"button_exit[3.1,5;2,1;button;Proceed]")
|
|
meta:set_string("infotext", "Untuned Barter Shop")
|
|
meta:set_string("owner", "")
|
|
meta:set_string("form", "yes")
|
|
end,
|
|
can_dig = function(pos,player)
|
|
local meta = minetest.get_meta(pos);
|
|
local inv = meta:get_inventory()
|
|
return inv:is_empty("main") and (meta:get_string("owner") == player:get_player_name() or minetest.get_player_privs(player:get_player_name())["money_admin"])
|
|
end,
|
|
allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
|
|
local meta = minetest.get_meta(pos)
|
|
if not has_shop_privilege(meta, player) then
|
|
minetest.log("action", player:get_player_name()..
|
|
" tried to access a barter shop belonging to "..
|
|
meta:get_string("owner").." at "..
|
|
minetest.pos_to_string(pos))
|
|
return 0
|
|
end
|
|
return count
|
|
end,
|
|
allow_metadata_inventory_put = function(pos, listname, index, stack, player)
|
|
local meta = minetest.get_meta(pos)
|
|
if not has_shop_privilege(meta, player) then
|
|
minetest.log("action", player:get_player_name()..
|
|
" tried to access a barter shop belonging to "..
|
|
meta:get_string("owner").." at "..
|
|
minetest.pos_to_string(pos))
|
|
return 0
|
|
end
|
|
return stack:get_count()
|
|
end,
|
|
allow_metadata_inventory_take = function(pos, listname, index, stack, player)
|
|
local meta = minetest.get_meta(pos)
|
|
if not has_shop_privilege(meta, player) then
|
|
minetest.log("action", player:get_player_name()..
|
|
" tried to access a barter shop belonging to "..
|
|
meta:get_string("owner").." at "..
|
|
minetest.pos_to_string(pos))
|
|
return 0
|
|
end
|
|
return stack:get_count()
|
|
end,
|
|
on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
|
|
minetest.log("action", player:get_player_name()..
|
|
" moves stuff in barter shop at "..minetest.pos_to_string(pos))
|
|
end,
|
|
on_metadata_inventory_put = function(pos, listname, index, stack, player)
|
|
minetest.log("action", player:get_player_name()..
|
|
" moves stuff to barter shop at "..minetest.pos_to_string(pos))
|
|
end,
|
|
on_metadata_inventory_take = function(pos, listname, index, count, player)
|
|
minetest.log("action", player:get_player_name()..
|
|
" takes stuff from barter shop at "..minetest.pos_to_string(pos))
|
|
end,
|
|
on_receive_fields = function(pos, formname, fields, sender)
|
|
local meta = minetest.get_meta(pos)
|
|
if meta:get_string("form") == "yes" then
|
|
if fields.bartershopname ~= "" and minetest.registered_items[fields.nodename1] and minetest.registered_items[fields.nodename2] and tonumber(fields.amount1) and tonumber(fields.amount1) >= 1 and tonumber(fields.amount2) and tonumber(fields.amount2) >= 1 and (meta:get_string("owner") == sender:get_player_name() or minetest.get_player_privs(sender:get_player_name())["money_admin"]) then
|
|
meta:set_string("formspec", "size[8,10;]"..
|
|
"list[context;main;0,0;8,4;]"..
|
|
"label[0.256,4.5;"..fields.amount2.." "..fields.nodename2.." --> "..fields.amount1.." "..fields.nodename1.."]"..
|
|
"button[3.1,5;2,1;button;Exchange]"..
|
|
"list[current_player;main;0,6;8,4;]")
|
|
meta:set_string("bartershopname", fields.bartershopname)
|
|
meta:set_string("nodename1", fields.nodename1)
|
|
meta:set_string("nodename2", fields.nodename2)
|
|
meta:set_string("amount1", fields.amount1)
|
|
meta:set_string("amount2", fields.amount2)
|
|
meta:set_string("infotext", "Barter Shop \"" .. fields.bartershopname .. "\" (owned by " .. meta:get_string("owner") .. ")")
|
|
local inv = meta:get_inventory()
|
|
inv:set_size("main", 8*4)
|
|
meta:set_string("form", "no")
|
|
end
|
|
elseif fields["button"] then
|
|
local sender_name = sender:get_player_name()
|
|
local inv = meta:get_inventory()
|
|
local sender_inv = sender:get_inventory()
|
|
if not inv:contains_item("main", meta:get_string("nodename1") .. " " .. meta:get_string("amount1")) then
|
|
minetest.chat_send_player(sender_name, "In the barter shop is not enough goods.")
|
|
return
|
|
elseif not sender_inv:contains_item("main", meta:get_string("nodename2") .. " " .. meta:get_string("amount2")) then
|
|
minetest.chat_send_player(sender_name, "In your inventory is not enough goods.")
|
|
return
|
|
elseif not inv:room_for_item("main", meta:get_string("nodename2") .. " " .. meta:get_string("amount2")) then
|
|
minetest.chat_send_player(sender_name, "In the barter shop is not enough space.")
|
|
return
|
|
elseif not sender_inv:room_for_item("main", meta:get_string("nodename1") .. " " .. meta:get_string("amount1")) then
|
|
minetest.chat_send_player(sender_name, "In your inventory is not enough space.")
|
|
return
|
|
end
|
|
inv:remove_item("main", meta:get_string("nodename1") .. " " .. meta:get_string("amount1"))
|
|
sender_inv:remove_item("main", meta:get_string("nodename2") .. " " .. meta:get_string("amount2"))
|
|
inv:add_item("main", meta:get_string("nodename2") .. " " .. meta:get_string("amount2"))
|
|
sender_inv:add_item("main", meta:get_string("nodename1") .. " " .. meta:get_string("amount1"))
|
|
minetest.chat_send_player(sender_name, "You exchanged " .. meta:get_string("amount2") .. " " .. meta:get_string("nodename2") .. " on " .. meta:get_string("amount1") .. " " .. meta:get_string("nodename1") .. ".")
|
|
end
|
|
end,
|
|
})
|
|
--End.
|
|
|
|
minetest.register_craft({--Barter shop recipe.
|
|
output = "money:barter_shop",
|
|
recipe = {
|
|
{"locked_sign:sign_wall_locked"},
|
|
{"default:chest_locked"},
|
|
},
|
|
})
|
|
|
|
minetest.register_alias("barter_shop", "money:barter_shop")
|
|
|
|
|
|
-- Admin barter shop
|
|
minetest.register_node("money:admin_barter_shop", {
|
|
description = "Admin Barter Shop",
|
|
tiles = {"money_admin_barter_shop.png"},
|
|
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
|
|
sounds = default.node_sound_wood_defaults(),
|
|
paramtype2 = "facedir",
|
|
on_construct = function(pos)
|
|
local meta = minetest.get_meta(pos)
|
|
meta:set_string("formspec", "size[8,4.6]"..
|
|
"field[0.256,0.5;8,1;nodename1;What kind of a node do you want to exchange:;]"..
|
|
"field[0.256,1.5;8,1;nodename2;for:;]"..
|
|
"field[0.256,2.5;8,1;amount1;Amount of first kind of node:;]"..
|
|
"field[0.256,3.5;8,1;amount2;Amount of second kind of node:;]"..
|
|
"button_exit[3.1,4;2,1;button;Proceed]")
|
|
meta:set_string("infotext", "Untuned Admin Barter Shop")
|
|
meta:set_string("form", "yes")
|
|
end,
|
|
can_dig = function(pos,player)
|
|
return minetest.get_player_privs(player:get_player_name())["money_admin"]
|
|
end,
|
|
on_receive_fields = function(pos, formname, fields, sender)
|
|
local meta = minetest.get_meta(pos)
|
|
if meta:get_string("form") == "yes" then
|
|
if minetest.registered_items[fields.nodename1] and minetest.registered_items[fields.nodename2] and tonumber(fields.amount1) and tonumber(fields.amount1) >= 1 and tonumber(fields.amount2) and tonumber(fields.amount2) >= 1 and (meta:get_string("owner") == sender:get_player_name() or minetest.get_player_privs(sender:get_player_name()).money_admin) then
|
|
meta:set_string("formspec", "size[8,6;]"..
|
|
"label[0.256,0.0;"..fields.amount2.." "..fields.nodename2.." --> "..fields.amount1.." "..fields.nodename1.."]"..
|
|
"button[3.1,0.5;2,1;button;Exchange]"..
|
|
"list[current_player;main;0,1.5;8,4;]")
|
|
meta:set_string("nodename1", fields.nodename1)
|
|
meta:set_string("nodename2", fields.nodename2)
|
|
meta:set_string("amount1", fields.amount1)
|
|
meta:set_string("amount2", fields.amount2)
|
|
meta:set_string("infotext", "Admin Barter Shop")
|
|
meta:set_string("form", "no")
|
|
end
|
|
elseif fields["button"] then
|
|
local sender_name = sender:get_player_name()
|
|
local sender_inv = sender:get_inventory()
|
|
if not sender_inv:contains_item("main", meta:get_string("nodename2") .. " " .. meta:get_string("amount2")) then
|
|
minetest.chat_send_player(sender_name, "In your inventory is not enough goods.")
|
|
return
|
|
elseif not sender_inv:room_for_item("main", meta:get_string("nodename1") .. " " .. meta:get_string("amount1")) then
|
|
minetest.chat_send_player(sender_name, "In your inventory is not enough space.")
|
|
return
|
|
end
|
|
sender_inv:remove_item("main", meta:get_string("nodename2") .. " " .. meta:get_string("amount2"))
|
|
sender_inv:add_item("main", meta:get_string("nodename1") .. " " .. meta:get_string("amount1"))
|
|
minetest.chat_send_player(sender_name, "You exchanged " .. meta:get_string("amount2") .. " " .. meta:get_string("nodename2") .. " on " .. meta:get_string("amount1") .. " " .. meta:get_string("nodename1") .. ".")
|
|
end
|
|
end,
|
|
})
|
|
--End.
|
|
|
|
minetest.register_alias("admin_barter_shop", "money:admin_barter_shop")
|
|
|
|
minetest.log("action", "[Money] Loaded")
|