local default_spawn_settings = minetest.setting_get("static_spawnpoint")

minetest.register_globalstep(function(dtime)
	local players  = minetest.get_connected_players()
	for i,player in ipairs(players) do
		local function has_compass(player)
			for _,stack in ipairs(player:get_inventory():get_list("main")) do
				if minetest.get_item_group(stack:get_name(), "compass") ~= 0 then
					return true
				end
			end
			return false
		end
		if has_compass(player) then
			local spawn = beds_player_spawns[player:get_player_name()] or
			              minetest.setting_get("static_spawnpoint") or
			              {x=0,y=0,z=0}
			pos = player:getpos()
			dir = player:get_look_yaw()
			local angle_north = math.deg(math.atan2(spawn.x - pos.x, spawn.z - pos.z))
			if angle_north < 0 then angle_north = angle_north + 360 end
			angle_dir = 90 - math.deg(dir)
			local angle_relative = (angle_north - angle_dir) % 360
			local compass_image = math.floor((angle_relative/30) + 0.5)%12

			for j,stack in ipairs(player:get_inventory():get_list("main")) do
				if minetest.get_item_group(stack:get_name(), "compass") ~= 0 and
						minetest.get_item_group(stack:get_name(), "compass")-1 ~= compass_image then
					player:get_inventory():set_stack("main", j, "compass:"..compass_image)
				end
			end
		end
	end
end)

local images = {
	"compass_0.png",
	"compass_1.png",
	"compass_2.png",
	"compass_3.png",
	"compass_4.png",
	"compass_5.png",
	"compass_6.png",
	"compass_7.png",
	"compass_8.png",
	"compass_9.png",
	"compass_10.png",
	"compass_11.png",
}

local i
for i,img in ipairs(images) do
	local inv = 1
	if i == 1 then
		inv = 0
	end
	minetest.register_tool("compass:"..(i-1), {
		description = "Compass",
		inventory_image = img,
		wield_image = img,
		stack_max = 1,
		groups = {not_in_creative_inventory=inv,compass=i}
	})
end

minetest.register_craft({
	output = 'compass:1',
	recipe = {
		{'', 'default:steel_ingot', ''},
		{'default:steel_ingot', 'mesecons:redstone_dust', 'default:steel_ingot'},
		{'', 'default:steel_ingot', ''}
	}
})