Refactor electric sabers

This commit is contained in:
2025-04-15 22:47:44 +02:00
parent 6f864eca78
commit b383231c40
5 changed files with 141 additions and 170 deletions

View File

@@ -14,162 +14,95 @@
-- You should have received a copy of the GNU General Public License
-- along with this program. If not, see <http://www.gnu.org/licenses/>.
-- This entire code is super hacky, I'm aware.
local S=minetest.get_translator("industrialtest")
industrialtest.ElectricSaberBase=table.copy(industrialtest.ActivatedElectricTool)
industrialtest.internal.unpackTableInto(industrialtest.ElectricSaberBase,{
fullPunchInterval=0.5,
digs={"snappy"},
hits={"fleshy"},
capacity=100000,
flow=industrialtest.api.hvPowerFlow
})
local electricSaber={}
electricSaber.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)
end
return itemstack
function industrialtest.ElectricSaberBase.createActiveDefinitionTable(self)
self.define.onUse=false
return industrialtest.ActivatedElectricTool.createActiveDefinitionTable(self)
end
local function registerElectricSaber(config)
local definition={
description=config.displayName,
inventory_image="industrialtest_"..config.name..".png",
after_use=function()
-- Hack to make sure that saber 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.ElectricSaberBase.hitUse(self,itemstack,user,pointed)
if self:canActivate(itemstack) and pointed.type=="object" then
-- pointed is a ObjectRef
industrialtest.api.addPowerToItem(itemstack,-self:getOpPower(itemstack))
local toolCapabilities={damage_groups={}}
for _,hitType in ipairs(self.hits) do
toolCapabilities.damage_groups[hitType]=self.active.damage
end
pointed.ref:punch(user,nil,toolCapabilities)
return true
end
return false
end
function industrialtest.ElectricSaberBase.afterUse(self,itemstack,user,node,digparams)
industrialtest.ActivatedElectricTool.afterUse(self,itemstack,user,node,digparams)
itemstack:set_name(self.name)
return true
end
function industrialtest.ElectricSaberBase.getOpPower(self,itemstack)
return 500
end
industrialtest.ElectricSaber=table.copy(industrialtest.ElectricSaberBase)
industrialtest.internal.unpackTableInto(industrialtest.ElectricSaber,{
name="industrialtest:electric_saber",
description=S("Electric Saber"),
inventoryImage="industrialtest_electric_saber.png",
digLevel=0,
digSpeedClass=4,
active={
digSpeed=7,
times={[1]=0.7,[2]=0.5,[3]=0.2,[4]=0.15},
damage=3
}
if industrialtest.mtgAvailable then
definition.groups={
sword=1
}
definition.tool_capabilities={
full_punch_interval=0.5,
max_drop_level=config.maxDropLevel,
groupcaps={
snappy={
times=config.inactiveTimes,
maxlevel=config.maxLevel
}
},
damage_groups={fleshy=config.inactiveDamage}
}
elseif industrialtest.mclAvailable then
definition.groups={
weapon=1,
sword=1,
dig_speed_class=config.digSpeedClass
}
definition.tool_capabilities={
full_punch_interval=0.5,
max_drop_level=config.maxDropLevel,
damage_groups={fleshy=config.inactiveDamage}
}
definition._mcl_toollike_wield=true
definition._mcl_diggroups={
swordy={
speed=config.inactiveDigSpeed,
level=config.digLevel,
uses=-1
},
swordy_cobweb={
speed=config.inactiveDigSpeed,
level=config.digLevel,
uses=-1
}
}
end
minetest.register_tool("industrialtest:"..config.name,definition)
definition=table.copy(definition)
if industrialtest.mtgAvailable then
definition.tool_capabilities.groupcaps.snappy.times=config.activeTimes
definition.tool_capabilities.damage_groups.fleshy=config.activeDamage
elseif industrialtest.mclAvailable then
definition.tool_capabilities.damage_groups.fleshy=config.activeDamage
definition._mcl_diggroups.swordy.speed=config.activeDigSpeed
definition._mcl_diggroups.swordy_cobweb.speed=config.activeDigSpeed
end
definition.groups.not_in_creative_inventory=1
definition.after_use=function(itemstack)
return electricSaber.afterUse(itemstack,config)
end
minetest.register_tool("industrialtest:"..config.name.."_active",definition)
industrialtest.internal.registeredElectricSabers["industrialtest:"..config.name]=true
industrialtest.internal.registeredElectricSabers["industrialtest:"..config.name.."_active"]=true
end
local definition={
name="electric_saber",
displayName=S("Electric Saber")
}
if industrialtest.mtgAvailable then
definition.maxDropLevel=1
definition.inactiveTimes={[1]=10,[2]=5.6,[3]=4}
definition.maxLevel=3
definition.inactiveDamage=1
definition.activeTimes={[1]=2.0,[2]=0.8,[3]=0.4}
definition.activeDamage=6
elseif industrialtest.mclAvailable then
definition.digSpeedClass=4
definition.maxDropLevel=4
definition.inactiveDamage=1
definition.inactiveDigSpeed=1
definition.digLevel=4
definition.activeDamage=6
definition.activeDigSpeed=7
end
registerElectricSaber(definition)
})
industrialtest.ElectricSaber:register()
minetest.register_craft({
type="shaped",
output="industrialtest:electric_saber",
recipe={
{"industrialtest:refined_iron_ingot"},
{"industrialtest:refined_iron_ingot"},
{"industrialtest:re_battery"}
{industrialtest.elementKeys.yellowDust,"industrialtest:advanced_alloy",""},
{industrialtest.elementKeys.yellowDust,"industrialtest:advanced_alloy",""},
{"industrialtest:carbon_plate","industrialtest:energy_crystal","industrialtest:carbon_plate"}
}
})
definition={
name="diamond_electric_saber",
displayName=S("Diamond Electric Saber")
}
if industrialtest.mtgAvailable then
definition.maxDropLevel=1
definition.inactiveTimes={[1]=10,[2]=5.6,[3]=4}
definition.maxLevel=3
definition.inactiveDamage=1
definition.activeTimes={[1]=2.0,[2]=0.8,[3]=0.4}
definition.activeDamage=9
elseif industrialtest.mclAvailable then
definition.digSpeedClass=5
definition.maxDropLevel=5
definition.inactiveDamage=1
definition.inactiveDigSpeed=1
definition.digLevel=5
definition.activeDamage=9
definition.activeDigSpeed=9
end
registerElectricSaber(definition)
industrialtest.AdvancedElectricSaber=table.copy(industrialtest.ElectricSaberBase)
industrialtest.internal.unpackTableInto(industrialtest.AdvancedElectricSaber,{
name="industrialtest:advanced_electric_saber",
description=S("Advanced Electric Saber"),
inventoryImage="industrialtest_advanced_electric_saber.png",
digLevel=0,
digSpeedClass=5,
active={
digSpeed=8,
times={[1]=0.5,[2]=0.2,[3]=0.15,[4]=0.1},
damage=5
}
})
industrialtest.AdvancedElectricSaber:register()
minetest.register_craft({
type="shapeless",
output="industrialtest:diamond_electric_saber",
output="industrialtest:advanced_electric_saber",
recipe={
"industrialtest:electric_saber",
industrialtest.elementKeys.diamond,
industrialtest.elementKeys.diamond
}
})
minetest.register_on_punchplayer(function(player,hitter)
local itemstack=hitter:get_wielded_item()
if industrialtest.internal.registeredElectricSabers[itemstack:get_name()] then
local meta=itemstack:get_meta()
if meta:get_int("industrialtest.powerAmount")>=20 then
industrialtest.api.addPowerToItem(itemstack,-20)
hitter:set_wielded_item(itemstack)
local def=minetest.registered_tools[itemstack:get_name().."_active"]
player:set_hp(player:get_hp()-def.tool_capabilites.damage_groups.fleshy)
return true
end
end
return false
end)