diff --git a/CREDITS.md b/CREDITS.md
index c6ccfe4..f40f21a 100644
--- a/CREDITS.md
+++ b/CREDITS.md
@@ -49,6 +49,16 @@ Sounds:
- License: CC BY 3.0
- Origin:
- Changes were made
+- `lzr_laser_emitter_activate.ogg`:
+ - by PhonosUPF
+ - License: CC0
+- `lzr_levels_level_start.ogg`:
+ - by original\_sound
+ - License: CC BY 3.0
+- `lzr_levels_level_complete.ogg`:
+ - by Fupicat
+ - Edit by Wuzzy (higher pitch)
+ - License: CC0
- All other sounds come from Minetest Game (see license of Minetest Game 5.4.1 for details)
Code:
diff --git a/mods/lzr_hand/init.lua b/mods/lzr_hand/init.lua
index a0ab472..bf9ca43 100644
--- a/mods/lzr_hand/init.lua
+++ b/mods/lzr_hand/init.lua
@@ -3,6 +3,7 @@ minetest.override_item("", {
tool_capabilities = {
max_drop_level = 0,
groupcaps = {
+ takable = { times = { [1] = 0, [2] = 0, [3] = 0 } },
},
}
})
diff --git a/mods/lzr_laser/blocks.lua b/mods/lzr_laser/blocks.lua
index 399ada6..61c5cd1 100644
--- a/mods/lzr_laser/blocks.lua
+++ b/mods/lzr_laser/blocks.lua
@@ -97,7 +97,7 @@ local full_update = function()
lzr_laser.full_laser_update(lzr_globals.PLAYFIELD_START, lzr_globals.PLAYFIELD_END)
local done = lzr_laser.check_level_won()
if done then
- lzr_levels.next_level()
+ lzr_levels.level_complete()
end
end
@@ -109,7 +109,7 @@ local full_update_detector_placed = function()
lzr_laser.full_laser_update(lzr_globals.PLAYFIELD_START, lzr_globals.PLAYFIELD_END)
local done = lzr_laser.check_level_won(true)
if done then
- lzr_levels.next_level()
+ lzr_levels.level_complete()
end
end
@@ -133,7 +133,28 @@ local register_element = function(subname, def, options)
end
def_core.groups.breakable = 1
def_core.groups[subname] = 1
-
+ def_core.can_dig = function()
+ return lzr_gamestate.get_state() ~= lzr_gamestate.LEVEL_COMPLETE
+ end
+ def_core.on_place = function(itemstack, placer, pointed_thing)
+ if lzr_gamestate.get_state() == lzr_gamestate.LEVEL_COMPLETE then
+ -- Prevent node placement when in 'level complete' state
+ return itemstack
+ else
+ -- node's on_rightclick action takes precedence
+ if pointed_thing.type == "node" and placer then
+ local node = minetest.get_node(pointed_thing.under)
+ local def = minetest.registered_nodes[node.name]
+ local sneak = placer:get_player_control().sneak
+ if def and def.on_rightclick and not sneak then
+ def.on_rightclick(pointed_thing.under, node, placer, itemstack, pointed_thing)
+ return itemstack
+ end
+ end
+ -- Default node placement behavior
+ return minetest.item_place_node(itemstack, placer, pointed_thing)
+ end
+ end
local def_core_on = table.copy(def_core)
def_core_on.description = S("@1 (active)", def.description)
def_core_on._lzr_active = nil
@@ -151,13 +172,11 @@ local register_element = function(subname, def, options)
local def_takable = table.copy(def_core)
def_takable.tiles = def.tiles_takable_off
def_takable.groups.takable = 1
- def_takable.groups.dig_immediate = 3
def_takable.description = S("@1 (takable)", def.description)
def_takable._lzr_active = "lzr_laser:"..subname.."_takable_on"
local def_takable_on = table.copy(def_core_on)
def_takable_on.tiles = def.tiles_takable_on
def_takable_on.groups.takable = 1
- def_takable_on.groups.dig_immediate = 3
def_takable_on.description = S("@1 (takable, active)", def.description)
def_takable_on.drop = "lzr_laser:"..subname.."_takable"
def_takable_on._lzr_inactive = "lzr_laser:"..subname.."_takable"
@@ -311,16 +330,27 @@ register_element("emitter", {
},
on_rightclick = function(pos, node)
+ if lzr_gamestate.get_state() == lzr_gamestate.LEVEL_COMPLETE then
+ return
+ end
local nname
+ local on = false
if node.name == "lzr_laser:emitter" then
nname = "lzr_laser:emitter_on"
+ on = true
elseif node.name == "lzr_laser:emitter_on" then
nname = "lzr_laser:emitter"
elseif node.name == "lzr_laser:emitter_takable" then
nname = "lzr_laser:emitter_takable_on"
+ on = true
elseif node.name == "lzr_laser:emitter_takable_on" then
nname = "lzr_laser:emitter_takable"
end
+ if on then
+ minetest.sound_play({name="lzr_laser_emitter_activate", gain=1.0}, {pos=pos}, true)
+ else
+ minetest.sound_play({name="lzr_laser_emitter_activate", gain=0.8}, {pos=pos, pitch=0.7}, true)
+ end
minetest.swap_node(pos, {name=nname, param2=node.param2})
full_update()
end,
diff --git a/mods/lzr_laser/sounds/lzr_laser_emitter_activate.ogg b/mods/lzr_laser/sounds/lzr_laser_emitter_activate.ogg
new file mode 100644
index 0000000..db67e96
Binary files /dev/null and b/mods/lzr_laser/sounds/lzr_laser_emitter_activate.ogg differ
diff --git a/mods/lzr_levels/init.lua b/mods/lzr_levels/init.lua
index dbf501a..b51a805 100644
--- a/mods/lzr_levels/init.lua
+++ b/mods/lzr_levels/init.lua
@@ -92,6 +92,22 @@ function lzr_levels.start_level(level)
lzr_levels.prepare_and_build_level(level)
lzr_messages.show_message(player, S("Level @1", level), 3)
lzr_gamestate.set_state(lzr_gamestate.LEVEL)
+ minetest.sound_play({name = "lzr_levels_level_enter", gain = 1}, {to_player=player:get_player_name()}, true)
+end
+
+function lzr_levels.level_complete()
+ if lzr_gamestate.get_state() == lzr_gamestate.LEVEL_COMPLETE then
+ return false
+ end
+ local player = get_singleplayer()
+ lzr_messages.show_message(player, S("Level @1 complete!", current_level), 3)
+ minetest.sound_play({name = "lzr_levels_level_complete", gain = 1}, {to_player=player:get_player_name()}, true)
+ lzr_gamestate.set_state(lzr_gamestate.LEVEL_COMPLETE)
+ minetest.after(3, function()
+ if lzr_gamestate.get_state() == lzr_gamestate.LEVEL_COMPLETE then
+ lzr_levels.next_level()
+ end
+ end)
end
function lzr_levels.next_level()
diff --git a/mods/lzr_levels/sounds/lzr_levels_level_complete.ogg b/mods/lzr_levels/sounds/lzr_levels_level_complete.ogg
new file mode 100644
index 0000000..2f54d9a
Binary files /dev/null and b/mods/lzr_levels/sounds/lzr_levels_level_complete.ogg differ
diff --git a/mods/lzr_levels/sounds/lzr_levels_level_enter.ogg b/mods/lzr_levels/sounds/lzr_levels_level_enter.ogg
new file mode 100644
index 0000000..4973af7
Binary files /dev/null and b/mods/lzr_levels/sounds/lzr_levels_level_enter.ogg differ
diff --git a/mods/lzr_tools/init.lua b/mods/lzr_tools/init.lua
index 5617c6d..fefb4c9 100644
--- a/mods/lzr_tools/init.lua
+++ b/mods/lzr_tools/init.lua
@@ -17,6 +17,7 @@ minetest.register_tool("lzr_tools:ultra_pickaxe", {
crumbly = instadig,
oddly_breakable_by_hand = instadig,
dig_immediate = instadig,
+ takable = instadig,
breakable = instadig,
},
},
diff --git a/mods/screwdriver2/init.lua b/mods/screwdriver2/init.lua
index a03e3e5..54925d7 100644
--- a/mods/screwdriver2/init.lua
+++ b/mods/screwdriver2/init.lua
@@ -138,6 +138,9 @@ end
-- 1: on_use parameters -> axis/amount/etc.
-- 2: param2/axis/amount/etc. -> new param2
function screwdriver.use(itemstack, player, pointed_thing, is_right_click)
+ if lzr_gamestate.get_state() == lzr_gamestate.LEVEL_COMPLETE then
+ return
+ end
if pointed_thing.type ~= "node" then return end
local pos = pointed_thing.under
diff --git a/mods/screwdriver2/mod.conf b/mods/screwdriver2/mod.conf
index 39e3d6a..3144230 100644
--- a/mods/screwdriver2/mod.conf
+++ b/mods/screwdriver2/mod.conf
@@ -1,3 +1,4 @@
name = screwdriver2
description = A more intuitive node rotation tool.
-optional_depends = screwdriver, worldedit_commands, default
\ No newline at end of file
+depends = lzr_gamestate
+optional_depends = screwdriver, worldedit_commands, default