wasplib updates
[waspsaliva.git] / clientmods / scaffold / railscaffold.lua
blob02757f0230f5f0c3327d3d6938e07d69e68f783b
1 -- CC0/Unlicense Emilia/cora 2020
3 -- south:5,1.5
4 --west:-x,1.5,-5
5 --east:-x,1.5,5
6 -- north 5,1.5(3096:2.5,25025:1.5),z
7 --#local storage = minetest.get_mod_storage()
8 local ground = {
9 "mesecons_torch:redstoneblock"
12 local rails = {
13 "mcl_minecarts:golden_rail",
14 "mcl_minecarts:rail"
17 local tunnelmaterial = {
18 'mcl_core:glass_light_blue',
19 'mcl_core:cobble',
20 'mcl_core:stone',
21 'mcl_nether:netherrack',
22 'mcl_core:dirt',
23 'mcl_core:andesite',
24 'mcl_core:diorite',
25 'mcl_core:granite'
26 --"mesecons_torch:redstoneblock"
29 local function is_rail(pos)
30 pos=vector.round(pos)
31 if pos.y ~= 1 then return false end
32 if pos.z > 5 then
33 if pos.x == -5 then return "north" end
34 elseif pos.z < -5 then
35 if pos.x == 5 then return "south" end
36 end
37 if pos.x > 5 then
38 if pos.z == 5 then return "east" end
39 elseif pos.x < -5 then
40 if pos.z == -5 then return "west" end
41 end
42 return false
43 end
45 local function get_railnode(pos)
46 if is_rail(pos) then
47 return "mcl_minecarts:golden_rail"
48 end
49 if is_rail(vector.add(pos,{x=0,y=1,x=0})) then
50 return "mesecons_torch:redstoneblock"
51 end
52 return false
53 end
55 local function is_lantern(pos)
56 local dir=ws.getdir()
57 pos=vector.round(pos)
58 if dir == "north" or dir == "south" then
59 if pos.z % 8 == 0 then
60 return true
61 end
62 else
63 if pos.x % 8 == 0 then
64 return true
65 end
66 end
67 return false
68 end
70 ws.rg('RailTool','Scaffold','railtool',function()
71 local poss=ws.get_reachable_positions(5)
72 for k,p in pairs(poss) do
73 local n=get_railnode(p)
74 if n then ws.place(p,n) end
75 end
76 end)
80 minetest.register_cheat("RailT",'Bots','scaffold_railtunnel')
81 local function checknode(pos)
82 local node = minetest.get_node_or_nil(pos)
83 if node and node.name ~="mesecons_torch:redstoneblock" and not node.name:find("_rail") then return true end
84 return false
85 end
86 local function dignodes(poss)
87 for k,v in pairs(poss) do
88 if checknode(v) then ws.dig(v) end
89 end
90 end
91 local function blockliquids()
92 local lp=ws.lp:get_pos()
93 local liquids={'mcl_core:lava_source','mcl_core:water_source','mcl_core:lava_flowing','mcl_core:water_flowing'}
94 local bn=minetest.find_nodes_near(lp, 1, liquids, true)
95 for kk,vv in pairs(bn) do
96 if vv.y > lp.y then scaffold.place_if_needed(tunnelmaterial,vv) end
97 end
98 end
100 local function invcheck(item)
101 if mintetest.switch_to_item(item) then return true end
102 refill.refill_at(ws.dircoord(1,1,0),'railkit')
105 local direction="north"
107 ws.rg("RailBot","Bots", "railbot", function()
108 local lp = ws.dircoord(0,0,0)
109 local below = ws.dircoord(0,-1,0)
110 blockliquids()
112 local goon=true
113 for i=-4,4,1 do
115 ws.dig(ws.dircoord(i,1,0))
116 if checknode(ws.dircoord(i,0,0)) then ws.dig(ws.dircoord(i,0,0)) end
117 if checknode(ws.dircoord(i,-1,0)) then ws.dig(ws.dircoord(i,-1,0)) end
118 scaffold.place_if_needed(ground, ws.dircoord(i,-1,0))
119 scaffold.place_if_needed(rails, ws.dircoord(i,0,0))
121 local lpn=minetest.get_node_or_nil(ws.dircoord(i,0,0))
122 local bln=minetest.get_node_or_nil(ws.dircoord(i,-1,0))
123 if not ( bln and bln.name=="mesecons_torch:redstoneblock" and lpn and lpn.name == "mcl_minecarts:golden_rail_on" ) then
124 goon=false
126 local lpos=ws.dircoord(i,2,0)
127 if is_lantern(lpos) then
128 local ln=minetest.get_node_or_nil(lpos)
129 if not ln or ln.name ~= 'mcl_ocean:sea_lantern' then
130 goon=false
131 ws.dig(lpos)
132 scaffold.place_if_needed({'mcl_ocean:sea_lantern'}, lpos)
137 if (goon) then minetest.settings:set_bool('continuous_forward',true)
138 else minetest.settings:set_bool('continuous_forward',false) end
141 end,
142 function()--startfunc
143 direction=ws.get_dir()
144 storage:set_string('BOTDIR', direction)
145 end,function() --stopfunc
146 direction=""
147 storage:set_string('BOTDIR',direction)
148 end,{'afly_axissnap','continuous_forward','autorefill'}) --'scaffold_ltbm'
150 ws.on_connect(function()
151 sdir=storage:get_string('BOTDIR')
152 if sdir ~= "" then
153 ws.set_dir(sdir)
154 else
155 minetest.settings:set_bool('railbot',false)
157 end)
159 scaffold.register_template_scaffold("LanternTBM", "scaffold_ltbm", function()
160 local dir=ws.getdir()
161 local lp=vector.round(ws.dircoord(0,0,0))
162 local pl=is_lantern(lp)
163 if pl then
164 local lpos=ws.dircoord(0,2,0)
165 local nd=minetest.get_node_or_nil(lpos)
166 if nd and nd.name ~= 'mcl_ocean:sea_lantern' then
167 ws.dig(lpos)
168 minetest.after("0",function()
169 scaffold.place_if_needed({'mcl_ocean:sea_lantern'}, lpos)
170 ws.place(lpos,'mcl_ocean:sea_lantern')
171 end)
174 end)