hdastwb
2013-07-24 2d7f750d9a734e2c84cc1ee14746a4ee2f8757e6
technic/machines/hv/battery_box.lua
@@ -17,13 +17,15 @@
   "invsize[8,9;]"..
   "image[1,1;1,2;technic_power_meter_bg.png]"..
   "list[current_name;src;3,1;1,1;]"..
   "image[4,1;1,1;technic_battery_reload.png]"..
   "list[current_name;dst;5,1;1,1;]"..
   "label[0,0;HV Battery Box]"..
   "label[3,0;Charge]"..
   "label[5,0;Discharge]"..
   "label[1,3;Power level]"..
   "list[current_player;main;0,5;8,4;]"
   "list[current_player;main;0,5;8,4;]"..
   "background[-0.19,-0.25;8.4,9.75;ui_form_bg.png]"..
   "background[0,0;8,4;ui_hv_battery_box.png]"..
   "background[0,5;8,4;ui_main_inventory.png]"
minetest.register_node("technic:hv_battery_box", {
   description = "HV Battery Box",
@@ -84,92 +86,6 @@
   })
end
local power_tools = technic.HV_power_tools
local function charge_HV_tools(meta, charge)
   --charge registered power tools
   local inv = meta:get_inventory()
   if not inv:is_empty("src") then
      local srcstack = inv:get_stack("src", 1)
      local src_item = srcstack:to_table()
      local src_meta = get_item_meta(src_item["metadata"])
      local toolname = src_item["name"]
      if power_tools[toolname] ~= nil then
         -- Set meta data for the tool if it didn't do it itself :-(
         src_meta = get_item_meta(src_item["metadata"])
         if src_meta==nil then
            src_meta = {}
            src_meta["technic_hv_power_tool"] = true
            src_meta["charge"] = 0
         else
            if src_meta["technic_hv_power_tool"] == nil then
            src_meta["technic_hv_power_tool"] = true
            src_meta["charge"] = 0
            end
         end
         -- Do the charging
         local item_max_charge = power_tools[toolname]
         local tool_charge     = src_meta["charge"]
         local charge_step     = 1000 -- how much to charge per tick
         if tool_charge < item_max_charge and tool_charge > 0 then
            if tool_charge - charge_step < 0 then
               charge_step = charge
            end
            if tool_charge + charge_step > item_max_charge then
               charge_step = item_max_charge - tool_charge
            end
            tool_charge = tool_charge + charge_step
            charge = charge - charge_step
            technic.set_RE_wear(src_item, tool_charge, item_max_charge)
            src_meta["charge"]   = tool_charge
            src_item["metadata"] = set_item_meta(src_meta)
            inv:set_stack("src", 1, src_item)
         end
      end
   end
   return charge -- return the remaining charge in the battery
end
local function discharge_HV_tools(meta, charge, max_charge)
   -- discharging registered power tools
   local inv = meta:get_inventory()
   if not inv:is_empty("dst") then
      srcstack = inv:get_stack("dst", 1)
      src_item = srcstack:to_table()
      local src_meta = get_item_meta(src_item["metadata"])
      local toolname = src_item["name"]
      if power_tools[toolname] ~= nil then
         -- Set meta data for the tool if it didn't do it itself :-(
         src_meta = get_item_meta(src_item["metadata"]) or {}
         if src_meta["technic_hv_power_tool"] == nil then
            src_meta["technic_hv_power_tool"] = true
            src_meta["charge"] = 0
         end
         -- Do the discharging
         local item_max_charge = power_tools[toolname]
         local tool_charge     = src_meta["charge"]
         local charge_step     = 4000 -- how much to discharge per tick
         if tool_charge > 0 and charge < max_charge then
            if tool_charge + charge_step > max_charge then
               charge_step = max_charge - charge
            end
            if tool_charge - charge_step < 0 then
               charge_step = charge
            end
            tool_charge = tool_charge - charge_step
            charge = charge + charge_step
            technic.set_RE_wear(src_item, tool_charge, item_max_charge)
            src_meta["charge"] = tool_charge
            src_item["metadata"] = set_item_meta(src_meta)
            inv:set_stack("dst", 1, src_item)
         end
      end
   end
   return charge -- return the remaining charge in the battery
end
minetest.register_abm({
   nodenames = {"technic:hv_battery_box",  "technic:hv_battery_box1", "technic:hv_battery_box2",
                "technic:hv_battery_box3", "technic:hv_battery_box4", "technic:hv_battery_box5",
@@ -192,8 +108,8 @@
      end
      -- Charging/discharging tools here
      current_charge = charge_HV_tools(meta, current_charge)
      current_charge = discharge_HV_tools(meta, current_charge, max_charge)
      current_charge = charge_tools(meta, current_charge, 16000)
      current_charge = discharge_tools(meta, current_charge, max_charge, 16000)
      -- Set a demand (we allow batteries to charge on less than the demand though)
      meta:set_int("HV_EU_demand", math.min(max_charge_rate, max_charge-current_charge))