forked from mtcontrib/arrow_signs
		
	Huge Improvements for sign placing
* respect protected areas * respect creative mode
This commit is contained in:
		
							
								
								
									
										105
									
								
								init.lua
									
									
									
									
									
								
							
							
						
						
									
										105
									
								
								init.lua
									
									
									
									
									
								
							@@ -13,122 +13,101 @@
 | 
			
		||||
 | 
			
		||||
arrow_signs={}
 | 
			
		||||
 | 
			
		||||
arrow_signs.formspec = "field[text;Sign text:;${text}]";
 | 
			
		||||
arrow_signs.formspec = "field[text;Sign text:            (Hint: Use / or | to create a new line);${text}]";
 | 
			
		||||
 | 
			
		||||
local creative = minetest.setting_getbool("creative_mode") or false
 | 
			
		||||
arrow_signs.on_place = function(itemstack, placer, pointed_thing)
 | 
			
		||||
 | 
			
		||||
	local posabove = pointed_thing.above
 | 
			
		||||
	local posunder = pointed_thing.under
 | 
			
		||||
	local vector = placer:get_look_dir()
 | 
			
		||||
	local place = true
 | 
			
		||||
	local param2 = 0
 | 
			
		||||
 | 
			
		||||
	-- I wonder if there is a way to calculate the param2 instad of using so much if here.
 | 
			
		||||
	-- +Y
 | 
			
		||||
	if posabove.y>posunder.y then
 | 
			
		||||
		if(vector.z>0.5 and vector.z<=1) then
 | 
			
		||||
			minetest.add_node(posabove,{name = itemstack:get_name(), param2 = 10})
 | 
			
		||||
			param2 = 10
 | 
			
		||||
		elseif (vector.x>0.5 and vector.x<=1) then
 | 
			
		||||
			minetest.add_node(posabove,{name = itemstack:get_name(), param2 = 19})
 | 
			
		||||
			param2 = 19
 | 
			
		||||
		elseif(-0.5>vector.z and -1<=vector.z) then
 | 
			
		||||
			minetest.add_node(posabove,{name = itemstack:get_name(), param2 = 4})
 | 
			
		||||
			param2 = 4
 | 
			
		||||
		elseif (-0.5>vector.x and -1<=vector.x) then
 | 
			
		||||
			minetest.add_node(posabove,{name = itemstack:get_name(), param2 = 13})
 | 
			
		||||
		else
 | 
			
		||||
			place = false
 | 
			
		||||
			param2 = 13
 | 
			
		||||
		end
 | 
			
		||||
	-- -Y
 | 
			
		||||
	elseif posabove.y<posunder.y then
 | 
			
		||||
		if(vector.z>0.5 and vector.z<=1) then
 | 
			
		||||
			minetest.add_node(posabove,{name = itemstack:get_name(), param2 = 8})
 | 
			
		||||
			param2 = 8
 | 
			
		||||
		elseif (vector.x>0.5 and vector.x<=1) then
 | 
			
		||||
			minetest.add_node(posabove,{name = itemstack:get_name(), param2 = 17})
 | 
			
		||||
			param2 = 17
 | 
			
		||||
		elseif(-0.5>vector.z and -1<=vector.z) then
 | 
			
		||||
			minetest.add_node(posabove,{name = itemstack:get_name(), param2 = 6})
 | 
			
		||||
			param2 = 6
 | 
			
		||||
		elseif (-0.5>vector.x and -1<=vector.x) then
 | 
			
		||||
			minetest.add_node(posabove,{name = itemstack:get_name(), param2 = 15})
 | 
			
		||||
		else
 | 
			
		||||
			place = false
 | 
			
		||||
			param2 = 15
 | 
			
		||||
		end
 | 
			
		||||
	-- +Z
 | 
			
		||||
	elseif posabove.z>posunder.z then
 | 
			
		||||
		if(vector.y>0.75 and vector.y<=1) then
 | 
			
		||||
			minetest.add_node(posabove,{name = itemstack:get_name(), param2 = 22})
 | 
			
		||||
			param2 = 22
 | 
			
		||||
		elseif (vector.y>=-1 and vector.y<-0.75) then
 | 
			
		||||
			minetest.add_node(posabove,{name = itemstack:get_name(), param2 = 2})
 | 
			
		||||
			param2 = 2
 | 
			
		||||
		elseif (vector.x>=0 and vector.x<=1) then
 | 
			
		||||
			minetest.add_node(posabove,{name = itemstack:get_name(), param2 = 18})
 | 
			
		||||
			param2 = 18
 | 
			
		||||
		elseif (vector.x<0 and vector.x>=-1) then
 | 
			
		||||
			minetest.add_node(posabove,{name = itemstack:get_name(), param2 = 14})
 | 
			
		||||
		else
 | 
			
		||||
			place = false
 | 
			
		||||
			param2 = 14
 | 
			
		||||
		end
 | 
			
		||||
	-- -Z
 | 
			
		||||
	elseif posabove.z<posunder.z then
 | 
			
		||||
		if(vector.y>0.75 and vector.y<=1) then
 | 
			
		||||
			minetest.add_node(posabove,{name = itemstack:get_name(), param2 = 20})
 | 
			
		||||
			param2 = 20
 | 
			
		||||
		elseif (vector.y>=-1 and vector.y<-0.75) then
 | 
			
		||||
			minetest.add_node(posabove,{name = itemstack:get_name(), param2 = 0})
 | 
			
		||||
			param2 = 0
 | 
			
		||||
		elseif (vector.x>=0 and vector.x<=1) then
 | 
			
		||||
			minetest.add_node(posabove,{name = itemstack:get_name(), param2 = 16})
 | 
			
		||||
			param2 = 16
 | 
			
		||||
		elseif (vector.x<0 and vector.x>=-1) then
 | 
			
		||||
			minetest.add_node(posabove,{name = itemstack:get_name(), param2 = 12})
 | 
			
		||||
		else
 | 
			
		||||
			place = false
 | 
			
		||||
			param2 = 12
 | 
			
		||||
		end
 | 
			
		||||
	-- +X
 | 
			
		||||
	elseif posabove.x>posunder.x then
 | 
			
		||||
		if(vector.y>0.75 and vector.y<=1) then
 | 
			
		||||
			minetest.add_node(posabove,{name = itemstack:get_name(), param2 = 21})
 | 
			
		||||
			 param2 = 21
 | 
			
		||||
		elseif (vector.y>=-1 and vector.y<-0.75) then
 | 
			
		||||
			minetest.add_node(posabove,{name = itemstack:get_name(), param2 = 3})
 | 
			
		||||
			param2 = 3
 | 
			
		||||
		elseif (vector.z>=0 and vector.z<=1) then
 | 
			
		||||
			minetest.add_node(posabove,{name = itemstack:get_name(), param2 = 11})
 | 
			
		||||
			param2 = 11
 | 
			
		||||
		elseif (vector.z<0 and vector.z>=-1) then
 | 
			
		||||
			minetest.add_node(posabove,{name = itemstack:get_name(), param2 = 7})
 | 
			
		||||
		else
 | 
			
		||||
			place = false
 | 
			
		||||
			param2 = 7
 | 
			
		||||
		end
 | 
			
		||||
	-- -X
 | 
			
		||||
	elseif posabove.x<posunder.x then
 | 
			
		||||
		if(vector.y>0.75 and vector.y<=1) then
 | 
			
		||||
			minetest.add_node(posabove,{name = itemstack:get_name(), param2 = 23})
 | 
			
		||||
			param2 = 23
 | 
			
		||||
		elseif (vector.y>=-1 and vector.y<-0.75) then
 | 
			
		||||
			minetest.add_node(posabove,{name = itemstack:get_name(), param2 = 1})
 | 
			
		||||
			param2 = 1
 | 
			
		||||
		elseif (vector.z>=0 and vector.z<=1) then
 | 
			
		||||
			minetest.add_node(posabove,{name = itemstack:get_name(), param2 = 9})
 | 
			
		||||
			param2 = 9
 | 
			
		||||
		elseif (vector.z<0 and vector.z>=-1) then
 | 
			
		||||
			minetest.add_node(posabove,{name = itemstack:get_name(), param2 = 5})
 | 
			
		||||
		else
 | 
			
		||||
			place = false
 | 
			
		||||
			param2 = 5
 | 
			
		||||
		end
 | 
			
		||||
	else
 | 
			
		||||
		place = false
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	if place then
 | 
			
		||||
		if not creative then
 | 
			
		||||
			itemstack:take_item()
 | 
			
		||||
		end
 | 
			
		||||
	else
 | 
			
		||||
		itemstack = minetest.rotate_node(itemstack, placer, pointed_thing)
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	return itemstack
 | 
			
		||||
	return minetest.item_place_node(itemstack, placer, pointed_thing, param2)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
arrow_signs.savetext = function(pos, formname, fields, sender)
 | 
			
		||||
	if fields.text then
 | 
			
		||||
		if not minetest.get_player_privs(sender:get_player_name())["interact"] then
 | 
			
		||||
			minetest.chat_send_player(sender:get_player_name(), "error: you don't have permission to edit the sign. you need the interact priv")
 | 
			
		||||
		return
 | 
			
		||||
		end
 | 
			
		||||
		if minetest.is_protected(pos, sender:get_player_name()) then
 | 
			
		||||
			minetest.record_protection_violation(pos, sender:get_player_name())
 | 
			
		||||
		local playername = sender:get_player_name() or ""
 | 
			
		||||
		if minetest.is_protected(pos, playername) then
 | 
			
		||||
			minetest.record_protection_violation(pos, playername)
 | 
			
		||||
			return
 | 
			
		||||
		end
 | 
			
		||||
		local meta = minetest.get_meta(pos)
 | 
			
		||||
		fields.text = fields.text or ""
 | 
			
		||||
		minetest.log("action", (sender:get_player_name() or "").." wrote \""..fields.text..
 | 
			
		||||
				"\" to sign at "..minetest.pos_to_string(pos));
 | 
			
		||||
		minetest.log("action", string.format("%q wrote %q to sign at %s", playername, fields.text, minetest.pos_to_string(pos)));
 | 
			
		||||
		meta:set_string("text", fields.text)
 | 
			
		||||
		local text,lines = arrow_signs.create_lines(fields.text)
 | 
			
		||||
		local text, lines = arrow_signs.create_lines(fields.text)
 | 
			
		||||
		meta:set_string("infotext", '"'..text..'"')
 | 
			
		||||
		if lines > 4 then
 | 
			
		||||
			minetest.chat_send_player(sender:get_player_name(),"Information: \nYou've written more than 5 lines. \nIt may be that not all lines are displayed. \nPlease remove the last entry")
 | 
			
		||||
		if lines >= 6 then
 | 
			
		||||
			minetest.chat_send_player(playername, "Information: \nYou've written "..lines.." lines. \nThe sign can only display 5 lines \nPlease remove the last entries")
 | 
			
		||||
		end
 | 
			
		||||
	return true
 | 
			
		||||
	end
 | 
			
		||||
@@ -138,7 +117,7 @@ end
 | 
			
		||||
arrow_signs.create_lines = function(text)
 | 
			
		||||
	local text, n = text:gsub("[ ]*(%|)[ ]*", '"\n"')--search for |
 | 
			
		||||
	local text, m = text:gsub("[ ]*(%/)[ ]*", '"\n"')--search for /
 | 
			
		||||
	return text, n+m
 | 
			
		||||
	return text, n+m+1
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
arrow_signs.nodebox = {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user