Files

79 lines
2.2 KiB
Lua

local utility = {}
function utility.is_creative(player)
if minetest.settings:get_bool("creative_mode") == true then
return true
end
local name = player:get_player_name()
if name == nil or name == "" then
return false
end
return minetest.check_player_privs(name, { creative = true })
end
function utility.is_replaceable(pos)
local node = minetest.registered_nodes[minetest.get_node(pos)]
if node == nil or node.name == "handholds_redo:holds" then return true end
return node.name == "air" or node.buildable_to
end
function utility.is_climbable(pos, level)
local def = minetest.registered_nodes[minetest.get_node(pos).name]
if def == nil then return false end
if def.groups == nil or def.groups.handholds == nil then return false end
return level >= def.groups.handholds
end
function utility.place_holds(itemstack, placer, pointed_thing)
if itemstack == nil then return end
local itemdef = itemstack:get_definition()
if itemdef == nil
or itemdef.groups == nil
or itemdef.groups.climbing_pick == nil then
return
end
if pointed_thing == nil or
pointed_thing.type ~= "node" or
pointed_thing.under.y + 1 == pointed_thing.above.y or
not utility.is_replaceable(pointed_thing.above) or
not utility.is_climbable(pointed_thing.under, itemdef.groups.climbing_pick) then
return
end
if minetest.is_protected(pointed_thing.under, placer:get_player_name()) or
minetest.is_protected(pointed_thing.above, placer:get_player_name()) then
minetest.record_protection_violation(pointed_thing.above, placer)
return
end
local rotation = minetest.dir_to_wallmounted(
vector.subtract(pointed_thing.under, pointed_thing.above)
)
minetest.set_node(pointed_thing.above, {
name = "handholds_redo:holds",
param2 = rotation
})
minetest.sound_play(
"default_dig_cracky",
{pos = pointed_thing.under, gain = 0.5, max_hear_distance = 8}
)
if not utility.is_creative(placer) then
local wdef = itemstack:get_definition()
itemstack:add_wear(256)
if itemstack:get_count() == 0 and wdef.sound and wdef.sound.breaks then
minetest.sound_play(wdef.sound.breaks, {
pos = pointed_thing.above,
gain = 0.5
})
end
end
return itemstack
end
return utility