Merge pull request '[heads] refactor, delete unnecessary textures and implement 16 direction head nodes' (#2550) from heads_16_direction into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2550 Reviewed-by: cora <cora@noreply.git.minetest.land>mobs-redo
|
@ -1,5 +1,6 @@
|
||||||
local S = minetest.get_translator(minetest.get_current_modname())
|
local S = minetest.get_translator(minetest.get_current_modname())
|
||||||
|
|
||||||
|
local minetest = minetest
|
||||||
local mod_doc = minetest.get_modpath("doc")
|
local mod_doc = minetest.get_modpath("doc")
|
||||||
local mod_screwdriver = minetest.get_modpath("screwdriver")
|
local mod_screwdriver = minetest.get_modpath("screwdriver")
|
||||||
|
|
||||||
|
@ -8,68 +9,93 @@ if minetest.get_modpath("mcl_armor") then
|
||||||
equip_armor = mcl_armor.equip_on_use
|
equip_armor = mcl_armor.equip_on_use
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Heads system
|
mcl_heads = {}
|
||||||
|
|
||||||
local function addhead(name, texture, desc, longdesc, rangemob, rangefactor)
|
-- rotations of head nodes within a quadrant (0° ≤ θ ≤ 90°)
|
||||||
local on_rotate_floor, on_rotate_wall
|
mcl_heads.FLOOR_DEGREES = { [0]='', '22_5', '45', '67_5', }
|
||||||
if mod_screwdriver then
|
|
||||||
on_rotate_floor = function(pos, node, user, mode, new_param2)
|
-- box of head nodes
|
||||||
|
mcl_heads.FLOOR_BOX = { -0.25, -0.5, -0.25, 0.25, 0.0, 0.25, }
|
||||||
|
|
||||||
|
-- floor head node nodedef template ------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
--- node definition template for floor mod heads
|
||||||
|
mcl_heads.deftemplate_floor = {
|
||||||
|
drawtype = "nodebox",
|
||||||
|
node_box = {
|
||||||
|
type = "fixed",
|
||||||
|
fixed = mcl_heads.FLOOR_BOX,
|
||||||
|
},
|
||||||
|
groups = {
|
||||||
|
handy = 1,
|
||||||
|
armor = 1,
|
||||||
|
armor_head = 1,
|
||||||
|
non_combat_armor = 1,
|
||||||
|
non_combat_armor_head = 1,
|
||||||
|
head = 1,
|
||||||
|
deco_block = 1,
|
||||||
|
dig_by_piston = 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,
|
||||||
|
|
||||||
|
_mcl_armor_element = "head",
|
||||||
|
_mcl_blast_resistance = 1,
|
||||||
|
_mcl_hardness = 1,
|
||||||
|
|
||||||
|
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)
|
||||||
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))
|
||||||
minetest.set_node(pos, node)
|
minetest.set_node(pos, node)
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
on_rotate_wall = function(pos, node, user, mode, new_param2)
|
|
||||||
if mode == screwdriver.ROTATE_AXIS then
|
|
||||||
node.name = string.sub(node.name, 1, string.len(node.name)-5)
|
|
||||||
node.param2 = minetest.dir_to_facedir(minetest.wallmounted_to_dir(node.param2))
|
|
||||||
minetest.set_node(pos, node)
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
minetest.register_node("mcl_heads:"..name, {
|
function mcl_heads.deftemplate_floor.on_place(itemstack, placer, pointed_thing)
|
||||||
description = desc,
|
|
||||||
_doc_items_longdesc = longdesc,
|
|
||||||
drawtype = "nodebox",
|
|
||||||
is_ground_content = false,
|
|
||||||
node_box = {
|
|
||||||
type = "fixed",
|
|
||||||
fixed = {
|
|
||||||
{ -0.25, -0.5, -0.25, 0.25, 0.0, 0.25, },
|
|
||||||
},
|
|
||||||
},
|
|
||||||
groups = {handy = 1, armor = 1, armor_head = 1, non_combat_armor = 1, non_combat_armor_head = 1, head = 1, deco_block = 1, dig_by_piston = 1},
|
|
||||||
-- The head textures are based off the textures of an actual mob.
|
|
||||||
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.
|
|
||||||
"[combine:16x16:-4,4="..texture, -- top
|
|
||||||
"([combine:16x16:-4,4="..texture..")^([combine:16x16:-12,4="..texture..")", -- bottom
|
|
||||||
"[combine:16x16:-12,0="..texture, -- left
|
|
||||||
"[combine:16x16:4,0="..texture, -- right
|
|
||||||
"[combine:16x16:-20,0="..texture, -- back
|
|
||||||
"[combine:16x16:-4,0="..texture, -- front
|
|
||||||
},
|
|
||||||
use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false,
|
|
||||||
paramtype = "light",
|
|
||||||
stack_max = 64,
|
|
||||||
paramtype2 = "facedir",
|
|
||||||
sunlight_propagates = true,
|
|
||||||
walkable = true,
|
|
||||||
selection_box = {
|
|
||||||
type = "fixed",
|
|
||||||
fixed = { -0.25, -0.5, -0.25, 0.25, 0.0, 0.25, },
|
|
||||||
},
|
|
||||||
sounds = mcl_sounds.node_sound_defaults({
|
|
||||||
footstep = {name="default_hard_footstep", gain=0.3}
|
|
||||||
}),
|
|
||||||
on_place = function(itemstack, placer, pointed_thing)
|
|
||||||
if pointed_thing.type ~= "node" then
|
if pointed_thing.type ~= "node" then
|
||||||
-- no interaction possible with entities, for now.
|
|
||||||
return itemstack
|
return itemstack
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -78,7 +104,7 @@ local function addhead(name, texture, desc, longdesc, rangemob, rangefactor)
|
||||||
local def = minetest.registered_nodes[node.name]
|
local def = minetest.registered_nodes[node.name]
|
||||||
if not def then return itemstack end
|
if not def then return itemstack end
|
||||||
|
|
||||||
-- Call on_rightclick if the pointed node defines it
|
-- Allow pointed node's on_rightclick callback to override place.
|
||||||
if placer and not placer:get_player_control().sneak then
|
if placer and not placer:get_player_control().sneak then
|
||||||
if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then
|
if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then
|
||||||
return minetest.registered_nodes[node.name].on_rightclick(under, node, placer, itemstack) or itemstack
|
return minetest.registered_nodes[node.name].on_rightclick(under, node, placer, itemstack) or itemstack
|
||||||
|
@ -86,81 +112,184 @@ local function addhead(name, texture, desc, longdesc, rangemob, rangefactor)
|
||||||
end
|
end
|
||||||
|
|
||||||
local above = pointed_thing.above
|
local above = pointed_thing.above
|
||||||
local diff = {x = under.x - above.x, y = under.y - above.y, z = under.z - above.z}
|
local dir = {x = under.x - above.x, y = under.y - above.y, z = under.z - above.z}
|
||||||
local wdir = minetest.dir_to_wallmounted(diff)
|
local wdir = minetest.dir_to_wallmounted(dir)
|
||||||
|
|
||||||
local itemstring = itemstack:get_name()
|
local itemstring = itemstack:get_name()
|
||||||
local fakestack = ItemStack(itemstack)
|
local placestack = ItemStack(itemstack)
|
||||||
--local idef = fakestack:get_definition()
|
|
||||||
local retval
|
-- place wall head node (elsewhere)
|
||||||
if wdir == 0 or wdir == 1 then
|
if wdir ~= 0 and wdir ~= 1 then
|
||||||
return minetest.item_place(itemstack, placer, pointed_thing)
|
placestack:set_name(itemstring .."_wall")
|
||||||
|
itemstack = minetest.item_place(placestack, placer, pointed_thing, wdir)
|
||||||
|
-- place floor head node (floor and ceiling)
|
||||||
else
|
else
|
||||||
retval = fakestack:set_name("mcl_heads:"..name.."_wall")
|
local fdir = minetest.dir_to_facedir(dir)
|
||||||
|
|
||||||
|
-- determine the head node rotation based on player's yaw (in cw direction from North/Z+)
|
||||||
|
local yaw = math.pi*2 - placer:get_look_horizontal()
|
||||||
|
|
||||||
|
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)
|
||||||
|
|
||||||
|
itemstack = minetest.item_place(placestack, placer, pointed_thing, fdir)
|
||||||
end
|
end
|
||||||
if not retval then
|
|
||||||
return itemstack
|
-- restore item from angled and wall head nodes
|
||||||
end
|
|
||||||
itemstack = minetest.item_place(fakestack, placer, pointed_thing, wdir)
|
|
||||||
itemstack:set_name(itemstring)
|
itemstack:set_name(itemstring)
|
||||||
return itemstack
|
return itemstack
|
||||||
end,
|
end
|
||||||
on_secondary_use = equip_armor,
|
|
||||||
|
|
||||||
on_rotate = on_rotate_floor,
|
-- wall head node nodedef template -------------------------------------------------------------------------------------
|
||||||
|
|
||||||
_mcl_armor_mob_range_mob = rangemob,
|
--- node definition template for wall mod heads
|
||||||
_mcl_armor_mob_range_factor = rangefactor,
|
mcl_heads.deftemplate_wall = {
|
||||||
_mcl_armor_element = "head",
|
|
||||||
_mcl_armor_texture = "mcl_heads_" .. name .. ".png",
|
|
||||||
_mcl_blast_resistance = 1,
|
|
||||||
_mcl_hardness = 1,
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_node("mcl_heads:"..name.."_wall", {
|
|
||||||
_doc_items_create_entry = false,
|
|
||||||
drawtype = "nodebox",
|
drawtype = "nodebox",
|
||||||
is_ground_content = false,
|
|
||||||
node_box = {
|
node_box = {
|
||||||
type = "wallmounted",
|
type = "wallmounted",
|
||||||
wall_bottom = { -0.25, -0.5, -0.25, 0.25, 0.0, 0.25, },
|
wall_bottom = { -0.25, -0.5, -0.25, 0.25, 0.0, 0.25, },
|
||||||
wall_top = { -0.25, 0.0, -0.25, 0.25, 0.5, 0.25, },
|
wall_top = { -0.25, 0.0, -0.25, 0.25, 0.5, 0.25, },
|
||||||
wall_side = { -0.5, -0.25, -0.25, 0.0, 0.25, 0.25, },
|
wall_side = { -0.5, -0.25, -0.25, 0.0, 0.25, 0.25, },
|
||||||
},
|
},
|
||||||
groups = {handy=1, head=1, deco_block=1, dig_by_piston=1, not_in_creative_inventory=1},
|
groups = {
|
||||||
-- The head textures are based off the textures of an actual mob.
|
handy = 1,
|
||||||
tiles = {
|
head = 1,
|
||||||
{ name = "[combine:16x16:-4,-4="..texture, align_style = "world" }, -- front
|
deco_block = 1,
|
||||||
{ name = "[combine:16x16:-20,-4="..texture, align_style = "world" }, -- back
|
dig_by_piston = 1,
|
||||||
{ name = "[combine:16x16:-8,-4="..texture, align_style = "world" }, -- left
|
not_in_creative_inventory = 1,
|
||||||
{ name = "[combine:16x16:0,-4="..texture, align_style = "world" }, -- right
|
|
||||||
{ name = "([combine:16x16:-4,0="..texture..")^[transformR180", align_style = "node" }, -- top
|
|
||||||
{ name = "([combine:16x16:-4,8="..texture..")^([combine:16x16:-12,8="..texture..")", align_style = "node" }, -- bottom
|
|
||||||
},
|
},
|
||||||
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",
|
||||||
stack_max = 64,
|
|
||||||
paramtype2 = "wallmounted",
|
paramtype2 = "wallmounted",
|
||||||
|
stack_max = 64,
|
||||||
sunlight_propagates = true,
|
sunlight_propagates = true,
|
||||||
walkable = true,
|
sounds = mcl_sounds.node_sound_defaults{
|
||||||
sounds = mcl_sounds.node_sound_defaults({
|
footstep = {name="default_hard_footstep", gain=0.3},
|
||||||
footstep = {name="default_hard_footstep", gain=0.3}
|
},
|
||||||
}),
|
is_ground_content = false,
|
||||||
drop = "mcl_heads:"..name,
|
|
||||||
on_rotate = on_rotate_wall,
|
_doc_items_create_entry = false,
|
||||||
_mcl_blast_resistance = 1,
|
_mcl_blast_resistance = 1,
|
||||||
_mcl_hardness = 1,
|
_mcl_hardness = 1,
|
||||||
})
|
}
|
||||||
|
|
||||||
if mod_doc then
|
function mcl_heads.deftemplate_wall.on_rotate(pos, node, user, mode, new_param2)
|
||||||
doc.add_entry_alias("nodes", "mcl_heads:" .. name, "nodes", "mcl_heads:" .. name .. "_wall")
|
if mode == screwdriver.ROTATE_AXIS then
|
||||||
|
node.name = string.sub(node.name, 1, string.len(node.name)-5)
|
||||||
|
node.param2 = minetest.dir_to_facedir(minetest.wallmounted_to_dir(node.param2))
|
||||||
|
minetest.set_node(pos, node)
|
||||||
|
return true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Add heads
|
-- API functions -------------------------------------------------------------------------------------------------------
|
||||||
addhead("zombie", "mcl_heads_zombie_node.png", S("Zombie Head"), S("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%."), "mobs_mc:zombie", 0.5)
|
|
||||||
addhead("creeper", "mcl_heads_creeper_node.png", S("Creeper Head"), 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%."), "mobs_mc:creeper", 0.5)
|
--- @class HeadDef
|
||||||
|
--- @field name string identifier for node
|
||||||
|
--- @field texture string armor texture for node
|
||||||
|
--- @field description string translated description
|
||||||
|
--- @field longdesc string translated doc description
|
||||||
|
--- @field range_mob string name of mob affected by range reduction
|
||||||
|
--- @field range_factor number factor of range reduction
|
||||||
|
|
||||||
|
--- registers a head
|
||||||
|
--- @param head_def HeadDef head node definition
|
||||||
|
function mcl_heads.register_head(head_def)
|
||||||
|
local name = "mcl_heads:" ..head_def.name
|
||||||
|
|
||||||
|
-- register the floor head node
|
||||||
|
minetest.register_node(name, table.update(table.copy(mcl_heads.deftemplate_floor), {
|
||||||
|
description = head_def.description,
|
||||||
|
_doc_items_longdesc = head_def.longdesc,
|
||||||
|
|
||||||
|
-- The head textures are based off the textures of an actual mob.
|
||||||
|
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_factor = head_def.range_factor,
|
||||||
|
_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
|
||||||
|
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.
|
||||||
|
-- Note: -x coords go right per-pixel, -y coords go down per-pixel
|
||||||
|
tiles = {
|
||||||
|
{ name = "[combine:16x16:-36,-4=" ..head_def.texture, align_style = "world" }, -- front
|
||||||
|
{ name = "[combine:16x16:-52,-4="..head_def.texture, align_style = "world" }, -- back
|
||||||
|
{ name = "[combine:16x16:-40,-4=" ..head_def.texture, align_style = "world" }, -- right
|
||||||
|
{ name = "[combine:16x16:-32,-4=" ..head_def.texture, align_style = "world" }, -- left
|
||||||
|
{ name = "([combine:16x16:-36,0=" ..head_def.texture ..")^[transformR180", align_style = "node" }, -- top
|
||||||
|
-- Note: bottom texture is overlaid over top texture to get rid of possible transparency.
|
||||||
|
-- This is required for skeleton skull and wither skeleton skull.
|
||||||
|
{ name = "([combine:16x16:-36,0=" ..head_def.texture ..")^([combine:16x16:-44,8=" ..head_def.texture..")", align_style = "node" }, -- bottom
|
||||||
|
},
|
||||||
|
drop = name,
|
||||||
|
}))
|
||||||
|
end
|
||||||
|
|
||||||
|
-- initial heads -------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
mcl_heads.register_head{
|
||||||
|
name = "zombie",
|
||||||
|
texture = "mcl_heads_zombie.png",
|
||||||
|
description = S("Zombie Head"),
|
||||||
|
longdesc = S("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%."),
|
||||||
|
range_mob = "mobs_mc:zombie",
|
||||||
|
range_factor = 0.5,
|
||||||
|
}
|
||||||
|
|
||||||
|
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",
|
||||||
|
range_factor = 0.5,
|
||||||
|
}
|
||||||
|
|
||||||
-- Original Minecraft name: “Head”
|
-- Original Minecraft name: “Head”
|
||||||
addhead("steve", "mcl_heads_steve_node.png", S("Human Head"), S("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."))
|
mcl_heads.register_head{
|
||||||
addhead("skeleton", "mcl_heads_skeleton_node.png", S("Skeleton Skull"), S("A skeleton skull is a small decorative block which resembles the skull of a skeleton. It can also be worn as a helmet, which reduces the detection range of skeletons by 50%."), "mobs_mc:skeleton", 0.5)
|
name = "steve",
|
||||||
addhead("wither_skeleton", "mcl_heads_wither_skeleton_node.png", S("Wither Skeleton Skull"), 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."))
|
texture = "mcl_heads_steve.png",
|
||||||
|
description = S("Human Head"),
|
||||||
|
longdesc = S("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."),
|
||||||
|
}
|
||||||
|
|
||||||
|
mcl_heads.register_head{
|
||||||
|
name = "skeleton",
|
||||||
|
texture = "mcl_heads_skeleton.png",
|
||||||
|
description = S("Skeleton Skull"),
|
||||||
|
longdesc = S("A skeleton skull is a small decorative block which resembles the skull of a skeleton. It can also be worn as a helmet, which reduces the detection range of skeletons by 50%."),
|
||||||
|
range_mob = "mobs_mc:skeleton",
|
||||||
|
range_factor = 0.5,
|
||||||
|
}
|
||||||
|
|
||||||
|
mcl_heads.register_head{
|
||||||
|
name = "wither_skeleton",
|
||||||
|
texture = "mcl_heads_wither_skeleton.png",
|
||||||
|
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."),
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,42 @@
|
||||||
|
# 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
|
|
@ -0,0 +1,42 @@
|
||||||
|
# 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
|
|
@ -0,0 +1,42 @@
|
||||||
|
# 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
|
Before Width: | Height: | Size: 676 B |
Before Width: | Height: | Size: 432 B |
Before Width: | Height: | Size: 970 B After Width: | Height: | Size: 382 B |
Before Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 432 B |
Before Width: | Height: | Size: 1.1 KiB |