From 5c34070bdce9f29a285ec3c213848fc219644a54 Mon Sep 17 00:00:00 2001 From: SFENCE Date: Sun, 5 Jun 2022 22:19:12 +0200 Subject: [PATCH] Move default set/get charge code to local functions. Update doc. --- technic/doc/api.md | 2 + technic/machines/register/battery_box.lua | 96 ++++++++++------------- 2 files changed, 45 insertions(+), 53 deletions(-) diff --git a/technic/doc/api.md b/technic/doc/api.md index 4893424..bf68e71 100644 --- a/technic/doc/api.md +++ b/technic/doc/api.md @@ -146,6 +146,8 @@ Additional definition fields: * This callback is run when the machine is no longer connected to a technic-powered network. * `.technic_get_charge = function(itemstack) ...` * This optional callback will be used to get itemstack charge and max\_charge + * Have to return values `charge, max_charge` + * Etc. `local charge, maxcharge = itemdef.technic_get_charge(itemstack)` * `.technic_set_charge = function(itemstack, charge) ...` * This optional callback will be used to set itemstack charge diff --git a/technic/machines/register/battery_box.lua b/technic/machines/register/battery_box.lua index 2df704d..d0944d0 100644 --- a/technic/machines/register/battery_box.lua +++ b/technic/machines/register/battery_box.lua @@ -409,6 +409,29 @@ minetest.register_on_player_receive_fields( 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 = {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,28 +439,17 @@ function technic.charge_tools(meta, batt_charge, charge_step) end local src_stack = inv:get_stack("src", 1) - -- get tool charge - local item_max_charge - local tool_charge - + -- get callbacks local src_def = src_stack:get_definition() - if src_def.technic_get_charge then - -- use get_charge callback - tool_charge, item_max_charge = src_def.technic_get_charge(src_stack) - else - -- check if is chargable - local tool_name = src_stack:get_name() - if not technic.power_tools[tool_name] 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 - item_max_charge = technic.power_tools[tool_name] - tool_charge = src_meta.charge + 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 + -- Do the charging if tool_charge >= item_max_charge then return batt_charge, true @@ -448,13 +460,7 @@ function technic.charge_tools(meta, batt_charge, charge_step) charge_step = math.min(charge_step, item_max_charge - tool_charge) tool_charge = tool_charge + charge_step batt_charge = batt_charge - charge_step - if src_def.technic_set_charge then - src_def.technic_set_charge(src_stack, tool_charge) - else - technic.set_RE_wear(src_stack, tool_charge, item_max_charge) - local src_meta = {charge = tool_charge} - src_stack:set_metadata(minetest.serialize(src_meta)) - end + technic_set_charge(src_stack, tool_charge) inv:set_stack("src", 1, src_stack) return batt_charge, (tool_charge == item_max_charge) end @@ -466,28 +472,18 @@ function technic.discharge_tools(meta, batt_charge, charge_step, max_charge) return batt_charge, false end local src_stack = inv:get_stack("dst", 1) - -- get tool charge - local item_max_charge - local tool_charge + -- get callbacks local src_def = src_stack:get_definition() - if src_def.technic_get_charge then - -- use get_charge callback - tool_charge, item_max_charge = src_def.technic_get_charge(src_stack) - else - -- check if is chargable - local tool_name = src_stack:get_name() - if not technic.power_tools[tool_name] 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 - item_max_charge = technic.power_tools[tool_name] - tool_charge = src_meta.charge + 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 + -- Do the discharging if tool_charge <= 0 then return batt_charge, true @@ -498,13 +494,7 @@ function technic.discharge_tools(meta, batt_charge, charge_step, max_charge) charge_step = math.min(charge_step, tool_charge) tool_charge = tool_charge - charge_step batt_charge = batt_charge + charge_step - if src_def.technic_set_charge then - src_def.technic_set_charge(src_stack, tool_charge) - else - technic.set_RE_wear(src_stack, tool_charge, item_max_charge) - local src_meta = {charge = tool_charge} - src_stack:set_metadata(minetest.serialize(src_meta)) - end + technic_set_charge(src_stack, tool_charge) inv:set_stack("dst", 1, src_stack) return batt_charge, (tool_charge == 0) end