code:
$(document).ready(function () {
    var AFFIX_TOP_LIMIT = 300;
    var AFFIX_OFFSET = 49;
	$('#menu-left').localScroll({hash:true, onAfterFirst:function(){$('html, body').scrollTo( {top:'-=25px'}, 'fast' );}});
    var $menu = $("#menu"),
		$btn = $("#menu-toggle");

    $("#menu-toggle").on("click", function () {
        $menu.toggleClass("open");
        return false;
    });

    $(".docs-nav").each(function () {
        var $affixNav = $(this),
			$container = $affixNav.parent(),
			affixNavfixed = false,
			originalClassName = this.className,
			current = null,
			$links = $affixNav.find("a");

        function getClosestHeader(top) {
            var last = $links.first();

            if (top < AFFIX_TOP_LIMIT) {
                return last;
            }

            for (var i = 0; i < $links.length; i++) {
                var $link = $links.eq(i),
					href = $link.attr("href");

                if (href.charAt(0) === "#" && href.length > 1) {
                    var $anchor = $(href).first();

                    if ($anchor.length > 0) {
                        var offset = $anchor.offset();

                        if (top < offset.top - AFFIX_OFFSET) {
                            return last;
                        }

                        last = $link;
                    }
                }
            }
            return last;
        }

        $(window).on("scroll", function (evt) {
            var top = window.scrollY,
		    	height = $affixNav.outerHeight(),
		    	max_bottom = $container.offset().top + $container.outerHeight(),
		    	bottom = top + height + AFFIX_OFFSET;

            if (affixNavfixed) {
                if (top <= AFFIX_TOP_LIMIT) {
                    $affixNav.removeClass("fixed");
                    $affixNav.css("top", 0);
                    affixNavfixed = false;
                } else if (bottom > max_bottom) {
                    $affixNav.css("top", (max_bottom - height) - top);
                } else {
                    $affixNav.css("top", AFFIX_OFFSET);
                }
            } else if (top > AFFIX_TOP_LIMIT) {
                $affixNav.addClass("fixed");
                affixNavfixed = true;
            }

            var $current = getClosestHeader(top);

            if (current !== $current) {
                $affixNav.find(".active").removeClass("active");
                $current.addClass("active");
                current = $current;
            }
        });
    });

    prettyPrint();
});


code:
$(document).ready(function() {

  // var myURL = parseURL(document.URL);
  // var myURL_source = myURL.protocol + "://" + myURL.host + ":" + myURL.port + myURL.path;
  // var url0 = myURL_source + ".json?callback=hey";

  window.lang = new Lang("en");

  // $.getJSON(url0, function(data){
  // }).complete(function() {
  //   langSwitch("tr");
  // });
//
//  $("#en-switcher").css("color", "#999999");
//
//  langSwitch = function(lang){
//    window.lang.change(lang);
//    if(window.lang.currentLang == "en"){
//      $("#en-switcher").css("color", "#999999");
//    }else if(window.lang.currentLang == "tr"){
//      $("#tr-switcher").css("color", "#999999");
//    }
//  };
//
//  $("#lang-switcher a").click(function(e){
//    e.preventDefault();
//    if(window.lang.currentLang == "tr"){
//      $(this).css("color", "#999999");
//      $("#en-switcher").css("color", "#B7005B");
//    } else if(window.lang.currentLang == "en") {
//      $(this).css("color", "#999999");
//      $("#tr-switcher").css("color", "#B7005B");
//    }
//  });

  var $root = $('html, body');
  $('a.scroll').click(function() {
      var href = $.attr(this, 'href');
      console.log(href);
      $root.animate({
          scrollTop: $(href).offset().top - 50
      }, 500, function () {
          window.location.hash = href;
      });
      return false;
  });

});

repo_name: lucastx/desgovernanca

license: mit


code:
// This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment.
require('../../js/transition.js')
require('../../js/alert.js')
require('../../js/button.js')
require('../../js/carousel.js')
require('../../js/collapse.js')
require('../../js/dropdown.js')
require('../../js/modal.js')
require('../../js/tooltip.js')
require('../../js/popover.js')
require('../../js/scrollspy.js')
require('../../js/tab.js')
require('../../js/affix.js')


code:
$(document).ready(function () {
  $('[data-toggle="offcanvas"]').click(function () {
    $('.row-offcanvas').toggleClass('active')
  });
});


code:
Lang.prototype.pack.tr = {"token": {
    "Home":"Hakkında",
    "About":"Hakkında",
    "Venue":"Mekan",
    "Participation":"Katılım",
    "Program & Speakers":"Program & Konuşmacılar",
    "Register":"Kaydol",
    "REGISTER":"KAYDOL",
    "Supporters":"Destekleyenler",
    "Contact":"İletişim",
    "4-5 September 2014":"4-5 Eylül 2014",
    "Istanbul Bilgi University, Santral Campus":"İstanbul Bilgi Universitesi, Santral Kampüsü",
    "Venue & Transportation":"Mekan & Ulaşım",
    "Search": "Ara",
    "Help": "Yardım",
    "Share": "Paylaş",
    "Share on Twitter":"Twitter'da paylaş",
    "Post to Facebook":"Facebook'da paylaş",
    "Leave your email":"Email adresinizi bırakın",
    "Send":"Gönder",
    "Subscribe":"Kaydol"
  },
  "regex": []
};


code:
User Agent: *
Allow: /


code:
mobs
default?
lucky_block?
toolranks?
intllib?


code:
local S = mobs.intllib_monster

local dirt_types = {

	{	nodes = {"ethereal:dry_dirt"},
		skins = {"mobs_dirt_monster3.png"},
		drops = {
			{name = "ethereal:dry_dirt", chance = 1, min = 0, max = 2}
		}
	}
}

-- Dirt Monster by PilzAdam

mobs:register_mob("mobs_monster:dirt_monster", {
	type = "monster",
	passive = false,
	attack_type = "dogfight",
	pathfinding = true,
	reach = 2,
	damage = 2,
	hp_min = 3,
	hp_max = 27,
	armor = 100,
	collisionbox = {-0.4, -1, -0.4, 0.4, 0.8, 0.4},
	visual = "mesh",
	mesh = "mobs_stone_monster.b3d",
	textures = {
		{"mobs_dirt_monster.png"},
		{"mobs_dirt_monster2.png"}
	},
	blood_texture = "default_dirt.png",
	makes_footstep_sound = true,
	sounds = {
		random = "mobs_dirtmonster"
	},
	view_range = 15,
	walk_velocity = 1,
	run_velocity = 3,
	jump = true,
	drops = {
		{name = "default:dirt", chance = 1, min = 0, max = 2}
	},
	water_damage = 1,
	lava_damage = 5,
	light_damage = 3,
	fear_height = 4,
	animation = {
		speed_normal = 15,
		speed_run = 15,
		stand_start = 0,
		stand_end = 14,
		walk_start = 15,
		walk_end = 38,
		run_start = 40,
		run_end = 63,
		punch_start = 40,
		punch_end = 63
	},

	-- check surrounding nodes and spawn a specific monster
	on_spawn = function(self)

		local pos = self.object:get_pos() ; pos.y = pos.y - 1
		local tmp

		for n = 1, #dirt_types do

			tmp = dirt_types[n]

			if minetest.find_node_near(pos, 1, tmp.nodes) then

				self.base_texture = tmp.skins
				self.object:set_properties({textures = tmp.skins})

				if tmp.drops then
					self.drops = tmp.drops
				end

				return true
			end
		end

		return true -- run only once, false/nil runs every activation
	end
})

if not mobs.custom_spawn_monster then

	mobs:spawn({
		name = "mobs_monster:dirt_monster",
		nodes = {"default:dirt_with_grass", "ethereal:gray_dirt", "ethereal:dry_dirt"},
		min_light = 0,
		max_light = 7,
		chance = 6000,
		active_object_count = 2,
		min_height = 0,
		day_toggle = false
	})
end

mobs:register_egg("mobs_monster:dirt_monster", S("Dirt Monster"), "default_dirt.png", 1)

mobs:alias_mob("mobs:dirt_monster", "mobs_monster:dirt_monster") -- compatibility


code:
local S = mobs.intllib_monster

local master_types = {

	{	nodes = {"nether:rack"},
		skins = {"mobs_dungeon_master_nether.png"},
	},
	{	nodes = {"nether:rack_deep"},
		skins = {"mobs_dungeon_master_netherdeep.png"},
	}
}

-- Dungeon Master by PilzAdam

mobs:register_mob("mobs_monster:dungeon_master", {
	type = "monster",
	passive = false,
	damage = 6,
	attack_type = "dogshoot",
	dogshoot_switch = 1,
	dogshoot_count_max = 12, -- shoot for 10 seconds
	dogshoot_count2_max = 3, -- dogfight for 3 seconds
	reach = 3,
	shoot_interval = 2.2,
	arrow = "mobs_monster:fireball",
	shoot_offset = 1,
	hp_min = 42,
	hp_max = 75,
	armor = 60,
	collisionbox = {-0.7, -1, -0.7, 0.7, 1.6, 0.7},
	visual = "mesh",
	mesh = "mobs_dungeon_master.b3d",
	textures = {
		{"mobs_dungeon_master.png"},
		{"mobs_dungeon_master2.png"},
		{"mobs_dungeon_master3.png"}
	},
	makes_footstep_sound = true,
	sounds = {
		random = "mobs_dungeonmaster",
		shoot_attack = "mobs_fireball"
	},
	walk_velocity = 1,
	run_velocity = 3,
	jump = true,
	view_range = 15,
	drops = {
		{name = "default:mese_crystal_fragment", chance = 1, min = 0, max = 2},
		{name = "mobs:leather", chance = 2, min = 0, max = 2},
		{name = "default:mese_crystal", chance = 3, min = 0, max = 2},
		{name = "default:diamond", chance = 4, min = 0, max = 1},
		{name = "default:diamondblock", chance = 30, min = 0, max = 1}
	},
	water_damage = 1,
	lava_damage = 1,
	light_damage = 0,
	fear_height = 3,
	animation = {
		stand_start = 0,
		stand_end = 19,
		walk_start = 20,
		walk_end = 35,
		punch_start = 36,
		punch_end = 48,
		shoot_start = 36,
		shoot_end = 48,
		speed_normal = 15,
		speed_run = 15
	},

	-- check surrounding nodes and spawn a specific monster
	on_spawn = function(self)

		local pos = self.object:get_pos() ; pos.y = pos.y - 1
		local tmp

		for n = 1, #master_types do

			tmp = master_types[n]

			if minetest.find_node_near(pos, 1, tmp.nodes) then

				self.base_texture = tmp.skins
				self.object:set_properties({textures = tmp.skins})

				if tmp.drops then
					self.drops = tmp.drops
				end

				return true
			end
		end

		return true -- run only once, false/nil runs every activation
	end
})

if not mobs.custom_spawn_monster then

	mobs:spawn({
		name = "mobs_monster:dungeon_master",
		nodes = {"default:stone", "nether:rack", "nether:rack_deep"},
		max_light = 5,
		chance = 9000,
		active_object_count = 1,
		max_height = -70
	})
end

mobs:register_egg("mobs_monster:dungeon_master", S("Dungeon Master"), "fire_basic_flame.png", 1, true)

mobs:alias_mob("mobs:dungeon_master", "mobs_monster:dungeon_master") -- compatibility

-- fireball (weapon)
mobs:register_arrow("mobs_monster:fireball", {
	visual = "sprite",
	visual_size = {x = 1, y = 1},
	textures = {"mobs_fireball.png"},
	collisionbox = {-0.1, -0.1, -0.1, 0.1, 0.1, 0.1},
	velocity = 7,
	tail = 1,
	tail_texture = "mobs_fireball.png",
	tail_size = 10,
	glow = 5,
	expire = 0.1,

	on_activate = function(self, staticdata, dtime_s)
		-- make fireball indestructable
		self.object:set_armor_groups({immortal = 1, fleshy = 100})
	end,

	-- if player has a good weapon with 7+ damage it can deflect fireball
	on_punch = function(self, hitter, tflp, tool_capabilities, dir)

		if hitter and hitter:is_player() and tool_capabilities and dir then

			local damage = tool_capabilities.damage_groups and
				tool_capabilities.damage_groups.fleshy or 1

			local tmp = tflp / (tool_capabilities.full_punch_interval or 1.4)

			if damage > 6 and tmp < 4 then

				self.object:set_velocity({
					x = dir.x * self.velocity,
					y = dir.y * self.velocity,
					z = dir.z * self.velocity
				})
			end
		end
	end,

	-- direct hit, no fire... just plenty of pain
	hit_player = function(self, player)
		player:punch(self.object, 1.0, {
			full_punch_interval = 1.0,
			damage_groups = {fleshy = 8}
		}, nil)
	end,

	hit_mob = function(self, player)
		player:punch(self.object, 1.0, {
			full_punch_interval = 1.0,
			damage_groups = {fleshy = 8}
		}, nil)
	end,

	-- node hit
	hit_node = function(self, pos, node)
		mobs:boom(self, pos, 1)
	end
})

--minetest.override_item("default:obsidian", {on_blast = function() end})


code:
local S = mobs.intllib_monster

local mob_drops = {
	{name = "fireflies:firefly", chance = 1, min = 1, max = 1}
}

if minetest.get_modpath("ethereal") then

	table.insert(mob_drops,
			{name = "ethereal:fire_dust", chance = 1, min = 1, max = 1})
end

-- Fire Spirit

mobs:register_mob("mobs_monster:fire_spirit", {
	type = "monster",
	passive = false,
	attack_type = "dogfight",
	pathfinding = true,
	reach = 2,
	damage = 4,
	hp_min = 25,
	hp_max = 45,
	armor = 100,
	collisionbox = {-0.1, -0.1, -0.1, 0.1, 0.1, 0.1},
	visual_scale = {x = 0.5, y = 0.5, z = 0.5},
	visual = "sprite",
	textures = {
		{"mobs_fire_spirit.png"}
	},
	glow = 14,
	blood_texture = "fire_basic_flame.png",
	immune_to = {
		{"bucket:bucket_water", 1},
		{"bucket:bucket_river_water", 1},
		{"all"}
	},
	makes_footstep_sound = false,
	sounds = {
		random = "fire_fire",
		damage = "fire_extinguish_flame",
		death = "fire_extinguish_flame"
	},
	view_range = 14,
	walk_velocity = 2,
	run_velocity = 3,
	jump = true,
	jump_height = 6,
	drops = mob_drops,
	water_damage = 1,
	lava_damage = 0,
	fire_damage = 0,
	light_damage = 0,
	fall_damage = false,
	fear_height = 8,
	animation = {},

	on_die = function(self, pos)

		mobs:effect(pos, 20, "tnt_smoke.png", 3, 5, 2, 0.5, nil, false)

		self.object:remove()
	end,

	do_custom = function(self, dtime)

		self.flame_timer = (self.flame_timer or 0) + dtime

		if self.flame_timer < 0.25 then
			return
		end

		self.flame_timer = 0

		local pos = self.object:get_pos()

		-- pos, amount, texture, min_size, max_size, radius, gravity, glow, fall
		mobs:effect(pos, 5, "fire_basic_flame.png", 1, 2, 0.1, 0.2, 14, nil)
	end
})

if not mobs.custom_spawn_monster then

	mobs:spawn({
		name = "mobs_monster:fire_spirit",
		nodes = {"default:obsidian", "caverealms:hot_cobble"},
		neighbors = {"group:fire"},
		min_light = 12,
		max_light = 15,
		chance = 1500,
		active_object_count = 1,
		max_height = -150
	})
end

mobs:register_egg("mobs_monster:fire_spirit", S("Fire Spirit"), "fire_basic_flame.png", 1)


code:
-- Load support for intllib.
local path = minetest.get_modpath(minetest.get_current_modname()) .. "/"

-- Check for translation method
local S
if minetest.get_translator ~= nil then
	S = minetest.get_translator("mobs_monster") -- 5.x translation function
else
	if minetest.get_modpath("intllib") then
		dofile(minetest.get_modpath("intllib") .. "/init.lua")
		if intllib.make_gettext_pair then
			S = intllib.make_gettext_pair() -- new gettext method
		else
			S = intllib.Getter() -- old text file method
		end
	else -- boilerplate function
		S = function(str, ...)
			local args = {...}
			return str:gsub("@%d+", function(match)
				return args[tonumber(match:sub(2))]
			end)
		end
	end
end

mobs.intllib_monster = S

-- Check for custom mob spawn file
local input = io.open(path .. "spawn.lua", "r")

if input then
	mobs.custom_spawn_monster = true
	input:close()
	input = nil
end

-- Monsters
dofile(path .. "dirt_monster.lua") -- PilzAdam
dofile(path .. "dungeon_master.lua")
dofile(path .. "oerkki.lua")
dofile(path .. "sand_monster.lua")
dofile(path .. "stone_monster.lua")
dofile(path .. "tree_monster.lua")
dofile(path .. "lava_flan.lua") -- Zeg9
dofile(path .. "mese_monster.lua")
dofile(path .. "spider.lua") -- AspireMint
dofile(path .. "land_guard.lua")
dofile(path .. "fire_spirit.lua")

-- Load custom spawning
if mobs.custom_spawn_monster then
	dofile(path .. "spawn.lua")
end

-- Lucky Blocks
if minetest.get_modpath("lucky_block") then
	dofile(path .. "lucky_block.lua")
end

print ("[MOD] Mobs Redo Monsters loaded")


code:
local S = mobs.intllib_monster

local guard_types = {

	{	nodes = {
			"default:snow", "default:snowblock", "default:ice",
			"default:dirt_with_snow"
		},
		skins = {"mobs_land_guard6.png", "mobs_land_guard7.png", "mobs_land_guard8.png"},
		drops = {
			{name = "default:ice", chance = 1, min = 1, max = 4},
			{name = "mobs:leather", chance = 2, min = 0, max = 2},
			{name = "default:diamond", chance = 4, min = 0, max = 2},
		},
	},

	{	nodes = {
			"ethereal:dry_dirt", "default:sand", "default:desert_sand",
			"default:dry_dirt_with_dry_grass", "default:dry_dirt"
		},
		skins = {"mobs_land_guard4.png", "mobs_land_guard5.png"},
		drops = {
			{name = "default:sandstone", chance = 1, min = 1, max = 4},
			{name = "mobs:leather", chance = 2, min = 0, max = 2},
			{name = "default:mese_crystal", chance = 4, min = 0, max = 2},
		},
	}
}

-- Land Guard

mobs:register_mob("mobs_monster:land_guard", {
	type = "monster",
	passive = false,
	attack_type = "dogfight",
	group_attack = true,
	reach = 3,
	damage = 15,
	hp_min = 30,
	hp_max = 65,
	armor = 50,
	collisionbox = {-0.5, -1.01, -0.5, 0.5, 1.6, 0.5},
	visual_size = {x = 1, y = 1},
	visual = "mesh",
	mesh = "mobs_dungeon_master.b3d",
	textures = {
		{"mobs_land_guard.png"},
		{"mobs_land_guard2.png"},
		{"mobs_land_guard3.png"}
	},
	makes_footstep_sound = true,
	sounds = {
		random = "mobs_dungeonmaster",
	},
	walk_velocity = 1.5,
	run_velocity = 3.4,
	jump = true,
	jump_height = 2.0,
	floats = 0,
	view_range = 15,
	drops = {
		{name = "mobs:leather", chance = 2, min = 0, max = 2},
		{name = "default:mese_crystal", chance = 3, min = 0, max = 2},
		{name = "default:diamond", chance = 4, min = 0, max = 1},
	},
	water_damage = 0,
	lava_damage = 6,
	light_damage = 0,
	fear_height = 8,
	animation = {
		stand_start = 0,
		stand_end = 19,
		walk_start = 20,
		walk_end = 35,
		punch_start = 36,
		punch_end = 48,
		speed_normal = 15,
		speed_run = 20,
	},

	-- check surrounding nodes and spawn a specific guard
	on_spawn = function(self)

		local pos = self.object:get_pos() ; pos.y = pos.y - 1
		local tmp

		for n = 1, #guard_types do

			tmp = guard_types[n]

			if minetest.find_node_near(pos, 1, tmp.nodes) then

				self.base_texture = { tmp.skins[math.random(#tmp.skins)] }
				self.object:set_properties({textures = self.base_texture})
				self.docile_by_day = tmp.docile

				if tmp.drops then
					self.drops = tmp.drops
				end

				return true
			end
		end

		return true -- run only once, false/nil runs every activation
	end,
})

if not mobs.custom_spawn_monster then
mobs:spawn({
	name = "mobs_monster:land_guard",
	nodes = {
		"default:snow", "default:ice", "default:stone",
		"default:dry_dirt_with_dry_grass", "ethereal:dry_dirt"
	},
	max_light = 7,
	chance = 25000,
	min_height = 0,
	active_object_count = 1,
})
end

mobs:register_egg("mobs_monster:land_guard", S("Land Guard"), "default_ice.png", 1)


code:
local S = mobs.intllib_monster

-- Lava Flan by Zeg9 (additional textures by JurajVajda)

mobs:register_mob("mobs_monster:lava_flan", {
	type = "monster",
	passive = false,
	attack_type = "dogfight",
	reach = 2,
	damage = 3,
	hp_min = 10,
	hp_max = 35,
	armor = 80,
	collisionbox = {-0.5, -0.5, -0.5, 0.5, 1.5, 0.5},
	visual = "mesh",
	mesh = "zmobs_lava_flan.x",
	textures = {
		{"zmobs_lava_flan.png"},
		{"zmobs_lava_flan2.png"},
		{"zmobs_lava_flan3.png"}
	},
	blood_texture = "fire_basic_flame.png",
	makes_footstep_sound = false,
	sounds = {
		random = "mobs_lavaflan",
		war_cry = "mobs_lavaflan"
	},
	walk_velocity = 0.5,
	run_velocity = 2,
	jump = true,
	view_range = 10,
	floats = 1,
	drops = {
		{name = "mobs:lava_orb", chance = 15, min = 1, max = 1}
	},
	water_damage = 8,
	lava_damage = -1,
	fire_damage = 0,
	light_damage = 0,
	immune_to = {
		{"mobs:pick_lava", -2} -- lava pick heals 2 health
	},
	fly_in = {"default:lava_source", "default:lava_flowing"},
	animation = {
		speed_normal = 15,
		speed_run = 15,
		stand_start = 0,
		stand_end = 8,
		walk_start = 10,
		walk_end = 18,
		run_start = 20,
		run_end = 28,
		punch_start = 20,
		punch_end = 28
	},

	-- custom death function
	on_die = function(self, pos)

		local cod = self.cause_of_death or {}
		local def = cod.node and minetest.registered_nodes[cod.node]

		if def and def.groups and def.groups.water then

			pos.y = pos.y + 1

			mobs:effect(pos, 40, "tnt_smoke.png", 3, 5, 2, 0.5, nil, false)

			minetest.sound_play("fire_extinguish_flame",
					{pos = pos, max_hear_distance = 12, gain = 1.5}, true)

			self.object:remove()

			if math.random(4) == 1 then
				mobs:add_mob(pos, {name = "mobs_monster:obsidian_flan"})
			end
		else
			mobs:effect(pos, 40, "fire_basic_flame.png", 2, 3, 2, 5, 10, nil)

			local nods = minetest.find_nodes_in_area(
				{x = pos.x, y = pos.y + 1, z = pos.z},
				{x = pos.x, y = pos.y, z = pos.z}, "air")

			 -- place flame if position empty and flame exists
			if nods and #nods > 0
			and minetest.registered_nodes["fire:basic_flame"] then

				pos = nods[math.random(#nods)]
				minetest.set_node(pos, {name = "fire:basic_flame"})
			end

			self.object:remove()
		end
	end,
	glow = 10
})

if not mobs.custom_spawn_monster then
mobs:spawn({
	name = "mobs_monster:lava_flan",
	nodes = {"default:lava_source"},
	chance = 1500,
	active_object_count = 1,
	max_height = 0
})
end

-- add spawn egg
mobs:register_egg("mobs_monster:lava_flan", S("Lava Flan"), "default_lava.png", 1)

-- compatibility alias, only needed for servers who used the old mobs mod
mobs:alias_mob("mobs:lava_flan", "mobs_monster:lava_flan")

-- lava orb
minetest.register_craftitem(":mobs:lava_orb", {
	description = S("Lava orb"),
	inventory_image = "zmobs_lava_orb.png",
	light_source = 14
})

minetest.register_alias("zmobs:lava_orb", "mobs:lava_orb")

minetest.register_craft({
	type = "fuel",
	recipe = "mobs:lava_orb",
	burntime = 80
})

-- Lava Pick (digs and smelts at same time)

local old_handle_node_drops = minetest.handle_node_drops

function minetest.handle_node_drops(pos, drops, digger)

	-- does player exist?
	if not digger then return end

	-- are we holding Lava Pick?
	if digger:get_wielded_item():get_name() ~= ("mobs:pick_lava") then
		return old_handle_node_drops(pos, drops, digger)
	end

	-- reset new smelted drops
	local hot_drops = {}

	-- loop through current node drops
	for _, drop in ipairs(drops) do

		-- get cooked output of current drops
		local stack = ItemStack(drop)

		while not stack:is_empty() do

			local output, decremented_input = minetest.get_craft_result({
				method = "cooking",
				width = 1,
				items = {stack}
			})

			if output.item:is_empty() then

				table.insert_all(hot_drops, decremented_input.items)
				break
			else
				if not output.item:is_empty() then
					table.insert(hot_drops, output.item)
				end

				table.insert_all(hot_drops, output.replacements)

				stack = decremented_input.items[1] or ItemStack()
			end
		end
	end

	return old_handle_node_drops(pos, hot_drops, digger)
end

minetest.register_tool(":mobs:pick_lava", {
	description = S("Lava Pickaxe"),
	inventory_image = "mobs_pick_lava.png",
	tool_capabilities = {
		full_punch_interval = 0.4,
		max_drop_level = 3,
		groupcaps = {
			cracky = {
				times = {[1] = 1.80, [2] = 0.80, [3] = 0.40},
				uses = 40,
				maxlevel = 3
			}
		},
		damage_groups = {fleshy = 6, fire = 1},
	},
	groups = {pickaxe = 1},
	light_source = 14
})

minetest.register_craft({
	output = "mobs:pick_lava",
	recipe = {
		{"mobs:lava_orb", "mobs:lava_orb", "mobs:lava_orb"},
		{"", "default:obsidian_shard", ""},
		{"", "default:obsidian_shard", ""}
	}
})

-- Add [toolranks] mod support if found
if minetest.get_modpath("toolranks") then

minetest.override_item("mobs:pick_lava", {
	original_description = "Lava Pickaxe",
	description = toolranks.create_description("Lava Pickaxe", 0, 1),
	after_use = toolranks.new_afteruse})
end

-- obsidian flan

mobs:register_mob("mobs_monster:obsidian_flan", {
	type = "monster",
	passive = false,
	attack_type = "shoot",
	shoot_interval = 0.5,
	shoot_offset = 1.0,
	arrow = "mobs_monster:obsidian_arrow",
	reach = 2,
	damage = 3,
	hp_min = 10,
	hp_max = 35,
	armor = 30,
	visual_size = {x = 0.6, y = 0.6},
	collisionbox = {-0.3, -0.3, -0.3, 0.3, 0.8, 0.3},
	visual = "mesh",
	mesh = "zmobs_lava_flan.x",
	textures = {
		{"mobs_obsidian_flan.png"}
	},
	blood_texture = "default_obsidian.png",
	makes_footstep_sound = true,
	sounds = {
		random = "mobs_lavaflan"
	},
	walk_velocity = 0.1,
	run_velocity = 0.5,
	jump = false,
	view_range = 10,
	floats = 0,
	drops = {
		{name = "default:obsidian_shard", chance = 1, min = 1, max = 5},
		{name = "default:obsidian", chance = 3, min = 0, max = 2}
	},
	water_damage = 0,
	lava_damage = 8,
	fire_damage = 0,
	light_damage = 0,
	animation = {
		speed_normal = 15,
		speed_run = 15,
		stand_start = 0,
		stand_end = 8,
		walk_start = 10,
		walk_end = 18,
		run_start = 20,
		run_end = 28,
		punch_start = 20,
		punch_end = 28
	}
})

-- add spawn egg
mobs:register_egg("mobs_monster:obsidian_flan", S("Obsidian Flan"),
		"default_obsidian.png", 1)

local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false

-- mese arrow (weapon)
mobs:register_arrow("mobs_monster:obsidian_arrow", {
	visual = "sprite",
	visual_size = {x = 0.5, y = 0.5},
	textures = {"default_obsidian_shard.png"},
	velocity = 6,

	hit_player = function(self, player)
		player:punch(self.object, 1.0, {
			full_punch_interval = 1.0,
			damage_groups = {fleshy = 8},
		}, nil)
	end,

	hit_mob = function(self, player)
		player:punch(self.object, 1.0, {
			full_punch_interval = 1.0,
			damage_groups = {fleshy = 8},
		}, nil)
	end,

	hit_node = function(self, pos, node)

		if mobs_griefing == false or minetest.is_protected(pos, "") then
			return
		end

		local texture = "default_dirt.png" --fallback texture

		local radius = 1
		local def = minetest.registered_nodes[node]

		if def then
			node = {name = node}
		end

		if def and def.tiles and def.tiles[1] then
			texture = def.tiles[1]
		end

		-- do not break obsidian or diamond blocks or unbreakable nodes
		if (def.groups and def.groups.level and def.groups.level > 1)
		or def.groups.unbreakable then
			return
		end

		minetest.add_particlespawner({
			amount = 32,
			time = 0.1,
			minpos = vector.subtract(pos, radius / 2),
			maxpos = vector.add(pos, radius / 2),
			minvel = {x = -3, y = 0, z = -3},
			maxvel = {x = 3, y = 5,  z = 3},
			minacc = {x = 0, y = -10, z = 0},
			maxacc = {x = 0, y = -10, z = 0},
			minexptime = 0.8,
			maxexptime = 2.0,
			minsize = radius * 0.33,
			maxsize = radius,
			texture = texture,
			-- ^ only as fallback for clients without support for `node` parameter
			node = node,
			collisiondetection = true
		})

		minetest.set_node(pos, {name = "air"})

		local snd = def.sounds and def.sounds.dug or "default_dig_crumbly"

		minetest.sound_play(snd, {pos = pos, max_hear_distance = 12, gain = 1.0}, true)
	end
})


code:
# German Translation for mobs_monster mod
# Deutsche Übersetzung der mobs_monster Mod
# last update: 2016/June/10
# Author: Xanthin

#dirtmonster.lua
Dirt Monster = Erdmonster

#dungeonmaster.lua
Dungeon Master = Kerkermeister

#init.lua
[MOD] Mobs Redo 'Monsters' loaded = [MOD] Mobs Redo 'Monsters' geladen

#lava_flan.lua
Lava Flan = Lavaflan
Lava orb = Lavakugel
Lava Pickaxe = Lavaspitzhacke

#mese_monster.lua
Mese Monster = Mesemonster

#oerkki.lua
Oerkki = Oerkki

#sandmonster.lua
Sand Monster = Sandmonster

#spider.lua
Spider = Spinne
Cobweb = Spinnennetz

#stonemonster.lua
Stone Monster = Steinmonster

#treemonster.lua
Tree Monster = Baummonster


code:
# last update: 2016/June/10

#dirtmonster.lua
Dirt Monster =  Monstre de terre

#dungeonmaster.lua
Dungeon Master = Maître des donjons

#init.lua
[MOD] Mobs Redo 'Monsters' loaded = [MOD] Mobs Redo 'Monstres' chargé

#lava_flan.lua
Lava Flan = Flan de lave
Lava orb = Orbe de lave
Lava Pickaxe = Pioche de lave

#mese_monster.lua
Mese Monster = Monstre de Mese

#oerkki.lua
Oerkki = Oerkki

#sandmonster.lua
Sand Monster = Monstre de sable

#spider.lua
Spider = Araignée
Cobweb = Toile d'arraignée

#stonemonster.lua
Stone Monster = Monstre de pierre

#treemonster.lua
Tree Monster = Monstre de bois


code:
# ITALIAN LOCALE FILE FOR THE MOBS MONSTER MODULE
# Copyright (c) 2014 Krupnov Pavel and 2016 TenPlus1
# This file is distributed under the same license as the MOBS MONSTER package.
# Hamlet <h4mlet@riseup.net>, 2017.
#

#dirtmonster.lua
Dirt Monster = Mostro di terra

#dungeonmaster.lua
Dungeon Master = Padrone delle segrete

#init.lua
[MOD] Mobs Redo 'Monsters' loaded = [MOD] Mobs Redo 'Monsters' caricato

#lava_flan.lua
Lava Flan = Sformato di lava
Lava orb = Sfera di lava
Lava Pickaxe = Piccone di lava

#mese_monster.lua
Mese Monster = Mostro di mese

#oerkki.lua
Oerkki = Oerkki

#sandmonster.lua
Sand Monster = Mostro di sabbia

#spider.lua
Spider = Ragno
Cobweb = Ragnatela

#stonemonster.lua
Stone Monster = Mostro di pietra

#treemonster.lua
Tree Monster = Albero mostro


code:
# textdomain:mobs_monster
Cobweb=Spinnennetz
Dirt Monster=Erdmonster
Dungeon Master=Kerkermeister
Lava Flan=Lavaflan
Lava Pickaxe=Lavaspitzhacke
Lava orb=Lavakugel
Mese Monster=Mesemonster
#Obsidian Flan=
Oerkki=Oerkki
Sand Monster=Sandmonster
Spider=Spinne
Stone Monster=Steinmonster
Tree Monster=Baummonster


code:
# textdomain:mobs_monster
#Cobweb=
#Dirt Monster=
#Dungeon Master=
#Lava Flan=
#Lava Pickaxe=
#Lava orb=
#Mese Monster=
#Obsidian Flan=
#Oerkki=
#Sand Monster=
#Spider=
#Stone Monster=
#Tree Monster=


code:
# textdomain:mobs_monster
Cobweb=Telarania
Dirt Monster=Mounstro de tierra
Dungeon Master=Maestro de mazmorra
Lava Flan=Flan de lava
Lava Pickaxe=Hacha de lava
Lava orb=Esfera de lava
Mese Monster=Mounstro de mese
#Obsidian Flan=
Oerkki=Oerkki
Sand Monster=Mounstro de arena
Spider=Arania
Stone Monster=Mounstro de piedra
Tree Monster=Mounstro de madera


code:
# textdomain:mobs_monster
Cobweb=Toile d'arraignée
Dirt Monster=Monstre de terre
Dungeon Master=Maître des donjons
Lava Flan=Lave en gelée
Lava Pickaxe=Pioche de lave
Lava orb=Orbe de lave
Mese Monster=Monstre de mese
Obsidian Flan=Obsidienne en gelée
Oerkki=Oerkki
Sand Monster=Monstre de sable
Spider=Araignée
Stone Monster=Monstre de pierre
Tree Monster=Monstre de bois


code:
# textdomain:mobs_monster
Cobweb=Ragnatela
Dirt Monster=Mostro di terra
Dungeon Master=Padrone delle segrete
Lava Flan=Sformato di lava
Lava Pickaxe=Piccone di lava
Lava orb=Sfera di lava
Mese Monster=Mostro di mese
#Obsidian Flan=
Oerkki=Oerkki
Sand Monster=Mostro di sabbia
Spider=Ragno
Stone Monster=Mostro di pietra
Tree Monster=Albero mostro


code:
# textdomain:mobs_monster
Cobweb=Sarang Labah-labah
Dirt Monster=Raksasa Tanah
Dungeon Master=Penjaga Kurungan Bawah Tanah
Lava Flan=Raksasa Lava
Lava Pickaxe=Beliung Lava
Lava orb=Bola Lava
Mese Monster=Raksasa Mese
#Obsidian Flan=
Oerkki=Oerkki
Sand Monster=Raksasa Pasir
Spider=Labah-labah
Stone Monster=Raksasa Batu
Tree Monster=Raksasa Pokok


code:
# textdomain:mobs_monster
Cobweb=Örümcek ağı
Dirt Monster=Toprak Canavarı
Dungeon Master=Zindan başı
Lava Flan=Lav Flan
Lava Pickaxe=Lav kazması
Lava orb=Lav küre
Mese Monster=Mese Canavarı
#Obsidian Flan=
Oerkki=Oerkki
Sand Monster=Kum Canavarı
Spider=Örümcek
Stone Monster=Taş Canavarı
Tree Monster=Ağaç Canavarı


code:
# textdomain:mobs_monster
Cobweb=蜘蛛网
Dirt Monster=泥土怪
Dungeon Master=地穴之主
Lava Flan=岩浆饼
Lava Pickaxe=岩浆镐
Lava orb=岩浆球
Mese Monster=黄石怪
#Obsidian Flan=
Oerkki=奥尔基
Sand Monster=沙怪
Spider=蜘蛛
Stone Monster=石头怪
Tree Monster=树怪


code:
# textdomain:mobs_monster
Cobweb=蜘蛛網
Dirt Monster=泥土怪
Dungeon Master=地穴之主
Lava Flan=岩漿餅
Lava Pickaxe=岩漿鎬
Lava orb=岩漿球
Mese Monster=黃石怪
#Obsidian Flan=
Oerkki=奧爾基
Sand Monster=沙怪
Spider=蜘蛛
Stone Monster=石頭怪
Tree Monster=樹怪


code:
# Malay translations of mobs_monster mod
# using template from 2016/June/10, translated on 2018/February/05

#dirtmonster.lua
Dirt Monster = Raksasa Tanah

#dungeonmaster.lua
Dungeon Master = Penjaga Kurungan Bawah Tanah

#init.lua
[MOD] Mobs Redo 'Monsters' loaded = [MODS] Mobs Redo 'Monsters' telah dimuatkan

#lava_flan.lua
Lava Flan = Raksasa Lava
Lava orb = Bola Lava
Lava Pickaxe = Beliung Lava

#mese_monster.lua
Mese Monster = Raksasa Mese

#oerkki.lua
Oerkki = Oerkki

#sandmonster.lua
Sand Monster = Raksasa Pasir

#spider.lua
Spider = Labah-labah
Cobweb = Sarang Labah-labah

#stonemonster.lua
Stone Monster = Raksasa Batu

#treemonster.lua
Tree Monster = Raksasa Pokok


code:
# Template for translations of mobs_monster mod
# last update: 2016/June/10

#dirtmonster.lua
Dirt Monster=

#dungeonmaster.lua
Dungeon Master=

#init.lua
[MOD] Mobs Redo 'Monsters' loaded=

#lava_flan.lua
Lava Flan=
Lava orb=
Lava Pickaxe=
Obsidian Flan=

#mese_monster.lua
Mese Monster=

#oerkki.lua
Oerkki=

#sandmonster.lua
Sand Monster=

#spider.lua
Spider=
Cobweb=

#stonemonster.lua
Stone Monster=

#treemonster.lua
Tree Monster=


code:
# Türkçe çeviri by Admicos
# Turkish translation by Admicos

# Son düzenleme: 26 Nisan 2017
# Last edit: 26 April 2017

#dirtmonster.lua
Dirt Monster = Toprak Canavarı

#dungeonmaster.lua
Dungeon Master = Zindan başı

#init.lua
[MOD] Mobs Redo 'Monsters' loaded = [MOD] Mobs Redo 'Canavarlar' yüklendi

#lava_flan.lua
Lava Flan = Lav Flan
Lava orb = Lav küre
Lava Pickaxe = Lav kazması

#mese_monster.lua
Mese Monster = Mese Canavarı

#oerkki.lua
Oerkki = Oerkki

#sandmonster.lua
Sand Monster = Kum Canavarı

#spider.lua
Spider = Örümcek
Cobweb = Örümcek ağı

#stonemonster.lua
Stone Monster = Taş Canavarı

#treemonster.lua
Tree Monster = Ağaç Canavarı


code:
# Template for translations of mobs_monster mod
# last update: 2016/June/10

#dirtmonster.lua
Dirt Monster = 泥土怪

#dungeonmaster.lua
Dungeon Master = 地穴之主

#init.lua
[MOD] Mobs Redo 'Monsters' loaded = [模组] Mobs Redo 'Monsters' 已加载

#lava_flan.lua
Lava Flan = 岩浆饼
Lava orb = 岩浆球
Lava Pickaxe = 岩浆镐
Obsidian Flan = 黑耀石饼

#mese_monster.lua
Mese Monster = 黄石怪

#oerkki.lua
Oerkki = 奥尔基

#sandmonster.lua
Sand Monster = 沙怪

#spider.lua
Spider = 蜘蛛
Cobweb = 蜘蛛网

#stonemonster.lua
Stone Monster = 石头怪

#treemonster.lua
Tree Monster = 树怪


code:
# Template for translations of mobs_monster mod
# last update: 2016/June/10

#dirtmonster.lua
Dirt Monster = 泥土怪

#dungeonmaster.lua
Dungeon Master = 地穴之主

#init.lua
[MOD] Mobs Redo 'Monsters' loaded = [模組] Mobs Redo 'Monsters' 已加載

#lava_flan.lua
Lava Flan = 岩漿餅
Lava orb = 岩漿球
Lava Pickaxe = 岩漿鎬
Obsidian Flan = 黑耀石餅

#mese_monster.lua
Mese Monster = 黃石怪

#oerkki.lua
Oerkki = 奧爾基

#sandmonster.lua
Sand Monster = 沙怪

#spider.lua
Spider = 蜘蛛
Cobweb = 蜘蛛網

#stonemonster.lua
Stone Monster = 石頭怪

#treemonster.lua
Tree Monster = 樹怪


code:
local web = {name = "mobs:cobweb"}
local web_trap = {
	size = {x = 3, y = 3, z = 3},
	data = {
		web, web, web,
		web, web, web,
		web, web, web,

		web, web, web,
		web, web, web,
		web, web, web,

		web, web, web,
		web, web, web,
		web, web, web
	}
}

lucky_block:add_schematics({
	{"webtrap", web_trap, {x = 1, y = 0, z = 1}},
})

lucky_block:add_blocks({
	{"sch", "webtrap", 1, true},
	{"spw", "mobs:dungeon_master", 1, nil, nil, 3, "Billy"},
	{"spw", "mobs:sand_monster", 3},
	{"spw", "mobs:stone_monster", 3, nil, nil, 3, "Bob"},
	{"spw", "mobs:dirt_monster", 3},
	{"spw", "mobs:tree_monster", 3},
	{"spw", "mobs:oerkki", 3},
	{"exp"},
	{"spw", "mobs:spider", 5},
	{"spw", "mobs:mese_monster", 2},
	{"spw", "mobs:lava_flan", 3},
	{"nod", "default:chest", 0, {
		{name = "mobs:lava_orb", max = 1}}},
})


code:
local S = mobs.intllib_monster

local mese_monster_types = {

-- mese_monster_red
{
	y_min = -20,
	y_max = -1000,
	damage = 2,
	reach = 3,
	hp_min = 15,
	hp_max = 25,
	armor = 80,
	skins = {"mobs_mese_monster_red.png"},
	immune_to = {
		{"default:pick_wood", 0},
		{"default:shovel_wood", 0},
		{"default:axe_wood", 0},
		{"default:sword_wood", 0}
	},
	drops = {
		{name = "default:mese_crystal", chance = 15, min = 0, max = 1},
		{name = "default:mese_crystal_fragment", chance = 2, min = 0, max = 1}
	},
	arrow_override = function(self)
		self.velocity = 6
		self.damage = 2
	end
},

-- mese_monster_green
{
	y_min = -1001,
	y_max = -2000,
	damage = 3,
	reach = 3,
	hp_min = 20,
	hp_max = 30,
	armor = 75,
	skins = {"mobs_mese_monster_green.png"},
	immune_to = {
		{"default:pick_wood", 0},
		{"default:shovel_wood", 0},
		{"default:axe_wood", 0},
		{"default:sword_wood", 0},
		{"default:pick_stone", 0},
		{"default:shovel_stone", 0},
		{"default:axe_stone", 0},
		{"default:sword_stone", 0}
	},
	drops = {
		{name = "default:mese_crystal", chance = 12, min = 0, max = 1},
		{name = "default:mese_crystal_fragment", chance = 1, min = 0, max = 1}
	},
	arrow_override = function(self)
		self.velocity = 6
		self.damage = 2
	end
},

-- mese_monster_blue
{
	y_min = -2001,
	y_max = -3000,
	damage = 3,
	reach = 4,
	hp_min = 25,
	hp_max = 35,
	armor = 70,
	skins = {"mobs_mese_monster_blue.png"},
	immune_to = {
		{"default:pick_wood", 0},
		{"default:shovel_wood", 0},
		{"default:axe_wood", 0},
		{"default:sword_wood", 0},
		{"default:pick_stone", 0},
		{"default:shovel_stone", 0},
		{"default:axe_stone", 0},
		{"default:sword_stone", 0},
		{"default:pick_bronze", 0},
		{"default:shovel_bronze", 0},
		{"default:axe_bronze", 0},
		{"default:sword_bronze", 0}
	},
	drops = {
		{name = "default:mese", chance = 15, min = 0, max = 1},
		{name = "default:mese_crystal", chance = 9, min = 0, max = 2},
		{name = "default:mese_crystal_fragment", chance = 1, min = 0, max = 2}
	},
	arrow_override = function(self)
		self.velocity = 7
		self.damage = 3
	end
},

-- mese_monster_purple
{
	y_min = -3000,
	y_max = -31000,
	damage = 4,
	reach = 5,
	hp_min = 30,
	hp_max = 40,
	armor = 60,
	skins = {"mobs_mese_monster_purple.png"},
	immune_to = {
		{"default:pick_wood", 0},
		{"default:shovel_wood", 0},
		{"default:axe_wood", 0},
		{"default:sword_wood", 0},
		{"default:pick_stone", 0},
		{"default:shovel_stone", 0},
		{"default:axe_stone", 0},
		{"default:sword_stone", 0},
		{"default:pick_bronze", 0},
		{"default:shovel_bronze", 0},
		{"default:axe_bronze", 0},
		{"default:sword_bronze", 0},
		{"default:pick_steel", 0},
		{"default:shovel_steel", 0},
		{"default:axe_steel", 0},
		{"default:sword_steel", 0}
	},
	drops = {
		{name = "default:mese", chance = 9, min = 0, max = 1},
		{name = "default:mese_crystal", chance = 6, min = 0, max = 2},
		{name = "default:mese_crystal_fragment", chance = 1, min = 0, max = 3}
	},
	arrow_override = function(self)
		self.velocity = 8
		self.damage = 4
	end
}}

-- Mese Monster by SirrobZeroone
mobs:register_mob("mobs_monster:mese_monster", {
	type = "monster",
	visual_size = {x = 10, y = 10},  -- Got scale wrong in blender by factor of 10 - S01
	passive = false,
	attack_type = "dogshoot",
	damage = 4,
	reach = 4,
	shoot_interval = 0.5,
	arrow = "mobs_monster:mese_arrow",
	shoot_offset = 0.75,
--	arrow_override = function(self)
--		self.velocity = 20
--	end,
	knock_back = true,
	hp_min = 10,
	hp_max = 25,
	armor = 80,
	collisionbox = {-0.75, -0.5, -0.75, 0.75, 2.5, 0.75},
	visual = "mesh",
	mesh = "mobs_mese_monster.b3d",
	textures = {
		{"mobs_mese_monster_purple.png"}
	},
	blood_texture = "default_mese_crystal_fragment.png",
	makes_footstep_sound = false,
	sounds = {
		random = "mobs_mesemonster",
		damage = "default_glass_footstep"
	},
	view_range = 10,
	walk_velocity = 1,
	run_velocity = 3,
	jump = true,
	jump_height = 8,
	can_leap = true,
	fall_damage = 0,
	fall_speed = -6,
	stepheight = 2.1,
	immune_to = {
		{"default:pick_wood", 0},
		{"default:shovel_wood", 0},
		{"default:axe_wood", 0},
		{"default:sword_wood", 0}
	},
	drops = {
		{name = "default:mese_crystal", chance = 9, min = 0, max = 2},
		{name = "default:mese_crystal_fragment", chance = 1, min = 0, max = 2},
	},
	water_damage = 1,
	lava_damage = 1,
	light_damage = 0,
	animation = {
		speed_normal = 18,
		speed_run    = 18,
		walk_start   = 10,
		walk_end     = 41,
		walk_speed   = 20,
		run_start    = 10,
		run_end      = 41,
		run_speed    = 30,
		stand_start  = 60,
		stand_end    = 83,
		shoot_start  = 100,
		shoot_end    = 113,
		die_start    = 125,
		die_end      = 141,
		death_speed  = 25,
		die_loop     = false,
		jump_start   = 150 ,
		jump_end     = 168,
		jump_loop    = false,
		punch_start  = 175,
		punch_end    = 189
	},

	on_spawn = function(self)

		local pos = self.object:get_pos()

		-- quick update self function
		local function update(self, def)

			self.object:set_properties({textures = def.skins})

			-- added by mobs_redo
			self.hp_min = def.hp_min
			self.hp_max = def.hp_max
			self.health = math.random(self.hp_min, self.hp_max)
			self.damage = def.damage
			self.reach = def.reach
			self.armor = def.armor
			self.immune_to = def.immune_to
			self.drops = def.drops
			self.arrow_override = def.arrow_override
		end

		-- Normal spawn case
		for name, def in pairs(mese_monster_types) do

			if pos.y <= def.y_min and pos.y >= def.y_max then

				update(self, def)

				return true
			end
		end
--[[
		-- player using egg
		-- direction sets type N = red, E = green, S = blue, W = purple
		-- Just for fun - S01

		local objects = minetest.get_objects_inside_radius(pos, 10)

		for i, obj in ipairs(objects) do

			if minetest.is_player(obj)
			and obj:get_wielded_item():get_name() == "mobs_monster:mese_monster" then

				local degree = (360 + math.deg(obj:get_look_horizontal())) % 360
				local compass_sel

				if degree > 45 and degree <= 135      then compass_sel = 4
				elseif degree > 135 and degree <= 225 then compass_sel = 3
				elseif degree > 225 and degree <= 315 then compass_sel = 2
				else  							 	       compass_sel = 1
				end

				local def = mese_monster_types[compass_sel]

				update(self, def)

				return true
			end
		end
]]
		-- catch case if all else fails random it
		update(self, mese_monster_types[math.random(4)])

		return true
	end
})

-- mese arrow (weapon)
minetest.register_craftitem("mobs_monster:mese_crystal_fragment_arrow", {
	description = S("Mese Monster Arrow"),
	inventory_image = "mobs_mese_arrow.png",
	groups = {not_in_creative_inventory = 1}
})

mobs:register_arrow("mobs_monster:mese_arrow", {
	visual = "wielditem",
	visual_size = {x = 0.25, y = 0.25},
	textures = {"mobs_monster:mese_crystal_fragment_arrow"},
	velocity = 8,
	rotate = 180,
	damage = 2,

	hit_player = function(self, player)
		player:punch(self.object, 1.0, {
			full_punch_interval = 1.0,
			damage_groups = {fleshy = self.damage}
		}, nil)
	end,

	hit_mob = function(self, player)
		player:punch(self.object, 1.0, {
			full_punch_interval = 1.0,
			damage_groups = {fleshy = self.damage}
		}, nil)
	end,

	hit_node = function(self, pos, node)
	end
})

if not mobs.custom_spawn_monster then

	mobs:spawn({
		name = "mobs_monster:mese_monster",
		nodes = {"default:stone"},
		max_light = 7,
		chance = 5000,
		active_object_count = 1,
		max_height = -20
	})
end

mobs:register_egg("mobs_monster:mese_monster", S("Mese Monster"), "default_mese_block.png", 1)

mobs:alias_mob("mobs:mese_monster", "mobs_monster:mese_monster") -- compatiblity

-- 9x mese crystal fragments = 1x mese crystal
local f = "default:mese_crystal_fragment"

minetest.register_craft({
	output = "default:mese_crystal",
	recipe = {{f, f, f}, {f, f, f}, {f, f, f}}
})


code:
name = mobs_monster
depends = mobs
optional_depends = default, lucky_block, toolranks, intllib
description = Adds many types of monsters.


code:
local S = mobs.intllib_monster

-- Oerkki by PilzAdam

mobs:register_mob("mobs_monster:oerkki", {
	type = "monster",
	passive = false,
	attack_type = "dogfight",
	pathfinding = true,
	reach = 2,
	damage = 4,
	hp_min = 8,
	hp_max = 34,
	armor = 100,
	collisionbox = {-0.4, -1, -0.4, 0.4, 0.9, 0.4},
	visual = "mesh",
	mesh = "mobs_oerkki.b3d",
	textures = {
		{"mobs_oerkki.png"},
		{"mobs_oerkki2.png"},
		{"mobs_oerkki3.png"}
	},
	makes_footstep_sound = false,
	sounds = {
		random = "mobs_oerkki"
	},
	walk_velocity = 1,
	run_velocity = 3,
	view_range = 10,
	jump = true,
	drops = {
		{name = "default:obsidian", chance = 3, min = 0, max = 2},
		{name = "default:gold_lump", chance = 2, min = 0, max = 2}
	},
	water_damage = 2,
	lava_damage = 4,
	light_damage = 1,
	fear_height = 4,
	animation = {
		stand_start = 0,
		stand_end = 23,
		walk_start = 24,
		walk_end = 36,
		run_start = 37,
		run_end = 49,
		punch_start = 37,
		punch_end = 49,
		speed_normal = 15,
		speed_run = 15
	},
	replace_rate = 5,
	replace_what = {"default:torch"},
	replace_with = "air",
	replace_offset = -1,
	immune_to = {
		{"default:sword_wood", 0}, -- no damage
		{"default:gold_lump", -10} -- heals by 10 points
	},
})

if not mobs.custom_spawn_monster then

	mobs:spawn({
		name = "mobs_monster:oerkki",
		nodes = {"default:stone"},
		max_light = 7,
		chance = 7000,
		max_height = -10
	})
end

mobs:register_egg("mobs_monster:oerkki", S("Oerkki"), "default_obsidian.png", 1)

mobs:alias_mob("mobs:oerkki", "mobs_monster:oerkki") -- compatiblity


code:
MONSTER MOBS

Dirt Monster

- Spawning at night on green grass (or grey in ethereal) these mobs wander around looking for a player to eat. Drops 1-5 dirt when killed.

Dungeon Master

- Spawning below -70 underground DM's have a tendency to hurl fire balls at unsuspecting players and can cause major damage, but get too close and he will switch to dogfight attack. Can drop mese or diamond when killed.

Lava Flan

- Cute as they may look lava flan wallow in their namesake (no, not flans) and get curious about players who wander by, forgetting that they can burn you and cause damage. They have a 1 in 5 chance of dropping lava orb when killed, but if they die in water then pray they dont solidify into an obsidian flan that shoots shards and destroys all around them.

Mese Monster

- These mobs are territorial and spawn below -20 and will fire mese shards at passers by, so best avoided. The deeper you go the tougher they seem to get. Will drop mese when killed.

Oerkki

- Found in dark areas like most monsters Oerkki wander the caverns stealing away torches on the ground and attacking anyone found in that area. 1 in 3 chance of dropping obsidian.

Sand Monster

- The hot deserts are home to these guys who spawn at any time of the day to attack players. They drop 3-5 desert sand when killed.

Spiders

- Snowy spiders are found on higher cold areas, spitting Tarantula's in higher jungle, small Cave spider below -20 and Mese spider near areas containing the ore and Crystal spiders only in Ethereal's crystal biomes.  Some are docile during the daytime and will drop string when killed.

Stone Monster

- Found underground in dark caves these mobs seem to be zombie-like in fashion with a tendency to rush a player in the area. can drop torch, iron or coal when killed.

Tree Monster

- Found atop tree's at night time they drop down and look for food in the form of players and animals. Can drop saplings and sometimes an apple or three depending on type.  Also note that green tree creepers exist and sometimes go boom.

Land Guard

- These huge monsters roam the land in cold, hot and temperate areas and don't like players wandering around their domain.

Fire Spirit

- Fire Spirits will not tolerate players roaming around their domain and will fiercely attack until their dying puff of smoke.  Will drop it's spirit and some fire dust when using ethereal.

Lucky Blocks: 11


code:
local S = mobs.intllib_monster

-- custom particle effects
local effect = function(pos, amount, texture, min_size, max_size, radius, gravity, glow)

	radius = radius or 2
	min_size = min_size or 0.5
	max_size = max_size or 1
	gravity = gravity or -10
	glow = glow or 0

	minetest.add_particlespawner({
		amount = amount,
		time = 0.25,
		minpos = pos,
		maxpos = pos,
		minvel = {x = -radius, y = -radius, z = -radius},
		maxvel = {x = radius, y = radius, z = radius},
		minacc = {x = 0, y = gravity, z = 0},
		maxacc = {x = -20, y = gravity, z = 15},
		minexptime = 0.1,
		maxexptime = 1,
		minsize = min_size,
		maxsize = max_size,
		texture = texture,
		glow = glow
	})
end

-- Sand Monster by PilzAdam

mobs:register_mob("mobs_monster:sand_monster", {
	type = "monster",
	passive = false,
	attack_type = "dogfight",
	pathfinding = true,
	--specific_attack = {"player", "mobs_npc:npc"},
	--ignore_invisibility = true,
	reach = 2,
	damage = 1,
	hp_min = 4,
	hp_max = 20,
	armor = 100,
	collisionbox = {-0.4, -1, -0.4, 0.4, 0.8, 0.4},
	visual = "mesh",
	mesh = "mobs_sand_monster.b3d",
	textures = {
		{"mobs_sand_monster.png"},
		{"mobs_sand_monster2.png"}
	},
	blood_texture = "default_desert_sand.png",
	makes_footstep_sound = true,
	sounds = {
		random = "mobs_sandmonster"
	},
	walk_velocity = 1.5,
	run_velocity = 4,
	view_range = 8,
	jump = true,
	floats = 0,
	drops = {
		{name = "default:desert_sand", chance = 1, min = 3, max = 5}
	},
	water_damage = 3,
	lava_damage = 4,
	light_damage = 0,
	fear_height = 4,
	animation = {
		speed_normal = 15,
		speed_run = 15,
		stand_start = 0,
		stand_end = 39,
		walk_start = 41,
		walk_end = 72,
		run_start = 74,
		run_end = 105,
		punch_start = 74,
		punch_end = 105
	},
	immune_to = {
		{"default:shovel_wood", 3}, -- shovels deal more damage to sand monster
		{"default:shovel_stone", 3},
		{"default:shovel_bronze", 4},
		{"default:shovel_steel", 4},
		{"default:shovel_mese", 5},
		{"default:shovel_diamond", 7}
	},
--[[
	custom_attack = function(self, p)
		local pos = self.object:get_pos()
		minetest.add_item(pos, "default:sand")
	end,
]]
	on_die = function(self, pos)
		pos.y = pos.y + 0.5
		mobs:effect(pos, 30, "mobs_sand_particles.png", .1, 2, 3, 5)
		pos.y = pos.y + 0.25
		mobs:effect(pos, 30, "mobs_sand_particles.png", .1, 2, 3, 5)
	end,
--[[
	on_rightclick = function(self, clicker)

		local tool = clicker:get_wielded_item()
		local name = clicker:get_player_name()

		if tool:get_name() == "default:sand" then

			self.owner = name
			self.type = "npc"

			mobs:force_capture(self, clicker)
		end
	end,
]]
})

if not mobs.custom_spawn_monster then

	mobs:spawn({
		name = "mobs_monster:sand_monster",
		nodes = {"default:desert_sand"},
		chance = 7000,
		active_object_count = 2,
		min_height = 0
	})
end

mobs:register_egg("mobs_monster:sand_monster", S("Sand Monster"),
		"default_desert_sand.png", 1)

mobs:alias_mob("mobs:sand_monster", "mobs_monster:sand_monster") -- compatibility


code:
--[[ Spawn Template, defaults to values shown if line not provided

mobs:spawn({

	name = "",

		- Name of mob, must be provided e.g. "mymod:my_mob"

	nodes = {"group:soil, "group:stone"},

		- Nodes to spawn on top of.

	neighbors = {"air"},

		- Nodes to spawn beside.

	min_light = 0,

		- Minimum light level.

	max_light = 15,

		- Maximum light level, 15 is sunlight only.

	interval = 30,

		- Spawn interval in seconds.

	chance = 5000,

		- Spawn chance, 1 in every 5000 nodes.

	active_object_count = 1,

		- Active mobs of this type in area.

	min_height = -31000,

		- Minimum height level.

	max_height = 31000,

		- Maximum height level.

	day_toggle = nil,

		- Daytime toggle, true to spawn during day, false for night, nil for both

	on_spawn = nil,

		- On spawn function to run when mob spawns in world

	on_map_load = nil,

		- On map load, when true mob only spawns in newly generated map areas
})
]]--

-- Dirt Monster

mobs:spawn({
	name = "mobs_monster:dirt_monster",
	nodes = {"default:dirt_with_grass"},
	min_light = 0,
	max_light = 7,
	chance = 6000,
	active_object_count = 2,
	min_height = 0,
	day_toggle = false,
})

-- Dungeon Master

mobs:spawn({
	name = "mobs_monster:dungeon_master",
	nodes = {"default:stone"},
	max_light = 5,
	chance = 9000,
	active_object_count = 1,
	max_height = -70,
})

-- Lava Flan

mobs:spawn({
	name = "mobs_monster:lava_flan",
	nodes = {"default:lava_source"},
	chance = 1500,
	active_object_count = 1,
	max_height = 0,
})

-- Mese Monster

mobs:spawn({
	name = "mobs_monster:mese_monster",
	nodes = {"default:stone"},
	max_light = 7,
	chance = 5000,
	active_object_count = 1,
	max_height = -20,
})

-- Oerkki

mobs:spawn({
	name = "mobs_monster:oerkki",
	nodes = {"default:stone"},
	max_light = 7,
	chance = 7000,
	max_height = -10,
})

-- Sand Monster

mobs:spawn({
	name = "mobs_monster:sand_monster",
	nodes = {"default:desert_sand"},
	chance = 7000,
	active_object_count = 2,
	min_height = 0,
})

-- Spider (above ground)

mobs:spawn({
	name = "mobs_monster:spider",
	nodes = {
		"default:dirt_with_rainforest_litter", "default:snowblock",
		"default:snow", "ethereal:crystal_dirt", "ethereal:cold_dirt"
	},
	min_light = 0,
	max_light = 8,
	chance = 7000,
	active_object_count = 1,
	min_height = 25,
	max_height = 31000,
})

-- Spider (below ground)
mobs:spawn({
	name = "mobs_monster:spider",
	nodes = {"default:stone_with_mese", "default:mese", "default:stone"},
	min_light = 0,
	max_light = 7,
	chance = 7000,
	active_object_count = 1,
	min_height = -31000,
	max_height = -40,
})

-- Stone Monster

mobs:spawn({
	name = "mobs_monster:stone_monster",
	nodes = {"default:stone", "default:desert_stone", "default:sandstone"},
	max_light = 7,
	chance = 7000,
	max_height = 0,
})

-- Tree Monster

mobs:spawn({
	name = "mobs_monster:tree_monster",
	nodes = {"default:leaves", "default:jungleleaves"},
	max_light = 7,
	chance = 7000,
	min_height = 0,
	day_toggle = false,
})


code:
local S = mobs.intllib_monster

local get_velocity = function(self)

	local v = self.object:get_velocity()

	-- sanity check
	if not v then return 0 end

	return (v.x * v.x + v.z * v.z) ^ 0.5
end

local spider_types = {

	{	nodes = {"default:snow", "default:snowblock", "default:dirt_with_snow"},
		skins = {"mobs_spider_snowy.png"},
		docile = true,
		drops = nil
	},

	{	nodes = {"default:dirt_with_rainforest_litter", "default:jungletree"},
		skins = {"mobs_spider_orange.png"},
		docile = true,
		drops = nil,
		shoot = true
	},

	{	nodes = {"default:stone", "default:gravel"},
		skins = {"mobs_spider_grey.png"},
		docile = nil,
		drops = nil,
		small = true
	},

	{	nodes = {"default:mese", "default:stone_with_mese"},
		skins = {"mobs_spider_mese.png"},
		docile = nil,
		drops = {
			{name = "farming:string", chance = 1, min = 0, max = 2},
			{name = "default:mese_crystal_fragment", chance = 2, min = 1, max = 4}}
	},

	{	nodes = {"ethereal:crystal_dirt", "ethereal:crystal_spike"},
		skins = {"mobs_spider_crystal.png"},
		docile = true,
		drops = {
			{name = "farming:string", chance = 1, min = 0, max = 2},
			{name = "ethereal:crystal_spike", chance = 15, min = 1, max = 2}}
	}
}

-- Spider by AspireMint (CC-BY-SA 3.0 license)

mobs:register_mob("mobs_monster:spider", {
	--docile_by_day = true,
	group_attack = true,
	type = "monster",
	passive = false,
	attack_type = "dogfight",
	reach = 2,
	damage = 3,
	hp_min = 10,
	hp_max = 30,
	armor = 200,
	collisionbox = {-0.8, -0.5, -0.8, 0.8, 0, 0.8},
	visual_size = {x = 1, y = 1},
	visual = "mesh",
	mesh = "mobs_spider.b3d",
	textures = {
		{"mobs_spider_mese.png"},
		{"mobs_spider_orange.png"},
		{"mobs_spider_snowy.png"},
		{"mobs_spider_grey.png"},
		{"mobs_spider_crystal.png"}
	},
	makes_footstep_sound = false,
	sounds = {
		random = "mobs_spider",
		attack = "mobs_spider"
	},
	walk_velocity = 1,
	run_velocity = 3,
	jump = true,
	view_range = 15,
	floats = 0,
	drops = {
		{name = "farming:string", chance = 1, min = 0, max = 2}
	},
	water_damage = 5,
	lava_damage = 5,
	light_damage = 0,
	animation = {
		speed_normal = 15,
		speed_run = 20,
		stand_start = 0,
		stand_end = 0,
		walk_start = 1,
		walk_end = 21,
		run_start = 1,
		run_end = 21,
		punch_start = 25,
		punch_end = 45
	},

	-- check surrounding nodes and spawn a specific spider
	on_spawn = function(self)

		local pos = self.object:get_pos() ; pos.y = pos.y - 1
		local tmp

		for n = 1, #spider_types do

			tmp = spider_types[n]

			if minetest.find_node_near(pos, 1, tmp.nodes) then

				self.base_texture = tmp.skins
				self.object:set_properties({textures = tmp.skins})
				self.docile_by_day = tmp.docile

				if tmp.drops then
					self.drops = tmp.drops
				end

				if tmp.shoot then
					self.attack_type = "dogshoot"
					self.arrow = "mobs_monster:cobweb"
					self.dogshoot_switch = 1
					self.dogshoot_count_max = 60
					self.dogshoot_count2_max = 20
					self.shoot_interval = 2
					self.shoot_offset = 2
				end

				if tmp.small then
					self.object:set_properties({
						collisionbox = {-0.2, -0.2, -0.2, 0.2, 0, 0.2},
						visual_size = {x = 0.25, y = 0.25}
					})
				end

				return true
			end
		end

		return true -- run only once, false/nil runs every activation
	end,

	-- custom function to make spiders climb vertical facings
	do_custom = function(self, dtime)

		-- quarter second timer
		self.spider_timer = (self.spider_timer or 0) + dtime
		if self.spider_timer < 0.25 then
			return
		end
		self.spider_timer = 0

		-- need to be stopped to go onwards
		if get_velocity(self) > 0.5 then
			self.disable_falling = nil
			return
		end

		local pos = self.object:get_pos()
		local yaw = self.object:get_yaw()

		-- sanity check
		if not yaw then return end

		pos.y = pos.y + self.collisionbox[2] - 0.2

		local dir_x = -math.sin(yaw) * (self.collisionbox[4] + 0.5)
		local dir_z = math.cos(yaw) * (self.collisionbox[4] + 0.5)
		local nod = minetest.get_node_or_nil({
			x = pos.x + dir_x,
			y = pos.y + 0.5,
			z = pos.z + dir_z
		})

		-- get current velocity
		local v = self.object:get_velocity()

		-- can only climb solid facings
		if not nod or not minetest.registered_nodes[nod.name]
		or not minetest.registered_nodes[nod.name].walkable then
			self.disable_falling = nil
			v.y = 0
			self.object:set_velocity(v)
			return
		end

--print ("----", nod.name, self.disable_falling, dtime)

		-- turn off falling if attached to facing
		self.disable_falling = true

		-- move up facing
		v.x = 0 ; v.y = 0
		v.y = self.jump_height
		mobs:set_animation(self, "jump")
		self.object:set_velocity(v)
	end,

	-- make spiders jump at you on attack
	custom_attack = function(self, pos)

		local vel = self.object:get_velocity()

		self.object:set_velocity({
			x = vel.x * self.run_velocity,
			y = self.jump_height * 1.5,
			z = vel.z * self.run_velocity
		})

		self.pausetimer = 0.5

		return true -- continue rest of attack function
	end
})

if not mobs.custom_spawn_monster then

	-- above ground spawn
	mobs:spawn({
		name = "mobs_monster:spider",
		nodes = {
			"default:dirt_with_rainforest_litter", "default:snowblock",
			"default:snow", "ethereal:crystal_dirt", "ethereal:cold_dirt"
		},
		min_light = 0,
		max_light = 8,
		chance = 7000,
		active_object_count = 1,
		min_height = 25,
		max_height = 31000
	})

	-- below ground spawn
	mobs:spawn({
		name = "mobs_monster:spider",
		nodes = {"default:stone_with_mese", "default:mese", "default:stone"},
		min_light = 0,
		max_light = 7,
		chance = 7000,
		active_object_count = 1,
		min_height = -31000,
		max_height = -40
	})
end

mobs:register_egg("mobs_monster:spider", S("Spider"), "mobs_cobweb.png", 1)

mobs:alias_mob("mobs_monster:spider2", "mobs_monster:spider") -- compatibility
mobs:alias_mob("mobs:spider", "mobs_monster:spider")

-- cobweb
minetest.register_node(":mobs:cobweb", {
	description = S("Cobweb"),
	drawtype = "plantlike",
	visual_scale = 1.2,
	tiles = {"mobs_cobweb.png"},
	inventory_image = "mobs_cobweb.png",
	paramtype = "light",
	sunlight_propagates = true,
	liquid_viscosity = 11,
	liquidtype = "source",
	liquid_alternative_flowing = "mobs:cobweb",
	liquid_alternative_source = "mobs:cobweb",
	liquid_renewable = false,
	liquid_range = 0,
	walkable = false,
	groups = {snappy = 1, disable_jump = 1},
	drop = "farming:string",
	sounds = default.node_sound_leaves_defaults()
})

minetest.register_craft({
	output = "mobs:cobweb",
	recipe = {
		{"farming:string", "", "farming:string"},
		{"", "farming:string", ""},
		{"farming:string", "", "farming:string"}
	}
})

local web_place = function(pos)

	if minetest.find_node_near(pos, 1, {"ignore"}) then return end

	local pos2 = minetest.find_node_near(pos, 1, {"air", "group:leaves"}, true)

	if pos2 then
		minetest.swap_node(pos2, {name = "mobs:cobweb"})
	end
end

mobs:register_arrow("mobs_monster:cobweb", {
	visual = "sprite",
	visual_size = {x = 1, y = 1},
	textures = {"mobs_cobweb.png"},
	collisionbox = {-0.1, -0.1, -0.1, 0.1, 0.1, 0.1},
	velocity = 15,
	tail = 1,
	tail_texture = "mobs_cobweb.png",
	tail_size = 5,
	glow = 2,
	expire = 0.1,

	hit_player = function(self, player)

		player:punch(self.object, 1.0, {
			full_punch_interval = 2.0,
			damage_groups = {fleshy = 3}
		}, nil)

		web_place(self.object:get_pos())
	end,

	hit_node = function(self, pos, node)
		web_place(pos)
	end,

	hit_mob = function(self, player)

		player:punch(self.object, 1.0, {
			full_punch_interval = 2.0,
			damage_groups = {fleshy = 3}
		}, nil)
	end
})


code:
local S = mobs.intllib_monster

local stone_types = {

	{	nodes = {"default:desert_stone"},
		skins = {"mobs_stone_monster3.png"},
		drops = {
			{name = "default:desert_cobble", chance = 1, min = 0, max = 2},
			{name = "default:iron_lump", chance = 5, min = 0, max = 2},
			{name = "default:gold_lump", chance = 5, min = 0, max = 2}
		}
	}
}

-- Stone Monster by PilzAdam

mobs:register_mob("mobs_monster:stone_monster", {
	type = "monster",
	passive = false,
	attack_type = "dogfight",
	pathfinding = true,
	reach = 2,
	damage = 3,
	hp_min = 12,
	hp_max = 35,
	armor = 80,
	collisionbox = {-0.4, -1, -0.4, 0.4, 0.9, 0.4},
	visual = "mesh",
	mesh = "mobs_stone_monster.b3d",
	textures = {
		{"mobs_stone_monster.png"},
		{"mobs_stone_monster2.png"} -- by AMMOnym
	},
	makes_footstep_sound = true,
	sounds = {
		random = "mobs_stonemonster"
	},
	walk_velocity = 1,
	run_velocity = 2,
	jump_height = 0,
	stepheight = 1.1,
	floats = 0,
	view_range = 10,
	drops = {
		{name = "default:cobble", chance = 1, min = 0, max = 2},
		{name = "default:coal_lump", chance = 3, min = 0, max = 2},
		{name = "default:iron_lump", chance = 5, min = 0, max = 2}
	},
	water_damage = 0,
	lava_damage = 1,
	light_damage = 0,
	animation = {
		speed_normal = 15,
		speed_run = 15,
		stand_start = 0,
		stand_end = 14,
		walk_start = 15,
		walk_end = 38,
		run_start = 40,
		run_end = 63,
		punch_start = 40,
		punch_end = 63
	},
	immune_to = {
		{"default:pick_wood", 0}, -- wooden pick doesnt hurt stone monster
		{"default:pick_stone", 4}, -- picks deal more damage to stone monster
		{"default:pick_bronze", 5},
		{"default:pick_steel", 5},
		{"default:pick_mese", 6},
		{"default:pick_diamond", 7}
	},

	-- check surrounding nodes and spawn a specific spider
	on_spawn = function(self)

		local pos = self.object:get_pos() ; pos.y = pos.y - 1
		local tmp

		for n = 1, #stone_types do

			tmp = stone_types[n]

			if minetest.find_node_near(pos, 1, tmp.nodes) then

				self.base_texture = tmp.skins
				self.object:set_properties({textures = tmp.skins})

				if tmp.drops then
					self.drops = tmp.drops
				end

				return true
			end
		end

		return true -- run only once, false/nil runs every activation
	end
})

if not mobs.custom_spawn_monster then

	mobs:spawn({
		name = "mobs_monster:stone_monster",
		nodes = {"default:stone", "default:desert_stone", "default:sandstone"},
		max_light = 7,
		chance = 7000,
		max_height = 0
	})
end

mobs:register_egg("mobs_monster:stone_monster", S("Stone Monster"), "default_stone.png", 1)

mobs:alias_mob("mobs:stone_monster", "mobs_monster:stone_monster") -- compatibility


code:
local S = mobs.intllib_monster

local tree_types = {

	{	nodes = {"ethereal:sakura_leaves", "ethereal:sakura_leaves2"},
		skins = {"mobs_tree_monster5.png"},
		drops = {
			{name = "default:stick", chance = 1, min = 1, max = 3},
			{name = "ethereal:sakura_leaves", chance = 1, min = 1, max = 2},
			{name = "ethereal:sakura_trunk", chance = 2, min = 1, max = 2},
			{name = "ethereal:sakura_tree_sapling", chance = 2, min = 0, max = 2}
		}
	},

	{	nodes = {"ethereal:frost_leaves"},
		skins = {"mobs_tree_monster3.png"},
		drops = {
			{name = "default:stick", chance = 1, min = 1, max = 3},
			{name = "ethereal:frost_leaves", chance = 1, min = 1, max = 2},
			{name = "ethereal:frost_tree", chance = 2, min = 1, max = 2},
			{name = "ethereal:crystal_spike", chance = 4, min = 0, max = 2}
		}
	},

	{	nodes = {"ethereal:yellowleaves"},
		skins = {"mobs_tree_monster4.png"},
		drops = {
			{name = "default:stick", chance = 1, min = 1, max = 3},
			{name = "ethereal:yellowleaves", chance = 1, min = 1, max = 2},
			{name = "ethereal:yellow_tree_sapling", chance = 2, min = 0, max = 2},
			{name = "ethereal:golden_apple", chance = 3, min = 0, max = 2}
		}
	},

	{	nodes = {"default:acacia_bush_leaves"},
		skins = {"mobs_tree_monster6.png"},
		drops = {
			{name = "tnt:gunpowder", chance = 1, min = 0, max = 2},
			{name = "default:iron_lump", chance = 5, min = 0, max = 2},
			{name = "default:coal_lump", chance = 3, min = 0, max = 3}
		},
		explode = true
	}
}

-- Tree Monster (or Tree Gollum) by PilzAdam

mobs:register_mob("mobs_monster:tree_monster", {
	type = "monster",
	passive = false,
	attack_type = "dogfight",
	attack_animals = true,
	--specific_attack = {"player", "mobs_animal:chicken"},
	reach = 2,
	damage = 2,
	hp_min = 20,
	hp_max = 40,
	armor = 100,
	collisionbox = {-0.4, -1, -0.4, 0.4, 0.8, 0.4},
	visual = "mesh",
	mesh = "mobs_tree_monster.b3d",
	textures = {
		{"mobs_tree_monster.png"},
		{"mobs_tree_monster2.png"}
	},
	blood_texture = "default_wood.png",
	makes_footstep_sound = true,
	sounds = {
		random = "mobs_treemonster"
	},
	walk_velocity = 1,
	run_velocity = 3,
	jump = true,
	view_range = 15,
	drops = {
		{name = "default:stick", chance = 1, min = 0, max = 2},
		{name = "default:sapling", chance = 2, min = 0, max = 2},
		{name = "default:junglesapling", chance = 3, min = 0, max = 2},
		{name = "default:apple", chance = 4, min = 1, max = 2}
	},
	water_damage = 0,
	lava_damage = 0,
	light_damage = 2,
	fall_damage = 0,
	immune_to = {
		{"default:axe_wood", 0}, -- wooden axe doesnt hurt wooden monster
		{"default:axe_stone", 4}, -- axes deal more damage to tree monster
		{"default:axe_bronze", 5},
		{"default:axe_steel", 5},
		{"default:axe_mese", 7},
		{"default:axe_diamond", 9},
		{"default:sapling", -5}, -- default and jungle saplings heal
		{"default:junglesapling", -5},
--		{"all", 0}, -- only weapons on list deal damage
	},
	animation = {
		speed_normal = 15,
		speed_run = 15,
		stand_start = 0,
		stand_end = 24,
		walk_start = 25,
		walk_end = 47,
		run_start = 48,
		run_end = 62,
		punch_start = 48,
		punch_end = 62
	},

	-- check surrounding nodes and spawn a specific tree monster
	on_spawn = function(self)

		local pos = self.object:get_pos() ; pos.y = pos.y - 1
		local tmp

		for n = 1, #tree_types do

			tmp = tree_types[n]

			if tmp.explode and math.random(2) == 1 then return true end

			if minetest.find_node_near(pos, 1, tmp.nodes) then

				self.base_texture = tmp.skins
				self.object:set_properties({textures = tmp.skins})

				if tmp.drops then
					self.drops = tmp.drops
				end

				if tmp.explode then
					self.attack_type = "explode"
					self.explosion_radius = 3
					self.explosion_timer = 3
					self.damage = 21
					self.reach = 3
					self.fear_height = 4
					self.water_damage = 2
					self.lava_damage = 15
					self.light_damage = 0
					self.makes_footstep_sound = false
					self.runaway_from = {"mobs_animal:kitten"}
					self.sounds = {
						attack = "tnt_ignite",
						explode = "tnt_explode",
						fuse = "tnt_ignite"
					}
				end

				return true
			end
		end

		return true -- run only once, false/nil runs every activation
	end
})

if not mobs.custom_spawn_monster then

	mobs:spawn({
		name = "mobs_monster:tree_monster",
		nodes = {"group:leaves"},
		max_light = 7,
		chance = 7000,
		min_height = 0,
		day_toggle = false
	})
end

mobs:register_egg("mobs_monster:tree_monster", S("Tree Monster"), "default_tree_top.png", 1)

mobs:alias_mob("mobs:tree_monster", "mobs_monster:tree_monster") -- compatibility


code:
/*.txt
/*.project
/*~
/config.*
*.hi
*.o
lunacat/lunacat2

repo_name: orbea/witch

path: .gitignore


code:
the old gitorious intro
=======================

weight of a duck, burn em.

a distro notion started in early 2010, with the philosophy of no centralised organisation, no official, no core default... the idea being, it's more like wicca, than catholicism, in it's organisational structure. anyone can stand up to accomplish any task they see fit for witch. be that adding some script, releasing an iso, making a forum, a mailing list, a wiki, anything.

the policy is, "do, and inform. dont ask." meaning, there's no "can i do this" or "can i have this", since there's no boss to ask. witch encourages autonomy, and a fully empowered community.

less philosophically and more practically, witch has progressed from releases based on slax, debian, arch, slitaz and slackware, to a grander idea embodied in "witchcraft" to enable users to create and share their own distros and desktops, built upon any base distro. so far, the basic gentoo stuff is just about working, though not yet the full featureset. the plan is to include other gentoo-like distros (funtoo, exherbo), bedrock, freebsd, debian, etc etc etc. so the user has their choice of base distro under the hood, and also, the desktop environment will be up to their choice too, with the ability to create their own desktop environments, and share them, and use other people's shared desktop environments too. and able to share not just the desktop environments, but also the remastered iso too.

please feel free to join in the fun in reaching for this rather grand goal (or joining in in any other way you like). come see us in #witchlinux on irc.freenode.net

about this repository
=====================

this repository is mainly for witchcraft, but will gladly accomodate any and all other projects reasonably on-topic for witch.

this is digit's git, you are free (and encouraged) to make your own witch repos too, though digit will probably add you as contributor here, once you've hung around in #witchlinux on irc.freenode.net for a bit.

See [history](https://notabug.org/Digit/witch/src/master/HISTORY.md), [philosophy](https://notabug.org/Digit/witch/src/master/philosophy.md), [witchcraft](https://notabug.org/Digit/witch/src/master/witchcraft/README.md) and [witchsites](https://notabug.org/Digit/witch/src/master/witchsites.md) for more infomation about [witch](https://notabug.org/Digit/witch) and [witches](https://notabug.org/Digit/witch/src/master/witches.md).


code:
#+TITLE: BIRCH is rowan compressed harder
~:dev notes for a new witch idea in 2014:~
 - Digit strikes again with another idea for a witch.  (and somewhat parodies/models (t)his readme on the readme for [[https://github.com/Digit/witch/blob/master/eagle/README.org][wgreenhouse's EAGLE]] ).

* BIRCH
** The Notion

Make a witch that's bedrock based ultra minimal but useable core, more minimal than rowan, but more capable of expansion, as per Digit's initial ideas surrounding the use of package format converters... 'cept with bedrock's way of gaining access to all packages.

*** Software candidates:

     - Linux kernel

     - busybox

     - musl

     - fuse

     - Linux capabilities

     - udev

     - gpm

     - dvtm

     - ii

     - ii scripts

     - birch scripts

     - witchcraft scripts

*** Elaboration on software selection

it's just bedrock, ready to go, ootb, with some easy facilitation scripts, ii scripts to help you get help.  basically, it's bedrock, with dvtm and ii, and enough to get online, and get up n running with some kind of robust system for whatever your need...   scripts it carries can grow, but the idea being, it's just a simple stump to help you get going.  just the bedrock core, n no much more...  ... but a few witchcraft-esq scripts n the like.  who knows, it's just a notion at the moment.  pure vaporware.

**** ii scripts
Digit's got some of his own, or maybe something more elaborate like iii... lots of choice.  why?  cos ii b so darn minimal, it needs a little helping nudge, n irc is great for initial help getting going in a new os... so we gotta include ii, n enough to help any newbie use it.

**** birch scripts
idk, scripts to help out get birch growing from its initial stub, scripts to get diffeerent distros installed in birch, scripts for configurations, scripts for this that, whatever.

**** witchcraft scripts
the installation, remaster, rspm, all that jazz... if we ever get it all made n working.  ;)

**** udev
udev > mdev
will make things easier down the road.
consider looking at what gentoo are up to on that front.  ;) :) :)

**** others
open to suggestions.
suckless?
smaller?

*** TODO plan
**** TODO finalise added software
**** TODO wait for bedrock
test builds might happen, but not until a finalised version.
~:ideally, waiting for paradigm to give version 1.0 the full release thumbs up:~
***** take care to encourage bedrock code/comunity participation
**** TODO wait/code relevant witchcraft code
**** TODO decide release as
    - scripts to build
    - snapshot image
    - iso - installer, how?


code:
#+TITLE: BIRCH is rowan compressed harder

* The Notion

Make a witch that's bedrock based ultra minimal but useable core, more minimal than rowan, but more capable of expansion, as per Digit's initial ideas surrounding the use of package format converters... 'cept with bedrock's way of gaining access to all packages.

** Software considerations:

    - Linux kernel

    - busybox

    - musl

    - fuse

    - Linux capabilities

    - udev

    - dvtm

    - ii

    - ii scripts

    - brich scripts

** Elaboration on software selection

it's just bedrock, ready to go, ootb, with some easy facilitation scripts, ii scripts to help you get help.  basically, it's bedrock, with dvtm and ii, and enough to get online, and get up n running with some kind of robust system for whatever your need...   scripts it carries can grow, but the idea being, it's just a simple stump to help you get going.  just the bedrock core, n no much more...  ... but a few witchcraft-esq scripts n the like.  who knows, it's just a notion at the moment.  pure vaporware.


code:
inaugeral chat
==============

*** Users on #witchlinux: @Choobs @wgreenhouse @Tazy @Digit +V-Ger +lunacat2 @dxlr8r +Jovo @kstigs @jony123 @orbea
[2015-03-25 19:51:40] Choobs: Crone
[2015-03-25 19:51:50] orbea: Crone witch ^_^
[2015-03-25 19:52:41] orbea: well versed in magic and capable of casting any kind of spell
[2015-03-25 20:01:30] Digit: sweet.
[2015-03-25 20:03:19] * orbea imagines a distro that can lrm, apt-get, installpkg, cast spells and etc.
[2015-03-25 20:03:25] orbea: emerge
[2015-03-25 20:05:44] Digit: so crone's the project to have a witch be package format blind.

whats the history
=================

was a notion for digit's alpha1 of witch.  it's always been a notion swirling around in the air.
alpha1 did have a lot of stuff installed to translate between packages.  deb2rpm, etc.

whats besides
=============

rspm is besides.  crone isnt rspm.
rspm is just a command unifying wrapper for basic package management commands.
crone is all packages are installable.

what is next
============

you are going to pick up the research mantle, start adding methods brick by brick, all the while thinking up new schemes, implementing the dream.  maybe the right notion has already been.  start building brick by brick and see what can be seen.

when the stars are aligned, and two moons rise over proxima centauri's 4th planet from view of earth, the crone will fly, and cast all about aspersions of dispersions and cestations of dispersions amongst all who ride a strand of foss.

no one really knows what is next, but signs and portents abound.  kalkis laughter echoes louder from just beyond the hill.  run a shreik from the coming egalitarian righting round, those port bellied round.  seek then the seeking sound.

which witch
===========

whichever witch, if she crones, she's the best.


code:
#+TITLE: EAGLE Augments Grml with Lisp and Emacs

* The Problem

  #+LABEL: arcane-parens
  [[http://imgs.xkcd.com/comics/lisp_cycles.png]]
  #+CAPTION: Lisp is arcane and mystical.

  Make the most prominent Lisp flavors in 2013 (Emacs Lisp, Common
  Lisp, and Scheme) more approachable to new hackers, by
  bootstrapping them into an environment with sane defaults and fun
  goodies.  Make working Lisp environments that actually do stuff
  easily reproducible and not unique snowflakes.

* TODO Project Goals [0/4]

** TODO Lisp integration

*** TODO Bootstrap SBCL with [[http://www.quicklisp.org/beta/][Quicklisp]]

    - StumpWM

    - CLFSWM

    - SLIME

    - Some kind of IDEish thing (CLIM-listener?  CLIMACS?)

*** TODO Bootstrap Emacs with ELPA

    - Org-based init, perhaps based on [[https://github.com/eschulte/emacs24-starter-kit][Eric Schulte's Emacs Starter Kit]]

    - Cover the basics: Gnus, org+contrib, REPLy-goodness (SLIME, Geiser)

    - [[http://elnode.org/][Elnode]] on a USB?  Brilliant!

*** TODO Bootstrap Guile and [[http://www.gnu.org/software/guix/][GNU GUIX]]

*** TODO MIT Lisp Machine Emulation

    Investigate [[http://www.unlambda.com/index.php?n%3DMain.Cadr][MIT CADR Emulator]] licensing/redistributability status

** TODO UI/UX stuff

*** TODO Welcome screen

    - Installs Lisp stuff from the list above on demand.

    - welcome.org: Literate Org program as a guide for the distro

      + People can contribute Lisp software installation/config
        recipes by adding to the Org file or files

    - Expand upon [[https://github.com/grml/grml-quickconfig][grml-quickconfig]]?

*** TODO Artwork

    - Desktop background: Nice options from Digit

    - Syslinux theme

** TODO Persistent live system

   - Like [[http://grml.org/][Grml]] itself, should be a live system by default, with a quick
     and easy installer.  Build on the tools already there.

   - Either make proper Debian packages for artwork and Lisp stuffs
     (better) or add it to the FAI chroot (kludgier).

** TODO Extra Flavors

   - "Warm start:" includes some pre-downloaded, pre-compiled bytecode
     for big programs (StumpWM already ready to go as default WM,
     etc.)

   - Defiant: Security/anonymity layer for EAGLE, features Tor
     TransProxy for main user and a tmpfs guest user


code:
import Network
import System.IO
import Text.Printf
import Data.List
import System.Exit

server = "irc.freenode.net"
port   = 6667
chan   = "#witchlinux"
nick   = "lunacat2"

main = do
    h <- connectTo server (PortNumber (fromIntegral port))
    hSetBuffering h NoBuffering
    write h "NICK" nick
    write h "USER" (nick++" 0 * :digitshaskellbot")
    write h "JOIN" chan
    listen h

write :: Handle -> String -> String -> IO ()
write h s t = do
    hPrintf h "%s %s\r\n" s t
    printf    "> %s %s\n" s t

listen :: Handle -> IO ()
listen h = forever $ do
    t <- hGetLine h
    let s = init t
    if ping s then pong s else eval h (clean s)
    putStrLn s
  where
    forever a = a >> forever a

    clean     = drop 1 . dropWhile (/= ':') . drop 1

    ping x    = "PING :" `isPrefixOf` x
    pong x    = write h "PONG" (':' : drop 6 x)

eval :: Handle -> String -> IO ()
eval h    "!quit"                = write h "QUIT" ":Exiting" >> exitWith ExitSuccess
--eval h x | Just x <- stripPrefix "!id " x = privmsg h x
--eval h (stripPrefix "!id " -> Just x) = privmsg h x

-- renamed from !id while the other cat is around
eval h x | "!say " `isPrefixOf` x = privmsg h (drop 4 x)

-- will fix some day.
eval h "!search" = privmsg h "search yourself. :P"

--do simple command/response like this:
-- eval h "" = privmsg h ""
--command ^ and response ^

-- these are some basic sample commands for u to try out to make your own ones.
eval h "hello" = privmsg h "hello world"
eval h "!testcommand" = privmsg h "this is the test responce."
eval h "!meow" = privmsg h "meow."
eval h "!woof" = privmsg h "GghrRrRgrhrhghrhghrhgrRgRggGRAAGHROUGHGH!!! GRARGHOUGH-GROUGHGRGROUGH!!  ... dont bark at me, bitch.  i bark with the best of dogs, and you, ~ you aint even close. "

--info
eval h "!daskeb" = privmsg h "hello, i am daskeb, digit's haskell bot.  of course, i'm just a basic starter template.  you might want to look up http://www.haskell.org/haskellwiki/Roll_your_own_IRC_bot just for starters.  i came from half of that. i now have my own web presence at http://wastedartist.com/scripts/daskeb/daskeb.html"
eval h "!lunacat2" = privmsg h "hello, i am lunacat2.  lunacat died.  lunacat was a bot to help people with a sort of faq about witch, a gnu/linux opperating system distribution.  lunacat also contained info about lots more, mostly covered in digit's new bot called ema. to see some of my commands try !info"
eval h "!info" = privmsg h "!witches !sites !coc !bases !philosophy !who !remaster sorry i dont have many commands yet.  ~under construction~"
eval h "!commands" = privmsg h "you can see my code (and thus my commands) here: https://github.com/Digit/witch/blob/master/lunacat/lunacat2.hs "
eval h "!help" = privmsg h "see !info for top level info commands.  see !commands for all."

--witches
eval h "!rowan" = privmsg h "rowan, wards away evil.  bloat is evil.  available to download as debian iso, also featured on arch, slackware and slitaz bases.  soon available in witchcraft"
eval h "!willow" = privmsg h "willow, like rowan, but more flex. vapourware/plan"
eval h "!jamella" = privmsg h "jamella, showcase for tiling window managers. vapourware/plan"
eval h "!zelda" = privmsg h "zelda, pure vapor.  n not much of it"
eval h "!kali" = privmsg h "kali, pure vapor.  n not much of it"
eval h "!eagle" = privmsg h "EAGLE Augments Grml with Lisp and Emacs."
eval h "!slackwitch" = privmsg h "unreleased rowan-like slackware based witches.  considered by digit as other alpha7 pre-releases during/after slitaz alpha7 pre-releases"
eval h "!mycowitch" = privmsg h "maybe there's some kind of bovine dermatology cream you can get for that.  or maybe it has something to do with fun guy.  vapourware."
eval h "!haylowitch" = privmsg h "haylo released a really nice minimal~!!! what, sorry i blinked, his pastebin expired, what was it ... anyone have a link?"
eval h "!griselda" = privmsg h "valroadie got in on the action, and has warty  witchos called griselda pumped out of susestudio.  see, remastery is for everyone!"
eval h "!jane" = privmsg h "cos it just wasnt right that there wasnt a slitaz based witch yet ~ quick n dirty release to remedy that.  not like the polished but unreleased because of one niggle slitaz-rowan-witches"
eval h "!djs_exclusive_witchlinux" = privmsg h "its got everything yours has, but better. uploaded to dajjal's exclussive site."
eval h "!birch" = privmsg h "birch is rowan compressed harder.  https://github.com/Digit/witch/tree/master/birch mostly vapor, builds on non-vapor though.  "
eval h "!WinDurr" = privmsg h "WinDurr, a security witch with kali or pentoo base and a tails stealthmode and hd wipe on failed password."
eval h "!crone" = privmsg h "well versed in magic and capable of casting any kind of spell."

--witches by metadistro  "creeds"  idk, need a better name for this.
eval h "!creeds" = privmsg h "creeds of witches of the following types have been found: !slitazwitch !slackwarewitch !debianwitch !gentoowitch !funtoowitch !archwitch !bedrockwitch"
eval h "!slitazwitch" = privmsg h "digit made some slitaz based witches, but didnt release them because he can be a fussy perfectionist at times."
eval h "!slackwarewitch" = privmsg h "digit made some slackware based witches, but didnt release them because he can be a fussy perfectionist at times."
eval h "!debianwitch" = privmsg h "digit released debian-rowan-witch alpha 2, 3 and 4 with a debian base.  haylowitch is debian."
eval h "!gentoowitch" = privmsg h "digit decided gentoo would be the first meta distro to include/complete in his !witchcraft vision (a single installer/remastery tool that lets you decide your base system, and your distinct desktop environment configuration and app selection."
eval h "!funtoowitch" = privmsg h "digit thinks this will be the next meta-distro included in witchcraft's cauldren, but it could just as likely be debian, or bedrock, or dragora, or whatever."
eval h "!archwitch" = privmsg h "digit released a virtualbox arch rowan witch, alpha 5.  alpha 6 was historically considered, and legacy considered, a collective effort to create an archiso (or other remasterability means) version of arch witches... none was found easy nor convenient nor practical enough, and arch was put on the back burner, during a research period... at least for digit."
eval h "!slaxwitch" = privmsg h "we dont talk about that.  meow."
eval h "!bedrockwitch" = privmsg h "nothing much progressed, little beyond an initial starting stub in witchcraft... but come hack up the fun, or at least check out bedrock and learn how it is the biggest revolution since the GNU GPL. [statement may contain mild hyperbole]  (also, see !birch)"

--knightnames
eval h "!knightnames" = privmsg h "!digit !him !orbea !jony !wgreenhouse !wei2912 !haylo !valroadie !dajjal"
eval h "!digit" = privmsg h "he who hath madeth the most, and founded and guided and whatnot, yet insists he's not the boss and anyone can make and release whatver they want with a witch stamp on it.  he who maketh the rowan, willow, jamella, slackwitch and others to come he says, yet no one has seen even a slackwitch but he, and neither willow nor jamella exist as anything but air."
eval h "!him" = privmsg h "he who nameth, and sparketh offeth this whole thing, and nameth himself so ye look illiterate."
eval h "!orbea" = privmsg h "he who is new to linux, but we always knew was leet.  fun guy with an itchy cow."
eval h "!jony" = privmsg h "he who hath made much, and is #1 witch user/developer... after digit and wei2912.  hath been around since the start."
eval h "!wgreenhouse" = privmsg h "he who art steady and wise.  he who maketh the eagle."
eval h "!wei2912" = privmsg h "he who hath come in late, but made great swathing changes and augments to witchcraft."
eval h "!theredmood" = privmsg h "he who has come far, but has far to go, and gets there at speed, sometimes.  ... hey, where'd he go?   something i said?"
eval h "!valroadie" = privmsg h "sir valroadie's valour is well known, nestled in quick, wants only small warts, not all encompassing warts.  "
eval h "!dajjal" = privmsg h "sir dajjal struck forth and boldly proclaimed: im sure it cant b that hard, ill do it now. ~ done.  its called djs_exclusive_witchlinux n it does everything urs does but better"
eval h "!Tazy" = privmsg h "wears a witches hat made of tin"

--offlist knightnames
eval h "!lo9rd" = privmsg h "he who art a fleeting moogle.  a good luck charm/omen."
eval h "!haylo" = privmsg h "he who came, made an awesome ultra-light (as a duck) debian based core witch, at something like 60mb.  but did he post it anywhere that didnt expire, or in a sensible reccogniseable memorable name?  no.  ... anyone save it?..."
eval h "!gutterslob" = privmsg h "he who art a fleeting deity of configuration. keep tabs on what this one creates. it will make your eyes cry love from the soles of your feet."

-- who n groups n whats
eval h "!who" = privmsg h "see !knights !witches !villagers !creeds"
eval h "!villagers" = privmsg h "ye whom are chomping at the bit to call anything a witch and burn it. [to cd]"
eval h "!knights" = privmsg h "that's ye who determine if witches. see !knightnames"
eval h "!witches" = privmsg h "!birch !rowan !willow !jamella !zelda !kali !eagle !slackwitch !haylo !mycowitch !griselda !djs_exclusive_witchlinux"

-- -- --
eval h "!witch" = privmsg h "if she's the weight of a duck, then burn her!    see !witches !bases !philosophy !who "
eval h "witch!" = privmsg h "BURN HER!"

--general about n stuff
eval h "!coc" = privmsg h "code of the covenant:  dont ask to ask, just ask.  dont ask to do, just do, then inform.  no flooding.  no spam.  no official. chat priority: witch > freedomware > anything else. if you are here, you are a witch developer now.  make whatever you want."

eval h "!policy" = privmsg h "dont ask to do, just do, and inform.  see !coc !philosophy"

eval h "!history" = privmsg h "Him said to digit: you should make a distro called witch, so people could burn them [to cd].  that happened.  witch's philosophy since then is that anyone can make what they want, no central authority, office or hierachy.  it's a pure do-archy.  like wicca.  (but we're not actually witches/warlocks).  see !releasecron"
eval h "!releasecron" = privmsg h "slax-rowan-witch-alpha1, debian-rowan-witch-alpha2,3,4, arch-rowan-witch-alpha5,6, slitaz-rowan-witch-alpha7, slackwitch, witchcraft (aka alpha8, featuring ability to install gentoo-*-witch)"

eval h "!philosophy" = privmsg h "see !coc !witch !history"

eval h "!sites" = privmsg h "wa: http://tinyurl.com/witchlinux ... that links to mostly all the witch stuff out there... sorta.  puffinux and invariability and whatever else, they all sorta fell through, in one way or another."

--bases
eval h "!bases" = privmsg h "it's witchcraft!  witches can be on any base!?  see !gentoo !funtoo !exherbo !debian !freebsd !slackware !slitaz !bedrock (and try them with +witch, like !debianwitch)"
eval h "!gentoo" = privmsg h "gentoo based witches!?  yes! try out !witchcraft."
eval h "!funtoo" = privmsg h "not yet. hack it up in !witchcraft."
eval h "!exherbo" = privmsg h "not yet. hack it up in !witchcraft."
eval h "!debian" = privmsg h "vm alpha2&3, and iso alpha4 of the !rowan releases, are debian based.  also pre-alpha in !witchcraft, ready for you to help hack up."
eval h "!freebsd" = privmsg h "not yet. hack it up in !witchcraft."
eval h "!slackware" = privmsg h "unreleased alpha7s.  come hack it up in !witchcraft."
eval h "!slitaz" = privmsg h "unreleased alpha7s.  come hack it up in !witchcraft."
eval h "!bedrock" = privmsg h "barely begun to be slotted in, in !witchcraft.  come help hack it up."

--extras
eval h "!beards" = privmsg h "http://ompldr.org/vaTJzdw/beards3.png"
eval h "!ferretwitch" = privmsg h "http://bit.ly/Y4PHg4"
eval h "!politics" = privmsg h "http://youtu.be/zruGBWLk9s8 ''Geeks like to think that they can ignore politics, you can leave politics alone, but politics won't leave you alone.'' - Richard Matthew Stallman"

--witchcraft
eval h "!witchcraft" = privmsg h "an umbrella tool for all your witch installing, remastering, and witch sharing.  ~ in process of being written by digit and everyone else. come try out the code https://github.com/Digit/witch see also: !witchcraftidea !remastery !rewic !cauldren !witchhunt !rspm !witchcraftprogress and many more"
eval h "!beckon" = privmsg h "come try out the code https://github.com/Digit/witch and have a stab at hacking in your own sections of it, or fixing other bits. (please try to understand what other people are going for, and colaborate wisely, and remember forking is 100% as ok as teaming on one thing.  we can each have it our own way.)"

eval h "!witchcraftprogress" = privmsg h "witchcraft progress report [Sun Apr 14 00:17:09 BST 2013] (so far, gentoo base install works, some ground work for rowan witch done, and !rspm started, and !remastery up for dev discussion (spoilt for choice), and the sharing stuff is still just passing from vapour to pre-alpha)"

eval h "!witchcraftidea" = privmsg h "managing base meta-distros and package selection & desktop configuration as the two separate components that comprise your os. "

eval h "!remaster" = privmsg h "not yet. hack it up in witchcraft. see https://github.com/Digit/witch/issues/5 for ways and to discuss ways"

eval h "!rspm" = privmsg h "one package manager [wrapper] to rule them all.  just like pacman rosetta: https://wiki.archlinux.org/index.php/Pacman_Rosetta except in a wrapper script.  ... handy, for a distro that aims to allow any metadistro base.  https://github.com/Digit/witch/issues/18 will make further scripting easier."

eval h "!rewic" = privmsg h "stupid place-holder name for the witch remastery portion of witchcraft.  installation portion is called !cauldren, remaster portion is called !rewic.  https://github.com/Digit/witch/issues/18 we're spoiled for choice.  we just need to hack up."
eval h "!cauldren" = privmsg h "clever final name for the witch installer portion of witchcraft."
eval h "!witchhunt" = privmsg h "clever final name for the witch sharer/finder portion of witchcraft."

-- eval h x | "!goog " `isPrefixOf` x = privmsg h (drop 4 x)
eval _   _                       = return () -- ignore everything else

privmsg :: Handle -> String -> IO ()
privmsg h s = write h "PRIVMSG" (chan ++ " :" ++ s)