From 6f864eca787cd757e55a3db6241cbc3a059bd1f3 Mon Sep 17 00:00:00 2001 From: mrkubax10 Date: Mon, 14 Apr 2025 16:32:58 +0200 Subject: [PATCH] Refactor electric hoes --- ... industrialtest_advanced_electric_hoe.png} | Bin tools/activated_electric_tool.lua | 5 +- tools/electric_hoe.lua | 291 ++++++++---------- tools/electric_tool.lua | 15 + tools/tool.lua | 11 + 5 files changed, 156 insertions(+), 166 deletions(-) rename textures/{industrialtest_diamond_electric_hoe.png => industrialtest_advanced_electric_hoe.png} (100%) diff --git a/textures/industrialtest_diamond_electric_hoe.png b/textures/industrialtest_advanced_electric_hoe.png similarity index 100% rename from textures/industrialtest_diamond_electric_hoe.png rename to textures/industrialtest_advanced_electric_hoe.png diff --git a/tools/activated_electric_tool.lua b/tools/activated_electric_tool.lua index 4c73739..426373b 100644 --- a/tools/activated_electric_tool.lua +++ b/tools/activated_electric_tool.lua @@ -90,6 +90,8 @@ function industrialtest.ActivatedElectricTool.defineToolCapabilities(self,def,ti def.groups.pickaxe=1 elseif digType=="crumbly" then def.groups.shovel=1 + elseif digType=="hoey" then + def.groups.hoe=1 end end end @@ -97,7 +99,8 @@ function industrialtest.ActivatedElectricTool.defineToolCapabilities(self,def,ti local digTypeMapping={ choppy="axey", cracky="pickaxey", - crumbly="shovely" + crumbly="shovely", + hoey="hoey" } def.groups.dig_speed_class=self.digSpeedClass def._mcl_diggroups={} diff --git a/tools/electric_hoe.lua b/tools/electric_hoe.lua index e162075..24e4c20 100644 --- a/tools/electric_hoe.lua +++ b/tools/electric_hoe.lua @@ -15,184 +15,137 @@ -- along with this program. If not, see . local S=minetest.get_translator("industrialtest") +industrialtest.ElectricHoeBase=table.copy(industrialtest.ActivatedElectricTool) +industrialtest.internal.unpackTableInto(industrialtest.ElectricHoeBase,{ + digs={"hoey"}, + capacity=10000, + flow=industrialtest.api.lvPowerFlow +}) -local electricHoe={} +function industrialtest.ElectricHoeBase.createDefinitionTable(self) + local def=industrialtest.ActivatedElectricTool.createDefinitionTable(self) -electricHoe.afterUse=function(itemstack,config) - local meta=itemstack:get_meta() - industrialtest.api.addPowerToItem(itemstack,-20) - if meta:get_int("industrialtest.powerAmount")<20 then - itemstack:set_name("industrialtest:"..config.name) + if industrialtest.mtgAvailable then + def.on_place=minetest.item_place + elseif industrialtest.mclAvailable then + def.on_use=nil end - return itemstack + + return def end -local function registerElectricHoe(config) - local definition={ - description=config.displayName, - inventory_image="industrialtest_"..config.name..".png", - _industrialtest_powerStorage=true, - _industrialtest_powerCapacity=10000, - _industrialtest_powerFlow=industrialtest.api.lvPowerFlow, - _industrialtest_inactiveName="industrialtest:"..config.name - } - if industrialtest.mtgAvailable then - -- Taken and adapted from farming mod from Minetest Game - local function onUse(user,pointed) - local pt = pointed - -- check if pointing at a node - if not pt then - return false - end - if pt.type ~= "node" then - return false - end +function industrialtest.ElectricHoeBase.hitUse(self,itemstack,user,pointed) + -- Taken and adapted from farming mod from Minetest Game + local pt = pointed + -- check if pointing at a node + if not pt then + return false + end + if pt.type ~= "node" then + return false + end - local under = minetest.get_node(pt.under) - local p = {x=pt.under.x, y=pt.under.y+1, z=pt.under.z} - local above = minetest.get_node(p) + local under = minetest.get_node(pt.under) + local p = {x=pt.under.x, y=pt.under.y+1, z=pt.under.z} + local above = minetest.get_node(p) - -- return if any of the nodes is not registered - if not minetest.registered_nodes[under.name] then - return false - end - if not minetest.registered_nodes[above.name] then - return false - end + -- return if any of the nodes is not registered + if not minetest.registered_nodes[under.name] then + return false + end + if not minetest.registered_nodes[above.name] then + return false + end - -- check if the node above the pointed thing is air - if above.name ~= "air" then - return false - end + -- check if the node above the pointed thing is air + if above.name ~= "air" then + return false + end - -- check if pointing at soil - if minetest.get_item_group(under.name, "soil") ~= 1 then - return false - end + -- check if pointing at soil + if minetest.get_item_group(under.name, "soil") ~= 1 then + return false + end - -- check if (wet) soil defined - local regN = minetest.registered_nodes - if regN[under.name].soil == nil or regN[under.name].soil.wet == nil or regN[under.name].soil.dry == nil then - return false - end + -- check if (wet) soil defined + local regN = minetest.registered_nodes + if regN[under.name].soil == nil or regN[under.name].soil.wet == nil or regN[under.name].soil.dry == nil then + return false + end - local player_name = user and user:get_player_name() or "" + local player_name = user and user:get_player_name() or "" - if minetest.is_protected(pt.under, player_name) then - minetest.record_protection_violation(pt.under, player_name) - return false - end - if minetest.is_protected(pt.above, player_name) then - minetest.record_protection_violation(pt.above, player_name) - return false - end + if minetest.is_protected(pt.under, player_name) then + minetest.record_protection_violation(pt.under, player_name) + return false + end + if minetest.is_protected(pt.above, player_name) then + minetest.record_protection_violation(pt.above, player_name) + return false + end - -- turn the node into soil and play sound - minetest.set_node(pt.under, {name = regN[under.name].soil.dry}) - minetest.sound_play("default_dig_crumbly", { - pos = pt.under, - gain = 0.3, - }, true) + -- turn the node into soil and play sound + minetest.set_node(pt.under, {name = regN[under.name].soil.dry}) + minetest.sound_play("default_dig_crumbly", { + pos = pt.under, + gain = 0.3, + }, true) - return true - end - definition.groups={ - hoe=1 - } - definition.on_use=function(itemstack,user,pointed) - local meta=itemstack:get_meta() - if meta:get_int("industrialtest.powerAmount")>=20 and onUse(user,pointed) then - industrialtest.api.addPowerToItem(itemstack,-20) - return itemstack - end - return nil - end - elseif industrialtest.mclAvailable then - -- Taken from https://git.minetest.land/MineClone2/MineClone2/src/branch/master/mods/ITEMS/mcl_farming/hoes.lua#L3 - local function createSoil(pos) - if pos == nil then - return false - end - local node = minetest.get_node(pos) - local name = node.name - local above = minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}) - if minetest.get_item_group(name, "cultivatable") == 2 then - if above.name == "air" then - node.name = "mcl_farming:soil" - minetest.set_node(pos, node) - minetest.sound_play("default_dig_crumbly", { pos = pos, gain = 0.5 }, true) - return true - end - elseif minetest.get_item_group(name, "cultivatable") == 1 then - if above.name == "air" then - node.name = "mcl_core:dirt" - minetest.set_node(pos, node) - minetest.sound_play("default_dig_crumbly", { pos = pos, gain = 0.6 }, true) - return true - end - end + return true +end + +function industrialtest.ElectricHoeBase.use(self,itemstack,user,pointed) + local node=minetest.get_node(pointed.under) + if user and not user:get_player_control().sneak then + if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then + minetest.registered_nodes[node.name].on_rightclick(pointed.under,node,user,itemstack) return false end - definition.tool_capabilities={ - full_punch_interval=0.5 - } - definition.groups={ - tool=1 - } - definition.on_place=function(itemstack,user,pointed) - local node=minetest.get_node(pointed.under) - if user and not user:get_player_control().sneak then - if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then - return minetest.registered_nodes[node.name].on_rightclick(pointed.under,node,user,itemstack) or itemstack - end - end - if minetest.is_protected(pointed.under, user:get_player_name()) then - minetest.record_protection_violation(pointed.under,user:get_player_name()) - return nil - end - local meta=itemstack:get_meta() - if meta:get_int("industrialtest.powerAmount")>=20 and createSoil(pointed.under) then - industrialtest.api.addPowerToItem(itemstack,-20) - return itemstack - end - return nil - end - definition.after_use=function(itemstack) - -- Hack to make sure that chainsaw won't be destroyed when has 0 EU in MCL - return nil - end - definition._mcl_toollike_wield=true - definition._mcl_diggroups={ - hoey={ - speed=config.inactiveDigSpeed, - level=config.digLevel, - uses=-1 - } - } end - minetest.register_tool("industrialtest:"..config.name,definition) - if industrialtest.mclAvailable then - definition=table.copy(definition) - definition._mcl_diggroups.hoey.speed=config.activeDigSpeed - definition.groups.not_in_creative_inventory=1 - definition.after_use=function(itemstack) - return electricHoe.afterUse(itemstack,config) - end - minetest.register_tool("industrialtest:"..config.name.."_active",definition) - industrialtest.internal.registeredElectricHoes["industrialtest:"..config.name.."_active"]=true + if minetest.is_protected(pointed.under, user:get_player_name()) then + minetest.record_protection_violation(pointed.under,user:get_player_name()) + return false end - industrialtest.internal.registeredElectricHoes["industrialtest:"..config.name]=true + + -- Taken and adapted from https://git.minetest.land/MineClone2/MineClone2/src/branch/master/mods/ITEMS/mcl_farming/hoes.lua#L3 + local name = node.name + local above = minetest.get_node({x=pointed.under.x, y=pointed.under.y+1, z=pointed.under.z}) + if minetest.get_item_group(name, "cultivatable") == 2 then + if above.name == "air" then + node.name = "mcl_farming:soil" + minetest.set_node(pointed.under, node) + minetest.sound_play("default_dig_crumbly", { pos = pointed.under, gain = 0.5 }, true) + return true + end + elseif minetest.get_item_group(name, "cultivatable") == 1 then + if above.name == "air" then + node.name = "mcl_core:dirt" + minetest.set_node(pointed.under, node) + minetest.sound_play("default_dig_crumbly", { pos = pointed.under, gain = 0.6 }, true) + return true + end + end + return false end -local definition={ - name="electric_hoe", - displayName=S("Electric Hoe") -} -if industrialtest.mclAvailable then - definition.inactiveDigSpeed=1 - definition.digLevel=2 - definition.activeDigSpeed=7 + +function industrialtest.ElectricHoeBase.getOpPower(self,itemstack) + return 50 end -registerElectricHoe(definition) + +industrialtest.ElectricHoe=table.copy(industrialtest.ElectricHoeBase) +industrialtest.internal.unpackTableInto(industrialtest.ElectricHoe,{ + name="industrialtest:electric_hoe", + description=S("Electric Hoe"), + inventoryImage="industrialtest_electric_hoe.png", + digLevel=0, + digSpeedClass=4, + active={ + digSpeed=3 + } +}) + +industrialtest.ElectricHoe:register() + minetest.register_craft({ type="shaped", output="industrialtest:electric_hoe", @@ -211,17 +164,25 @@ minetest.register_craft({ {"industrialtest:re_battery",""} } }) + if industrialtest.mclAvailable then - registerElectricHoe({ - name="diamond_electric_hoe", - displayName=S("Diamond Electric Hoe"), - inactiveDigSpeed=1, - digLevel=5, - activeDigSpeed=9 + industrialtest.AdvancedElectricHoe=table.copy(industrialtest.ElectricHoeBase) + industrialtest.internal.unpackTableInto(industrialtest.AdvancedElectricHoe,{ + name="industrialtest:advanced_electric_hoe", + description=S("Advanced Electric Hoe"), + inventoryImage="industrialtest_advanced_electric_hoe.png", + digLevel=0, + digSpeedClass=5, + active={ + digSpeed=7 + } }) + + industrialtest.AdvancedElectricHoe:register() + minetest.register_craft({ type="shapeless", - output="industrialtest:diamond_electric_hoe", + output="industrialtest:advanced_electric_hoe", recipe={ "industrialtest:electric_hoe", industrialtest.elementKeys.diamond, diff --git a/tools/electric_tool.lua b/tools/electric_tool.lua index 335ebab..0b84166 100644 --- a/tools/electric_tool.lua +++ b/tools/electric_tool.lua @@ -43,6 +43,21 @@ function industrialtest.ElectricTool.onPlace(self,itemstack,user,pointed) return true end +function industrialtest.ElectricTool.onUse(self,itemstack,user,pointed) + self:prepare(itemstack) + + local meta=itemstack:get_meta() + local opPower=self:getOpPower(itemstack) + if meta:get_int("industrialtest.powerAmount")