135 lines
5.7 KiB
Lua
135 lines
5.7 KiB
Lua
--[[
|
|
PIN Terminal Node
|
|
-----------------
|
|
This file defines the PIN Terminal, which allows players to
|
|
set their initial PIN, change it, and request a new card.
|
|
It provides an immersive replacement for the /set_pin command.
|
|
--]]
|
|
|
|
-- Shows the form for a new player to set their first PIN.
|
|
local function show_pin_create_form(player, error_msg)
|
|
local player_name = player:get_player_name()
|
|
local formspec = "size[8,5]" ..
|
|
"label[1,0.5;"..S("Welcome! Please set your personal 4-digit PIN.").."]" ..
|
|
"pwdfield[2,2;4,1;new_pin;"..S("New PIN:").."]" ..
|
|
"button_exit[3,4;2,1;confirm_new_pin;"..S("Confirm").."]"
|
|
|
|
if error_msg then
|
|
formspec = formspec .. "label[1,3;`"..minetest.formspec_escape(S(error_msg)).."`]" .. "style[label;color=red]"
|
|
end
|
|
|
|
minetest.show_formspec(player_name, "bank_accounts:pin_create", formspec)
|
|
end
|
|
|
|
-- Shows the main menu for an existing player at the PIN terminal.
|
|
local function show_pin_options_form(player)
|
|
local player_name = player:get_player_name()
|
|
minetest.show_formspec(player_name, "bank_accounts:pin_options",
|
|
"size[8,6]" ..
|
|
"label[1,0.5;"..S("PIN & Card Service").."]" ..
|
|
"label[1,1.5;"..S("What would you like to do?").."]" ..
|
|
"button_exit[2,3;4,1;change_pin;"..S("Change PIN").."]" ..
|
|
"button_exit[2,4;4,1;new_card;"..S("Request New Card").."]")
|
|
end
|
|
|
|
-- Shows the form to change an existing PIN.
|
|
-- Can display an error message if something goes wrong.
|
|
local function show_pin_change_form(player, error_msg)
|
|
local player_name = player:get_player_name()
|
|
local formspec = "size[8,7]" ..
|
|
"label[1,0.5;"..S("Change Your PIN").."]" ..
|
|
"pwdfield[2,2;4,1;old_pin;"..S("Old PIN:").."]" ..
|
|
"pwdfield[2,3;4,1;new_pin1;"..S("New PIN:").."]" ..
|
|
"pwdfield[2,4;4,1;new_pin2;"..S("Confirm New PIN:").."]" ..
|
|
"button_exit[3,6;2,1;confirm_change;"..S("Confirm").."]"
|
|
|
|
if error_msg then
|
|
formspec = formspec .. "label[1,5;`"..minetest.formspec_escape(S(error_msg)).."`]" .. "style[label;color=red]"
|
|
end
|
|
|
|
minetest.show_formspec(player_name, "bank_accounts:pin_change", formspec)
|
|
end
|
|
|
|
-- Node definition for the PIN Terminal.
|
|
minetest.register_node("bank_accounts:pin_terminal", {
|
|
description = S("PIN Terminal"),
|
|
drawtype = "mesh",
|
|
mesh = "card_swipe.obj",
|
|
paramtype = "light",
|
|
paramtype2 = "facedir",
|
|
tiles = {"pin_terminal.png"},
|
|
groups = {cracky=3, crumbly=3, oddly_breakable_by_hand=2},
|
|
|
|
-- Called when a player right-clicks the node.
|
|
-- It does not require a card to operate.
|
|
on_rightclick = function(pos, node, player, itemstack, pointed_thing)
|
|
local player_name = player:get_player_name()
|
|
-- Check if the player is new (has the default PIN).
|
|
if bank_accounts.get_pin(player_name) == "0000" then
|
|
show_pin_create_form(player)
|
|
else
|
|
show_pin_options_form(player)
|
|
end
|
|
end,
|
|
})
|
|
|
|
-- Handles formspec submissions for all PIN Terminal forms.
|
|
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
|
-- Only process forms belonging to this node.
|
|
if not formname:find("bank_accounts:pin_") then
|
|
return
|
|
end
|
|
|
|
local player_name = player:get_player_name()
|
|
|
|
-- Logic for initial PIN creation.
|
|
if formname == "bank_accounts:pin_create" then
|
|
if fields.confirm_new_pin then
|
|
local new_pin = fields.new_pin
|
|
if new_pin and new_pin:match("^[0-9][0-9][0-9][0-9]$") and new_pin ~= "0000" then
|
|
bank_accounts.set_pin(player_name, new_pin)
|
|
local inv = player:get_inventory()
|
|
if not inv:contains_item("main", "bank_accounts:atm_card") then
|
|
inv:add_item("main", "bank_accounts:atm_card")
|
|
end
|
|
minetest.chat_send_player(player_name, S("[PIN Terminal] Your PIN has been set! Your new bank card is in your inventory."))
|
|
else
|
|
-- Re-show form with an error message.
|
|
show_pin_create_form(player, "[PIN Terminal] Your PIN must be 4 digits and not '0000'.")
|
|
end
|
|
end
|
|
|
|
-- Logic for the options menu.
|
|
elseif formname == "bank_accounts:pin_options" then
|
|
if fields.change_pin then
|
|
show_pin_change_form(player)
|
|
elseif fields.new_card then
|
|
local inv = player:get_inventory()
|
|
if inv:contains_item("main", "bank_accounts:atm_card") then
|
|
minetest.chat_send_player(player_name, S("[PIN Terminal] You already have a bank card."))
|
|
else
|
|
inv:add_item("main", "bank_accounts:atm_card")
|
|
minetest.chat_send_player(player_name, S("[PIN Terminal] A new bank card has been added to your inventory."))
|
|
end
|
|
end
|
|
|
|
-- Logic for the PIN change form.
|
|
elseif formname == "bank_accounts:pin_change" then
|
|
if fields.confirm_change then
|
|
local old_pin = fields.old_pin
|
|
local new_pin1 = fields.new_pin1
|
|
local new_pin2 = fields.new_pin2
|
|
|
|
if old_pin ~= bank_accounts.get_pin(player_name) then
|
|
show_pin_change_form(player, "[PIN Terminal] Your old PIN is incorrect.")
|
|
elseif not new_pin1 or not new_pin1:match("^[0-9][0-9][0-9][0-9]$") or new_pin1 == "0000" then
|
|
show_pin_change_form(player, "[PIN Terminal] Your PIN must be 4 digits and not '0000'.")
|
|
elseif new_pin1 ~= new_pin2 then
|
|
show_pin_change_form(player, "[PIN Terminal] The new PINs do not match.")
|
|
else
|
|
bank_accounts.set_pin(player_name, new_pin1)
|
|
minetest.chat_send_player(player_name, S("[PIN Terminal] Your PIN has been successfully changed."))
|
|
end
|
|
end
|
|
end
|
|
end)
|