Respawn hidden ship parrots on ship build+enter

This commit is contained in:
Wuzzy 2024-12-12 14:06:00 +01:00
parent 685cf694d6
commit e7334ffe78
4 changed files with 49 additions and 15 deletions

View File

@ -55,8 +55,7 @@ local reset_player = function(player, reset_type)
lzr_levels.leave_level(true, false) lzr_levels.leave_level(true, false)
elseif reset_type == "out_of_bounds_ship" then elseif reset_type == "out_of_bounds_ship" then
-- Intentionally no message -- Intentionally no message
local spawn = vector.add(lzr_globals.MENU_SHIP_POS, lzr_globals.MENU_SHIP_PLAYER_RESPAWN_OFFSET) lzr_menu.teleport_player_to_ship(player, "skulls")
player:set_pos(spawn)
elseif reset_type == "out_of_bounds" then elseif reset_type == "out_of_bounds" then
--~ Message when you move out of the level boundaries. You may be creative in the translation --~ Message when you move out of the level boundaries. You may be creative in the translation
lzr_messages.show_message(player, S("Where yer thinks yar goin, landlubber?"), 6.0, 0xFF0000) lzr_messages.show_message(player, S("Where yer thinks yar goin, landlubber?"), 6.0, 0xFF0000)

View File

@ -1258,8 +1258,7 @@ function lzr_levels.game_completed()
lzr_ambience.reduce_ambience(SOUND_TIME_LEVEL_SET_COMPLETE) lzr_ambience.reduce_ambience(SOUND_TIME_LEVEL_SET_COMPLETE)
minetest.sound_play({name = "lzr_levels_level_set_complete", gain = 1.0}, nil, true) minetest.sound_play({name = "lzr_levels_level_set_complete", gain = 1.0}, nil, true)
lzr_levels.leave_level(nil, false) lzr_levels.leave_level(nil, false)
player:set_pos(vector.add(lzr_globals.MENU_SHIP_POS, lzr_globals.MENU_SHIP_PLAYER_WINSPAWN_OFFSET)) lzr_menu.teleport_player_to_ship(player, "victory")
player:set_look_horizontal(math.pi)
core_levels_completed = true core_levels_completed = true
minetest.log("action", "[lzr_levels] Game completed!") minetest.log("action", "[lzr_levels] Game completed!")
return true return true
@ -1301,13 +1300,11 @@ function lzr_levels.go_to_menu(fallout)
-- Select respawn position -- Select respawn position
if fallout then if fallout then
-- Respawn pos when fallout was triggered (i.e. fell out of level or crushed) -- Respawn pos when fallout was triggered (i.e. fell out of level or crushed)
player:set_pos(vector.add(lzr_globals.MENU_SHIP_POS, lzr_globals.MENU_SHIP_PLAYER_RESPAWN_OFFSET)) lzr_menu.teleport_player_to_ship(player, "skulls")
else else
-- Normal player spawn pos in ship -- Normal player spawn pos in ship
player:set_pos(vector.add(lzr_globals.MENU_SHIP_POS, lzr_globals.MENU_SHIP_PLAYER_SPAWN_OFFSET)) lzr_menu.teleport_player_to_ship(player, "captain")
end end
player:set_look_horizontal(0)
player:set_look_vertical(0)
lzr_gamestate.set_state(lzr_gamestate.MENU) lzr_gamestate.set_state(lzr_gamestate.MENU)
end end

View File

@ -12,19 +12,25 @@ lzr_menu = {}
lzr_menu.SHIP_SIZE = nil lzr_menu.SHIP_SIZE = nil
local registered_on_ship_builts = {} local registered_on_ship_builts = {}
-- Regiser callback function that is called when the ship has been built -- Register callback function that is called when the ship has been built
-- and is ready for play. Will be called only once for the current game session. -- and is ready for play. Will be called only once for the current game session.
function lzr_menu.register_on_ship_built(func) function lzr_menu.register_on_ship_built(func)
table.insert(registered_on_ship_builts, func) table.insert(registered_on_ship_builts, func)
end end
local registered_on_ship_rebuilts = {} local registered_on_ship_rebuilts = {}
-- Regiser callback function that is called when the ship has been built -- Register callback function that is called when the ship has been built
-- OR rebuilt (after an update). -- OR rebuilt (after an update).
function lzr_menu.register_on_ship_rebuilt(func) function lzr_menu.register_on_ship_rebuilt(func)
table.insert(registered_on_ship_rebuilts, func) table.insert(registered_on_ship_rebuilts, func)
end end
local registered_on_player_ship_enters = {}
-- Register callback function that is called when the player enters the ship.
function lzr_menu.register_on_player_ship_enter(func)
table.insert(registered_on_player_ship_enters, func)
end
local place_gold_stash = function(gold_blocks) local place_gold_stash = function(gold_blocks)
if gold_blocks <= 0 then if gold_blocks <= 0 then
return return
@ -116,7 +122,12 @@ local emerge_callback = function(blockpos, action, calls_remaining, param)
-- setting the player pos should guarantee the player -- setting the player pos should guarantee the player
-- stands on solid ground -- stands on solid ground
local player = minetest.get_player_by_name("singleplayer") local player = minetest.get_player_by_name("singleplayer")
player:set_pos(vector.add(lzr_globals.MENU_SHIP_POS, lzr_globals.MENU_SHIP_PLAYER_SPAWN_OFFSET)) lzr_menu.teleport_player_to_ship(player, "captain")
-- Call 'built' callbacks
for f=1, #registered_on_ship_builts do
registered_on_ship_builts[f]()
end
-- Call 'built' callbacks -- Call 'built' callbacks
for f=1, #registered_on_ship_builts do for f=1, #registered_on_ship_builts do
@ -141,10 +152,10 @@ end
minetest.register_on_joinplayer(function(player) minetest.register_on_joinplayer(function(player)
emerge_ship(lzr_globals.MENU_SHIP_POS) emerge_ship(lzr_globals.MENU_SHIP_POS)
-- NOTE: This set_pos happens BEFORE the ship was actually built, so the -- NOTE: This teleport happens BEFORE the ship was actually built, so the
-- player may fall for a moment. This set_pos is thus not reliable -- player may fall for a moment. This is thus not reliable
-- and is only made in prepatation for the future ship spawn. -- and is only made in prepatation for the future ship spawn.
player:set_pos(vector.add(lzr_globals.MENU_SHIP_POS, lzr_globals.MENU_SHIP_PLAYER_SPAWN_OFFSET)) lzr_menu.teleport_player_to_ship(player, "captain")
player:set_look_horizontal(0) player:set_look_horizontal(0)
player:set_look_vertical(0) player:set_look_vertical(0)
local inv = player:get_inventory() local inv = player:get_inventory()
@ -897,6 +908,28 @@ function lzr_menu.spawn_hidden_parrot(parrot_name)
ent:_init(parrot_name) ent:_init(parrot_name)
end end
function lzr_menu.teleport_player_to_ship(player, location)
if location == "captain" then
player:set_pos(vector.add(lzr_globals.MENU_SHIP_POS, lzr_globals.MENU_SHIP_PLAYER_SPAWN_OFFSET))
player:set_look_horizontal(0)
player:set_look_vertical(0)
elseif location == "skulls" then
player:set_pos(vector.add(lzr_globals.MENU_SHIP_POS, lzr_globals.MENU_SHIP_PLAYER_RESPAWN_OFFSET))
player:set_look_horizontal(0)
player:set_look_vertical(0)
elseif location == "victory" then
player:set_pos(vector.add(lzr_globals.MENU_SHIP_POS, lzr_globals.MENU_SHIP_PLAYER_WINSPAWN_OFFSET))
player:set_look_horizontal(math.pi)
player:set_look_vertical(0)
else
minetest.log("error", "[lzr_menu] Tried to teleport player to invalid ship location: "..tostring(location))
return
end
for f=1, #registered_on_player_ship_enters do
registered_on_player_ship_enters[f](player, location)
end
end
function lzr_menu.remove_hidden_parrots() function lzr_menu.remove_hidden_parrots()
if not lzr_menu.SHIP_SIZE then if not lzr_menu.SHIP_SIZE then
return return

View File

@ -441,7 +441,12 @@ lzr_menu.register_on_ship_built(function()
end) end)
lzr_menu.register_on_ship_rebuilt(function() lzr_menu.register_on_ship_rebuilt(function()
spawn_menu_parrots()
if lzr_parrot_npc.were_all_hidden_parrots_found() then if lzr_parrot_npc.were_all_hidden_parrots_found() then
lzr_menu.place_painting("parrot_finder") lzr_menu.place_painting("parrot_finder")
end end
end) end)
lzr_menu.register_on_player_ship_enter(function()
spawn_menu_parrots()
end)