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
self.timer = self.timer + dtime
self.blinktimer = (self.blinktimer or 0) + dtime
self:set_animation("fuse")
if self.blinktimer > 0.2 then
self.blinktimer = 0

@ -314,6 +314,7 @@ function mcl_mobs.register_mob(name, def)
return self:mob_activate(staticdata, def, dtime)
end,
after_activate = def.after_activate,
attack_state = def.attack_state, -- custom attack state
on_attack = def.on_attack, -- called after attack, useful with otherwise predefined attack states (not custom)
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
* Skeleton
* Stray
* Creeper
* Stalker
* Slime
* Spider
* Cave Spider
* Enderman
* Rover
* Zombie Villager
* Zombie Piglin
* Wither Skeleton

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

@ -6,7 +6,7 @@ Blaze=Blaze
Chicken=Kylling
Cow=Ko
Mooshroom=Svamp
Creeper=Creeper
Stalker=Stalker
Ender Dragon=Enderdrage
Enderman=Enderman
Endermite=Endermide
@ -67,4 +67,4 @@ Cod=Torsk
Salmon=Laks
Dolphin=Delfin
Pillager=Plyndrer
Tropical fish=Tropisk fisk
Tropical fish=Tropisk fisk

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

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

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

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

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

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

Binary file not shown.

Binary file not shown.

@ -31,20 +31,9 @@ local place_frequency_min = 235
local place_frequency_max = 245
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)
if self and self.object then
if not self.object:get_attach() then
self.object:remove()
end
end
self.object:remove()
end,
glow = 50,
})
local S = minetest.get_translator("mobs_mc")
@ -66,142 +55,8 @@ end
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.
local select_enderman_animation = function(animation_type)
local select_rover_animation = function(animation_type)
-- Enderman holds a block
if animation_type == "block" then
return {
@ -254,8 +109,8 @@ local psdefs = {{
texture = "mcl_portals_particle"..math.random(1, 5)..".png",
}}
mcl_mobs.register_mob("mobs_mc:enderman", {
description = S("Enderman"),
mcl_mobs.register_mob("mobs_mc:rover", {
description = S("Rover"),
type = "monster",
spawn_class = "passive",
can_despawn = true,
@ -267,23 +122,11 @@ mcl_mobs.register_mob("mobs_mc:enderman", {
xp_max = 5,
collisionbox = {-0.3, -0.01, -0.3, 0.3, 2.89, 0.3},
visual = "mesh",
mesh = "mobs_mc_enderman.b3d",
textures = create_enderman_textures(),
visual_size = {x=3, y=3},
mesh = "vl_rover.b3d",
textures = { "vl_mobs_rover.png^vl_mobs_rover_face.png" },
glow = 100,
visual_size = {x=10, y=10},
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 = {
-- TODO: Custom war cry sound
war_cry = "mobs_sandmonster",
@ -292,8 +135,8 @@ mcl_mobs.register_mob("mobs_mc:enderman", {
random = {name="mobs_mc_enderman_random", gain=0.5},
distance = 16,
},
walk_velocity = 0.2,
run_velocity = 3.4,
walk_velocity = 2,
run_velocity = 4,
damage = 7,
reach = 2,
particlespawners = psdefs,
@ -304,7 +147,7 @@ mcl_mobs.register_mob("mobs_mc:enderman", {
max = 1,
looting = "common"},
},
animation = select_enderman_animation("normal"),
animation = select_rover_animation("normal"),
_taken_node = "",
can_spawn = function(pos)
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.
if self.state == "attack" then
self.object:set_properties({textures={"vl_mobs_rover.png^vl_mobs_rover_face_angry.png"}})
if self.attack then
local target = self.attack
local pos = target:get_pos()
@ -358,6 +202,7 @@ mcl_mobs.register_mob("mobs_mc:enderman", {
end
end
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
local light = minetest.get_node_light(enderpos)
if light and light > minetest.LIGHT_MAX then
@ -489,38 +334,17 @@ mcl_mobs.register_mob("mobs_mc:enderman", {
minetest.remove_node(take_pos)
local dug = minetest.get_node_or_nil(take_pos)
if dug and dug.name == "air" then
self._taken_node = node.name
self.persistent = true
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"
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
node_obj:set_properties({visual_size={x=0.02, y=0.02}})
end
self.base_texture = create_enderman_textures(block_type, self._taken_node)
self.object:set_properties({ textures = self.base_texture })
self.animation = select_enderman_animation("block")
local def = minetest.registered_nodes[self._taken_node]
self.animation = select_rover_animation("block")
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)
end
end
@ -542,12 +366,14 @@ mcl_mobs.register_mob("mobs_mc:enderman", {
local def = minetest.registered_nodes[self._taken_node]
-- Update animation accordingly (removes visible block)
self.persistent = false
self.animation = select_enderman_animation("normal")
self.animation = select_rover_animation("normal")
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)
end
self._taken_node = ""
self._node_obj:remove()
self._node_obj = nil
self._taken_node = nil
end
end
end
@ -645,6 +471,21 @@ mcl_mobs.register_mob("mobs_mc:enderman", {
--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 },
water_damage = 8,
view_range = 64,
@ -652,9 +493,22 @@ mcl_mobs.register_mob("mobs_mc:enderman", {
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
mcl_mobs:spawn_specific(
"mobs_mc:enderman",
"mobs_mc:rover",
"end",
"ground",
{
@ -674,7 +528,7 @@ mcl_vars.mg_end_min,
mcl_vars.mg_end_max)
-- Overworld spawn
mcl_mobs:spawn_specific(
"mobs_mc:enderman",
"mobs_mc:rover",
"overworld",
"ground",
{
@ -823,7 +677,7 @@ mcl_vars.mg_overworld_max)
-- Nether spawn (rare)
mcl_mobs:spawn_specific(
"mobs_mc:enderman",
"mobs_mc:rover",
"nether",
"ground",
{
@ -840,7 +694,7 @@ mcl_vars.mg_nether_max)
-- Warped Forest spawn (common)
mcl_mobs:spawn_specific(
"mobs_mc:enderman",
"mobs_mc:rover",
"nether",
"ground",
{
@ -855,4 +709,5 @@ mcl_vars.mg_nether_min,
mcl_vars.mg_nether_max)
-- 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",},
-- Head
-- TODO: Only drop if killed by charged creeper
-- TODO: Only drop if killed by charged stalker
{name = "mcl_heads:skeleton",
chance = 200, -- 0.5% chance
min = 1,

@ -3,14 +3,59 @@
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",
spawn_class = "hostile",
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},
pathfinding = 1,
visual = "mesh",
mesh = "mobs_mc_creeper.b3d",
head_swivel = "Head_Control",
mesh = "vl_stalker.b3d",
-- head_swivel = "Head_Control",
bone_eye_height = 2.35,
head_eye_height = 1.8;
curiosity = 2,
textures = {
{"mobs_mc_creeper.png",
{get_texture({}),
"mobs_mc_empty.png"},
},
visual_size = {x=3, y=3},
visual_size = {x=2, y=2},
sounds = {
attack = "tnt_ignite",
death = "mobs_mc_creeper_death",
@ -56,8 +101,8 @@ mcl_mobs.register_mob("mobs_mc:creeper", {
allow_fuse_reset = true,
stop_to_explode = true,
-- Force-ignite creeper with flint and steel and explode after 1.5 seconds.
-- TODO: Make creeper flash after doing this as well.
-- Force-ignite stalker with flint and steel and explode after 1.5 seconds.
-- TODO: Make stalker flash after doing this as well.
-- TODO: Test and debug this code.
on_rightclick = function(self, clicker)
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)
end
end
self.object:set_properties({textures={get_texture(self)}})
end,
on_die = function(self, pos, cmi_cause)
-- Drop a random music disc when killed by skeleton or stray
@ -108,35 +154,31 @@ mcl_mobs.register_mob("mobs_mc:creeper", {
looting = "common",},
-- Head
-- TODO: Only drop if killed by charged creeper
{name = "mcl_heads:creeper",
-- TODO: Only drop if killed by charged stalker
{name = "mcl_heads:stalker",
chance = 200, -- 0.5%
min = 1,
max = 1,},
},
animation = {
speed_normal = 24,
speed_run = 48,
speed_normal = 30,
speed_run = 60,
stand_start = 0,
stand_end = 23,
walk_start = 24,
walk_end = 49,
run_start = 24,
run_end = 49,
hurt_start = 110,
hurt_end = 139,
death_start = 140,
death_end = 189,
look_start = 50,
look_end = 108,
fuse_start = 49,
fuse_end = 80,
},
floats = 1,
fear_height = 4,
view_range = 16,
})
mcl_mobs.register_mob("mobs_mc:creeper_charged", {
description = S("Charged Creeper"),
mcl_mobs.register_mob("mobs_mc:stalker_overloaded", {
description = S("Overloaded Stalker"),
type = "monster",
spawn_class = "hostile",
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},
pathfinding = 1,
visual = "mesh",
mesh = "mobs_mc_creeper.b3d",
mesh = "vl_stalker.b3d",
--BOOM
textures = {
{"mobs_mc_creeper.png",
"mobs_mc_creeper_charge.png"},
{get_texture({}),
AURA},
},
visual_size = {x=3, y=3},
use_texture_alpha = true,
visual_size = {x=2, y=2},
sounds = {
attack = "tnt_ignite",
death = "mobs_mc_creeper_death",
@ -178,8 +221,8 @@ mcl_mobs.register_mob("mobs_mc:creeper_charged", {
allow_fuse_reset = true,
stop_to_explode = true,
-- Force-ignite creeper with flint and steel and explode after 1.5 seconds.
-- TODO: Make creeper flash after doing this as well.
-- Force-ignite stalker with flint and steel and explode after 1.5 seconds.
-- TODO: Make stalker flash after doing this as well.
-- TODO: Test and debug this code.
on_rightclick = function(self, clicker)
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)
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,
on_die = function(self, pos, cmi_cause)
-- 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,
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
end,
maxdrops = 2,
@ -234,27 +280,23 @@ mcl_mobs.register_mob("mobs_mc:creeper_charged", {
looting = "common",},
-- Head
-- TODO: Only drop if killed by charged creeper
{name = "mcl_heads:creeper",
-- TODO: Only drop if killed by overloaded stalker
{name = "mcl_heads:stalker",
chance = 200, -- 0.5%
min = 1,
max = 1,},
},
animation = {
speed_normal = 24,
speed_run = 48,
speed_normal = 30,
speed_run = 60,
stand_start = 0,
stand_end = 23,
walk_start = 24,
walk_end = 49,
run_start = 24,
run_end = 49,
hurt_start = 110,
hurt_end = 139,
death_start = 140,
death_end = 189,
look_start = 50,
look_end = 108,
fuse_start = 49,
fuse_end = 80,
},
floats = 1,
fear_height = 4,
@ -264,8 +306,38 @@ mcl_mobs.register_mob("mobs_mc:creeper_charged", {
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(
"mobs_mc:creeper",
"mobs_mc:stalker",
"overworld",
"ground",
{
@ -413,4 +485,6 @@ mcl_vars.mg_overworld_min,
mcl_vars.mg_overworld_max)
-- 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)
table.insert(drops_zombie, {
-- Zombie Head
-- TODO: Only drop if killed by charged creeper
-- TODO: Only drop if killed by charged stalker
name = "mcl_heads:zombie",
chance = 200, -- 0.5%
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 = {
enchanting = { "table" },
experience = { "bottle" },
heads = { "skeleton", "zombie", "creeper", "wither_skeleton" },
heads = { "skeleton", "zombie", "stalker", "wither_skeleton" },
mobitems = { "rabbit", "chicken" },
walls = {
"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
Zombie view range: -50%=Zombiesichtweite: -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): @2=Schaden (@1): @2
Healing: @1=Heilung: @1

@ -14,7 +14,7 @@ Grows on grass blocks, podzol, dirt or coarse dirt=Crece sobre bloques de pasto,
Flammable=Inflamable
Zombie view range: -50%=Rango de visión zombie: -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): @2=Daño (@1): @2
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
Zombie view range: -50%=Distance de vue de Zombie : -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): @2=Dégâts (@1) : @2
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
Zombie view range: -50%=Zasięg widzenia zombie: -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): @2=Obrażenia (@1): @2
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
Zombie view range: -50%=Alcançe de visão do zumbi: -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): @2=Dano (@1): @2
Healing: @1=Cura: @1

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

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

@ -108,8 +108,8 @@ tt.register_snippet(function(itemstring)
return S("Zombie view range: -50%")
elseif itemstring == "mcl_heads:skeleton" then
return S("Skeleton view range: -50%")
elseif itemstring == "mcl_heads:creeper" then
return S("Creeper view range: -50%")
elseif itemstring == "mcl_heads:stalker" then
return S("Stalker view range: -50%")
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:waterlily")
-- 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:steve")
mesecon.register_mvps_unsticky("mcl_heads:wither_skeleton")

@ -76,4 +76,4 @@ You can copy the pattern of a banner by placing two banners of the same color in
And one additional layer=И один дополнительный слой
And @1 additional layers=И @1 дополнительных слоёв
Paintable decoration=Раскрашиваемая декорация
Preview Banner=Предпросмотр баннера
Preview Banner=Предпросмотр баннера

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

@ -249,7 +249,7 @@ function ARROW_ENTITY.on_step(self, dtime)
end
-- 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
damage_particles(vector.add(pos, vector.multiply(self.object:get_velocity(), 0.1)), self._is_critical)
end

@ -470,7 +470,7 @@ function ARROW_ENTITY.on_step(self, dtime)
end
-- 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
damage_particles(self.object:get_pos(), self._is_critical)
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.non_combat_armor_head=1
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_texture = "mcl_farming_pumpkin_face.png"

@ -264,11 +264,11 @@ mcl_heads.register_head{
}
mcl_heads.register_head{
name = "creeper",
texture = "mcl_heads_creeper.png",
description = S("Creeper 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%."),
range_mob = "mobs_mc:creeper",
name = "stalker",
texture = "mcl_heads_stalker.png",
description = S("Stalker Head"),
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:stalker",
range_factor = 0.5,
}

@ -1,8 +1,8 @@
# textdomain: mcl_heads
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.
Creeper Head=Creeper-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.
Stalker Head=Stalker-Kopf
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
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

@ -1,8 +1,8 @@
# textdomain: mcl_heads
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.
Creeper Head=Cabeza de creeper
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.
Stalker Head=Cabeza de stalker
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
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

@ -1,8 +1,8 @@
# textdomain: mcl_heads
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%.
Creeper Head=Tête de Creeper
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%.
Stalker Head=Tête de Stalker
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
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

@ -1,8 +1,8 @@
# textdomain: mcl_heads
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%.
Creeper Head=Głowa creepera
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%.
Stalker Head=Głowa stalkera
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
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

@ -1,8 +1,8 @@
# textdomain: mcl_heads
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%.
Creeper Head=Cabeça de Creeper
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%.
Stalker Head=Cabeça de Stalker
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
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

@ -1,8 +1,8 @@
# textdomain: mcl_heads
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%.
Creeper 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%.
Stalker Head=Голова сталкера
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=Голова игрока
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=Череп скелета

@ -1,8 +1,8 @@
# textdomain: mcl_heads
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%.=
Creeper 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%.=
Stalker Head=
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=
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=

@ -39,7 +39,7 @@ end
local doll_size_overrides = {
["mobs_mc:guardian"] = { x = 0.6, y = 0.6 },
["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:ghast"] = { x = 1.05, y = 1.05 },
["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.
if lua then
if lua.name ~= "mobs_mc:enderman" then
if lua.name ~= "mobs_mc:rover" then
obj:punch(self.object, 1.0, {
full_punch_interval=1.0,
damage_groups={fleshy=self._damage},

@ -34,7 +34,7 @@ end, function(minp,maxp,blockseed)
table.shuffle(nn)
if nn and #nn > 0 then
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, 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_heads
mcl_heads:creeper22_5 94 115 69
mcl_heads:creeper45 94 115 69
mcl_heads:creeper67_5 94 115 69
mcl_heads:stalker22_5 94 115 69
mcl_heads:stalker45 94 115 69
mcl_heads:stalker67_5 94 115 69
mcl_heads:skeleton22_5 126 126 126
mcl_heads:skeleton45 126 126 126
mcl_heads:skeleton67_5 126 126 126

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