minetest.register_item(":", { -- Hand
    type = "none",
    wield_image = "coke.png",
    wield_scale = {x=.3,y=2,z=2.5},
    range = 5,
    tool_capabilities = {
        max_drop_level = 0,
        full_punch_interval = 0.4,
        groupcaps = {
            choppy = {times = {[1] = 2, [2] = 1.5, [3] = 1.3}, uses = 20, maxlevel = 1},
            crumbly = {times = {[1] = 1.0, [2] = 0.9, [3] = 0.8}, uses = 20, maxlevel = 1},
            cracky = {times = {[1] = 1.0, [2] = 0.7, [3] = 0.5}, uses = 20, maxlevel = 1},
            flower = {times={[1] = 0, [2] = 0, [3] = 0}, uses = 10, maxlevel=3},
        },
        damage_groups = {fleshy = 1, snappy = 1, cracky=1},
    }
})

local function explode(pos, radius)
    local objects = minetest.get_objects_inside_radius(pos, radius)
    for _, obj in pairs(objects) do
        local obj_pos = obj:get_pos()
        local dir = vector.normalize(vector.subtract(obj_pos, pos))
        obj:set_velocity(vector.multiply(dir, 10))
        obj:punch(obj, 1.0, {
            full_punch_interval = 1.0,
            damage_groups = {fleshy = 4},
        })
    end

    for x = -radius, radius do
        for y = -radius, radius do
            for z = -radius, radius do
                local p = {x = pos.x + x, y = pos.y + y, z = pos.z + z}
                local d = vector.distance(pos, p)
                if d <= radius then
                    minetest.remove_node(p)
                end
            end
        end
    end
end

minetest.register_craftitem("amogus_items:amogus", {
	description = "Mini Amogus friend",
	inventory_image = "amogus_item.png",

	--on_use = function(itemstack, user)
	--	minetest.sound_play("amogus_sound", {
	--		pos = user:get_pos(),
	--		gain = 1.0,
	--		max_hear_distance = 5
	--	})
	--end,

    --on_place = function(itemstack, placer, pointed_thing)
    --    local pos = pointed_thing.above
    --    local dir = placer:get_look_dir()
    --    local yaw = math.atan(dir.x/dir.z)
    --    if dir.z > 0 then
    --        yaw = yaw + math.pi
    --    end
    --    minetest.add_entity(pos, "amogus_entities:amogus", yaw)
    --end

    on_place = function(itemstack, placer, pointed_thing)
        if pointed_thing.type == "node" then
            local pos = pointed_thing.above
            minetest.add_entity(pos, "amogus_entities:mini_crewmate")
            --minetest.sound_play("amogus_sound", {
            --    pos = pos,
            --    gain = 1.0,
            --    max_hear_distance = 5
            --})
            amogus_general.play_random_sound(
                "amogus_sound",
                pos,
                1.0, -- gain
                5, -- max_hear_distance
                2.0 -- pitch
            )
            
            itemstack:take_item()
        end
        return itemstack
    end
})

minetest.register_craftitem("amogus_items:sprite", {
    description = "Sprite",
    inventory_image = "sprite.png",
    on_use = minetest.item_eat(10),
})
minetest.register_craftitem("amogus_items:coke", {
    description = "Coke",
    inventory_image = "coke.png",
    on_use = minetest.item_eat(10),
})
minetest.register_craftitem("amogus_items:fanta", {
    description = "Fanta",
    inventory_image = "fanta.png",
    on_use = minetest.item_eat(10),
})
minetest.register_craftitem("amogus_items:tomato", {
    description = "Tomato",
    inventory_image = "tomato.png",
    on_use = minetest.item_eat(10),
})
minetest.register_craftitem("amogus_items:water", {
    inventory_image = "water.png",
    on_use = minetest.item_eat(10),
})

minetest.register_tool("amogus_items:lightsaber_blue", {
    description = "Blue Lightsaber",
    inventory_image = "lightsaber_blue.png",
    tool_capabilities = {
        full_punch_interval = 0.1,
        max_drop_level=3,
        groupcaps={
            snappy={times={[1]=0.1, [2]=0.1, [3]=0.1}, uses=0, maxlevel=3},
        },
        damage_groups = {fleshy=10},
    },
    sound = {breaks = "amogus_sound"},
})

minetest.register_tool("amogus_items:lightsaber_red", {
    description = "Red Lightsaber",
    inventory_image = "lightsaber_red.png",
    tool_capabilities = {
        full_punch_interval = 0.1,
        max_drop_level=3,
        groupcaps={
            snappy={times={[1]=0.1, [2]=0.1, [3]=0.1}, uses=0, maxlevel=3},
        },
        damage_groups = {fleshy=10},
    },
    
    sound = {breaks = "amogus_sound"},
})

minetest.register_tool("amogus_items:lightsaber_green", {
    description = "Green Lightsaber",
    inventory_image = "lightsaber_green.png",
    tool_capabilities = {
        full_punch_interval = 0.1,
        max_drop_level=3,
        groupcaps={
            snappy={times={[1]=0.1, [2]=0.1, [3]=0.1}, uses=0, maxlevel=3},
        },
        damage_groups = {fleshy=10},
    },
    sound = {breaks = "amogus_sound"},
})

-- add theese items : goldenpickaxe, wooden plank, gold_ingot, sussium_ingot
minetest.register_craftitem("amogus_items:wooden_plank", {
    description = "Wooden Plank",
    inventory_image = "wood.png",
})
minetest.register_craftitem("amogus_items:gold_ingot", {
    description = "Gold Ingot",
    inventory_image = "gold_ingot.png",
})minetest.register_craftitem("amogus_items:rock", {
    description = "Rock",
    inventory_image = "rocks.png",
})
minetest.register_craftitem("amogus_items:sussium_ingot", {
    description = "Sussium Ingot",
    inventory_image = "sussium_ingot.png",
})
--add theese items goldenpickaxe, stonepickaxe and allow them slowly break nodes and destroy it after 30 uses
minetest.register_tool("amogus_items:goldenplumba", {
    description = "Golden Plumba",
    inventory_image = "goldenplumba.png",
    tool_capabilities = {
        full_punch_interval = 0.1,
        max_drop_level = 3,
        groupcaps = {
            unbreakable = {times={[1] = 0, [2] = 0, [3] = 0}, uses = 10, maxlevel=3},
            crumbly = {times={[1] = 0, [2] = 0, [3] = 0}, uses = 10, maxlevel=3},
            snappy = {times={[1] = 0, [2] = 0, [3] = 0}, uses = 10, maxlevel=3},
            choppy = {times={[1] = 0, [2] = 0, [3] = 0}, uses = 10, maxlevel=3},
            cracky = {times={[1] = 0, [2] = 0, [3] = 0}, uses = 10, maxlevel=3},
            crumbly = {times={[1] = 0, [2] = 0, [3] = 0}, uses = 10, maxlevel=3},
            cracky = {times={[1] = 0, [2] = 0, [3] = 0}, uses = 10, maxlevel=3},
        },
        damage_groups = {fleshy = 10},
    },
    on_use = function(itemstack, user, pointed_thing)
        if pointed_thing.type == "node" then
            minetest.node_dig(pointed_thing.under, minetest.get_node(pointed_thing.under), user)
        end
        itemstack:add_wear(65535/10)
        return itemstack
    end,
    sound = {breaks = "default_tool_breaks"},
})

minetest.register_tool("amogus_items:susplumba", {
    description = "Sus Plumba",
    inventory_image = "plumba.png",
    tool_capabilities = {
        full_punch_interval = 0.1,
        max_drop_level = 3,
        groupcaps = {
            unbreakable = {times={[1] = 0, [2] = 0, [3] = 0}, uses = 10, maxlevel=3},
            crumbly = {times={[1] = 0, [2] = 0, [3] = 0}, uses = 10, maxlevel=3},
            snappy = {times={[1] = 0, [2] = 0, [3] = 0}, uses = 10, maxlevel=3},
            choppy = {times={[1] = 0, [2] = 0, [3] = 0}, uses = 10, maxlevel=3},
            cracky = {times={[1] = 0, [2] = 0, [3] = 0}, uses = 10, maxlevel=3},
            crumbly = {times={[1] = 0, [2] = 0, [3] = 0}, uses = 10, maxlevel=3},
            cracky = {times={[1] = 0, [2] = 0, [3] = 0}, uses = 10, maxlevel=3},
        },
        damage_groups = {fleshy = 10},
    },
    on_use = function(itemstack, user, pointed_thing)
        if pointed_thing.type == "node" then
            minetest.node_dig(pointed_thing.under, minetest.get_node(pointed_thing.under), user)
        end
        itemstack:add_wear(65535/40)
        return itemstack
    end,
    sound = {breaks = "default_tool_breaks"},
})

minetest.register_tool("amogus_items:stonepickaxe", {
    description = "Stone Pickaxe",
    inventory_image = "stone_pick.png",
    tool_capabilities = {
        full_punch_interval = 1.0,
        max_drop_level=1,
        groupcaps={
            stone={times={[1]=2.5, [2]=1.0, [3]=0.50}, uses=30, maxlevel=1},
        },
        damage_groups = {fleshy=2},
    },
    sound = {breaks = "default_tool_breaks"},
})
minetest.register_tool("amogus_items:goldenpickaxe", {
    description = "Golden Pickaxe",
    inventory_image = "golden_pick.png",
    tool_capabilities = {
        full_punch_interval = 1.0,
        max_drop_level=1,
        groupcaps={
            stone={times={[1]=1.3, [2]=0.60, [3]=0.40}, uses=30, maxlevel=1},
        },
        damage_groups = {fleshy=2},
    },
    sound = {breaks = "default_tool_breaks"},
})
minetest.register_tool("amogus_items:sussiumpickaxe", {
    description = "Sussium Pickaxe",
    inventory_image = "sussium_pickaxe.png",
    tool_capabilities = {
        full_punch_interval = 1.0,
        max_drop_level=1,
        groupcaps={
            stone={times={[0.5]=2.0,[1]=0.85, [2]=0.40, [3]=0.20}, uses=30, maxlevel=1},
        },
        damage_groups = {fleshy=2},
    },
    sound = {breaks = "default_tool_breaks"},
})
minetest.register_tool("amogus_items:goldenaxe", {
    description = "Golden Axe",
    inventory_image = "goldenaxe.png",
    tool_capabilities = {
        full_punch_interval = 1.0,
        max_drop_level=1,
        groupcaps={
            choppy={times={[1]=2.50, [2]=1.40, [3]=0.45}, uses=30, maxlevel=2},
        },
        damage_groups = {fleshy=4},
    },
    groups = {flammable = 2}
})
minetest.register_tool("amogus_items:stoneaxe", {
    description = "Stone Axe",
    inventory_image = "stone_axe.png",
    tool_capabilities = {
        full_punch_interval = 1.0,
        max_drop_level=1,
        groupcaps={
            choppy={times={[1]=2.50, [2]=1.40, [3]=0.80}, uses=30, maxlevel=2},
        },
        damage_groups = {fleshy=4},
    },
    groups = {flammable = 2}
})
minetest.register_tool("amogus_items:sussiumaxe", {
    description = "Sussium Axe",
    inventory_image = "sussium_axe.png",
    tool_capabilities = {
        full_punch_interval = 1.0,
        max_drop_level=1,
        groupcaps={
            choppy={times={[1]=0.90, [2]=0.80, [3]=0.35}, uses=30, maxlevel=2},
        },
        damage_groups = {fleshy=4},
    },

    groups = {flammable = 2}
})

minetest.register_tool("amogus_items:stoneshovel", {
    description = "stone shovel",
    inventory_image = "stone_shovel.png",
    tool_capabilities = {
        full_punch_interval = 1.0,
        max_drop_level=1,
        groupcaps={
            crumbly={times={[1]=1.5, [2]=1.0, [3]=0.9}, uses=30, maxlevel=2},
        },
        damage_groups = {fleshy=4},
    },
    groups = {flammable = 2}
})


minetest.register_tool("amogus_items:goldenshovel", {
    description = "golden shovel",
    inventory_image = "golden_shovel.png",
    tool_capabilities = {
        full_punch_interval = 1.0,
        max_drop_level=1,
        groupcaps={
            crumbly={times={[1]=1.0, [2]=0.8, [3]=0.6}, uses=30, maxlevel=2},
        },
        damage_groups = {fleshy=4},
    },
    groups = {flammable = 2}
})
minetest.register_tool("amogus_items:sussiumshovel", {
    description = "sussium shovel",
    inventory_image = "sussium_shovel.png",
    tool_capabilities = {
        full_punch_interval = 1.0,
        max_drop_level=1,
        groupcaps={
            crumbly={times={[1]=0.8, [2]=0.6, [3]=0.35}, uses=30, maxlevel=2},
        },
        damage_groups = {fleshy=4},
    },
    groups = {flammable = 2}
})

minetest.register_tool("amogus_items:obsussian_hammer", {
    description = "obsussian hammer",
    inventory_image = "obsusian_hammer.png",
    tool_capabilities = {
        full_punch_interval = 1.0,
        max_drop_level=1,
        groupcaps={
            choppy={times={[1]=0.90, [2]=0.40, [3]=0.06}, uses=30, maxlevel=2},
            crumbly={times={[1]=0.90, [2]=0.40, [3]=0.06}, uses=30, maxlevel=2},
            stone={times={[1]=0.90, [2]=0.40, [3]=0.06}, uses=30, maxlevel=1},
            crumbly={times={[1]=0.90, [2]=0.40, [3]=0.06}, uses=30, maxlevel=2},
        },
        damage_groups = {fleshy=4},
    },

    groups = {flammable = 2}
})

minetest.register_craftitem("amogus_items:pcb", {
    description = "PCB",
    inventory_image = "PCB.png",
})

minetest.register_craftitem("amogus_items:capacitor", {
    description = "Capacitor",
    inventory_image = "capacitor.png",
})

minetest.register_craftitem("amogus_items:sugar", {
    description = "Sugar",
    inventory_image = "sugar.png",
})

minetest.register_craftitem("amogus_items:iron_ingot", {
    description = "Iron Ingot",
    inventory_image = "iron_ingot.png",
})

minetest.register_tool("amogus_items:dynamite", {
    description = "dynamite",
    inventory_image = "dynamite.png",

    on_place = function(itemstack, placer, pointed_thing)
        if pointed_thing.type == "node" then
            local pos = pointed_thing.above
            minetest.add_entity(pos, "amogus_items:dynamite_entity")
            -- remove one item from the itemstack
            itemstack:take_item()
        end
        return itemstack
    end
})

minetest.register_entity("amogus_items:dynamite_entity", {
    physical = true,
    collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5},
    visual = "sprite",
    textures = {"dynamite.png"},
    on_step = function(self, dtime)
        local pos = self.object:get_pos()
        explode(pos,5)
        minetest.add_particlespawner({
            amount = 2900,
            time = 0.5,
            -- create 15 block radius of particles
            minpos = {x=pos.x-5, y=pos.y-5, z=pos.z-5},
            maxpos = {x=pos.x+5, y=pos.y+5, z=pos.z+5},
            minvel = {x=-2, y=-2, z=-2},
            maxvel = {x=2, y=2, z=2},
            minacc = {x=0, y=-10, z=0},
            maxacc = {x=0, y=-10, z=0},
            minexptime = 1,
            maxexptime = 3,
            minsize = 1,
            maxsize = 2,
            texture = "capacitor.png",
        })
        self.object:remove()
    end
})


-- below is modified code from bucket mod from minetest_game. (Minetest 0.4 mod: bucket)
-- original is licensed under:
-- GNU Lesser General Public License, version 2.1
-- Copyright (C) 2011-2016 Kahrl <kahrl@gmx.net>
-- Copyright (C) 2011-2016 celeron55, Perttu Ahola <celeron55@gmail.com>
-- Copyright (C) 2011-2016 Various Minetest developers and contributors

minetest.register_alias("empty_bucket", "amogus_items:empty_bucket")
minetest.register_alias("water_bucket", "amogus_items:water_bucket")

minetest.register_craft({
	output = "bucket:empty_bucket 1",
	recipe = {
		{"amogus_items:iron_ingot", "", "amogus_items:iron_ingot"},
        {"", "amogus_items:iron_ingot", ""},
	}
})

bucket = {}
bucket.liquids = {}

local function check_protection(pos, name, text)
	if minetest.is_protected(pos, name) then
		minetest.log("action", (name ~= "" and name or "A mod")
			.. " tried to " .. text
			.. " at protected position "
			.. minetest.pos_to_string(pos)
			.. " with a bucket")
		minetest.record_protection_violation(pos, name)
		return true
	end
	return false
end


-- Register a new liquid
--    source = name of the source node
--    flowing = name of the flowing node
--    itemname = name of the new bucket item (or nil if liquid is not takeable)
--    inventory_image = texture of the new bucket item (ignored if itemname == nil)
--    name = text description of the bucket item
--    groups = (optional) groups of the bucket item, for example {water_bucket = 1}
--    force_renew = (optional) bool. Force the liquid source to renew if it has a
--                  source neighbour, even if defined as 'liquid_renewable = false'.
--                  Needed to avoid creating holes in sloping rivers.
-- This function can be called from any mod (that depends on bucket).
function bucket.register_liquid(source, flowing, itemname, inventory_image, name,
    groups, force_renew)
    bucket.liquids[source] = {
        source = source,
        flowing = flowing,
        itemname = itemname,
        force_renew = force_renew,
    }
    bucket.liquids[flowing] = bucket.liquids[source]

    if itemname ~= nil then
        minetest.register_craftitem(itemname, {
            description = name,
            inventory_image = inventory_image,
            stack_max = 1,
            liquids_pointable = true,
            groups = groups,

            on_place = function(itemstack, user, pointed_thing)
                -- Must be pointing to node
                if pointed_thing.type ~= "node" then
                    return
                end

                local node = minetest.get_node_or_nil(pointed_thing.under)
                local ndef = node and minetest.registered_nodes[node.name]

                -- Call on_rightclick if the pointed node defines it
                if ndef and ndef.on_rightclick and
                        not (user and user:is_player() and
                        user:get_player_control().sneak) then
                    return ndef.on_rightclick(
                        pointed_thing.under,
                        node, user,
                        itemstack)
                end

                local lpos

                -- Check if pointing to a buildable node
                if ndef and ndef.buildable_to then
                    -- buildable; replace the node
                    lpos = pointed_thing.under
                else
                    -- not buildable to; place the liquid above
                    -- check if the node above can be replaced

                    lpos = pointed_thing.above
                    node = minetest.get_node_or_nil(lpos)
                    local above_ndef = node and minetest.registered_nodes[node.name]

                    if not above_ndef or not above_ndef.buildable_to then
                        -- do not remove the bucket with the liquid
                        return itemstack
                    end
                end

                if check_protection(lpos, user
                        and user:get_player_name()
                        or "", "place "..source) then
                    return
                end

                minetest.set_node(lpos, {name = source})
                return ItemStack("amogus_items:empty_bucket")
            end
        })
    end
end

-- random prefixes for names
local bucket_names_prefixes = {
    "Sussy",
    "Sussy wussy",
    "Sus",
    "Imposterous",
    "This is",
    "I wonder what is the",
    "You probably need",
    "Big",
    "Cursed",
    "I want that",
    "Very funny",
    "Suspicious",
    "SuspicioususUSSuS",
    "SuspiciousususSuSuSsSSuS",
    "AAAAA!! IT'S AGAIN THAT",
    "Fantastick",
    "I don't know what is that",
    "This is propably the longest item name you will ever see and btw this item is called",
    "I like",
    "Whatever that is, I've got my own",
    "A",
    "Wonderful",
    "Respectful",
    "Amogus shaped",
    "Impostor shaped",
    "Imposter shaped",
    "Sussy shaped"
}

-- random name
local empty_bucket_names = {
    "Bmpty Eucket",
    "Bupty Emcket",
    "Emptt Buckey",
    "Emckty Bupet"
}


minetest.register_craftitem("amogus_items:empty_bucket", {
    -- random name
	--description = (empty_bucket_names[math.random(1, #empty_bucket_names)]),
    description = (bucket_names_prefixes[math.random(1, #bucket_names_prefixes)] .. " " .. empty_bucket_names[math.random(1, #empty_bucket_names)]),
	inventory_image = "empty_bucket.png",
	groups = {tool = 1},
	liquids_pointable = true,
	on_use = function(itemstack, user, pointed_thing)
		if pointed_thing.type == "object" then
			pointed_thing.ref:punch(user, 1.0, { full_punch_interval=1.0 }, nil)
			return user:get_wielded_item()
		elseif pointed_thing.type ~= "node" then
			-- do nothing if it's neither object nor node
			return
		end
		-- Check if pointing to a liquid source
		local node = minetest.get_node(pointed_thing.under)
		local liquiddef = bucket.liquids[node.name]
		local item_count = user:get_wielded_item():get_count()

		if liquiddef ~= nil
		and liquiddef.itemname ~= nil
		and node.name == liquiddef.source then
			if check_protection(pointed_thing.under,
					user:get_player_name(),
					"take ".. node.name) then
				return
			end

			-- default set to return filled bucket
			local giving_back = liquiddef.itemname

			-- check if holding more than 1 empty bucket
			if item_count > 1 then

				-- if space in inventory add filled bucked, otherwise drop as item
				local inv = user:get_inventory()
				if inv:room_for_item("main", {name=liquiddef.itemname}) then
					inv:add_item("main", liquiddef.itemname)
				else
					local pos = user:get_pos()
					pos.y = math.floor(pos.y + 0.5)
					minetest.add_item(pos, liquiddef.itemname)
				end

				-- set to return empty buckets minus 1
				giving_back = "amogus_items:empty_bucket "..tostring(item_count-1)

			end

			-- force_renew requires a source neighbour
			local source_neighbor = false
			if liquiddef.force_renew then
				source_neighbor =
					minetest.find_node_near(pointed_thing.under, 1, liquiddef.source)
			end
			if not (source_neighbor and liquiddef.force_renew) then
				minetest.add_node(pointed_thing.under, {name = "air"})
			end

			return ItemStack(giving_back)
		else
			-- non-liquid nodes will have their on_punch triggered
			local node_def = minetest.registered_nodes[node.name]
			if node_def then
				node_def.on_punch(pointed_thing.under, node, user, pointed_thing)
			end
			return user:get_wielded_item()
		end
	end,
})


-- random name
local water_bucket_names = {
    "Bater Wucket",
    "Buter Wacket",
    "Watet Bucker",
    "Wacker Butet"
}


bucket.register_liquid(
	"amogus_blocks:water_source",
    "amogus_blocks:water_flowing",
    "amogus_items:water_bucket",
	"water_bucket.png",
    -- random name
	(bucket_names_prefixes[math.random(1, #bucket_names_prefixes)] .. " " .. water_bucket_names[math.random(1, #water_bucket_names)]),
	{tool = 1, water_bucket = 1}
)

-- end of modifed code from bucket mod from minetest_game