From 8d10a1a7c792ed5d85f403197821c6d80e108add Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 26 Jul 2017 15:11:52 +0200 Subject: [PATCH] Implement wall sign mesh --- mods/ITEMS/mcl_signs/init.lua | 53 ++++++++++++------ .../models/mcl_signs_signonwallmount.obj | 40 +++++++++++++ .../textures/mcl_signs_sign_wall.png | Bin 256 -> 0 bytes 3 files changed, 75 insertions(+), 18 deletions(-) create mode 100644 mods/ITEMS/mcl_signs/models/mcl_signs_signonwallmount.obj delete mode 100644 mods/ITEMS/mcl_signs/textures/mcl_signs_sign_wall.png diff --git a/mods/ITEMS/mcl_signs/init.lua b/mods/ITEMS/mcl_signs/init.lua index a18a60682..af707b0e8 100644 --- a/mods/ITEMS/mcl_signs/init.lua +++ b/mods/ITEMS/mcl_signs/init.lua @@ -110,9 +110,14 @@ local generate_line = function(s, ypos) return texture end -local generate_texture = function(lines) +local generate_texture = function(lines, signnodename) local texture = "[combine:"..SIGN_WIDTH.."x"..SIGN_WIDTH - local ypos = 9 + local ypos + if signnodename == "mcl_signs:wall_sign" then + ypos = 27 + else + ypos = 9 + end for i = 1, #lines do texture = texture..generate_line(lines[i], ypos) ypos = ypos + LINE_HEIGHT @@ -120,7 +125,7 @@ local generate_texture = function(lines) return texture end -local n = 7/16 - 1/128 +local n = 23/56 - 1/128 local signtext_info_wall = { {delta = {x = 0, y = 0, z = n}, yaw = 0}, @@ -178,7 +183,7 @@ local update_sign = function(pos, fields, sender) local objects = minetest.get_objects_inside_radius(pos, 0.5) for _, v in ipairs(objects) do if v:get_entity_name() == "mcl_signs:text" then - v:set_properties({textures={generate_texture(create_lines(text))}}) + v:set_properties({textures={generate_texture(create_lines(text), v:get_luaentity()._signnodename)}}) return end end @@ -206,6 +211,7 @@ local update_sign = function(pos, fields, sender) elseif nn == "mcl_signs:standing_sign67_5" then sign_info.yaw = sign_info.yaw + 3 * (math.pi / 8) end + text_entity:get_luaentity()._signnodename = nn text_entity:setyaw(sign_info.yaw) end @@ -241,9 +247,10 @@ minetest.register_node("mcl_signs:wall_sign", { paramtype = "light", sunlight_propagates = true, paramtype2 = "wallmounted", - drawtype = "nodebox", - node_box = {type = "wallmounted", wall_side = {-0.499, -1/16, -7/16, -7/16, 7/16, 7/16}}, - tiles = {"mcl_signs_sign_wall.png"}, + drawtype = "mesh", + mesh = "mcl_signs_signonwallmount.obj", + selection_box = {type = "wallmounted", wall_side = {-0.5, -7/28, -0.5, -23/56, 7/28, 0.5}}, + tiles = {"mcl_signs_sign.png"}, groups = sign_groups, stack_max = 16, sounds = mcl_sounds.node_sound_wood_defaults(), @@ -276,6 +283,7 @@ minetest.register_node("mcl_signs:wall_sign", { local sign_info local place_pos + local nodeitem = ItemStack(itemstack) -- Ceiling if wdir == 0 then --how would you add sign to ceiling? @@ -286,7 +294,6 @@ minetest.register_node("mcl_signs:wall_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) @@ -300,18 +307,18 @@ minetest.register_node("mcl_signs:wall_sign", { -- 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") + nodeitem:set_name("mcl_signs:standing_sign") elseif rotation_level % 4 == 1 then - stand:set_name("mcl_signs:standing_sign22_5") + nodeitem:set_name("mcl_signs:standing_sign22_5") elseif rotation_level % 4 == 2 then - stand:set_name("mcl_signs:standing_sign45") + nodeitem:set_name("mcl_signs:standing_sign45") elseif rotation_level % 4 == 3 then - stand:set_name("mcl_signs:standing_sign67_5") + nodeitem: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) + local _, success = minetest.item_place_node(nodeitem, placer, pointed_thing, fdir) if not success then return itemstack end @@ -327,11 +334,12 @@ minetest.register_node("mcl_signs:wall_sign", { sign_info = signtext_info_wall[fdir + 1] end - local text = minetest.add_entity({ + local text_entity = minetest.add_entity({ x = place_pos.x + sign_info.delta.x, y = place_pos.y + sign_info.delta.y, z = place_pos.z + sign_info.delta.z}, "mcl_signs:text") - text:setyaw(sign_info.yaw) + text_entity:setyaw(sign_info.yaw) + text_entity:get_luaentity()._signnodename = nodeitem:get_name() if not minetest.setting_getbool("creative_mode") then itemstack:take_item() @@ -409,14 +417,23 @@ minetest.register_entity("mcl_signs:text", { physical = false, collide_with_objects = false, - on_activate = function(self) + _signnodename = nil, -- node name of sign node to which the text belongs + + on_activate = function(self, staticdata) + if staticdata then + self._signnodename = staticdata._signnodename + end local meta = minetest.get_meta(self.object:getpos()) local text = meta:get_string("text") self.object:set_properties({ - textures={generate_texture(create_lines(text))}, + textures={generate_texture(create_lines(text), self._signnodename)}, }) self.object:set_armor_groups({ immortal = 1 }) - end + end, + get_staticdata = function(self) + local out = { self._signnodename } + return minetest.serialize(out) + end, }) minetest.register_craft({ diff --git a/mods/ITEMS/mcl_signs/models/mcl_signs_signonwallmount.obj b/mods/ITEMS/mcl_signs/models/mcl_signs_signonwallmount.obj new file mode 100644 index 000000000..098cdb965 --- /dev/null +++ b/mods/ITEMS/mcl_signs/models/mcl_signs_signonwallmount.obj @@ -0,0 +1,40 @@ +# Blender v2.76 (sub 0) OBJ File: 'signonwallmount.blend' +# www.blender.org +mtllib signonwallmount.mtl +o wood_Cube.001 +v 0.499985 -0.416668 -0.249992 +v 0.499985 -0.416668 0.249993 +v 0.499985 -0.499999 -0.249992 +v 0.499985 -0.499999 0.249993 +v -0.499985 -0.416668 -0.249993 +v -0.499985 -0.416668 0.249992 +v -0.499985 -0.499999 -0.249993 +v -0.499985 -0.499999 0.249992 +vt 0.031250 0.562500 +vt 0.031250 0.937500 +vt 0.000000 0.937500 +vt 0.000000 0.562500 +vt 0.812500 0.562500 +vt 0.812500 0.937500 +vt 0.437500 0.937500 +vt 0.437500 0.562500 +vt 0.406250 0.937500 +vt 0.406250 0.562500 +vt 0.406250 1.000000 +vt 0.781250 1.000000 +vt 0.781250 0.937500 +vt 0.031250 1.000000 +vn 1.000000 0.000000 0.000000 +vn 0.000000 -1.000000 -0.000000 +vn -1.000000 0.000000 -0.000000 +vn -0.000000 1.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.000000 -0.000000 1.000000 +usemtl None +s off +f 1/1/1 2/2/1 4/3/1 3/4/1 +f 3/5/2 4/6/2 8/7/2 7/8/2 +f 7/8/3 8/7/3 6/9/3 5/10/3 +f 5/10/4 6/9/4 2/2/4 1/1/4 +f 3/11/5 7/12/5 5/13/5 1/9/5 +f 8/11/6 4/14/6 2/2/6 6/9/6 diff --git a/mods/ITEMS/mcl_signs/textures/mcl_signs_sign_wall.png b/mods/ITEMS/mcl_signs/textures/mcl_signs_sign_wall.png deleted file mode 100644 index dced78e40c4c5270ac27ac927b21fe3b43f48ba7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 256 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFv3GfMVburhr(O2`f)(dwrnOz&V zsx4zfD}(jkYDhB1Yi)lf9@Pmyx!BrF{FY~_oN{o zqoc_2hxhBtlmbued&t1Ec2d+s4lD5@S@nlZhvXdIbSH)GRu;TFy(Z{X-kwI)%a0)z4*}Q$iB}N-$-t