InsaneProtestor/mods/ip_terumet/interop/3d_armor.lua
2022-11-22 00:44:34 -05:00

220 lines
9.0 KiB
Lua

-- add armor when 3darmor mod is also active
local opts = terumet.options.armor
local function gen_armor_groups(type, data)
local grps = {
armor_use=data.uses,
armor_heal=(data.heal or 0),
armor_water=(data.breathing or 0),
armor_fire=data.fire,
physics_speed=(data.speed or 0),
physics_gravity=(data.gravity or 0),
physics_jump=(data.jump or 0),
}
grps[type]=1
return grps
end
local function reg_recipe_boots(id, mat)
minetest.register_craft{output=id, recipe={
{mat, '', mat},
{mat, '', mat}
}}
end
local function reg_recipe_legs(id, mat)
minetest.register_craft{output=id, recipe={
{mat, mat, mat},
{mat, '', mat},
{mat, '', mat}
}}
end
local function reg_recipe_chest(id, mat)
minetest.register_craft{output=id, recipe={
{mat, '', mat},
{mat, mat, mat},
{mat, mat, mat}
}}
end
local function reg_recipe_helm(id, mat)
minetest.register_craft{output=id, recipe={
{mat, mat, mat},
{mat, '', mat},
}}
end
local function reg_terumet_armor(data)
if not data or not data.suffix or not data.mat then error('Missing data on registering Terumetal armor') end
data.uses = data.uses or 500
data.mrv = data.mrv or 10 -- material repair value of 1x mat
data.dgroups = data.dgroups or {cracky=3, snappy=3, choppy=3, crumbly=3, level=1}
data.name = data.name or data.suffix
local low_def = data.total_def / 6
local hi_def = data.total_def / 3
data.heal = data.total_heal / 4
data.speed = data.weight / -100
data.gravity = data.weight / 50
local boots_id = terumet.id('armboots_'..data.suffix)
armor:register_armor(boots_id, {
description = terumet.item_desc(data.name..' Boots', data.xinfo),
inventory_image = terumet.tex('invboots_'..data.suffix),
texture = terumet.tex('armboots_'..data.suffix),
preview = terumet.tex('prvboots_'..data.suffix),
groups = gen_armor_groups('armor_feet', data),
armor_groups = {fleshy=low_def},
damage_groups = data.dgroups,
})
reg_recipe_boots(boots_id, data.mat)
terumet.register_repairable_item(boots_id, data.mrv*4)
local helm_id = terumet.id('armhelm_'..data.suffix)
armor:register_armor(helm_id, {
description= terumet.item_desc(data.name..' Helmet', data.xinfo),
inventory_image = terumet.tex('invhelm_'..data.suffix),
texture = terumet.tex('armhelm_'..data.suffix),
preview = terumet.tex('prvhelm_'..data.suffix),
groups = gen_armor_groups('armor_head', data),
armor_groups = {fleshy=low_def},
damage_groups = data.dgroups,
})
reg_recipe_helm(helm_id, data.mat)
terumet.register_repairable_item(helm_id, data.mrv*5)
local chest_id = terumet.id('armchest_'..data.suffix)
armor:register_armor(chest_id, {
description= terumet.item_desc(data.name..' Chestpiece', data.xinfo),
inventory_image = terumet.tex('invchest_'..data.suffix),
texture = terumet.tex('armchest_'..data.suffix),
preview = terumet.tex('prvchest_'..data.suffix),
groups = gen_armor_groups('armor_torso', data),
armor_groups = {fleshy=hi_def},
damage_groups = data.dgroups,
})
reg_recipe_chest(chest_id, data.mat)
terumet.register_repairable_item(chest_id, data.mrv*8)
local legs_id = terumet.id('armlegs_'..data.suffix)
armor:register_armor(legs_id, {
description= terumet.item_desc(data.name..' Leggings', data.xinfo),
inventory_image = terumet.tex('invlegs_'..data.suffix),
texture = terumet.tex('armlegs_'..data.suffix),
preview = terumet.tex('prvlegs_'..data.suffix),
groups = gen_armor_groups('armor_legs', data),
armor_groups = {fleshy=hi_def},
damage_groups = data.dgroups,
})
reg_recipe_legs(legs_id, data.mat)
terumet.register_repairable_item(legs_id, data.mrv*7)
end
-- enable terumet bracers
if opts.BRACERS then
-- I would love to colorize every texture rather than require a seperate armor & preview texture for every bracer
-- but it seems that 3d_armor textures do NOT support texture generation with ^ layering and ^[multiply :(
local function bracer_inv_texture(color)
if color then
return string.format('(%s^(%s^[multiply:%s))', terumet.tex('invbrcr_base'), terumet.tex('invbrcr_color'), color)
else
return terumet.tex('invbrcr_base')
end
end
local function core_texture(color)
return string.format('%s^[multiply:%s', terumet.tex('item_brcrcrys'), color)
end
table.insert(armor.elements, "terumet_brcr")
local brcrcrys_id = terumet.id('item_brcrcrys')
minetest.register_craftitem( brcrcrys_id, {
description = 'Blank Bracer Core',
inventory_image = terumet.tex(brcrcrys_id)
})
-- add vulcan crystallizer recipe for blank bracer core
terumet.options.vulcan.recipes[opts.BRACER_CRYSTAL_ITEM] = {brcrcrys_id, 2}
local function reg_terumet_band(data)
if not data or not data.suffix then error('Missing data on registering Terumetal bracer') end
data.uses = data.uses or 500
data.def = data.def or 0
data.dgroups = data.dgroups or {cracky=3, snappy=3, choppy=3, crumbly=3, level=1}
data.name = data.name or data.suffix
-- generate groups now to update xinfo if necessary before registering it
local groups = gen_armor_groups('armor_terumet_brcr', data)
local band_id = terumet.id('brcr_'..data.suffix)
armor:register_armor(band_id, {
description= terumet.item_desc(data.name..' Bracers', data.xinfo),
inventory_image = bracer_inv_texture(data.color),
texture = terumet.tex('armbrcr_'..data.suffix),
preview = terumet.tex('prvbrcr_'..data.suffix),
groups = groups,
armor_groups = {fleshy=data.def},
damage_groups = data.dgroups,
on_equip = data.on_equip,
on_unequip = data.on_unequip,
on_damage = data.on_damage,
on_punched = data.on_punched
})
if data.mat then
local ecryst_id = terumet.id('item_brcrcrys_'..data.suffix)
minetest.register_craftitem( ecryst_id, {
description = data.name..' Bracer Core',
inventory_image = core_texture(data.color)
})
terumet.register_alloy_recipe{result=ecryst_id, flux=4, time=10.0, input={brcrcrys_id, data.mat}}
terumet.register_alloy_recipe{result=band_id, flux=0, time=120.0, input={terumet.id('brcr_base'), ecryst_id .. ' 8'}}
else
local metal = terumet.id('item_cryst_raw')
local coil = terumet.id('item_coil_tgol')
minetest.register_craft{output=band_id, recipe={
{coil, metal, coil},
{metal, metal, metal},
{coil, metal, coil}
}}
end
terumet.register_repairable_item(band_id, data.rep or 80)
end
reg_terumet_band{suffix='base', name='Terumetal', xinfo='No effects', def=5, uses=500, rep=80}
for band_id, band_data in pairs(opts.BRACERS) do
if (not band_data.fire) or armor.config.fire_protect then
band_data.suffix = band_id
reg_terumet_band(band_data)
end
end
end
if not armor.config.fire_protect then
minetest.log('warning', 'terumet: fire protection on armor will not function - 3d_armor fire protection option not activated')
end
-- 3d_armor fire protection notes: total fire protection must meet or exceed the following values to be immune
-- torches = 1, fire = 3, lava = 5
-- this seems to be the only effect it has
reg_terumet_armor{suffix='cgls', name='Coreglass', mat=terumet.id('ingot_cgls'),
mrv=120, total_def=78, total_heal=36, weight=3, xinfo='Weight +3', uses=120, fire=0.75} -- 2 pcs = immune to torches, 4 pcs = immune to fire
reg_terumet_armor{suffix='tcha', name='Teruchalcum', mat=terumet.id('ingot_tcha'),
mrv=60, total_def=64, total_heal=8, weight=2, xinfo='Weight +2', uses=260}
reg_terumet_armor{suffix='tste', name='Terusteel', mat=terumet.id('ingot_tste'),
mrv=40, total_def=56, total_heal=12, weight=1, xinfo='Weight +1', uses=190}
reg_terumet_armor{suffix='tcop', name='Terucopper', mat=terumet.id('ingot_tcop'),
mrv=20, total_def=45, total_heal=4, weight=0, uses=280}
reg_terumet_armor{suffix='tgol', name='Terugold', mat=terumet.id('ingot_tgol'),
mrv=80, total_def=24, total_heal=65, weight=-1, xinfo='Weight -1', uses=720}
reg_terumet_armor{suffix='ttin', name='Terutin', mat=terumet.id('ingot_ttin'),
mrv=21, total_def=38, total_heal=24, weight=-2, xinfo='Weight -2', uses=410, fire=0.34, breathing=.1} -- 3 pcs = immune to torches
reg_terumet_armor{suffix='rsuit', name='Vulcansuit', mat=terumet.id('item_rsuitmat'),
mrv=180, total_def=78, total_heal=50, weight=-3, xinfo='Weight -3', uses=120, fire=1} -- 1 pc = immune to torches, 3 pcs = immune to fire