Mehr Mods hinzugefügt

This commit is contained in:
N-Nachtigal 2025-05-10 23:49:11 +02:00
parent 92a55732cf
commit 9e345a25fb
2805 changed files with 2096013 additions and 0 deletions

View file

@ -0,0 +1,106 @@
local S = core.get_translator("mobs_monster")
-- custom dirt monster type
local dirt_types = {
{ nodes = {"ethereal:dry_dirt"},
skins = {"mobs_dirt_monster3.png"},
drops = {
{name = "ethereal:dry_dirt", chance = 1, min = 0, max = 2},
{name = "ethereal:charcoal_lump", chance = 2, min = 0, max = 1}
}
}
}
-- 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},
{name = "default:clay_lump", chance = 2, min = 0, max = 1}
},
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 core.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
})
-- where to spawn
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
-- spawn egg
mobs:register_egg("mobs_monster:dirt_monster", S("Dirt Monster"), "default_dirt.png", 1)
-- compatibility with older mobs mod
mobs:alias_mob("mobs:dirt_monster", "mobs_monster:dirt_monster")

View file

@ -0,0 +1,181 @@
local S = core.get_translator("mobs_monster")
-- custom dungeon master types
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",
friendly_fire = false,
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 core.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
})
-- where to spawn
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
-- spawn egg
mobs:register_egg("mobs_monster:dungeon_master", S("Dungeon Master"),
"fire_basic_flame.png", 1, true)
-- old mobs mod compatibility
mobs:alias_mob("mobs:dungeon_master", "mobs_monster:dungeon_master")
-- fireball arrow
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
})
--core.override_item("default:obsidian", {on_blast = function() end})

View file

@ -0,0 +1,99 @@
-- translation and drops
local S = core.get_translator("mobs_monster")
local mob_drops = {
{name = "fireflies:firefly", chance = 1, min = 1, max = 1}
}
if core.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", 2},
{"bucket:bucket_river_water", 2},
{"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 = 4,
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.1 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
})
-- where to spawn
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
-- spawn egg
mobs:register_egg("mobs_monster:fire_spirit", S("Fire Spirit"), "fire_basic_flame.png", 1)

View file

@ -0,0 +1,55 @@
-- translation and mod path
local S = core.get_translator("mobs_monster")
local path = core.get_modpath(core.get_current_modname()) .. "/"
-- 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
-- helper function
local function ddoo(mob)
if core.settings:get_bool("mobs_monster." .. mob) == false then
print("[Mobs_Monster] " .. mob .. " disabled!")
return
end
dofile(path .. mob .. ".lua")
end
-- Monsters
ddoo("dirt_monster") -- PilzAdam
ddoo("dungeon_master")
ddoo("oerkki")
ddoo("sand_monster")
ddoo("stone_monster")
ddoo("tree_monster")
ddoo("lava_flan") -- Zeg9
ddoo("mese_monster")
ddoo("spider") -- AspireMint
ddoo("land_guard")
ddoo("fire_spirit")
-- Load custom spawning if found
if mobs.custom_spawn_monster then
dofile(path .. "spawn.lua")
end
-- Lucky Blocks
if core.get_modpath("lucky_block") then
dofile(path .. "lucky_block.lua")
end
print ("[MOD] Mobs Redo Monsters loaded")

View file

@ -0,0 +1,123 @@
-- translation and custom land guard types
local S = core.get_translator("mobs_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 = 12,
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 core.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,
})
-- where to spawn
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
-- spawn egg
mobs:register_egg("mobs_monster:land_guard", S("Land Guard"), "default_ice.png", 1)

View file

@ -0,0 +1,352 @@
local S = core.get_translator("mobs_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.5,
damage = 3,
hp_min = 20,
hp_max = 35,
armor = 80,
collisionbox = {-0.5, -0.5, -0.5, 0.5, 1.5, 0.5},
visual = "mesh",
mesh = "zmobs_lava_flan.b3d",
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
{"default:lava_source", 0}, -- so that damage per second doesnt affect mob
{"default:lava_flowing", 0}
},
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 core.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)
core.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 = core.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 core.registered_nodes["fire:basic_flame"] then
pos = nods[math.random(#nods)]
core.set_node(pos, {name = "fire:basic_flame"})
end
self.object:remove()
end
end,
glow = 10
})
-- where to spawn
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
-- spawn egg
mobs:register_egg("mobs_monster:lava_flan", S("Lava Flan"), "default_lava.png", 1)
-- compatibility for old mobs mod
mobs:alias_mob("mobs:lava_flan", "mobs_monster:lava_flan")
-- lava orb
core.register_craftitem(":mobs:lava_orb", {
description = S("Lava orb"),
inventory_image = "zmobs_lava_orb.png",
light_source = 14
})
core.register_alias("zmobs:lava_orb", "mobs:lava_orb")
core.register_craft({
type = "fuel",
recipe = "mobs:lava_orb",
burntime = 80
})
-- backup and replace old function
local old_handle_node_drops = core.handle_node_drops
function core.handle_node_drops(pos, drops, digger)
-- are we a player using the lava pick?
if digger and digger:get_wielded_item():get_name() == ("mobs:pick_lava") then
local hot_drops = {}
local is_cooked
for _, drop in ipairs(drops) do
local stack = ItemStack(drop)
while not stack:is_empty() do
local output, decremented_input = core.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
is_cooked = true
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
drops = hot_drops -- replace normal drops with cooked versions
if is_cooked then
mobs:effect(pos, 1, "tnt_smoke.png", 3, 5, 2, 0.5, nil, false)
core.sound_play("fire_extinguish_flame",
{pos = pos, max_hear_distance = 5, gain = 0.05}, true)
end
end
return old_handle_node_drops(pos, drops, digger)
end
-- lava pick, smelts nodes when you dig
core.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
})
-- recipe
core.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 core.get_modpath("toolranks") then
core.override_item("mobs:pick_lava", {
original_description = S("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 = 20,
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.b3d",
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
}
})
-- spawn egg
mobs:register_egg("mobs_monster:obsidian_flan", S("Obsidian Flan"),
"default_obsidian.png", 1)
-- obsidian arrow and grief setting check
local mobs_griefing = core.settings:get_bool("mobs_griefing") ~= false
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 core.is_protected(pos, "") then
return
end
local texture = "default_dirt.png" --fallback texture
local radius = 1
local def = node and core.registered_nodes[node.name]
if not def then return 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
core.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
})
core.set_node(pos, {name = "air"})
local snd = def.sounds and def.sounds.dug or "default_dig_crumbly"
core.sound_play(snd, {pos = pos, max_hear_distance = 8, gain = 1.0}, true)
end
})

View file

@ -0,0 +1,91 @@
The MIT License (MIT)
Copyright (c) 2016 TenPlus1
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
Textures created by wwar (CC0)
mobs_dungeon_master_nether.png
mobs_dungeon_master_netherdeep.png
mobs_stone_monster.png
mobs_dungeon_master2.png
mobs_land_guard.png
mobs_land_guard2.png
mobs_land_guard3.png
Textures by AMMOnym (WTFPL)
mobs_stone_monster2.png
Textures by TenPlus1 (MIT)
mobs_stone_monster3.png
mobs_fireball.png
mobs_obsidian_flan.png
Textures by Sirrobzeroone (CC0 1.0 Universal)
mobs_stone_monster4.png
mobs_sand_monster.png
Textures and Model created by SirrobZeroone (CC0)
mobs_mese_monster_red.png
mobs_mese_monster_blue.png
mobs_mese_monster_green.png
mobs_mese_monster_purple.png
mobs_mese_arrow.png
mobs_mese_monster.b3d
Pavel_S and PilzAdam (WTFPL)
mobs_dirt_monster.png
mobs_dirt_monster2.png
mobs_dirt_monster3.png
mobs_dungeon_master.b3d
mobs_dungeon_master.png
mobs_dungeon_master.ogg
mobs_fireball.ogg
mobs_oerkki.b3d
mobs_oerkki.png
mobs_sand_monster.b3d [edited by SirrobZeroone]
mobs_sand_monster2.png
mobs_stone_monster.b3d [edited by SirrobZeroone]
mobs_tree_monster.b3d
mobs_tree_monster*.png (edited by TenPlus1)
AspireMint (CC BY-SA 3.0)
mobs_spider.b3d
mobs_spider_mese.png
mobs_spider_orange.png
mobs_spider_snowy.png
mobs_spider_grey.png
mobs_spider_crystal.png
zmobs_lava_flan.b3d
zmobs_lava_flan.png
zmobs_lava_flan2.png
zmobs_lava_flan3.png
Zeg9 (CC BY-SA 3.0)
zmobs_lava_orb.png
Sounds by Cyberpangolin (WTFPL) https://forum.minetest.net/viewtopic.php?t=10798
mobs_dirtmonster.ogg
mobs_dungeonmaster.ogg
mobs_lavaflan.ogg
mobs_mesemonster.ogg
mobs_oerkki.ogg
mobs_sandmonster.ogg
mobs_stonemonster.ogg
mobs_treemonster.ogg

View file

@ -0,0 +1,14 @@
# 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

View file

@ -0,0 +1,14 @@
# 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=

View file

@ -0,0 +1,14 @@
# 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

View file

@ -0,0 +1,14 @@
# 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

View file

@ -0,0 +1,14 @@
# 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

View file

@ -0,0 +1,14 @@
# 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

View file

@ -0,0 +1,14 @@
# textdomain:mobs_monster
Cobweb=Teia de Aranha
Dirt Monster=Monstro de Terra
Dungeon Master=Mestre das Dungeons
Lava Flan=Pudim de Lava
Lava Pickaxe=Picareta de Lava
Lava orb=Orb de Lava
Mese Monster=Monstro de mese
#Obsidian Flan=Pudim de Obsidian
Oerkki=Oerkki
Sand Monster=Monstro de Areia
Spider=Aranha
Stone Monster=Monstro de pedra
Tree Monster= Arvore Monstro

View file

@ -0,0 +1,14 @@
# 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=Древесный Монстр

View file

@ -0,0 +1,14 @@
# 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ı

View file

@ -0,0 +1,19 @@
# textdomain:mobs_monster
Mobs Monster=Моби Монстри
Add many different monsters into your world.=Додає багато різних монстрів у світ.
Adds many types of monster.=Додає багато різних типів монстрів.
Cobweb=Павутина
Dirt Monster=Земляний монстр
Dungeon Master=Хазяїн печер
Lava Flan=Лавовий слимак
Lava Pickaxe=Лавове кайло
Lava orb=Лавова сфера
Mese Monster=Месе монстр
Obsidian Flan=Обсидіановий слимак
Oerkki=Оерккі
Land Guard=Охоронець землі
Fire Spirit=Вогняний дух
Sand Monster=Пісочний монстр
Spider=Павук
Stone Monster=Кам'яний монстр
Tree Monster=Дерево-монстр

View file

@ -0,0 +1,14 @@
# 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=树怪

View file

@ -0,0 +1,14 @@
# 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=樹怪

View file

@ -0,0 +1,43 @@
-- web trap schematic
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}},
})
-- add lucky blocks
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},
{"spw", "mobs_monster:land_guard", 2},
{"nod", "default:chest", 0, {
{name = "mobs:lava_orb", max = 1}}},
})

View file

@ -0,0 +1,339 @@
-- translation and custom mese monster types
local S = core.get_translator("mobs_monster")
local mese_monster_types = {
{ -- 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
},
{ -- 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
},
{ -- 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
},
{ -- 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
},
after_activate = function(self, staticdata, def, dtime)
local tex = self and self.textures and self.textures[1]
if tex == "zmobs_mese_monster.png" then self.object:remove() end
end,
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})
self.base_texture = 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 = core.get_objects_inside_radius(pos, 10)
for i, obj in ipairs(objects) do
if core.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 item
core.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}
})
-- mese arrow
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
})
-- where to spawn
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
-- spawn egg
mobs:register_egg("mobs_monster:mese_monster", S("Mese Monster"), "default_mese_block.png", 1)
-- compatibility with older mobs mod
mobs:alias_mob("mobs:mese_monster", "mobs_monster:mese_monster")
-- 9x mese crystal fragments = 1x mese crystal recipe
local f = "default:mese_crystal_fragment"
core.register_craft({
output = "default:mese_crystal",
recipe = {{f, f, f}, {f, f, f}, {f, f, f}}
})

View file

@ -0,0 +1,8 @@
name = mobs_monster
description = Add many different monsters into your world.
depends = mobs
optional_depends = default, lucky_block, toolranks
min_minetest_version = 5.0
release = 31012
author = TenPlus1
title = Mobs Monster

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,74 @@
local S = core.get_translator("mobs_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
},
})
-- where to spawn
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
-- spawn egg
mobs:register_egg("mobs_monster:oerkki", S("Oerkki"), "default_obsidian.png", 1)
-- compatibility with older mobs mod
mobs:alias_mob("mobs:oerkki", "mobs_monster:oerkki")

View file

@ -0,0 +1,49 @@
# MONSTER MOBS
This mod creates many types of monsters. Some are weak, some are powerful, and they generally do the player a lot of harm. Many of these monsters spawn below ground and take light damage.
**Lucky Blocks**: 12
## Dirt Monster
Dirt monsters spawn at night on green grass (or grey in `ethereal`). They have a tendency to wander around looking for a player to eat and drop 1-2 dirt when killed. Dirt monsters have between 3-27 health, take damage in sunlight, and deal very little damage.
# Dungeon Master
Dungeon masters spawn below -70 underground DM's and hurl fireballs at unsuspecting players and can cause major damage, but get too close and he will switch to dogfight attack. They have between 42 and 75 health points. Their melee attack deals six damage points and their fireball inflicts eight. The fireball will also explode if it hits a node. They 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. Another thing - they do not take damage from many weapons.
# 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. A single sand monster isn't much of a threat - they deal one damage point.
# 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. They can drop torch, iron or coal when killed.
# Tree Monster
Found atop trees 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. They have between 60 and 130 health points and deal 15 damage, enough to kill you in two blows.
# Fire Spirit
Fire Spirits will not tolerate players roaming around their domain and will fiercely attack until their dying puff of smoke. They will drop their spirit and some fire dust when using ethereal.

View file

@ -0,0 +1,135 @@
local S = core.get_translator("mobs_monster")
-- custom particle effects
local function effect(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
core.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:silver_sand", chance = 2, min = 1, max = 2},
{name = "default:desert_sand", chance = 2, min = 1, max = 2},
{name = "default:sand", chance = 2, min = 1, max = 2},
{name = "default:clay_lump", chance = 2, min = 0, max = 1}
},
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()
core.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,
]]
})
-- where to spawn
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
-- spawn egg
mobs:register_egg("mobs_monster:sand_monster", S("Sand Monster"),
"default_desert_sand.png", 1)
-- compatibility with older mobs mod
mobs:alias_mob("mobs:sand_monster", "mobs_monster:sand_monster")

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 KiB

View file

@ -0,0 +1,10 @@
mobs_monster.dirt_monster (Enable Dirt Monster) bool true
mobs_monster.dungeon_master (Enable Dungeon Master) bool true
mobs_monster.fire_spirit (Enable Fire Spirit) bool true
mobs_monster.land_guard (Enable Land Guard) bool true
mobs_monster.lava_flan (Enable Lava Flan) bool true
mobs_monster.mese_monster (Enable Mese Monster) bool true
mobs_monster.oerkki (Enable Oerkki) bool true
mobs_monster.spider (Enable Spider) bool true
mobs_monster.stone_monster (Enable Stone Monster) bool true
mobs_monster.tree_monster (Enable Tree Monster) bool true

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,187 @@
--[[ 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,
})
-- Land Guard
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,
})

View file

@ -0,0 +1,345 @@
local S = core.get_translator("mobs_monster")
-- helper function
local function get_velocity(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 math_cos, math_sin = math.cos, math.sin
-- custom spider types
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, immune_to = {{"ethereal:crystal_spike", 0}},
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 = 100,
collisionbox = {-0.7, -0.5, -0.7, 0.7, 0, 0.7},
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,
-- node_damage = false, -- disable damage_per_second node damage
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 core.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.immune_to then self.immune_to = tmp.immune_to 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() ; if not yaw then return end
local prop = self.object:get_properties()
pos.y = pos.y + prop.collisionbox[2] - 0.2
local dir_x = -math_sin(yaw) * (prop.collisionbox[4] + 0.5)
local dir_z = math_cos(yaw) * (prop.collisionbox[4] + 0.5)
local nod = core.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 core.registered_nodes[nod.name]
or not core.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
self:set_animation("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
})
-- where to spawn
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 = 2,
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
-- spawn egg
mobs:register_egg("mobs_monster:spider", S("Spider"), "mobs_cobweb.png", 1)
-- compatibility with older mobs mod
mobs:alias_mob("mobs_monster:spider2", "mobs_monster:spider")
mobs:alias_mob("mobs:spider", "mobs_monster:spider")
-- cobweb and recipe
core.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},
is_ground_content = false,
drop = "farming:string",
sounds = mobs.node_sound_leaves_defaults()
})
core.register_craft({
output = "mobs:cobweb",
recipe = {
{"farming:string", "", "farming:string"},
{"", "farming:string", ""},
{"farming:string", "", "farming:string"}
}
})
-- cobweb place function
local web_place = function(pos)
if core.find_node_near(pos, 1, {"ignore"}) then return end
local pos2 = core.find_node_near(pos, 1, {"air", "group:leaves"}, true)
if pos2 then
core.swap_node(pos2, {name = "mobs:cobweb"})
end
end
-- cobweb arrow
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
})

View file

@ -0,0 +1,123 @@
-- translation and custom stone monster types
local S = core.get_translator("mobs_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}
}
},
{ nodes = {"default:sandstone"},
skins = {"mobs_stone_monster4.png"},
drops = {
{name = "default:sandstone", chance = 1, min = 0, max = 2},
{name = "default:tin_lump", chance = 5, min = 0, max = 2},
{name = "default:copper_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 core.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
})
-- where to spawn
if not mobs.custom_spawn_monster then
mobs:spawn({
name = "mobs_monster:stone_monster",
nodes = {"default:stone", "default:desert_stone", "default:sandstone",
"default:permafrost_with_stones"},
max_light = 7,
chance = 7000,
max_height = 0
})
end
-- spawn egg
mobs:register_egg("mobs_monster:stone_monster", S("Stone Monster"), "default_stone.png", 1)
-- compatibility with older mobs mod
mobs:alias_mob("mobs:stone_monster", "mobs_monster:stone_monster")

Binary file not shown.

After

Width:  |  Height:  |  Size: 159 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 634 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 632 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 274 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 241 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 563 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 891 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 239 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 778 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 534 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 527 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1,002 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 522 B

Some files were not shown because too many files have changed in this diff Show more