Merge pull request #2 from SmallJoker/master

Fix indent style & solve crash possibility
master
gpcf 2018-09-09 20:03:28 +02:00 committed by GitHub
commit ab14f61bac
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 139 additions and 112 deletions

251
init.lua
View File

@ -4,137 +4,164 @@
-- quantity is paid. Ideal to charge admission from visitors to your -- quantity is paid. Ideal to charge admission from visitors to your
-- buildings -- buildings
farebox = {} farebox = {}
-- Is used to keep the formspec information server-side
farebox.players = {}
function farebox.show_formspec(pos, player) function farebox.show_formspec(pos, player)
local spos = pos.x .. "," ..pos.y .. "," .. pos.z local meta = minetest.get_meta(pos)
local meta = minetest.get_meta(pos) local inv = meta:get_inventory()
local inv = meta:get_inventory() local owner = meta:get_string("owner")
local owner = meta:get_string("owner") local player_name = player:get_player_name()
local formspec = ""
if owner and player:get_player_name()==owner then farebox.players[player_name] = vector.new(pos)
formspec = "size[8,10]".. if player_name == owner then
"label[0.5,0.5; Entrance fee:]".. local loc = "nodemeta:" .. pos.x .. "," .. pos.y .. "," .. pos.z
"list[nodemeta:" .. spos .. ";request;2.5,0.25;1,1;]" .. minetest.show_formspec(player_name, "farebox:farebox",
"button_exit[6,0.25;2,1;open;Open]".. "size[8,10]"..
"list[nodemeta:" .. spos .. ";main;0,1.5;8,4]".. "label[0.5,0.5; Entrance fee:]" ..
"list[current_player;main;0,5.75;8,1;]".. "list[" .. loc .. ";request;2.5,0.25;1,1;]" ..
"list[current_player;main;0,7;8,3;8]".. "button_exit[6,0.25;2,1;open;Open]" ..
"listring[]".. default.get_hotbar_bg(0, 4.25) "list[" .. loc .. ";main;0,1.5;8,4]" ..
else "list[current_player;main;0,5.75;8,1;]" ..
formspec = "size[8,4]".. "list[current_player;main;0,7;8,3;8]" ..
"label[0.5,1.5; Owner Wants:]".. "listring[]" .. default.get_hotbar_bg(0, 4.25)
"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() .."]".. )
"label[3.5,1.5; (Click on the item to pay)]" else
end minetest.show_formspec(player_name, "farebox:farebox",
minetest.after((0.1), function(gui) "size[8,4]" ..
return minetest.show_formspec(player:get_player_name(), "farebox:"..spos,gui) "label[0.5,1.5; Owner Wants:]" ..
end, formspec) "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() .. "]" ..
"label[3.5,1.5; (Click on the item to pay)]"
)
end
end end
farebox.rules = farebox.rules = {
{{x=0, y=-2, z=0}, {x=0, y=-2, z=0},
{x=0, y=2, z=0}} {x=0, y=2, z=0},
}
function farebox.open_faregate(pos) function farebox.open_faregate(pos)
node = minetest.get_node(pos) node = minetest.get_node(pos)
node.name = "farebox:faregate_open" node.name = "farebox:faregate_open"
minetest.swap_node(pos, node) minetest.swap_node(pos, node)
minetest.sound_play("doors_steel_door_open", minetest.sound_play("doors_steel_door_open", {
{pos = pos, gain = 0.3, max_hear_distance = 10}) pos = pos,
gain = 0.3,
max_hear_distance = 10
})
end end
function farebox.close_faregate(pos) function farebox.close_faregate(pos)
node = minetest.get_node(pos) node = minetest.get_node(pos)
node.name = "farebox:faregate" node.name = "farebox:faregate"
minetest.swap_node(pos, node) minetest.swap_node(pos, node)
minetest.sound_play("doors_steel_door_close", minetest.sound_play("doors_steel_door_close", {
{pos = pos, gain = 0.3, max_hear_distance = 10}) pos = pos,
gain = 0.3,
max_hear_distance = 10
})
end end
minetest.register_on_player_receive_fields(function(player, form, pressed) 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
if string.sub(form,1,string.len("farebox:")) == "farebox:" then local nodename = minetest.get_node(pos).name
local spos = string.sub(form,string.len("farebox:")+1,-1) if nodename ~= "farebox:farebox" and nodename ~= "farebox:faregate" then
local pos = minetest.string_to_pos(spos) -- Node was removed. Make reference invalid.
local pinv=player:get_inventory() farebox.players[pname] = nil
local meta = minetest.get_meta(pos) return
local inv = meta:get_inventory() end
local pname = player:get_player_name()
local nodename = minetest.get_node(pos).name local pinv = player:get_inventory()
local open = false local meta = minetest.get_meta(pos)
if pressed.buy then local inv = meta:get_inventory()
if pinv:contains_item("main", inv:get_stack("request",1)) and inv:room_for_item("main", inv:get_stack("request",1)) then local owner = meta:get_string("owner")
if not (creative and creative.is_enabled_for local open = false
and creative.is_enabled_for(pname)) then if pressed.buy then
pinv:remove_item("main", inv:get_stack("request",1)) local request = inv:get_stack("request", 1)
end if pinv:contains_item("main", request)
inv:add_item("main", inv:get_stack("request",1)) and inv:room_for_item("main", request) then
open = true if not (creative and creative.is_enabled_for
elseif not pinv:contains_item("main", inv:get_stack("request",1)) then and creative.is_enabled_for(pname)) then
minetest.chat_send_player(pname, "You don't have enough items to enter") pinv:remove_item("main", request)
elseif not inv:room_for_item("main", inv:get_stack("request",1)) then end
minetest.chat_send_player(pname, "Owner's inventory is full") inv:add_item("main", request)
end open = true
end elseif not pinv:contains_item("main", request) then
if pressed.open or open then minetest.chat_send_player(pname, "You don't have enough items to enter")
minetest.chat_send_player(pname, "Payment accepted.") elseif not inv:room_for_item("main", request) then
if nodename == "farebox:farebox" then minetest.chat_send_player(pname, "Owner's inventory is full")
mesecon.receptor_on(pos,farebox.rules) end
minetest.after(1, function (_) end
mesecon.receptor_off(pos,farebox.rules) if (pressed.open and pname == owner) or open then
minetest.chat_send_player(pname, "Payment accepted.")
end) if nodename == "farebox:farebox" then
elseif nodename == "farebox:faregate" then mesecon.receptor_on(pos, farebox.rules)
farebox.open_faregate(pos) minetest.after(1, mesecon.receptor_off, pos, farebox.rules)
end elseif nodename == "farebox:faregate" then
minetest.close_formspec(pname, form) farebox.open_faregate(pos)
end end
end minetest.close_formspec(pname, formname)
end
end) end)
minetest.register_on_leaveplayer(function(player)
farebox.players[player:get_player_name()] = nil
end)
minetest.register_node("farebox:farebox", { minetest.register_node("farebox:farebox", {
description = "Farebox", description = "Farebox",
tiles = { tiles = {
"default_steel_block.png", "default_steel_block.png", "default_steel_block.png", "default_steel_block.png",
"default_steel_block.png", "default_steel_block.png", "default_steel_block.png", "default_steel_block.png",
"default_steel_block.png", "farebox_front.png" "default_steel_block.png", "farebox_front.png"
}, },
paramtype2 = "facedir", paramtype2 = "facedir",
groups = {cracky=2}, groups = {cracky=2},
legacy_facedir_simple = true, legacy_facedir_simple = true,
is_ground_content = false, is_ground_content = false,
sounds = default.node_sound_stone_defaults(), sounds = default.node_sound_stone_defaults(),
mesecons = {receptor = { mesecons = {
state = mesecon.state.off, receptor = {
rules = farebox.rules state = mesecon.state.off,
}}, rules = farebox.rules
can_dig = can_dig, }
after_place_node = function(pos, player, _) },
local meta = minetest.get_meta(pos) can_dig = can_dig,
local player_name = player:get_player_name() after_place_node = function(pos, player, _)
local meta = minetest.get_meta(pos)
local player_name = player:get_player_name()
meta:set_string("owner", player_name) meta:set_string("owner", player_name)
meta:set_string("infotext", "Owned by "..player_name) meta:set_string("infotext", "Owned by "..player_name)
local inv = meta:get_inventory()
inv:set_size("request", 1)
inv:set_size("main", 32)
end,
on_rightclick = function(pos, node, player, itemstack, pointed_thing) local inv = meta:get_inventory()
farebox.show_formspec(pos, player) inv:set_size("request", 1)
end, inv:set_size("main", 32)
end,
on_rightclick = function(pos, node, player, itemstack, pointed_thing)
farebox.show_formspec(pos, player)
end,
}) })
minetest.register_craft({output = "farebox:farebox", minetest.register_craft({
recipe = { output = "farebox:farebox",
{"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, recipe = {
{"default:steel_ingot", "", "default:steel_ingot"}, {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"},
{"default:steel_ingot", "mesecons:mesecon", "default:steel_ingot"}, {"default:steel_ingot", "", "default:steel_ingot"},
} {"default:steel_ingot", "mesecons:mesecon", "default:steel_ingot"},
}
}) })
local modpath = minetest.get_modpath("farebox") local modpath = minetest.get_modpath("farebox")
dofile(modpath .. "/faregate.lua") dofile(modpath .. "/faregate.lua")