travelnet-cd2025/actions/change_order.lua
Oversword 302e425262
Draft: Formspec redo (#47)
* Remove the usage of pos2str using context var

* Make sure on punch and paging is working

* Generate formspecs on interact, not on update

* Linting and page_formspec usage

* Clear metadata formspec on interact

* Consolidate ordered formspec function

* Reduce repetition in infotext when updating station

* Formspec redo - first working version

* Move largest actions to individual files

* Cleanup and tested
2022-02-12 14:56:37 -05:00

73 lines
2.3 KiB
Lua

local S = minetest.get_translator("travelnet")
return function (node_info, fields, player)
local player_name = player:get_player_name()
-- does the player want to move this station one position up in the list?
-- only the owner and players with the travelnet_attach priv can change the order of the list
-- Note: With elevators, only the "G"(round) marking is actually moved
if fields and (fields.move_up or fields.move_down)
and not travelnet.is_falsey_string(node_info.props.owner_name)
and (
(node_info.props.owner_name == player_name)
or (minetest.check_player_privs(player_name, { travelnet_attach=true }))
)
then
local network = travelnet.get_network(node_info.props.owner_name, node_info.props.station_network)
if not network then
return false, S("This station does not have a network.")
end
local stations = travelnet.get_ordered_stations(
node_info.props.owner_name,
node_info.props.station_network,
node_info.props.is_elevator
)
local current_pos = -1
for index, k in ipairs(stations) do
if k == node_info.props.station_name then
current_pos = index
break
end
end
local swap_with_pos
if fields.move_up then
swap_with_pos = current_pos-1
else
swap_with_pos = current_pos+1
end
-- handle errors
if swap_with_pos < 1 then
return false, S("This station is already the first one on the list.")
elseif swap_with_pos > #stations then
return false, S("This station is already the last one on the list.")
else
local current_station = stations[current_pos]
local swap_with_station = stations[swap_with_pos]
-- swap the actual data by which the stations are sorted
local old_timestamp = network[swap_with_station].timestamp
network[swap_with_station].timestamp = network[current_station].timestamp
network[current_station].timestamp = old_timestamp
-- for elevators, only the "G"(round) marking is moved; no point in swapping stations
if not node_info.props.is_elevator then
-- actually swap the stations
stations[swap_with_pos] = current_station
stations[current_pos] = swap_with_station
end
-- store the changed order
travelnet.save_data()
return true, { formspec = travelnet.formspecs.primary }
end
end
return false, S("This @1 belongs to @2. You can't edit it.",
node_info.props.description,
tostring(node_info.props.owner_name)
)
end