sdzen
2013-08-07 df644d7f7736fce4e92a75d53f44b3df6671ceeb
commit | author | age
f4302f 1 --Minetest 0.4.7 mod: concrete 
0ca19d 2 --(c) 2013 by RealBadAngel <mk@realbadangel.pl>
R 3
4 minetest.register_craft({
f4302f 5     output = 'technic:rebar 6',
0ca19d 6     recipe = {
R 7         {'','', 'default:steel_ingot'},
8         {'','default:steel_ingot',''},
9         {'default:steel_ingot', '', ''},
10     }
11 })
12
13 minetest.register_craft({
f4302f 14     output = 'technic:concrete 5',
0ca19d 15     recipe = {
R 16         {'default:stone','technic:rebar','default:stone'},
17         {'technic:rebar','default:stone','technic:rebar'},
18         {'default:stone','technic:rebar','default:stone'},
19     }
20 })
21
22 minetest.register_craft({
f4302f 23     output = 'technic:concrete_post_platform 6',
0ca19d 24     recipe = {
R 25         {'technic:concrete','technic:concrete_post','technic:concrete'},
26     }
27 })
28
29 minetest.register_craft({
f4302f 30     output = 'technic:concrete_post 12',
0ca19d 31     recipe = {
R 32         {'default:stone','technic:rebar','default:stone'},
33         {'default:stone','technic:rebar','default:stone'},
34         {'default:stone','technic:rebar','default:stone'},
35 }
36 })
37
6055ed 38 minetest.register_craft({
R 39     output = 'technic:blast_resistant_concrete 5',
40     recipe = {
41         {'technic:concrete','technic:composite_plate','technic:concrete'},
42         {'technic:composite_plate','technic:concrete','technic:composite_plate'},
43         {'technic:concrete','technic:composite_plate','technic:concrete'},
44     }
45 })
46
0ca19d 47 platform_box = {-0.5 , 0.3 , -0.5 , 0.5 ,  0.5 , 0.5  }
R 48 post_str_y={ -0.15 , -0.5 , -0.15 , 0.15 ,  0.5 , 0.15  }
49 post_str_x1={ 0 , -0.3 , -0.1, 0.5 ,  0.3 , 0.1 }  -- x+
50 post_str_z1={ -0.1 , -0.3 , 0, 0.1 ,  0.3 , 0.5 } -- z+
51 post_str_x2={ 0 , -0.3 , -0.1, -0.5 ,  0.3 , 0.1 } -- x-
52 post_str_z2={ -0.1 , -0.3 , 0, 0.1 ,  0.3 , -0.5 } -- z-
53
54 minetest.register_craftitem(":technic:rebar", {
55     description = "Rebar",
56     inventory_image = "technic_rebar.png",
6055ed 57     stack_max = 99,
R 58 })
59
60 minetest.register_craftitem(":technic:blast_resistant_concrete", {
61     description = "Blast-resistant Concrete Block",
62     inventory_image = "technic_blast_resistant_concrete_block.png",
0ca19d 63     stack_max = 99,
R 64 })
65
66 minetest.register_craftitem(":technic:concrete", {
67     description = "Concrete Block",
68     inventory_image = "technic_concrete_block.png",
69     stack_max = 99,
70 })
71
72 minetest.register_craftitem(":technic:concrete_post", {
73     description = "Concrete Post",
74     stack_max = 99,
75 })
76
77 minetest.register_craftitem(":technic:concrete_post_platform", {
78     description = "Concrete Post Platform",
79     stack_max = 99,
80 })
81
82 minetest.register_node(":technic:concrete", {
83     description = "Concrete Block",
84     tile_images = {"technic_concrete_block.png",},
85     is_ground_content = true,
86     groups={cracky=1,level=2},
6055ed 87     sounds = default.node_sound_stone_defaults(),
R 88     paramtype = "light",
89     light_source = 0,
90     sunlight_propagates = true,
91     on_construct = function(pos)
92         meta=minetest.env:get_meta(pos)
93         meta:set_float("postlike",1)
94         check_post_connections (pos,1)
95     end,
96     after_dig_node = function (pos, oldnode, oldmetadata, digger)
97         check_post_connections  (pos,0)
98     end,
99 })
100
101 minetest.register_node(":technic:blast_resistant_concrete", {
102     description = "Blast-resistant Concrete Block",
103     tile_images = {"technic_blast_resistant_concrete_block.png",},
104     is_ground_content = true,
105     groups={cracky=1,level=3},
0ca19d 106     sounds = default.node_sound_stone_defaults(),
R 107     paramtype = "light",
108     light_source = 0,
109     sunlight_propagates = true,
110     on_construct = function(pos)
111         meta=minetest.env:get_meta(pos)
112         meta:set_float("postlike",1)
113         check_post_connections (pos,1)
114     end,
115     after_dig_node = function (pos, oldnode, oldmetadata, digger)
116         check_post_connections  (pos,0)
117     end,
118 })
119
120 minetest.register_node(":technic:concrete_post_platform", {
121     description = "Concrete Post Platform",
122     tile_images = {"technic_concrete_block.png",},
123     is_ground_content = true,
124     groups={cracky=1,level=2},
125     sounds = default.node_sound_stone_defaults(),
126     paramtype = "light",
127     light_source = 0,
128     sunlight_propagates = true,
129     drawtype = "nodebox", 
130     selection_box = {
131         type = "fixed",
132         fixed = {platform_box}
133         },
134     node_box = {
135         type = "fixed",
136         fixed = {platform_box}
137         },
138     on_place=function (itemstack, placer, pointed_thing)
139     local node=minetest.env:get_node(pointed_thing.under)
140     if minetest.get_item_group(node.name, "concrete_post")==0 then 
141         return minetest.item_place_node(itemstack, placer, pointed_thing) 
142     end
143     local meta=minetest.env:get_meta(pointed_thing.under)
144     y1=meta:get_float("y1")
145     platform=meta:get_float("platform")
146     if y1==1 or platform==1 then 
147         return minetest.item_place_node(itemstack, placer, pointed_thing) 
148     end
149     y2=meta:get_float("y2")
150     x1=meta:get_float("x1")
151     x2=meta:get_float("x2")
152     z1=meta:get_float("z1")
153     z2=meta:get_float("z2")
154     rule=make_post_rule_number(x1,x2,y1,y2,z1,z2,1)
155     meta:set_float("platform",1)
156     hacky_swap_posts(pointed_thing.under,"technic:concrete_post"..rule)
157     itemstack:take_item()
158     placer:set_wielded_item(itemstack)
159     return itemstack
160     end,
161 })
162
163
164 minetest.register_node(":technic:concrete_post", {
165     description = "Concrete Post",
166     tiles = {"technic_concrete_block.png"},
167     groups={cracky=1,level=2,concrete_post=1},
168     sounds = default.node_sound_stone_defaults(),
169     paramtype = "light",
170     light_source = 0,
171     sunlight_propagates = true,
172     drawtype = "nodebox", 
173     selection_box = {
174         type = "fixed",
175         fixed = { -0.15 , -0.5 , -0.15 , 0.15 ,  0.5 , 0.15 }},
176     node_box = {
177         type = "fixed",
178         fixed = {-0.15 , -0.5 , -0.15 , 0.15 ,  0.5 , 0.15  }},
179     on_construct = function(pos)
180     meta=minetest.env:get_meta(pos)
181     meta:set_int("postlike",1)
182     meta:set_int("platform",0)
183     meta:set_int("x1",0)
184     meta:set_int("x2",0)
185     meta:set_int("y1",0)
186     meta:set_int("y2",0)
187     meta:set_int("z1",0)
188     meta:set_int("z2",0)
189     check_post_connections (pos,1)
190     end,
191
192     after_dig_node = function (pos, oldnode, oldmetadata, digger)
193     check_post_connections  (pos,0)
194     end,
195
196 })
197
198 local x1,x2,y1,z1,z2
199 local count=0
200
201 for x1 = 0, 1, 1 do    --x-
f4302f 202     for x2 = 0, 1, 1 do    --x+
R 203         for z1 = 0, 1, 1 do    --z-
204             for z2 = 0, 1, 1 do    --z+
0ca19d 205      
f4302f 206                 temp_x1={} temp_x2={} temp_z1={} temp_z2={}
0ca19d 207
f4302f 208                     if x1==1 then     temp_x1=post_str_x1  end 
R 209                     if x2==1 then     temp_x2=post_str_x2  end 
210                     if z1==1 then     temp_z1=post_str_z1  end 
211                     if z2==1 then     temp_z2=post_str_z2  end 
0ca19d 212
R 213
214 minetest.register_node(":technic:concrete_post"..count, {
215     description = "Concrete Post",
216     tiles = {"technic_concrete_block.png"},
217     groups={cracky=1,level=2,not_in_creative_inventory=1,concrete_post=1},
218     sounds = default.node_sound_stone_defaults(),
219     drop = "technic:concrete_post",
220     paramtype = "light",
221     light_source = 0,
222     sunlight_propagates = true,
223     drawtype = "nodebox", 
224     selection_box = {
225         type = "fixed",
226         fixed = {
227         temp_x1,temp_x2,post_str_y,temp_z1,temp_z2,
228         }},
229
230     node_box = {
231         type = "fixed",
232         fixed = {
233         temp_x1,temp_x2,post_str_y,temp_z1,temp_z2,
234         }},
235
236     after_dig_node = function (pos, oldnode, oldmetadata, digger)
237     check_post_connections  (pos,0)
238     end,
239
240 })
241
242 minetest.register_node(":technic:concrete_post"..count+16, {
243     description = "Concrete Post",
244     tiles = {"technic_concrete_block.png"},
245     groups={cracky=1,level=2,not_in_creative_inventory=1,concrete_post=1},
246     sounds = default.node_sound_stone_defaults(),
247     drop = "technic:concrete_post_platform",
248     paramtype = "light",
249     light_source = 0,
250     sunlight_propagates = true,
251     drawtype = "nodebox", 
252     selection_box = {
253         type = "fixed",
254         fixed = {
255         platform_box,temp_x1,temp_x2,post_str_y,temp_z1,temp_z2,
256         }},
257
258     node_box = {
259         type = "fixed",
260         fixed = {
261         platform_box,temp_x1,temp_x2,post_str_y,temp_z1,temp_z2,
262         }},
263
264     after_dig_node = function (pos, oldnode, oldmetadata, digger)
265         dig_post_with_platform (pos,oldnode,oldmetadata)
266     end,
267 })
268
269 count=count+1 end end end end
270
271 minetest.register_node(":technic:concrete_post32", {
272     description = "Concrete Post",
273     tiles = {"technic_concrete_block.png"},
274     groups={cracky=1,level=2,not_in_creative_inventory=1,concrete_post=1},
275     sounds = default.node_sound_stone_defaults(),
276     drop = "technic:concrete_post",
277     paramtype = "light",
278     light_source = 0,
279     sunlight_propagates = true,
280     drawtype = "nodebox", 
281     selection_box = {
282         type = "fixed",
283         fixed = {-0.5,-0.3,-0.1,0.5,0.3,0.1},
284         },
285     node_box = {
286         type = "fixed",
287         fixed = {
288         post_str_x1,post_str_x2,
289         }},
290
291     after_dig_node = function (pos, oldnode, oldmetadata, digger)
292         check_post_connections  (pos,0)
293     end,
294 })
295 minetest.register_node(":technic:concrete_post33", {
296     description = "Concrete Post",
297     tiles = {"technic_concrete_block.png"},
298     groups={cracky=1,level=2,not_in_creative_inventory=1,concrete_post=1},
299     sounds = default.node_sound_stone_defaults(),
300     drop = "technic:concrete_post",
301     paramtype = "light",
302     light_source = 0,
303     sunlight_propagates = true,
304     drawtype = "nodebox", 
305     selection_box = {
306         type = "fixed",
307         fixed = {
308         post_str_z1,post_str_z2,
309         }},
310     node_box = {
311         type = "fixed",
312         fixed = {
313         post_str_z1,post_str_z2,
314         }},
315
316     after_dig_node = function (pos, oldnode, oldmetadata, digger)
f4302f 317         check_post_connections  (pos,0)
0ca19d 318     end,
R 319 })
320
321 minetest.register_node(":technic:concrete_post34", {
322     description = "Concrete Post",
323     tiles = {"technic_concrete_block.png"},
324     groups={cracky=1,level=2,not_in_creative_inventory=1,concrete_post=1},
325     sounds = default.node_sound_stone_defaults(),
326     drop = "technic:concrete_post_platform",
327     paramtype = "light",
328     light_source = 0,
329     sunlight_propagates = true,
330     drawtype = "nodebox", 
331     selection_box = {
332         type = "fixed",
333         fixed = {
334         platform_box,post_str_x1,post_str_x2,
335         }},
336     node_box = {
337         type = "fixed",
338         fixed = {
339         platform_box,post_str_x1,post_str_x2,
340         }},
341
342     after_dig_node = function (pos, oldnode, oldmetadata, digger)
343         dig_post_with_platform (pos,oldnode,oldmetadata)
344     end,
345 })
346 minetest.register_node(":technic:concrete_post35", {
347     description = "Concrete Post",
348     tiles = {"technic_concrete_block.png"},
349     groups={cracky=1,level=2,not_in_creative_inventory=1,concrete_post=1},
350     sounds = default.node_sound_stone_defaults(),
351     drop = "technic:concrete_post_platform",
352     paramtype = "light",
353     light_source = 0,
354     sunlight_propagates = true,
355     drawtype = "nodebox", 
356     selection_box = {
357         type = "fixed",
358         fixed = {
359         platform_box,post_str_z1,post_str_z2,
360         }},
361     node_box = {
362         type = "fixed",
363         fixed = {
364         platform_box,post_str_z1,post_str_z2,
365         }},
366     after_dig_node = function (pos, oldnode, oldmetadata, digger)
367         dig_post_with_platform (pos,oldnode,oldmetadata)
368     end,
369 })
370
371 dig_post_with_platform = function (pos,oldnode,oldmetadata)
372     x1=tonumber(oldmetadata.fields["x1"])
373     x2=tonumber(oldmetadata.fields["x2"])
374     y1=tonumber(oldmetadata.fields["y1"])
375     y2=tonumber(oldmetadata.fields["y2"])
376     z1=tonumber(oldmetadata.fields["z1"])
377     z2=tonumber(oldmetadata.fields["z2"])
378     print(dump(x1))
379     oldmetadata.fields["platform"]="0"
380     local rule=make_post_rule_number(x1,x2,y1,y2,z1,z2,0)
f4302f 381     --print(dump(rule))
0ca19d 382     oldnode.name="technic:concrete_post"..rule
R 383     minetest.env:set_node(pos,oldnode)
384     meta = minetest.env:get_meta(pos)
385     meta:from_table(oldmetadata)
386 end    
387
388 check_post_connections = function(pos,mode)
389         local pos1={}
390         pos1.x=pos.x
391         pos1.y=pos.y
392         pos1.z=pos.z
393         tempx1=0
394         tempx2=0
395         tempy1=0
396         tempy2=0
397         tempz1=0
398         tempz2=0
399         
400         pos1.x=pos1.x+1
401         if minetest.env:get_meta(pos1):get_int("postlike")==1 then
f4302f 402             x2=mode
R 403             x1=minetest.env:get_meta(pos1):get_int("x1")
404             y1=minetest.env:get_meta(pos1):get_int("y1")
405             y2=minetest.env:get_meta(pos1):get_int("y2")
406             z1=minetest.env:get_meta(pos1):get_int("z1")
407             z2=minetest.env:get_meta(pos1):get_int("z2")
408             platform=minetest.env:get_meta(pos1):get_int("platform")
409             rule=make_post_rule_number(x1,x2,y1,y2,z1,z2,platform)
410             hacky_swap_posts(pos1,"technic:concrete_post"..rule)
411             meta=minetest.env:get_meta(pos1)
412             meta:set_int("x2",x2)
413             tempx1=mode
0ca19d 414         end
R 415
416         pos1.x=pos1.x-2
417         if minetest.env:get_meta(pos1):get_int("postlike")==1 then
f4302f 418             x1=mode
R 419             x2=minetest.env:get_meta(pos1):get_int("x2")
420             y1=minetest.env:get_meta(pos1):get_int("y1")
421             y2=minetest.env:get_meta(pos1):get_int("y2")
422             z1=minetest.env:get_meta(pos1):get_int("z1")
423             z2=minetest.env:get_meta(pos1):get_int("z2")
424             platform=minetest.env:get_meta(pos1):get_int("platform")
425             rule=make_post_rule_number(x1,x2,y1,y2,z1,z2,platform)
426             hacky_swap_posts(pos1,"technic:concrete_post"..rule)
427             meta=minetest.env:get_meta(pos1)
428             meta:set_int("x1",x1)
429             tempx2=mode
0ca19d 430         end
R 431
432         pos1.x=pos1.x+1
433         
434         pos1.y=pos1.y+1
435         if minetest.env:get_meta(pos1):get_int("postlike")==1 then
f4302f 436             y2=mode
R 437             x1=minetest.env:get_meta(pos1):get_int("x1")
438             x2=minetest.env:get_meta(pos1):get_int("x2")
439             y1=minetest.env:get_meta(pos1):get_int("y1")
440             z1=minetest.env:get_meta(pos1):get_int("z1")
441             z2=minetest.env:get_meta(pos1):get_int("z2")
442             platform=minetest.env:get_meta(pos1):get_int("platform")
443             rule=make_post_rule_number(x1,x2,y1,y2,z1,z2,platform)
444             hacky_swap_posts(pos1,"technic:concrete_post"..rule)
445             meta=minetest.env:get_meta(pos1)
446             meta:set_int("y2",y2)
447             tempy1=mode
0ca19d 448         end
R 449
450         pos1.y=pos1.y-2
451         if minetest.env:get_meta(pos1):get_int("postlike")==1 then
f4302f 452             y1=mode
R 453             x1=minetest.env:get_meta(pos1):get_int("x1")
454             x2=minetest.env:get_meta(pos1):get_int("x2")
455             y2=minetest.env:get_meta(pos1):get_int("y2")
456             z1=minetest.env:get_meta(pos1):get_int("z1")
457             z2=minetest.env:get_meta(pos1):get_int("z2")
458             platform=minetest.env:get_meta(pos1):get_int("platform")
459             rule=make_post_rule_number(x1,x2,y1,y2,z1,z2,platform)
460             hacky_swap_posts(pos1,"technic:concrete_post"..rule)
461             meta=minetest.env:get_meta(pos1)
462             meta:set_int("y1",y1)
463             tempy2=mode
0ca19d 464         end
R 465         pos1.y=pos1.y+1
466
467         pos1.z=pos1.z+1
468         if minetest.env:get_meta(pos1):get_int("postlike")==1 then
f4302f 469             z2=mode
R 470             x1=minetest.env:get_meta(pos1):get_int("x1")
471             x2=minetest.env:get_meta(pos1):get_int("x2")
472             y1=minetest.env:get_meta(pos1):get_int("y1")
473             y2=minetest.env:get_meta(pos1):get_int("y2")
474             z1=minetest.env:get_meta(pos1):get_int("z1")
475             platform=minetest.env:get_meta(pos1):get_int("platform")
476             rule=make_post_rule_number(x1,x2,y1,y2,z1,z2,platform)
477             hacky_swap_posts(pos1,"technic:concrete_post"..rule)
478             meta=minetest.env:get_meta(pos1)
479             meta:set_int("z2",z2)
480             tempz1=mode
0ca19d 481         end
R 482         pos1.z=pos1.z-2
483         
484         if minetest.env:get_meta(pos1):get_int("postlike")==1 then
f4302f 485             z1=mode
R 486             x1=minetest.env:get_meta(pos1):get_int("x1")
487             x2=minetest.env:get_meta(pos1):get_int("x2")
488             y1=minetest.env:get_meta(pos1):get_int("y1")
489             y2=minetest.env:get_meta(pos1):get_int("y2")
490             z2=minetest.env:get_meta(pos1):get_int("z2")
491             platform=minetest.env:get_meta(pos1):get_int("platform")
492             rule=make_post_rule_number(x1,x2,y1,y2,z1,z2,platform)
493             hacky_swap_posts(pos1,"technic:concrete_post"..rule)
494             meta=minetest.env:get_meta(pos1)
495             meta:set_int("z1",z1)
496             tempz2=mode
0ca19d 497         end
R 498         pos1.z=pos1.z+1
f4302f 499         
0ca19d 500         if mode==1 then 
R 501             meta=minetest.env:get_meta(pos)
502             meta:set_int("x1",tempx1)
503             meta:set_int("x2",tempx2)
504             meta:set_int("y1",tempy1)
505             meta:set_int("y2",tempy2)
506             meta:set_int("z1",tempz1)
507             meta:set_int("z2",tempz2)
508             rule=make_post_rule_number(tempx1,tempx2,tempy1,tempy2,tempz1,tempz2,0)
509             hacky_swap_posts(pos,"technic:concrete_post"..rule)
510         end
511 end    
512
513 function make_post_rule_number (x1,x2,y1,y2,z1,z2,platform)
f4302f 514     local tempy=y1+y2
R 515     local tempx=x1+x2
516     local tempz=z1+z2
517     if platform==0 then 
518         if tempy==0 and tempx==0 and tempz==0 then return 0 end
6055ed 519         if x1==1 and x2==1 and tempz==0 and tempy==0 then return 32 end
R 520         if z1==1 and z2==1 and tempx==0 and tempy==0 then return 33 end
521         return z2+z1*2+x2*4+x1*8
f4302f 522     else
R 523         if tempy==0 and tempx==0 and tempz==0 then return 16 end
6055ed 524         if x1==1 and x2==1 and tempz==0 and tempy==0 then return 34 end
R 525         if z1==1 and z2==1 and tempx==0 and tempy==0 then return 35 end
526         return z2+z1*2+x2*4+x1*8+16
f4302f 527     end
0ca19d 528 end
R 529
530 function hacky_swap_posts(pos,name)
531     local node = minetest.env:get_node(pos)
6055ed 532         if node.name == "technic:concrete" or node.name == "technic:blast_resistant_concrete" then
0ca19d 533         return nil
R 534     end
535     local meta = minetest.env:get_meta(pos)
536     local meta0 = meta:to_table()
537     node.name = name
538     local meta0 = meta:to_table()
539     minetest.env:set_node(pos,node)
540     meta = minetest.env:get_meta(pos)
541     meta:from_table(meta0)
542     return 1
543 end