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