Rename mod to 'giftbox2'
[minetest_giftbox2.git] / init.lua
blob3dd0dbb3a33469742778c8ef6ca81e7b7bfa9630
1 --------------------------------------------------------
2 -- Minetest :: Giftbox2 Mod (giftbox2)
3 --
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)
15 end
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
20 end
21 local STATUS_SIGNATURE_SET = "[giftbox2] %s sets message '%s' to %s at %s"
23 local config = minetest.load_config( )
25 local box_colors = {
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},
39 local sounds, gui_bg
40 if minetest.get_modpath("default") then
41 sounds = default.node_sound_dirt_defaults()
42 gui_bg = default.gui_bg .. default.gui_bg_img
43 else
44 gui_bg = ""
45 end
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],
51 drawtype = "mesh",
52 mesh = "giftbox.obj",
53 tiles = { "giftbox_" .. color .. ".png" },
54 use_texture_alpha = "clip",
55 paramtype = "light",
56 visual_scale = 0.45,
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 },
61 sounds = sounds,
62 paramtype2 = "facedir",
64 selection_box = {
65 type = "fixed",
66 fixed = {
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 )
91 end
92 end,
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))
103 end,
104 on_open = function ( pos, player, fields )
105 local meta = minetest.get_meta( pos )
106 local formspec =
107 "size[8,3]" ..
108 gui_bg ..
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
118 return formspec
119 end
120 end,
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
134 local infotext = ""
136 if fields.message ~= "" and string.len( fields.message ) < 1 then
137 minetest.chat_send_player( owner, S("The specified message is too short.") )
138 return
139 elseif string.len( fields.message ) > 250 then
140 minetest.chat_send_player( owner, S("The specified message is too long.") )
141 return
142 elseif fields.receiver == owner then
143 minetest.chat_send_player( owner, S("You cannot give a gift to yourself.") )
144 return
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.") )
147 return
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
154 -- public gift box
155 if fields.message == "" then
156 infotext = S(config.giftbox_public_infotext1)
157 else
158 infotext = S(config.giftbox_public_infotext2, fields.message)
160 else
161 -- private gift box
162 if fields.message == "" then
163 infotext = S(config.giftbox_private_infotext1, fields.receiver)
164 else
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 )
179 end,
182 minetest.register_craft( {
183 output = "giftbox2:giftbox_" .. color,
184 recipe = {
185 { "wool:" .. color, "farming:cotton", "wool:" .. color },
186 { "default:paper", "default:mese_crystal", "default:paper" },
187 { "wool:" .. color, "default:paper", "wool:" .. color },
191 if colortab[3] then
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" )