Merge pull request 'Alias creeper heads to stalker heads & Refactor mcl_heads (closes #4545)' (#4602) from goodspeed/VoxeLibre:stalker-head into master

Reviewed-on: https://git.minetest.land/VoxeLibre/VoxeLibre/pulls/4602
Reviewed-by: Mikita Wiśniewski <rudzik8@protonmail.com>
This commit is contained in:
the-real-herowl 2024-09-07 16:08:20 +02:00
commit dd4f3d21eb
5 changed files with 96 additions and 194 deletions

View file

@ -21,8 +21,13 @@ mcl_heads.FLOOR_BOX = { -0.25, -0.5, -0.25, 0.25, 0.0, 0.25, }
--- node definition template for floor mod heads --- node definition template for floor mod heads
mcl_heads.deftemplate_floor = { mcl_heads.deftemplate_floor = {
drawtype = "nodebox", drawtype = "mesh",
node_box = { mesh = "mcl_heads_floor.obj",
selection_box = {
type = "fixed",
fixed = mcl_heads.FLOOR_BOX,
},
collision_box = {
type = "fixed", type = "fixed",
fixed = mcl_heads.FLOOR_BOX, fixed = mcl_heads.FLOOR_BOX,
}, },
@ -38,7 +43,7 @@ mcl_heads.deftemplate_floor = {
}, },
use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false, use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false,
paramtype = "light", paramtype = "light",
paramtype2 = "facedir", paramtype2 = "degrotate",
stack_max = 64, stack_max = 64,
sunlight_propagates = true, sunlight_propagates = true,
sounds = mcl_sounds.node_sound_defaults{ sounds = mcl_sounds.node_sound_defaults{
@ -53,39 +58,8 @@ mcl_heads.deftemplate_floor = {
on_secondary_use = equip_armor, on_secondary_use = equip_armor,
} }
mcl_heads.deftemplate_floor_angled = {
drawtype = "mesh",
selection_box = {
type = "fixed",
fixed = mcl_heads.FLOOR_BOX,
},
collision_box = {
type = "fixed",
fixed = mcl_heads.FLOOR_BOX,
},
groups = {
handy = 1,
head = 1,
deco_block = 1,
dig_by_piston = 1,
not_in_creative_inventory = 1,
},
use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false,
paramtype = "light",
paramtype2 = "facedir",
stack_max = 64,
sunlight_propagates = true,
sounds = mcl_sounds.node_sound_defaults{
footstep = {name="default_hard_footstep", gain=0.3},
},
is_ground_content = false,
_doc_items_create_entry = false,
_mcl_blast_resistance = 1,
_mcl_hardness = 1,
}
function mcl_heads.deftemplate_floor.on_rotate(pos, node, user, mode, new_param2) function mcl_heads.deftemplate_floor.on_rotate(pos, node, user, mode, new_param2)
if not (user and user:is_player()) then return end
if mode == screwdriver.ROTATE_AXIS then if mode == screwdriver.ROTATE_AXIS then
node.name = node.name .. "_wall" node.name = node.name .. "_wall"
node.param2 = minetest.dir_to_wallmounted(minetest.facedir_to_dir(node.param2)) node.param2 = minetest.dir_to_wallmounted(minetest.facedir_to_dir(node.param2))
@ -125,19 +99,9 @@ function mcl_heads.deftemplate_floor.on_place(itemstack, placer, pointed_thing)
-- place floor head node (floor and ceiling) -- place floor head node (floor and ceiling)
else else
local fdir = minetest.dir_to_facedir(dir)
-- determine the head node rotation based on player's yaw (in cw direction from North/Z+) -- determine the head node rotation based on player's yaw (in cw direction from North/Z+)
local yaw = placer:get_look_horizontal() local rotate_level = math.round(placer:get_look_horizontal() * 8/math.pi)
yaw = wdir == 1 and math.pi*2 - yaw or yaw itemstack = minetest.item_place(placestack, placer, pointed_thing, rotate_level*15)
local rotation_level = math.min(math.max(math.round((yaw / (math.pi*2)) * 16), 0), 15)
placestack:set_name(itemstring ..mcl_heads.FLOOR_DEGREES[rotation_level % 4])
-- determine the head node face direction based on rotation level
fdir = math.floor(rotation_level / 4) + (wdir == 1 and 0 or 20)
itemstack = minetest.item_place(placestack, placer, pointed_thing, fdir)
end end
-- restore item from angled and wall head nodes -- restore item from angled and wall head nodes
@ -179,6 +143,7 @@ mcl_heads.deftemplate_wall = {
} }
function mcl_heads.deftemplate_wall.on_rotate(pos, node, user, mode, new_param2) function mcl_heads.deftemplate_wall.on_rotate(pos, node, user, mode, new_param2)
if not (user and user:is_player()) then return end
if mode == screwdriver.ROTATE_AXIS then if mode == screwdriver.ROTATE_AXIS then
node.name = string.sub(node.name, 1, string.len(node.name)-5) node.name = string.sub(node.name, 1, string.len(node.name)-5)
node.param2 = minetest.dir_to_facedir(minetest.wallmounted_to_dir(node.param2)) node.param2 = minetest.dir_to_facedir(minetest.wallmounted_to_dir(node.param2))
@ -207,33 +172,13 @@ function mcl_heads.register_head(head_def)
description = head_def.description, description = head_def.description,
_doc_items_longdesc = head_def.longdesc, _doc_items_longdesc = head_def.longdesc,
-- The head textures are based off the textures of an actual mob. tiles = { head_def.texture },
tiles = {
-- Note: bottom texture is overlaid over top texture to get rid of possible transparency.
-- This is required for skeleton skull and wither skeleton skull.
-- Note: -x coords go right per-pixel, -y coords go down per-pixel
"[combine:16x16:-36,4=" ..head_def.texture, -- top
"([combine:16x16:-36,4=" ..head_def.texture..")^([combine:16x16:-44,4="..head_def.texture..")", -- bottom
"[combine:16x16:-28,0=" ..head_def.texture, -- left
"[combine:16x16:-44,0=" ..head_def.texture, -- right
"[combine:16x16:-52,0=" ..head_def.texture, -- back
"[combine:16x16:-36,0=" ..head_def.texture, -- front
},
_mcl_armor_mob_range_mob = head_def.range_mob, _mcl_armor_mob_range_mob = head_def.range_mob,
_mcl_armor_mob_range_factor = head_def.range_factor, _mcl_armor_mob_range_factor = head_def.range_factor,
_mcl_armor_texture = head_def.texture _mcl_armor_texture = head_def.texture
})) }))
-- register the angled floor head nodes
for i, d in ipairs(mcl_heads.FLOOR_DEGREES) do
minetest.register_node(name ..d, table.update(table.copy(mcl_heads.deftemplate_floor_angled), {
mesh = "mcl_heads_floor" ..d ..".obj",
tiles = { head_def.texture },
drop = name,
}))
end
-- register the wall head node -- register the wall head node
minetest.register_node(name .."_wall", table.update(table.copy(mcl_heads.deftemplate_wall), { minetest.register_node(name .."_wall", table.update(table.copy(mcl_heads.deftemplate_wall), {
-- The head textures are based off the textures of an actual mob. -- The head textures are based off the textures of an actual mob.
@ -295,3 +240,45 @@ mcl_heads.register_head{
description = S("Wither Skeleton Skull"), description = S("Wither Skeleton Skull"),
longdesc = S("A wither skeleton skull is a small decorative block which resembles the skull of a wither skeleton. It can also be worn as a helmet for fun, but does not offer any protection."), longdesc = S("A wither skeleton skull is a small decorative block which resembles the skull of a wither skeleton. It can also be worn as a helmet for fun, but does not offer any protection."),
} }
-- Alias old creeper heads
minetest.register_alias("mcl_heads:creeper_wall", "mcl_heads:stalker_wall")
minetest.register_alias("mcl_heads:creeper", "mcl_heads:stalker")
-- Register LBM updates for old floor heads
local old_heads_all = {"mcl_heads:zombie", "mcl_heads:creeper", "mcl_heads:stalker", "mcl_heads:steve", "mcl_heads:skeleton", "mcl_heads:wither_skeleton"}
local old_heads_angled = {}
for i=1,#old_heads_all do
for j=1,#mcl_heads.FLOOR_DEGREES do
old_heads_angled[#old_heads_angled+1] = old_heads_all[i]..mcl_heads.FLOOR_DEGREES[j]
end
end
local facedir_to_degrotate = {0, 180, 120, 60}
minetest.register_lbm({
name = "mcl_heads:heads_update_angled",
nodenames = old_heads_all,
action = function(pos, node)
local degrotate = 0
if node.name:sub(-4) == "22_5" then
node.name = node.name:sub(1, #node.name-4)
degrotate = ((4 - node.param2) * 90 - 22.5) / 1.5
elseif node.name:sub(-4) == "67_5" then
node.name = node.name:sub(1, #node.name-4)
degrotate = ((4 - node.param2) * 90 - 67.5) / 1.5
elseif node.name:sub(-2) == "45" then
node.name = node.name:sub(1, #node.name-2)
degrotate = ((4 - node.param2) * 90 - 45) / 1.5
else
degrotate = facedir_to_degrotate[node.param2+1]
end
if not degrotate then
return
end
node.param2 = degrotate
minetest.set_node(pos, node)
end,
})

View file

@ -0,0 +1,41 @@
# Blender 4.2.1 LTS
# www.blender.org
mtllib mcl_head.mtl
g Cube.002_Cube.002
v -0.250000 -0.500000 0.250000
v -0.250000 0.000000 0.250000
v -0.250000 -0.500000 -0.250000
v -0.250000 -0.000000 -0.250000
v 0.250000 -0.500000 0.250000
v 0.250000 0.000000 0.250000
v 0.250000 -0.500000 -0.250000
v 0.250000 0.000000 -0.250000
vn -1.0000 -0.0000 -0.0000
vn -0.0000 -0.0000 -1.0000
vn 1.0000 -0.0000 -0.0000
vn -0.0000 -0.0000 1.0000
vn -0.0000 -1.0000 -0.0000
vn -0.0000 1.0000 -0.0000
vt 0.875000 0.500000
vt 0.875000 0.750000
vt 0.750000 0.750000
vt 0.750000 0.500000
vt 0.625000 0.750000
vt 0.625000 0.500000
vt 0.500000 0.750000
vt 0.500000 0.500000
vt 1.000000 0.500000
vt 1.000000 0.750000
vt 0.875000 1.000000
vt 0.750000 1.000000
vt 0.625000 1.000000
s 0
g off
g Cube.002_Material.002
usemtl Material.002
f 1/1/1 2/2/1 4/3/1 3/4/1
f 3/4/2 4/3/2 8/5/2 7/6/2
f 7/6/3 8/5/3 6/7/3 5/8/3
f 5/9/4 6/10/4 2/2/4 1/1/4
f 3/2/5 7/11/5 5/12/5 1/3/5
f 8/5/6 4/3/6 2/12/6 6/13/6

View file

@ -1,42 +0,0 @@
# Blender v2.93.9 OBJ File: 'mcl_heads_floor_0.blend'
# www.blender.org
mtllib mcl_heads_floor22_5.mtl
o Cube.001
v -0.326641 -0.500000 0.135299
v -0.326641 0.000000 0.135299
v -0.135299 -0.500000 -0.326641
v -0.135299 0.000000 -0.326641
v 0.135299 -0.500000 0.326641
v 0.135299 0.000000 0.326641
v 0.326641 -0.500000 -0.135299
v 0.326641 0.000000 -0.135299
vt 0.875000 0.500000
vt 0.875000 0.750000
vt 0.750000 0.750000
vt 0.750000 0.500000
vt 0.625000 0.750000
vt 0.625000 0.500000
vt 0.500000 0.750000
vt 0.500000 0.500000
vt 1.000000 0.500000
vt 1.000000 0.750000
vt 0.875000 0.750000
vt 0.875000 1.000000
vt 0.750000 1.000000
vt 0.750000 0.750000
vt 0.750000 1.000000
vt 0.625000 1.000000
vn -0.9239 0.0000 -0.3827
vn 0.3827 0.0000 -0.9239
vn 0.9239 0.0000 0.3827
vn -0.3827 0.0000 0.9239
vn 0.0000 -1.0000 0.0000
vn 0.0000 1.0000 0.0000
usemtl Material.001
s off
f 1/1/1 2/2/1 4/3/1 3/4/1
f 3/4/2 4/3/2 8/5/2 7/6/2
f 7/6/3 8/5/3 6/7/3 5/8/3
f 5/9/4 6/10/4 2/2/4 1/1/4
f 3/11/5 7/12/5 5/13/5 1/14/5
f 8/5/6 4/3/6 2/15/6 6/16/6

View file

@ -1,42 +0,0 @@
# Blender v2.93.9 OBJ File: 'mcl_heads_floor_0.blend'
# www.blender.org
mtllib mcl_heads_floor45.mtl
o Cube.002
v -0.353553 -0.500000 0.000000
v -0.353553 0.000000 0.000000
v 0.000000 -0.500000 -0.353553
v 0.000000 0.000000 -0.353553
v 0.000000 -0.500000 0.353553
v 0.000000 0.000000 0.353553
v 0.353553 -0.500000 0.000000
v 0.353553 0.000000 0.000000
vt 0.875000 0.500000
vt 0.875000 0.750000
vt 0.750000 0.750000
vt 0.750000 0.500000
vt 0.625000 0.750000
vt 0.625000 0.500000
vt 0.500000 0.750000
vt 0.500000 0.500000
vt 1.000000 0.500000
vt 1.000000 0.750000
vt 0.875000 0.750000
vt 0.875000 1.000000
vt 0.750000 1.000000
vt 0.750000 0.750000
vt 0.750000 1.000000
vt 0.625000 1.000000
vn -0.7071 0.0000 -0.7071
vn 0.7071 0.0000 -0.7071
vn 0.7071 0.0000 0.7071
vn -0.7071 0.0000 0.7071
vn 0.0000 -1.0000 0.0000
vn 0.0000 1.0000 0.0000
usemtl Material.002
s off
f 1/1/1 2/2/1 4/3/1 3/4/1
f 3/4/2 4/3/2 8/5/2 7/6/2
f 7/6/3 8/5/3 6/7/3 5/8/3
f 5/9/4 6/10/4 2/2/4 1/1/4
f 3/11/5 7/12/5 5/13/5 1/14/5
f 8/5/6 4/3/6 2/15/6 6/16/6

View file

@ -1,42 +0,0 @@
# Blender v2.93.9 OBJ File: 'mcl_heads_floor_0.blend'
# www.blender.org
mtllib mcl_heads_floor67_5.mtl
o Cube.003
v -0.326641 -0.500000 -0.135299
v -0.326641 0.000000 -0.135299
v 0.135299 -0.500000 -0.326641
v 0.135299 0.000000 -0.326641
v -0.135299 -0.500000 0.326641
v -0.135299 0.000000 0.326641
v 0.326641 -0.500000 0.135299
v 0.326641 0.000000 0.135299
vt 0.875000 0.500000
vt 0.875000 0.750000
vt 0.750000 0.750000
vt 0.750000 0.500000
vt 0.625000 0.750000
vt 0.625000 0.500000
vt 0.500000 0.750000
vt 0.500000 0.500000
vt 1.000000 0.500000
vt 1.000000 0.750000
vt 0.875000 0.750000
vt 0.875000 1.000000
vt 0.750000 1.000000
vt 0.750000 0.750000
vt 0.750000 1.000000
vt 0.625000 1.000000
vn -0.3827 0.0000 -0.9239
vn 0.9239 0.0000 -0.3827
vn 0.3827 0.0000 0.9239
vn -0.9239 0.0000 0.3827
vn 0.0000 -1.0000 0.0000
vn 0.0000 1.0000 0.0000
usemtl Material.003
s off
f 1/1/1 2/2/1 4/3/1 3/4/1
f 3/4/2 4/3/2 8/5/2 7/6/2
f 7/6/3 8/5/3 6/7/3 5/8/3
f 5/9/4 6/10/4 2/2/4 1/1/4
f 3/11/5 7/12/5 5/13/5 1/14/5
f 8/5/6 4/3/6 2/15/6 6/16/6