Add multi-signal doors, basic device deployment, and a target trigger.

This commit is contained in:
Signal 2025-11-17 03:04:16 -05:00
parent 1b2199705b
commit 3bf1d5c6a0
24 changed files with 656 additions and 74 deletions

View file

@ -52,14 +52,21 @@ function ns.swap_character(m)
ns.apply_vix(m)
end
if artifact.sidekick.ref then
-- We don't need to have the sidekick entity during testing.
if artifact.sidekick.pos or not artifact.debug then
-- `m.pos` includes eye_height, and we don't want that here.
local pos = m.object:get_pos()
local yaw = m.yaw
local pitch = m.pitch
m.object:set_pos(artifact.sidekick.ref.object:get_pos())
if not artifact.sidekick.pos then
artifact.sidekick.pos = pos
end
m.object:set_pos(artifact.sidekick.pos)
m.object:set_look_horizontal(artifact.sidekick.yaw)
m.object:set_look_vertical(artifact.sidekick.pitch)
if not artifact.sidekick.ref then
minetest.add_entity(pos, "artifact:sidekick")
end
artifact.sidekick.ref.object:set_pos(pos)
artifact.sidekick.ref.object:set_yaw(yaw)
artifact.sidekick.ref.object:set_bone_override("Head", m.object:get_bone_override("Head"))
@ -76,6 +83,7 @@ function ns.swap_character(m)
}
if e.blackrod then
e.blackrod:remove()
e.blackrod = nil
end
else
e.object:set_properties {
@ -101,7 +109,6 @@ include "key.lua"
include "vix.lua"
artifact.sidekick = setmetatable(minetest.deserialize(db:get("sidekick") or "return nil") or {
pos = vector.zero(),
pitch = 0,
yaw = 0,
character = "vix",
@ -121,12 +128,14 @@ minetest.register_entity(":artifact:sidekick", {
initial_properties = {
visual = "mesh",
mesh = "artifact_character.gltf",
textures = {"artifact_key.png"},
textures = {"artifact_vix.png"},
visual_size = vector.new(1,1,1) *0.8,
physical = true,
collisionbox = {
-0.3, 0,-0.3,
0.3, 1.77, 0.3
}
},
collide_with_objects = false
},
_interact_marker_offset = function() return vector.new(0, 1.1,0) end,
_interact_time = 0.4,
@ -134,7 +143,7 @@ minetest.register_entity(":artifact:sidekick", {
if data then
extend(e, minetest.deserialize(data) or {})
end
if artifact.sidekick.character == "vix" then
if artifact.sidekick.character == "key" then
e.object:set_properties {
textures = {"artifact_key.png"},
visual_size = vector.new(1,1,1) *0.88
@ -149,9 +158,9 @@ minetest.register_entity(":artifact:sidekick", {
if artifact.sidekick.ref then
e.object:remove()
return
else
artifact.sidekick.ref = e
end
artifact.sidekick.pos = e.object:get_pos()
artifact.sidekick.ref = e
end,
on_deactivate = function(e)
artifact.sidekick.ref = nil
@ -161,6 +170,10 @@ minetest.register_entity(":artifact:sidekick", {
cahracter = e.character
}
end,
-- We need this to ensure that the stored position takes gravity into account.
on_step = function(e)
artifact.sidekick.pos = e.object:get_pos()
end,
on_interact = function(e, m)
ns.swap_character(m)
end

View file

@ -2,5 +2,33 @@ local ns = artifact
function ns.do_whack(m)
if m.pointed_node then
local pos = m.pointed_node.under
local node = minetest.get_node(pos)
local def = minetest.registered_nodes[node.name]
if not def.groups.whackable then return end
minetest.remove_node(pos)
minetest.add_particlespawner {
pos = {
min = pos:offset(-0.5, -0.5, -0.5),
max = pos:offset(0.5, 0.5, 0.5)
},
vel = {
min = vector.new(-1, 0, -1) *1.5,
max = vector.new(1, 2, 1) *1.5
},
acc = vector.new(0,-9.81,0),
collisiondetection = true,
amount = 50,
node = {name = node.name},
time = 0.1
}
elseif m.pointed_obj and m.pointed_obj.on_whack then
if m.pointed_obj:on_whack() then
-- For use in artifact_help.
if artifact.on_whacked then
artifact.on_whacked()
end
end
end
end

View file

@ -6,7 +6,7 @@ minetest.register_entity(":artifact:burst", {
textures = {"blank.png"},
pointable = false,
physical = true,
collide_with_objects = false,
-- collide_with_objects = false,
collisionbox = {
-0.2, -0.2, -0.2,
0.2, 0.2, 0.2
@ -49,6 +49,13 @@ minetest.register_entity(":artifact:burst", {
time = 0.1,
}
e.object:remove()
if movement.collisions[1].type == "node" then
local pos = movement.collisions[1].node_pos
local name = minetest.get_node(pos).name
if minetest.registered_nodes[name].on_impact then
minetest.registered_nodes[name].on_impact(pos)
end
end
end
end,
impulse = function(e, vel)