2015-08-06 21:19:42 +02:00
|
|
|
local rope = {}
|
2020-09-09 17:05:44 +02:00
|
|
|
local S = minetest.get_translator("xdecor")
|
2015-07-04 15:54:40 +02:00
|
|
|
|
2023-06-30 15:21:06 +02:00
|
|
|
local ropesounds = default.node_sound_leaves_defaults()
|
|
|
|
|
2023-06-30 15:00:57 +02:00
|
|
|
-- Code by Mirko K. (modified by Temperest, Wulfsdad, kilbith and Wuzzy) (License: GPL).
|
2016-03-25 14:43:47 +01:00
|
|
|
function rope.place(itemstack, placer, pointed_thing)
|
2015-07-04 15:54:40 +02:00
|
|
|
if pointed_thing.type == "node" then
|
2023-06-30 15:00:57 +02:00
|
|
|
-- Use pointed node's on_rightclick function first, if present
|
|
|
|
if placer and not placer:get_player_control().sneak then
|
|
|
|
local node = minetest.get_node(pointed_thing.under)
|
|
|
|
if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then
|
|
|
|
return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, placer, itemstack) or itemstack
|
|
|
|
end
|
|
|
|
end
|
2016-08-06 00:00:06 +02:00
|
|
|
local pos = pointed_thing.above
|
2023-06-30 15:00:57 +02:00
|
|
|
-- Check protection
|
|
|
|
if minetest.is_protected(pos, placer:get_player_name()) and
|
|
|
|
not minetest.check_player_privs(placer, "protection_bypass") then
|
|
|
|
minetest.record_protection_violation(pos, placer:get_player_name())
|
2016-08-05 21:33:53 +02:00
|
|
|
return itemstack
|
|
|
|
end
|
2015-07-04 15:54:40 +02:00
|
|
|
|
2023-06-30 15:00:57 +02:00
|
|
|
local oldnode = minetest.get_node(pos)
|
|
|
|
local stackname = itemstack:get_name()
|
2023-07-10 20:24:51 +02:00
|
|
|
-- Limit max. rope length to max. stack size
|
|
|
|
-- Prevents the rope to extend infinitely in Creative Mode
|
|
|
|
local max_ropes = itemstack:get_stack_max()
|
2023-06-30 15:00:57 +02:00
|
|
|
|
2023-06-30 15:21:06 +02:00
|
|
|
local start_pos = table.copy(pos)
|
2023-07-10 20:24:51 +02:00
|
|
|
local ropes_placed = 0
|
|
|
|
while oldnode.name == "air" and not itemstack:is_empty() and ropes_placed < max_ropes do
|
2015-08-03 11:22:30 +02:00
|
|
|
local newnode = {name = stackname, param1 = 0}
|
2015-07-04 15:54:40 +02:00
|
|
|
minetest.set_node(pos, newnode)
|
2023-06-30 15:14:20 +02:00
|
|
|
if not minetest.is_creative_enabled(placer:get_player_name()) then
|
|
|
|
itemstack:take_item()
|
|
|
|
end
|
2015-07-04 15:54:40 +02:00
|
|
|
pos.y = pos.y - 1
|
|
|
|
oldnode = minetest.get_node(pos)
|
2023-07-10 20:24:51 +02:00
|
|
|
ropes_placed = ropes_placed + 1
|
2015-07-04 15:54:40 +02:00
|
|
|
end
|
2023-06-30 15:21:06 +02:00
|
|
|
-- Play placement sound manually
|
2023-07-10 20:24:51 +02:00
|
|
|
if ropes_placed > 0 then
|
2023-06-30 15:21:06 +02:00
|
|
|
minetest.sound_play(ropesounds.place, {pos=start_pos}, true)
|
|
|
|
end
|
2015-07-04 15:54:40 +02:00
|
|
|
end
|
2019-07-23 14:03:20 +02:00
|
|
|
|
2015-07-04 15:54:40 +02:00
|
|
|
return itemstack
|
|
|
|
end
|
|
|
|
|
2016-09-03 17:32:08 +02:00
|
|
|
function rope.remove(pos, oldnode, digger, rope_name)
|
2015-07-04 15:54:40 +02:00
|
|
|
local num = 0
|
2019-07-23 14:03:20 +02:00
|
|
|
local below = {x = pos.x, y = pos.y, z = pos.z}
|
2015-08-03 11:22:30 +02:00
|
|
|
local digger_inv = digger:get_inventory()
|
|
|
|
|
2015-07-04 15:54:40 +02:00
|
|
|
while minetest.get_node(below).name == rope_name do
|
|
|
|
minetest.remove_node(below)
|
|
|
|
below.y = below.y - 1
|
|
|
|
num = num + 1
|
|
|
|
end
|
2019-07-23 14:03:20 +02:00
|
|
|
|
2015-08-05 23:55:17 +02:00
|
|
|
if num == 0 then return end
|
2023-06-30 15:14:20 +02:00
|
|
|
|
2023-06-30 15:21:06 +02:00
|
|
|
-- Play dig sound manually
|
|
|
|
minetest.sound_play(ropesounds.dug, {pos=pos}, true)
|
|
|
|
|
2023-07-10 20:34:50 +02:00
|
|
|
-- Give/drop rope items
|
2023-06-30 15:14:20 +02:00
|
|
|
local creative = minetest.is_creative_enabled(digger:get_player_name())
|
|
|
|
if not creative or not digger_inv:contains_item("main", rope_name) then
|
|
|
|
if creative then
|
|
|
|
num = 1
|
|
|
|
end
|
|
|
|
local item = rope_name.." "..num
|
|
|
|
local leftover = digger_inv:add_item("main", rope_name.." "..num)
|
|
|
|
if not leftover:is_empty() then
|
|
|
|
minetest.add_item(pos, leftover)
|
|
|
|
end
|
|
|
|
end
|
2019-07-23 14:03:20 +02:00
|
|
|
|
2015-07-04 15:54:40 +02:00
|
|
|
return true
|
|
|
|
end
|
|
|
|
|
|
|
|
xdecor.register("rope", {
|
2020-09-09 17:05:44 +02:00
|
|
|
description = S("Rope"),
|
2015-07-04 15:54:40 +02:00
|
|
|
drawtype = "plantlike",
|
|
|
|
walkable = false,
|
|
|
|
climbable = true,
|
2023-07-10 20:34:50 +02:00
|
|
|
groups = {dig_immediate = 3, flammable = 3},
|
2015-07-04 15:54:40 +02:00
|
|
|
tiles = {"xdecor_rope.png"},
|
|
|
|
inventory_image = "xdecor_rope_inv.png",
|
|
|
|
wield_image = "xdecor_rope_inv.png",
|
2016-02-15 19:32:49 +01:00
|
|
|
selection_box = xdecor.pixelbox(8, {{3, 0, 3, 2, 8, 2}}),
|
2023-07-10 20:26:36 +02:00
|
|
|
node_placement_prediction = "",
|
2016-09-03 17:32:08 +02:00
|
|
|
on_place = rope.place,
|
2019-07-23 14:03:20 +02:00
|
|
|
|
2023-07-10 20:34:50 +02:00
|
|
|
after_dig_node = function(pos, oldnode, oldmetadata, digger)
|
|
|
|
pos = vector.new(pos.x, pos.y-1, pos.z)
|
|
|
|
rope.remove(pos, oldnode, digger, "xdecor:rope")
|
2023-06-30 01:42:50 +02:00
|
|
|
end,
|
2023-06-30 15:21:06 +02:00
|
|
|
sounds = ropesounds,
|
2015-07-04 15:54:40 +02:00
|
|
|
})
|
2017-08-28 07:41:14 +02:00
|
|
|
|
|
|
|
-- Recipes
|
|
|
|
|
|
|
|
minetest.register_craft({
|
|
|
|
output = "xdecor:rope",
|
|
|
|
recipe = {
|
|
|
|
{"farming:string"},
|
|
|
|
{"farming:string"},
|
|
|
|
{"farming:string"}
|
|
|
|
}
|
2019-07-23 14:03:20 +02:00
|
|
|
})
|