1 -- CC0/Unlicense Emilia & cora 2020
3 local category
= "Scaffold"
6 scaffold
.registered_scaffolds
= {}
7 scaffold
.lockdir
= false
9 scaffold
.constrain1
= false
10 scaffold
.constrain2
= false
13 local storage
=minetest
.get_mod_storage()
19 local towerbot_height
= 75
21 function scaffold
.template(setting
, func
, offset
, funcstop
)
22 offset
= offset
or {x
= 0, y
= -1, z
= 0}
23 funcstop
= funcstop
or function() end
26 if minetest
.localplayer
and minetest
.settings
:get_bool(setting
) then
27 if scaffold
.constrain1
and not inside_constraints(tgt
) then return end
28 local tgt
=vector
.add(minetest
.localplayer
:get_pos(),offset
)
34 function scaffold
.register_template_scaffold(name
, setting
, func
, offset
, funcstop
)
35 ws
.rg(name
,'Scaffold',setting
,scaffold
.template(setting
, func
, offset
),funcstop
)
38 local function between(x
, y
, z
) return y
<= x
and x
<= z
end -- x is between y and z (inclusive)
40 function scaffold
.in_cube(tpos
,wpos1
,wpos2
)
49 if wpos1
.x
> wpos2
.x
then
53 if wpos1
.y
> wpos2
.y
then
57 if wpos1
.z
> wpos2
.z
then
61 if between(tpos
.x
,xmin
,xmax
) and between(tpos
.y
,ymin
,ymax
) and between(tpos
.z
,zmin
,zmax
) then
67 local function set_hwp(name
,pos
)
68 ws
.display_wp(pos
,name
)
71 function scaffold
.set_pos1(pos
)
72 if not pos
then local pos
=minetest
.localplayer
:get_pos() end
73 scaffold
.constrain1
=vector
.round(pos
)
74 local pstr
=minetest
.pos_to_string(scaffold
.constrain1
)
75 set_hwp('scaffold_pos1 '..pstr
,scaffold
.constrain1
)
76 minetest
.display_chat_message("scaffold pos1 set to "..pstr
)
78 function scaffold
.set_pos2(pos
)
79 if not pos
then pos
=minetest
.localplayer
:get_pos() end
80 scaffold
.constrain2
=vector
.round(pos
)
81 local pstr
=minetest
.pos_to_string(scaffold
.constrain2
)
82 set_hwp('scaffold_pos2 '..pstr
,scaffold
.constrain2
)
83 minetest
.display_chat_message("scaffold pos2 set to "..pstr
)
86 function scaffold
.reset()
87 scaffold
.constrain1
=false
88 scaffold
.constrain2
=false
89 for k
,v
in pairs(hwps
) do
90 minetest
.localplayer
:hud_remove(v
)
95 local function inside_constraints(pos
)
96 if (scaffold
.constrain1
and scaffold
.constrain2
and scaffold
.in_cube(pos
,scaffold
.constrain1
,scaffold
.constrain2
)) then return true
97 elseif not scaffold
.constrain1
then return true
102 minetest
.register_chatcommand("sc_pos1", { func
= scaffold
.set_pos1
})
103 minetest
.register_chatcommand("sc_pos2", { func
= scaffold
.set_pos2
})
104 minetest
.register_chatcommand("sc_reset", { func
= scaffold
.reset
})
109 function scaffold
.can_place_at(pos
)
110 local node
= minetest
.get_node_or_nil(pos
)
111 return (node
and (node
.name
== "air" or node
.name
=="mcl_core:water_source" or node
.name
=="mcl_core:water_flowing" or node
.name
=="mcl_core:lava_source" or node
.name
=="mcl_core:lava_flowing" or minetest
.get_node_def(node
.name
).buildable_to
))
114 -- should check if wield is placeable
115 -- minetest.get_node(wielded:get_name()) ~= nil should probably work
116 -- otherwise it equips armor and eats food
117 function scaffold
.can_place_wielded_at(pos
)
118 local wield_empty
= minetest
.localplayer
:get_wielded_item():is_empty()
119 return not wield_empty
and scaffold
.can_place_at(pos
)
122 function scaffold
.find_any_swap(items
)
123 for i
, v
in ipairs(items
) do
124 local n
= minetest
.find_item(v
)
126 minetest
.localplayer
:set_wield_index(n
)
133 function scaffold
.in_list(val
, list
)
134 if type(list
) ~= "table" then return false end
135 for i
, v
in ipairs(list
) do
143 -- swaps to any of the items and places if need be
144 -- returns true if placed and in inventory or already there, false otherwise
150 function scaffold
.place_if_needed(items
, pos
, place
)
151 if not inside_constraints(pos
) then return end
152 --if lastplc + actint > os.time() then return end
153 if not pos
then return end
156 place
= place
or minetest
.place_node
158 local node
= minetest
.get_node_or_nil(pos
)
159 if not node
then return end
161 if node
and scaffold
.in_list(node
.name
, items
) then
164 local swapped
= scaffold
.find_any_swap(items
)
167 if swapped
and scaffold
.can_place_at(pos
) then
177 function scaffold
.place_if_able(pos
)
178 if not pos
then return end
179 if not inside_constraints(pos
) then return end
180 if minetest
.settings
:get_bool('scaffold.locky') and math
.round(pos
.y
) ~= math
.round(scaffold
.locky
) then return end
181 if scaffold
.can_place_wielded_at(pos
) then
182 minetest
.place_node(pos
)
186 local function is_diggable(pos
)
187 if not pos
then return false end
188 local nd
=minetest
.get_node_or_nil(pos
)
189 if not nd
then return false end
190 local n
= minetest
.get_node_def(nd
.name
)
191 if n
and n
.diggable
then return true end
195 function scaffold
.dig(pos
)
196 if not inside_constraints(pos
) then return end
197 if is_diggable(pos
) then
198 minetest
.select_best_tool(nd
.name
)
199 if emicor
then emicor
.supertool()
201 minetest
.dig_node(pos
)
202 minetest
.select_best_tool(nd
.name
)
208 local mpath
= minetest
.get_modpath(minetest
.get_current_modname())
209 dofile(mpath
.. "/sapscaffold.lua")
210 dofile(mpath
.. "/slowscaffold.lua")
211 dofile(mpath
.. "/autofarm.lua")
212 dofile(mpath
.. "/railscaffold.lua")
213 dofile(mpath
.. "/wallbot.lua")
214 dofile(mpath
.. "/ow2bot.lua")
215 --dofile(mpath .. "/squarry.lua")
219 scaffold
.register_template_scaffold("Constrain", "scaffold_constrain", function(pos
)
221 end,false,function() scaffold
.reset() end)
223 scaffold
.register_template_scaffold("LockYaw", "scaffold_lockyaw", function(pos
)
224 if not scaffold
.wason
.scaffold_lockyaw
then
225 minetest
.settings
:set_bool('afly_snap',true)
227 end, false, function() minetest
.settings
:set_bool('afly_snap',false) end)
230 scaffold
.register_template_scaffold("CheckScaffold", "scaffold_check", function(pos
)
231 scaffold
.place_if_able(pos
)
234 scaffold
.register_template_scaffold("HereScaffold", "scaffold_here", function(pos
)
235 scaffold
.place_if_able(pos
)
236 end, {x
= 0, y
= 0, z
= 0})
238 scaffold
.register_template_scaffold("WaterScaffold", "scaffold_water", function(pos
)
239 if (pos
.x
% 2 + pos
.z
% 2) == 0 then
240 scaffold
.place_if_needed({
241 "mcl_buckets:bucket_water",
242 "mcl_core:water_source"
246 scaffold
.register_template_scaffold("WaterSpam", "scaffold_spamwater", function(pos
)
247 --if (pos.x % 2 + pos.z % 2) == 0 then
248 scaffold
.place_if_needed({
249 "mcl_buckets:bucket_water",
250 "mcl_core:water_source"
254 local function checknode(pos
)
255 local node
= minetest
.get_node_or_nil(pos
)
256 if node
then return true end
260 scaffold
.register_template_scaffold("TBM", "scaffold_tbm", function(pos
)
261 scaffold
.dig(ws
.dircoord(1,1,0))
262 scaffold
.dig(ws
.dircoord(1,0,0))
264 scaffold
.register_template_scaffold("TallTBM", "scaffold_ttbm", function(pos
)
298 for k
,v
in pairs(pos
) do
301 minetest
.settings
:set_bool('continuous_forward',true)
302 for k
,v
in pairs(pos
) do
303 local n
=minetest
.get_node_or_nil(v
)
304 if n
and n
.name
~= "air" then
305 minetest
.settings
:set_bool('continuous_forward',false)
313 scaffold
.register_template_scaffold("TriScaffold", "scaffold_three_wide", function(pos
)
314 scaffold
.place_if_able(pos
)
315 scaffold
.place_if_able(ws
.dircoord(0, -1, 1))
316 scaffold
.place_if_able(ws
.dircoord(0, -1, -1))
319 scaffold
.register_template_scaffold("headTriScaff", "scaffold_three_wide_head", function(pos
)
320 scaffold
.place_if_able(ws
.dircoord(0, 3, 0))
321 scaffold
.place_if_able(ws
.dircoord(0, 3, 1))
322 scaffold
.place_if_able(ws
.dircoord(0, 3, -1))
325 scaffold
.register_template_scaffold("QuintScaffold", "scaffold_five_wide", function(pos
)
326 scaffold
.place_if_able(pos
)
327 scaffold
.place_if_able(ws
.dircoord(0, -1, 1))
328 scaffold
.place_if_able(ws
.dircoord(0, -1, -1))
329 scaffold
.place_if_able(ws
.dircoord(0, -1, 2))
330 scaffold
.place_if_able(ws
.dircoord(0, -1, -2))
335 scaffold
.register_template_scaffold("RandomScaff", "scaffold_rnd", function(below
)
336 local n
= minetest
.get_node_or_nil(below
)
337 local nl
=nlist
.get('randomscaffold')
339 if n
and not scaffold
.in_list(n
.name
, nl
) then
341 scaffold
.place_if_needed(nl
, below
)