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