mod-invisibility/init.lua

211 lines
4.2 KiB
Lua
Raw Normal View History

2016-06-07 08:38:50 -07:00
invisibility = {}
2017-06-24 05:25:47 -07:00
local effect_time = 180 -- 3 minutes
2016-06-29 01:42:56 -07:00
2017-10-09 06:06:44 -07:00
-- reset player invisibility if they go offline
minetest.register_on_leaveplayer(function(player)
local name = player:get_player_name()
if invisibility[name] then
invisibility[name] = nil
end
end)
2016-06-07 08:38:50 -07:00
2017-10-09 06:06:44 -07:00
-- creative check
local creative_mode_cache = minetest.settings:get_bool("creative_mode")
function is_creative(name)
return creative_mode_cache or minetest.check_player_privs(name, {creative = true})
end
-- invisibility potion
2016-06-07 08:38:50 -07:00
minetest.register_node("invisibility:potion", {
description = "Invisibility Potion",
drawtype = "plantlike",
tiles = {"invisibility_potion.png"},
inventory_image = "invisibility_potion.png",
wield_image = "invisibility_potion.png",
paramtype = "light",
is_ground_content = false,
walkable = false,
selection_box = {
type = "fixed",
fixed = {-0.25, -0.5, -0.25, 0.25, 0.3, 0.25}
},
groups = {vessel = 1, dig_immediate = 3, attached_node = 1},
2016-06-07 08:38:50 -07:00
sounds = default.node_sound_glass_defaults(),
on_use = function(itemstack, user)
2017-10-09 07:11:37 -07:00
local pos = user:get_pos()
2016-06-29 01:42:56 -07:00
local name = user:get_player_name()
-- are we already invisible?
if invisibility[name] then
minetest.chat_send_player(name,
">>> You are already invisible!")
return itemstack
end
2016-06-07 08:38:50 -07:00
-- make player invisible
2016-06-09 13:47:17 -07:00
invisible(user, true)
2016-06-07 08:38:50 -07:00
-- play sound
2016-06-07 08:38:50 -07:00
minetest.sound_play("pop", {
pos = pos,
gain = 1.0,
max_hear_distance = 5
})
-- display 10 second warning
2016-06-29 01:42:56 -07:00
minetest.after(effect_time - 10, function()
2016-06-29 01:42:56 -07:00
if invisibility[name]
2017-10-09 07:11:37 -07:00
and user:get_pos() then
2016-06-29 01:42:56 -07:00
minetest.chat_send_player(name,
">>> You have 10 seconds before invisibility wears off!")
end
end)
-- make player visible 5 minutes later
2016-06-29 01:42:56 -07:00
minetest.after(effect_time, function()
2016-06-07 08:38:50 -07:00
2016-06-29 01:42:56 -07:00
if invisibility[name]
2017-10-09 07:11:37 -07:00
and user:get_pos() then
-- show aready hidden player
2016-06-09 13:47:17 -07:00
invisible(user, nil)
2016-06-07 08:38:50 -07:00
-- play sound
minetest.sound_play("pop", {
2016-06-11 02:36:40 -07:00
pos = pos,
gain = 1.0,
max_hear_distance = 5
})
end
2016-06-11 02:36:40 -07:00
end)
2016-06-07 08:38:50 -07:00
2016-06-29 01:42:56 -07:00
-- take potion, return empty bottle (and rest of potion stack)
2017-10-09 06:06:44 -07:00
if not is_creative(user:get_player_name()) then
2016-06-07 08:38:50 -07:00
2016-06-29 01:42:56 -07:00
local item_count = user:get_wielded_item():get_count()
local inv = user:get_inventory()
local giving_back = "vessels:glass_bottle"
if inv and item_count > 1 then
if inv:room_for_item("main", {name = "vessels:glass_bottle"}) then
inv:add_item("main", {name = "vessels:glass_bottle"})
else
pos.y = pos.y + 1
minetest.add_item(pos, {name = "vessels:glass_bottle"})
end
giving_back = "invisibility:potion " .. tostring(item_count - 1)
end
2016-06-07 08:38:50 -07:00
2016-06-29 01:42:56 -07:00
return ItemStack(giving_back)
2016-06-07 08:38:50 -07:00
end
end,
})
2017-10-09 06:06:44 -07:00
-- craft recipe
2016-06-07 08:38:50 -07:00
minetest.register_craft( {
output = "invisibility:potion",
type = "shapeless",
2017-06-24 05:25:47 -07:00
recipe = {
"default:sapling", "default:junglesapling",
"default:pine_sapling", "default:acacia_sapling",
"default:aspen_sapling", "default:bush_sapling",
"default:acacia_bush_sapling",
"vessels:glass_bottle", "flowers:mushroom_red",
},
2016-06-07 08:38:50 -07:00
})
2017-10-09 06:06:44 -07:00
-- invisibility function
2016-06-09 13:47:17 -07:00
invisible = function(player, toggle)
2016-06-07 08:38:50 -07:00
if not player then return false end
local name = player:get_player_name()
2016-06-09 13:47:17 -07:00
invisibility[name] = toggle
2016-06-07 08:38:50 -07:00
local prop
2016-06-09 13:47:17 -07:00
if toggle == true then
2016-06-07 08:38:50 -07:00
-- hide player and name tag
prop = {
visual_size = {x = 0, y = 0},
2017-07-21 02:47:33 -07:00
-- collisionbox = {0, 0, 0, 0, 0, 0}
2016-06-07 08:38:50 -07:00
}
player:set_nametag_attributes({
color = {a = 0, r = 255, g = 255, b = 255}
})
else
-- show player and tag
prop = {
visual_size = {x = 1, y = 1},
2017-07-21 02:47:33 -07:00
-- collisionbox = {-0.35, -1, -0.35, 0.35, 1, 0.35}
2016-06-07 08:38:50 -07:00
}
player:set_nametag_attributes({
color = {a = 255, r = 255, g = 255, b = 255}
})
end
player:set_properties(prop)
end
2017-10-09 06:06:44 -07:00
-- vanish command (admin only)
2016-06-07 08:38:50 -07:00
minetest.register_chatcommand("vanish", {
params = "<name>",
description = "Make player invisible",
privs = {server = true},
func = function(name, param)
-- player online
if param ~= ""
and minetest.get_player_by_name(param) then
name = param
-- player not online
elseif param ~= "" then
return false, "Player " .. param .. " is not online!"
end
2016-06-09 13:47:17 -07:00
local player = minetest.get_player_by_name(name)
-- hide / show player
if invisibility[name] then
invisible(player, nil)
else
invisible(player, true)
end
2016-06-07 08:38:50 -07:00
end
})