Add screw changer tool

This commit is contained in:
Wuzzy 2024-10-08 19:15:20 +02:00
parent 8d867a18fa
commit 0e122855c8
7 changed files with 153 additions and 11 deletions

View File

@ -74,6 +74,9 @@ This is a list of special fields for node definitions that Lazarr! recognizes:
* `_lzr_inactive`: If the node has an 'inactive' counterpart, this contains the
itemstring of that 'inactive' counterpart.
Used by blocks that interact with laser
* `_lzr_fixed`: Node name of fixed (unmovable) variant of a laser block
* `_lzr_rotatable`: Node name of rotatable variant of a laser block (if it exists)
* `_lzr_takable`: Node name of takable variant of a laser block (if it exists)
* `_lzr_next_color`: Contains the name of the node with the next color in a
sequence of colors, for the color change tool
* `_lzr_prev_color`: Same as `_lzr_next_color`, but for the previous color

View File

@ -228,7 +228,8 @@ All levels by Wuzzy.
- `lzr_sounds_place_stone.*.ogg`:
- By StarNinjas
- License: CC0
- `lzr_laser_color_changer.ogg`:
- `lzr_laser_change_color.ogg`:
- `lzr_laser_change_screw.ogg`:
- by artisticdue
- Source: <https://opengameart.org/content/rpg-sound-pack> (`misc/random5.wav`)
- License: CC0

View File

@ -1408,6 +1408,9 @@ minetest.register_node("lzr_laser:barricade_on", {
_lzr_inactive = "lzr_laser:barricade",
})
-- The bomb is manually registered and not using the register_element
-- function.
-- TODO: Use register_element to register bomb
local def_bomb_takable = {
description = S("Bomb"),
@ -1415,9 +1418,12 @@ local def_bomb_takable = {
_tt_help = S("Explodes when fuse gets ignited by laser or fire").."\n"..
S("Destroys cracked blocks in a 3×3×3 area"),
tiles = {"lzr_laser_bomb_top.png", "lzr_laser_bomb_bottom.png", "lzr_laser_bomb_side.png"},
groups = { bomb = 1, breakable = 1, laser_destroys = 3, flammable = 2, rotatable = 1, takable = 1 },
groups = { bomb = 1, breakable = 1, laser_block = 1, laser_destroys = 3, flammable = 2, rotatable = 1, takable = 1 },
sounds = lzr_sounds.node_sound_metal_defaults(),
_lzr_active = "lzr_laser:bomb_takable_on",
_lzr_fixed = "lzr_laser:bomb_fixed",
_lzr_rotatable = "lzr_laser:bomb_rotatable",
_lzr_takable = "lzr_laser:bomb_takable",
_after_rotate = function()
lzr_laser.full_laser_update_if_needed()
end,
@ -1439,7 +1445,7 @@ local def_bomb_takable_on = {
"lzr_laser_bomb_bottom.png",
"lzr_laser_bomb_side.png",
},
groups = { bomb = 2, breakable = 1, not_in_creative_inventory = 1, rotatable = 3 },
groups = { bomb = 2, breakable = 1, laser_block = 1, not_in_creative_inventory = 1, rotatable = 3 },
sounds = lzr_sounds.node_sound_metal_defaults(),
on_construct = function(pos)
local handle_s = minetest.sound_play({name="lzr_laser_bomb_fuse", gain=0.5}, {pos=pos})
@ -1607,6 +1613,9 @@ local def_bomb_takable_on = {
end,
drop = "",
_lzr_inactive = "lzr_laser:bomb_takable",
_lzr_fixed = "lzr_laser:bomb_fixed_on",
_lzr_rotatable = "lzr_laser:bomb_rotatable_on",
_lzr_takable = "lzr_laser:bomb_takable_on",
_after_rotate = function()
lzr_laser.full_laser_update_if_needed()
end,
@ -1617,7 +1626,6 @@ def_bomb_fixed.tiles = {"lzr_laser_bomb_top.png^lzr_laser_fixed.png", "lzr_laser
def_bomb_fixed.description = S("@1 (fixed)", S("Bomb"))
def_bomb_fixed.groups.takable = nil
def_bomb_fixed.groups.rotatable = 3
def_bomb_fixed._lzr_active = "lzr_laser:bomb_fixed_on"
local def_bomb_fixed_on = table.copy(def_bomb_takable_on)
def_bomb_fixed_on.description = S("@1 (fixed)", S("Ignited Bomb"))
@ -1654,8 +1662,6 @@ def_bomb_rotatable_on.tiles = {
}
def_bomb_rotatable_on._lzr_inactive = "lzr_laser:bomb_rotatable"
minetest.register_node("lzr_laser:bomb_fixed", def_bomb_fixed)
minetest.register_node("lzr_laser:bomb_fixed_on", def_bomb_fixed_on)
minetest.register_node("lzr_laser:bomb_rotatable", def_bomb_rotatable)

View File

@ -320,10 +320,11 @@ lzr_laser.register_element = function(basename, def, options)
if options.not_pointable_if_off then
def_core.pointable = false
end
def_core._lzr_fixed = real_basename.."_fixed"
if options.allow_take then
def_core._lzr_takable = real_basename.."_takable"
end
if options.allow_rotatable then
if options.allow_rotate then
def_core._lzr_rotatable = real_basename.."_rotatable"
end
@ -381,6 +382,15 @@ lzr_laser.register_element = function(basename, def, options)
local def_core_on
if options.activate ~= false then
def_core_on = table.copy(def_core)
def_core_on._lzr_fixed = real_basename.."_fixed_on"
if options.allow_take then
def_core_on._lzr_takable = real_basename.."_takable_on"
end
if options.allow_rotate then
def_core_on._lzr_rotatable = real_basename.."_rotatable_on"
end
if def.__lzr_next_color then
def_core_on._lzr_next_color = def.__lzr_next_color.."_fixed_on"
def_core_on._lzr_prev_color = def.__lzr_prev_color.."_fixed_on"
@ -416,6 +426,7 @@ lzr_laser.register_element = function(basename, def, options)
if not options.keep_state_on_take then
def_core_on.drop = real_basename.."_fixed"
end
def_core_on._lzr_fixed = real_basename.."_fixed_on"
if options.allow_take then
def_core_on._lzr_takable = real_basename.."_takable_on"
end
@ -450,10 +461,16 @@ lzr_laser.register_element = function(basename, def, options)
if options.allow_rotate then
local def_rotatable = table.copy(def_core)
def_rotatable._lzr_fixed = real_basename.."_fixed"
if options.allow_take then
def_rotatable._lzr_takable = real_basename.."_takable"
end
def_rotatable._lzr_rotatable = real_basename.."_rotatable"
def_rotatable.tiles = def_spec.__tiles_rotatable_off
def_rotatable.overlay_tiles = def_spec.__overlay_tiles_rotatable_off
def_rotatable.groups.rotatable = 1
def_rotatable._lzr_unrotatable = real_basename.."_fixed"
def_rotatable.description = S("@1 (soft-fixed)", def.description)
if options.inactive ~= nil then
def_rotatable._lzr_inactive = options.inactive.."_rotatable"
@ -475,11 +492,17 @@ lzr_laser.register_element = function(basename, def, options)
if options.activate ~= false then
local def_rotatable_on = table.copy(def_core_on)
def_rotatable_on._lzr_fixed = real_basename.."_fixed_on"
if options.allow_take then
def_rotatable_on._lzr_takable = real_basename.."_takable_on"
end
def_rotatable_on._lzr_rotatable = real_basename.."_rotatable_on"
if def.__lzr_next_color then
def_rotatable_on._lzr_next_color = def.__lzr_next_color.."_rotatable_on"
def_rotatable_on._lzr_prev_color = def.__lzr_prev_color.."_rotatable_on"
end
def_rotatable_on._lzr_unrotatable = real_basename.."_fixed_on"
def_rotatable_on.tiles = def_spec.__tiles_rotatable_on
def_rotatable_on.overlay_tiles = def_spec.__overlay_tiles_rotatable_on
def_rotatable_on.light_source = def_spec.__light_source_on
@ -516,12 +539,18 @@ lzr_laser.register_element = function(basename, def, options)
if options.allow_take then
local def_takable = table.copy(def_core)
def_takable._lzr_fixed = real_basename.."_fixed"
if options.allow_rotate then
def_takable._lzr_rotatable = real_basename.."_rotatable"
end
def_takable._lzr_takable = real_basename.."_takable"
def_takable.tiles = def_spec.__tiles_takable_off
def_takable.overlay_tiles = def_spec.__overlay_tiles_takable_off
def_takable.groups.takable = 1
-- takable nodes are also always rotatable by implication
def_takable.groups.rotatable = 1
def_takable._lzr_untakable = real_basename.."_fixed"
def_takable.description = def.description
if options.inactive ~= nil then
def_takable._lzr_inactive = options.inactive.."_takable"
@ -543,7 +572,13 @@ lzr_laser.register_element = function(basename, def, options)
if options.activate ~= false then
local def_takable_on = table.copy(def_core_on)
def_takable_on._lzr_untakable = real_basename.."_fixed_on"
def_takable_on._lzr_fixed = real_basename.."_fixed_on"
if options.allow_rotate then
def_takable_on._lzr_rotatable = real_basename.."_rotatable_on"
end
def_takable_on._lzr_takable = real_basename.."_takable_on"
if def.__lzr_next_color then
def_takable_on._lzr_next_color = def.__lzr_next_color.."_takable_on"
def_takable_on._lzr_prev_color = def.__lzr_prev_color.."_takable_on"

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 416 B

View File

@ -88,6 +88,103 @@ minetest.register_tool("lzr_laser:color_changer", {
end,
})
minetest.register_tool("lzr_laser:screw_changer", {
description = S("Screw Changer"),
_tt_help = S("Cycles through screw types for blocks"),
inventory_image = "lzr_laser_screw_changer.png",
groups = { editor_tool = 1 },
on_use = function(itemstack, user, pointed_thing)
if pointed_thing.type ~= "node" then
return itemstack
end
local state = lzr_gamestate.get_state()
if state ~= lzr_gamestate.EDITOR and state ~= lzr_gamestate.DEV then
minetest.chat_send_player(user:get_player_name(), S("This tool only works in the level editor or development mode."))
return itemstack
end
local pos = pointed_thing.under
local node = minetest.get_node(pos)
if minetest.get_item_group(node.name, "laser_block") == 0 then
return itemstack
end
local def = minetest.registered_nodes[node.name]
local next_node
-- Takable node
if minetest.get_item_group(node.name, "takable") ~= 0 then
if def._lzr_fixed then
next_node = def._lzr_fixed
end
-- Rotatable node
elseif minetest.get_item_group(node.name, "rotatable") == 1 then
if def._lzr_takable then
next_node = def._lzr_takable
elseif def._lzr_fixed then
next_node = def._lzr_fixed
end
-- Fixed node
else
if def._lzr_rotatable then
next_node = def._lzr_rotatable
elseif def._lzr_takable then
next_node = def._lzr_takable
end
end
if next_node then
node.name = next_node
minetest.swap_node(pos, node)
minetest.sound_play({name="lzr_laser_change_screw", gain=0.4}, {pos=pos}, true)
end
return itemstack
end,
on_place = function(itemstack, user, pointed_thing)
if pointed_thing.type ~= "node" then
return itemstack
end
local state = lzr_gamestate.get_state()
if state ~= lzr_gamestate.EDITOR and state ~= lzr_gamestate.DEV then
minetest.chat_send_player(user:get_player_name(), S("This tool only works in the level editor or development mode."))
return itemstack
end
local pos = pointed_thing.under
local node = minetest.get_node(pos)
if minetest.get_item_group(node.name, "laser_block") == 0 then
return itemstack
end
local def = minetest.registered_nodes[node.name]
local next_node
-- Takable node
if minetest.get_item_group(node.name, "takable") ~= 0 then
if def._lzr_rotatable then
next_node = def._lzr_rotatable
elseif def._lzr_fixed then
next_node = def._lzr_fixed
end
-- Rotatable node
elseif minetest.get_item_group(node.name, "rotatable") == 1 then
if def._lzr_fixed then
next_node = def._lzr_fixed
elseif def._lzr_takable then
next_node = def._lzr_takable
end
-- Fixed node
else
if def._lzr_takable then
next_node = def._lzr_takable
elseif def._lzr_rotatable then
next_node = def._lzr_rotatable
end
end
if next_node then
node.name = next_node
minetest.swap_node(pos, node)
minetest.sound_play({name="lzr_laser_change_screw", gain=0.4}, {pos=pos}, true)
end
return itemstack
end,
})
local trigger_tool_modeinfo = {
[TRIGGER_MODE_SENDER] = {
img = "lzr_laser_trigger_tool_sender.png",