133 lines
4.1 KiB
Lua
133 lines
4.1 KiB
Lua
local minetest,math,name = minetest,math,minetest.localplayer:get_name()
|
|
local nether = minetest.mod_channel_join(name..":nether_teleporters")
|
|
|
|
--nether teleporters are animation based
|
|
--the animation must finish before the teleport is initialized
|
|
local hud_bg_id = nil --aether portal bg
|
|
local nether_cool_off_timer = 0 --use this to stop players teleporting back and forth
|
|
local init_sound = nil
|
|
local teleport_sound = nil
|
|
local opacity = 0
|
|
|
|
minetest.register_globalstep(function(dtime)
|
|
if not minetest.localplayer or not minetest.camera then
|
|
return
|
|
end
|
|
--use this for player cooloff timer also to not overload server
|
|
if nether_cool_off_timer > 0 then
|
|
nether_cool_off_timer = nether_cool_off_timer - dtime
|
|
if nether_cool_off_timer <= 0 then
|
|
nether_cool_off_timer = 0
|
|
end
|
|
end
|
|
|
|
local pos = minetest.localplayer:get_pos()
|
|
pos.y = pos.y + 0.1
|
|
|
|
local node = minetest.get_node_or_nil(pos)
|
|
|
|
if node and node.name == "nether:portal" and nether_cool_off_timer == 0 then
|
|
if init_sound == nil then
|
|
init_sound = minetest.sound_play("portal_initialize",{gain=0})
|
|
minetest.sound_fade(init_sound, 0.34, 1)
|
|
end
|
|
if hud_bg_id == nil then
|
|
hud_bg_id = minetest.localplayer:hud_add({
|
|
hud_elem_type = "image", -- see HUD element types, default "text"
|
|
position = {x=0.5, y=0.5},
|
|
name = "", -- default ""
|
|
scale = {x=-100, y=-100}, -- default {x=0,y=0}
|
|
text = "nether_portal_gui.png^[opacity:"..opacity, -- default ""
|
|
})
|
|
|
|
elseif opacity < 255 then
|
|
--make the hud fade in
|
|
opacity = opacity + (dtime*100)
|
|
|
|
minetest.localplayer:hud_change(hud_bg_id, "text", "nether_portal_gui.png^[opacity:"..opacity)
|
|
end
|
|
elseif hud_bg_id then
|
|
--play heavenly sounds
|
|
|
|
if init_sound and node and node.name == "nether:portal" then
|
|
minetest.sound_fade(init_sound, -0.4, 0)
|
|
init_sound = nil
|
|
teleport_sound = minetest.sound_play("portal_teleported",{gain=1})
|
|
minetest.sound_fade(teleport_sound, -0.1, 0)
|
|
teleport_sound = nil
|
|
end
|
|
|
|
--player left portal before teleporting
|
|
if nether_cool_off_timer == 0 then
|
|
opacity = opacity - (dtime*100)
|
|
minetest.localplayer:hud_change(hud_bg_id, "text", "nether_portal_gui.png^[opacity:"..opacity)
|
|
|
|
if init_sound then
|
|
minetest.sound_fade(init_sound, -0.4, 0)
|
|
init_sound = nil
|
|
end
|
|
|
|
if opacity <= 0 then
|
|
minetest.localplayer:hud_remove(hud_bg_id)
|
|
hud_bg_id = nil
|
|
opacity = 0
|
|
end
|
|
--teleport complete animation
|
|
elseif nether_cool_off_timer > 0 then
|
|
|
|
opacity = opacity - (dtime*100)
|
|
minetest.localplayer:hud_change(hud_bg_id, "text", "nether_portal_gui.png^[opacity:"..opacity)
|
|
|
|
if opacity <= 0 then
|
|
minetest.localplayer:hud_remove(hud_bg_id)
|
|
hud_bg_id = nil
|
|
opacity = 0
|
|
end
|
|
else
|
|
init_sound = nil
|
|
end
|
|
elseif hud_bg_id then
|
|
minetest.localplayer:hud_remove(hud_bg_id)
|
|
hud_bg_id = nil
|
|
opacity = 0
|
|
end
|
|
|
|
--initialize teleport command to server
|
|
if hud_bg_id and nether_cool_off_timer == 0 then
|
|
if opacity >= 255 then
|
|
nether:send_all("teleport me")
|
|
--can't use any portal for 7 seconds
|
|
nether_cool_off_timer = 6 --if you read this, you'll notice the nether cool off timer is 6 and this is 7 ;)
|
|
minetest.after(1,function()
|
|
local after_newpos = minetest.localplayer:get_pos().y
|
|
if after_newpos < -10000 and after_newpos > -20000 then
|
|
--cancel old songs
|
|
if current_song then
|
|
minetest.sound_fade(current_song,-0.4,0)
|
|
end
|
|
|
|
minetest.after(math.random(3,5)+math.random(),function()
|
|
if after_newpos < -10000 and after_newpos > -20000 then
|
|
--backup in case server lags out
|
|
if current_song then
|
|
minetest.sound_fade(current_song,-0.4,0)
|
|
end
|
|
local song = 90000+math.random(0,1)
|
|
--print(song)
|
|
song_playing = song_table[song].name
|
|
current_song = minetest.sound_play(song_table[song].name,{gain=song_volume})
|
|
song_index = song
|
|
|
|
end
|
|
end)
|
|
elseif song_playing and (song_index == 90000 or song_index == 90001) then
|
|
minetest.sound_fade(current_song,-0.4,0)
|
|
song_playing = nil
|
|
song_index = nil
|
|
song_tick = 0
|
|
end
|
|
end)
|
|
end
|
|
end
|
|
end)
|