aboutsummaryrefslogtreecommitdiff
path: root/po/de/minetest.po
blob: 4b22855a317f5b8b9dcabc2c99e3d54e7dafafa3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
# German translations for minetest-c55 package.
# Copyright (C) 2011 celeron
# This file is distributed under the same license as the minetest-c55 package.
# Constantin Wenger <constantin.wenger@googlemail.com>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: 0.0.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-08-02 12:36+0200\n"
"PO-Revision-Date: 2011-08-02 11:54+0100\n"
"Last-Translator: Constantin Wenger <constantin.wenger@googlemail.com>\n"
"Language-Team: Deutsch <>\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n!=1);\n"

#: src/guiKeyChangeMenu.cpp:84
msgid "KEYBINDINGS"
msgstr "TASTEN EINST."

#: src/guiKeyChangeMenu.cpp:94
msgid "Forward"
msgstr "Vorwärts"

#: src/guiKeyChangeMenu.cpp:111
msgid "Backward"
msgstr "Rückwärts"

#: src/guiKeyChangeMenu.cpp:127 src/guiKeyChangeMenu.h:38
msgid "Left"
msgstr "Links"

#: src/guiKeyChangeMenu.cpp:142 src/guiKeyChangeMenu.h:38
msgid "Right"
msgstr "Rechts"

#: src/guiKeyChangeMenu.cpp:158
msgid "Use"
msgstr "Benutzen"

#: src/guiKeyChangeMenu.cpp:173
msgid "Sneak"
msgstr "Kriechen"

#: src/guiKeyChangeMenu.cpp:189
msgid "Jump"
msgstr "Springen"

#: src/guiKeyChangeMenu.cpp:204
msgid "Inventory"
msgstr "Inventar"

#: src/guiKeyChangeMenu.cpp:220
msgid "Chat"
msgstr "Chat"

#: src/guiKeyChangeMenu.cpp:236
msgid "Toggle fly"
msgstr "Fliegen umsch."

#: src/guiKeyChangeMenu.cpp:251
msgid "Toggle fast"
msgstr "Speed umsch."

#: src/guiKeyChangeMenu.cpp:266
msgid "Range select"
msgstr "Entfernung wählen"

#: src/guiKeyChangeMenu.cpp:283
msgid "Print stacks"
msgstr "Stack ausgeben"

#: src/guiKeyChangeMenu.cpp:298
msgid "Save"
msgstr "Speichern"

#: src/guiKeyChangeMenu.cpp:304 src/guiKeyChangeMenu.h:33
msgid "Cancel"
msgstr "Abbrechen"

#: src/guiKeyChangeMenu.cpp:537 src/guiKeyChangeMenu.cpp:542
#: src/guiKeyChangeMenu.cpp:547 src/guiKeyChangeMenu.cpp:552
#: src/guiKeyChangeMenu.cpp:557 src/guiKeyChangeMenu.cpp:562
#: src/guiKeyChangeMenu.cpp:567 src/guiKeyChangeMenu.cpp:572
#: src/guiKeyChangeMenu.cpp:577 src/guiKeyChangeMenu.cpp:582
#: src/guiKeyChangeMenu.cpp:587 src/guiKeyChangeMenu.cpp:592
#: src/guiKeyChangeMenu.cpp:597
msgid "press Key"
msgstr "Taste drücken"

#: src/guiKeyChangeMenu.h:33
msgid "Left Button"
msgstr "linke Taste"

#: src/guiKeyChangeMenu.h:33
msgid "Middle Button"
msgstr ""

#: src/guiKeyChangeMenu.h:33
msgid "Right Button"
msgstr ""

#: src/guiKeyChangeMenu.h:33
msgid "X Button 1"
msgstr ""

#: src/guiKeyChangeMenu.h:34
msgid "Back"
msgstr "Rücktaste"

#: src/guiKeyChangeMenu.h:34
msgid "Clear"
msgstr "löschen"

#: src/guiKeyChangeMenu.h:34
msgid "Return"
msgstr "Return"

#: src/guiKeyChangeMenu.h:34
msgid "Tab"
msgstr "Tab"

#: src/guiKeyChangeMenu.h:34
msgid "X Button 2"
msgstr ""

#: src/guiKeyChangeMenu.h:35
msgid "Capital"
msgstr "Feststellen"

#: src/guiKeyChangeMenu.h:35
msgid "Control"
msgstr "Strg"

#: src/guiKeyChangeMenu.h:35
msgid "Kana"
msgstr ""

#: src/guiKeyChangeMenu.h:35
msgid "Menu"
msgstr "Menü"

#: src/guiKeyChangeMenu.h:35
msgid "Pause"
msgstr "Pause"

#: src/guiKeyChangeMenu.h:35
msgid "Shift"
msgstr "Umsch."

#: src/guiKeyChangeMenu.h:36
msgid "Convert"
msgstr ""

#: src/guiKeyChangeMenu.h:36
msgid "Escape"
msgstr "Escape"

#: src/guiKeyChangeMenu.h:36
msgid "Final"
msgstr ""

#: src/guiKeyChangeMenu.h:36
msgid "Junja"
msgstr ""

#: src/guiKeyChangeMenu.h:36
msgid "Kanji"
msgstr ""

#: src/guiKeyChangeMenu.h:36
msgid "Nonconvert"
msgstr ""

#: src/guiKeyChangeMenu.h:37
msgid "Accept"
msgstr "Annehmen"

#: src/guiKeyChangeMenu.h:37
msgid "End"
msgstr "Ende"

#: src/guiKeyChangeMenu.h:37
msgid "Home"
msgstr "Pos1"

#: src/guiKeyChangeMenu.h:37
msgid "Mode Change"
msgstr ""

#: src/guiKeyChangeMenu.h:37
msgid "Next"
msgstr "Bild runter"

#: src/guiKeyChangeMenu.h:37
msgid "Priot"
msgstr "Bild hoch"

#: src/guiKeyChangeMenu.h:37
msgid "Space"
msgstr "Leertaste"

#: src/guiKeyChangeMenu.h:38
msgid "Down"
msgstr "Runter"

#: src/guiKeyChangeMenu.h:38
msgid "Execute"
msgstr "Ausführen"

#: src/guiKeyChangeMenu.h:38
msgid "Print"
msgstr "Druck"

#: src/guiKeyChangeMenu.h:38
msgid "Select"
msgstr "Select"

#: src/guiKeyChangeMenu.h:38
msgid "Up"
msgstr "Hoch"

#: src/guiKeyChangeMenu.h:39
msgid "Delete"
msgstr "Entf"

#: src/guiKeyChangeMenu.h:39
msgid "Help"
msgstr "Hilfe"

#: src/guiKeyChangeMenu.h:39
msgid "Insert"
msgstr "Einfg"

#: src/guiKeyChangeMenu.h:39
msgid "Snapshot"
msgstr "Schnapschuss"

#: src/guiKeyChangeMenu.h:42
msgid "Left Windows"
msgstr "Win links"

#: src/guiKeyChangeMenu.h:43
msgid "Apps"
msgstr ""

#: src/guiKeyChangeMenu.h:43
msgid "Numpad 0"
msgstr "Ziffernblock 0"

#: src/guiKeyChangeMenu.h:43
msgid "Numpad 1"
msgstr "Ziffernblock 1"

#: src/guiKeyChangeMenu.h:43
msgid "Right Windows"
msgstr "Win rechts"

#: src/guiKeyChangeMenu.h:43
msgid "Sleep"
msgstr "Schlaf"

#: src/guiKeyChangeMenu.h:44
msgid "Numpad 2"
msgstr "Ziffernblock 2"

#: src/guiKeyChangeMenu.h:44
msgid "Numpad 3"
msgstr "Ziffernblock 3"

#: src/guiKeyChangeMenu.h:44
msgid "Numpad 4"
msgstr "Ziffernblock 4"

#: src/guiKeyChangeMenu.h:44
msgid "Numpad 5"
msgstr "Ziffernblock 5"

#: src/guiKeyChangeMenu.h:44
msgid "Numpad 6"
msgstr "Ziffernblock 6"

#: src/guiKeyChangeMenu.h:44
msgid "Numpad 7"
msgstr "Ziffernblock 7"

#: src/guiKeyChangeMenu.h:45
msgid "Numpad *"
msgstr "Ziffernblock *"

#: src/guiKeyChangeMenu.h:45
msgid "Numpad +"
msgstr "Ziffernblock +"

#: src/guiKeyChangeMenu.h:45
msgid "Numpad -"
msgstr "Ziffernblock -"

#: src/guiKeyChangeMenu.h:45
msgid "Numpad /"
msgstr "Ziffernblock /"

#: src/guiKeyChangeMenu.h:45
msgid "Numpad 8"
msgstr "Ziffernblock 8"

#: src/guiKeyChangeMenu.h:45
msgid "Numpad 9"
msgstr "Ziffernblock 9"

#: src/guiKeyChangeMenu.h:49
msgid "Num Lock"
msgstr "Num"

#: src/guiKeyChangeMenu.h:49
msgid "Scroll Lock"
msgstr "Rollen"

#: src/guiKeyChangeMenu.h:50
msgid "Left Shift"
msgstr "Umsch. links"

#: src/guiKeyChangeMenu.h:50
msgid "Right Shight"
msgstr "Umsch. rechts"

#: src/guiKeyChangeMenu.h:51
msgid "Left Control"
msgstr "Strg links"

#: src/guiKeyChangeMenu.h:51
msgid "Left Menu"
msgstr "Alt"

#: src/guiKeyChangeMenu.h:51
msgid "Right Control"
msgstr "Strg rechts"

#: src/guiKeyChangeMenu.h:51
msgid "Right Menu"
msgstr "Alt Gr"

#: src/guiKeyChangeMenu.h:53
msgid "Comma"
msgstr "Komma"

#: src/guiKeyChangeMenu.h:53
msgid "Minus"
msgstr "Minus"

#: src/guiKeyChangeMenu.h:53
msgid "Period"
msgstr "Punkt"

#: src/guiKeyChangeMenu.h:53
msgid "Plus"
msgstr "Plus"

#: src/guiKeyChangeMenu.h:57
msgid "Attn"
msgstr ""

#: src/guiKeyChangeMenu.h:57
msgid "CrSel"
msgstr ""

#: src/guiKeyChangeMenu.h:58
msgid "Erase OEF"
msgstr ""

#: src/guiKeyChangeMenu.h:58
msgid "ExSel"
msgstr ""

#: src/guiKeyChangeMenu.h:58
msgid "OEM Clear"
msgstr ""

#: src/guiKeyChangeMenu.h:58
msgid "PA1"
msgstr ""

#: src/guiKeyChangeMenu.h:58
msgid "Play"
msgstr "Play"

#: src/guiKeyChangeMenu.h:58
msgid "Zoom"
msgstr "Zoom"

#: src/guiMainMenu.cpp:181
msgid "Name/Password"
msgstr "Name/Passwort"

#: src/guiMainMenu.cpp:206
msgid "Address/Port"
msgstr "Adresse / Port"

#: src/guiMainMenu.cpp:228
msgid "Leave address blank to start a local server."
msgstr "Lasse die Adresse frei um einen eigenen Server zu starten"

#: src/guiMainMenu.cpp:235
msgid "Fancy trees"
msgstr "Schöne Bäume"

#: src/guiMainMenu.cpp:241
msgid "Smooth Lighting"
msgstr "Besseres Licht"

#: src/guiMainMenu.cpp:249
msgid "Start Game / Connect"
msgstr "Spiel starten / Verbinden"

#: src/guiMainMenu.cpp:258
msgid "Change keys"
msgstr "Tasten ändern"

#: src/guiMainMenu.cpp:281
msgid "Creative Mode"
msgstr "Kreativitätsmodus"

#: src/guiMainMenu.cpp:287
msgid "Enable Damage"
msgstr "Schaden einschalten"

#: src/guiMainMenu.cpp:295
msgid "Delete map"
msgstr "Karte löschen"

#: src/guiMessageMenu.cpp:94 src/guiTextInputMenu.cpp:112
msgid "Proceed"
msgstr "Fortsetzen"

#: src/guiPasswordChange.cpp:103
msgid "Old Password"
msgstr "Altes Passwort"

#: src/guiPasswordChange.cpp:120
msgid "New Password"
msgstr "Neues Passwort"

#: src/guiPasswordChange.cpp:136
msgid "Confirm Password"
msgstr "Passwort wiederholen"

#: src/guiPasswordChange.cpp:153
msgid "Change"
msgstr "Ändern"

#: src/guiPasswordChange.cpp:162
msgid "Passwords do not match!"
msgstr "Passwörter passen nicht zusammen"

#: src/guiPauseMenu.cpp:111
msgid "Continue"
msgstr "Weiter"

#: src/guiPauseMenu.cpp:118
msgid "Change Password"
msgstr "Passwort ändern"

#: src/guiPauseMenu.cpp:125
msgid "Disconnect"
msgstr "Verbindung trennen"

#: src/guiPauseMenu.cpp:132
msgid "Exit to OS"
msgstr "Programm beenden"

#: src/guiPauseMenu.cpp:139
#, fuzzy
msgid ""
"Default Controls:\n"
"- WASD: Walk\n"
"- Mouse left: dig/hit\n"
"- Mouse right: place/use\n"
"- Mouse wheel: select item\n"
"- 0...9: select item\n"
"- Shift: sneak\n"
"- R: Toggle viewing all loaded chunks\n"
"- I: Inventory menu\n"
"- ESC: This menu\n"
"- T: Chat\n"
msgstr ""
"Tastenkürzel:\n"
"- WASD: Gehen\n"
"- linke Maustaste: Blöcke aufnehmen \n"
"- rechte Maustaste: Blöche ablegen\n"
"- Mausrad: Item auswählen\n"
"- 0...9: Item auswählen\n"
"- Shift: ducken\n"
"- R: alle geladenen Blöcke anzeigen (wechseln)\n"
"- I: Inventarmenü\n"
"- T: Chat\n"
"facedir" or def.paramtype2 == "colorfacedir") then local fdir = node.param2 % 32 -- Get rotation from a precalculated lookup table local euler = facedir_to_euler[fdir + 1] if euler then self.object:set_rotation(euler) end elseif (def.drawtype ~= "plantlike" and def.drawtype ~= "plantlike_rooted" and (def.paramtype2 == "wallmounted" or def.paramtype2 == "colorwallmounted" or def.drawtype == "signlike")) then local rot = node.param2 % 8 if (def.drawtype == "signlike" and def.paramtype2 ~= "wallmounted" and def.paramtype2 ~= "colorwallmounted") then -- Change rotation to "floor" by default for non-wallmounted paramtype2 rot = 1 end local pitch, yaw, roll = 0, 0, 0 if def.drawtype == "nodebox" or def.drawtype == "mesh" then if rot == 0 then pitch, yaw = math.pi/2, 0 elseif rot == 1 then pitch, yaw = -math.pi/2, math.pi elseif rot == 2 then pitch, yaw = 0, math.pi/2 elseif rot == 3 then pitch, yaw = 0, -math.pi/2 elseif rot == 4 then pitch, yaw = 0, math.pi end else if rot == 1 then pitch, yaw = math.pi, math.pi elseif rot == 2 then pitch, yaw = math.pi/2, math.pi/2 elseif rot == 3 then pitch, yaw = math.pi/2, -math.pi/2 elseif rot == 4 then pitch, yaw = math.pi/2, math.pi elseif rot == 5 then pitch, yaw = math.pi/2, 0 end end if def.drawtype == "signlike" then pitch = pitch - math.pi/2 if rot == 0 then yaw = yaw + math.pi/2 elseif rot == 1 then yaw = yaw - math.pi/2 end elseif def.drawtype == "mesh" or def.drawtype == "normal" or def.drawtype == "nodebox" then if rot >= 0 and rot <= 1 then roll = roll + math.pi else yaw = yaw + math.pi end end self.object:set_rotation({x=pitch, y=yaw, z=roll}) elseif (def.drawtype == "mesh" and def.paramtype2 == "degrotate") then local p2 = (node.param2 - (def.place_param2 or 0)) % 240 local yaw = (p2 / 240) * (math.pi * 2) self.object:set_yaw(yaw) elseif (def.drawtype == "mesh" and def.paramtype2 == "colordegrotate") then local p2 = (node.param2 % 32 - (def.place_param2 or 0) % 32) % 24 local yaw = (p2 / 24) * (math.pi * 2) self.object:set_yaw(yaw) end end end, get_staticdata = function(self) local ds = { node = self.node, meta = self.meta, } return core.serialize(ds) end, on_activate = function(self, staticdata) self.object:set_armor_groups({immortal = 1}) self.object:set_acceleration(vector.new(0, -gravity, 0)) local ds = core.deserialize(staticdata) if ds and ds.node then self:set_node(ds.node, ds.meta) elseif ds then self:set_node(ds) elseif staticdata ~= "" then self:set_node({name = staticdata}) end end, try_place = function(self, bcp, bcn) local bcd = core.registered_nodes[bcn.name] -- Add levels if dropped on same leveled node if bcd and bcd.paramtype2 == "leveled" and bcn.name == self.node.name then local addlevel = self.node.level if (addlevel or 0) <= 0 then addlevel = bcd.leveled end if core.add_node_level(bcp, addlevel) < addlevel then return true elseif bcd.buildable_to then -- Node level has already reached max, don't place anything return true end end -- Decide if we're replacing the node or placing on top local np = vector.new(bcp) if bcd and bcd.buildable_to and (not self.floats or bcd.liquidtype == "none") then core.remove_node(bcp) else np.y = np.y + 1 end -- Check what's here local n2 = core.get_node(np) local nd = core.registered_nodes[n2.name] -- If it's not air or liquid, remove node and replace it with -- it's drops if n2.name ~= "air" and (not nd or nd.liquidtype == "none") then if nd and nd.buildable_to == false then nd.on_dig(np, n2, nil) -- If it's still there, it might be protected if core.get_node(np).name == n2.name then return false end else core.remove_node(np) end end -- Create node local def = core.registered_nodes[self.node.name] if def then core.add_node(np, self.node) if self.meta then core.get_meta(np):from_table(self.meta) end if def.sounds and def.sounds.place then core.sound_play(def.sounds.place, {pos = np}, true) end end core.check_for_falling(np) return true end, on_step = function(self, dtime, moveresult) -- Fallback code since collision detection can't tell us -- about liquids (which do not collide) if self.floats then local pos = self.object:get_pos() local bcp = pos:offset(0, -0.7, 0):round() local bcn = core.get_node(bcp) local bcd = core.registered_nodes[bcn.name] if bcd and bcd.liquidtype ~= "none" then if self:try_place(bcp, bcn) then self.object:remove() return end end end assert(moveresult) if not moveresult.collides then return -- Nothing to do :) end local bcp, bcn local player_collision if moveresult.touching_ground then for _, info in ipairs(moveresult.collisions) do if info.type == "object" then if info.axis == "y" and info.object:is_player() then player_collision = info end elseif info.axis == "y" then bcp = info.node_pos bcn = core.get_node(bcp) break end end end if not bcp then -- We're colliding with something, but not the ground. Irrelevant to us. if player_collision then -- Continue falling through players by moving a little into -- their collision box -- TODO: this hack could be avoided in the future if objects -- could choose who to collide with local vel = self.object:get_velocity() self.object:set_velocity(vector.new( vel.x, player_collision.old_velocity.y, vel.z )) self.object:set_pos(self.object:get_pos():offset(0, -0.5, 0)) end return elseif bcn.name == "ignore" then -- Delete on contact with ignore at world edges self.object:remove() return end local failure = false local pos = self.object:get_pos() local distance = vector.apply(vector.subtract(pos, bcp), math.abs) if distance.x >= 1 or distance.z >= 1 then -- We're colliding with some part of a node that's sticking out -- Since we don't want to visually teleport, drop as item failure = true elseif distance.y >= 2 then -- Doors consist of a hidden top node and a bottom node that is -- the actual door. Despite the top node being solid, the moveresult -- almost always indicates collision with the bottom node. -- Compensate for this by checking the top node bcp.y = bcp.y + 1 bcn = core.get_node(bcp) local def = core.registered_nodes[bcn.name] if not (def and def.walkable) then failure = true -- This is unexpected, fail end end -- Try to actually place ourselves if not failure then failure = not self:try_place(bcp, bcn) end if failure then local drops = core.get_node_drops(self.node, "") for _, item in pairs(drops) do core.add_item(pos, item) end end self.object:remove() end }) local function convert_to_falling_node(pos, node) local obj = core.add_entity(pos, "__builtin:falling_node") if not obj then return false end -- remember node level, the entities' set_node() uses this node.level = core.get_node_level(pos) local meta = core.get_meta(pos) local metatable = meta and meta:to_table() or {} local def = core.registered_nodes[node.name] if def and def.sounds and def.sounds.fall then core.sound_play(def.sounds.fall, {pos = pos}, true) end obj:get_luaentity():set_node(node, metatable) core.remove_node(pos) return true, obj end function core.spawn_falling_node(pos) local node = core.get_node(pos) if node.name == "air" or node.name == "ignore" then return false end return convert_to_falling_node(pos, node) end local function drop_attached_node(p) local n = core.get_node(p) local drops = core.get_node_drops(n, "") local def = core.registered_items[n.name] if def and def.preserve_metadata then local oldmeta = core.get_meta(p):to_table().fields -- Copy pos and node because the callback can modify them. local pos_copy = vector.new(p) local node_copy = {name=n.name, param1=n.param1, param2=n.param2} local drop_stacks = {} for k, v in pairs(drops) do drop_stacks[k] = ItemStack(v) end drops = drop_stacks def.preserve_metadata(pos_copy, node_copy, oldmeta, drops) end if def and def.sounds and def.sounds.fall then core.sound_play(def.sounds.fall, {pos = p}, true) end core.remove_node(p) for _, item in pairs(drops) do local pos = { x = p.x + math.random()/2 - 0.25, y = p.y + math.random()/2 - 0.25, z = p.z + math.random()/2 - 0.25, } core.add_item(pos, item) end end function builtin_shared.check_attached_node(p, n) local def = core.registered_nodes[n.name] local d = vector.new() if def.paramtype2 == "wallmounted" or def.paramtype2 == "colorwallmounted" then -- The fallback vector here is in case 'wallmounted to dir' is nil due -- to voxelmanip placing a wallmounted node without resetting a -- pre-existing param2 value that is out-of-range for wallmounted. -- The fallback vector corresponds to param2 = 0. d = core.wallmounted_to_dir(n.param2) or vector.new(0, 1, 0) else d.y = -1 end local p2 = vector.add(p, d) local nn = core.get_node(p2).name local def2 = core.registered_nodes[nn] if def2 and not def2.walkable then return false end return true end -- -- Some common functions -- function core.check_single_for_falling(p) local n = core.get_node(p) if core.get_item_group(n.name, "falling_node") ~= 0 then local p_bottom = vector.offset(p, 0, -1, 0) -- Only spawn falling node if node below is loaded local n_bottom = core.get_node_or_nil(p_bottom) local d_bottom = n_bottom and core.registered_nodes[n_bottom.name] if d_bottom then local same = n.name == n_bottom.name -- Let leveled nodes fall if it can merge with the bottom node if same and d_bottom.paramtype2 == "leveled" and core.get_node_level(p_bottom) < core.get_node_max_level(p_bottom) then convert_to_falling_node(p, n) return true end -- Otherwise only if the bottom node is considered "fall through" if not same and (not d_bottom.walkable or d_bottom.buildable_to) and (core.get_item_group(n.name, "float") == 0 or