Press injecting into storeboxes

This commit is contained in:
Aaron Suen 2020-09-29 21:28:34 -04:00
parent 9a23e1f65f
commit a63b38f72a
2 changed files with 44 additions and 24 deletions

View File

@ -3,26 +3,49 @@ local ItemStack, minetest, nodecore, vector
= ItemStack, minetest, nodecore, vector
-- LUALOCALS > ---------------------------------------------------------
local function checktarget(data)
local target = vector.subtract(vector.multiply(
data.pointed.under, 2), data.pointed.above)
local node = minetest.get_node(target)
local def = minetest.registered_items[node.name] or {walkable = true}
if def.groups and def.groups.visinv and (def.groups.is_stack_only
or def.storebox_access and def.storebox_access({
type = "node",
above = target,
under = vector.subtract(vector.multiply(
target, 2), data.pointed.under)
})) then
data.intostorebox = target
return true
end
return not def.walkable
end
local function doitemeject(pos, data)
local stack = nodecore.stack_get(pos)
if (not stack) or stack:is_empty() then return end
local ctr = {
x = data.axis.x ~= 0 and data.axis.x or pos.x,
y = data.axis.y ~= 0 and data.axis.y or pos.y,
z = data.axis.z ~= 0 and data.axis.z or pos.z
}
local vel = vector.add(
vector.subtract(pos, ctr),
vector.subtract(data.pointed.under, data.pointed.above)
)
local doorlv = minetest.get_item_group(minetest.get_node(
data.pointed.above).name, "door") or 0
local one = ItemStack(stack:to_string())
one:set_count(1)
nodecore.item_eject(
vector.add(pos, vector.multiply(vel, 0.25)),
one, 0, 1, vector.multiply(vel, 2 + doorlv)
)
if data.intostorebox then
one = nodecore.stack_add(data.intostorebox, one)
if not one:is_empty() then return end
else
local ctr = {
x = data.axis.x ~= 0 and data.axis.x or pos.x,
y = data.axis.y ~= 0 and data.axis.y or pos.y,
z = data.axis.z ~= 0 and data.axis.z or pos.z
}
local vel = vector.add(
vector.subtract(pos, ctr),
vector.subtract(data.pointed.under, data.pointed.above)
)
local doorlv = minetest.get_item_group(minetest.get_node(
data.pointed.above).name, "door") or 0
nodecore.item_eject(
vector.add(pos, vector.multiply(vel, 0.25)),
one, 0, 1, vector.multiply(vel, 2 + doorlv)
)
end
nodecore.witness(pos, "door catapult")
stack:take_item(1)
if stack:is_empty() and nodecore.node_group("is_stack_only", pos) then
@ -41,9 +64,7 @@ nodecore.register_craft({
check = function(pos, data)
local stack = nodecore.stack_get(pos)
if (not stack) or stack:is_empty() then return end
local backstop = vector.subtract(vector.multiply(
data.pointed.under, 2), data.pointed.above)
return not nodecore.match(backstop, {walkable = true})
return checktarget(data)
end,
after = doitemeject
})
@ -59,11 +80,9 @@ nodecore.register_craft({
local stack = nodecore.stack_get(pos)
if (not stack) or stack:is_empty() then return end
local pt = data.pointed
local backstop = vector.subtract(vector.multiply(
pt.under, 2), pt.above)
if nodecore.match(backstop, {walkable = true}) then return end
if not checktarget(data) then return end
local pt = data.pointed
local node = minetest.get_node(pt.under)
local def = minetest.registered_items[node.name] or {}
if not def.storebox_access then return end
@ -71,7 +90,8 @@ nodecore.register_craft({
local access = {
type = "node",
above = vector.add(vector.multiply(
vector.subtract(pt.above, pt.under), -1), pt.under),
vector.subtract(pt.above, pt.under),
-1), pt.under),
under = pt.under
}
return def.storebox_access(access)

View File

@ -66,7 +66,7 @@ nodecore.register_craft({
action = "press",
label = "press node craft",
priority = -1,
nodes = {{match = {groups = {stack_as_node = true}}}},
nodes = {{match = {groups = {stack_as_node = true, stacked = false}}}},
check = function(pos, data)
if not backstop(pos, vector.subtract(data.pointed.under,
data.pointed.above), 4) then return end