1 --------------------------------------------------------
2 -- Minetest :: Giftbox2 Mod (giftbox2)
4 -- See README.txt for licensing and other information.
5 -- Copyright (c) 2016-2021, Leslie E. Krause and Wuzzy
6 --------------------------------------------------------
8 local S
= minetest
.get_translator("giftbox2")
9 local F
= minetest
.formspec_escape
11 local OWNER_NOBODY
= ""
12 local set_owner
= function( pos
, player_name
)
13 local meta
= minetest
.get_meta(pos
)
14 meta
:set_string("owner", player_name
)
16 local is_owner
= function( pos
, player_name
)
17 local meta
= minetest
.get_meta(pos
)
18 local owner
= meta
:get_string("owner")
19 return owner
== player_name
21 local STATUS_SIGNATURE_SET
= "[giftbox2] %s sets message '%s' to %s at %s"
23 local config
= minetest
.load_config( )
26 -- color, decription, alias
27 { "black", S("Black Gift Box"), true},
28 { "blue", S("Blue Gift Box"), true},
29 { "cyan", S("Cyan Gift Box"), true},
30 { "green", S("Green Gift Box"), true},
31 { "magenta", S("Magenta Gift Box"), true},
32 { "red", S("Red Gift Box"), true},
33 { "white", S("White Gift Box"), true},
34 { "yellow", S("Yellow Gift Box"), true},
35 { "orange", S("Orange Gift Box"), false},
36 { "violet", S("Violet Gift Box"), false},
40 if minetest
.get_modpath("default") then
41 sounds
= default
.node_sound_dirt_defaults()
42 gui_bg
= default
.gui_bg
.. default
.gui_bg_img
47 for i
, colortab
in ipairs( box_colors
) do
48 local color
= colortab
[1]
49 minetest
.register_node( "giftbox2:giftbox_" .. color
, {
50 description
= colortab
[2],
53 tiles
= { "giftbox_" .. color
.. ".png" },
54 use_texture_alpha
= "clip",
57 wield_scale
= { x
= 0.45, y
= 0.45, z
= 0.45 },
58 sunlight_propagates
= true,
59 is_ground_content
= false,
60 groups
= { choppy
= 2, oddly_breakable_by_hand
= 2, flammable
= 1 },
62 paramtype2
= "facedir",
67 { -0.45, -0.5, -0.45, 0.45, 0.45, 0.45 },
71 drop
= { max_items
= 1, items
= config
.giftbox_drops
},
73 on_dig
= function ( pos
, node
, player
)
74 local digger
= player
:get_player_name( )
75 local receiver
= minetest
.get_meta( pos
):get_string( "receiver" )
77 if not minetest
.is_protected( pos
, digger
) then
78 -- always allow owner to dig node, but still obey protection
79 minetest
.handle_node_drops( pos
, { node
.name
}, player
)
80 minetest
.remove_node( pos
)
81 minetest
.check_for_falling( pos
)
83 elseif receiver
== digger
or receiver
== OWNER_NOBODY
then
84 -- otherwise drop random items directly for receiver (if any)
85 -- this is necessary to bypass protection checks
86 local drops
= minetest
.get_node_drops( node
.name
, player
:get_wielded_item( ):get_name( ) )
88 minetest
.handle_node_drops( pos
, drops
, player
)
89 minetest
.remove_node( pos
)
90 minetest
.check_for_falling( pos
)
93 after_place_node
= function ( pos
, player
)
94 local placer
= player
:get_player_name( ) or "singleplayer"
95 local meta
= minetest
.get_meta( pos
)
97 set_owner( pos
, placer
)
98 meta
:set_string( "receiver", OWNER_NOBODY
)
99 meta
:set_string( "is_anonymous", "false" )
101 -- initial item string: Gift Box (from <placer>)
102 meta
:set_string( "infotext", S("@1 (from @2)", S(config
.giftbox_public_infotext1
), placer
))
104 on_open
= function ( pos
, player
, fields
)
105 local meta
= minetest
.get_meta( pos
)
109 "button_exit[6,2.5;2,0.3;save;"..F(S("Save")).."]" ..
110 "checkbox[4.5,1.3;is_anonymous;"..F(S("Anonymous Sender"))..";" .. meta
:get_string( "is_anonymous" ) .. "]" ..
111 "label[0.1,0;"..F(S("Personalize your greeting (or leave blank for the default):")).."]" ..
112 "field[0.4,1;7.8,0.25;message;;" .. F( meta
:get_string( "message" ) ) .. "]" ..
113 "label[0.1,1.5;"..F(S("Recipient:")).."]" ..
114 "field[1.8,1.9;2.5,0.25;receiver;;" .. meta
:get_string( "receiver" ) .. "]"
116 -- only placer of gift box should edit properties, not the receiver
117 if is_owner( pos
, player
:get_player_name( ) ) then
121 on_close
= function ( pos
, player
, fields
)
122 local owner
= player
:get_player_name( )
123 local meta
= minetest
.get_meta( pos
)
125 -- only placer of gift box should edit properties, not the receiver
126 if not is_owner( pos
, owner
) then return end
128 if fields
.is_anonymous
then
129 -- in next version of active formspecs, we should save checkbox state
130 -- in form meta first rather than directly to node meta
131 meta
:set_string( "is_anonymous", fields
.is_anonymous
)
133 elseif fields
.save
and fields
.message
and fields
.receiver
then
136 if fields
.message
~= "" and string.len( fields
.message
) < 1 then
137 minetest
.chat_send_player( owner
, S("The specified message is too short.") )
139 elseif string.len( fields
.message
) > 250 then
140 minetest
.chat_send_player( owner
, S("The specified message is too long.") )
142 elseif fields
.receiver
== owner
then
143 minetest
.chat_send_player( owner
, S("You cannot give a gift to yourself.") )
145 elseif fields
.receiver
~= OWNER_NOBODY
and not string.find( fields
.receiver
, "^[-_A-Za-z0-9]+$" ) then
146 minetest
.chat_send_player( owner
, S("The specified recipient is invalid.") )
150 -- item string with message: Dear sorcerykid: "Happy holidays!" (placed by sorcerykid)
151 -- item string without message: Gift Box for maikerumine (placed by sorcerykid)
153 if fields
.receiver
== OWNER_NOBODY
then
155 if fields
.message
== "" then
156 infotext
= S(config
.giftbox_public_infotext1
)
158 infotext
= S(config
.giftbox_public_infotext2
, fields
.message
)
162 if fields
.message
== "" then
163 infotext
= S(config
.giftbox_private_infotext1
, fields
.receiver
)
165 infotext
= S(config
.giftbox_private_infotext2
, fields
.receiver
, fields
.message
)
169 if meta
:get_string( "is_anonymous" ) == "false" then
170 infotext
= S("@1 (from @2)", infotext
, owner
)
173 minetest
.log( "action", string.format( STATUS_SIGNATURE_SET
, player
:get_player_name( ), fields
.message
, "gift box", minetest
.pos_to_string( pos
) ) )
175 meta
:set_string( "receiver", fields
.receiver
)
176 meta
:set_string( "message", fields
.message
)
177 meta
:set_string( "infotext", infotext
)
182 minetest
.register_craft( {
183 output
= "giftbox2:giftbox_" .. color
,
185 { "wool:" .. color
, "farming:cotton", "wool:" .. color
},
186 { "default:paper", "default:mese_crystal", "default:paper" },
187 { "wool:" .. color
, "default:paper", "wool:" .. color
},
192 minetest
.register_alias("giftbox:giftbox_"..color
, "giftbox2:giftbox_"..color
)
196 minetest
.register_alias( "mt_seasons:gift_box_brown", "giftbox2:giftbox_orange" )
197 minetest
.register_alias( "mt_seasons:gift_box_dark_green", "giftbox2:giftbox_green" )
198 minetest
.register_alias( "mt_seasons:gift_box_dark_grey", "giftbox2:giftbox_black" )
199 minetest
.register_alias( "mt_seasons:gift_box_grey", "giftbox2:giftbox_white" )
200 minetest
.register_alias( "mt_seasons:gift_box_orange", "giftbox2:giftbox_orange" )
201 minetest
.register_alias( "mt_seasons:gift_box_pink", "giftbox2:giftbox_red" )
202 minetest
.register_alias( "mt_seasons:gift_box_violet", "giftbox2:giftbox_violet" )
204 minetest
.register_alias( "mt_seasons:gift_box_red", "giftbox2:giftbox_red" )
205 minetest
.register_alias( "mt_seasons:gift_box_green", "giftbox2:giftbox_green" )
206 minetest
.register_alias( "mt_seasons:gift_box_blue", "giftbox2:giftbox_blue" )
207 minetest
.register_alias( "mt_seasons:gift_box_cyan", "giftbox2:giftbox_cyan" )
208 minetest
.register_alias( "mt_seasons:gift_box_magenta", "giftbox2:giftbox_magenta" )
209 minetest
.register_alias( "mt_seasons:gift_box_yellow", "giftbox2:giftbox_yellow" )
210 minetest
.register_alias( "mt_seasons:gift_box_white", "giftbox2:giftbox_white" )
211 minetest
.register_alias( "mt_seasons:gift_box_black", "giftbox2:giftbox_black" )