Maciej Kasatkin
2012-09-02 d455791cfb2d93e3625c1db103f069fa11c3d566
commit | author | age
167434 1 minetest.register_alias("battery", "technic:battery")
MK 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
54529c 413     if PR_nodes[i]==nil then break end -- gettin power from all connected producers
167434 414         pos1.x=PR_nodes[i].x
MK 415         pos1.y=PR_nodes[i].y
416         pos1.z=PR_nodes[i].z
417     local meta1 = minetest.env:get_meta(pos1)
54529c 418     local internal_EU_buffer=meta1:get_float("internal_EU_buffer")
MK 419     if charge<max_charge then 
420     charge_to_take=200    
421     if internal_EU_buffer-charge_to_take<=0 then
422         charge_to_take=internal_EU_buffer
423     end
424     if charge_to_take>0 then 
425     charge=charge+charge_to_take 
426     internal_EU_buffer=internal_EU_buffer-charge_to_take
427     meta1:set_float("internal_EU_buffer",internal_EU_buffer)
428     end
429     end
167434 430     i=i+1
MK 431     until false
432
433 if charge>max_charge then charge=max_charge end
434
435 i=1
436     repeat
437     if RE_nodes[i]==nil then break end
438         pos1.x=RE_nodes[i].x         -- loading all conected machines buffers
439         pos1.y=RE_nodes[i].y
440         pos1.z=RE_nodes[i].z
441     local meta1 = minetest.env:get_meta(pos1)
442     local internal_EU_buffer=meta1:get_float("internal_EU_buffer")
443     local internal_EU_buffer_size=meta1:get_float("internal_EU_buffer_size")
444
445     local charge_to_give=200
446     if internal_EU_buffer+charge_to_give>internal_EU_buffer_size then
447         charge_to_give=internal_EU_buffer_size-internal_EU_buffer
448     end
449     if charge-charge_to_give<0 then charge_to_give=charge end
450
451     internal_EU_buffer=internal_EU_buffer+charge_to_give
452     meta1:set_float("internal_EU_buffer",internal_EU_buffer)
453     charge=charge-charge_to_give;
454     
455     i=i+1
456     until false
457     
458     meta:set_float("battery_charge",charge)
459     meta:set_string("infotext", "Battery box: "..charge.."/"..max_charge);
460
461
462 end
463 })
464
465 function add_new_cable_node (LV_nodes,pos1)
466 local i=1
467     repeat
468         if LV_nodes[i]==nil then break end
469         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
470         i=i+1
471     until false
472 LV_nodes[i]={}
473 LV_nodes[i].x=pos1.x
474 LV_nodes[i].y=pos1.y
475 LV_nodes[i].z=pos1.z
476 LV_nodes[i].visited=false
477 return true
478 end
479
480 function check_LV_node (PR_nodes,RE_nodes,LV_nodes,i)
481         local pos1={}
482         pos1.x=LV_nodes[i].x
483         pos1.y=LV_nodes[i].y
484         pos1.z=LV_nodes[i].z
485         LV_nodes[i].visited=true
486         new_node_added=false
487     
488         pos1.x=pos1.x+1
489         check_LV_node_subp (PR_nodes,RE_nodes,LV_nodes,pos1)
490         pos1.x=pos1.x-2
491         check_LV_node_subp (PR_nodes,RE_nodes,LV_nodes,pos1)
492         pos1.x=pos1.x+1
493         
494         pos1.y=pos1.y+1
495         check_LV_node_subp (PR_nodes,RE_nodes,LV_nodes,pos1)
496         pos1.y=pos1.y-2
497         check_LV_node_subp (PR_nodes,RE_nodes,LV_nodes,pos1)
498         pos1.y=pos1.y+1
499
500         pos1.z=pos1.z+1
501         check_LV_node_subp (PR_nodes,RE_nodes,LV_nodes,pos1)
502         pos1.z=pos1.z-2
503         check_LV_node_subp (PR_nodes,RE_nodes,LV_nodes,pos1)
504         pos1.z=pos1.z+1
505 return new_node_added
506 end
507
508 function check_LV_node_subp (PR_nodes,RE_nodes,LV_nodes,pos1)
509 meta = minetest.env:get_meta(pos1)
510 if meta:get_float("cablelike")==1 then new_node_added=add_new_cable_node(LV_nodes,pos1) end
511 if minetest.env:get_node(pos1).name == "technic:solar_panel" then     new_node_added=add_new_cable_node(PR_nodes,pos1) end        
54529c 512 if minetest.env:get_node(pos1).name == "technic:generator" then     new_node_added=add_new_cable_node(PR_nodes,pos1) end        
ad8932 513 if minetest.env:get_node(pos1).name == "technic:generator_active" then     new_node_added=add_new_cable_node(PR_nodes,pos1) end        
3c09c5 514 if minetest.env:get_node(pos1).name == "technic:geothermal" then     new_node_added=add_new_cable_node(PR_nodes,pos1) end        
MK 515 if minetest.env:get_node(pos1).name == "technic:geothermal_active" then     new_node_added=add_new_cable_node(PR_nodes,pos1) end        
927ed7 516 if minetest.env:get_node(pos1).name == "technic:water_mill" then     new_node_added=add_new_cable_node(PR_nodes,pos1) end        
MK 517 if minetest.env:get_node(pos1).name == "technic:water_mill_active" then     new_node_added=add_new_cable_node(PR_nodes,pos1) end        
167434 518 if minetest.env:get_node(pos1).name == "technic:electric_furnace" then     new_node_added=add_new_cable_node(RE_nodes,pos1) end        
MK 519 if minetest.env:get_node(pos1).name == "technic:electric_furnace_active" then     new_node_added=add_new_cable_node(RE_nodes,pos1) end        
520 if minetest.env:get_node(pos1).name == "technic:tool_workshop" then     new_node_added=add_new_cable_node(RE_nodes,pos1) end        
521 if minetest.env:get_node(pos1).name == "technic:music_player" then     new_node_added=add_new_cable_node(RE_nodes,pos1) end        
522 if minetest.env:get_node(pos1).name == "technic:grinder" then     new_node_added=add_new_cable_node(RE_nodes,pos1) end        
523 end
524         
525
526 function get_connected_charge (charge,pos1)
527     local charge1=0
528     local meta={}
529     if minetest.env:get_node(pos1).name == "technic:battery_box" then
530     print ("found batbox")
531     meta = minetest.env:get_meta(pos1)
532     return meta:get_float("cable_OUT") 
533     end
534
535     if minetest.env:get_node(pos1).name == "technic:lv_cable" then
536     meta = minetest.env:get_meta(pos1)
537     charge1=meta:get_float("cable_OUT")
538         if charge1>charge then
539         charge=charge1
540         end
541     end
542 return charge
54529c 543 end