2014-05-15 21:48:45 +01:00

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