autofly: cleanup
[waspsaliva.git] / clientmods / autofly / wpforms.lua
blobaa698399396579edd49541c2c512c8cb04ee7b20
4 -- ADVMARKERS Stuff
5 -- Get the waypoints formspec
6 local formspec_list = {}
7 local selected_name = false
9 local storage = minetest.get_mod_storage()
10 local wpr=false;
11 local twpname=nil
12 local info=minetest.get_server_info()
13 local stprefix="autofly-".. info['address'] .. '-'
15 autofly = {}
16 wps={}
17 autofly.registered_transports={}
18 local tspeed = 20 -- speed in blocks per second
19 local speed=0;
20 local ltime=0
21 function autofly.register_transport(name,func)
22 table.insert(autofly.registered_transports,{name=name,func=func})
23 end
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]'
31 local sp=0
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..']'
34 sp=sp+0.8
35 end
37 formspec=formspec..'textlist[0,0.75;6,6;marker;'
38 local selected = 1
39 formspec_list = {}
41 local waypoints = autofly.getwps()
44 for id, name in ipairs(waypoints) do
45 if id > 1 then
46 formspec = formspec .. ','
47 end
48 if not selected_name then
49 selected_name = name
50 end
51 if name == selected_name then
52 selected = id
53 end
54 formspec_list[#formspec_list + 1] = name
55 formspec = formspec .. '##' .. minetest.formspec_escape(name)
56 end
58 formspec = formspec .. ';' .. tostring(selected) .. ']'
60 if selected_name then
61 local pos = autofly.get_waypoint(selected_name)
62 if pos then
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 .. ']'
67 end
68 else
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".]'
72 end
74 -- Display the formspec
75 return minetest.show_formspec('autofly-csm', formspec)
76 end
78 minetest.register_on_formspec_input(function(formname, fields)
79 if formname == 'autofly-ignore' then
80 return true
81 elseif formname ~= 'autofly-csm' then
82 return
83 end
84 local name = false
85 if fields.marker then
86 local event = minetest.explode_textlist_event(fields.marker)
87 if event.index then
88 name = formspec_list[event.index]
89 end
90 else
91 name = selected_name
92 end
94 if name then
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)
99 end
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
137 else
138 minetest.display_chat_message('Error renaming waypoint!')
140 autofly.display_formspec()
141 else
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
158 selected_name = name
159 autofly.display_formspec()
161 elseif fields.display or fields.delete then
162 minetest.display_chat_message('Please select a waypoint.')
164 return true
165 end)
168 -- Export waypoints
169 function autofly.export(raw)
170 local s = storage:to_table().fields
171 if raw == 'M' then
172 s = minetest.compress(minetest.serialize(s))
173 s = 'M' .. minetest.encode_base64(s)
174 elseif not raw then
175 s = minetest.compress(minetest.write_json(s))
176 s = 'J' .. minetest.encode_base64(s)
178 return s
181 -- Allow string exporting
182 minetest.register_chatcommand('wpexp', {
183 params = '[old]',
184 description = 'Exports an autofly string containing all your markers.',
185 func = function(param)
186 local export
187 if param == 'old' then
188 export = autofly.export('M')
189 else
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')
200 -- String importing
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!'
208 else
209 return false, 'Invalid autofly string!'
213 --register_chatcommand_alias('wpimp', 'wp_import', 'waypoint_import')
215 -- Import waypoints
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
223 if ver == 'M' then
224 s = minetest.deserialize(msg, true)
225 else
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
237 local c = 0
238 while #storage:get_string(name) > 0 and c < 50 do
239 name = name .. '_'
240 c = c + 1
243 -- Sanity check
244 if c < 50 then
245 storage:set_string(name, pos)
249 return true