diff --git a/init.lua b/init.lua index b48e145..fcaadbb 100644 --- a/init.lua +++ b/init.lua @@ -61,6 +61,7 @@ dofile(modpath.."/tools/electric_hoe.lua") dofile(modpath.."/tools/electric_saber.lua") dofile(modpath.."/tools/jetpack.lua") dofile(modpath.."/tools/mining_laser.lua") +dofile(modpath.."/tools/nano_suit.lua") dofile(modpath.."/tools/solar_helmet.lua") dofile(modpath.."/tools/static_boots.lua") dofile(modpath.."/tools/treetap.lua") diff --git a/tools/nano_suit.lua b/tools/nano_suit.lua new file mode 100644 index 0000000..adde0e4 --- /dev/null +++ b/tools/nano_suit.lua @@ -0,0 +1,164 @@ +-- IndustrialTest +-- Copyright (C) 2024 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 . + +local S=minetest.get_translator("industrialtest") + +local function registerNanoSuitPart(config) + local groups={ + _industrialtest_nanoSuit=1 + } + if config.element=="head" then + groups.armor_head=1 + elseif config.element=="torso" then + groups.armor_torso=1 + elseif config.element=="legs" then + groups.armor_legs=1 + elseif config.element=="feet" then + groups.armor_feet=1 + end + if industrialtest.mtgAvailable then + groups.armor_heal=0 + armor:register_armor("industrialtest:"..config.name,{ + description=config.displayName, + inventory_image="industrialtest_"..config.name.."_inv.png", + groups=groups, + _industrialtest_powerStorage=true, + _industrialtest_powerCapacity=1000000, + _industrialtest_powerFlow=industrialtest.api.evPowerFlow, + _industrialtest_damageReduction=config.damageReduction + }) + elseif industrialtest.mclAvailable then + groups.armor=1 + groups.non_combat_armor=1 + minetest.register_tool("industrialtest:nano_helmet",{ + description=config.displayName, + inventory_image="industrialtest_"..config.name.."_inv.png", + groups=groups, + sounds={ + _mcl_armor_equip="mcl_armor_equip_iron", + _mcl_armor_unequip="mcl_armor_unequip_iron" + }, + on_place=mcl_armor.equip_on_use, + on_secondary_use=mcl_armor.equip_on_use, + _mcl_armor_element=config.element, + _mcl_armor_texture="industrialtest_"..config.name..".png", + _industrialtest_powerStorage=true, + _industrialtest_powerCapacity=1000000, + _industrialtest_powerFlow=industrialtest.api.evPowerFlow, + _industrialtest_damageReduction=config.damageReduction + }) + end +end + +registerNanoSuitPart({ + name="nano_helmet", + displayName=S("Nano Helmet"), + element="head", + damageReduction=0.12 +}) +minetest.register_craft({ + type="shaped", + output="industrialtest:nano_helmet", + recipe={ + {"industrialtest:carbon_plate","industrialtest:energy_crystal","industrialtest:carbon_plate"}, + {"industrialtest:carbon_plate",industrialtest.elementKeys.glass,"industrialtest:carbon_plate"} + } +}) + +registerNanoSuitPart({ + name="nano_bodyarmor", + displayName=S("Nano Bodyarmor"), + element="torso", + damageReduction=0.32 +}) +minetest.register_craft({ + type="shaped", + output="industrialtest:nano_bodyarmor", + recipe={ + {"industrialtest:carbon_plate","","industrialtest:carbon_plate"}, + {"industrialtest:carbon_plate","industrialtest:energy_crystal","industrialtest:carbon_plate"}, + {"industrialtest:carbon_plate","industrialtest:carbon_plate","industrialtest:carbon_plate"} + } +}) + +registerNanoSuitPart({ + name="nano_leggings", + displayName=S("Nano Leggings"), + element="legs", + damageReduction=0.3 +}) +minetest.register_craft({ + type="shaped", + output="industrialtest:nano_leggings", + recipe={ + {"industrialtest:carbon_plate","industrialtest:energy_crystal","industrialtest:carbon_plate"}, + {"industrialtest:carbon_plate","","industrialtest:carbon_plate"}, + {"industrialtest:carbon_plate","","industrialtest:carbon_plate"} + } +}) + +registerNanoSuitPart({ + name="nano_boots", + displayName=S("Nano Boots"), + element="feet", + damageReduction=0.24 +}) +minetest.register_craft({ + type="shaped", + output="industrialtest:nano_boots", + recipe={ + {"industrialtest:carbon_plate","","industrialtest:carbon_plate"}, + {"industrialtest:carbon_plate","industrialtest:energy_crystal","industrialtest:carbon_plate"} + } +}) + +minetest.register_on_player_hpchange(function(player,hpChange) + if hpChange>0 or not player:is_player() then + return hpChange + end + + local inv + if industrialtest.mtgAvailable then + _,inv=armor:get_valid_player(player,"") + if not inv then + return hpChange + end + elseif industrialtest.mclAvailable then + inv=player:get_inventory() + end + + local armorList=inv:get_list("armor") + assert(armorList) + local result=hpChange + for i=1,#armorList do + local stack=armorList[i] + local def=stack:get_definition() + if def.groups and def.groups._industrialtest_nanoSuit then + local meta=stack:get_meta() + local targetReducedDamage=math.floor(math.abs(hpChange)*def._industrialtest_damageReduction) + local requiredPower=targetReducedDamage*5000 + local availablePower=math.min(meta:get_int("industrialtest.powerAmount"),requiredPower) + local reducedDamage=math.floor(availablePower/5000) + if reducedDamage>0 then + result=result+reducedDamage + industrialtest.api.addPowerToItem(stack,-reducedDamage*5000) + inv:set_stack("armor",i,stack) + end + end + end + + return result +end,true)