forked from Kimapr/nodecore-skyblock
138 lines
3.6 KiB
Lua
138 lines
3.6 KiB
Lua
|
-- LUALOCALS < ---------------------------------------------------------
|
||
|
local ItemStack, ipairs, minetest, nodecore, pairs, type
|
||
|
= ItemStack, ipairs, minetest, nodecore, pairs, type
|
||
|
-- LUALOCALS > ---------------------------------------------------------
|
||
|
|
||
|
nodecore.amcoremod()
|
||
|
|
||
|
local modname = minetest.get_current_modname()
|
||
|
|
||
|
local metadescs = {
|
||
|
"Tote (1 Slot)",
|
||
|
"Tote (2 Slots)",
|
||
|
"Tote (3 Slots)",
|
||
|
"Tote (4 Slots)",
|
||
|
"Tote (5 Slots)",
|
||
|
"Tote (6 Slots)",
|
||
|
"Tote (7 Slots)",
|
||
|
"Tote (8 Slots)",
|
||
|
}
|
||
|
|
||
|
local function totedug(pos, _, _, digger)
|
||
|
local dump
|
||
|
for dx = -1, 1 do
|
||
|
for dz = -1, 1 do
|
||
|
local p = {x = pos.x + dx, y = pos.y, z = pos.z + dz}
|
||
|
local n = minetest.get_node(p)
|
||
|
local d = minetest.registered_items[n.name] or {}
|
||
|
if d and d.groups and d.groups.totable then
|
||
|
local m = minetest.get_meta(p):to_table()
|
||
|
for _, v1 in pairs(m.inventory or {}) do
|
||
|
for k2, v2 in pairs(v1) do
|
||
|
if type(v2) == "userdata" then
|
||
|
v1[k2] = v2:to_string()
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
dump = dump or {}
|
||
|
dump[#dump + 1] = {
|
||
|
x = dx,
|
||
|
z = dz,
|
||
|
n = n,
|
||
|
m = m
|
||
|
}
|
||
|
minetest.remove_node(p)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
local drop = ItemStack(modname .. ":handle")
|
||
|
if dump then
|
||
|
local meta = drop:get_meta()
|
||
|
meta:set_string("carrying", minetest.serialize(dump))
|
||
|
meta:set_string("description", metadescs[#dump])
|
||
|
end
|
||
|
minetest.handle_node_drops(pos, {drop}, digger)
|
||
|
end
|
||
|
|
||
|
local function toteplace(stack, _, pointed)
|
||
|
local pos = nodecore.buildable_to(pointed.under) and pointed.under
|
||
|
or nodecore.buildable_to(pointed.above) and pointed.above
|
||
|
if not pos then return stack end
|
||
|
|
||
|
stack = ItemStack(stack)
|
||
|
local inv = stack:get_meta():get_string("carrying")
|
||
|
inv = inv and (inv ~= "") and minetest.deserialize(inv)
|
||
|
if not inv then
|
||
|
minetest.set_node(pos, {name = stack:get_name()})
|
||
|
stack:set_count(stack:get_count() - 1)
|
||
|
return stack
|
||
|
end
|
||
|
|
||
|
local commit = {{pos, {name = stack:get_name()}, {}}}
|
||
|
for _, v in ipairs(inv) do
|
||
|
if commit then
|
||
|
local p = {x = pos.x + v.x, y = pos.y, z = pos.z + v.z}
|
||
|
if not nodecore.buildable_to(p) then
|
||
|
commit = nil
|
||
|
else
|
||
|
commit[#commit + 1] = {p, v.n, v.m}
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
if commit then
|
||
|
for _, v in ipairs(commit) do
|
||
|
minetest.set_node(v[1], v[2])
|
||
|
minetest.get_meta(v[1]):from_table(v[3])
|
||
|
end
|
||
|
stack:set_count(stack:get_count() - 1)
|
||
|
end
|
||
|
return stack
|
||
|
end
|
||
|
|
||
|
minetest.register_node(modname .. ":handle", {
|
||
|
description = "Tote Handle",
|
||
|
meta_descriptions = metadescs,
|
||
|
drawtype = "nodebox",
|
||
|
node_box = nodecore.fixedbox(
|
||
|
{-0.5, -0.5, -0.5, 0.5, -3/8, 0.5},
|
||
|
{-0.5, -3/8, -0.5, -3/8, 3/8, -3/8},
|
||
|
{-0.5, -3/8, 3/8, -3/8, 3/8, 0.5},
|
||
|
{3/8, -3/8, -0.5, 0.5, 3/8, -3/8},
|
||
|
{3/8, -3/8, 3/8, 0.5, 3/8, 0.5},
|
||
|
{-0.5, 1/4, -0.5, -3/8, 3/8, 0.5},
|
||
|
{3/8, 1/4, -0.5, 0.5, 3/8, 0.5},
|
||
|
{-0.5, 3/8, -1/8, 0.5, 0.5, 1/8}
|
||
|
),
|
||
|
selection_box = nodecore.fixedbox(),
|
||
|
paramtype = "light",
|
||
|
tiles = {
|
||
|
"nc_lode_annealed.png",
|
||
|
"nc_lode_annealed.png",
|
||
|
"nc_lode_annealed.png^[lowpart:75:nc_tree_tree_side.png"
|
||
|
.. "^[lowpart:12.5:nc_lode_annealed.png"
|
||
|
},
|
||
|
groups = {
|
||
|
snappy = 1,
|
||
|
container = 1,
|
||
|
fire_fuel = 5
|
||
|
},
|
||
|
stack_max = 1,
|
||
|
after_dig_node = totedug,
|
||
|
on_place = toteplace,
|
||
|
drop = "",
|
||
|
sounds = nodecore.sounds("nc_lode_annealed")
|
||
|
})
|
||
|
|
||
|
nodecore.register_craft({
|
||
|
label = "craft tote handle",
|
||
|
norotate = true,
|
||
|
nodes = {
|
||
|
{match = "nc_woodwork:frame", replace = "air"},
|
||
|
{y = -1, match = "nc_lode:block_annealed", replace = modname .. ":handle"},
|
||
|
{y = -1, x = 1, match = "nc_woodwork:shelf"},
|
||
|
{y = -1, x = -1, match = "nc_woodwork:shelf"},
|
||
|
{y = -1, z = 1, match = "nc_woodwork:shelf"},
|
||
|
{y = -1, z = -1, match = "nc_woodwork:shelf"},
|
||
|
}
|
||
|
})
|