fix railbot
[waspsaliva.git] / clientmods / scaffold / init.lua
blobbec65223cc226be13bdeb7631d7eda4b64df027c
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 scaffold.constrain1 = false
10 scaffold.constrain2 = false
11 local hwps={}
13 local storage=minetest.get_mod_storage()
15 scaffold.wason = {}
17 local nextact = {}
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
25 return function()
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)
29 func(tgt)
30 end
31 end
32 end
34 function scaffold.register_template_scaffold(name, setting, func, offset, funcstop)
35 ws.rg(name,'Scaffold',setting,scaffold.template(setting, func, offset),funcstop )
36 end
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)
41 local xmax=wpos2.x
42 local xmin=wpos1.x
44 local ymax=wpos2.y
45 local ymin=wpos1.y
47 local zmax=wpos2.z
48 local zmin=wpos1.z
49 if wpos1.x > wpos2.x then
50 xmax=wpos1.x
51 xmin=wpos2.x
52 end
53 if wpos1.y > wpos2.y then
54 ymax=wpos1.y
55 ymin=wpos2.y
56 end
57 if wpos1.z > wpos2.z then
58 zmax=wpos1.z
59 zmin=wpos2.z
60 end
61 if between(tpos.x,xmin,xmax) and between(tpos.y,ymin,ymax) and between(tpos.z,zmin,zmax) then
62 return true
63 end
64 return false
65 end
67 local function set_hwp(name,pos)
68 ws.display_wp(pos,name)
69 end
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)
77 end
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)
84 end
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)
91 table.remove(hwps,k)
92 end
93 end
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
98 end
99 return false
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)
125 if n then
126 minetest.localplayer:set_wield_index(n)
127 return true
130 return false
133 function scaffold.in_list(val, list)
134 if type(list) ~= "table" then return false end
135 for i, v in ipairs(list) do
136 if v == val then
137 return true
140 return false
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
146 local lastact=0
147 local lastplc=0
148 local lastdig=0
149 local actint=10
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
154 lastplc=os.time()
156 place = place or minetest.place_node
158 local node = minetest.get_node_or_nil(pos)
159 if not node then return end
160 -- already there
161 if node and scaffold.in_list(node.name, items) then
162 return true
163 else
164 local swapped = scaffold.find_any_swap(items)
166 -- need to place
167 if swapped and scaffold.can_place_at(pos) then
168 place(pos)
169 return true
170 -- can't place
171 else
172 return false
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
192 return false
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)
204 return false
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)
232 end)
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"
243 }, pos)
245 end)
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"
251 }, pos)
252 --end
253 end)
254 local function checknode(pos)
255 local node = minetest.get_node_or_nil(pos)
256 if node then return true end
257 return false
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))
263 end)
264 scaffold.register_template_scaffold("TallTBM", "scaffold_ttbm", function(pos)
265 pos = {
267 ws.dircoord(1,4,2),
268 ws.dircoord(1,3,2),
269 ws.dircoord(1,2,2),
270 ws.dircoord(1,1,2),
271 ws.dircoord(1,0,2),
273 ws.dircoord(1,4,-2),
274 ws.dircoord(1,3,-2),
275 ws.dircoord(1,2,-2),
276 ws.dircoord(1,1,-2),
277 ws.dircoord(1,0,-2),
280 ws.dircoord(1,4,1),
281 ws.dircoord(1,3,1),
282 ws.dircoord(1,2,1),
283 ws.dircoord(1,1,1),
284 ws.dircoord(1,0,1),
286 ws.dircoord(1,4,-1),
287 ws.dircoord(1,3,-1),
288 ws.dircoord(1,2,-1),
289 ws.dircoord(1,1,-1),
290 ws.dircoord(1,0,-1),
292 ws.dircoord(1,4,0),
293 ws.dircoord(1,3,0),
294 ws.dircoord(1,2,0),
295 ws.dircoord(1,1,0),
296 ws.dircoord(1,0,0)
298 for k,v in pairs(pos) do
299 scaffold.dig(v)
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)
308 end)
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))
317 end)
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))
323 end)
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))
331 end)
334 if nlist then
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')
338 table.shuffle(nl)
339 if n and not scaffold.in_list(n.name, nl) then
340 scaffold.dig(below)
341 scaffold.place_if_needed(nl, below)
343 end)