incrementaltp: respect physics overrides
[waspsaliva.git] / clientmods / autominer / init.lua
blobfc5add1a9d9bbceff397a363f6b3ef52382f0633
1 ---
2 -- autominer
5 autominer = {}
6 local dmg=false
7 local digging=false
8 local radius=6
10 local nodes=nlist.get("autominer")
13 local function sleep(n) -- seconds
14 local t0 = os.clock()
15 while os.clock() - t0 <= n do end
16 end
17 local function shuffle(tbl)
18 for i = #tbl, 2, -1 do
19 local j = math.random(i)
20 tbl[i], tbl[j] = tbl[j], tbl[i]
21 end
22 return tbl
23 end
24 local function checklava(pos)
25 local n=minetest.find_node_near(pos, 2, {'mcl_core:lava_source','mcl_core:lava_flowing'}, true)
26 if n == nil then return false end
27 return true
28 end
29 local function checkgravel(pos)
30 local n=minetest.find_node_near(pos, 1, {'mcl_core:gravel','mcl_core:sand'}, true)
31 if n == nil then return false end
32 return true
33 end
35 -- shamelessly stolen from dragonfire autotool
36 local function check_tool(stack, node_groups, old_best_time)
37 local toolcaps = stack:get_tool_capabilities()
38 if not toolcaps then return end
39 local best_time = old_best_time
40 for group, groupdef in pairs(toolcaps.groupcaps) do
41 local level = node_groups[group]
42 if level then
43 local this_time = groupdef.times[level]
44 if this_time < best_time then
45 best_time = this_time
46 end
47 end
48 end
49 return best_time < old_best_time, best_time
50 end
52 local function amautotool(pos)
53 local player = minetest.localplayer
54 local inventory = minetest.get_inventory("current_player")
55 local node=minetest.get_node_or_nil(pos)
56 local node_groups = minetest.get_node_def(node.name).groups
57 local new_index = player:get_wield_index()
58 local is_better, best_time = false, math.huge
59 is_better, best_time = check_tool(player:get_wielded_item(), node_groups, best_time)
60 is_better, best_time = check_tool(inventory.hand[1], node_groups, best_time)
61 for index, stack in pairs(inventory.main) do
62 is_better, best_time = check_tool(stack, node_groups, best_time)
63 if is_better then
64 new_index = index
65 end
66 end
67 player:set_wield_index(new_index)
68 end
70 local function find_tnod()
71 local pos = minetest.localplayer:get_pos()
72 local rr = vector.add(pos,{x=0,y=0,z=radius})
73 local pos1 = vector.add(pos,{x=radius,y=radius,z=radius})
74 local pos2 = vector.add(pos,{x=-radius,y=-radius,z=-radius})
75 local rt=shuffle(minetest.find_nodes_in_area(pos1, pos2, shuffle(nodes), true))
76 for k,v in pairs(rt) do
77 for kk,vv in pairs(shuffle(v)) do
78 -- minetest.display_chat_message("Found nodes:" ..dump(rt))
79 if ( vv.y > -57 ) and not checkgravel(vv) and not checklava(vv) then
80 rr=vv
81 break
82 end
83 end
84 end
85 if (checkgravel(rr) or checklava(rr)) then return minetest.after(0.2,find_tnod) end
86 return rr
87 -- return rt
88 end
89 local function get_hnode()
90 local ppos=minetest.localplayer:get_pos()
91 local n=minetest.get_node_or_nil(vector.add(ppos,{x=0,y=1,z=0}))
92 return n
93 end
94 local function dighead()
95 if not minetest.localplayer then return end
96 local ppos=vector.add(minetest.localplayer:get_pos(),{x=0,y=1,z=0})
97 local n=get_hnode()
98 if n==nil or n['name'] == 'air' then return end
99 --amautotool(ppos)
100 minetest.localplayer:set_wield_index(1)
101 minetest.dig_node(ppos)
102 minetest.dig_node(vector.add(ppos,{x=0,y=1,z=0}))
103 digging=false
104 if (minetest.settings:get_bool('aminer_active')) then
105 local hp=minetest.localplayer:get_hp()
106 local hn=get_hnode()
107 if (hp > 17) then
108 minetest.after(0.2,autominer.aminer )
109 else
110 minetest.display_chat_message("taken too much damage. wait.")
111 local ppos=vector.add(minetest.localplayer:get_pos(),{x=0,y=1,z=0})
112 minetest.dig_node(ppos)
113 minetest.dig_node(vector.add(ppos,{x=0,y=1,z=0}))
114 minetest.after(1.0,function() minetest.dig_node(vector.add(ppos,{x=0,y=0,z=0})) end )
115 minetest.after(1.4,function() minetest.dig_node(vector.add(ppos,{x=0,y=1,z=0})) end )
116 minetest.after(1.8,function() minetest.dig_node(vector.add(ppos,{x=0,y=0,z=0})) end )
117 minetest.after(2.5,function() minetest.dig_node(vector.add(ppos,{x=0,y=1,z=0})) end )
118 -- minetest.settings:set_bool("aminer_active",false)
123 local function rwarp()
124 if not (minetest.settings:get_bool("aminer_active")) then return end
125 digging=true
126 local nod=find_tnod()
127 if not nod then
128 minetest.display_chat_message('lava detected. stop.')
129 return
131 minetest.localplayer:set_pos(vector.add(nod,{x=0.3,y=-1.2,z=0.3}))
132 dighead()
133 minetest.after(0.2, dighead)
136 local function amine()
137 minetest.after(1.0,rwarp)
139 function autominer.aminer()
140 if not digging then
141 digging=true
142 dmg=hpchange.get_status()
143 if dmg then
144 minetest.after(3.0,rwarp)
145 else
146 minetest.after(0.5,rwarp)
150 local lastch=0
151 minetest.register_globalstep(function()
152 if os.time() < lastch + 5 then return end
153 lastch=os.time()
154 if ( minetest.settings:get_bool('aminer_active') ) then
155 dmg=true
156 digging=false
157 autominer.aminer()
159 end)
161 minetest.register_chatcommand("aminer", {
162 description = "",
163 func = function()
164 dmg=true
165 digging=false
166 minetest.settings:set_bool("aminer_active",true)
167 autominer.aminer()
168 end,
170 minetest.register_chatcommand("amine", {
171 description = "",
172 func = amine
174 minetest.register_chatcommand("dhe", {
175 description = "",
176 func = dighead
178 minetest.register_on_damage_taken(function(hp)
179 dmg=true
180 end)
183 if (_G["minetest"]["register_cheat"] ~= nil) then
184 minetest.register_cheat("Autominer (!!! ALPHA!! this will lead to you dying!!!)", "Player", "aminer_active")
185 else
186 minetest.settings:set_bool('aminer_active',true)