Merge pull request 'Rover and Stalker' (#4282) from rover_stalker into master

Reviewed-on: https://git.minetest.land/VoxeLibre/VoxeLibre/pulls/4282
This commit is contained in:
the-real-herowl 2024-05-22 19:01:14 +00:00
commit 753545d714
55 changed files with 278 additions and 303 deletions

@ -958,6 +958,7 @@ function mob_class:do_states_attack (dtime)
if self.v_start then if self.v_start then
self.timer = self.timer + dtime self.timer = self.timer + dtime
self.blinktimer = (self.blinktimer or 0) + dtime self.blinktimer = (self.blinktimer or 0) + dtime
self:set_animation("fuse")
if self.blinktimer > 0.2 then if self.blinktimer > 0.2 then
self.blinktimer = 0 self.blinktimer = 0

@ -314,6 +314,7 @@ function mcl_mobs.register_mob(name, def)
return self:mob_activate(staticdata, def, dtime) return self:mob_activate(staticdata, def, dtime)
end, end,
after_activate = def.after_activate,
attack_state = def.attack_state, -- custom attack state attack_state = def.attack_state, -- custom attack state
on_attack = def.on_attack, -- called after attack, useful with otherwise predefined attack states (not custom) on_attack = def.on_attack, -- called after attack, useful with otherwise predefined attack states (not custom)
harmed_by_heal = def.harmed_by_heal, harmed_by_heal = def.harmed_by_heal,

@ -33,11 +33,11 @@ This mod adds mobs which closely resemble the mobs from the game Minecraft, vers
* Husk * Husk
* Skeleton * Skeleton
* Stray * Stray
* Creeper * Stalker
* Slime * Slime
* Spider * Spider
* Cave Spider * Cave Spider
* Enderman * Rover
* Zombie Villager * Zombie Villager
* Zombie Piglin * Zombie Piglin
* Wither Skeleton * Wither Skeleton

@ -5,7 +5,7 @@ Blaze=Lohe
Chicken=Huhn Chicken=Huhn
Cow=Kuh Cow=Kuh
Mooshroom=Pilzkuh Mooshroom=Pilzkuh
Creeper=Creeper Stalker=Stalker
Ender Dragon=Enderdrache Ender Dragon=Enderdrache
Enderman=Enderman Enderman=Enderman
Endermite=Endermilbe Endermite=Endermilbe

@ -6,7 +6,7 @@ Blaze=Blaze
Chicken=Kylling Chicken=Kylling
Cow=Ko Cow=Ko
Mooshroom=Svamp Mooshroom=Svamp
Creeper=Creeper Stalker=Stalker
Ender Dragon=Enderdrage Ender Dragon=Enderdrage
Enderman=Enderman Enderman=Enderman
Endermite=Endermide Endermite=Endermide

@ -5,7 +5,7 @@ Chicken=Pollo
Cod=Bacalao Cod=Bacalao
Cow=Vaca Cow=Vaca
Mooshroom=Champivaca Mooshroom=Champivaca
Creeper=Creeper Stalker=Stalker
Dolphin=Delfín Dolphin=Delfín
Ender Dragon=Ender Dragon Ender Dragon=Ender Dragon
Enderman=Enderman Enderman=Enderman

@ -6,7 +6,7 @@ Blaze=Blaze
Chicken=Poulet Chicken=Poulet
Cow=Vache Cow=Vache
Mooshroom=Champimeuh Mooshroom=Champimeuh
Creeper=Creeper Stalker=Stalker
Ender Dragon=Ender Dragon Ender Dragon=Ender Dragon
Enderman=Enderman Enderman=Enderman
Endermite=Endermite Endermite=Endermite

@ -6,7 +6,7 @@ Blaze=Flamor
Chicken=Polet Chicken=Polet
Cow=Vacha Cow=Vacha
Mooshroom=Vachairòla Mooshroom=Vachairòla
Creeper=Creeper Stalker=Stalker
Ender Dragon=Dragon de Finuèit Ender Dragon=Dragon de Finuèit
Enderman=Finuèairi Enderman=Finuèairi
Endermite=Finuèibau Endermite=Finuèibau

@ -6,7 +6,7 @@ Blaze=Blaze
Chicken=Galinha Chicken=Galinha
Cow=Vaca Cow=Vaca
Mooshroom=Coguvaca Mooshroom=Coguvaca
Creeper=Creeper Stalker=Stalker
Ender Dragon=Dragão do Fim Ender Dragon=Dragão do Fim
Enderman=Enderman Enderman=Enderman
Endermite=Endermite Endermite=Endermite

@ -6,7 +6,7 @@ Blaze=Ифрит
Chicken=Курица Chicken=Курица
Cow=Корова Cow=Корова
Mooshroom=Грибная корова Mooshroom=Грибная корова
Creeper=Крипер Stalker=Сталкер
Ender Dragon=Дракон Края Ender Dragon=Дракон Края
Enderman=Эндермен Enderman=Эндермен
Endermite=Эндермит Endermite=Эндермит

@ -6,7 +6,7 @@ Blaze=
Chicken= Chicken=
Cow= Cow=
Mooshroom= Mooshroom=
Creeper= Stalker=
Ender Dragon= Ender Dragon=
Enderman= Enderman=
Endermite= Endermite=

Binary file not shown.

Binary file not shown.

@ -31,20 +31,9 @@ local place_frequency_min = 235
local place_frequency_max = 245 local place_frequency_max = 245
minetest.register_entity("mobs_mc:ender_eyes", { minetest.register_entity("mobs_mc:ender_eyes", {
visual = "mesh",
mesh = "mobs_mc_spider.b3d",
visual_size = {x=1.01/3, y=1.01/3},
textures = {
"mobs_mc_enderman_eyes.png",
},
on_step = function(self) on_step = function(self)
if self and self.object then
if not self.object:get_attach() then
self.object:remove() self.object:remove()
end
end
end, end,
glow = 50,
}) })
local S = minetest.get_translator("mobs_mc") local S = minetest.get_translator("mobs_mc")
@ -66,142 +55,8 @@ end
local pr = PseudoRandom(os.time()*(-334)) local pr = PseudoRandom(os.time()*(-334))
-- Texuture overrides for enderman block. Required for cactus because it's original is a nodebox
-- and the textures have tranparent pixels.
local block_texture_overrides
do
local cbackground = "mobs_mc_enderman_cactus_background.png"
local ctiles = minetest.registered_nodes["mcl_core:cactus"].tiles
local ctable = {}
local last
for i=1, 6 do
if ctiles[i] then
last = ctiles[i]
end
table.insert(ctable, cbackground .. "^" .. last)
end
block_texture_overrides = {
["mcl_core:cactus"] = ctable,
-- FIXME: replace colorize colors with colors from palette
["mcl_core:dirt_with_grass"] =
{
"mcl_core_grass_block_top.png^[colorize:green:90",
"default_dirt.png",
"default_dirt.png^(mcl_core_grass_block_side_overlay.png^[colorize:green:90)",
"default_dirt.png^(mcl_core_grass_block_side_overlay.png^[colorize:green:90)",
"default_dirt.png^(mcl_core_grass_block_side_overlay.png^[colorize:green:90)",
"default_dirt.png^(mcl_core_grass_block_side_overlay.png^[colorize:green:90)"}
}
end
-- Create the textures table for the enderman, depending on which kind of block
-- the enderman holds (if any).
local create_enderman_textures = function(block_type, itemstring)
local base = "mobs_mc_enderman.png^mobs_mc_enderman_eyes.png"
--[[ Order of the textures in the texture table:
Flower, 90 degrees
Flower, 45 degrees
Held block, backside
Held block, bottom
Held block, front
Held block, left
Held block, right
Held block, top
Enderman texture (base)
]]
-- Regular cube
if block_type == "cube" then
local tiles = minetest.registered_nodes[itemstring].tiles
local textures = {}
local last
if block_texture_overrides[itemstring] then
-- Texture override available? Use these instead!
textures = block_texture_overrides[itemstring]
else
-- Extract the texture names
for i = 1, 6 do
if type(tiles[i]) == "string" then
last = tiles[i]
elseif type(tiles[i]) == "table" then
if tiles[i].name then
last = tiles[i].name
end
end
table.insert(textures, last)
end
end
return {
"blank.png",
"blank.png",
textures[5],
textures[2],
textures[6],
textures[3],
textures[4],
textures[1],
base, -- Enderman texture
}
-- Node of plantlike drawtype, 45° (recommended)
elseif block_type == "plantlike45" then
local textures = minetest.registered_nodes[itemstring].tiles
return {
"blank.png",
textures[1],
"blank.png",
"blank.png",
"blank.png",
"blank.png",
"blank.png",
"blank.png",
base,
}
-- Node of plantlike drawtype, 90°
elseif block_type == "plantlike90" then
local textures = minetest.registered_nodes[itemstring].tiles
return {
textures[1],
"blank.png",
"blank.png",
"blank.png",
"blank.png",
"blank.png",
"blank.png",
"blank.png",
base,
}
elseif block_type == "unknown" then
return {
"blank.png",
"blank.png",
"unknown_node.png",
"unknown_node.png",
"unknown_node.png",
"unknown_node.png",
"unknown_node.png",
"unknown_node.png",
base, -- Enderman texture
}
-- No block held (for initial texture)
elseif block_type == "nothing" or block_type == nil then
return {
"blank.png",
"blank.png",
"blank.png",
"blank.png",
"blank.png",
"blank.png",
"blank.png",
"blank.png",
base, -- Enderman texture
}
end
end
-- Select a new animation definition. -- Select a new animation definition.
local select_enderman_animation = function(animation_type) local select_rover_animation = function(animation_type)
-- Enderman holds a block -- Enderman holds a block
if animation_type == "block" then if animation_type == "block" then
return { return {
@ -254,8 +109,8 @@ local psdefs = {{
texture = "mcl_portals_particle"..math.random(1, 5)..".png", texture = "mcl_portals_particle"..math.random(1, 5)..".png",
}} }}
mcl_mobs.register_mob("mobs_mc:enderman", { mcl_mobs.register_mob("mobs_mc:rover", {
description = S("Enderman"), description = S("Rover"),
type = "monster", type = "monster",
spawn_class = "passive", spawn_class = "passive",
can_despawn = true, can_despawn = true,
@ -267,23 +122,11 @@ mcl_mobs.register_mob("mobs_mc:enderman", {
xp_max = 5, xp_max = 5,
collisionbox = {-0.3, -0.01, -0.3, 0.3, 2.89, 0.3}, collisionbox = {-0.3, -0.01, -0.3, 0.3, 2.89, 0.3},
visual = "mesh", visual = "mesh",
mesh = "mobs_mc_enderman.b3d", mesh = "vl_rover.b3d",
textures = create_enderman_textures(), textures = { "vl_mobs_rover.png^vl_mobs_rover_face.png" },
visual_size = {x=3, y=3}, glow = 100,
visual_size = {x=10, y=10},
makes_footstep_sound = true, makes_footstep_sound = true,
on_spawn = function(self)
local spider_eyes=false
for n = 1, #self.object:get_children() do
local obj = self.object:get_children()[n]
if obj:get_luaentity() and self.object:get_luaentity().name == "mobs_mc:ender_eyes" then
spider_eyes = true
end
end
if not spider_eyes then
minetest.add_entity(self.object:get_pos(), "mobs_mc:ender_eyes"):set_attach(self.object, "head.top", vector.new(0,2.54,-1.99), vector.new(90,0,180))
minetest.add_entity(self.object:get_pos(), "mobs_mc:ender_eyes"):set_attach(self.object, "head.top", vector.new(1,2.54,-1.99), vector.new(90,0,180))
end
end,
sounds = { sounds = {
-- TODO: Custom war cry sound -- TODO: Custom war cry sound
war_cry = "mobs_sandmonster", war_cry = "mobs_sandmonster",
@ -292,8 +135,8 @@ mcl_mobs.register_mob("mobs_mc:enderman", {
random = {name="mobs_mc_enderman_random", gain=0.5}, random = {name="mobs_mc_enderman_random", gain=0.5},
distance = 16, distance = 16,
}, },
walk_velocity = 0.2, walk_velocity = 2,
run_velocity = 3.4, run_velocity = 4,
damage = 7, damage = 7,
reach = 2, reach = 2,
particlespawners = psdefs, particlespawners = psdefs,
@ -304,7 +147,7 @@ mcl_mobs.register_mob("mobs_mc:enderman", {
max = 1, max = 1,
looting = "common"}, looting = "common"},
}, },
animation = select_enderman_animation("normal"), animation = select_rover_animation("normal"),
_taken_node = "", _taken_node = "",
can_spawn = function(pos) can_spawn = function(pos)
return #minetest.find_nodes_in_area(vector.offset(pos,0,1,0),vector.offset(pos,0,3,0),{"air"}) > 2 return #minetest.find_nodes_in_area(vector.offset(pos,0,1,0),vector.offset(pos,0,3,0),{"air"}) > 2
@ -348,6 +191,7 @@ mcl_mobs.register_mob("mobs_mc:enderman", {
-- AGRESSIVELY WARP/CHASE PLAYER BEHAVIOUR HERE. -- AGRESSIVELY WARP/CHASE PLAYER BEHAVIOUR HERE.
if self.state == "attack" then if self.state == "attack" then
self.object:set_properties({textures={"vl_mobs_rover.png^vl_mobs_rover_face_angry.png"}})
if self.attack then if self.attack then
local target = self.attack local target = self.attack
local pos = target:get_pos() local pos = target:get_pos()
@ -358,6 +202,7 @@ mcl_mobs.register_mob("mobs_mc:enderman", {
end end
end end
else --if not attacking try to tp to the dark else --if not attacking try to tp to the dark
self.object:set_properties({textures={"vl_mobs_rover.png^vl_mobs_rover_face.png"}})
if dim == 'overworld' then if dim == 'overworld' then
local light = minetest.get_node_light(enderpos) local light = minetest.get_node_light(enderpos)
if light and light > minetest.LIGHT_MAX then if light and light > minetest.LIGHT_MAX then
@ -489,38 +334,17 @@ mcl_mobs.register_mob("mobs_mc:enderman", {
minetest.remove_node(take_pos) minetest.remove_node(take_pos)
local dug = minetest.get_node_or_nil(take_pos) local dug = minetest.get_node_or_nil(take_pos)
if dug and dug.name == "air" then if dug and dug.name == "air" then
local node_obj = vl_held_item.create_item_entity(take_pos, node.name)
if node_obj then
node_obj:set_attach(self.object, "held_node")
self._node_obj = node_obj
self._taken_node = node.name self._taken_node = node.name
self.persistent = true node_obj:set_properties({visual_size={x=0.02, y=0.02}})
local def = minetest.registered_nodes[self._taken_node]
-- Update animation and texture accordingly (adds visibly carried block)
local block_type
-- Cube-shaped
if def.drawtype == "normal" or
def.drawtype == "nodebox" or
def.drawtype == "liquid" or
def.drawtype == "flowingliquid" or
def.drawtype == "glasslike" or
def.drawtype == "glasslike_framed" or
def.drawtype == "glasslike_framed_optional" or
def.drawtype == "allfaces" or
def.drawtype == "allfaces_optional" or
def.drawtype == nil then
block_type = "cube"
elseif def.drawtype == "plantlike" then
-- Flowers and stuff
block_type = "plantlike45"
elseif def.drawtype == "airlike" then
-- Just air
block_type = nil
else
-- Fallback for complex drawtypes
block_type = "unknown"
end end
self.base_texture = create_enderman_textures(block_type, self._taken_node) local def = minetest.registered_nodes[self._taken_node]
self.object:set_properties({ textures = self.base_texture }) self.animation = select_rover_animation("block")
self.animation = select_enderman_animation("block")
self:set_animation(self.animation.current) self:set_animation(self.animation.current)
if def.sounds and def.sounds.dug then if def and def.sounds and def.sounds.dug then
minetest.sound_play(def.sounds.dug, {pos = take_pos, max_hear_distance = 16}, true) minetest.sound_play(def.sounds.dug, {pos = take_pos, max_hear_distance = 16}, true)
end end
end end
@ -542,12 +366,14 @@ mcl_mobs.register_mob("mobs_mc:enderman", {
local def = minetest.registered_nodes[self._taken_node] local def = minetest.registered_nodes[self._taken_node]
-- Update animation accordingly (removes visible block) -- Update animation accordingly (removes visible block)
self.persistent = false self.persistent = false
self.animation = select_enderman_animation("normal") self.animation = select_rover_animation("normal")
self:set_animation(self.animation.current) self:set_animation(self.animation.current)
if def.sounds and def.sounds.place then if def and def.sounds and def.sounds.place then
minetest.sound_play(def.sounds.place, {pos = place_pos, max_hear_distance = 16}, true) minetest.sound_play(def.sounds.place, {pos = place_pos, max_hear_distance = 16}, true)
end end
self._taken_node = "" self._node_obj:remove()
self._node_obj = nil
self._taken_node = nil
end end
end end
end end
@ -645,6 +471,21 @@ mcl_mobs.register_mob("mobs_mc:enderman", {
--end --end
end end
end, end,
after_activate = function(self, staticdata, def, dtime)
if not self._taken_node or self._taken_node == "" then
self.animation = select_rover_animation("normal")
self:set_animation(self.animation.current)
return
end
self.animation = select_rover_animation("block")
self:set_animation(self.animation.current)
local node_obj = vl_held_item.create_item_entity(self.object:get_pos(), self._taken_node)
if node_obj then
node_obj:set_attach(self.object, "held_node")
self._node_obj = node_obj
node_obj:set_properties({visual_size={x=0.02, y=0.02}})
end
end,
armor = { fleshy = 100, water_vulnerable = 100 }, armor = { fleshy = 100, water_vulnerable = 100 },
water_damage = 8, water_damage = 8,
view_range = 64, view_range = 64,
@ -652,9 +493,22 @@ mcl_mobs.register_mob("mobs_mc:enderman", {
attack_type = "dogfight", attack_type = "dogfight",
}) })
-- compat
minetest.register_entity("mobs_mc:enderman", {
on_activate = function(self, staticdata, dtime)
minetest.add_entity(self.object:get_pos(), "mobs_mc:rover", staticdata)
obj:set_properties({
mesh = "vl_rover.b3d",
textures = { "vl_mobs_rover.png^vl_mobs_rover_face.png" },
visual_size = {x=10, y=10},
})
self.object:remove()
end,
})
-- End spawn -- End spawn
mcl_mobs:spawn_specific( mcl_mobs:spawn_specific(
"mobs_mc:enderman", "mobs_mc:rover",
"end", "end",
"ground", "ground",
{ {
@ -674,7 +528,7 @@ mcl_vars.mg_end_min,
mcl_vars.mg_end_max) mcl_vars.mg_end_max)
-- Overworld spawn -- Overworld spawn
mcl_mobs:spawn_specific( mcl_mobs:spawn_specific(
"mobs_mc:enderman", "mobs_mc:rover",
"overworld", "overworld",
"ground", "ground",
{ {
@ -823,7 +677,7 @@ mcl_vars.mg_overworld_max)
-- Nether spawn (rare) -- Nether spawn (rare)
mcl_mobs:spawn_specific( mcl_mobs:spawn_specific(
"mobs_mc:enderman", "mobs_mc:rover",
"nether", "nether",
"ground", "ground",
{ {
@ -840,7 +694,7 @@ mcl_vars.mg_nether_max)
-- Warped Forest spawn (common) -- Warped Forest spawn (common)
mcl_mobs:spawn_specific( mcl_mobs:spawn_specific(
"mobs_mc:enderman", "mobs_mc:rover",
"nether", "nether",
"ground", "ground",
{ {
@ -855,4 +709,5 @@ mcl_vars.mg_nether_min,
mcl_vars.mg_nether_max) mcl_vars.mg_nether_max)
-- spawn eggs -- spawn eggs
mcl_mobs.register_egg("mobs_mc:enderman", S("Enderman"), "#252525", "#151515", 0) mcl_mobs.register_egg("mobs_mc:rover", S("Rover"), "#252525", "#151515", 0)
minetest.register_alias("mobs_mc:enderman", "mobs_mc:rover")

@ -73,7 +73,7 @@ local skeleton = {
looting = "common",}, looting = "common",},
-- Head -- Head
-- TODO: Only drop if killed by charged creeper -- TODO: Only drop if killed by charged stalker
{name = "mcl_heads:skeleton", {name = "mcl_heads:skeleton",
chance = 200, -- 0.5% chance chance = 200, -- 0.5% chance
min = 1, min = 1,

@ -3,14 +3,59 @@
local S = minetest.get_translator("mobs_mc") local S = minetest.get_translator("mobs_mc")
--################### --###################
--################### CREEPER --################### STALKER
--################### --###################
local function get_texture(self)
local on_name = self.standing_on
local texture
local texture_suff = ""
if on_name and on_name ~= "air" then
local tiles = minetest.registered_nodes[on_name].tiles
if tiles then
local tile = tiles[1]
local color
if type(tile) == "table" then
texture = tile.name or tile.image
if tile.color then
color = minetest.colorspec_to_colorstring(tile.color)
end
elseif type(tile) == "string" then
texture = tile
end
if not color then
color = minetest.colorspec_to_colorstring(minetest.registered_nodes[on_name].color)
end
if color then
texture_suff = "^[multiply:" .. color .. "^[hsl:0:0:20"
end
end
end
if not texture then
texture = "vl_stalker_default.png"
end
texture = "([combine:16x24:0,0=" .. texture .. ":0,16=" .. texture .. texture_suff
if self.attack then
texture = texture .. ")^vl_mobs_stalker_overlay_angry.png"
else
texture = texture .. ")^vl_mobs_stalker_overlay.png"
end
return texture
end
local AURA = "vl_stalker_overloaded_aura.png"
local function get_overloaded_aura(timer)
local frame = math.floor(timer*16)
local f = tostring(frame)
local nf = tostring(16-f)
return "[combine:16x24:-" .. nf ..",0=" .. AURA .. ":" .. f .. ",0=" .. AURA
end
mcl_mobs.register_mob("mobs_mc:creeper", {
description = S("Creeper"), mcl_mobs.register_mob("mobs_mc:stalker", {
description = S("Stalker"),
type = "monster", type = "monster",
spawn_class = "hostile", spawn_class = "hostile",
spawn_in_group = 1, spawn_in_group = 1,
@ -21,16 +66,16 @@ mcl_mobs.register_mob("mobs_mc:creeper", {
collisionbox = {-0.3, -0.01, -0.3, 0.3, 1.69, 0.3}, collisionbox = {-0.3, -0.01, -0.3, 0.3, 1.69, 0.3},
pathfinding = 1, pathfinding = 1,
visual = "mesh", visual = "mesh",
mesh = "mobs_mc_creeper.b3d", mesh = "vl_stalker.b3d",
head_swivel = "Head_Control", -- head_swivel = "Head_Control",
bone_eye_height = 2.35, bone_eye_height = 2.35,
head_eye_height = 1.8; head_eye_height = 1.8;
curiosity = 2, curiosity = 2,
textures = { textures = {
{"mobs_mc_creeper.png", {get_texture({}),
"mobs_mc_empty.png"}, "mobs_mc_empty.png"},
}, },
visual_size = {x=3, y=3}, visual_size = {x=2, y=2},
sounds = { sounds = {
attack = "tnt_ignite", attack = "tnt_ignite",
death = "mobs_mc_creeper_death", death = "mobs_mc_creeper_death",
@ -56,8 +101,8 @@ mcl_mobs.register_mob("mobs_mc:creeper", {
allow_fuse_reset = true, allow_fuse_reset = true,
stop_to_explode = true, stop_to_explode = true,
-- Force-ignite creeper with flint and steel and explode after 1.5 seconds. -- Force-ignite stalker with flint and steel and explode after 1.5 seconds.
-- TODO: Make creeper flash after doing this as well. -- TODO: Make stalker flash after doing this as well.
-- TODO: Test and debug this code. -- TODO: Test and debug this code.
on_rightclick = function(self, clicker) on_rightclick = function(self, clicker)
if self._forced_explosion_countdown_timer ~= nil then if self._forced_explosion_countdown_timer ~= nil then
@ -86,6 +131,7 @@ mcl_mobs.register_mob("mobs_mc:creeper", {
self:boom(mcl_util.get_object_center(self.object), self.explosion_strength) self:boom(mcl_util.get_object_center(self.object), self.explosion_strength)
end end
end end
self.object:set_properties({textures={get_texture(self)}})
end, end,
on_die = function(self, pos, cmi_cause) on_die = function(self, pos, cmi_cause)
-- Drop a random music disc when killed by skeleton or stray -- Drop a random music disc when killed by skeleton or stray
@ -108,35 +154,31 @@ mcl_mobs.register_mob("mobs_mc:creeper", {
looting = "common",}, looting = "common",},
-- Head -- Head
-- TODO: Only drop if killed by charged creeper -- TODO: Only drop if killed by charged stalker
{name = "mcl_heads:creeper", {name = "mcl_heads:stalker",
chance = 200, -- 0.5% chance = 200, -- 0.5%
min = 1, min = 1,
max = 1,}, max = 1,},
}, },
animation = { animation = {
speed_normal = 24, speed_normal = 30,
speed_run = 48, speed_run = 60,
stand_start = 0, stand_start = 0,
stand_end = 23, stand_end = 23,
walk_start = 24, walk_start = 24,
walk_end = 49, walk_end = 49,
run_start = 24, run_start = 24,
run_end = 49, run_end = 49,
hurt_start = 110, fuse_start = 49,
hurt_end = 139, fuse_end = 80,
death_start = 140,
death_end = 189,
look_start = 50,
look_end = 108,
}, },
floats = 1, floats = 1,
fear_height = 4, fear_height = 4,
view_range = 16, view_range = 16,
}) })
mcl_mobs.register_mob("mobs_mc:creeper_charged", { mcl_mobs.register_mob("mobs_mc:stalker_overloaded", {
description = S("Charged Creeper"), description = S("Overloaded Stalker"),
type = "monster", type = "monster",
spawn_class = "hostile", spawn_class = "hostile",
hp_min = 20, hp_min = 20,
@ -146,15 +188,16 @@ mcl_mobs.register_mob("mobs_mc:creeper_charged", {
collisionbox = {-0.3, -0.01, -0.3, 0.3, 1.69, 0.3}, collisionbox = {-0.3, -0.01, -0.3, 0.3, 1.69, 0.3},
pathfinding = 1, pathfinding = 1,
visual = "mesh", visual = "mesh",
mesh = "mobs_mc_creeper.b3d", mesh = "vl_stalker.b3d",
--BOOM --BOOM
textures = { textures = {
{"mobs_mc_creeper.png", {get_texture({}),
"mobs_mc_creeper_charge.png"}, AURA},
}, },
visual_size = {x=3, y=3}, use_texture_alpha = true,
visual_size = {x=2, y=2},
sounds = { sounds = {
attack = "tnt_ignite", attack = "tnt_ignite",
death = "mobs_mc_creeper_death", death = "mobs_mc_creeper_death",
@ -178,8 +221,8 @@ mcl_mobs.register_mob("mobs_mc:creeper_charged", {
allow_fuse_reset = true, allow_fuse_reset = true,
stop_to_explode = true, stop_to_explode = true,
-- Force-ignite creeper with flint and steel and explode after 1.5 seconds. -- Force-ignite stalker with flint and steel and explode after 1.5 seconds.
-- TODO: Make creeper flash after doing this as well. -- TODO: Make stalker flash after doing this as well.
-- TODO: Test and debug this code. -- TODO: Test and debug this code.
on_rightclick = function(self, clicker) on_rightclick = function(self, clicker)
if self._forced_explosion_countdown_timer ~= nil then if self._forced_explosion_countdown_timer ~= nil then
@ -208,6 +251,9 @@ mcl_mobs.register_mob("mobs_mc:creeper_charged", {
self:boom(mcl_util.get_object_center(self.object), self.explosion_strength) self:boom(mcl_util.get_object_center(self.object), self.explosion_strength)
end end
end end
if not self._aura_timer or self._aura_timer > 1 then self._aura_timer = 0 end
self._aura_timer = self._aura_timer + dtime
self.object:set_properties({textures={get_texture(self), get_overloaded_aura(self._aura_timer)}})
end, end,
on_die = function(self, pos, cmi_cause) on_die = function(self, pos, cmi_cause)
-- Drop a random music disc when killed by skeleton or stray -- Drop a random music disc when killed by skeleton or stray
@ -222,7 +268,7 @@ mcl_mobs.register_mob("mobs_mc:creeper_charged", {
end end
end, end,
on_lightning_strike = function(self, pos, pos2, objects) on_lightning_strike = function(self, pos, pos2, objects)
mcl_util.replace_mob(self.object, "mobs_mc:creeper_charged") mcl_util.replace_mob(self.object, "mobs_mc:stalker_overloaded")
return true return true
end, end,
maxdrops = 2, maxdrops = 2,
@ -234,27 +280,23 @@ mcl_mobs.register_mob("mobs_mc:creeper_charged", {
looting = "common",}, looting = "common",},
-- Head -- Head
-- TODO: Only drop if killed by charged creeper -- TODO: Only drop if killed by overloaded stalker
{name = "mcl_heads:creeper", {name = "mcl_heads:stalker",
chance = 200, -- 0.5% chance = 200, -- 0.5%
min = 1, min = 1,
max = 1,}, max = 1,},
}, },
animation = { animation = {
speed_normal = 24, speed_normal = 30,
speed_run = 48, speed_run = 60,
stand_start = 0, stand_start = 0,
stand_end = 23, stand_end = 23,
walk_start = 24, walk_start = 24,
walk_end = 49, walk_end = 49,
run_start = 24, run_start = 24,
run_end = 49, run_end = 49,
hurt_start = 110, fuse_start = 49,
hurt_end = 139, fuse_end = 80,
death_start = 140,
death_end = 189,
look_start = 50,
look_end = 108,
}, },
floats = 1, floats = 1,
fear_height = 4, fear_height = 4,
@ -264,8 +306,38 @@ mcl_mobs.register_mob("mobs_mc:creeper_charged", {
glow = 3, glow = 3,
}) })
-- compat
minetest.register_entity("mobs_mc:creeper", {
on_activate = function(self, staticdata, dtime)
local obj = minetest.add_entity(self.object:get_pos(), "mobs_mc:stalker", staticdata)
obj:set_properties({
visual_size = {x=2, y=2},
mesh = "vl_stalker.b3d",
textures = {
{get_texture({}),
"mobs_mc_empty.png"},
},
})
self.object:remove()
end,
})
minetest.register_entity("mobs_mc:creeper_charged", {
on_activate = function(self, staticdata, dtime)
local obj = minetest.add_entity(self.object:get_pos(), "mobs_mc:stalker_overloaded", staticdata)
obj:set_properties({
visual_size = {x=2, y=2},
mesh = "vl_stalker.b3d",
textures = {
{get_texture({}),
AURA},
},
})
self.object:remove()
end,
})
mcl_mobs:spawn_specific( mcl_mobs:spawn_specific(
"mobs_mc:creeper", "mobs_mc:stalker",
"overworld", "overworld",
"ground", "ground",
{ {
@ -413,4 +485,6 @@ mcl_vars.mg_overworld_min,
mcl_vars.mg_overworld_max) mcl_vars.mg_overworld_max)
-- spawn eggs -- spawn eggs
mcl_mobs.register_egg("mobs_mc:creeper", S("Creeper"), "#0da70a", "#000000", 0) mcl_mobs.register_egg("mobs_mc:stalker", S("Stalker"), "#0da70a", "#000000", 0)
minetest.register_alias("mobs_mc:creeper", "mobs_mc:stalker")
mcl_mobs.register_egg("mobs_mc:stalker_overloaded", S("Overloaded Stalker"), "#00a77a", "#000000", 0)

@ -38,7 +38,7 @@ local drops_common = {
local drops_zombie = table.copy(drops_common) local drops_zombie = table.copy(drops_common)
table.insert(drops_zombie, { table.insert(drops_zombie, {
-- Zombie Head -- Zombie Head
-- TODO: Only drop if killed by charged creeper -- TODO: Only drop if killed by charged stalker
name = "mcl_heads:zombie", name = "mcl_heads:zombie",
chance = 200, -- 0.5% chance = 200, -- 0.5%
min = 1, min = 1,

@ -0,0 +1,40 @@
local modname = minetest.get_current_modname()
local modpath = minetest.get_modpath(modname)
vl_held_item = {}
local mod = vl_held_item
local held_item_entity = {
initial_properties = {
hp_max = 1,
physical = true,
pointable = false,
collide_with_objects = true,
static_save = false, -- TODO remove/change later when needed to persist
-- WARNING persisting held items not recommended, mob can recreate it after_activate
collision_box = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 },
},
visual = "wielditem",
textures = { "mcl_core:dirt_with_grass" },
}
function held_item_entity:on_activate(staticdata, dtime_unloaded)
local staticdata = minetest.deserialize(staticdata)
self._staticdata = staticdata
local props = {
visual = "wielditem",
textures = { staticdata.itemname },
}
self.object:set_properties(props)
end
function held_item_entity:get_staticdata()
return minetest.serialize(self._staticdata)
end
minetest.register_entity("vl_held_item:held_item_entity", held_item_entity)
function mod.create_item_entity(pos, itemname)
local staticdata = {
itemname = itemname
}
return minetest.add_entity(pos, "vl_held_item:held_item_entity", minetest.serialize(staticdata))
end

@ -0,0 +1,4 @@
name = vl_held_item
author = teknomunk, Herowl
description = An entity that represents an item held by a mob
depends = mcl_core

@ -21,7 +21,7 @@ end
local same_id = { local same_id = {
enchanting = { "table" }, enchanting = { "table" },
experience = { "bottle" }, experience = { "bottle" },
heads = { "skeleton", "zombie", "creeper", "wither_skeleton" }, heads = { "skeleton", "zombie", "stalker", "wither_skeleton" },
mobitems = { "rabbit", "chicken" }, mobitems = { "rabbit", "chicken" },
walls = { walls = {
"andesite", "brick", "cobble", "diorite", "endbricks", "andesite", "brick", "cobble", "diorite", "endbricks",

@ -14,7 +14,7 @@ Grows on grass blocks, podzol, dirt or coarse dirt=Wächst auf Grasblöcken, Pod
Flammable=Entzündlich Flammable=Entzündlich
Zombie view range: -50%=Zombiesichtweite: -50% Zombie view range: -50%=Zombiesichtweite: -50%
Skeleton view range: -50%=Skelettsichtweite: -50% Skeleton view range: -50%=Skelettsichtweite: -50%
Creeper view range: -50%=Creepersichtweite: -50% Stalker view range: -50%=Stalkersichtweite: -50%
Damage: @1=Schaden: @1 Damage: @1=Schaden: @1
Damage (@1): @2=Schaden (@1): @2 Damage (@1): @2=Schaden (@1): @2
Healing: @1=Heilung: @1 Healing: @1=Heilung: @1

@ -14,7 +14,7 @@ Grows on grass blocks, podzol, dirt or coarse dirt=Crece sobre bloques de pasto,
Flammable=Inflamable Flammable=Inflamable
Zombie view range: -50%=Rango de visión zombie: -50% Zombie view range: -50%=Rango de visión zombie: -50%
Skeleton view range: -50%=Rango de visión de esqueleto: -50% Skeleton view range: -50%=Rango de visión de esqueleto: -50%
Creeper view range: -50%=Rango de visión de creeper: -50% Stalker view range: -50%=Rango de visión de stalker: -50%
Damage: @1=Daño: @1 Damage: @1=Daño: @1
Damage (@1): @2=Daño (@1): @2 Damage (@1): @2=Daño (@1): @2
Healing: @1=Curación: @1 Healing: @1=Curación: @1

@ -14,7 +14,7 @@ Grows on grass blocks, podzol, dirt or coarse dirt=Pousse sur les blocs de gazon
Flammable=Inflammable Flammable=Inflammable
Zombie view range: -50%=Distance de vue de Zombie : -50% Zombie view range: -50%=Distance de vue de Zombie : -50%
Skeleton view range: -50%=Distance de vue de Squelette : -50% Skeleton view range: -50%=Distance de vue de Squelette : -50%
Creeper view range: -50%=Distance de vue de Creeper : -50% Stalker view range: -50%=Distance de vue de Stalker : -50%
Damage: @1=Dégâts : @1 Damage: @1=Dégâts : @1
Damage (@1): @2=Dégâts (@1) : @2 Damage (@1): @2=Dégâts (@1) : @2
Healing: @1=Guérison : @1 Healing: @1=Guérison : @1

@ -14,7 +14,7 @@ Grows on grass blocks, podzol, dirt or coarse dirt=Rośnie na blokach trawy, bie
Flammable=Łatwopalne Flammable=Łatwopalne
Zombie view range: -50%=Zasięg widzenia zombie: -50% Zombie view range: -50%=Zasięg widzenia zombie: -50%
Skeleton view range: -50%=Zasięg widzenia szkieleta: -50% Skeleton view range: -50%=Zasięg widzenia szkieleta: -50%
Creeper view range: -50%=Zasięg widzenia creepera: -50% Stalker view range: -50%=Zasięg widzenia stalkera: -50%
Damage: @1=Obrażenia: @1 Damage: @1=Obrażenia: @1
Damage (@1): @2=Obrażenia (@1): @2 Damage (@1): @2=Obrażenia (@1): @2
Healing: @1=Leczenie: @1 Healing: @1=Leczenie: @1

@ -14,7 +14,7 @@ Grows on grass blocks, podzol, dirt or coarse dirt=Cresce em blocos de grama, po
Flammable=Inflamável Flammable=Inflamável
Zombie view range: -50%=Alcançe de visão do zumbi: -50% Zombie view range: -50%=Alcançe de visão do zumbi: -50%
Skeleton view range: -50%=Alcançe de visão do esqueleto: -50% Skeleton view range: -50%=Alcançe de visão do esqueleto: -50%
Creeper view range: -50%=Alcançe de visão do creeper: -50% Stalker view range: -50%=Alcançe de visão do stalker: -50%
Damage: @1= Dano: @1 Damage: @1= Dano: @1
Damage (@1): @2=Dano (@1): @2 Damage (@1): @2=Dano (@1): @2
Healing: @1=Cura: @1 Healing: @1=Cura: @1

@ -14,7 +14,7 @@ Grows on grass blocks, podzol, dirt or coarse dirt=Растёт на дёрне,
Flammable=Воспламенимо Flammable=Воспламенимо
Zombie view range: -50%=Дальность зрения зомби: -50% Zombie view range: -50%=Дальность зрения зомби: -50%
Skeleton view range: -50%=Дальность зрения скелета: -50% Skeleton view range: -50%=Дальность зрения скелета: -50%
Creeper view range: -50%=Дальность зрения крипера: -50% Stalker view range: -50%=Дальность зрения сталкера: -50%
Damage: @1=Урон: @1 Damage: @1=Урон: @1
Damage (@1): @2=Урон (@1): @2 Damage (@1): @2=Урон (@1): @2
Durability: @1=Прочность: @1 Durability: @1=Прочность: @1

@ -14,7 +14,7 @@ Grows on grass blocks, podzol, dirt or coarse dirt=
Flammable= Flammable=
Zombie view range: -50%= Zombie view range: -50%=
Skeleton view range: -50%= Skeleton view range: -50%=
Creeper view range: -50%= Stalker view range: -50%=
Damage: @1= Damage: @1=
Damage (@1): @2= Damage (@1): @2=
Healing: @1= Healing: @1=

@ -108,8 +108,8 @@ tt.register_snippet(function(itemstring)
return S("Zombie view range: -50%") return S("Zombie view range: -50%")
elseif itemstring == "mcl_heads:skeleton" then elseif itemstring == "mcl_heads:skeleton" then
return S("Skeleton view range: -50%") return S("Skeleton view range: -50%")
elseif itemstring == "mcl_heads:creeper" then elseif itemstring == "mcl_heads:stalker" then
return S("Creeper view range: -50%") return S("Stalker view range: -50%")
end end
end) end)

@ -661,7 +661,7 @@ mesecon.register_mvps_unsticky("mcl_flowers:tulip_red")
mesecon.register_mvps_unsticky("mcl_flowers:tulip_white") mesecon.register_mvps_unsticky("mcl_flowers:tulip_white")
mesecon.register_mvps_unsticky("mcl_flowers:waterlily") mesecon.register_mvps_unsticky("mcl_flowers:waterlily")
-- Heads -- Heads
mesecon.register_mvps_unsticky("mcl_heads:creeper") mesecon.register_mvps_unsticky("mcl_heads:stalker")
mesecon.register_mvps_unsticky("mcl_heads:skeleton") mesecon.register_mvps_unsticky("mcl_heads:skeleton")
mesecon.register_mvps_unsticky("mcl_heads:steve") mesecon.register_mvps_unsticky("mcl_heads:steve")
mesecon.register_mvps_unsticky("mcl_heads:wither_skeleton") mesecon.register_mvps_unsticky("mcl_heads:wither_skeleton")

@ -36,7 +36,7 @@ local patterns = {
["creeper"] = { ["creeper"] = {
name = N("@1 Creeper Charge"), name = N("@1 Creeper Charge"),
type = "shapeless", type = "shapeless",
{ e, "mcl_heads:creeper", d }, { e, "mcl_heads:stalker", d },
}, },
["cross"] = { ["cross"] = {
name = N("@1 Saltire"), name = N("@1 Saltire"),

@ -249,7 +249,7 @@ function ARROW_ENTITY.on_step(self, dtime)
end end
-- Punch target object but avoid hurting enderman. -- Punch target object but avoid hurting enderman.
if not lua or lua.name ~= "mobs_mc:enderman" then if not lua or lua.name ~= "mobs_mc:rover" then
if not self._in_player then if not self._in_player then
damage_particles(vector.add(pos, vector.multiply(self.object:get_velocity(), 0.1)), self._is_critical) damage_particles(vector.add(pos, vector.multiply(self.object:get_velocity(), 0.1)), self._is_critical)
end end

@ -470,7 +470,7 @@ function ARROW_ENTITY.on_step(self, dtime)
end end
-- Punch target object but avoid hurting enderman. -- Punch target object but avoid hurting enderman.
if not lua or lua.name ~= "mobs_mc:enderman" then if not lua or lua.name ~= "mobs_mc:rover" then
if self._in_player == false then if self._in_player == false then
damage_particles(self.object:get_pos(), self._is_critical) damage_particles(self.object:get_pos(), self._is_critical)
end end

@ -119,7 +119,7 @@ pumpkin_face_base_def.groups.non_combat_armor=1
pumpkin_face_base_def.groups.armor_head=1 pumpkin_face_base_def.groups.armor_head=1
pumpkin_face_base_def.groups.non_combat_armor_head=1 pumpkin_face_base_def.groups.non_combat_armor_head=1
pumpkin_face_base_def._mcl_armor_mob_range_factor = 0 pumpkin_face_base_def._mcl_armor_mob_range_factor = 0
pumpkin_face_base_def._mcl_armor_mob_range_mob = "mobs_mc:enderman" pumpkin_face_base_def._mcl_armor_mob_range_mob = "mobs_mc:rover"
pumpkin_face_base_def._mcl_armor_element = "head" pumpkin_face_base_def._mcl_armor_element = "head"
pumpkin_face_base_def._mcl_armor_texture = "mcl_farming_pumpkin_face.png" pumpkin_face_base_def._mcl_armor_texture = "mcl_farming_pumpkin_face.png"

@ -264,11 +264,11 @@ mcl_heads.register_head{
} }
mcl_heads.register_head{ mcl_heads.register_head{
name = "creeper", name = "stalker",
texture = "mcl_heads_creeper.png", texture = "mcl_heads_stalker.png",
description = S("Creeper Head"), description = S("Stalker Head"),
longdesc = S("A creeper head is a small decorative block which resembles the head of a creeper. It can also be worn as a helmet, which reduces the detection range of creepers by 50%."), longdesc = S("A stalker head is a small decorative block which resembles the head of a stalker. It can also be worn as a helmet, which reduces the detection range of stalkers by 50%."),
range_mob = "mobs_mc:creeper", range_mob = "mobs_mc:stalker",
range_factor = 0.5, range_factor = 0.5,
} }

@ -1,8 +1,8 @@
# textdomain: mcl_heads # textdomain: mcl_heads
Zombie Head=Zombiekopf Zombie Head=Zombiekopf
A zombie head is a small decorative block which resembles the head of a zombie. It can also be worn as a helmet, which reduces the detection range of zombies by 50%.=Ein Zombiekopf ist ein kleiner dekorativer Block, der so wie ein Kopf eines Zombies aussieht. Er kann auch als Helm getragen werden, was den Erkennungsradius von Zombies um 50% verringert. A zombie head is a small decorative block which resembles the head of a zombie. It can also be worn as a helmet, which reduces the detection range of zombies by 50%.=Ein Zombiekopf ist ein kleiner dekorativer Block, der so wie ein Kopf eines Zombies aussieht. Er kann auch als Helm getragen werden, was den Erkennungsradius von Zombies um 50% verringert.
Creeper Head=Creeper-Kopf Stalker Head=Stalker-Kopf
A creeper head is a small decorative block which resembles the head of a creeper. It can also be worn as a helmet, which reduces the detection range of creepers by 50%.=Ein Creeperkopf ist ein kleiner dekorativer Block, der so wie ein Kopf eines Creepers aussieht. Er kann auch als Helm getragen werden, was den Erkennungsradius von Creepern um 50% verringert. A stalker head is a small decorative block which resembles the head of a stalker. It can also be worn as a helmet, which reduces the detection range of stalkers by 50%.=Ein Stalkerkopf ist ein kleiner dekorativer Block, der so wie ein Kopf eines Stalkers aussieht. Er kann auch als Helm getragen werden, was den Erkennungsradius von Stalkern um 50% verringert.
Human Head=Menschenkopf Human Head=Menschenkopf
A human head is a small decorative block which resembles the head of a human (i.e. a player character). It can also be worn as a helmet for fun, but does not offer any protection.=Ein Menschenkopf ist ein kleiner dekorativer Block, der so wie der Kopf eines Menschen (das heißt, einer Spielerfigur) aussieht. Er kann auch als Helm zum Spaß getragen werden, aber er bietet keinerlei Schutz. A human head is a small decorative block which resembles the head of a human (i.e. a player character). It can also be worn as a helmet for fun, but does not offer any protection.=Ein Menschenkopf ist ein kleiner dekorativer Block, der so wie der Kopf eines Menschen (das heißt, einer Spielerfigur) aussieht. Er kann auch als Helm zum Spaß getragen werden, aber er bietet keinerlei Schutz.
Skeleton Skull=Skelettschädel Skeleton Skull=Skelettschädel

@ -1,8 +1,8 @@
# textdomain: mcl_heads # textdomain: mcl_heads
Zombie Head=Cabeza de zombie Zombie Head=Cabeza de zombie
A zombie head is a small decorative block which resembles the head of a zombie. It can also be worn as a helmet for fun, but does not offer any protection.=Una cabeza de zombie es un pequeño bloque decorativo que se asemeja a la cabeza de un zombie. También se puede usar como casco por diversión, pero no ofrece ninguna protección. A zombie head is a small decorative block which resembles the head of a zombie. It can also be worn as a helmet for fun, but does not offer any protection.=Una cabeza de zombie es un pequeño bloque decorativo que se asemeja a la cabeza de un zombie. También se puede usar como casco por diversión, pero no ofrece ninguna protección.
Creeper Head=Cabeza de creeper Stalker Head=Cabeza de stalker
A creeper head is a small decorative block which resembles the head of a creeper. It can also be worn as a helmet for fun, but does not offer any protection.=Una cabeza de creeper es un pequeño bloque decorativo que se asemeja a la cabeza de un creeper. También se puede usar como casco por diversión, pero no ofrece ninguna protección. A stalker head is a small decorative block which resembles the head of a stalker. It can also be worn as a helmet for fun, but does not offer any protection.=Una cabeza de stalker es un pequeño bloque decorativo que se asemeja a la cabeza de un stalker. También se puede usar como casco por diversión, pero no ofrece ninguna protección.
Human Head=Cabeza humana Human Head=Cabeza humana
A human head is a small decorative block which resembles the head of a human (i.e. a player character). It can also be worn as a helmet for fun, but does not offer any protection.=Una cabeza humana es un pequeño bloque decorativo que se asemeja a la cabeza de un humano (es decir, un personaje jugador). También se puede usar como casco por diversión, pero no ofrece ninguna protección. A human head is a small decorative block which resembles the head of a human (i.e. a player character). It can also be worn as a helmet for fun, but does not offer any protection.=Una cabeza humana es un pequeño bloque decorativo que se asemeja a la cabeza de un humano (es decir, un personaje jugador). También se puede usar como casco por diversión, pero no ofrece ninguna protección.
Skeleton Skull=Calavera de esqueleto Skeleton Skull=Calavera de esqueleto

@ -1,8 +1,8 @@
# textdomain: mcl_heads # textdomain: mcl_heads
Zombie Head=Tête de Zombie Zombie Head=Tête de Zombie
A zombie head is a small decorative block which resembles the head of a zombie. It can also be worn as a helmet, which reduces the detection range of zombies by 50%.=Une tête de zombie est un petit bloc décoratif qui ressemble à la tête d'un zombie. Il peut également être porté comme un casque, ce qui réduit la plage de détection des zombies de 50%. A zombie head is a small decorative block which resembles the head of a zombie. It can also be worn as a helmet, which reduces the detection range of zombies by 50%.=Une tête de zombie est un petit bloc décoratif qui ressemble à la tête d'un zombie. Il peut également être porté comme un casque, ce qui réduit la plage de détection des zombies de 50%.
Creeper Head=Tête de Creeper Stalker Head=Tête de Stalker
A creeper head is a small decorative block which resembles the head of a creeper. It can also be worn as a helmet, which reduces the detection range of creepers by 50%.=Une tête de creepers est un petit bloc décoratif qui ressemble à la tête d'un creeper. Il peut également être porté comme un casque, ce qui réduit la plage de détection des creepers de 50%. A stalker head is a small decorative block which resembles the head of a stalker. It can also be worn as a helmet, which reduces the detection range of stalkers by 50%.=Une tête de stalkers est un petit bloc décoratif qui ressemble à la tête d'un stalker. Il peut également être porté comme un casque, ce qui réduit la plage de détection des stalkers de 50%.
Human Head=Tête de Joueur Human Head=Tête de Joueur
A human head is a small decorative block which resembles the head of a human (i.e. a player character). It can also be worn as a helmet for fun, but does not offer any protection.=Une tête de joueur est un petit bloc décoratif qui ressemble à la tête d'un humain (c'est-à-dire un personnage de joueur). Il peut également être porté comme un casque pour le plaisir, mais n'offre aucune protection. A human head is a small decorative block which resembles the head of a human (i.e. a player character). It can also be worn as a helmet for fun, but does not offer any protection.=Une tête de joueur est un petit bloc décoratif qui ressemble à la tête d'un humain (c'est-à-dire un personnage de joueur). Il peut également être porté comme un casque pour le plaisir, mais n'offre aucune protection.
Skeleton Skull=Crâne de Squelette Skeleton Skull=Crâne de Squelette

@ -1,8 +1,8 @@
# textdomain: mcl_heads # textdomain: mcl_heads
Zombie Head=Głowa zombie Zombie Head=Głowa zombie
A zombie head is a small decorative block which resembles the head of a zombie. It can also be worn as a helmet, which reduces the detection range of zombies by 50%.=Głowa zombie jest małym blokiem dekoracyjnym i przypomina głowę zombie. Może być noszona jako hełm co zmniejsza obszar wykrycia przez zombie o 50%. A zombie head is a small decorative block which resembles the head of a zombie. It can also be worn as a helmet, which reduces the detection range of zombies by 50%.=Głowa zombie jest małym blokiem dekoracyjnym i przypomina głowę zombie. Może być noszona jako hełm co zmniejsza obszar wykrycia przez zombie o 50%.
Creeper Head=Głowa creepera Stalker Head=Głowa stalkera
A creeper head is a small decorative block which resembles the head of a creeper. It can also be worn as a helmet, which reduces the detection range of creepers by 50%.=Głowa creepera jest małym blokiem dekoracyjnym i przypomina głowę creepera. Może być noszona jako hełm co zmniejsza obszar wykrycia przez creepera o 50%. A stalker head is a small decorative block which resembles the head of a stalker. It can also be worn as a helmet, which reduces the detection range of stalkers by 50%.=Głowa stalkera jest małym blokiem dekoracyjnym i przypomina głowę stalkera. Może być noszona jako hełm co zmniejsza obszar wykrycia przez stalkera o 50%.
Human Head=Głowa człowieka Human Head=Głowa człowieka
A human head is a small decorative block which resembles the head of a human (i.e. a player character). It can also be worn as a helmet for fun, but does not offer any protection.=Głowa człowieka jest małym blokiem dekoracyjnym i przypomina głowę człowieka. Może być noszona jako hełm dla zabawy, ale nie zapewnia żadnej dodatkowej ochrony. A human head is a small decorative block which resembles the head of a human (i.e. a player character). It can also be worn as a helmet for fun, but does not offer any protection.=Głowa człowieka jest małym blokiem dekoracyjnym i przypomina głowę człowieka. Może być noszona jako hełm dla zabawy, ale nie zapewnia żadnej dodatkowej ochrony.
Skeleton Skull=Głowa szkieleta Skeleton Skull=Głowa szkieleta

@ -1,8 +1,8 @@
# textdomain: mcl_heads # textdomain: mcl_heads
Zombie Head=Cabeça de Zumbi Zombie Head=Cabeça de Zumbi
A zombie head is a small decorative block which resembles the head of a zombie. It can also be worn as a helmet, which reduces the detection range of zombies by 50%.=Uma cabeça de zumbi é um pequeno bloco decorativo ao qual remete a cabeça de um zumbi. Também pode ser usado como um capacete, o que reduz o alcançe de detecção dos zumbis em 50%. A zombie head is a small decorative block which resembles the head of a zombie. It can also be worn as a helmet, which reduces the detection range of zombies by 50%.=Uma cabeça de zumbi é um pequeno bloco decorativo ao qual remete a cabeça de um zumbi. Também pode ser usado como um capacete, o que reduz o alcançe de detecção dos zumbis em 50%.
Creeper Head=Cabeça de Creeper Stalker Head=Cabeça de Stalker
A creeper head is a small decorative block which resembles the head of a creeper. It can also be worn as a helmet, which reduces the detection range of creepers by 50%.=Uma cabeça de creeper é um pequeno bloco decorativo ao qual remete a cabeça de um creeper. Também pode ser usado como um capacete, o que reduz o alcançe de detecção dos creepers em 50%. A stalker head is a small decorative block which resembles the head of a stalker. It can also be worn as a helmet, which reduces the detection range of stalkers by 50%.=Uma cabeça de stalker é um pequeno bloco decorativo ao qual remete a cabeça de um stalker. Também pode ser usado como um capacete, o que reduz o alcançe de detecção dos stalkers em 50%.
Human Head=Cabeça Humana Human Head=Cabeça Humana
A human head is a small decorative block which resembles the head of a human (i.e. a player character). It can also be worn as a helmet for fun, but does not offer any protection.=Uma cabeça de humano é um pequeno bloco decorativo ao qual remete a cabeça de um humano (ou seja, o personagem do jogador). Também pode ser usado como um capacete por diversão, mas não oferece nenhuma proteção. A human head is a small decorative block which resembles the head of a human (i.e. a player character). It can also be worn as a helmet for fun, but does not offer any protection.=Uma cabeça de humano é um pequeno bloco decorativo ao qual remete a cabeça de um humano (ou seja, o personagem do jogador). Também pode ser usado como um capacete por diversão, mas não oferece nenhuma proteção.
Skeleton Skull=Cabeça de Esqueleto Skeleton Skull=Cabeça de Esqueleto

@ -1,8 +1,8 @@
# textdomain: mcl_heads # textdomain: mcl_heads
Zombie Head=Голова зомби Zombie Head=Голова зомби
A zombie head is a small decorative block which resembles the head of a zombie. It can also be worn as a helmet, which reduces the detection range of zombies by 50%.=Голова зомби это небольшой декоративный блок, немного похожий на голову зомби. Его можно носить в качестве шлема, что уменьшит радиус обнаружения вас зомби на 50%. A zombie head is a small decorative block which resembles the head of a zombie. It can also be worn as a helmet, which reduces the detection range of zombies by 50%.=Голова зомби это небольшой декоративный блок, немного похожий на голову зомби. Его можно носить в качестве шлема, что уменьшит радиус обнаружения вас зомби на 50%.
Creeper Head=Голова крипера Stalker Head=Голова сталкера
A creeper head is a small decorative block which resembles the head of a creeper. It can also be worn as a helmet, which reduces the detection range of creepers by 50%.=Голова крипера это небольшой декоративный блок, немного похожий на голову крипера. Его можно носить в качестве шлема, что уменьшит радиус обнаружения вас крипером на 50%. A stalker head is a small decorative block which resembles the head of a stalker. It can also be worn as a helmet, which reduces the detection range of stalkers by 50%.=Голова сталкера это небольшой декоративный блок, немного похожий на голову сталкера. Его можно носить в качестве шлема, что уменьшит радиус обнаружения вас сталкером на 50%.
Human Head=Голова игрока Human Head=Голова игрока
A human head is a small decorative block which resembles the head of a human (i.e. a player character). It can also be worn as a helmet for fun, but does not offer any protection.=Голова игрока это небольшой декоративный блок, немного похожий на голову игрового персонажа. Его можно носить в качестве шлема просто для веселья, он не даёт никакой защиты. A human head is a small decorative block which resembles the head of a human (i.e. a player character). It can also be worn as a helmet for fun, but does not offer any protection.=Голова игрока это небольшой декоративный блок, немного похожий на голову игрового персонажа. Его можно носить в качестве шлема просто для веселья, он не даёт никакой защиты.
Skeleton Skull=Череп скелета Skeleton Skull=Череп скелета

@ -1,8 +1,8 @@
# textdomain: mcl_heads # textdomain: mcl_heads
Zombie Head= Zombie Head=
A zombie head is a small decorative block which resembles the head of a zombie. It can also be worn as a helmet, which reduces the detection range of zombies by 50%.= A zombie head is a small decorative block which resembles the head of a zombie. It can also be worn as a helmet, which reduces the detection range of zombies by 50%.=
Creeper Head= Stalker Head=
A creeper head is a small decorative block which resembles the head of a creeper. It can also be worn as a helmet, which reduces the detection range of creepers by 50%.= A stalker head is a small decorative block which resembles the head of a stalker. It can also be worn as a helmet, which reduces the detection range of stalkers by 50%.=
Human Head= Human Head=
A human head is a small decorative block which resembles the head of a human (i.e. a player character). It can also be worn as a helmet for fun, but does not offer any protection.= A human head is a small decorative block which resembles the head of a human (i.e. a player character). It can also be worn as a helmet for fun, but does not offer any protection.=
Skeleton Skull= Skeleton Skull=

@ -39,7 +39,7 @@ end
local doll_size_overrides = { local doll_size_overrides = {
["mobs_mc:guardian"] = { x = 0.6, y = 0.6 }, ["mobs_mc:guardian"] = { x = 0.6, y = 0.6 },
["mobs_mc:guardian_elder"] = { x = 0.72, y = 0.72 }, ["mobs_mc:guardian_elder"] = { x = 0.72, y = 0.72 },
["mobs_mc:enderman"] = { x = 0.8, y = 0.8 }, ["mobs_mc:rover"] = { x = 0.8, y = 0.8 },
["mobs_mc:iron_golem"] = { x = 0.9, y = 0.9 }, ["mobs_mc:iron_golem"] = { x = 0.9, y = 0.9 },
["mobs_mc:ghast"] = { x = 1.05, y = 1.05 }, ["mobs_mc:ghast"] = { x = 1.05, y = 1.05 },
["mobs_mc:wither"] = { x = 1.2, y = 1.2 }, ["mobs_mc:wither"] = { x = 1.2, y = 1.2 },

@ -266,7 +266,7 @@ function mcl_potions.register_arrow(name, desc, color, def)
-- Punch target object but avoid hurting enderman. -- Punch target object but avoid hurting enderman.
if lua then if lua then
if lua.name ~= "mobs_mc:enderman" then if lua.name ~= "mobs_mc:rover" then
obj:punch(self.object, 1.0, { obj:punch(self.object, 1.0, {
full_punch_interval=1.0, full_punch_interval=1.0,
damage_groups={fleshy=self._damage}, damage_groups={fleshy=self._damage},

@ -34,7 +34,7 @@ end, function(minp,maxp,blockseed)
table.shuffle(nn) table.shuffle(nn)
if nn and #nn > 0 then if nn and #nn > 0 then
for i=1,pr:next(1,math.min(5,#nn)) do for i=1,pr:next(1,math.min(5,#nn)) do
minetest.add_entity(vector.offset(nn[i],0,1,0),"mobs_mc:enderman") minetest.add_entity(vector.offset(nn[i],0,1,0),"mobs_mc:rover")
end end
end end
end, 15, true) end, 15, true)

Binary file not shown.

After

Width:  |  Height:  |  Size: 426 B

BIN
textures/vl_mobs_rover.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 127 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 233 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 244 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 478 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

@ -715,9 +715,9 @@ mcl_furnaces:furnace_active 149 139 133
mcl_grindstone:grindstone 216 216 216 mcl_grindstone:grindstone 216 216 216
# mcl_heads # mcl_heads
mcl_heads:creeper22_5 94 115 69 mcl_heads:stalker22_5 94 115 69
mcl_heads:creeper45 94 115 69 mcl_heads:stalker45 94 115 69
mcl_heads:creeper67_5 94 115 69 mcl_heads:stalker67_5 94 115 69
mcl_heads:skeleton22_5 126 126 126 mcl_heads:skeleton22_5 126 126 126
mcl_heads:skeleton45 126 126 126 mcl_heads:skeleton45 126 126 126
mcl_heads:skeleton67_5 126 126 126 mcl_heads:skeleton67_5 126 126 126

@ -2,9 +2,9 @@
1f 1f
Badlandach Badlandach
biomeinfo biomeinfo
creeper stalker
Creeper Stalker
creepera stalkera
czerwienit czerwienit
czerwienitem czerwienitem
czerwienitowych czerwienitowych