2013-07-14 17:26:30 +02:00
--more_signs by addi
--Code and Textures are under the CC by-sa 3.0 licence
--see: http://creativecommons.org/licenses/by-sa/3.0/
arrow_signs = { }
2014-03-19 05:43:07 +01:00
arrow_signs_on_place = function ( itemstack , placer , pointed_thing )
local function transformvector ( vector )
local vectorlist = {
{ cmin = - 1 , cmax = - 0.5 } ,
{ cmin = - 0.5 , cmax = 0 } ,
{ cmin = 0 , cmax = 0.5 } ,
{ cmin = 0.5 , cmax = 1 }
}
local r = { }
for n , res in pairs ( vector ) do
for ia = 1 , table.getn ( vectorlist ) do
if vectorlist [ ia ] . cmin < res and vectorlist [ ia ] . cmax > res then
r [ n ] = ia
end
end
end
return r [ " x " ] * 10 + r [ " z " ]
end
local pos = pointed_thing.above
local vector = transformvector ( placer : get_look_dir ( ) )
local changer = {
{ 31 , 5 } ,
{ 12 , 14 } ,
{ 24 , 11 } ,
{ 43 , 16 } ,
}
local place = false
for i = 1 , table.getn ( changer ) do
if vector == changer [ i ] [ 1 ] then
minetest.add_node ( pos , { name = itemstack : get_name ( ) , param2 = changer [ i ] [ 2 ] } )
place = true
break
end
end
if not ( place ) then
minetest.rotate_node ( itemstack , placer , pointed_thing )
else
itemstack : take_item ( )
return itemstack
end
end
2013-07-14 17:26:30 +02:00
function arrow_signs : savetext ( pos , formname , fields , sender )
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
2014-01-05 19:01:57 +01:00
local meta = minetest.get_meta ( pos )
2013-07-14 17:26:30 +02:00
fields.text = fields.text or " "
print ( ( sender : get_player_name ( ) or " " ) .. " wrote \" " .. fields.text ..
" \" to sign at " .. minetest.pos_to_string ( pos ) )
meta : set_string ( " text " , fields.text )
text = arrow_signs : create_lines ( fields.text )
meta : set_string ( " infotext " , ' " ' .. text .. ' " ' )
i = 0
for wort in text : gfind ( " \n " ) do
i = i + 1
end
if i > 4 then
minetest.chat_send_player ( sender : get_player_name ( ) , " \t Information: \n You've written more than 5 lines. \n it may be that not all lines are displayed. \n Please remove the last entry " )
end
return true
end
function arrow_signs : create_lines ( text )
text = text : gsub ( " / " , " \" \n \" " )
text = text : gsub ( " | " , " \" \n \" " )
return text
end
local clone_registered = function ( case , name )
local params = { }
local list
if case == " item " then list = minetest.registered_items end
if case == " node " then list = minetest.registered_nodes end
if case == " craftitem " then list = minetest.registered_craftitems end
if case == " tool " then list = minetest.registered_tools end
if case == " entity " then list = minetest.registered_entities end
if list then
for k , v in pairs ( list [ name ] ) do
params [ k ] = v
end
end
return params
end
-- usage
local node = clone_registered ( " node " , " default:sign_wall " )
2014-01-04 00:54:25 +01:00
if node.legacy_wallmounted then
node.groups = { choppy = 2 , dig_immediate = 2 , attached_node = 1 , sign = 1 }
else
node.groups = { choppy = 2 , dig_immediate = 2 , sign = 1 }
end
2013-07-14 17:26:30 +02:00
minetest.register_node ( " :default:sign_wall " , node )
2014-01-05 19:01:57 +01:00
--Sign arrow
minetest.register_node ( " arrow_signs:wall " , {
description = " Arrow signs " ,
drawtype = " nodebox " ,
node_box = {
type = " fixed " ,
fixed = {
2014-01-08 08:27:10 +01:00
{ 0.25 , - 0.25 , 0.5 , - 0.25 , 0.5 , 0.47 } ,
{ 0.1875 , - 0.3125 , 0.5 , - 0.1875 , - 0.25 , 0.47 } ,
{ 0.125 , - 0.3125 , 0.5 , - 0.125 , - 0.375 , 0.47 } ,
{ 0.0625 , - 0.375 , 0.5 , - 0.0625 , - 0.437 , 0.47 }
2014-01-05 19:01:57 +01:00
}
2013-07-14 17:26:30 +02:00
} ,
selection_box = {
2014-01-05 19:01:57 +01:00
type = " fixed " ,
fixed = {
2014-01-08 08:27:10 +01:00
{ 0.25 , - 0.25 , 0.5 , - 0.25 , 0.5 , 0.47 } ,
{ 0.1875 , - 0.3125 , 0.5 , - 0.1875 , - 0.25 , 0.47 } ,
{ 0.125 , - 0.3125 , 0.5 , - 0.125 , - 0.375 , 0.47 } ,
{ 0.0625 , - 0.375 , 0.5 , - 0.0625 , - 0.437 , 0.47 }
2014-01-05 19:01:57 +01:00
}
2013-07-14 17:26:30 +02:00
} ,
2014-01-08 08:27:10 +01:00
tiles = { " arrow_sign_border_left.png " , " arrow_sign_border_right.png " , " arrow_sign_border_up.png " , " arrow_sign_border_down.png " , " arrow_sign.png " , " arrow_sign.png " } ,
2014-01-05 19:01:57 +01:00
inventory_image = " arrow_sign.png " ,
2013-07-14 17:26:30 +02:00
paramtype = " light " ,
2014-01-05 19:01:57 +01:00
paramtype2 = " facedir " ,
2013-07-14 17:26:30 +02:00
sunlight_propagates = true ,
walkable = false ,
2014-01-05 19:01:57 +01:00
groups = { choppy = 2 , dig_immediate = 2 , sign = 1 } ,
2013-07-14 17:26:30 +02:00
sounds = default.node_sound_defaults ( ) ,
2014-03-19 05:43:07 +01:00
on_place = arrow_signs_on_place ,
2013-07-14 17:26:30 +02:00
on_construct = function ( pos )
2014-01-05 19:01:57 +01:00
--local n = minetest.get_node(pos)
local meta = minetest.get_meta ( pos )
2013-07-14 17:26:30 +02:00
meta : set_string ( " formspec " , " hack:sign_text_input " )
meta : set_string ( " infotext " , " \" \" " )
end ,
on_receive_fields = function ( pos , formname , fields , sender )
arrow_signs : savetext ( pos , formname , fields , sender )
end ,
} )
2014-01-05 19:01:57 +01:00
--Recipes
2013-07-14 17:26:30 +02:00
minetest.register_craft ( {
2014-01-05 19:01:57 +01:00
type = ' shapeless ' ,
output = ' arrow_signs:wall ' ,
recipe = { ' group:sign ' , ' default:stick ' } ,
2013-07-14 17:26:30 +02:00
} )
minetest.register_craft ( {
output = ' default:sign_wall ' ,
recipe = {
{ ' group:sign ' } ,
}
} )
2014-01-05 19:01:57 +01:00
--Redefinition
minetest.register_abm ( {
2014-03-19 06:06:34 +01:00
nodenames = { " arrow_signs:wall_right " , " arrow_signs:wall_left " , " arrow_signs:wall_up " , " arrow_signs:wall_down " ,
" more_signs:wall_right " , " more_signs:wall_left " , " more_signs:wall_up " , " more_signs:wall_down "
} ,
2014-01-05 19:01:57 +01:00
interval = 1 ,
chance = 1 ,
action = function ( pos , node )
local convert_facedir = {
2014-03-19 06:06:34 +01:00
[ " arrow_signs:wall_right " ] = { 6 , 4 , 5 , 11 , 16 , 14 } ,
[ " arrow_signs:wall_left " ] = { 8 , 10 , 9 , 7 , 12 , 18 } ,
[ " arrow_signs:wall_up " ] = { 15 , 19 , 23 , 21 , 20 , 22 } ,
[ " arrow_signs:wall_down " ] = { 17 , 13 , 1 , 3 , 0 , 2 } ,
-- For old mod
[ " more_signs:wall_right " ] = { 6 , 4 , 5 , 11 , 16 , 14 } ,
[ " more_signs:wall_left " ] = { 8 , 10 , 9 , 7 , 12 , 18 } ,
[ " more_signs:wall_up " ] = { 15 , 19 , 23 , 21 , 20 , 22 } ,
[ " more_signs:wall_down " ] = { 17 , 13 , 1 , 3 , 0 , 2 } ,
2014-01-05 19:01:57 +01:00
}
2014-01-08 08:27:10 +01:00
minetest.swap_node ( pos , { name = " arrow_signs:wall " , param2 = convert_facedir [ node.name ] [ node.param2 + 1 ] } )
2014-01-05 19:01:57 +01:00
end ,
} )
2013-07-14 17:26:30 +02:00
2014-01-05 19:01:57 +01:00
--Locked sign
2013-07-14 17:26:30 +02:00
if locks then
local MODPATH = minetest.get_modpath ( " arrow_signs " ) ;
dofile ( MODPATH .. " /shared_locked.lua " )
end