mirror of
				https://github.com/mt-mods/signs_lib.git
				synced 2025-10-26 09:15:29 +01:00 
			
		
		
		
	Compare commits
	
		
			13 Commits
		
	
	
		
			2019-09-15
			...
			2019-09-19
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | c66c1b70bd | ||
|  | 831055095c | ||
|  | f0bc18154e | ||
|  | 4eeaf90ae3 | ||
|  | 906ddbbcc5 | ||
|  | 01e2adaa46 | ||
|  | 03bd471230 | ||
|  | e5d525c272 | ||
|  | a907f9535c | ||
|  | bbd580acb1 | ||
|  | 2d29a539f8 | ||
|  | 4b2abfadce | ||
|  | ee2dc495c3 | 
							
								
								
									
										342
									
								
								api.lua
									
									
									
									
									
								
							
							
						
						
									
										342
									
								
								api.lua
									
									
									
									
									
								
							| @@ -29,6 +29,8 @@ signs_lib.standard_steel_groups.attached_node = nil | |||||||
| signs_lib.standard_wood_sign_sounds  = table.copy(minetest.registered_items["default:sign_wall_wood"].sounds) | signs_lib.standard_wood_sign_sounds  = table.copy(minetest.registered_items["default:sign_wall_wood"].sounds) | ||||||
| signs_lib.standard_steel_sign_sounds = table.copy(minetest.registered_items["default:sign_wall_steel"].sounds) | signs_lib.standard_steel_sign_sounds = table.copy(minetest.registered_items["default:sign_wall_steel"].sounds) | ||||||
|  |  | ||||||
|  | signs_lib.default_text_scale = {x=10, y=10} | ||||||
|  |  | ||||||
| signs_lib.standard_yaw = { | signs_lib.standard_yaw = { | ||||||
| 	0, | 	0, | ||||||
| 	math.pi / -2, | 	math.pi / -2, | ||||||
| @@ -61,70 +63,185 @@ signs_lib.wall_fdir_to_back = { | |||||||
| 	{  1,  0 }, | 	{  1,  0 }, | ||||||
| } | } | ||||||
|  |  | ||||||
| signs_lib.rotate_facedir = { | signs_lib.fdir_to_back_left = { | ||||||
| 	[0] = 1, | 	[0] = { -1,  1 }, | ||||||
| 	[1] = 6, | 	[1] = {  1,  1 }, | ||||||
| 	[2] = 3, | 	[2] = {  1, -1 }, | ||||||
| 	[3] = 0, | 	[3] = { -1, -1 } | ||||||
| 	[4] = 2, | } | ||||||
| 	[5] = 6, |  | ||||||
| 	[6] = 4 | signs_lib.wall_fdir_to_back_left = { | ||||||
|  | 	[2] = {  1,  1 }, | ||||||
|  | 	[3] = { -1, -1 }, | ||||||
|  | 	[4] = { -1,  1 }, | ||||||
|  | 	[5] = {  1, -1 } | ||||||
| } | } | ||||||
|  |  | ||||||
| signs_lib.rotate_walldir = { | signs_lib.rotate_walldir = { | ||||||
| 	[0] = 1, | 	[0] = 4, | ||||||
| 	[1] = 5, | 	[1] = 0, | ||||||
| 	[2] = 0, | 	[2] = 5, | ||||||
|  | 	[3] = 1, | ||||||
|  | 	[4] = 2, | ||||||
|  | 	[5] = 3 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | signs_lib.rotate_walldir_simple = { | ||||||
|  | 	[0] = 4, | ||||||
|  | 	[1] = 4, | ||||||
|  | 	[2] = 5, | ||||||
| 	[3] = 4, | 	[3] = 4, | ||||||
| 	[4] = 2, | 	[4] = 2, | ||||||
| 	[5] = 3 | 	[5] = 3 | ||||||
| } | } | ||||||
|  |  | ||||||
|  | signs_lib.rotate_facedir = { | ||||||
|  | 	[0] = 1, | ||||||
|  | 	[1] = 2, | ||||||
|  | 	[2] = 3, | ||||||
|  | 	[3] = 4, | ||||||
|  | 	[4] = 6, | ||||||
|  | 	[5] = 6, | ||||||
|  | 	[6] = 0 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | signs_lib.rotate_facedir_simple = { | ||||||
|  | 	[0] = 1, | ||||||
|  | 	[1] = 2, | ||||||
|  | 	[2] = 3, | ||||||
|  | 	[3] = 0, | ||||||
|  | 	[4] = 0, | ||||||
|  | 	[5] = 0 | ||||||
|  | } | ||||||
|  |  | ||||||
| -- Initialize character texture cache | -- Initialize character texture cache | ||||||
| local ctexcache = {} | local ctexcache = {} | ||||||
|  |  | ||||||
| signs_lib.wallmounted_rotate = function(pos, node, user, mode) | -- entity handling | ||||||
| 	if not signs_lib.can_modify(pos, user) then return false end |  | ||||||
|  |  | ||||||
| 	if mode ~= screwdriver.ROTATE_FACE or string.match(node.name, "_onpole") then | minetest.register_entity("signs_lib:text", { | ||||||
| 		return false | 	collisionbox = { 0, 0, 0, 0, 0, 0 }, | ||||||
| 	end | 	visual = "mesh", | ||||||
|  | 	mesh = "signs_lib_standard_wall_sign_entity.obj", | ||||||
|  | 	textures = {}, | ||||||
|  | 	static_save = false, | ||||||
|  | 	backface_culling = false | ||||||
|  | }) | ||||||
|  |  | ||||||
| 	local newparam2 = signs_lib.rotate_walldir[node.param2] or 0 | function signs_lib.delete_objects(pos) | ||||||
|  | 	local objects = minetest.get_objects_inside_radius(pos, 0.5) | ||||||
| 	minetest.swap_node(pos, { name = node.name, param2 = newparam2 }) | 	for _, v in ipairs(objects) do | ||||||
| 	for _, v in ipairs(minetest.get_objects_inside_radius(pos, 0.5)) do |  | ||||||
| 		local e = v:get_luaentity() |  | ||||||
| 		if e and e.name == "signs_lib:text" then |  | ||||||
| 		v:remove() | 		v:remove() | ||||||
| 	end | 	end | ||||||
| end | end | ||||||
| 	signs_lib.update_sign(pos) |  | ||||||
| 	return true | function signs_lib.spawn_entity(pos, texture) | ||||||
|  | 	local node = minetest.get_node(pos) | ||||||
|  | 	local def = minetest.registered_items[node.name] | ||||||
|  | 	if not def or not def.entity_info then return end | ||||||
|  |  | ||||||
|  | 	local text_scale = (node and node.text_scale) or signs_lib.default_text_scale | ||||||
|  | 	local objects = minetest.get_objects_inside_radius(pos, 0.5) | ||||||
|  | 	local obj | ||||||
|  |  | ||||||
|  | 	if #objects > 0 then | ||||||
|  | 		obj = objects[1] | ||||||
|  | 	else | ||||||
|  | 		obj = minetest.add_entity(pos, "signs_lib:text") | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
| signs_lib.facedir_rotate = function(pos, node, user, mode) | 	local yaw = def.entity_info.yaw[node.param2 + 1] | ||||||
| 	if not signs_lib.can_modify(pos, user) then return false end | 	local pitch = 0 | ||||||
|  |  | ||||||
| 	if mode ~= screwdriver.ROTATE_FACE or string.match(node.name, "_onpole") then | 	if not string.find(node.name, "onpole") and not string.find(node.name, "hanging") then | ||||||
|  | 		local rot90 = math.pi/2 | ||||||
|  |  | ||||||
|  | 		if def.paramtype2 == "wallmounted" then | ||||||
|  | 			if node.param2 == 1 then -- on floor | ||||||
|  | 				pitch = -rot90 | ||||||
|  | 				yaw = 0 | ||||||
|  | 			elseif node.param2 == 0 then -- on ceiling | ||||||
|  | 				pitch = rot90 | ||||||
|  | 				yaw = math.pi | ||||||
|  | 			end | ||||||
|  | 		elseif def.paramtype2 == "facedir" then | ||||||
|  | 			if node.param2 == 4 then | ||||||
|  | 				pitch = -rot90 | ||||||
|  | 				yaw = 0 | ||||||
|  | 			elseif node.param2 == 6 then | ||||||
|  | 				pitch = rot90 | ||||||
|  | 				yaw = math.pi | ||||||
|  | 			end | ||||||
|  | 		end | ||||||
|  | 	end | ||||||
|  |  | ||||||
|  | 	if yaw then | ||||||
|  | 		obj:set_rotation({x = pitch, y = yaw, z=0}) | ||||||
|  |  | ||||||
|  | 		if not texture then | ||||||
|  | 			obj:set_properties({ | ||||||
|  | 				mesh = def.entity_info.mesh, | ||||||
|  | 				visual_size = text_scale, | ||||||
|  | 			}) | ||||||
|  | 		else | ||||||
|  | 			obj:set_properties({ | ||||||
|  | 				mesh = def.entity_info.mesh, | ||||||
|  | 				visual_size = text_scale, | ||||||
|  | 				textures={texture}, | ||||||
|  | 			}) | ||||||
|  | 		end | ||||||
|  | 	end | ||||||
|  | end | ||||||
|  |  | ||||||
|  | -- rotation | ||||||
|  |  | ||||||
|  | function signs_lib.handle_rotation(pos, node, user, mode) | ||||||
|  | 	if not signs_lib.can_modify(pos, user) | ||||||
|  | 	  or mode ~= screwdriver.ROTATE_FACE then | ||||||
| 		return false | 		return false | ||||||
| 	end | 	end | ||||||
|  | 	local newparam2 | ||||||
|  | 	local tpos = pos | ||||||
|  | 	local def = minetest.registered_items[node.name] | ||||||
|  |  | ||||||
| 	local newparam2 = signs_lib.rotate_facedir[node.param2] or 0 | 	if string.match(node.name, "_onpole") then | ||||||
|  | 		local newparam2 = signs_lib.rotate_walldir_simple[node.param2] or 4 | ||||||
|  | 		local t = signs_lib.wall_fdir_to_back_left | ||||||
|  |  | ||||||
| 	minetest.swap_node(pos, { name = node.name, param2 = newparam2 }) | 		if def.paramtype2 ~= "wallmounted" then | ||||||
| 	for _, v in ipairs(minetest.get_objects_inside_radius(pos, 0.5)) do | 			newparam2 = signs_lib.rotate_facedir_simple[node.param2] or 0 | ||||||
| 		local e = v:get_luaentity() | 			t  = signs_lib.fdir_to_back_left | ||||||
| 		if e and e.name == "signs_lib:text" then |  | ||||||
| 			v:remove() |  | ||||||
| 		end | 		end | ||||||
|  |  | ||||||
|  | 		tpos = { | ||||||
|  | 			x = pos.x + t[node.param2][1], | ||||||
|  | 			y = pos.y, | ||||||
|  | 			z = pos.z + t[node.param2][2] | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		local node2 = minetest.get_node(tpos) | ||||||
|  | 		local def2 = minetest.registered_items[node2.name] | ||||||
|  | 		if not def2 or not def2.buildable_to then return true end -- undefined, or not buildable_to. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | 		minetest.set_node(tpos, {name = node.name, param2 = newparam2}) | ||||||
|  | 		minetest.get_meta(tpos):from_table(minetest.get_meta(pos):to_table()) | ||||||
|  | 		minetest.remove_node(pos) | ||||||
|  | 		signs_lib.delete_objects(pos) | ||||||
|  |  | ||||||
|  | 	elseif string.match(node.name, "_hanging") or string.match(node.name, "yard") then | ||||||
|  | 		minetest.swap_node(tpos, { name = node.name, param2 = signs_lib.rotate_facedir_simple[node.param2] or 0 }) | ||||||
|  | 	elseif minetest.registered_items[node.name].paramtype2 == "wallmounted" then | ||||||
|  | 		minetest.swap_node(tpos, { name = node.name, param2 = signs_lib.rotate_walldir[node.param2] or 0 }) | ||||||
|  | 	else | ||||||
|  | 		minetest.swap_node(tpos, { name = node.name, param2 = signs_lib.rotate_facedir[node.param2] or 0 }) | ||||||
| 	end | 	end | ||||||
| 	signs_lib.update_sign(pos) |  | ||||||
|  | 	signs_lib.delete_objects(tpos) | ||||||
|  | 	signs_lib.update_sign(tpos) | ||||||
| 	return true | 	return true | ||||||
| end | end | ||||||
|  |  | ||||||
| local DEFAULT_TEXT_SCALE = {x=10, y=10} |  | ||||||
|  |  | ||||||
| -- infinite stacks | -- infinite stacks | ||||||
|  |  | ||||||
| if not minetest.settings:get_bool("creative_mode") then | if not minetest.settings:get_bool("creative_mode") then | ||||||
| @@ -235,15 +352,6 @@ local fences_with_sign = { } | |||||||
|  |  | ||||||
| -- some local helper functions | -- some local helper functions | ||||||
|  |  | ||||||
| local function split_lines_and_words(text) |  | ||||||
| 	if not text then return end |  | ||||||
| 	local lines = { } |  | ||||||
| 	for _, line in ipairs(text:split("\n")) do |  | ||||||
| 		table.insert(lines, line:split(" ")) |  | ||||||
| 	end |  | ||||||
| 	return lines |  | ||||||
| end |  | ||||||
|  |  | ||||||
| local math_max = math.max | local math_max = math.max | ||||||
|  |  | ||||||
| local function fill_line(x, y, w, c, font_size, colorbgw) | local function fill_line(x, y, w, c, font_size, colorbgw) | ||||||
| @@ -388,6 +496,7 @@ end | |||||||
| local function make_sign_texture(lines, pos) | local function make_sign_texture(lines, pos) | ||||||
| 	local node = minetest.get_node(pos) | 	local node = minetest.get_node(pos) | ||||||
| 	local def = minetest.registered_items[node.name] | 	local def = minetest.registered_items[node.name] | ||||||
|  | 	if not def or not def.entity_info then return end | ||||||
|  |  | ||||||
| 	local font_size | 	local font_size | ||||||
| 	local line_width | 	local line_width | ||||||
| @@ -422,16 +531,21 @@ local function make_sign_texture(lines, pos) | |||||||
| 	return table.concat(texture, "") | 	return table.concat(texture, "") | ||||||
| end | end | ||||||
|  |  | ||||||
| local function set_obj_text(obj, text, x, pos) | function signs_lib.split_lines_and_words(text) | ||||||
| 	local split = split_lines_and_words | 	if not text then return end | ||||||
|  | 	local lines = { } | ||||||
|  | 	for _, line in ipairs(text:split("\n")) do | ||||||
|  | 		table.insert(lines, line:split(" ")) | ||||||
|  | 	end | ||||||
|  | 	return lines | ||||||
|  | end | ||||||
|  |  | ||||||
|  | function signs_lib.set_obj_text(pos, text) | ||||||
|  | 	local split = signs_lib.split_lines_and_words | ||||||
| 	local text_ansi = Utf8ToAnsi(text) | 	local text_ansi = Utf8ToAnsi(text) | ||||||
| 	local n = minetest.registered_nodes[minetest.get_node(pos).name] | 	local n = minetest.registered_nodes[minetest.get_node(pos).name] | ||||||
| 	local text_scale = (n and n.text_scale) or DEFAULT_TEXT_SCALE | 	signs_lib.delete_objects(pos) | ||||||
| 	local texture = make_sign_texture(split(text_ansi), pos) | 	signs_lib.spawn_entity(pos, make_sign_texture(split(text_ansi), pos)) | ||||||
| 	obj:set_properties({ |  | ||||||
| 		textures={texture}, |  | ||||||
| 		visual_size = text_scale, |  | ||||||
| 	}) |  | ||||||
| end | end | ||||||
|  |  | ||||||
| local function make_widefont_nodename(name) | local function make_widefont_nodename(name) | ||||||
| @@ -473,18 +587,12 @@ function signs_lib.construct_sign(pos) | |||||||
| end | end | ||||||
|  |  | ||||||
| function signs_lib.destruct_sign(pos) | function signs_lib.destruct_sign(pos) | ||||||
| 	local objects = minetest.get_objects_inside_radius(pos, 0.5) | 	signs_lib.delete_objects(pos) | ||||||
| 	for _, v in ipairs(objects) do |  | ||||||
| 		local e = v:get_luaentity() |  | ||||||
| 		if e and e.name == "signs_lib:text" then |  | ||||||
| 			v:remove() |  | ||||||
| 		end |  | ||||||
| 	end |  | ||||||
| end | end | ||||||
|  |  | ||||||
| local function make_infotext(text) | local function make_infotext(text) | ||||||
| 	text = trim_input(text) | 	text = trim_input(text) | ||||||
| 	local lines = split_lines_and_words(text) or {} | 	local lines = signs_lib.split_lines_and_words(text) or {} | ||||||
| 	local lines2 = { } | 	local lines2 = { } | ||||||
| 	for _, line in ipairs(lines) do | 	for _, line in ipairs(lines) do | ||||||
| 		table.insert(lines2, (table.concat(line, " "):gsub("#[0-9a-fA-F]", ""):gsub("##", "#"))) | 		table.insert(lines2, (table.concat(line, " "):gsub("#[0-9a-fA-F]", ""):gsub("##", "#"))) | ||||||
| @@ -499,40 +607,12 @@ function signs_lib.update_sign(pos, fields) | |||||||
| 	text = trim_input(text) | 	text = trim_input(text) | ||||||
|  |  | ||||||
| 	local owner = meta:get_string("owner") | 	local owner = meta:get_string("owner") | ||||||
| 	ownstr = "" | 	local ownstr = "" | ||||||
| 	if owner ~= "" then ownstr = S("Locked sign, owned by @1\n", owner) end | 	if owner ~= "" then ownstr = S("Locked sign, owned by @1\n", owner) end | ||||||
|  |  | ||||||
| 	meta:set_string("text", text) | 	meta:set_string("text", text) | ||||||
| 	meta:set_string("infotext", ownstr..make_infotext(text).." ") | 	meta:set_string("infotext", ownstr..make_infotext(text).." ") | ||||||
|  | 	signs_lib.set_obj_text(pos, text) | ||||||
| 	local objects = minetest.get_objects_inside_radius(pos, 0.5) |  | ||||||
| 	local found |  | ||||||
| 	for _, v in ipairs(objects) do |  | ||||||
| 		local e = v:get_luaentity() |  | ||||||
| 		if e and e.name == "signs_lib:text" then |  | ||||||
| 			if found then |  | ||||||
| 				v:remove() |  | ||||||
| 			else |  | ||||||
| 				set_obj_text(v, text, nil, pos) |  | ||||||
| 				found = true |  | ||||||
| 			end |  | ||||||
| 		end |  | ||||||
| 	end |  | ||||||
| 	if found then |  | ||||||
| 		return |  | ||||||
| 	end |  | ||||||
|  |  | ||||||
| 	-- if there is no entity |  | ||||||
| 	local signnode = minetest.get_node(pos) |  | ||||||
| 	local signname = signnode.name |  | ||||||
| 	local def = minetest.registered_items[signname] |  | ||||||
| 	if not def.entity_info or not def.entity_info.yaw[signnode.param2 + 1] then return end |  | ||||||
| 	local obj = minetest.add_entity(pos, "signs_lib:text") |  | ||||||
|  |  | ||||||
| 	obj:setyaw(def.entity_info.yaw[signnode.param2 + 1]) |  | ||||||
| 	obj:set_properties({ |  | ||||||
| 		mesh = def.entity_info.mesh, |  | ||||||
| 	}) |  | ||||||
| end | end | ||||||
|  |  | ||||||
| function signs_lib.receive_fields(pos, formname, fields, sender) | function signs_lib.receive_fields(pos, formname, fields, sender) | ||||||
| @@ -589,30 +669,6 @@ function signs_lib.can_modify(pos, player) | |||||||
| 	return false | 	return false | ||||||
| end | end | ||||||
|  |  | ||||||
| local signs_text_on_activate = function(self) |  | ||||||
| 	local pos = self.object:getpos() |  | ||||||
| 	local meta = minetest.get_meta(pos) |  | ||||||
| 	local signnode = minetest.get_node(pos) |  | ||||||
| 	local signname = signnode.name |  | ||||||
| 	local def = minetest.registered_items[signname] |  | ||||||
| 	local text = meta:get_string("text") |  | ||||||
| 	if text and def and def.entity_info then |  | ||||||
| 		text = trim_input(text) |  | ||||||
| 		set_obj_text(self.object, text, nil, pos) |  | ||||||
| 		self.object:set_properties({ |  | ||||||
| 			mesh = def.entity_info.mesh, |  | ||||||
| 		}) |  | ||||||
| 	end |  | ||||||
| end |  | ||||||
|  |  | ||||||
| minetest.register_entity("signs_lib:text", { |  | ||||||
| 	collisionbox = { 0, 0, 0, 0, 0, 0 }, |  | ||||||
| 	visual = "mesh", |  | ||||||
| 	mesh = "signs_lib_standard_wall_sign_entity.obj", |  | ||||||
| 	textures = {}, |  | ||||||
| 	on_activate = signs_text_on_activate, |  | ||||||
| }) |  | ||||||
|  |  | ||||||
| -- make selection boxes | -- make selection boxes | ||||||
| -- sizex/sizey specified in inches because that's what MUTCD uses. | -- sizex/sizey specified in inches because that's what MUTCD uses. | ||||||
|  |  | ||||||
| @@ -649,6 +705,7 @@ function signs_lib.check_for_pole(pos, pointed_thing) | |||||||
| 		  or string.find(pnode.name, "default:fence_") | 		  or string.find(pnode.name, "default:fence_") | ||||||
| 		  or string.find(pnode.name, "_post") | 		  or string.find(pnode.name, "_post") | ||||||
| 		  or string.find(pnode.name, "fencepost") | 		  or string.find(pnode.name, "fencepost") | ||||||
|  | 		  or string.find(pnode.name, "streets:streetlamp_basic_top") | ||||||
| 		  or (pnode.name == "streets:bigpole" and pnode.param2 < 4) | 		  or (pnode.name == "streets:bigpole" and pnode.param2 < 4) | ||||||
| 		  or (pnode.name == "streets:bigpole" and pnode.param2 > 19 and pnode.param2 < 24) | 		  or (pnode.name == "streets:bigpole" and pnode.param2 > 19 and pnode.param2 < 24) | ||||||
| 		) | 		) | ||||||
| @@ -666,8 +723,15 @@ function signs_lib.check_for_ceiling(pointed_thing) | |||||||
| 	end | 	end | ||||||
| end | end | ||||||
|  |  | ||||||
|  | function signs_lib.check_for_floor(pointed_thing) | ||||||
|  | 	if pointed_thing.above.x == pointed_thing.under.x | ||||||
|  | 	  and pointed_thing.above.z == pointed_thing.under.z | ||||||
|  | 	  and pointed_thing.above.y > pointed_thing.under.y then | ||||||
|  | 		return true | ||||||
|  | 	end | ||||||
|  | end | ||||||
|  |  | ||||||
| function signs_lib.after_place_node(pos, placer, itemstack, pointed_thing, locked) | function signs_lib.after_place_node(pos, placer, itemstack, pointed_thing, locked) | ||||||
| 	print("after_place_node") |  | ||||||
| 	local playername = placer:get_player_name() | 	local playername = placer:get_player_name() | ||||||
| 	local def = minetest.registered_items[itemstack:get_name()] | 	local def = minetest.registered_items[itemstack:get_name()] | ||||||
|  |  | ||||||
| @@ -676,12 +740,23 @@ function signs_lib.after_place_node(pos, placer, itemstack, pointed_thing, locke | |||||||
| 	local pdef = minetest.registered_items[pnode.name] | 	local pdef = minetest.registered_items[pnode.name] | ||||||
|  |  | ||||||
| 	if (def.allow_onpole ~= false) and signs_lib.check_for_pole(pos, pointed_thing) then | 	if (def.allow_onpole ~= false) and signs_lib.check_for_pole(pos, pointed_thing) then | ||||||
|  | 		local newparam2 | ||||||
|  | 		local lookdir = minetest.yaw_to_dir(placer:get_look_horizontal()) | ||||||
|  | 		if def.paramtype2 == "wallmounted" then | ||||||
|  | 			newparam2 = minetest.dir_to_wallmounted(lookdir) | ||||||
|  | 		else | ||||||
|  | 			newparam2 = minetest.dir_to_facedir(lookdir) | ||||||
|  | 		end | ||||||
| 		local node = minetest.get_node(pos) | 		local node = minetest.get_node(pos) | ||||||
| 		minetest.swap_node(pos, {name = itemstack:get_name().."_onpole", param2 = node.param2}) | 		minetest.swap_node(pos, {name = itemstack:get_name().."_onpole", param2 = newparam2}) | ||||||
| 	elseif def.allow_hanging and signs_lib.check_for_ceiling(pointed_thing) then | 	elseif def.allow_hanging and signs_lib.check_for_ceiling(pointed_thing) then | ||||||
| 		local newparam2 = minetest.dir_to_facedir(placer:get_look_dir()) | 		local newparam2 = minetest.dir_to_facedir(placer:get_look_dir()) | ||||||
| 		local node = minetest.get_node(pos) | 		local node = minetest.get_node(pos) | ||||||
| 		minetest.swap_node(pos, {name = itemstack:get_name().."_hanging", param2 = newparam2}) | 		minetest.swap_node(pos, {name = itemstack:get_name().."_hanging", param2 = newparam2}) | ||||||
|  | 	elseif def.paramtype2 == "facedir" and signs_lib.check_for_ceiling(pointed_thing) then | ||||||
|  | 		minetest.swap_node(pos, {name = itemstack:get_name(), param2 = 6}) | ||||||
|  | 	elseif def.paramtype2 == "facedir" and signs_lib.check_for_floor(pointed_thing) then | ||||||
|  | 		minetest.swap_node(pos, {name = itemstack:get_name(), param2 = 4}) | ||||||
| 	end | 	end | ||||||
| 	if locked then | 	if locked then | ||||||
| 		local meta = minetest.get_meta(pos) | 		local meta = minetest.get_meta(pos) | ||||||
| @@ -736,16 +811,8 @@ local function register_sign(name, rdef) | |||||||
| 	def.wield_image         = rdef.wield_image         or def.inventory_image | 	def.wield_image         = rdef.wield_image         or def.inventory_image | ||||||
| 	def.drop                = rdef.drop                or name | 	def.drop                = rdef.drop                or name | ||||||
| 	def.sounds              = rdef.sounds              or signs_lib.standard_wood_sign_sounds | 	def.sounds              = rdef.sounds              or signs_lib.standard_wood_sign_sounds | ||||||
| 	def.on_rotate           = rdef.on_rotate           or signs_lib.wallmounted_rotate |  | ||||||
| 	def.paramtype2          = rdef.paramtype2          or "wallmounted" | 	def.paramtype2          = rdef.paramtype2          or "wallmounted" | ||||||
|  | 	def.on_rotate           = rdef.on_rotate           or signs_lib.handle_rotation | ||||||
| 	if rdef.on_rotate then |  | ||||||
| 		def.on_rotate = rdef.on_rotate |  | ||||||
| 	elseif rdef.drawtype == "wallmounted" then |  | ||||||
| 		def.on_rotate = signs_lib.wallmounted_rotate |  | ||||||
| 	else |  | ||||||
| 		def.on_rotate = signs_lib.facedir_rotate |  | ||||||
| 	end |  | ||||||
|  |  | ||||||
| 	if rdef.groups then | 	if rdef.groups then | ||||||
| 		def.groups = rdef.groups | 		def.groups = rdef.groups | ||||||
| @@ -753,7 +820,7 @@ local function register_sign(name, rdef) | |||||||
| 		def.groups = signs_lib.standard_wood_groups | 		def.groups = signs_lib.standard_wood_groups | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
| 	local cbox = signs_lib.make_selection_boxes(35, 25, allow_onpole) | 	local cbox = signs_lib.make_selection_boxes(35, 25) | ||||||
|  |  | ||||||
| 	def.selection_box = rdef.selection_box or cbox | 	def.selection_box = rdef.selection_box or cbox | ||||||
| 	def.node_box      = table.copy(rdef.node_box or rdef.selection_box or cbox) | 	def.node_box      = table.copy(rdef.node_box or rdef.selection_box or cbox) | ||||||
| @@ -794,8 +861,6 @@ local function register_sign(name, rdef) | |||||||
| 		opdef.groups.not_in_creative_inventory = 1 | 		opdef.groups.not_in_creative_inventory = 1 | ||||||
| 		opdef.tiles[3] = "signs_lib_pole_mount.png" | 		opdef.tiles[3] = "signs_lib_pole_mount.png" | ||||||
| 		opdef.mesh = string.gsub(opdef.mesh, ".obj$", "_onpole.obj") | 		opdef.mesh = string.gsub(opdef.mesh, ".obj$", "_onpole.obj") | ||||||
| 		opdef.on_rotate = nil |  | ||||||
|  |  | ||||||
|  |  | ||||||
| 		if opdef.entity_info then | 		if opdef.entity_info then | ||||||
| 			opdef.entity_info.mesh = string.gsub(opdef.entity_info.mesh, ".obj$", "_onpole.obj") | 			opdef.entity_info.mesh = string.gsub(opdef.entity_info.mesh, ".obj$", "_onpole.obj") | ||||||
| @@ -809,7 +874,7 @@ local function register_sign(name, rdef) | |||||||
| 		local hdef = table.copy(def) | 		local hdef = table.copy(def) | ||||||
| 		hdef.paramtype2 = "facedir" | 		hdef.paramtype2 = "facedir" | ||||||
|  |  | ||||||
| 		local hcbox = signs_lib.make_selection_boxes(35, 32, false, 0, 3, -18.5, true) | 		local hcbox = signs_lib.make_selection_boxes(35, 32, nil, 0, 3, -18.5, true) | ||||||
|  |  | ||||||
| 		hdef.selection_box = rdef.hanging_selection_box or hcbox | 		hdef.selection_box = rdef.hanging_selection_box or hcbox | ||||||
| 		hdef.node_box = rdef.hanging_node_box or rdef.hanging_selection_box or hcbox | 		hdef.node_box = rdef.hanging_node_box or rdef.hanging_selection_box or hcbox | ||||||
| @@ -817,7 +882,6 @@ local function register_sign(name, rdef) | |||||||
| 		hdef.groups.not_in_creative_inventory = 1 | 		hdef.groups.not_in_creative_inventory = 1 | ||||||
| 		hdef.tiles[3] = "signs_lib_hangers.png" | 		hdef.tiles[3] = "signs_lib_hangers.png" | ||||||
| 		hdef.mesh = string.gsub(string.gsub(hdef.mesh, "_facedir.obj", ".obj"), ".obj$", "_hanging.obj") | 		hdef.mesh = string.gsub(string.gsub(hdef.mesh, "_facedir.obj", ".obj"), ".obj$", "_hanging.obj") | ||||||
| 		hdef.on_rotate = nil |  | ||||||
|  |  | ||||||
| 		if hdef.entity_info then | 		if hdef.entity_info then | ||||||
| 			hdef.entity_info.mesh = string.gsub(string.gsub(hdef.entity_info.mesh, "_facedir.obj", ".obj"), ".obj$", "_hanging.obj") | 			hdef.entity_info.mesh = string.gsub(string.gsub(hdef.entity_info.mesh, "_facedir.obj", ".obj"), ".obj$", "_hanging.obj") | ||||||
| @@ -873,7 +937,7 @@ function signs_lib.register_sign(name, rdef) | |||||||
|  |  | ||||||
| 	if rdef.allow_widefont then | 	if rdef.allow_widefont then | ||||||
|  |  | ||||||
| 		wdef = table.copy(minetest.registered_items[name]) | 		local wdef = table.copy(minetest.registered_items[name]) | ||||||
| 		wdef.groups.not_in_creative_inventory = 1 | 		wdef.groups.not_in_creative_inventory = 1 | ||||||
| 		wdef.horiz_scaling = wdef.horiz_scaling / 2 | 		wdef.horiz_scaling = wdef.horiz_scaling / 2 | ||||||
|  |  | ||||||
| @@ -915,12 +979,7 @@ minetest.register_lbm({ | |||||||
| 			local oldfence =  signs_lib.old_fenceposts[node.name] | 			local oldfence =  signs_lib.old_fenceposts[node.name] | ||||||
| 			local newsign =   signs_lib.old_fenceposts_replacement_signs[node.name] | 			local newsign =   signs_lib.old_fenceposts_replacement_signs[node.name] | ||||||
|  |  | ||||||
| 			for _, v in ipairs(minetest.get_objects_inside_radius(pos, 0.5)) do | 			signs_lib.delete_objects(pos) | ||||||
| 				local e = v:get_luaentity() |  | ||||||
| 				if e and e.name == "signs_lib:text" then |  | ||||||
| 					v:remove() |  | ||||||
| 				end |  | ||||||
| 			end |  | ||||||
|  |  | ||||||
| 			local oldmeta = minetest.get_meta(pos):to_table() | 			local oldmeta = minetest.get_meta(pos):to_table() | ||||||
| 			minetest.set_node(pos, {name = oldfence}) | 			minetest.set_node(pos, {name = oldfence}) | ||||||
| @@ -983,12 +1042,7 @@ minetest.register_chatcommand("regen_signs", { | |||||||
|  |  | ||||||
| 		for _, b in pairs(allsigns) do | 		for _, b in pairs(allsigns) do | ||||||
| 			for _, pos in ipairs(b) do | 			for _, pos in ipairs(b) do | ||||||
| 				local objects = minetest.get_objects_inside_radius(pos, 0.5) | 				signs_lib.delete_objects(pos) | ||||||
| 				if #objects > 0 then |  | ||||||
| 					for _, v in ipairs(objects) do |  | ||||||
| 						v:remove() |  | ||||||
| 					end |  | ||||||
| 				end |  | ||||||
| 				local node = minetest.get_node(pos) | 				local node = minetest.get_node(pos) | ||||||
| 				local def = minetest.registered_items[node.name] | 				local def = minetest.registered_items[node.name] | ||||||
| 				if def and def.entity_info then | 				if def and def.entity_info then | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user