diff --git a/init.lua b/init.lua
index a532aaa..b88390c 100644
--- a/init.lua
+++ b/init.lua
@@ -69,6 +69,7 @@ dofile(modpath.."/tools/electric_item.lua")
dofile(modpath.."/tools/tool.lua")
dofile(modpath.."/tools/gear_tool.lua")
dofile(modpath.."/tools/electric_tool.lua")
+dofile(modpath.."/tools/activated_electric_tool.lua")
dofile(modpath.."/tools/electric_gear_tool.lua")
dofile(modpath.."/tools/batpack.lua")
dofile(modpath.."/tools/electric_chainsaw.lua")
diff --git a/textures/industrialtest_diamond_electric_chainsaw.png b/textures/industrialtest_advanced_electric_chainsaw.png
similarity index 100%
rename from textures/industrialtest_diamond_electric_chainsaw.png
rename to textures/industrialtest_advanced_electric_chainsaw.png
diff --git a/tools/activated_electric_tool.lua b/tools/activated_electric_tool.lua
new file mode 100644
index 0000000..1e0ed55
--- /dev/null
+++ b/tools/activated_electric_tool.lua
@@ -0,0 +1,117 @@
+-- IndustrialTest
+-- Copyright (C) 2025 mrkubax10
+
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see .
+
+industrialtest.ActivatedElectricTool=table.copy(industrialtest.ElectricTool)
+
+function industrialtest.ActivatedElectricTool.createDefinitionTable(self)
+ local def=industrialtest.ElectricTool.createDefinitionTable(self)
+
+ def.groups._industrialtest_activatedElectricTool=1
+ def.tool_capabilities.full_punch_interval=self.fullPunchInterval
+ if self.digs then
+ self:defineToolCapabilities(def,nil,self.digSpeed)
+ end
+
+ return def
+end
+
+function industrialtest.ActivatedElectricTool.createActiveDefinitionTable(self)
+ local def=self:createDefinitionTable()
+ if self.digs then
+ self:defineToolCapabilities(def,self.active.times,self.active.digSpeed)
+ end
+ def.groups.not_in_creative_inventory=1
+ def.after_use=function(itemstack,user,node,digparams)
+ if self:afterUse(itemstack,user,node,digparams) then
+ return itemstack
+ end
+ return nil
+ end
+ return def
+end
+
+function industrialtest.ActivatedElectricTool.register(self)
+ industrialtest.ElectricTool.register(self)
+ local def=self:createActiveDefinitionTable()
+ minetest.register_tool(self.name.."_active",def)
+end
+
+function industrialtest.ActivatedElectricTool.beforeUse(self,itemstack,node)
+ local def=itemstack:get_definition()
+ if self:canActivate(itemstack,node) then
+ if not self.isActive(itemstack) then
+ itemstack:set_name(itemstack:get_name().."_active")
+ end
+ else
+ itemstack:set_name(self.name)
+ end
+end
+
+function industrialtest.ActivatedElectricTool.afterUse(self,itemstack,user,node,digparams)
+ local meta=itemstack:get_meta()
+ industrialtest.api.addPowerToItem(itemstack,-self:getOpPower(itemstack))
+ return true
+end
+
+function industrialtest.ActivatedElectricTool.canActivate(self,itemstack,node)
+ local meta=itemstack:get_meta()
+ return meta:get_int("industrialtest.powerAmount")>=self:getOpPower(itemstack)
+end
+
+function industrialtest.ActivatedElectricTool.isActive(itemstack)
+ return string.sub(itemstack:get_name(),-string.len("_active"),-1)=="_active"
+end
+
+function industrialtest.ActivatedElectricTool.defineToolCapabilities(self,def,times,digSpeed)
+ if industrialtest.mtgAvailable then
+ if self.digs then
+ def.tool_capabilities.groupcaps={
+ [self.digs]={
+ times=times,
+ maxlevel=self.digLevel
+ }
+ }
+ if self.digs=="choppy" then
+ def.groups.axe=1
+ end
+ end
+ elseif industrialtest.mclAvailable then
+ local digTypeMapping={
+ choppy="axey"
+ }
+ def.groups.dig_speed_class=self.digSpeedClass
+ def._mcl_diggroups={
+ [digTypeMapping[self.digs]]={
+ speed=digSpeed,
+ level=self.digLevel+4,
+ uses=-1
+ }
+ }
+ end
+end
+
+minetest.register_on_punchnode(function(pos,node,user)
+ if not user then
+ return
+ end
+
+ local itemstack=user:get_wielded_item()
+ local def=itemstack:get_definition()
+ if def and def._industrialtest_self and def.groups and def.groups._industrialtest_activatedElectricTool then
+ def._industrialtest_self:beforeUse(itemstack,node)
+ user:set_wielded_item(itemstack)
+ end
+end)
diff --git a/tools/common.lua b/tools/common.lua
index 3f9ff64..37eb231 100644
--- a/tools/common.lua
+++ b/tools/common.lua
@@ -19,23 +19,6 @@ industrialtest.internal.registeredElectricDrills={}
industrialtest.internal.registeredElectricHoes={}
industrialtest.internal.registeredElectricSabers={}
-local function isActive(itemstack)
- return string.sub(itemstack:get_name(),-string.len("_active"),-1)=="_active"
-end
-
-local function beforeUse(user,itemstack,canDig)
- local meta=itemstack:get_meta()
- local def=itemstack:get_definition()
- if meta:get_int("industrialtest.powerAmount")>=20 and canDig then
- if not isActive(itemstack) then
- itemstack:set_name(itemstack:get_name().."_active")
- end
- else
- itemstack:set_name(def._industrialtest_inactiveName)
- end
- user:set_wielded_item(itemstack)
-end
-
minetest.register_on_punchnode(function(pos,node,user,pointed)
if not user then
return
diff --git a/tools/electric_chainsaw.lua b/tools/electric_chainsaw.lua
index a2519a1..dbe7c4e 100644
--- a/tools/electric_chainsaw.lua
+++ b/tools/electric_chainsaw.lua
@@ -15,107 +15,42 @@
-- along with this program. If not, see .
local S=minetest.get_translator("industrialtest")
+industrialtest.ElectricChainsawBase=table.copy(industrialtest.ActivatedElectricTool)
+industrialtest.internal.unpackTableInto(industrialtest.ElectricChainsawBase,{
+ digs="choppy"
+})
-local electricChainsaw={}
-
-electricChainsaw.afterUse=function(itemstack,config)
+function industrialtest.ElectricChainsawBase.use(self,itemstack,user,pointed)
+ if not industrialtest.mclAvailable then
+ return false
+ end
local meta=itemstack:get_meta()
- industrialtest.api.addPowerToItem(itemstack,-20)
- if meta:get_int("industrialtest.powerAmount")<20 then
- itemstack:set_name("industrialtest:"..config.name)
- end
- return itemstack
+ local itemstackCopy=itemstack
+ return itemstack:get_wear()~=industrialtest.internal.mclMakeStrippedTrunk(itemstackCopy,user,pointed,true):get_wear()
end
-local function registerElectricChainsaw(config)
- local definition={
- description=config.displayName,
- inventory_image="industrialtest_"..config.name..".png",
- after_use=function(itemstack)
- -- Hack to make sure that chainsaw won't be destroyed when has 0 EU
- return nil
- end,
- _industrialtest_powerStorage=true,
- _industrialtest_powerCapacity=10000,
- _industrialtest_powerFlow=industrialtest.api.lvPowerFlow,
- _industrialtest_inactiveName="industrialtest:"..config.name
+function industrialtest.ElectricChainsawBase.getOpPower(self,itemstack)
+ return 50
+end
+
+industrialtest.ElectricChainsaw=table.copy(industrialtest.ElectricChainsawBase)
+industrialtest.internal.unpackTableInto(industrialtest.ElectricChainsaw,{
+ name="industrialtest:electric_chainsaw",
+ description=S("Electric Chainsaw"),
+ inventoryImage="industrialtest_electric_chainsaw.png",
+ capacity=10000,
+ flow=industrialtest.api.lvPowerFlow,
+ digLevel=1,
+ digSpeedClass=4,
+ digSpeed=1,
+ active={
+ times={[1]=1.7,[2]=1.2,[3]=1.0,[4]=0.7},
+ digSpeed=7
}
- if industrialtest.mtgAvailable then
- definition.tool_capabilities={
- full_punch_interval=0.5,
- max_drop_level=config.maxDropLevel,
- groupcaps={
- choppy={
- times=config.inactiveTimes,
- maxlevel=config.maxLevel
- }
- }
- }
- definition.groups={
- axe=1
- }
- elseif industrialtest.mclAvailable then
- definition.tool_capabilities={
- full_punch_interval=0.5,
- max_drop_level=config.maxDropLevel,
- }
- definition.groups={
- tool=1,
- dig_speed_class=config.digSpeedClass,
- }
- definition.on_place=function(itemstack,user,pointed)
- local meta=itemstack:get_meta()
- if meta:get_int("industrialtest.powerAmount")>=20 then
- local itemstackCopy=itemstack
- if itemstack:get_wear()~=industrialtest.internal.mclMakeStrippedTrunk(itemstackCopy,user,pointed,true):get_wear() then
- industrialtest.api.addPowerToItem(itemstack,-20)
- return itemstack
- end
- end
- return nil
- end
- definition._mcl_diggroups={
- axey={
- speed=config.inactiveDigSpeed,
- level=config.digLevel,
- uses=-1
- }
- }
- definition._mcl_toollike_wield=true
- end
- minetest.register_tool("industrialtest:"..config.name,definition)
- definition=table.copy(definition)
- if industrialtest.mtgAvailable then
- definition.tool_capabilities.groupcaps.choppy.times=config.activeTimes
- elseif industrialtest.mclAvailable then
- definition._mcl_diggroups.axey.speed=config.activeDigSpeed
- end
- definition.groups.not_in_creative_inventory=1
- definition.on_use=nil
- definition.after_use=function(itemstack)
- return electricChainsaw.afterUse(itemstack,config)
- end
- minetest.register_tool("industrialtest:"..config.name.."_active",definition)
- industrialtest.internal.registeredElectricChainsaws["industrialtest:"..config.name]=true
- industrialtest.internal.registeredElectricChainsaws["industrialtest:"..config.name.."_active"]=true
-end
-local definition={
- name="electric_chainsaw",
- displayName=S("Electric Chainsaw")
-}
-if industrialtest.mtgAvailable then
- definition.maxDropLevel=1
- definition.inactiveTimes={[1]=10,[2]=5.6,[3]=4}
- definition.maxLevel=2
- definition.activeTimes={[1]=2.2,[2]=1.1,[3]=0.7}
-elseif industrialtest.mclAvailable then
- definition.digSpeedClass=4
- definition.maxDropLevel=4
- definition.inactiveDigSpeed=1
- definition.digLevel=4
- definition.activeDigSpeed=7
-end
-registerElectricChainsaw(definition)
+})
+
+industrialtest.ElectricChainsaw:register()
+
minetest.register_craft({
type="shaped",
output="industrialtest:electric_chainsaw",
@@ -125,26 +60,28 @@ minetest.register_craft({
{"industrialtest:re_battery","industrialtest:refined_iron_ingot",""}
}
})
-definition={
- name="diamond_electric_chainsaw",
- displayName=S("Diamond Electric Chainsaw")
-}
-if industrialtest.mtgAvailable then
- definition.maxDropLevel=1
- definition.inactiveTimes={[1]=10,[2]=5.6,[3]=4}
- definition.maxLevel=3
- definition.activeTimes={[1]=2.0,[2]=0.8,[3]=0.4}
-elseif industrialtest.mclAvailable then
- definition.digSpeedClass=5
- definition.maxDropLevel=5
- definition.inactiveDigSpeed=1
- definition.digLevel=5
- definition.activeDigSpeed=9
-end
-registerElectricChainsaw(definition)
+
+industrialtest.AdvancedElectricChainsaw=table.copy(industrialtest.ElectricChainsawBase)
+industrialtest.internal.unpackTableInto(industrialtest.AdvancedElectricChainsaw,{
+ name="industrialtest:advanced_electric_chainsaw",
+ description=S("Advanced Electric Chainsaw"),
+ inventoryImage="industrialtest_advanced_electric_chainsaw.png",
+ capacity=10000,
+ flow=industrialtest.api.lvPowerFlow,
+ digLevel=1,
+ digSpeedClass=5,
+ digSpeed=1,
+ active={
+ times={[1]=1.0,[2]=0.7,[3]=0.5,[4]=0.2},
+ digSpeed=8
+ }
+})
+
+industrialtest.AdvancedElectricChainsaw:register()
+
minetest.register_craft({
type="shaped",
- output="industrialtest:diamond_electric_chainsaw",
+ output="industrialtest:advanced_electric_chainsaw",
recipe={
{"",industrialtest.elementKeys.diamond,""},
{industrialtest.elementKeys.diamond,"industrialtest:electric_chainsaw",industrialtest.elementKeys.diamond}
diff --git a/tools/electric_tool.lua b/tools/electric_tool.lua
index 63da247..335ebab 100644
--- a/tools/electric_tool.lua
+++ b/tools/electric_tool.lua
@@ -19,11 +19,20 @@ industrialtest.internal.unpackTableInto(industrialtest.ElectricTool,{
prepare=industrialtest.ElectricItem.prepare
})
+function industrialtest.ElectricTool.createDefinitionTable(self)
+ local def=industrialtest.Tool.createDefinitionTable(self)
+ def.after_use=function()
+ -- Hack to make sure that chainsaw won't be destroyed when has 0 EU
+ return nil
+ end
+ return def
+end
+
function industrialtest.ElectricTool.onPlace(self,itemstack,user,pointed)
self:prepare(itemstack)
local meta=itemstack:get_meta()
- local opPower=self:getOpPower()
+ local opPower=self:getOpPower(itemstack)
if meta:get_int("industrialtest.powerAmount")