1 --[[ Drawtype Test: This file tests out and provides examples for
2 all drawtypes in Minetest. It is attempted to keep the node
3 definitions as simple and minimal as possible to keep
4 side-effects to a minimum.
6 How to read the node definitions:
7 There are two parts which are separated by 2 newlines:
8 The first part contains the things that are more or less essential
9 for defining the drawtype (except description, which is
10 at the top for readability).
11 The second part (after the 2 newlines) contains stuff that are
12 unrelated to the drawtype, stuff that is mostly there to make
13 testing this node easier and more convenient.
16 local S = minetest.get_translator("testnodes")
18 -- If set to true, will show an inventory image for nodes that have no inventory image as of Minetest 5.1.0.
19 -- This is due to <https://github.com/minetest/minetest/issues/9209>.
20 -- This is only added to make the items more visible to avoid confusion, but you will no longer see
21 -- the default inventory images for these items. When you want to test the default inventory image of drawtypes,
22 -- this should be turned off.
23 -- TODO: Remove support for fallback inventory image as soon #9209 is fixed.
24 local SHOW_FALLBACK_IMAGE = minetest.settings:get_bool("testnodes_show_fallback_image", false)
26 local fallback_image = function(img)
27 if SHOW_FALLBACK_IMAGE then
35 minetest.register_node("testnodes:normal", {
36 description = S("Normal Drawtype Test Node"),
38 tiles = { "testnodes_normal.png" },
40 groups = { dig_immediate = 3 },
43 -- Standard glasslike node
44 minetest.register_node("testnodes:glasslike", {
45 description = S("Glasslike Drawtype Test Node"),
46 drawtype = "glasslike",
48 tiles = { "testnodes_glasslike.png" },
50 groups = { dig_immediate = 3 },
53 -- Glasslike framed with the two textures (normal and "detail")
54 minetest.register_node("testnodes:glasslike_framed", {
55 description = S("Glasslike Framed Drawtype Test Node"),
56 drawtype = "glasslike_framed",
59 "testnodes_glasslike_framed.png",
60 "testnodes_glasslike_detail.png",
64 sunlight_propagates = true,
65 groups = { dig_immediate = 3 },
68 -- Like the one above, but without the "detail" texture (texture 2).
69 -- This node was added to see how the engine behaves when the "detail" texture
71 minetest.register_node("testnodes:glasslike_framed_no_detail", {
72 description = S("Glasslike Framed without Detail Drawtype Test Node"),
73 drawtype = "glasslike_framed",
75 tiles = { "testnodes_glasslike_framed2.png" },
78 sunlight_propagates = true,
79 groups = { dig_immediate = 3 },
83 minetest.register_node("testnodes:glasslike_framed_optional", {
84 description = S("Glasslike Framed Optional Drawtype Test Node"),
85 drawtype = "glasslike_framed_optional",
88 "testnodes_glasslike_framed_optional.png",
89 "testnodes_glasslike_detail.png",
93 sunlight_propagates = true,
94 groups = { dig_immediate = 3 },
99 minetest.register_node("testnodes:allfaces", {
100 description = S("Allfaces Drawtype Test Node"),
101 drawtype = "allfaces",
103 tiles = { "testnodes_allfaces.png" },
105 groups = { dig_immediate = 3 },
108 minetest.register_node("testnodes:allfaces_optional", {
109 description = S("Allfaces Optional Drawtype Test Node"),
110 drawtype = "allfaces_optional",
112 tiles = { "testnodes_allfaces_optional.png" },
114 groups = { dig_immediate = 3 },
117 minetest.register_node("testnodes:allfaces_optional_waving", {
118 description = S("Waving Allfaces Optional Drawtype Test Node"),
119 drawtype = "allfaces_optional",
121 tiles = { "testnodes_allfaces_optional.png^[brighten" },
124 groups = { dig_immediate = 3 },
127 minetest.register_node("testnodes:firelike", {
128 description = S("Firelike Drawtype Test Node"),
129 drawtype = "firelike",
131 tiles = { "testnodes_firelike.png" },
135 groups = { dig_immediate = 3 },
138 minetest.register_node("testnodes:fencelike", {
139 description = S("Fencelike Drawtype Test Node"),
140 drawtype = "fencelike",
142 tiles = { "testnodes_fencelike.png" },
144 groups = { dig_immediate = 3 },
147 minetest.register_node("testnodes:torchlike", {
148 description = S("Torchlike Drawtype Test Node"),
149 drawtype = "torchlike",
152 "testnodes_torchlike_floor.png",
153 "testnodes_torchlike_ceiling.png",
154 "testnodes_torchlike_wall.png",
159 sunlight_propagates = true,
160 groups = { dig_immediate = 3 },
161 inventory_image = fallback_image("testnodes_torchlike_floor.png"),
164 minetest.register_node("testnodes:torchlike_wallmounted", {
165 description = S("Wallmounted Torchlike Drawtype Test Node"),
166 drawtype = "torchlike",
168 paramtype2 = "wallmounted",
170 "testnodes_torchlike_floor.png",
171 "testnodes_torchlike_ceiling.png",
172 "testnodes_torchlike_wall.png",
177 sunlight_propagates = true,
178 groups = { dig_immediate = 3 },
179 inventory_image = fallback_image("testnodes_torchlike_floor.png"),
184 minetest.register_node("testnodes:signlike", {
185 description = S("Wallmounted Signlike Drawtype Test Node"),
186 drawtype = "signlike",
188 paramtype2 = "wallmounted",
189 tiles = { "testnodes_signlike.png" },
193 groups = { dig_immediate = 3 },
194 sunlight_propagates = true,
195 inventory_image = fallback_image("testnodes_signlike.png"),
198 minetest.register_node("testnodes:plantlike", {
199 description = S("Plantlike Drawtype Test Node"),
200 drawtype = "plantlike",
202 tiles = { "testnodes_plantlike.png" },
206 sunlight_propagates = true,
207 groups = { dig_immediate = 3 },
210 minetest.register_node("testnodes:plantlike_waving", {
211 description = S("Waving Plantlike Drawtype Test Node"),
212 drawtype = "plantlike",
214 tiles = { "testnodes_plantlike_waving.png" },
219 sunlight_propagates = true,
220 groups = { dig_immediate = 3 },
225 -- param2 will rotate
226 local function rotate_on_rightclick(pos, node, clicker)
227 local def = minetest.registered_nodes[node.name]
228 local aux1 = clicker:get_player_control().aux1
231 local color, color_mult = 0, 0
232 if def.paramtype2 == "degrotate" then
235 elseif def.paramtype2 == "colordegrotate" then
236 -- MSB [3x color, 5x rotation] LSB
237 deg = node.param2 % 2^5
240 color = math.floor(node.param2 / color_mult)
243 deg = (deg + (aux1 and 10 or 1)) % deg_max
244 node.param2 = color * color_mult + deg
245 minetest.swap_node(pos, node)
246 minetest.chat_send_player(clicker:get_player_name(),
247 "Rotation is now " .. deg .. " / " .. deg_max)
250 minetest.register_node("testnodes:plantlike_degrotate", {
251 description = S("Degrotate Plantlike Drawtype Test Node"),
252 drawtype = "plantlike",
254 paramtype2 = "degrotate",
255 tiles = { "testnodes_plantlike_degrotate.png" },
257 on_rightclick = rotate_on_rightclick,
260 sunlight_propagates = true,
261 groups = { dig_immediate = 3 },
264 minetest.register_node("testnodes:mesh_degrotate", {
265 description = S("Degrotate Mesh Drawtype Test Node"),
268 paramtype2 = "degrotate",
269 mesh = "testnodes_pyramid.obj",
270 tiles = { "testnodes_mesh_stripes2.png" },
272 on_rightclick = rotate_on_rightclick,
274 sunlight_propagates = true,
275 groups = { dig_immediate = 3 },
278 minetest.register_node("testnodes:mesh_colordegrotate", {
279 description = S("Color Degrotate Mesh Drawtype Test Node"),
281 paramtype2 = "colordegrotate",
282 palette = "testnodes_palette_facedir.png",
283 mesh = "testnodes_pyramid.obj",
284 tiles = { "testnodes_mesh_stripes2.png" },
286 on_rightclick = rotate_on_rightclick,
287 -- color index 1, 7 steps rotated
288 place_param2 = 1 * 2^5 + 7,
289 sunlight_propagates = true,
290 groups = { dig_immediate = 3 },
293 -- param2 will change height
294 minetest.register_node("testnodes:plantlike_leveled", {
295 description = S("Leveled Plantlike Drawtype Test Node"),
296 drawtype = "plantlike",
298 paramtype2 = "leveled",
300 { name = "testnodes_plantlike_leveled.png", tileable_vertical = true },
304 -- We set a default param2 here only for convenience, to make the "plant" visible after placement
307 sunlight_propagates = true,
308 groups = { dig_immediate = 3 },
311 -- param2 changes shape
312 minetest.register_node("testnodes:plantlike_meshoptions", {
313 description = S("Meshoptions Plantlike Drawtype Test Node"),
314 drawtype = "plantlike",
316 paramtype2 = "meshoptions",
317 tiles = { "testnodes_plantlike_meshoptions.png" },
321 groups = { dig_immediate = 3 },
324 minetest.register_node("testnodes:plantlike_rooted", {
325 description = S("Rooted Plantlike Drawtype Test Node"),
326 drawtype = "plantlike_rooted",
328 tiles = { "testnodes_plantlike_rooted_base.png" },
329 special_tiles = { "testnodes_plantlike_rooted.png" },
331 groups = { dig_immediate = 3 },
334 minetest.register_node("testnodes:plantlike_rooted_waving", {
335 description = S("Waving Rooted Plantlike Drawtype Test Node"),
336 drawtype = "plantlike_rooted",
339 "testnodes_plantlike_rooted_base.png",
340 "testnodes_plantlike_rooted_base.png",
341 "testnodes_plantlike_rooted_base_side_waving.png",
343 special_tiles = { "testnodes_plantlike_rooted_waving.png" },
346 groups = { dig_immediate = 3 },
349 -- param2 changes height
350 minetest.register_node("testnodes:plantlike_rooted_leveled", {
351 description = S("Leveled Rooted Plantlike Drawtype Test Node"),
352 drawtype = "plantlike_rooted",
354 paramtype2 = "leveled",
356 "testnodes_plantlike_rooted_base.png",
357 "testnodes_plantlike_rooted_base.png",
358 "testnodes_plantlike_rooted_base_side_leveled.png",
361 { name = "testnodes_plantlike_rooted_leveled.png", tileable_vertical = true },
365 -- We set a default param2 here only for convenience, to make the "plant" visible after placement
367 groups = { dig_immediate = 3 },
370 -- param2 changes shape
371 minetest.register_node("testnodes:plantlike_rooted_meshoptions", {
372 description = S("Meshoptions Rooted Plantlike Drawtype Test Node"),
373 drawtype = "plantlike_rooted",
375 paramtype2 = "meshoptions",
377 "testnodes_plantlike_rooted_base.png",
378 "testnodes_plantlike_rooted_base.png",
379 "testnodes_plantlike_rooted_base_side_meshoptions.png",
382 "testnodes_plantlike_rooted_meshoptions.png",
385 groups = { dig_immediate = 3 },
388 -- param2 changes rotation
389 minetest.register_node("testnodes:plantlike_rooted_degrotate", {
390 description = S("Degrotate Rooted Plantlike Drawtype Test Node"),
391 drawtype = "plantlike_rooted",
393 paramtype2 = "degrotate",
395 "testnodes_plantlike_rooted_base.png",
396 "testnodes_plantlike_rooted_base.png",
397 "testnodes_plantlike_rooted_base_side_degrotate.png",
400 "testnodes_plantlike_rooted_degrotate.png",
403 groups = { dig_immediate = 3 },
406 -- Demonstrative liquid nodes, source and flowing form.
407 -- DRAWTYPE ONLY, NO LIQUID PHYSICS!
408 -- Liquid ranges 0 to 8
410 minetest.register_node("testnodes:liquid_"..r, {
411 description = S("Source Liquid Drawtype Test Node, Range @1", r),
415 "testnodes_liquidsource_r"..r..".png^[colorize:#FFFFFF:100",
418 {name="testnodes_liquidsource_r"..r..".png^[colorize:#FFFFFF:100", backface_culling=false},
419 {name="testnodes_liquidsource_r"..r..".png^[colorize:#FFFFFF:100", backface_culling=true},
421 use_texture_alpha = "blend",
426 liquid_viscosity = 0,
427 liquid_alternative_flowing = "testnodes:liquid_flowing_"..r,
428 liquid_alternative_source = "testnodes:liquid_"..r,
429 groups = { dig_immediate = 3 },
431 minetest.register_node("testnodes:liquid_flowing_"..r, {
432 description = S("Flowing Liquid Drawtype Test Node, Range @1", r),
433 drawtype = "flowingliquid",
435 paramtype2 = "flowingliquid",
437 "testnodes_liquidflowing_r"..r..".png^[colorize:#FFFFFF:100",
440 {name="testnodes_liquidflowing_r"..r..".png^[colorize:#FFFFFF:100", backface_culling=false},
441 {name="testnodes_liquidflowing_r"..r..".png^[colorize:#FFFFFF:100", backface_culling=false},
443 use_texture_alpha = "blend",
448 liquid_viscosity = 0,
449 liquid_alternative_flowing = "testnodes:liquid_flowing_"..r,
450 liquid_alternative_source = "testnodes:liquid_"..r,
451 groups = { dig_immediate = 3 },
456 -- Waving liquid test (drawtype only)
457 minetest.register_node("testnodes:liquid_waving", {
458 description = S("Waving Source Liquid Drawtype Test Node"),
462 "testnodes_liquidsource.png^[colorize:#0000FF:127",
465 {name="testnodes_liquidsource.png^[colorize:#0000FF:127", backface_culling=false},
466 {name="testnodes_liquidsource.png^[colorize:#0000FF:127", backface_culling=true},
468 use_texture_alpha = "blend",
474 liquid_viscosity = 0,
475 liquid_alternative_flowing = "testnodes:liquid_flowing_waving",
476 liquid_alternative_source = "testnodes:liquid_waving",
477 groups = { dig_immediate = 3 },
479 minetest.register_node("testnodes:liquid_flowing_waving", {
480 description = S("Waving Flowing Liquid Drawtype Test Node"),
481 drawtype = "flowingliquid",
483 paramtype2 = "flowingliquid",
485 "testnodes_liquidflowing.png^[colorize:#0000FF:127",
488 {name="testnodes_liquidflowing.png^[colorize:#0000FF:127", backface_culling=false},
489 {name="testnodes_liquidflowing.png^[colorize:#0000FF:127", backface_culling=false},
491 use_texture_alpha = "blend",
497 liquid_viscosity = 0,
498 liquid_alternative_flowing = "testnodes:liquid_flowing_waving",
499 liquid_alternative_source = "testnodes:liquid_waving",
500 groups = { dig_immediate = 3 },
504 minetest.register_node("testnodes:airlike", {
505 description = S("Airlike Drawtype Test Node"),
506 drawtype = "airlike",
511 groups = { dig_immediate = 3 },
512 sunlight_propagates = true,
513 inventory_image = fallback_image("testnodes_airlike.png"),
516 -- param2 changes liquid height
517 minetest.register_node("testnodes:glassliquid", {
518 description = S("Glasslike Liquid Level Drawtype Test Node"),
519 drawtype = "glasslike_framed",
521 paramtype2 = "glasslikeliquidlevel",
523 "testnodes_glasslikeliquid.png",
526 "testnodes_liquid.png",
529 groups = { dig_immediate = 3 },
532 -- Adding many raillike examples, primarily to demonstrate the behavior of
533 -- "raillike groups". Nodes of the same type (rail, groupless, line, street)
534 -- should connect to nodes of the same "rail type" (=same shape, different
537 { "rail", {"testnodes_rail_straight.png", "testnodes_rail_curved.png", "testnodes_rail_t_junction.png", "testnodes_rail_crossing.png"} },
538 { "line", {"testnodes_line_straight.png", "testnodes_line_curved.png", "testnodes_line_t_junction.png", "testnodes_line_crossing.png"}, },
539 { "street", {"testnodes_street_straight.png", "testnodes_street_curved.png", "testnodes_street_t_junction.png", "testnodes_street_crossing.png"}, },
540 -- the "groupless" nodes are nodes in which the "connect_to_raillike" group is not set
541 { "groupless", {"testnodes_rail2_straight.png", "testnodes_rail2_curved.png", "testnodes_rail2_t_junction.png", "testnodes_rail2_crossing.png"} },
543 local colors = { "", "cyan", "red" }
546 local id = rails[r][1]
547 local tiles = rails[r][2]
549 if id ~= "groupless" then
550 raillike_group = minetest.raillike_group(id)
554 if colors[c] ~= "" then
557 minetest.register_node("testnodes:raillike_"..id..c, {
558 description = S("Raillike Drawtype Test Node: @1 @2", id, c),
559 drawtype = "raillike",
562 groups = { connect_to_raillike = raillike_group, dig_immediate = 3 },
568 fixed = {{-0.5, -0.5, -0.5, 0.5, -0.4, 0.5}},
570 sunlight_propagates = true,
578 -- Add visual_scale variants of previous nodes for half and double size
579 local scale = function(subname, desc_double, desc_half)
580 local original = "testnodes:"..subname
581 local def = table.copy(minetest.registered_items[original])
582 def.visual_scale = 2.0
583 def.description = desc_double
584 minetest.register_node("testnodes:"..subname.."_double", def)
585 def = table.copy(minetest.registered_items[original])
586 def.visual_scale = 0.5
587 def.description = desc_half
588 minetest.register_node("testnodes:"..subname.."_half", def)
592 S("Double-sized Allfaces Drawtype Test Node"),
593 S("Half-sized Allfaces Drawtype Test Node"))
594 scale("allfaces_optional",
595 S("Double-sized Allfaces Optional Drawtype Test Node"),
596 S("Half-sized Allfaces Optional Drawtype Test Node"))
597 scale("allfaces_optional_waving",
598 S("Double-sized Waving Allfaces Optional Drawtype Test Node"),
599 S("Half-sized Waving Allfaces Optional Drawtype Test Node"))
601 S("Double-sized Plantlike Drawtype Test Node"),
602 S("Half-sized Plantlike Drawtype Test Node"))
603 scale("torchlike_wallmounted",
604 S("Double-sized Wallmounted Torchlike Drawtype Test Node"),
605 S("Half-sized Wallmounted Torchlike Drawtype Test Node"))
607 S("Double-sized Wallmounted Signlike Drawtype Test Node"),
608 S("Half-sized Wallmounted Signlike Drawtype Test Node"))
610 S("Double-sized Firelike Drawtype Test Node"),
611 S("Half-sized Firelike Drawtype Test Node"))