9ea2c0d1ff
* 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
183 lines
5.0 KiB
Lua
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
|