5 -- Get the waypoints formspec
6 local formspec_list
= {}
7 local selected_name
= false
9 local storage
= minetest
.get_mod_storage()
12 local info
=minetest
.get_server_info()
13 local stprefix
="autofly-".. info
['address'] .. '-'
17 autofly
.registered_transports
={}
18 local tspeed
= 20 -- speed in blocks per second
21 function autofly
.register_transport(name
,func
)
22 table.insert(autofly
.registered_transports
,{name
=name
,func
=func
})
24 function autofly
.display_formspec()
25 local formspec
= 'size[6.25,9]' ..
26 'label[0,0;Waypoint list]' ..
28 'button_exit[0,7.5;1,0.5;display;Show]' ..
29 'button[3.625,7.5;1.3,0.5;rename;Rename]' ..
30 'button[4.9375,7.5;1.3,0.5;delete;Delete]'
32 for k
,v
in pairs(autofly
.registered_transports
) do
33 formspec
=formspec
..'button_exit['..sp
..',8.5;1,0.5;'..v
.name
..';'..v
.name
..']'
37 formspec
=formspec
..'textlist[0,0.75;6,6;marker;'
41 local waypoints
= autofly
.getwps()
44 for id
, name
in ipairs(waypoints
) do
46 formspec
= formspec
.. ','
48 if not selected_name
then
51 if name
== selected_name
then
54 formspec_list
[#formspec_list
+ 1] = name
55 formspec
= formspec
.. '##' .. minetest
.formspec_escape(name
)
58 formspec
= formspec
.. ';' .. tostring(selected
) .. ']'
61 local pos
= autofly
.get_waypoint(selected_name
)
63 pos
= minetest
.formspec_escape(tostring(pos
.x
) .. ', ' ..
64 tostring(pos
.y
) .. ', ' .. tostring(pos
.z
))
65 pos
= 'Waypoint position: ' .. pos
66 formspec
= formspec
.. 'label[0,6.75;' .. pos
.. ']'
69 -- Draw over the buttons
70 formspec
= formspec
.. 'button_exit[0,7.5;5.25,0.5;quit;Close dialog]' ..
71 'label[0,6.75;No waypoints. Add one with ".wa".]'
74 -- Display the formspec
75 return minetest
.show_formspec('autofly-csm', formspec
)
78 minetest
.register_on_formspec_input(function(formname
, fields
)
79 if formname
== 'autofly-ignore' then
81 elseif formname
~= 'autofly-csm' then
86 local event
= minetest
.explode_textlist_event(fields
.marker
)
88 name
= formspec_list
[event
.index
]
95 for k
,v
in pairs(autofly
.registered_transports
) do
96 if fields
[v
.name
] then
97 if not v
.func(autofly
.get_waypoint(name
),name
) then
98 minetest
.display_chat_message('Error with '..v
.name
)
102 if fields
.display
then
103 if not autofly
.display_waypoint(name
) then
104 minetest
.display_chat_message('Error displaying waypoint!')
106 elseif fields
.goto
then
107 if not autofly
.goto_waypoint(name
) then
108 minetest
.display_chat_message('Error flying to waypoint!')
110 elseif fields
.warp
then
111 if not autofly
.warp(name
) then
112 minetest
.display_chat_message('warp error')
114 elseif fields
.autotp
then
115 if not autofly
.autotp(name
) then
116 minetest
.display_chat_message('warpandexit error')
118 elseif fields
.itp
then
119 if incremental_tp
then
120 incremental_tp
.tp(autofly
.get_waypoint(name
),1)
122 elseif fields
.jitp
then
123 if incremental_tp
then
124 incremental_tp
.tp(autofly
.get_waypoint(name
),0.5,0.4)
126 elseif fields
.rename then
127 minetest
.show_formspec('autofly-csm', 'size[6,3]' ..
128 'label[0.35,0.2;Rename waypoint]' ..
129 'field[0.3,1.3;6,1;new_name;New name;' ..
130 minetest
.formspec_escape(name
) .. ']' ..
131 'button[0,2;3,1;cancel;Cancel]' ..
132 'button[3,2;3,1;rename_confirm;Rename]')
133 elseif fields
.rename_confirm
then
134 if fields
.new_name
and #fields
.new_name
> 0 then
135 if autofly
.rename_waypoint(name
, fields
.new_name
) then
136 selected_name
= fields
.new_name
138 minetest
.display_chat_message('Error renaming waypoint!')
140 autofly
.display_formspec()
142 minetest
.display_chat_message(
143 'Please enter a new name for the marker.'
146 elseif fields
.delete
then
147 minetest
.show_formspec('autofly-csm', 'size[6,2]' ..
148 'label[0.35,0.25;Are you sure you want to delete this waypoint?]' ..
149 'button[0,1;3,1;cancel;Cancel]' ..
150 'button[3,1;3,1;delete_confirm;Delete]')
151 elseif fields
.delete_confirm
then
152 autofly
.delete_waypoint(name
)
153 selected_name
= false
154 autofly
.display_formspec()
155 elseif fields
.cancel
then
156 autofly
.display_formspec()
157 elseif name
~= selected_name
then
159 autofly
.display_formspec()
161 elseif fields
.display
or fields
.delete
then
162 minetest
.display_chat_message('Please select a waypoint.')
169 function autofly
.export(raw
)
170 local s
= storage
:to_table().fields
172 s
= minetest
.compress(minetest
.serialize(s
))
173 s
= 'M' .. minetest
.encode_base64(s
)
175 s
= minetest
.compress(minetest
.write_json(s
))
176 s
= 'J' .. minetest
.encode_base64(s
)
181 -- Allow string exporting
182 minetest
.register_chatcommand('wpexp', {
184 description
= 'Exports an autofly string containing all your markers.',
185 func
= function(param
)
187 if param
== 'old' then
188 export
= autofly
.export('M')
190 export
= autofly
.export()
192 minetest
.show_formspec('autofly-ignore',
193 'field[_;Your waypoint export string;' ..
194 minetest
.formspec_escape(export
) .. ']')
198 --register_chatcommand_alias('wpexp', 'wp_export', 'waypoint_export')
201 minetest
.register_chatcommand('wpimp', {
202 params
= '<autofly string>',
203 description
= 'Imports an autofly string. This will not overwrite ' ..
204 'existing markers that have the same name.',
205 func
= function(param
)
206 if autofly
.import(param
) then
207 return true, 'Waypoints imported!'
209 return false, 'Invalid autofly string!'
213 --register_chatcommand_alias('wpimp', 'wp_import', 'waypoint_import')
216 function autofly
.import(s
)
217 if type(s
) ~= 'table' then
218 local ver
= s
:sub(1, 1)
219 if ver
~= 'M' and ver
~= 'J' then return end
220 s
= minetest
.decode_base64(s
:sub(2))
221 local success
, msg
= pcall(minetest
.decompress
, s
)
222 if not success
then return end
224 s
= minetest
.deserialize(msg
, true)
226 s
= minetest
.parse_json(msg
)
230 -- Iterate over waypoints to preserve existing ones and check for errors.
231 if type(s
) == 'table' then
232 for name
, pos
in pairs(s
) do
233 if type(name
) == 'string' and type(pos
) == 'string' and
234 name
:sub(1, 7) == 'marker-' and minetest
.string_to_pos(pos
) and
235 storage
:get_string(name
) ~= pos
then
236 -- Prevent collisions
238 while #storage
:get_string(name
) > 0 and c
< 50 do
245 storage
:set_string(name
, pos
)