148 lines
4.4 KiB
Lua
148 lines
4.4 KiB
Lua
-- tool mods, by gsmanners
|
|
-- license: WTFPL
|
|
|
|
--------------------------------------------------
|
|
|
|
-- tool mods are Minetest modifications that add useful devices
|
|
--
|
|
-- the aim of this mod is to make tools that are simple, powerful, and fast
|
|
-- to be coherent, visually appealing, and as user friendly as possible
|
|
|
|
--------------------------------------------------
|
|
-- def
|
|
|
|
gs_tools = {}
|
|
|
|
local modpath = minetest.get_modpath("gs_tools")
|
|
gs_tools.modpath = modpath
|
|
|
|
--------------------------------------------------
|
|
-- modules
|
|
|
|
--dofile(modpath.."/crafts.lua")
|
|
|
|
dofile(modpath.."/axes.lua")
|
|
--dofile(modpath.."/ladders.lua")
|
|
dofile(modpath.."/sledges.lua")
|
|
--dofile(modpath.."/workbench.lua")
|
|
|
|
--------------------------------------------------
|
|
-- support
|
|
|
|
-- break a node and give the default drops
|
|
|
|
function gs_tools.drop_node(pos, digger, wielded, rank, group)
|
|
tool_name = wielded:get_name()
|
|
|
|
if tool_name:find("hammer", 1, true) then
|
|
-- check if we can drop this node
|
|
local node = minetest.get_node(pos)
|
|
local def = ItemStack({name=node.name}):get_definition()
|
|
|
|
if not def.diggable or (def.can_dig and not def.can_dig(pos,digger)) then return end
|
|
if minetest.is_protected(pos, digger:get_player_name()) then return end
|
|
|
|
local level = minetest.get_item_group(node.name, "level")
|
|
if rank >= level then
|
|
|
|
-- note that get_node_drops() is not future-safe
|
|
-- though no alternative currently exists
|
|
local drops = minetest.get_node_drops(node.name, wielded:get_name())
|
|
minetest.handle_node_drops(pos, drops, digger)
|
|
if minetest.get_item_group(minetest.get_node(pos).name, "cracky") > 0 then minetest.remove_node(pos) end
|
|
end
|
|
elseif tool_name:find("dirt_mover", 1, true) then
|
|
-- check if we can drop this node
|
|
local node = minetest.get_node(pos)
|
|
local def = ItemStack({name=node.name}):get_definition()
|
|
|
|
if not def.diggable or (def.can_dig and not def.can_dig(pos,digger)) then return end
|
|
if minetest.is_protected(pos, digger:get_player_name()) then return end
|
|
|
|
local level = minetest.get_item_group(node.name, "level")
|
|
if rank >= level then
|
|
|
|
-- note that get_node_drops() is not future-safe
|
|
-- though no alternative currently exists
|
|
local drops = minetest.get_node_drops(node.name, wielded:get_name())
|
|
minetest.handle_node_drops(pos, drops, digger)
|
|
if minetest.get_item_group(minetest.get_node(pos).name, "crumbly") > 0 then minetest.remove_node(pos) end
|
|
end
|
|
end
|
|
end
|
|
|
|
-- make a list of the 8 neighboring blocks around the pos a digger has targeted
|
|
|
|
function gs_tools.get_3x3s(pos, digger)
|
|
local r = {}
|
|
|
|
local a = 0 -- forward/backward
|
|
if math.abs(pos.x - digger:getpos().x) >
|
|
math.abs(pos.z - digger:getpos().z) then a = 1 end -- sideways
|
|
|
|
local b = 0 -- horizontal (default)
|
|
local q = digger:get_look_pitch()
|
|
if q < -0.78 or q > 0.78 then b = 1 end -- vertical
|
|
|
|
local c = 1
|
|
for x=-1,1 do
|
|
for y=-1,1 do
|
|
if x ~= 0 or y ~= 0 then
|
|
-- determine next perpendicular node
|
|
local k = {x=0, y=0, z=0}
|
|
if a > 0 then
|
|
k.z = pos.z + x
|
|
if b > 0 then
|
|
k.x = pos.x + y
|
|
k.y = pos.y
|
|
else
|
|
k.x = pos.x
|
|
k.y = pos.y + y
|
|
end
|
|
else
|
|
k.x = pos.x + x
|
|
if b > 0 then
|
|
k.y = pos.y
|
|
k.z = pos.z + y
|
|
else
|
|
k.y = pos.y + y
|
|
k.z = pos.z
|
|
end
|
|
end
|
|
|
|
r[c] = {x=k.x, y=k.y, z=k.z}
|
|
c = c + 1
|
|
end
|
|
end
|
|
end
|
|
|
|
return r
|
|
end
|
|
|
|
-- make a list of supported nodes that a chopped node has just dropped
|
|
|
|
function gs_tools.get_chopped(pos, group, digger)
|
|
-- check if the 8 surrounding it on the xyz pos are snappy (eg, grass and leaves in a area)
|
|
local p = pos
|
|
local pos2 = p
|
|
for x1=-1,1 do
|
|
for z1=-1,1 do
|
|
if minetest.get_item_group(minetest.get_node({x=p.x+x1, y=p.y, z=p.z+z1}).name, group) > 0 and minetest.get_item_group(minetest.get_node({x=p.x+x1, y=p.y, z=p.z+z1}).name, "leafdecay") > 0 then
|
|
if minetest.is_protected(pos, digger:get_player_name()) then
|
|
minetest.record_protection_violation(pos, digger:get_player_name())
|
|
return
|
|
end
|
|
local node=minetest.env:get_node({x=p.x+x1, y=p.y, z=p.z+z1})
|
|
if node.name == "air" or node.name == "ignore" then return end
|
|
if node.name == "mapgen:lava_source" then return end
|
|
if node.name == "mapgen:lava_flowing" then return end
|
|
if node.name == "mapgen:water_source" then return end
|
|
if node.name == "mapgen:water_flowing" then return end
|
|
if node.name == "ores:oil_flowing" then return end
|
|
if node.name == "ores:oil_source" then return end
|
|
minetest.remove_node({x=p.x+x1, y=p.y, z=p.z+z1})
|
|
end
|
|
end
|
|
end
|
|
end
|