From 5e5580db1e018c05becb95591e8db704e6d9ac22 Mon Sep 17 00:00:00 2001
From: Vanessa Ezekowitz <vanessaezekowitz@gmail.com>
Date: Fri, 4 Jul 2014 05:28:19 -0400
Subject: initial commit

---
 Money_Info.txt               |  33 ++++++++
 README.md                    |   4 +
 barter.lua                   | 165 ++++++++++++++++++++++++++++++++++++
 crafting.lua                 |  71 ++++++++++++++++
 craftitems.lua               |  26 ++++++
 depends.txt                  |   1 +
 income.lua                   |  40 +++++++++
 init.lua                     |  13 +++
 safe.lua                     | 103 +++++++++++++++++++++++
 shop.lua                     | 196 +++++++++++++++++++++++++++++++++++++++++++
 textures/barter_base.png     | Bin 0 -> 734 bytes
 textures/barter_side.png     | Bin 0 -> 1400 bytes
 textures/barter_top.png      | Bin 0 -> 896 bytes
 textures/minegeld.png        | Bin 0 -> 3563 bytes
 textures/minegeld_10.png     | Bin 0 -> 3509 bytes
 textures/minegeld_5.png      | Bin 0 -> 3365 bytes
 textures/minegeld_bundle.png | Bin 0 -> 5092 bytes
 textures/safe_front.png      | Bin 0 -> 309 bytes
 textures/safe_side.png       | Bin 0 -> 150 bytes
 textures/shop_front.png      | Bin 0 -> 822 bytes
 textures/shop_side.png       | Bin 0 -> 755 bytes
 textures/shop_top.png        | Bin 0 -> 734 bytes
 22 files changed, 652 insertions(+)
 create mode 100644 Money_Info.txt
 create mode 100644 README.md
 create mode 100644 barter.lua
 create mode 100644 crafting.lua
 create mode 100644 craftitems.lua
 create mode 100644 depends.txt
 create mode 100644 income.lua
 create mode 100644 init.lua
 create mode 100644 safe.lua
 create mode 100644 shop.lua
 create mode 100644 textures/barter_base.png
 create mode 100644 textures/barter_side.png
 create mode 100644 textures/barter_top.png
 create mode 100644 textures/minegeld.png
 create mode 100644 textures/minegeld_10.png
 create mode 100644 textures/minegeld_5.png
 create mode 100644 textures/minegeld_bundle.png
 create mode 100644 textures/safe_front.png
 create mode 100644 textures/safe_side.png
 create mode 100644 textures/shop_front.png
 create mode 100644 textures/shop_side.png
 create mode 100644 textures/shop_top.png

diff --git a/Money_Info.txt b/Money_Info.txt
new file mode 100644
index 0000000..722d2b9
--- /dev/null
+++ b/Money_Info.txt
@@ -0,0 +1,33 @@
+Mine-Geld
+---------
+
+They have no recipe.
+A good starting amount is about 250Mg on a server
+
+You currently get a basic income of 1 Minegeld per day, 
+so long as you dig at least one node in that day 
+and have an empty inventory slot for the money to go in.
+
+Lump Conversion
+
+Coal Lump ~1Mg
+Iron Lump ~4Mg
+Copper Lump ~4Mg
+Gold Lump ~5Mg
+Mese Crystal ~40Mg
+Diamond ~50Mg
+
+Ingot Conversion
+
+Steel Ingot ~5Mg
+Copper Ingot ~5Mg
+Gold Ingot ~6Mg
+
+Block Conversion
+
+Coal Block ~9Mg
+Steel Block ~45Mg
+Copper Block ~45Mg
+Gold Block ~54Mg
+Mese Block ~360Mg
+Diamond Block ~450Mg
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..f4471a7
--- /dev/null
+++ b/README.md
@@ -0,0 +1,4 @@
+currency
+========
+
+Repo for Currency Mod
diff --git a/barter.lua b/barter.lua
new file mode 100644
index 0000000..81b571e
--- /dev/null
+++ b/barter.lua
@@ -0,0 +1,165 @@
+barter = {}
+
+barter.chest = {}
+barter.chest.formspec = {
+	main = "size[8,9]"..
+		"list[current_name;pl1;0,0;3,4;]"..
+		"list[current_name;pl2;5,0;3,4;]"..
+		"list[current_player;main;0,5;8,4;]",
+	pl1 = {
+		start = "button[3,1;1,1;pl1_start;Start]",
+		player = function(name) return "label[3,0;"..name.."]" end,
+		accept1 = "button[3,1;1,1;pl1_accept1;Confirm]"..
+				"button[3,2;1,1;pl1_cancel;Cancel]",
+		accept2 = "button[3,1;1,1;pl1_accept2;Exchange]"..
+				"button[3,2;1,1;pl1_cancel;Cancel]",
+	},
+	pl2 = {
+		start = "button[4,1;1,1;pl2_start;Start]",
+		player = function(name) return "label[4,0;"..name.."]" end,
+		accept1 = "button[4,1;1,1;pl2_accept1;Confirm]"..
+				"button[4,2;1,1;pl2_cancel;Cancel]",
+		accept2 = "button[4,1;1,1;pl2_accept2;Exchange]"..
+				"button[4,2;1,1;pl2_cancel;Cancel]",
+	},
+}
+
+barter.chest.check_privilege = function(listname,playername,meta)
+	if listname == "pl1" then
+		if playername ~= meta:get_string("pl1") then
+			return false
+		elseif meta:get_int("pl1step") ~= 1 then
+			return false
+		end
+	end
+	if listname == "pl2" then
+		if playername ~= meta:get_string("pl2") then
+			return false
+		elseif meta:get_int("pl2step") ~= 1 then
+			return false
+		end
+	end
+	return true
+end
+
+barter.chest.update_formspec = function(meta)
+	formspec = barter.chest.formspec.main
+	pl_formspec = function (n)
+		if meta:get_int(n.."step")==0 then
+			formspec = formspec .. barter.chest.formspec[n].start
+		else
+			formspec = formspec .. barter.chest.formspec[n].player(meta:get_string(n))
+			if meta:get_int(n.."step") == 1 then
+				formspec = formspec .. barter.chest.formspec[n].accept1
+			elseif meta:get_int(n.."step") == 2 then
+				formspec = formspec .. barter.chest.formspec[n].accept2
+			end
+		end
+	end
+	pl_formspec("pl1") pl_formspec("pl2")
+	meta:set_string("formspec",formspec)
+end
+
+barter.chest.give_inventory = function(inv,list,playername)
+	player = minetest.env:get_player_by_name(playername)
+	if player then
+		for k,v in ipairs(inv:get_list(list)) do
+			player:get_inventory():add_item("main",v)
+			inv:remove_item(list,v)
+		end
+	end
+end
+
+barter.chest.cancel = function(meta)
+	barter.chest.give_inventory(meta:get_inventory(),"pl1",meta:get_string("pl1"))
+	barter.chest.give_inventory(meta:get_inventory(),"pl2",meta:get_string("pl2"))
+	meta:set_string("pl1","")
+	meta:set_string("pl2","")
+	meta:set_int("pl1step",0)
+	meta:set_int("pl2step",0)
+end
+
+barter.chest.exchange = function(meta)
+	barter.chest.give_inventory(meta:get_inventory(),"pl1",meta:get_string("pl2"))
+	barter.chest.give_inventory(meta:get_inventory(),"pl2",meta:get_string("pl1"))
+	meta:set_string("pl1","")
+	meta:set_string("pl2","")
+	meta:set_int("pl1step",0)
+	meta:set_int("pl2step",0)
+end
+
+minetest.register_node("currency:barter", {
+        drawtype = "nodebox",
+	description = "Barter Table",
+	paramtype = "light",
+	paramtype2 = "facedir",
+	tiles = {"barter_top.png",
+	                "barter_base.png",
+	                "barter_side.png"},
+	inventory_image = "barter_top.png",
+	node_box = {
+		type = "fixed",
+		fixed = {
+			{-0.500000,0.312500,-0.500000,0.500000,0.500000,0.500000},
+			{-0.437500,-0.500000,-0.437500,-0.250000,0.500000,-0.250000}, 
+			{-0.437500,-0.500000,0.250000,-0.250000,0.500000,0.437500},
+			{0.250000,-0.500000,-0.437500,0.437500,0.500000,-0.250000},
+			{0.250000,-0.500000,0.250000,0.437500,0.500000,0.447500}, 
+		},
+	},
+	groups = {choppy=2,oddly_breakable_by_hand=2},
+	sounds = default.node_sound_wood_defaults(),
+	on_construct = function(pos)
+		local meta = minetest.env:get_meta(pos)
+		meta:set_string("infotext", "Barter Table")
+		meta:set_string("pl1","")
+		meta:set_string("pl2","")
+		barter.chest.update_formspec(meta)
+		local inv = meta:get_inventory()
+		inv:set_size("pl1", 3*4)
+		inv:set_size("pl2", 3*4)
+	end,
+	on_receive_fields = function(pos, formname, fields, sender)
+		local meta = minetest.env:get_meta(pos)
+		pl_receive_fields = function(n)
+			if fields[n.."_start"] and meta:get_string(n) == "" then
+				meta:set_string(n,sender:get_player_name())
+			end
+			if meta:get_string(n) == "" then
+				meta:set_int(n.."step",0)
+			elseif meta:get_int(n.."step")==0 then
+				meta:set_int(n.."step",1)
+			end
+			if sender:get_player_name() == meta:get_string(n) then
+				if meta:get_int(n.."step")==1 and fields[n.."_accept1"] then
+					meta:set_int(n.."step",2)
+				end
+				if meta:get_int(n.."step")==2 and fields[n.."_accept2"] then
+					meta:set_int(n.."step",3)
+					if n == "pl1" and meta:get_int("pl2step") == 3 then barter.chest.exchange(meta) end
+					if n == "pl2" and meta:get_int("pl1step") == 3 then barter.chest.exchange(meta) end
+				end
+				if fields[n.."_cancel"] then barter.chest.cancel(meta) end
+			end
+		end
+		pl_receive_fields("pl1") pl_receive_fields("pl2")
+		-- End
+		barter.chest.update_formspec(meta)
+	end,
+	allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
+		local meta = minetest.env:get_meta(pos)
+		if not barter.chest.check_privilege(from_list,player:get_player_name(),meta) then return 0 end
+		if not barter.chest.check_privilege(to_list,player:get_player_name(),meta) then return 0 end
+		return count
+	end,
+	allow_metadata_inventory_put = function(pos, listname, index, stack, player)
+		local meta = minetest.env:get_meta(pos)
+		if not barter.chest.check_privilege(listname,player:get_player_name(),meta) then return 0 end
+		return stack:get_count()
+	end,
+	allow_metadata_inventory_take = function(pos, listname, index, stack, player)
+		local meta = minetest.env:get_meta(pos)
+		if not barter.chest.check_privilege(listname,player:get_player_name(),meta) then return 0 end
+		return stack:get_count()
+	end,
+})
diff --git a/crafting.lua b/crafting.lua
new file mode 100644
index 0000000..33a9553
--- /dev/null
+++ b/crafting.lua
@@ -0,0 +1,71 @@
+minetest.register_craft({
+	output = 'currency:safe',
+	recipe = {
+		{'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'},
+		{'default:steel_ingot', '', 'default:steel_ingot'},
+		{'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'},
+	}
+})
+
+minetest.register_craft({
+	output = 'currency:shop',
+	recipe = {
+		{'default:sign_wall'},
+		{'default:chest_locked'},
+	}
+})
+
+minetest.register_craft({
+	output = 'currency:barter',
+	recipe = {
+		{'default:sign_wall'},
+		{'default:chest'},
+	}
+})
+
+minetest.register_craft({
+	type = "shapeless",
+	output = "currency:minegeld_5",
+	recipe = {"currency:minegeld", "currency:minegeld", "currency:minegeld", "currency:minegeld", "currency:minegeld"},
+})
+
+minetest.register_craft({
+	type = "shapeless",
+	output = "currency:minegeld_10",
+	recipe = {"currency:minegeld_5", "currency:minegeld_5"},
+})
+
+minetest.register_craft({
+	type = "shapeless",
+	output = "currency:minegeld_5 2",
+	recipe = {"currency:minegeld_10"},
+})
+
+minetest.register_craft({
+	type = "shapeless",
+	output = "currency:minegeld 5",
+	recipe = {"currency:minegeld_5"},
+})
+
+minetest.register_craft({
+	type = "shapeless",
+	output = "currency:minegeld_bundle",
+	recipe = {
+		"group:minegeld",
+		"group:minegeld",
+		"group:minegeld",
+		"group:minegeld",
+		"group:minegeld",
+		"group:minegeld",
+		"group:minegeld",
+		"group:minegeld",
+		"group:minegeld"
+	},
+})
+
+minetest.register_craft({
+	type = "fuel",
+	recipe = "currency:minegeld_bundle",
+	burntime = 1,
+})
+
diff --git a/craftitems.lua b/craftitems.lua
new file mode 100644
index 0000000..47ad953
--- /dev/null
+++ b/craftitems.lua
@@ -0,0 +1,26 @@
+minetest.register_craftitem("currency:minegeld", {
+    description = "1 MineGeld Note",
+    inventory_image = "minegeld.png",
+        stack_max = 30000,
+		groups = {minegeld = 1}
+})
+
+minetest.register_craftitem("currency:minegeld_5", {
+    description = "5 MineGeld Note",
+    inventory_image = "minegeld_5.png",
+        stack_max = 30000,
+		groups = {minegeld = 1}
+})
+
+minetest.register_craftitem("currency:minegeld_10", {
+    description = "10 MineGeld Note",
+    inventory_image = "minegeld_10.png",
+        stack_max = 30000,
+		groups = {minegeld = 1}
+})
+
+minetest.register_craftitem("currency:minegeld_bundle", {
+    description = "Bundle of random Minegeld notes",
+    inventory_image = "minegeld_bundle.png",
+        stack_max = 30000,
+})
diff --git a/depends.txt b/depends.txt
new file mode 100644
index 0000000..331d858
--- /dev/null
+++ b/depends.txt
@@ -0,0 +1 @@
+default
\ No newline at end of file
diff --git a/income.lua b/income.lua
new file mode 100644
index 0000000..5aa6fbc
--- /dev/null
+++ b/income.lua
@@ -0,0 +1,40 @@
+players_income = {}
+
+local timer = 0
+minetest.register_globalstep(function(dtime)
+    timer = timer + dtime;
+    if timer >= 720 then --720 for one day
+        timer = 0
+        for _,player in ipairs(minetest.get_connected_players()) do
+                local name = player:get_player_name()
+                if players_income[name] == nil then
+                    players_income[name] = 0
+                end
+                players_income[name] = 1
+                print("[Currency] basic income for "..name.."")
+        end
+    end
+end)
+
+earn_income = function(player)
+    if not player or player.is_fake_player then return end
+    local name = player:get_player_name()
+    if players_income[name] == nil then
+        players_income[name] = 0
+    end
+    if players_income[name] > 0 then
+        count = players_income[name]
+        local inv = player:get_inventory()
+        inv:add_item("main", {name="currency:minegeld_5", count=count})
+        players_income[name] = 0
+        print("[Currency] added basic income for "..name.." to inventory")
+    end
+end
+
+minetest.register_on_dignode(function(pos, oldnode, digger)
+	earn_income(digger)
+end)
+
+minetest.register_on_placenode(function(pos, node, placer)
+	earn_income(placer)
+end)
diff --git a/init.lua b/init.lua
new file mode 100644
index 0000000..c7caffe
--- /dev/null
+++ b/init.lua
@@ -0,0 +1,13 @@
+print(" Currency mod loading... ")
+dofile(minetest.get_modpath("currency").."/craftitems.lua")
+print("[Currency] Craft_items Loaded!")
+dofile(minetest.get_modpath("currency").."/shop.lua")
+print("[Currency] Shop Loaded!")
+dofile(minetest.get_modpath("currency").."/barter.lua")
+print("[Currency]  Barter Loaded!")
+dofile(minetest.get_modpath("currency").."/safe.lua")
+print("[Currency] Safe Loaded!")
+dofile(minetest.get_modpath("currency").."/crafting.lua")
+print("[Currency] Crafting Loaded!")
+dofile(minetest.get_modpath("currency").."/income.lua")
+print("[Currency] Income Loaded!")
diff --git a/safe.lua b/safe.lua
new file mode 100644
index 0000000..197bd5e
--- /dev/null
+++ b/safe.lua
@@ -0,0 +1,103 @@
+function default.get_safe_formspec(pos)
+	local spos = pos.x .. "," .. pos.y .. "," ..pos.z
+	local formspec =
+		"size[8,9]"..
+		"list[nodemeta:".. spos .. ";main;1,1;6,2;]"..
+		"list[current_player;main;0,5;8,4;]"
+	return formspec
+end
+
+local function has_safe_privilege(meta, player)
+	if player:get_player_name() ~= meta:get_string("owner") then
+		return false
+	end
+	return true
+end
+
+minetest.register_node("currency:safe", {
+        description = "Safe",
+	inventory_image = "safe_front.png",
+	paramtype = "light",
+	paramtype2 = "facedir",
+	tiles = {"safe_side.png",
+	                "safe_side.png",
+			"safe_side.png",
+			"safe_side.png",
+			"safe_side.png",
+			"safe_front.png",},
+	is_ground_content = false,
+	groups = {cracky=1},
+	after_place_node = function(pos, placer)
+		local meta = minetest.get_meta(pos)
+		meta:set_string("owner", placer:get_player_name() or "")
+		meta:set_string("infotext", "Safe (owned by "..
+				meta:get_string("owner")..")")
+	end,
+	on_construct = function(pos)
+		local meta = minetest.get_meta(pos)
+		meta:set_string("infotext", "Safe")
+		meta:set_string("owner", "")
+		local inv = meta:get_inventory()
+		inv:set_size("main", 6*2)
+	end,
+	can_dig = function(pos,player)
+		local meta = minetest.get_meta(pos);
+		local inv = meta:get_inventory()
+		return inv:is_empty("main") and has_safe_privilege(meta, player)
+	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_safe_privilege(meta, player) then
+			minetest.log("action", player:get_player_name()..
+					" tried to access a safe 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_safe_privilege(meta, player) then
+			minetest.log("action", player:get_player_name()..
+					" tried to access a safe 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_safe_privilege(meta, player) then
+			minetest.log("action", player:get_player_name()..
+					" tried to access a safe 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 safe 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 safe at "..minetest.pos_to_string(pos))
+	end,
+    on_metadata_inventory_take = function(pos, listname, index, stack, player)
+		minetest.log("action", player:get_player_name()..
+				" takes stuff from safe at "..minetest.pos_to_string(pos))
+	end,
+	on_rightclick = function(pos, node, clicker)
+		local meta = minetest.get_meta(pos)
+		if has_safe_privilege(meta, clicker) then
+			minetest.show_formspec(
+				clicker:get_player_name(),
+				"currency:safe",
+				default.get_safe_formspec(pos)
+			)
+		end
+	end,
+})
diff --git a/shop.lua b/shop.lua
new file mode 100644
index 0000000..da5ee5e
--- /dev/null
+++ b/shop.lua
@@ -0,0 +1,196 @@
+default.shop = {}
+default.shop.current_shop = {}
+default.shop.formspec = {
+	customer = function(pos)
+		local list_name = "nodemeta:"..pos.x..','..pos.y..','..pos.z
+		local formspec = "size[8,9.5]"..
+		"label[0,0;Customer gives (pay here !)]"..
+		"list[current_player;customer_gives;0,0.5;3,2;]"..
+		"label[0,2.5;Customer gets]"..
+		"list[current_player;customer_gets;0,3;3,2;]"..
+		"label[5,0;Owner wants]"..
+		"list["..list_name..";owner_wants;5,0.5;3,2;]"..
+		"label[5,2.5;Owner gives]"..
+		"list["..list_name..";owner_gives;5,3;3,2;]"..
+		"list[current_player;main;0,5.5;8,4;]"..
+		"button[3,2;2,1;exchange;Exchange]"
+		return formspec
+	end,
+	owner = function(pos)
+		local list_name = "nodemeta:"..pos.x..','..pos.y..','..pos.z
+		local formspec = "size[8,9.5]"..
+		"label[0,0;Customers gave:]"..
+		"list["..list_name..";customers_gave;0,0.5;3,2;]"..
+		"label[0,2.5;Your stock:]"..
+		"list["..list_name..";stock;0,3;3,2;]"..
+		"label[5,0;You want:]"..
+		"list["..list_name..";owner_wants;5,0.5;3,2;]"..
+		"label[5,2.5;In exchange, you give:]"..
+		"list["..list_name..";owner_gives;5,3;3,2;]"..
+		"label[0,5;Owner, Use(E)+Place(RMB) for customer interface]"..
+		"list[current_player;main;0,5.5;8,4;]"
+		return formspec
+	end,
+}
+
+default.shop.check_privilege = function(listname,playername,meta)
+	--[[if listname == "pl1" then
+		if playername ~= meta:get_string("pl1") then
+			return false
+		elseif meta:get_int("pl1step") ~= 1 then
+			return false
+		end
+	end
+	if listname == "pl2" then
+		if playername ~= meta:get_string("pl2") then
+			return false
+		elseif meta:get_int("pl2step") ~= 1 then
+			return false
+		end
+	end]]
+	return true
+end
+
+
+default.shop.give_inventory = function(inv,list,playername)
+	player = minetest.env:get_player_by_name(playername)
+	if player then
+		for k,v in ipairs(inv:get_list(list)) do
+			player:get_inventory():add_item("main",v)
+			inv:remove_item(list,v)
+		end
+	end
+end
+
+default.shop.cancel = function(meta)
+	--[[default.shop.give_inventory(meta:get_inventory(),"pl1",meta:get_string("pl1"))
+	default.shop.give_inventory(meta:get_inventory(),"pl2",meta:get_string("pl2"))
+	meta:set_string("pl1","")
+	meta:set_string("pl2","")
+	meta:set_int("pl1step",0)
+	meta:set_int("pl2step",0)]]
+end
+
+default.shop.exchange = function(meta)
+	--[[default.shop.give_inventory(meta:get_inventory(),"pl1",meta:get_string("pl2"))
+	default.shop.give_inventory(meta:get_inventory(),"pl2",meta:get_string("pl1"))
+	meta:set_string("pl1","")
+	meta:set_string("pl2","")
+	meta:set_int("pl1step",0)
+	meta:set_int("pl2step",0)]]
+end
+
+minetest.register_node("currency:shop", {
+	description = "Shop",
+	paramtype2 = "facedir",
+	tiles = {"shop_top.png",
+	                "shop_top.png",
+			"shop_side.png",
+			"shop_side.png",
+			"shop_side.png",
+			"shop_front.png"},
+	inventory_image = "shop_front.png",
+	groups = {choppy=2,oddly_breakable_by_hand=2},
+	sounds = default.node_sound_wood_defaults(),
+	after_place_node = function(pos, placer, itemstack)
+		local owner = placer:get_player_name()
+		local meta = minetest.env:get_meta(pos)
+		meta:set_string("infotext", "Exchange shop (owned by "..owner..")")
+		meta:set_string("owner",owner)
+		--[[meta:set_string("pl1","")
+		meta:set_string("pl2","")]]
+		local inv = meta:get_inventory()
+		inv:set_size("customers_gave", 3*2)
+		inv:set_size("stock", 3*2)
+		inv:set_size("owner_wants", 3*2)
+		inv:set_size("owner_gives", 3*2)
+	end,
+	on_rightclick = function(pos, node, clicker, itemstack)
+		clicker:get_inventory():set_size("customer_gives", 3*2)
+		clicker:get_inventory():set_size("customer_gets", 3*2)
+		default.shop.current_shop[clicker:get_player_name()] = pos
+		local meta = minetest.env:get_meta(pos)
+		if clicker:get_player_name() == meta:get_string("owner") and not clicker:get_player_control().aux1 then
+			minetest.show_formspec(clicker:get_player_name(),"currency:shop_formspec",default.shop.formspec.owner(pos))
+		else
+			minetest.show_formspec(clicker:get_player_name(),"currency:shop_formspec",default.shop.formspec.customer(pos))
+		end
+	end,
+	allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
+		local meta = minetest.env:get_meta(pos)
+		if player:get_player_name() ~= meta:get_string("owner") then return 0 end
+		return count
+	end,
+	allow_metadata_inventory_put = function(pos, listname, index, stack, player)
+		local meta = minetest.env:get_meta(pos)
+		if player:get_player_name() ~= meta:get_string("owner") then return 0 end
+		return stack:get_count()
+	end,
+	allow_metadata_inventory_take = function(pos, listname, index, stack, player)
+		local meta = minetest.env:get_meta(pos)
+		if player:get_player_name() ~= meta:get_string("owner") then return 0 end
+		return stack:get_count()
+	end,
+	can_dig = function(pos, player)
+		local meta = minetest.env:get_meta(pos)
+		local inv = meta:get_inventory()
+		return inv:is_empty("stock") and inv:is_empty("customers_gave") and inv:is_empty("owner_wants") and inv:is_empty("owner_gives")
+	end
+})
+
+minetest.register_on_player_receive_fields(function(sender, formname, fields)
+	print(dump(fields))
+	if formname == "currency:shop_formspec" and fields.exchange ~= nil and fields.exchange ~= "" then
+		local name = sender:get_player_name()
+		local pos = default.shop.current_shop[name]
+		local meta = minetest.env:get_meta(pos)
+		if meta:get_string("owner") == name then
+			minetest.chat_send_player(name,"This is your own shop, you can't exchange to yourself !")
+		else
+			local minv = meta:get_inventory()
+			local pinv = sender:get_inventory()
+			local invlist_tostring = function(invlist)
+				local out = {}
+				for i, item in pairs(invlist) do
+					out[i] = item:to_string()
+				end
+				return out
+			end
+			local wants = minv:get_list("owner_wants")
+			local gives = minv:get_list("owner_gives")
+			if wants == nil or gives == nil then return end -- do not crash the server
+			-- Check if we can exchange
+			local can_exchange = true
+			local owners_fault = false
+			for i, item in pairs(wants) do
+				if not pinv:contains_item("customer_gives",item) then
+					can_exchange = false
+				end
+			end
+			for i, item in pairs(gives) do
+				if not minv:contains_item("stock",item) then
+					can_exchange = false
+					owners_fault = true
+				end
+			end
+			if can_exchange then
+				for i, item in pairs(wants) do
+					pinv:remove_item("customer_gives",item)
+					minv:add_item("customers_gave",item)
+				end
+				for i, item in pairs(gives) do
+					minv:remove_item("stock",item)
+					pinv:add_item("customer_gets",item)
+				end
+				minetest.chat_send_player(name,"Exchanged!")
+			else
+				if owners_fault then
+					minetest.chat_send_player(name,"Exchange can not be done, contact the shop owner.")
+				else
+					minetest.chat_send_player(name,"Exchange can not be done, check if you put all items !")
+				end
+			end
+		end
+	end
+end)
+
diff --git a/textures/barter_base.png b/textures/barter_base.png
new file mode 100644
index 0000000..b4e2599
Binary files /dev/null and b/textures/barter_base.png differ
diff --git a/textures/barter_side.png b/textures/barter_side.png
new file mode 100644
index 0000000..57c1d7c
Binary files /dev/null and b/textures/barter_side.png differ
diff --git a/textures/barter_top.png b/textures/barter_top.png
new file mode 100644
index 0000000..8ce9256
Binary files /dev/null and b/textures/barter_top.png differ
diff --git a/textures/minegeld.png b/textures/minegeld.png
new file mode 100644
index 0000000..79e36ff
Binary files /dev/null and b/textures/minegeld.png differ
diff --git a/textures/minegeld_10.png b/textures/minegeld_10.png
new file mode 100644
index 0000000..acdb05e
Binary files /dev/null and b/textures/minegeld_10.png differ
diff --git a/textures/minegeld_5.png b/textures/minegeld_5.png
new file mode 100644
index 0000000..5c66ac6
Binary files /dev/null and b/textures/minegeld_5.png differ
diff --git a/textures/minegeld_bundle.png b/textures/minegeld_bundle.png
new file mode 100644
index 0000000..c6b339d
Binary files /dev/null and b/textures/minegeld_bundle.png differ
diff --git a/textures/safe_front.png b/textures/safe_front.png
new file mode 100644
index 0000000..0d4c007
Binary files /dev/null and b/textures/safe_front.png differ
diff --git a/textures/safe_side.png b/textures/safe_side.png
new file mode 100644
index 0000000..1ec4c1f
Binary files /dev/null and b/textures/safe_side.png differ
diff --git a/textures/shop_front.png b/textures/shop_front.png
new file mode 100644
index 0000000..29d0065
Binary files /dev/null and b/textures/shop_front.png differ
diff --git a/textures/shop_side.png b/textures/shop_side.png
new file mode 100644
index 0000000..712364c
Binary files /dev/null and b/textures/shop_side.png differ
diff --git a/textures/shop_top.png b/textures/shop_top.png
new file mode 100644
index 0000000..b4e2599
Binary files /dev/null and b/textures/shop_top.png differ
-- 
cgit v1.2.3