From 521c0b74bba5dd73cf7c0a59fde4a018813e835d Mon Sep 17 00:00:00 2001
From: SmallJoker <mk939@ymail.com>
Date: Thu, 24 Nov 2022 21:49:20 +0100
Subject: [PATCH] Fix battery box charging on Windows

---
 technic/machines/register/battery_box.lua |   87 ++++++++++++++++++++++++++-----------------
 1 files changed, 53 insertions(+), 34 deletions(-)

diff --git a/technic/machines/register/battery_box.lua b/technic/machines/register/battery_box.lua
index af8fd60..190ddbf 100644
--- a/technic/machines/register/battery_box.lua
+++ b/technic/machines/register/battery_box.lua
@@ -192,10 +192,10 @@
 	end
 
 	local run = function(pos, node)
-		local below = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z})
-		local meta           = minetest.get_meta(pos)
+		local meta = minetest.get_meta(pos)
+		local network_id = tonumber(meta:get_string(tier.."_network"))
 
-		if not technic.is_tier_cable(below.name, tier) then
+		if not technic.networks[network_id] then
 			meta:set_string("infotext", S("%s Battery Box Has No Network"):format(tier))
 			return
 		end
@@ -304,9 +304,9 @@
 			drop = "technic:"..ltier.."_battery_box0",
 			on_construct = function(pos)
 				local meta = minetest.get_meta(pos)
-				local EU_upgrade, tube_upgrade = 0, 0
+				local EU_upgrade, _ = 0
 				if data.upgrade then
-					EU_upgrade, tube_upgrade = technic.handle_machine_upgrades(meta)
+					EU_upgrade, _ = technic.handle_machine_upgrades(meta)
 				end
 				local max_charge = data.max_charge * (1 + EU_upgrade / 10)
 				local charge = meta:get_int("internal_EU_charge")
@@ -345,9 +345,9 @@
 					meta = minetest.get_meta(pos)
 					if not pipeworks.may_configure(pos, sender) then return end
 					fs_helpers.on_receive_fields(pos, fields)
-					local EU_upgrade, tube_upgrade = 0, 0
+					local EU_upgrade, _ = 0
 					if data.upgrade then
-						EU_upgrade, tube_upgrade = technic.handle_machine_upgrades(meta)
+						EU_upgrade, _ = technic.handle_machine_upgrades(meta)
 					end
 					local max_charge = data.max_charge * (1 + EU_upgrade / 10)
 					local charge = meta:get_int("internal_EU_charge")
@@ -409,6 +409,30 @@
 	end
 )
 
+local function default_get_charge(itemstack)
+	-- check if is chargable
+	local tool_name = itemstack:get_name()
+	if not technic.power_tools[tool_name] then
+		return 0, 0
+	end
+	-- Set meta data for the tool if it didn't do it itself
+	local item_meta = minetest.deserialize(itemstack:get_metadata()) or {}
+	if not item_meta.charge then
+		item_meta.charge = 0
+	end
+	return item_meta.charge, technic.power_tools[tool_name]
+end
+
+local function default_set_charge(itemstack, charge)
+	local tool_name = itemstack:get_name()
+	if technic.power_tools[tool_name] then
+		technic.set_RE_wear(itemstack, charge, technic.power_tools[tool_name])
+	end
+	local item_meta = minetest.deserialize(itemstack:get_metadata()) or {}
+	item_meta.charge = charge
+	itemstack:set_metadata(minetest.serialize(item_meta))
+end
+
 function technic.charge_tools(meta, batt_charge, charge_step)
 	local inv = meta:get_inventory()
 	if inv:is_empty("src") then
@@ -416,18 +440,18 @@
 	end
 	local src_stack = inv:get_stack("src", 1)
 
-	local tool_name = src_stack:get_name()
-	if not technic.power_tools[tool_name] then
+	-- get callbacks
+	local src_def = src_stack:get_definition()
+	local technic_get_charge = src_def.technic_get_charge or default_get_charge
+	local technic_set_charge = src_def.technic_set_charge or default_set_charge
+
+	-- get tool charge
+	local tool_charge, item_max_charge = technic_get_charge(src_stack)
+	if item_max_charge==0 then
 		return batt_charge, false
 	end
-	-- Set meta data for the tool if it didn't do it itself
-	local src_meta = minetest.deserialize(src_stack:get_metadata()) or {}
-	if not src_meta.charge then
-		src_meta.charge = 0
-	end
+
 	-- Do the charging
-	local item_max_charge = technic.power_tools[tool_name]
-	local tool_charge     = src_meta.charge
 	if tool_charge >= item_max_charge then
 		return batt_charge, true
 	elseif batt_charge <= 0 then
@@ -437,9 +461,7 @@
 	charge_step = math.min(charge_step, item_max_charge - tool_charge)
 	tool_charge = tool_charge + charge_step
 	batt_charge = batt_charge - charge_step
-	technic.set_RE_wear(src_stack, tool_charge, item_max_charge)
-	src_meta.charge = tool_charge
-	src_stack:set_metadata(minetest.serialize(src_meta))
+	technic_set_charge(src_stack, tool_charge)
 	inv:set_stack("src", 1, src_stack)
 	return batt_charge, (tool_charge == item_max_charge)
 end
@@ -450,21 +472,20 @@
 	if inv:is_empty("dst") then
 		return batt_charge, false
 	end
-	local srcstack = inv:get_stack("dst", 1)
-	local toolname = srcstack:get_name()
-	if technic.power_tools[toolname] == nil then
+	local src_stack = inv:get_stack("dst", 1)
+
+	-- get callbacks
+	local src_def = src_stack:get_definition()
+	local technic_get_charge = src_def.technic_get_charge or default_get_charge
+	local technic_set_charge = src_def.technic_set_charge or default_set_charge
+
+	-- get tool charge
+	local tool_charge, item_max_charge = technic_get_charge(src_stack)
+	if item_max_charge==0 then
 		return batt_charge, false
-	end
-	-- Set meta data for the tool if it didn't do it itself :-(
-	local src_meta = minetest.deserialize(srcstack:get_metadata())
-	src_meta = src_meta or {}
-	if not src_meta.charge then
-		src_meta.charge = 0
 	end
 
 	-- Do the discharging
-	local item_max_charge = technic.power_tools[toolname]
-	local tool_charge     = src_meta.charge
 	if tool_charge <= 0 then
 		return batt_charge, true
 	elseif batt_charge >= max_charge then
@@ -474,10 +495,8 @@
 	charge_step = math.min(charge_step, tool_charge)
 	tool_charge = tool_charge - charge_step
 	batt_charge = batt_charge + charge_step
-	technic.set_RE_wear(srcstack, tool_charge, item_max_charge)
-	src_meta.charge = tool_charge
-	srcstack:set_metadata(minetest.serialize(src_meta))
-	inv:set_stack("dst", 1, srcstack)
+	technic_set_charge(src_stack, tool_charge)
+	inv:set_stack("dst", 1, src_stack)
 	return batt_charge, (tool_charge == 0)
 end
 

--
Gitblit v1.8.0