10 local nodes
=nlist
.get("autominer")
13 local function sleep(n
) -- seconds
15 while os
.clock() - t0
<= n
do 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
]
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
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
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
]
43 local this_time
= groupdef
.times
[level
]
44 if this_time
< best_time
then
49 return best_time
< old_best_time
, best_time
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
)
67 player
:set_wield_index(new_index
)
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
85 if (checkgravel(rr
) or checklava(rr
)) then return minetest
.after(0.2,find_tnod
) 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}))
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})
98 if n
==nil or n
['name'] == 'air' then return end
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}))
104 if (minetest
.settings
:get_bool('aminer_active')) then
105 local hp
=minetest
.localplayer
:get_hp()
108 minetest
.after(0.2,autominer
.aminer
)
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
126 local nod
=find_tnod()
128 minetest
.display_chat_message('lava detected. stop.')
131 minetest
.localplayer
:set_pos(vector
.add(nod
,{x
=0.3,y
=-1.2,z
=0.3}))
133 minetest
.after(0.2, dighead
)
136 local function amine()
137 minetest
.after(1.0,rwarp
)
139 function autominer
.aminer()
142 dmg
=hpchange
.get_status()
144 minetest
.after(3.0,rwarp
)
146 minetest
.after(0.5,rwarp
)
151 minetest
.register_globalstep(function()
152 if os
.time() < lastch
+ 5 then return end
154 if ( minetest
.settings
:get_bool('aminer_active') ) then
161 minetest
.register_chatcommand("aminer", {
166 minetest
.settings
:set_bool("aminer_active",true)
170 minetest
.register_chatcommand("amine", {
174 minetest
.register_chatcommand("dhe", {
178 minetest
.register_on_damage_taken(function(hp
)
183 if (_G
["minetest"]["register_cheat"] ~= nil) then
184 minetest
.register_cheat("Autominer (!!! ALPHA!! this will lead to you dying!!!)", "Player", "aminer_active")
186 minetest
.settings
:set_bool('aminer_active',true)