1 -- CC0/Unlicense Emilia & cora 2020
3 local category
= "Scaffold"
6 scaffold
.registered_scaffolds
= {}
7 scaffold
.lockdir
= false
9 local storage
=minetest
.get_mod_storage()
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
28 local function set_locks()
29 storage
:set_string('lockdir', scaffold
.lockdir
)
30 storage
:set_string('locky', scaffold
.locky
)
32 local function del_locks()
33 storage
:set_string('lockdir','')
34 storage
:set_string('locky','')
38 if scaffold
.lockdir
then scaffold
.wason
.scaffold_lockyaw
= true end
39 if scaffold
.locky
then scaffold
.wason
.scaffold_locky
= true end
42 function scaffold
.register_scaffold(func
)
43 table.insert(scaffold
.registered_scaffolds
, func
)
46 function scaffold
.step_scaffolds()
47 for i
, v
in ipairs(scaffold
.registered_scaffolds
) do
52 function scaffold
.template(setting
, func
, offset
, funcstop
)
53 offset
= offset
or {x
= 0, y
= -1, z
= 0}
54 funcstop
= funcstop
or function() end
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
))
63 if not scaffold
.wason
[setting
] then scaffold
.wason
[setting
] = true end
64 elseif scaffold
.wason
[setting
] then
65 scaffold
.wason
[setting
] = false
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
)
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
))
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
)
93 function scaffold
.find_any_swap(items
)
94 for i
, v
in ipairs(items
) do
95 local n
= minetest
.find_item(v
)
97 minetest
.localplayer
:set_wield_index(n
)
104 function scaffold
.in_list(val
, list
)
105 if type(list
) ~= "table" then return false end
106 for i
, v
in ipairs(list
) do
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
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
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
131 if node
and scaffold
.in_list(node
.name
, items
) then
134 local swapped
= scaffold
.find_any_swap(items
)
137 if swapped
and scaffold
.can_place_at(pos
) then
147 function scaffold
.place_if_able(pos
)
148 --if lastplc + actint > os.time() then return end
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
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
)
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()
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
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
)
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"
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"
222 local function checknode(pos
)
223 local node
= minetest
.get_node_or_nil(pos
)
224 if node
then return true end
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))
233 scaffold
.register_template_scaffold("TallTBM", "scaffold_ttbm", function(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
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)
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
)
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
)
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()
397 if dir
== "north" or dir
== "south" then
398 if pos
.z
% 8 == 0 then
402 if pos
.x
% 8 == 0 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
411 minetest
.after("0.1",function() scaffold
.place_if_needed({'mcl_ocean:sea_lantern'},lpos
) 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))
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)
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)
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
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
)
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)
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))
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))
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
535 scaffold
.place_if_needed(table.shuffle(nlist
.get('randomscaffold')), below
)