From 8e8e8607c64f94eeb413cb323aaa38a4ff083f01 Mon Sep 17 00:00:00 2001 From: Vitalie Ciubotaru Date: Sat, 5 Mar 2016 23:02:00 +0900 Subject: [PATCH] Added 'currency' as dependency; added cash deposit and withdrawal --- atm.lua | 57 ++++++++++++++++++++++++++++++++++++++++++++ depends.txt | 1 + exchange_machine.lua | 57 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 115 insertions(+) diff --git a/atm.lua b/atm.lua index 188dfc2..f4ff879 100644 --- a/atm.lua +++ b/atm.lua @@ -6,6 +6,7 @@ local atm_form = "global_exchange:atm_form" local main_menu =[[ size[6,2] +button[0,0;2,1;cash;Cash In/Out] button[2,0;2,1;info;Account Info] button[4,0;2,1;wire;Wire Monies] button[1,1;4,1;transaction_log;Transaction Log] @@ -37,6 +38,33 @@ local function unique() return ret end +function cash_fs(p_name) + local balance = exchange:get_balance(p_name) + local formspec = + 'size[8,9]'.. + 'label[0,0;' .. p_name .. '\'s account]' .. + 'label[0,1;Balance: ' .. balance .. ']' .. + --money + 'list[detached:global_exchange;money;0,2;3,1;]'.. + --player inventory + 'list[current_player;main;0,5;8,4;]' +--print(formspec) + return formspec +end + +function bills2balance(stack, p_name) + local bal = exchange:get_balance(p_name) + local name = stack:get_name() + local count = stack:get_count() + if name == 'currency:minegeld' then + bal = bal + count + elseif name == 'currency:minegeld_5' then + bal = bal + count * 5 + elseif name == 'currency:minegeld_10' then + bal = bal + count * 10 + end + return bal +end local function info_fs(p_name) local balance = exchange:get_balance(p_name) @@ -133,6 +161,35 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) minetest.show_formspec(p_name, atm_form, main_menu) end + if fields.cash then + minetest.show_formspec(p_name, atm_form, cash_fs(p_name)) + local balance = exchange:get_balance(p_name) + local inv = minetest.get_inventory({type="detached", name="global_exchange"}) + inv:set_size('money', 3) + local stacks = inv:get_list('money') + local tens = math.floor(balance/10) + if tens > 0 then + inv:set_stack('money', 1, 'currency:minegeld_10 ' .. tens) + balance = balance - tens * 10 + else + inv:set_stack('money', 1, '') + end + local fives = math.floor(balance/5) + if fives > 0 then + inv:set_stack('money', 2, 'currency:minegeld_5 ' .. fives) + balance = balance - fives * 5 + else + inv:set_stack('money', 2, '') + end + local ones = math.floor(balance) + if ones > 0 then + inv:set_stack('money', 3, 'currency:minegeld ' .. ones) + balance = balance - ones + else + inv:set_stack('money', 3, '') + end + end + if fields.info then minetest.show_formspec(p_name, atm_form, info_fs(p_name)) end diff --git a/depends.txt b/depends.txt index 5e78c21..fbf313c 100644 --- a/depends.txt +++ b/depends.txt @@ -1 +1,2 @@ default? +currency \ No newline at end of file diff --git a/exchange_machine.lua b/exchange_machine.lua index b8c84e5..7af44fb 100644 --- a/exchange_machine.lua +++ b/exchange_machine.lua @@ -198,6 +198,63 @@ minetest.after(0, function() inv:add_item("main", item_name) show_main(p_name, item_name) end, + on_put = function(inv, listname, index, stack, player) + local p_name = player:get_player_name() + if listname == 'money' and minetest.get_item_group(stack:get_name(), 'minegeld') then + local balance = bills2balance(stack, p_name) + exchange:set_balance(p_name, balance) + local stacks = inv:get_list('money') + local tens = math.floor(balance/10) + if tens > 0 then + inv:set_stack('money', 1, 'currency:minegeld_10 ' .. tens) + balance = balance - tens * 10 + else + inv:set_stack('money', 1, '') + end + local fives = math.floor(balance/5) + if fives > 0 then + inv:set_stack('money', 2, 'currency:minegeld_5 ' .. fives) + balance = balance - fives * 5 + else + inv:set_stack('money', 2, '') + end + local ones = math.floor(balance) + if ones > 0 then + inv:set_stack('money', 3, 'currency:minegeld ' .. ones) + balance = balance - ones + else + inv:set_stack('money', 3, '') + end + end + minetest.show_formspec(p_name, "global_exchange:atm_form", cash_fs(p_name)) --redraw with new balance + end, + allow_put = function(inv, listname, index, stack, player) + local name = stack:get_name() + if listname == 'money' and minetest.get_item_group(name, 'minegeld') > 0 then + return stack:get_count() + end + return 0 + end, + on_take = function(inv, listname, index, stack, player) + local p_name = player:get_player_name() + if listname == 'money' and minetest.get_item_group(stack:get_name(), 'minegeld') then + local name = stack:get_name() + local count = stack:get_count() + local delta + if name == 'currency:minegeld' then + delta = count + elseif name == 'currency:minegeld_5' then + delta = count * 5 + elseif name == 'currency:minegeld_10' then + delta = count * 10 + end + exchange:change_balance(p_name, -delta) --let's hope it always returns success + end + minetest.show_formspec(p_name, "global_exchange:atm_form", cash_fs(p_name)) --redraw with new balance + end, + allow_take = function(inv, listname, index, stack, player) + return stack:get_count() + end, }) local selectable_list,n = {},1