RealBadAngel
2013-02-21 e23f87d20c59c1a9fa0fbb3e887a87072f57d5e8
commit | author | age
82cba9 1 minetest.register_alias("battery", "technic:battery")
R 2 minetest.register_alias("battery_box", "technic:battery_box")
3 minetest.register_alias("electric_furnace", "technic:electric_furnace")
4
5
6 minetest.register_craft({
7     output = 'technic:battery 1',
8     recipe = {
9         {'default:wood', 'moreores:copper_ingot', 'default:wood'},
10         {'default:wood', 'moreores:tin_ingot', 'default:wood'},
11         {'default:wood', 'moreores:copper_ingot', 'default:wood'},
12     }
13 }) 
14
15 minetest.register_craft({
16     output = 'technic:battery_box 1',
17     recipe = {
18         {'technic:battery', 'default:wood', 'technic:battery'},
19         {'technic:battery', 'moreores:copper_ingot', 'technic:battery'},
20         {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'},
21     }
22 }) 
23
24 minetest.register_craft({
25     output = 'technic:electric_furnace',
26     recipe = {
27         {'default:brick', 'default:brick', 'default:brick'},
28         {'default:brick', '', 'default:brick'},
29         {'default:steel_ingot', 'moreores:copper_ingot', 'default:steel_ingot'},
30     }
31 })
32
33
34 --minetest.register_craftitem("technic:battery", {
35 --    description = "Recharcheable battery",
36 --    inventory_image = "technic_battery.png",
37 --    stack_max = 1,
38 --}) 
39
40 minetest.register_tool("technic:battery",
41 {description = "RE Battery",
42 inventory_image = "technic_battery.png",
43 energy_charge = 0,
44 tool_capabilities = {max_drop_level=0, groupcaps={fleshy={times={}, uses=10000, maxlevel=0}}}}) 
45
46 minetest.register_craftitem("technic:battery_box", {
47     description = "Battery box",
48     stack_max = 99,
49 }) 
50
51
52
53 battery_box_formspec =
54     "invsize[8,9;]"..
55     "image[1,1;1,2;technic_power_meter_bg.png]"..
56     "list[current_name;src;3,1;1,1;]"..
57     "image[4,1;1,1;technic_battery_reload.png]"..
58     "list[current_name;dst;5,1;1,1;]"..
59     "label[0,0;Battery box]"..
60     "label[3,0;Charge]"..
61     "label[5,0;Discharge]"..
62     "label[1,3;Power level]"..
63     "list[current_player;main;0,5;8,4;]"
64
65 minetest.register_node("technic:battery_box", {
66     description = "Battery box",
67     tiles = {"technic_battery_box_top.png", "technic_battery_box_bottom.png", "technic_battery_box_side.png",
68         "technic_battery_box_side.png", "technic_battery_box_side.png", "technic_battery_box_side.png"},
69     groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
70     sounds = default.node_sound_wood_defaults(),
71     technic_power_machine=1,
72     on_construct = function(pos)
73         local meta = minetest.env:get_meta(pos)
74         meta:set_string("infotext", "Battery box")
75         meta:set_float("technic_power_machine", 1)
76         meta:set_string("formspec", battery_box_formspec)
77         local inv = meta:get_inventory()
78         inv:set_size("src", 1)
79         inv:set_size("dst", 1)
80         battery_charge = 0
81         max_charge = 60000
82         end,    
83     can_dig = function(pos,player)
84         local meta = minetest.env:get_meta(pos);
85         local inv = meta:get_inventory()
86         if not inv:is_empty("dst") then
87             return false
88         elseif not inv:is_empty("src") then
89             return false
90         end
91         return true
92     end,
93 })
94
95 electric_furnace_formspec =
96     "invsize[8,9;]"..
97     "image[1,1;1,2;technic_power_meter_bg.png]"..
98     "list[current_name;src;3,1;1,1;]"..
99     "list[current_name;dst;5,1;2,2;]"..
100     "list[current_player;main;0,5;8,4;]"..
101     "label[0,0;Electric Furnace]"..
102     "label[1,3;Power level]"
103     
104 minetest.register_node("technic:electric_furnace", {
105     description = "Electric furnace",
106     tiles = {"technic_electric_furnace_top.png", "technic_electric_furnace_bottom.png", "technic_electric_furnace_side.png",
107         "technic_electric_furnace_side.png", "technic_electric_furnace_side.png", "technic_electric_furnace_front.png"},
108     paramtype2 = "facedir",
109     groups = {cracky=2},
110     legacy_facedir_simple = true,
111     sounds = default.node_sound_stone_defaults(),
112     technic_power_machine=1,
113     internal_EU_buffer=0;
114     interal_EU_buffer_size=2000;
115     on_construct = function(pos)
116         local meta = minetest.env:get_meta(pos)
117         meta:set_float("technic_power_machine", 1)
118         meta:set_string("formspec", electric_furnace_formspec)
119         meta:set_string("infotext", "Electric furnace")
120         local inv = meta:get_inventory()
121         inv:set_size("src", 1)
122         inv:set_size("dst", 4)
123         local EU_used  = 0
124         local furnace_is_cookin = 0
125         local cooked = nil
126         meta:set_float("internal_EU_buffer",0)
127         meta:set_float("internal_EU_buffer_size",2000)
128
129     end,
130     can_dig = function(pos,player)
131         local meta = minetest.env:get_meta(pos);
132         local inv = meta:get_inventory()
133         if not inv:is_empty("dst") then
134             return false
135         elseif not inv:is_empty("src") then
136             return false
137         end
138         return true
139     end,
140 })
141
142 minetest.register_node("technic:electric_furnace_active", {
143     description = "Electric Furnace",
144     tiles = {"technic_electric_furnace_top.png", "technic_electric_furnace_bottom.png", "technic_electric_furnace_side.png",
145         "technic_electric_furnace_side.png", "technic_electric_furnace_side.png", "technic_electric_furnace_front_active.png"},
146     paramtype2 = "facedir",
147     light_source = 8,
148     drop = "technic:electric_furnace",
149     groups = {cracky=2, not_in_creative_inventory=1},
150     legacy_facedir_simple = true,
151     sounds = default.node_sound_stone_defaults(),
152     internal_EU_buffer=0;
153     interal_EU_buffer_size=2000;
154     technic_power_machine=1,
155     on_construct = function(pos)
156         local meta = minetest.env:get_meta(pos)
157         meta:set_float("technic_power_machine", 1)
158         meta:set_string("formspec", electric_furnace_formspec)
159         meta:set_string("infotext", "Electric furnace");
160         local inv = meta:get_inventory()
161         inv:set_size("src", 1)
162         inv:set_size("dst", 4)
163         local EU_used  = 0
164         local furnace_is_cookin = 0
165         local cooked = nil
166     end,
167     can_dig = function(pos,player)
168         local meta = minetest.env:get_meta(pos);
169         local inv = meta:get_inventory()
170         if not inv:is_empty("dst") then
171             return false
172         elseif not inv:is_empty("src") then
173             return false
174         end
175         return true
176     end,
177 })
178
179 minetest.register_abm({
180     nodenames = {"technic:electric_furnace","technic:electric_furnace_active"},
181     interval = 1,
182     chance = 1,
183     
184     action = function(pos, node, active_object_count, active_object_count_wider)
185
186         local meta = minetest.env:get_meta(pos)
187         internal_EU_buffer=meta:get_float("internal_EU_buffer")
188         internal_EU_buffer_size=meta:get_float("internal_EU_buffer")
189         local load = math.floor(internal_EU_buffer/2000 * 100)
190         meta:set_string("formspec",
191                 "invsize[8,9;]"..
192                 "image[1,1;1,2;technic_power_meter_bg.png^[lowpart:"..
193                         (load)..":technic_power_meter_fg.png]"..
194                 "list[current_name;src;3,1;1,1;]"..
195                 "list[current_name;dst;5,1;2,2;]"..
196                 "list[current_player;main;0,5;8,4;]"..
197                 "label[0,0;Electric Furnace]"..
198                 "label[1,3;Power level]")
199
200         local inv = meta:get_inventory()
201         
202         local furnace_is_cookin = meta:get_float("furnace_is_cookin")
203         
204         
205         local srclist = inv:get_list("src")
206         local cooked=nil 
207
208         if srclist then
209          cooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist})
210         end
211         
212         
213         if (furnace_is_cookin == 1) then
214             if internal_EU_buffer>=150 then
215             internal_EU_buffer=internal_EU_buffer-150;
216             meta:set_float("internal_EU_buffer",internal_EU_buffer)
217             meta:set_float("src_time", meta:get_float("src_time") + 3)
218             if cooked and cooked.item and meta:get_float("src_time") >= cooked.time then
219                 -- check if there's room for output in "dst" list
220                 if inv:room_for_item("dst",cooked.item) then
221                     -- Put result in "dst" list
222                     inv:add_item("dst", cooked.item)
223                     -- take stuff from "src" list
224                     srcstack = inv:get_stack("src", 1)
225                     srcstack:take_item()
226                     inv:set_stack("src", 1, srcstack)
227                 else
228                     print("Furnace inventory full!")
229                 end
230                 meta:set_string("src_time", 0)
231             end
232             end        
233         end
234         
235         
236
237         
238         if srclist then
239             cooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist})
240             if cooked.time>0 then 
241             hacky_swap_node(pos,"technic:electric_furnace_active")
242             meta:set_string("infotext","Furnace active")
243             meta:set_string("furnace_is_cookin",1)
244         --    meta:set_string("formspec", electric_furnace_formspec)
245             meta:set_string("src_time", 0)
246             return
247             end
248
249         end
250     
251                 hacky_swap_node(pos,"technic:electric_furnace")
252                 meta:set_string("infotext","Furnace inactive")
253                 meta:set_string("furnace_is_cookin",0)
254         --        meta:set_string("formspec", electric_furnace_formspec)
255                 meta:set_string("src_time", 0)
256         
257     
258 end,        
259 })
260
261
262
263
264 function take_EU_from_net(pos, EU_to_take)
265     local meta = minetest.env:get_meta(pos)
266     local pos1=pos
267     pos1.z=pos1.z +1
268     local meta1 = minetest.env:get_meta(pos1)
269     charge=meta1:get_float("battery_charge")
270     charge=charge - EU_to_take
271     meta1:set_float("battery_charge",charge)
272 end
273
274     LV_nodes_visited = {}
275
276 function get_RE_item_load (load1,max_load)
277 if load1==0 then load1=65535 end
278 local temp = 65536-load1
279 temp= temp/65535*max_load
280 return math.floor(temp + 0.5)
281 end
282
283 function set_RE_item_load (load1,max_load)
284 if load1 == 0 then return 65535 end
285 local temp=load1/max_load*65535
286 temp=65536-temp
287 return math.floor(temp)
288 end
289
290 minetest.register_abm({
291     nodenames = {"technic:battery_box"},
292     interval = 1,
293     chance = 1,
294     action = function(pos, node, active_object_count, active_object_count_wider)
295     local meta = minetest.env:get_meta(pos)
296     charge= meta:get_float("battery_charge")
297     max_charge= 60000
298         
299         local inv = meta:get_inventory()
300         if inv:is_empty("src")==false  then 
301         srcstack = inv:get_stack("src", 1)
302         src_item=srcstack:to_table()
303         if src_item["name"]== "technic:battery" then
304         local load1=tonumber((src_item["wear"])) 
305         load1=get_RE_item_load(load1,10000)
306         load_step=1000
307         if load1<10000 and charge>0 then 
308          if charge-load_step<0 then load_step=charge end
309          if load1+load_step>10000 then load_step=10000-load1 end
310         load1=load1+load_step
311         charge=charge-load_step
312     
313         load1=set_RE_item_load(load1,10000)
314         src_item["wear"]=tostring(load1)
315         inv:set_stack("src", 1, src_item)
316         end        
317         end
318         end
319         meta:set_float("battery_charge",charge)
320         
321     
322         if inv:is_empty("src")==false  then 
323         srcstack = inv:get_stack("src", 1)
324         src_item=srcstack:to_table()
325         if src_item["name"]== "technic:laser_mk1" then
326         local load1=tonumber((src_item["wear"])) 
327         load1=get_RE_item_load(load1,40000)
328         load_step=1000
329         if load1<40000 and charge>0 then 
330          if charge-load_step<0 then load_step=charge end
331          if load1+load_step>40000 then load_step=40000-load1 end
332         load1=load1+load_step
333         charge=charge-load_step
334         load1=set_RE_item_load(load1,40000)
335         src_item["wear"]=tostring(load1)
336         inv:set_stack("src", 1, src_item)
337         end        
338         end
339         end
340         meta:set_float("battery_charge",charge)
341
342
343         if inv:is_empty("dst") == false then 
344         srcstack = inv:get_stack("dst", 1)
345         src_item=srcstack:to_table()
346         if src_item["name"]== "technic:battery" then
347         local load1=tonumber((src_item["wear"])) 
348         load1=get_RE_item_load(load1,10000)
349         load_step=1000
350         if load1>0 and charge<max_charge then 
351              if charge+load_step>max_charge then load_step=max_charge-charge end
352                if load1-load_step<0 then load_step=load1 end
353         load1=load1-load_step
354         charge=charge+load_step
355     
356         load1=set_RE_item_load(load1,10000)
357         src_item["wear"]=tostring(load1)
358         inv:set_stack("dst", 1, src_item)
359         end        
360         end
361         end
362         
363
364     meta:set_float("battery_charge",charge)
365     meta:set_string("infotext", "Battery box: "..charge.."/"..max_charge);
366
367     local load = math.floor(charge/60000 * 100)
368     meta:set_string("formspec",
369                 "invsize[8,9;]"..
370                 "image[1,1;1,2;technic_power_meter_bg.png^[lowpart:"..
371                         (load)..":technic_power_meter_fg.png]"..
372                 "list[current_name;src;3,1;1,1;]"..
373                 "image[4,1;1,1;technic_battery_reload.png]"..
374                 "list[current_name;dst;5,1;1,1;]"..
375                 "label[0,0;Battery box]"..
376                 "label[3,0;Charge]"..
377                 "label[5,0;Discharge]"..
378                 "label[1,3;Power level]"..
379                 "list[current_player;main;0,5;8,4;]")
380         
381     local pos1={}
382
383     pos1.y=pos.y-1
384     pos1.x=pos.x
385     pos1.z=pos.z
386
387
388     meta1 = minetest.env:get_meta(pos1)
389     if meta1:get_float("cablelike")~=1 then return end
390
391         local LV_nodes = {}
392         local PR_nodes = {}
393         local RE_nodes = {}
394
395          LV_nodes[1]={}
396          LV_nodes[1].x=pos1.x
397         LV_nodes[1].y=pos1.y
398         LV_nodes[1].z=pos1.z
399         LV_nodes[1].visited=false
400
401
402 table_index=1
403     repeat
404     check_LV_node (PR_nodes,RE_nodes,LV_nodes,table_index)
405     table_index=table_index+1
406     if LV_nodes[table_index]==nil then break end
407     until false
408
409
410 local pos1={}
411 i=1
412     repeat
413     if PR_nodes[i]==nil then break end
414         pos1.x=PR_nodes[i].x
415         pos1.y=PR_nodes[i].y
416         pos1.z=PR_nodes[i].z
417     local meta1 = minetest.env:get_meta(pos1)
418     local active=meta1:get_float("active")
419     if active==1 then charge=charge+80 end
420     i=i+1
421     until false
422
423 if charge>max_charge then charge=max_charge end
424
425 i=1
426     repeat
427     if RE_nodes[i]==nil then break end
428         pos1.x=RE_nodes[i].x         -- loading all conected machines buffers
429         pos1.y=RE_nodes[i].y
430         pos1.z=RE_nodes[i].z
431     local meta1 = minetest.env:get_meta(pos1)
432     local internal_EU_buffer=meta1:get_float("internal_EU_buffer")
433     local internal_EU_buffer_size=meta1:get_float("internal_EU_buffer_size")
434
435     local charge_to_give=200
436     if internal_EU_buffer+charge_to_give>internal_EU_buffer_size then
437         charge_to_give=internal_EU_buffer_size-internal_EU_buffer
438     end
439     if charge-charge_to_give<0 then charge_to_give=charge end
440
441     internal_EU_buffer=internal_EU_buffer+charge_to_give
442     meta1:set_float("internal_EU_buffer",internal_EU_buffer)
443     charge=charge-charge_to_give;
444     
445     i=i+1
446     until false
447     
448     meta:set_float("battery_charge",charge)
449     meta:set_string("infotext", "Battery box: "..charge.."/"..max_charge);
450
451
452 end
453 })
454
455 function add_new_cable_node (LV_nodes,pos1)
456 local i=1
457     repeat
458         if LV_nodes[i]==nil then break end
459         if pos1.x==LV_nodes[i].x and pos1.y==LV_nodes[i].y and pos1.z==LV_nodes[i].z then return false end
460         i=i+1
461     until false
462 LV_nodes[i]={}
463 LV_nodes[i].x=pos1.x
464 LV_nodes[i].y=pos1.y
465 LV_nodes[i].z=pos1.z
466 LV_nodes[i].visited=false
467 return true
468 end
469
470 function check_LV_node (PR_nodes,RE_nodes,LV_nodes,i)
471         local pos1={}
472         pos1.x=LV_nodes[i].x
473         pos1.y=LV_nodes[i].y
474         pos1.z=LV_nodes[i].z
475         LV_nodes[i].visited=true
476         new_node_added=false
477     
478         pos1.x=pos1.x+1
479         check_LV_node_subp (PR_nodes,RE_nodes,LV_nodes,pos1)
480         pos1.x=pos1.x-2
481         check_LV_node_subp (PR_nodes,RE_nodes,LV_nodes,pos1)
482         pos1.x=pos1.x+1
483         
484         pos1.y=pos1.y+1
485         check_LV_node_subp (PR_nodes,RE_nodes,LV_nodes,pos1)
486         pos1.y=pos1.y-2
487         check_LV_node_subp (PR_nodes,RE_nodes,LV_nodes,pos1)
488         pos1.y=pos1.y+1
489
490         pos1.z=pos1.z+1
491         check_LV_node_subp (PR_nodes,RE_nodes,LV_nodes,pos1)
492         pos1.z=pos1.z-2
493         check_LV_node_subp (PR_nodes,RE_nodes,LV_nodes,pos1)
494         pos1.z=pos1.z+1
495 return new_node_added
496 end
497
498 function check_LV_node_subp (PR_nodes,RE_nodes,LV_nodes,pos1)
499 meta = minetest.env:get_meta(pos1)
500 if meta:get_float("cablelike")==1 then new_node_added=add_new_cable_node(LV_nodes,pos1) end
501 if minetest.env:get_node(pos1).name == "technic:solar_panel" then     new_node_added=add_new_cable_node(PR_nodes,pos1) end        
502 if minetest.env:get_node(pos1).name == "technic:electric_furnace" then     new_node_added=add_new_cable_node(RE_nodes,pos1) end        
503 if minetest.env:get_node(pos1).name == "technic:electric_furnace_active" then     new_node_added=add_new_cable_node(RE_nodes,pos1) end        
504 if minetest.env:get_node(pos1).name == "technic:tool_workshop" then     new_node_added=add_new_cable_node(RE_nodes,pos1) end        
505 if minetest.env:get_node(pos1).name == "technic:music_player" then     new_node_added=add_new_cable_node(RE_nodes,pos1) end        
506 if minetest.env:get_node(pos1).name == "technic:grinder" then     new_node_added=add_new_cable_node(RE_nodes,pos1) end        
507 end
508         
509
510 function get_connected_charge (charge,pos1)
511     local charge1=0
512     local meta={}
513     if minetest.env:get_node(pos1).name == "technic:battery_box" then
514     print ("found batbox")
515     meta = minetest.env:get_meta(pos1)
516     return meta:get_float("cable_OUT") 
517     end
518
519     if minetest.env:get_node(pos1).name == "technic:lv_cable" then
520     meta = minetest.env:get_meta(pos1)
521     charge1=meta:get_float("cable_OUT")
522         if charge1>charge then
523         charge=charge1
524         end
525     end
526 return charge
527 end
528
529 minetest.register_node("technic:solar_panel", {
530     tiles = {"technic_solar_panel_top.png", "technic_solar_panel_side.png", "technic_solar_panel_side.png",
531         "technic_solar_panel_side.png", "technic_solar_panel_side.png", "technic_solar_panel_side.png"},
532     groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
533     sounds = default.node_sound_wood_defaults(),
534         description="Solar Panel",
535     active = false,
536     technic_power_machine=1,
537     drawtype = "nodebox",
538     paramtype = "light",
539     is_ground_content = true,    
540     node_box = {
541             type = "fixed",
542             fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5},
543         },
544         selection_box = {
545             type = "fixed",
546             fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5},
547         },
548     on_construct = function(pos)
549         local meta = minetest.env:get_meta(pos)
550         meta:set_float("technic_power_machine", 1)
551         meta:set_string("infotext", "Solar Panel")
552         meta:set_float("active", false)
553     end,
554 })
555
556 minetest.register_craft({
557     output = 'technic:solar_panel 1',
558     recipe = {
559         {'default:sand', 'default:sand','default:sand'},
560         {'default:sand', 'moreores:copper_ingot','default:sand'},
561         {'default:sand', 'default:sand','default:sand'},
562
563     }
564 })
565
566 minetest.register_abm(
567     {nodenames = {"technic:solar_panel"},
568     interval = 1,
569     chance = 1,
570     action = function(pos, node, active_object_count, active_object_count_wider)
571         
572         local pos1={}
573         pos1.y=pos.y+1
574         pos1.x=pos.x
575         pos1.z=pos.z
576
577         local light = minetest.env:get_node_light(pos1, nil)
578         local meta = minetest.env:get_meta(pos)
579         if light == nil then light = 0 end
580         if light >= 12 then
581             meta:set_string("infotext", "Solar Panel is active ")
582             meta:set_float("active",1)
583         else
584             meta:set_string("infotext", "Solar Panel is inactive");
585             meta:set_float("active",0)
586         end
587     end,
588 })