write something there
This commit is contained in:
commit
b4b6c08f4f
8546 changed files with 309825 additions and 0 deletions
197
mods/ethereal/flight.lua
Normal file
197
mods/ethereal/flight.lua
Normal file
|
@ -0,0 +1,197 @@
|
|||
|
||||
-- translation and settings
|
||||
|
||||
local S = minetest.get_translator("ethereal")
|
||||
local flight_secs = minetest.settings:get("ethereal.flightpotion_duration") or (5 * 60)
|
||||
local timer_check = 5 -- seconds per check
|
||||
|
||||
-- get player timer
|
||||
|
||||
local function get_timer(user)
|
||||
|
||||
if not user then return end
|
||||
|
||||
local meta = user:get_meta() ; if not meta then return "" end
|
||||
|
||||
return meta:get_string("ethereal:fly_timer") or ""
|
||||
end
|
||||
|
||||
-- do we have fly privs
|
||||
|
||||
local function has_fly(name)
|
||||
return minetest.get_player_privs(name).fly
|
||||
end
|
||||
|
||||
-- set player timer
|
||||
|
||||
local function set_timer(user, timer)
|
||||
|
||||
local meta = user:get_meta() ; if not meta then return end
|
||||
|
||||
meta:set_string("ethereal:fly_timer", timer)
|
||||
end
|
||||
|
||||
-- give or revoke fly priv
|
||||
|
||||
local function set_flight(user, set)
|
||||
|
||||
local name = user and user:get_player_name() ; if not name then return end
|
||||
local privs = minetest.get_player_privs(name)
|
||||
|
||||
privs.fly = set
|
||||
|
||||
minetest.set_player_privs(name, privs)
|
||||
|
||||
-- when flight removed set timer to temp position
|
||||
if set ~= true then set_timer(user, "-99") end
|
||||
end
|
||||
|
||||
-- after function
|
||||
|
||||
local function ethereal_set_flight(user)
|
||||
|
||||
local name = user and user:get_player_name() ; if not name then return end
|
||||
|
||||
local timer = tonumber(get_timer(user)) or 0
|
||||
|
||||
-- if timer ran out then remove 'fly' privelage
|
||||
if timer <= 0 and timer ~= -99 then
|
||||
|
||||
set_flight(user, nil)
|
||||
|
||||
return
|
||||
end
|
||||
|
||||
local privs = minetest.get_player_privs(name)
|
||||
|
||||
-- have we already applied 'fly' privelage?
|
||||
if not privs.fly then set_flight(user, true) end
|
||||
|
||||
-- handle timer
|
||||
timer = timer - timer_check
|
||||
|
||||
-- show expiration message and play sound
|
||||
if timer <= 10 then
|
||||
|
||||
minetest.chat_send_player(name, minetest.get_color_escape_sequence("#ff5500")
|
||||
.. S("Flight timer about to expire!"))
|
||||
|
||||
minetest.sound_play("default_dig_dig_immediate",
|
||||
{to_player = name, gain = 1.0}, true)
|
||||
end
|
||||
|
||||
set_timer(user, timer) -- set update timer
|
||||
|
||||
-- restart checks
|
||||
minetest.after(timer_check, function()
|
||||
ethereal_set_flight(user)
|
||||
end)
|
||||
end
|
||||
|
||||
-- on join / leave
|
||||
|
||||
minetest.register_on_joinplayer(function(player)
|
||||
|
||||
-- wait 2 seconds before doing flight checks on player
|
||||
minetest.after(2.0, function(player)
|
||||
|
||||
-- get player name and timer
|
||||
local name = player and player:get_player_name() ; if not name then return end
|
||||
local timer = get_timer(player)
|
||||
|
||||
-- if timer is blank and player can already fly then default and return
|
||||
if timer == "" and has_fly(name) then
|
||||
|
||||
set_timer(player, "-99")
|
||||
|
||||
return
|
||||
end
|
||||
|
||||
timer = tonumber(timer) or 0
|
||||
|
||||
-- if timer is set to default then return
|
||||
if timer == -99 then return end
|
||||
|
||||
-- if we got this far and player is flying then start countdown check
|
||||
if has_fly(name) then
|
||||
|
||||
minetest.after(timer_check, function()
|
||||
ethereal_set_flight(player)
|
||||
end)
|
||||
end
|
||||
|
||||
end, player)
|
||||
end)
|
||||
|
||||
-- potion item
|
||||
|
||||
minetest.register_node("ethereal:flight_potion", {
|
||||
description = S("Flight Potion"),
|
||||
drawtype = "plantlike",
|
||||
tiles = {"ethereal_flight_potion.png"},
|
||||
inventory_image = "ethereal_flight_potion.png",
|
||||
wield_image = "ethereal_flight_potion.png",
|
||||
paramtype = "light",
|
||||
sunlight_propagates = true,
|
||||
walkable = false,
|
||||
selection_box = {
|
||||
type = "fixed", fixed = {-0.2, -0.37, -0.2, 0.2, 0.31, 0.2}
|
||||
},
|
||||
groups = {dig_immediate = 3, vessel = 1},
|
||||
sounds = default.node_sound_glass_defaults(),
|
||||
|
||||
on_use = function(itemstack, user, pointed_thing)
|
||||
|
||||
if user.is_fake_player then return end
|
||||
|
||||
-- get info
|
||||
local name = user:get_player_name()
|
||||
local privs = minetest.get_player_privs(name)
|
||||
local timer = get_timer(user)
|
||||
|
||||
if privs.fly then
|
||||
|
||||
local msg = timer
|
||||
|
||||
if timer == "" or timer == "-99" then msg = S("unlimited") end
|
||||
|
||||
minetest.chat_send_player(name, minetest.get_color_escape_sequence("#ffff00")
|
||||
.. S("Flight already granted, @1 seconds left!", msg))
|
||||
|
||||
return
|
||||
end
|
||||
|
||||
set_timer(user, flight_secs) -- set flight timer
|
||||
|
||||
-- show time remaining
|
||||
minetest.chat_send_player(name,
|
||||
minetest.get_color_escape_sequence("#1eff00")
|
||||
.. S("Flight granted, you have @1 seconds!", flight_secs))
|
||||
|
||||
ethereal_set_flight(user) -- start check
|
||||
|
||||
itemstack:take_item() -- take item
|
||||
|
||||
-- return empty bottle
|
||||
local inv = user:get_inventory()
|
||||
|
||||
if inv:room_for_item("main", {name = "vessels:glass_bottle"}) then
|
||||
user:get_inventory():add_item("main", "vessels:glass_bottle")
|
||||
else
|
||||
minetest.add_item(user:get_pos(), {name = "vessels:glass_bottle"})
|
||||
end
|
||||
|
||||
return itemstack
|
||||
end
|
||||
})
|
||||
|
||||
-- recipe
|
||||
|
||||
minetest.register_craft({
|
||||
output = "ethereal:flight_potion",
|
||||
recipe = {
|
||||
{"ethereal:etherium_dust", "ethereal:etherium_dust", "ethereal:etherium_dust"},
|
||||
{"ethereal:etherium_dust", "ethereal:fire_dust", "ethereal:etherium_dust"},
|
||||
{"ethereal:etherium_dust", "vessels:glass_bottle", "ethereal:etherium_dust"}
|
||||
}
|
||||
})
|
Loading…
Add table
Add a link
Reference in a new issue