add wallTool
[df_scaffold.git] / init.lua
blob400c2ab17ae8f8254a6f04f3a9d3a9a4001c425e
1 -- CC0/Unlicense Emilia & cora 2020
3 local category = "Scaffold"
5 scaffold = {}
6 scaffold.registered_scaffolds = {}
7 scaffold.lockdir = false
8 scaffold.locky = false
9 local storage=minetest.get_mod_storage()
11 scaffold.wason = {}
13 local nextact = {}
15 local towerbot_height = 75
20 local function get_locks()
21 local ly=storage:get_string('lockdir')
22 local ld= storage:get_string('locky')
23 if ld then scaffold.lockdir = tonumber(ld) end
24 if ly then scaffold.locky = tonumber(ly) end
25 if scaffold.lockdir or scaffold.locky then return true end
26 return false
27 end
28 local function set_locks()
29 storage:set_string('lockdir', scaffold.lockdir)
30 storage:set_string('locky', scaffold.locky)
31 end
32 local function del_locks()
33 storage:set_string('lockdir','')
34 storage:set_string('locky','')
35 end
37 if get_locks() then
38 if scaffold.lockdir then scaffold.wason.scaffold_lockyaw = true end
39 if scaffold.locky then scaffold.wason.scaffold_locky = true end
40 end
42 function scaffold.register_scaffold(func)
43 table.insert(scaffold.registered_scaffolds, func)
44 end
46 function scaffold.step_scaffolds()
47 for i, v in ipairs(scaffold.registered_scaffolds) do
48 v()
49 end
50 end
52 function scaffold.template(setting, func, offset, funcstop )
53 offset = offset or {x = 0, y = -1, z = 0}
54 funcstop = funcstop or function() end
56 return function()
57 if minetest.localplayer and minetest.settings:get_bool(setting) then
58 if nextact[setting] and nextact[setting] > os.clock() then return end
59 nextact[setting] = os.clock() + 0.1
60 local lp = minetest.localplayer:get_pos()
61 local tgt = vector.round(vector.add(lp, offset))
62 func(tgt)
63 if not scaffold.wason[setting] then scaffold.wason[setting] = true end
64 elseif scaffold.wason[setting] then
65 scaffold.wason[setting] = false
66 funcstop()
67 end
68 end
69 end
71 function scaffold.register_template_scaffold(name, setting, func, offset, funcstop)
72 scaffold.register_scaffold(scaffold.template(setting, func, offset, funcstop))
73 if minetest.register_cheat then
74 minetest.register_cheat(name, category, setting)
75 end
76 end
78 minetest.register_globalstep(scaffold.step_scaffolds)
80 function scaffold.can_place_at(pos)
81 local node = minetest.get_node_or_nil(pos)
82 return (node and (node.name == "air" or minetest.get_node_def(node.name).buildable_to))
83 end
85 -- should check if wield is placeable
86 -- minetest.get_node(wielded:get_name()) ~= nil should probably work
87 -- otherwise it equips armor and eats food
88 function scaffold.can_place_wielded_at(pos)
89 local wield_empty = minetest.localplayer:get_wielded_item():is_empty()
90 return not wield_empty and scaffold.can_place_at(pos)
91 end
93 function scaffold.find_any_swap(items)
94 for i, v in ipairs(items) do
95 local n = minetest.find_item(v)
96 if n then
97 minetest.localplayer:set_wield_index(n)
98 return true
99 end
101 return false
104 function scaffold.in_list(val, list)
105 if type(list) ~= "table" then return false end
106 for i, v in ipairs(list) do
107 if v == val then
108 return true
111 return false
114 -- swaps to any of the items and places if need be
115 -- returns true if placed and in inventory or already there, false otherwise
117 local lastact=0
118 local lastplc=0
119 local lastdig=0
120 local actint=1
121 function scaffold.place_if_needed(items, pos, place)
122 --if lastplc + actint > os.time() then return end
123 if not pos then return end
124 lastplc=os.time()
125 if minetest.settings:get_bool('scaffold.locky') and math.round(pos.y) ~= math.round(scaffold.locky) then return end
126 place = place or minetest.place_node
128 local node = minetest.get_node_or_nil(pos)
129 if not node then return end
130 -- already there
131 if node and scaffold.in_list(node.name, items) then
132 return true
133 else
134 local swapped = scaffold.find_any_swap(items)
136 -- need to place
137 if swapped and scaffold.can_place_at(pos) then
138 place(pos)
139 return true
140 -- can't place
141 else
142 return false
147 function scaffold.place_if_able(pos)
148 --if lastplc + actint > os.time() then return end
149 lastplc=os.time()
150 if minetest.settings:get_bool('scaffold.locky') and math.round(pos.y) ~= math.round(scaffold.locky) then return end
151 if scaffold.can_place_wielded_at(pos) then
152 minetest.place_node(pos)
156 function scaffold.dig(pos)
157 --if lastdig + actint > os.time() then return end
158 lastdig=os.time()
159 local nd=minetest.get_node_or_nil(pos)
160 if not nd then return false end
161 local n = minetest.get_node_def(nd.name)
162 if n and n.diggable then
163 minetest.select_best_tool(nd.name)
164 return minetest.dig_node(pos)
166 return false
170 local mpath = minetest.get_modpath(minetest.get_current_modname())
171 dofile(mpath .. "/sapscaffold.lua")
172 dofile(mpath .. "/slowscaffold.lua")
173 dofile(mpath .. "/autofarm.lua")
174 dofile(mpath .. "/railscaffold.lua")
175 dofile(mpath .. "/wallbot.lua")
178 scaffold.register_template_scaffold("LockYaw", "scaffold_lockyaw", function(pos)
179 if not scaffold.wason.scaffold_lockyaw then
180 scaffold.lockdir=turtle.getdir()
181 set_locks()
183 if scaffold.lockdir then turtle.setdir(scaffold.lockdir) end
184 end, false, function() storage:set_string('lockdir','') end)
187 scaffold.register_template_scaffold("LockY", "scaffold_locky", function(pos)
188 local lp=minetest.localplayer:get_pos()
189 if not scaffold.wason.scaffold_locky then
190 scaffold.locky = lp.y
191 set_locks()
193 if scaffold.locky and lp.y ~= scaffold.locky then
194 --minetest.localplayer:set_pos({x=lp.x,y=scaffold.locky,z=lp.z})
196 end,false, function() storage:set_string('locky','') end)
198 scaffold.register_template_scaffold("CheckScaffold", "scaffold_check", function(pos)
199 scaffold.place_if_able(pos)
200 end)
202 scaffold.register_template_scaffold("HereScaffold", "scaffold_here", function(pos)
203 scaffold.place_if_able(pos)
204 end, {x = 0, y = 0, z = 0})
206 scaffold.register_template_scaffold("WaterScaffold", "scaffold_water", function(pos)
207 if (pos.x % 2 + pos.z % 2) == 0 then
208 scaffold.place_if_needed({
209 "mcl_buckets:bucket_water",
210 "mcl_core:water_source"
211 }, pos)
213 end)
214 scaffold.register_template_scaffold("WaterSpam", "scaffold_spamwater", function(pos)
215 --if (pos.x % 2 + pos.z % 2) == 0 then
216 scaffold.place_if_needed({
217 "mcl_buckets:bucket_water",
218 "mcl_core:water_source"
219 }, pos)
220 --end
221 end)
222 local function checknode(pos)
223 local node = minetest.get_node_or_nil(pos)
224 if node then return true end
225 return false
228 if turtle then
229 scaffold.register_template_scaffold("TBM", "scaffold_tbm", function(pos)
230 scaffold.dig(turtle.dircoord(1,1,0))
231 scaffold.dig(turtle.dircoord(1,0,0))
232 end)
233 scaffold.register_template_scaffold("TallTBM", "scaffold_ttbm", function(pos)
234 pos = {
236 turtle.dircoord(1,4,2),
237 turtle.dircoord(1,3,2),
238 turtle.dircoord(1,2,2),
239 turtle.dircoord(1,1,2),
240 turtle.dircoord(1,0,2),
242 turtle.dircoord(1,4,-2),
243 turtle.dircoord(1,3,-2),
244 turtle.dircoord(1,2,-2),
245 turtle.dircoord(1,1,-2),
246 turtle.dircoord(1,0,-2),
249 turtle.dircoord(1,4,1),
250 turtle.dircoord(1,3,1),
251 turtle.dircoord(1,2,1),
252 turtle.dircoord(1,1,1),
253 turtle.dircoord(1,0,1),
255 turtle.dircoord(1,4,-1),
256 turtle.dircoord(1,3,-1),
257 turtle.dircoord(1,2,-1),
258 turtle.dircoord(1,1,-1),
259 turtle.dircoord(1,0,-1),
261 turtle.dircoord(1,4,0),
262 turtle.dircoord(1,3,0),
263 turtle.dircoord(1,2,0),
264 turtle.dircoord(1,1,0),
265 turtle.dircoord(1,0,0)
267 for k,v in pairs(pos) do
268 scaffold.dig(v)
270 minetest.settings:set_bool('continuous_forward',true)
271 for k,v in pairs(pos) do
272 local n=minetest.get_node_or_nil(v)
273 if n and n.name ~= "air" then
274 minetest.settings:set_bool('continuous_forward',false)
276 if n and n.name == 'mcl_core:cobble' then
277 minetest.settings:set_bool('scaffold_ttbm',false)
278 minetest.settings:set_bool('scaffold_lockyaw',false)
281 end)
283 scaffold.register_template_scaffold("Cobbler", "scaffold_cobbler", function(pos)
284 if minetest.settings:get_bool('freecam') then return end
285 local fpos=turtle.dircoord(1,0,0)
286 local fn=minetest.get_node_or_nil(fpos)
287 pos = {
289 turtle.dircoord(2,4,2),
290 turtle.dircoord(2,3,2),
291 turtle.dircoord(2,2,2),
292 turtle.dircoord(2,1,2),
293 turtle.dircoord(2,0,2),
295 turtle.dircoord(2,4,-2),
296 turtle.dircoord(2,3,-2),
297 turtle.dircoord(2,2,-2),
298 turtle.dircoord(2,1,-2),
299 turtle.dircoord(2,0,-2),
301 turtle.dircoord(2,4,1),
302 turtle.dircoord(2,3,1),
303 turtle.dircoord(2,2,1),
304 turtle.dircoord(2,1,1),
305 turtle.dircoord(2,0,1),
307 turtle.dircoord(2,4,-1),
308 turtle.dircoord(2,3,-1),
309 turtle.dircoord(2,2,-1),
310 turtle.dircoord(2,1,-1),
311 turtle.dircoord(2,0,-1),
313 turtle.dircoord(2,4,0),
314 turtle.dircoord(2,3,0),
315 turtle.dircoord(2,2,0),
316 turtle.dircoord(2,1,0),
317 turtle.dircoord(2,0,0),
320 turtle.dircoord(3,4,2),
321 turtle.dircoord(3,3,2),
322 turtle.dircoord(3,2,2),
323 turtle.dircoord(3,1,2),
324 turtle.dircoord(3,0,2),
326 turtle.dircoord(3,4,-2),
327 turtle.dircoord(3,3,-2),
328 turtle.dircoord(3,2,-2),
329 turtle.dircoord(3,1,-2),
330 turtle.dircoord(3,0,-2),
333 turtle.dircoord(4,4,1),
334 turtle.dircoord(4,3,1),
335 turtle.dircoord(4,2,1),
336 turtle.dircoord(4,1,1),
337 turtle.dircoord(4,0,1),
339 turtle.dircoord(4,4,-1),
340 turtle.dircoord(4,3,-1),
341 turtle.dircoord(4,2,-1),
342 turtle.dircoord(4,1,-1),
343 turtle.dircoord(4,0,-1),
345 turtle.dircoord(4,4,0),
346 turtle.dircoord(4,3,0),
347 turtle.dircoord(4,2,0),
348 turtle.dircoord(4,1,0),
349 turtle.dircoord(4,0,0),
351 turtle.dircoord(5,4,2),
352 turtle.dircoord(5,3,2),
353 turtle.dircoord(5,2,2),
354 turtle.dircoord(5,1,2),
355 turtle.dircoord(5,0,2),
357 turtle.dircoord(5,4,-2),
358 turtle.dircoord(5,3,-2),
359 turtle.dircoord(5,2,-2),
360 turtle.dircoord(5,1,-2),
361 turtle.dircoord(5,0,-2),
364 turtle.dircoord(5,4,1),
365 turtle.dircoord(5,3,1),
366 turtle.dircoord(5,2,1),
367 turtle.dircoord(5,1,1),
368 turtle.dircoord(5,0,1),
370 turtle.dircoord(5,4,-1),
371 turtle.dircoord(5,3,-1),
372 turtle.dircoord(5,2,-1),
373 turtle.dircoord(5,1,-1),
374 turtle.dircoord(5,0,-1),
376 turtle.dircoord(5,4,0),
377 turtle.dircoord(5,3,0),
378 turtle.dircoord(5,2,0),
379 turtle.dircoord(5,1,0),
380 turtle.dircoord(5,0,0)
383 if fn and fn.name == "mcl_core:cobble" then
384 for k,v in pairs(pos) do
385 scaffold.place_if_needed({"mcl_core:cobble"},v)
389 end)
392 scaffold.register_template_scaffold("LanternTBM", "scaffold_ltbm", function(pos)
393 --scaffold.dig(turtle.dircoord(1,1,0)) -- let lTBM just be additionally place lanterns mode - useful for rail too.
394 --scaffold.dig(turtle.dircoord(1,0,0))
395 local dir=turtle.getdir()
396 local pl=false
397 if dir == "north" or dir == "south" then
398 if pos.z % 8 == 0 then
399 pl=true
401 else
402 if pos.x % 8 == 0 then
403 pl=true
406 if pl then
407 local lpos=turtle.dircoord(0,3,0)
408 local nd=minetest.get_node_or_nil(lpos)
409 if nd and nd.name ~= 'mcl_ocean:sea_lantern' then
410 scaffold.dig(lpos)
411 minetest.after("0.1",function() scaffold.place_if_needed({'mcl_ocean:sea_lantern'},lpos) end)
414 end)
415 scaffold.register_template_scaffold("TriScaffold", "scaffold_three_wide", function(pos)
416 scaffold.place_if_able(pos)
417 scaffold.place_if_able(turtle.dircoord(0, 0, 1))
418 scaffold.place_if_able(turtle.dircoord(0, 0, -1))
419 end)
421 scaffold.register_template_scaffold("WallBot", "scaffold_behind", function(pos)
422 minetest.settings:set_bool('scaffold_lockyaw',true)
423 minetest.settings:set('movement_speed_walk',1)
424 pos = {
426 turtle.dircoord(-2,4,2),
427 turtle.dircoord(-2,3,2),
428 turtle.dircoord(-2,2,2),
429 turtle.dircoord(-2,1,2),
430 turtle.dircoord(-2,0,2),
432 turtle.dircoord(-2,4,-2),
433 turtle.dircoord(-2,3,-2),
434 turtle.dircoord(-2,2,-2),
435 turtle.dircoord(-2,1,-2),
436 turtle.dircoord(-2,0,-2),
439 turtle.dircoord(-2,4,1),
440 turtle.dircoord(-2,3,1),
441 turtle.dircoord(-2,2,1),
442 turtle.dircoord(-2,1,1),
443 turtle.dircoord(-2,0,1),
445 turtle.dircoord(-2,4,-1),
446 turtle.dircoord(-2,3,-1),
447 turtle.dircoord(-2,2,-1),
448 turtle.dircoord(-2,1,-1),
449 turtle.dircoord(-2,0,-1),
451 turtle.dircoord(-2,4,0),
452 turtle.dircoord(-2,3,0),
453 turtle.dircoord(-2,2,0),
454 turtle.dircoord(-2,1,0),
455 turtle.dircoord(-2,0,0),
456 turtle.dircoord(-2,4,2),
457 turtle.dircoord(-2,3,2),
458 turtle.dircoord(-2,2,2),
459 turtle.dircoord(-2,1,2),
460 turtle.dircoord(-2,0,2),
462 turtle.dircoord(-3,4,-2),
463 turtle.dircoord(-3,3,-2),
464 turtle.dircoord(-3,2,-2),
465 turtle.dircoord(-3,1,-2),
466 turtle.dircoord(-3,0,-2),
469 turtle.dircoord(-3,4,1),
470 turtle.dircoord(-3,3,1),
471 turtle.dircoord(-3,2,1),
472 turtle.dircoord(-3,1,1),
473 turtle.dircoord(-3,0,1),
475 turtle.dircoord(-3,4,-1),
476 turtle.dircoord(-3,3,-1),
477 turtle.dircoord(-3,2,-1),
478 turtle.dircoord(-3,1,-1),
479 turtle.dircoord(-3,0,-1),
481 turtle.dircoord(-3,4,0),
482 turtle.dircoord(-3,3,0),
483 turtle.dircoord(-3,2,0),
484 turtle.dircoord(-3,1,0),
485 turtle.dircoord(-3,0,0)
488 local ngo=false
490 for k,v in pairs(pos) do
491 local n=minetest.get_node_or_nil(v)
492 if n and n.name ~= "mcl_core:cobble" then
493 scaffold.dig(v)
494 ngo=false
495 else ngo=true
497 if n == nil then ngo=false end
500 for k,v in pairs(pos) do
501 scaffold.place_if_needed({'mcl_core:cobble'},v)
504 minetest.settings:set_bool('continuous_forward',ngo)
505 end,false,function()
506 minetest.settings:set_bool('continuous_forward',false)
507 minetest.settings:set_bool('scaffold_locky',false)
508 minetest.settings:set_bool('scaffold_lockyaw',false)
509 minetest.settings:set_bool('scaffold_ltbm',false)
510 minetest.settings:set('movement_speed_walk',4)
511 end)
513 scaffold.register_template_scaffold("headTriScaff", "scaffold_three_wide_head", function(pos)
514 scaffold.place_if_able(turtle.dircoord(0, 3, 0))
515 scaffold.place_if_able(turtle.dircoord(0, 3, 1))
516 scaffold.place_if_able(turtle.dircoord(0, 3, -1))
517 end)
519 scaffold.register_template_scaffold("QuintScaffold", "scaffold_five_wide", function(pos)
520 scaffold.place_if_able(pos)
521 scaffold.place_if_able(turtle.dircoord(0, 0, 1))
522 scaffold.place_if_able(turtle.dircoord(0, 0, -1))
523 scaffold.place_if_able(turtle.dircoord(0, 0, 2))
524 scaffold.place_if_able(turtle.dircoord(0, 0, -2))
525 end)
528 if nlist then
529 scaffold.register_template_scaffold("RandomScaff", "scaffold_rnd", function(below)
530 if true then return false end
531 local n = minetest.get_node_or_nil(below)
532 -- n == nil is ignore
533 if n and not scaffold.in_list(n.name, nlist.get('randomscaffold')) then
534 scaffold.dig(below)
535 scaffold.place_if_needed(table.shuffle(nlist.get('randomscaffold')), below)
537 end)