Support 16 sign rotations

This commit is contained in:
Wuzzy 2017-07-26 03:45:22 +02:00
parent 8ddb427777
commit d667177d6b
2 changed files with 83 additions and 16 deletions

@ -27,6 +27,13 @@ local NUMBER_OF_LINES = 4
local LINE_HEIGHT = 14
local CHAR_WIDTH = 5
-- Helper functions
local function round(num, idp)
local mult = 10^(idp or 0)
return math.floor(num * mult + 0.5) / mult
end
local string_to_array = function(str)
local tab = {}
for i=1,string.len(str) do
@ -122,13 +129,13 @@ local signs = {
{delta = {x = -n, y = 0, z = 0}, yaw = math.pi / 2},
}
local m = 1/32 + 1/128
local m = 1/16 + 1/128
local signs_yard = {
{delta = {x = 0, y = 0, z = -m}, yaw = 0},
{delta = {x = -m, y = 0, z = 0}, yaw = math.pi / -2},
{delta = {x = 0, y = 0, z = m}, yaw = math.pi},
{delta = {x = m, y = 0, z = 0}, yaw = math.pi / 2},
{delta = {x = 0, y = 5/32, z = -m}, yaw = 0},
{delta = {x = -m, y = 5/32, z = 0}, yaw = math.pi / -2},
{delta = {x = 0, y = 5/32, z = m}, yaw = math.pi},
{delta = {x = m, y = 5/32, z = 0}, yaw = math.pi / 2},
}
local sign_groups = {handy=1,axey=1, flammable=1, deco_block=1, material_wood=1, attached_node=1}
@ -165,9 +172,10 @@ local update_sign = function(pos, fields, sender)
-- if there is no entity
local sign_info
if minetest.get_node(pos).name == "mcl_signs:standing_sign" then
local nn = minetest.get_node(pos).name
if nn == "mcl_signs:standing_sign" or nn == "mcl_signs:standing_sign22_5" or nn == "mcl_signs:standing_sign45" or nn == "mcl_signs:standing_sign67_5" then
sign_info = signs_yard[minetest.get_node(pos).param2 + 1]
elseif minetest.get_node(pos).name == "mcl_signs:wall_sign" then
elseif nn == "mcl_signs:wall_sign" then
sign_info = signs[minetest.get_node(pos).param2 + 1]
end
if sign_info == nil then
@ -176,6 +184,14 @@ local update_sign = function(pos, fields, sender)
local text_entity = minetest.add_entity({x = pos.x + sign_info.delta.x,
y = pos.y + sign_info.delta.y,
z = pos.z + sign_info.delta.z}, "mcl_signs:text")
if nn == "mcl_signs:standing_sign22_5" then
sign_info.yaw = sign_info.yaw + math.pi / 8
elseif nn == "mcl_signs:standing_sign45" then
sign_info.yaw = sign_info.yaw + 2 * (math.pi / 8)
elseif nn == "mcl_signs:standing_sign67_5" then
sign_info.yaw = sign_info.yaw + 3 * (math.pi / 8)
end
text_entity:setyaw(sign_info.yaw)
end
@ -254,19 +270,49 @@ minetest.register_node("mcl_signs:wall_sign", {
local sign_info
local place_pos
-- Ceiling
if wdir == 0 then
--how would you add sign to ceiling?
return itemstack
-- Floor
elseif wdir == 1 then
-- Standing sign
place_pos = above
-- Determine the sign rotation based on player's yaw
local stand = ItemStack(itemstack)
local yaw = math.pi*2 - placer:get_look_horizontal()
-- Select one of 16 possible rotations (0-15)
local rotation_level = round((yaw / (math.pi*2)) * 16)
if rotation_level > 15 then
rotation_level = 0
elseif rotation_level < 0 then
rotation_level = 15
end
-- The actual rotation is a combination of predefined mesh and facedir (see node definition)
if rotation_level % 4 == 0 then
stand:set_name("mcl_signs:standing_sign")
elseif rotation_level % 4 == 1 then
stand:set_name("mcl_signs:standing_sign22_5")
elseif rotation_level % 4 == 2 then
stand:set_name("mcl_signs:standing_sign45")
elseif rotation_level % 4 == 3 then
stand:set_name("mcl_signs:standing_sign67_5")
end
fdir = math.floor(rotation_level / 4)
-- Place the node!
local _, success = minetest.item_place_node(stand, placer, pointed_thing, fdir)
if not success then
return itemstack
end
sign_info = signs_yard[fdir + 1]
-- Side
else
-- Wall sign
place_pos = above
local _, success = minetest.item_place_node(itemstack, placer, pointed_thing, wdir)
if not success then
@ -300,19 +346,23 @@ minetest.register_node("mcl_signs:wall_sign", {
_mcl_blast_resistance = 5,
})
minetest.register_node("mcl_signs:standing_sign", {
-- Standing sign nodes.
-- 4 rotations at 0°, 22.5°, 45° and 67.5°.
-- These are 4 out of 16 possible rotations.
-- With facedir the remaining 12 rotations are constructed.
-- 0°
local ssign = {
paramtype = "light",
sunlight_propagates = true,
walkable = false,
is_ground_content = false,
paramtype2 = "facedir",
drawtype = "nodebox",
node_box = {type = "fixed", fixed = {
{-7/16, -1/16, -1/32, 7/16, 7/16, 1/32},
{-1/16, -0.5, -1/32, 1/16, -1/16, 1/32},
}},
drawtype = "mesh",
mesh = "mcl_signs_sign.obj",
selection_box = {type = "fixed", fixed = {-7/16, -0.5, -1/32, 7/16, 7/16, 1/32}},
tiles = {"signs_top.png", "signs_bottom.png", "signs_side.png", "signs_side.png", "signs_back.png", "signs_front.png"},
tiles = {"mcl_signs_sign.png"},
groups = sign_groups,
drop = "mcl_signs:wall_sign",
stack_max = 16,
@ -327,7 +377,24 @@ minetest.register_node("mcl_signs:standing_sign", {
end,
_mcl_hardness = 1,
_mcl_blast_resistance = 5,
})
}
-- 22.5°
minetest.register_node("mcl_signs:standing_sign", ssign)
local ssign22_5 = table.copy(ssign)
ssign22_5.mesh = "mcl_signs_sign22.5.obj"
-- 45°
minetest.register_node("mcl_signs:standing_sign22_5", ssign22_5)
local ssign45 = table.copy(ssign)
ssign45.mesh = "mcl_signs_sign45.obj"
minetest.register_node("mcl_signs:standing_sign45", ssign45)
-- 67.5°
local ssign67 = table.copy(ssign)
ssign67.mesh = "mcl_signs_sign67.5.obj"
minetest.register_node("mcl_signs:standing_sign67_5", ssign67)
minetest.register_entity("mcl_signs:text", {
collisionbox = { 0, 0, 0, 0, 0, 0 },

Binary file not shown.

After

Width:  |  Height:  |  Size: 571 B