respawn_immunity = {}

local IMMUNE_TIME = 15
local immune_serial = 0
local immune_players = {}

function respawn_immunity.is_immune(player)
	return immune_players[player:get_player_name()]
end

function respawn_immunity.set_immune(player)
	immune_serial = immune_serial + 1
	immune_players[player:get_player_name()] = immune_serial
	minetest.after(1, function()
		respawn_immunity.update_effects(player)
	end)

	-- Set time out
	minetest.after(IMMUNE_TIME, function(name, id)
		if immune_players[name] == id then
			immune_players[name] = nil
			respawn_immunity.update_effects(minetest.get_player_by_name(name))
		end
	end, player:get_player_name(), immune_serial)
end

function respawn_immunity.update_effects(player)
	-- TODO: transparent player when immune
	--
	-- if immune_players[player:get_player_name()] then
	-- 	player:set_texture_mod("[multiply:#1f1")
	-- else
	-- 	player:set_texture_mod(nil)
	-- end
end

minetest.register_on_punchplayer(function(player, hitter,
		time_from_last_punch, tool_capabilities, dir, damage)
	if player and respawn_immunity.is_immune(player) then
		minetest.chat_send_player(hitter:get_player_name(),
				player:get_player_name() ..
				" just respawned or joined, and is immune to attacks!")
		return true
	end

	if hitter and respawn_immunity.is_immune(hitter) then
		minetest.chat_send_player(hitter:get_player_name(),
				minetest.colorize("#FF8C00",
				"Your immunity has ended because you attacked a player"))
		immune_players[hitter:get_player_name()] = nil
		respawn_immunity.update_effects(hitter)
	end
end)

minetest.register_on_joinplayer(respawn_immunity.set_immune)
minetest.register_on_respawnplayer(respawn_immunity.set_immune)