@@ -409,25 +409,49 @@ minetest.register_on_player_receive_fields(
409
409
end
410
410
)
411
411
412
+ local function default_get_charge (itemstack )
413
+ -- check if is chargable
414
+ local tool_name = itemstack :get_name ()
415
+ if not technic .power_tools [tool_name ] then
416
+ return 0 , 0
417
+ end
418
+ -- Set meta data for the tool if it didn't do it itself
419
+ local item_meta = minetest .deserialize (itemstack :get_metadata ()) or {}
420
+ if not item_meta .charge then
421
+ item_meta .charge = 0
422
+ end
423
+ return item_meta .charge , technic .power_tools [tool_name ]
424
+ end
425
+
426
+ local function default_set_charge (itemstack , charge )
427
+ local tool_name = itemstack :get_name ()
428
+ if technic .power_tools [tool_name ] then
429
+ technic .set_RE_wear (itemstack , charge , technic .power_tools [tool_name ])
430
+ end
431
+ local item_meta = minetest .deserialize (itemstack :get_metadata ()) or {}
432
+ item_meta .charge = charge
433
+ itemstack :set_metadata (minetest .serialize (item_meta ))
434
+ end
435
+
412
436
function technic .charge_tools (meta , batt_charge , charge_step )
413
437
local inv = meta :get_inventory ()
414
438
if inv :is_empty (" src" ) then
415
439
return batt_charge , false
416
440
end
417
441
local src_stack = inv :get_stack (" src" , 1 )
418
442
419
- local tool_name = src_stack :get_name ()
420
- if not technic .power_tools [tool_name ] then
443
+ -- get callbacks
444
+ local src_def = src_stack :get_definition ()
445
+ local technic_get_charge = src_def .technic_get_charge or default_get_charge
446
+ local technic_set_charge = src_def .technic_set_charge or default_set_charge
447
+
448
+ -- get tool charge
449
+ local tool_charge , item_max_charge = technic_get_charge (src_stack )
450
+ if item_max_charge == 0 then
421
451
return batt_charge , false
422
452
end
423
- -- Set meta data for the tool if it didn't do it itself
424
- local src_meta = minetest .deserialize (src_stack :get_metadata ()) or {}
425
- if not src_meta .charge then
426
- src_meta .charge = 0
427
- end
453
+
428
454
-- Do the charging
429
- local item_max_charge = technic .power_tools [tool_name ]
430
- local tool_charge = src_meta .charge
431
455
if tool_charge >= item_max_charge then
432
456
return batt_charge , true
433
457
elseif batt_charge <= 0 then
@@ -437,9 +461,7 @@ function technic.charge_tools(meta, batt_charge, charge_step)
437
461
charge_step = math.min (charge_step , item_max_charge - tool_charge )
438
462
tool_charge = tool_charge + charge_step
439
463
batt_charge = batt_charge - charge_step
440
- technic .set_RE_wear (src_stack , tool_charge , item_max_charge )
441
- src_meta .charge = tool_charge
442
- src_stack :set_metadata (minetest .serialize (src_meta ))
464
+ technic_set_charge (src_stack , tool_charge )
443
465
inv :set_stack (" src" , 1 , src_stack )
444
466
return batt_charge , (tool_charge == item_max_charge )
445
467
end
@@ -450,21 +472,20 @@ function technic.discharge_tools(meta, batt_charge, charge_step, max_charge)
450
472
if inv :is_empty (" dst" ) then
451
473
return batt_charge , false
452
474
end
453
- local srcstack = inv :get_stack (" dst" , 1 )
454
- local toolname = srcstack :get_name ()
455
- if technic .power_tools [toolname ] == nil then
475
+ local src_stack = inv :get_stack (" dst" , 1 )
476
+
477
+ -- get callbacks
478
+ local src_def = src_stack :get_definition ()
479
+ local technic_get_charge = src_def .technic_get_charge or default_get_charge
480
+ local technic_set_charge = src_def .technic_set_charge or default_set_charge
481
+
482
+ -- get tool charge
483
+ local tool_charge , item_max_charge = technic_get_charge (src_stack )
484
+ if item_max_charge == 0 then
456
485
return batt_charge , false
457
486
end
458
- -- Set meta data for the tool if it didn't do it itself :-(
459
- local src_meta = minetest .deserialize (srcstack :get_metadata ())
460
- src_meta = src_meta or {}
461
- if not src_meta .charge then
462
- src_meta .charge = 0
463
- end
464
487
465
488
-- Do the discharging
466
- local item_max_charge = technic .power_tools [toolname ]
467
- local tool_charge = src_meta .charge
468
489
if tool_charge <= 0 then
469
490
return batt_charge , true
470
491
elseif batt_charge >= max_charge then
@@ -474,10 +495,8 @@ function technic.discharge_tools(meta, batt_charge, charge_step, max_charge)
474
495
charge_step = math.min (charge_step , tool_charge )
475
496
tool_charge = tool_charge - charge_step
476
497
batt_charge = batt_charge + charge_step
477
- technic .set_RE_wear (srcstack , tool_charge , item_max_charge )
478
- src_meta .charge = tool_charge
479
- srcstack :set_metadata (minetest .serialize (src_meta ))
480
- inv :set_stack (" dst" , 1 , srcstack )
498
+ technic_set_charge (src_stack , tool_charge )
499
+ inv :set_stack (" dst" , 1 , src_stack )
481
500
return batt_charge , (tool_charge == 0 )
482
501
end
483
502
0 commit comments