aboutsummaryrefslogtreecommitdiff
path: root/init.lua
diff options
context:
space:
mode:
authorSmallJoker <mk939@ymail.com>2018-08-07 18:58:48 +0200
committerSmallJoker <mk939@ymail.com>2018-08-07 18:58:48 +0200
commit2516fac8af5a328dd2692f3b30a31be01003f4ca (patch)
tree2e2058a1ceea39c2ac9696f25393bac7a008aed7 /init.lua
parent6bb6b4072c2edade6f7dbb25078f8ba53e1e214e (diff)
downloadfarebox-2516fac8af5a328dd2692f3b30a31be01003f4ca.tar.gz
farebox-2516fac8af5a328dd2692f3b30a31be01003f4ca.tar.bz2
farebox-2516fac8af5a328dd2692f3b30a31be01003f4ca.zip
Move position caching to server-side entirely
Diffstat (limited to 'init.lua')
-rw-r--r--init.lua82
1 files changed, 51 insertions, 31 deletions
diff --git a/init.lua b/init.lua
index b964d55..e369bb7 100644
--- a/init.lua
+++ b/init.lua
@@ -4,38 +4,44 @@
-- quantity is paid. Ideal to charge admission from visitors to your
-- buildings
farebox = {}
+-- Is used to keep the formspec information server-side
+farebox.players = {}
+
function farebox.show_formspec(pos, player)
- local spos = pos.x .. "," .. pos.y .. "," .. pos.z
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
local owner = meta:get_string("owner")
- local formspec = ""
- if owner and player:get_player_name() == owner then
- formspec = "size[8,10]"..
- "label[0.5,0.5;Entrance fee:]" ..
- "list[nodemeta:" .. spos .. ";request;2.5,0.25;1,1;]" ..
+ local player_name = player:get_player_name()
+
+ farebox.players[player_name] = vector.new(pos)
+ if player_name == owner then
+ local loc = "nodemeta:" .. pos.x .. "," .. pos.y .. "," .. pos.z
+ minetest.show_formspec(player_name, "farebox:farebox",
+ "size[8,10]"..
+ "label[0.5,0.5; Entrance fee:]" ..
+ "list[" .. loc .. ";request;2.5,0.25;1,1;]" ..
"button_exit[6,0.25;2,1;open;Open]" ..
- "list[nodemeta:" .. spos .. ";main;0,1.5;8,4]" ..
+ "list[" .. loc .. ";main;0,1.5;8,4]" ..
"list[current_player;main;0,5.75;8,1;]" ..
"list[current_player;main;0,7;8,3;8]" ..
"listring[]" .. default.get_hotbar_bg(0, 4.25)
+ )
else
- formspec = "size[8,4]" ..
+ minetest.show_formspec(player_name, "farebox:farebox",
+ "size[8,4]" ..
"label[0.5,1.5; Owner Wants:]" ..
"item_image_button[2.5,1.25;1,1;" ..
- inv:get_stack("request",1):get_name() .. ";buy;\n\n\b\b\b\b\b" ..
- inv:get_stack("request",1):get_count() .. "]" ..
+ inv:get_stack("request", 1):get_name() .. ";buy;\n\n\b\b\b\b\b" ..
+ inv:get_stack("request", 1):get_count() .. "]" ..
"label[3.5,1.5; (Click on the item to pay)]"
+ )
end
- minetest.after(0.1, function(gui, name)
- minetest.show_formspec(name, "farebox:" .. spos, gui)
- end, formspec, player:get_player_name())
end
farebox.rules = {
{x=0, y=-2, z=0},
- {x=0, y=2, z=0}
+ {x=0, y=2, z=0},
}
function farebox.open_faregate(pos)
@@ -59,45 +65,59 @@ function farebox.close_faregate(pos)
})
end
-minetest.register_on_player_receive_fields(function(player, form, pressed)
- if string.sub(form,1,string.len("farebox:")) == "farebox:" then
- local spos = string.sub(form, string.len("farebox:") + 1, -1)
- local pos = minetest.string_to_pos(spos)
+minetest.register_on_player_receive_fields(function(player, formname, pressed)
+ if formname ~= "farebox:farebox" then
+ return -- Not My Job
+ end
+ local pname = player:get_player_name()
+ local pos = farebox.players[pname]
+ if not pos then
+ return
+ end
+
+ local nodename = minetest.get_node(pos).name
+ if nodename ~= "farebox:farebox" and nodename ~= "farebox:faregate" then
+ -- Node was removed. Make reference invalid.
+ farebox.players[pname] = nil
+ return
+ end
+
local pinv = player:get_inventory()
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
- local pname = player:get_player_name()
- local nodename = minetest.get_node(pos).name
+ local owner = meta:get_string("owner")
local open = false
if pressed.buy then
- if pinv:contains_item("main", inv:get_stack("request", 1))
- and inv:room_for_item("main", inv:get_stack("request", 1)) then
+ local request = inv:get_stack("request", 1)
+ if pinv:contains_item("main", request)
+ and inv:room_for_item("main", request) then
if not (creative and creative.is_enabled_for
and creative.is_enabled_for(pname)) then
- pinv:remove_item("main", inv:get_stack("request", 1))
+ pinv:remove_item("main", request)
end
- inv:add_item("main", inv:get_stack("request",1))
+ inv:add_item("main", request)
open = true
- elseif not pinv:contains_item("main", inv:get_stack("request", 1)) then
+ elseif not pinv:contains_item("main", request) then
minetest.chat_send_player(pname, "You don't have enough items to enter")
- elseif not inv:room_for_item("main", inv:get_stack("request", 1)) then
+ elseif not inv:room_for_item("main", request) then
minetest.chat_send_player(pname, "Owner's inventory is full")
end
end
- if pressed.open or open then
+ if (pressed.open and pname == owner) or open then
minetest.chat_send_player(pname, "Payment accepted.")
if nodename == "farebox:farebox" then
- mesecon.receptor_on(pos,farebox.rules)
+ mesecon.receptor_on(pos, farebox.rules)
minetest.after(1, mesecon.receptor_off, pos, farebox.rules)
elseif nodename == "farebox:faregate" then
farebox.open_faregate(pos)
end
- minetest.close_formspec(pname, form)
+ minetest.close_formspec(pname, formname)
end
- end -- if string.sub(...)
end)
-
+minetest.register_on_leaveplayer(function(player)
+ farebox.players[player:get_player_name()] = nil
+end)
minetest.register_node("farebox:farebox", {
description = "Farebox",