travelnet/on_receive_fields.lua
Oversword 9ea2c0d1ff
Locked travelnet compat (#51)
* Allow for setting of promary formspec height via options; Get stored pos on form handler, not on recieve fields

* Make sure pos is local and end_input is always called when the form closes

* Always pass as much infomration as possible into the end_input action
2022-02-15 16:34:19 -05:00

183 lines
5.0 KiB
Lua

local S = minetest.get_translator("travelnet")
local player_formspec_data = travelnet.player_formspec_data
local function validate_travelnet(pos, meta)
local owner_name = meta:get_string("owner")
local station_network = meta:get_string("station_network")
local station_name = meta:get_string("station_name")
-- if there is something wrong with the data
if not owner_name or not station_network or not station_name then
print(
"ERROR: The travelnet at " .. minetest.pos_to_string(pos) .. " has a problem: " ..
" DATA: owner: " .. (owner_name or "?") ..
" station_name: " .. (station_name or "?") ..
" station_network: " .. (station_network or "?") .. "."
)
return false, S("Error") .. ": " ..
S("There is something wrong with the configuration of this station.") ..
" DEBUG DATA: owner: " .. (owner_name or "?") ..
" station_name: " .. (station_name or "?") ..
" station_network: " .. (station_network or "?") .. "."
end
-- TODO: This check seems odd, re-think this. Don't get node twice, don't hard-code node names.
local description = travelnet.node_description(pos)
if not description then
return false, "Error: Unknown node."
end
return true, {
description = description,
owner_name = owner_name,
station_network = station_network,
station_name = station_name
}
end
local function decide_action(fields, props)
-- the player wants to quit/exit the formspec; do not save/update anything
if (fields.station_exit and fields.station_exit ~= "") or (fields.quit and fields.quit ~= "") then
return travelnet.actions.end_input
end
-- back button leads back to the previous form
if fields.back and fields.back ~= "" then
return travelnet.actions.return_to_form
end
-- if paging is enabled and the player wants to change pages
if (travelnet.MAX_STATIONS_PER_NETWORK == 0 or travelnet.MAX_STATIONS_PER_NETWORK > 24)
and fields.page_number
and (
fields.next_page
or fields.prev_page
or fields.last_page
or fields.first_page
)
then
return travelnet.actions.navigate_page
end
-- the player wants to remove the station
if fields.station_dig then
return travelnet.actions.remove_station
end
-- the player wants to open the edit form
if fields.station_edit then
return travelnet.actions.edit_station
end
-- if the box has not been configured yet
if travelnet.is_falsey_string(props.station_network) then
return travelnet.actions.add_station
end
-- save pressed after editing
if fields.station_set then
return travelnet.actions.update_station
end
-- pressed the "open door" button
if fields.open_door then
return travelnet.actions.toggle_door
end
-- the owner or players with the travelnet_attach priv can move stations up or down in the list
if fields.move_up or fields.move_down then
return travelnet.actions.change_order
end
if not fields.target then
return travelnet.actions.instruct_player
end
local network = travelnet.get_network(props.owner_name, props.station_network)
if not network then
return travelnet.actions.add_station
end
return travelnet.actions.transport_player
end
function travelnet.on_receive_fields(pos, _, fields, player)
if not player then
return
end
local name = player:get_player_name()
player_formspec_data[name] = player_formspec_data[name] or {}
if pos then
player_formspec_data[name].pos = pos
else
pos = player_formspec_data[name].pos
end
local action_args = {
pos = pos,
props = {}
}
if not pos then
travelnet.actions.end_input(action_args, fields or {}, player)
travelnet.show_formspec(name, false)
return
end
local node = minetest.get_node(pos)
action_args.node = node
local meta = minetest.get_meta(pos)
action_args.meta = meta
if not fields then
travelnet.actions.end_input(action_args, {}, player)
travelnet.show_formspec(name, false)
return
end
-- Validate node's meta data
local valid, props = validate_travelnet(pos, meta)
props.is_elevator = travelnet.is_elevator(node.name)
if not valid then
minetest.chat_send_player(name, props)
travelnet.actions.end_input(action_args, fields, player)
travelnet.show_formspec(name, false)
return
end
action_args.props = props
-- Decide which action to run based on fields given
local action = decide_action(fields, props)
if not action then
travelnet.actions.end_input(action_args, fields, player)
travelnet.show_formspec(name, false)
return
end
-- Perform the action
local success, result = action(action_args, fields, player)
-- Respond with a formspec
if success then
if result and result.formspec then
if result.formspec ~= travelnet.formspecs.current then
player_formspec_data[name].current_form = result.formspec
end
if result.options then
for k,v in pairs(result.options) do
props[k] = v
end
end
travelnet.show_formspec(name, result.formspec(props, name))
else
travelnet.actions.end_input(action_args, fields, player)
travelnet.show_formspec(name, false)
end
else
travelnet.show_formspec(name, travelnet.formspecs.error_message({ message = result }))
end
end