mods that hopefully work for a TechAge-based pack

This commit is contained in:
2026-09-09 06:27:51 -06:00
parent 4e6b08d194
commit c27db2a537
6234 changed files with 375578 additions and 0 deletions
+697
View File
@@ -0,0 +1,697 @@
local ingot_name = "technic:uranium0_ingot"
local stick_name = "default:stick"
local stone_name = "default:stone"
local stone_image = "default_stone.png"
local stone_sounds = nil
local MODNAME = minetest.get_current_modname()
local MODPATH = minetest.get_modpath(MODNAME)
local S = minetest.get_translator(MODNAME)
function get_setting(key, default)
local value = minetest.settings:get("uraniumstuff." .. key)
local num_value = tonumber(value)
if value and not num_value then
print("Invalid value for setting %s: %q. Using default %q.", key, value, default)
end
return num_value or default
end
local uses = get_setting("max_tool_uses", 400)
local full_punch_interval = get_setting("full_punch_interval", 0.3)
local damage_multiplier = get_setting("damage_multiplier", 1.5)
local radiation_damage = get_setting("radiation_damage", 5)
local allow_multitool = minetest.settings:get_bool("uraniumstuff.allow_multitool", true)
local allow_irradiating = minetest.settings:get_bool("uraniumstuff.allow_irradiating_mobs", true)
local allow_armor_damage = minetest.settings:get_bool("uraniumstuff.allow_armor_radiation", true)
local allow_tool_damage = minetest.settings:get_bool("uraniumstuff.allow_tool_radiation", true)
local leave_residue = minetest.settings:get_bool("uraniumstuff.leave_residue", true)
function round(num)
return num + (2^52 + 2^51) - (2^52 + 2^51)
end
dofile(MODPATH .. "/goo.lua")
-- MineClone compatibility
if minetest.get_modpath("mcl_core") then
stick_name = "mcl_core:stick"
stone_name = "mcl_deepslate:deepslate"
stone_image = "mcl_deepslate.png"
end
if minetest.get_modpath("mcl_sounds") then
stone_sounds = mcl_sounds.node_sound_stone_defaults()
else
stone_sounds = default.node_sound_stone_defaults()
end
-- Ore generation
if not minetest.get_modpath("technic") then
ingot_name = "uraniumstuff:uranium_ingot"
minetest.register_node("uraniumstuff:mineral_uranium", {
description = S("Uranium Ore"),
tiles = { stone_image .. "^uraniumstuff_mineral_uranium.png" },
is_ground_content = true,
groups = {cracky=3, radioactive=1},
sounds = stone_sounds,
drop = "uraniumstuff:uranium_lump",
light_source = 5,
})
local ORE_MIN = -80
local ORE_MAX = -300
local ORE_SCARCITY = 8*8*8*8*8
if minetest.get_modpath("mcl_core") then
local ORE_MIN = -10
local ORE_MAX = -64
local ORE_SCARCITY = 8*8*8*8
end
minetest.register_ore({
ore_type = "scatter",
ore = "uraniumstuff:mineral_uranium",
wherein = stone_name,
clust_scarcity = ORE_SCARCITY,
clust_num_ores = 2,
clust_size = 3,
y_min = ORE_MIN,
y_max = ORE_MAX,
--noise_params = uranium_params,
--noise_threshold = uranium_threshold,
})
minetest.register_node("uraniumstuff:uranium_block", {
description = S("Uranium Block"),
tiles = { "uraniumstuff_uranium_block.png" },
is_ground_content = true,
groups = {cracky=1, level=2, radioactive=1},
sounds = stone_sounds,
light_source = 5,
})
minetest.register_craftitem("uraniumstuff:uranium_lump", {
description = S("Uranium Lump"),
inventory_image = "uraniumstuff_uranium_lump.png",
light_source = 5,
})
minetest.register_craftitem("uraniumstuff:uranium_ingot", {
description = S("Uranium Ingot"),
inventory_image = "uraniumstuff_uranium_ingot.png",
groups = {uranium_ingot=1},
light_source = 5,
})
minetest.register_craft({
output = "uraniumstuff:uranium_block",
recipe = {
{ingot_name, ingot_name, ingot_name},
{ingot_name, ingot_name, ingot_name},
{ingot_name, ingot_name, ingot_name},
}
})
minetest.register_craft({
output = ingot_name.." 9",
recipe = {
{"uraniumstuff:uranium_block"}
}
})
minetest.register_craft({
type = 'cooking',
recipe = "uraniumstuff:uranium_lump",
output = "uraniumstuff:uranium_ingot",
})
end
-- Tool Registration
if minetest.get_modpath("toolranks") then
uses = 200
end
-- Pickaxe
minetest.register_tool("uraniumstuff:uranium_pick", {
description = S("Uranium Pickaxe"),
inventory_image = "uraniumstuff_uranium_pick.png",
light_source = 5,
tool_capabilities = {
full_punch_interval = full_punch_interval,
max_drop_level = 3,
groupcaps = {
cracky = {times = {[1] = 2.25, [2] = 0.55, [3] = 0.35}, uses = uses, maxlevel = 3},
},
damage_groups = {fleshy = 6*damage_multiplier, radioactive = radiation_damage},
},
sound = {breaks = "default_tool_breaks"},
groups = {pickaxe = 1}
})
minetest.register_craft({
output = "uraniumstuff:uranium_pick",
recipe = {
{ingot_name, ingot_name, ingot_name},
{"", stick_name, ""},
{"", stick_name, ""}
}
})
-- Shovel
minetest.register_tool("uraniumstuff:uranium_shovel", {
description = S("Uranium Shovel"),
inventory_image = "uraniumstuff_uranium_shovel.png",
light_source = 5,
wield_image = "uraniumstuff_uranium_shovel.png^[transformR90",
tool_capabilities = {
full_punch_interval = full_punch_interval,
max_drop_level = 3,
groupcaps = {
crumbly = {times = {[1] = 0.70, [2] = 0.35, [3] = 0.20}, uses = uses, maxlevel = 3},
},
damage_groups = {fleshy = 5*damage_multiplier, radioactive = radiation_damage},
radioactive = 1,
},
sound = {breaks = "default_tool_breaks"},
groups = {shovel = 1}
})
minetest.register_craft({
output = "uraniumstuff:uranium_shovel",
recipe = {
{ingot_name},
{stick_name},
{stick_name}
}
})
-- Axe
minetest.register_tool("uraniumstuff:uranium_axe", {
description = S("Uranium Axe"),
inventory_image = "uraniumstuff_uranium_axe.png",
light_source = 5,
tool_capabilities = {
full_punch_interval = full_punch_interval,
max_drop_level = 3,
groupcaps = {
choppy = {times = {[1] = 1.75, [2] = 0.45, [3] = 0.45}, uses = uses, maxlevel = 3},
fleshy = {times = {[2] = 0.95, [3] = 0.30}, uses = uses, maxlevel = 2},
},
damage_groups = {fleshy = 8*damage_multiplier, radioactive = radiation_damage},
radioactive = 1,
},
sound = {breaks = "default_tool_breaks"},
groups = {axe = 1}
})
minetest.register_craft({
output = "uraniumstuff:uranium_axe",
recipe = {
{ingot_name, ingot_name, ""},
{ingot_name, stick_name, ""},
{"", stick_name, ""}
}
})
-- Sword
minetest.register_tool("uraniumstuff:uranium_sword", {
description = S("Uranium Sword"),
inventory_image = "uraniumstuff_uranium_sword.png",
light_source = 5,
tool_capabilities = {
full_punch_interval = full_punch_interval,
max_drop_level = 3,
groupcaps = {
fleshy = {times = {[2] = 0.65, [3] = 0.25}, uses = uses, maxlevel = 2},
snappy = {times = {[1] = 1.70, [2] = 0.70, [3] = 0.25}, uses = uses, maxlevel = 3},
choppy = {times = {[3] = 0.65}, uses = uses, maxlevel = 0},
},
damage_groups = {fleshy = 10*damage_multiplier, radioactive = radiation_damage},
radioactive = 1,
},
sound = {breaks = "default_tool_breaks"},
groups = {sword = 1}
})
minetest.register_craft({
output = "uraniumstuff:uranium_sword",
recipe = {
{ingot_name},
{ingot_name},
{stick_name}
}
})
-- Hoe
minetest.register_tool("uraniumstuff:uranium_hoe", {
description = S("Uranium Hoe"),
inventory_image = "uraniumstuff_uranium_hoe.png",
light_source = 5,
tool_capabilities = {
full_punch_interval = full_punch_interval,
max_drop_level = 3,
max_uses = uses,
damage_groups = {radioactive = radiation_damage},
},
sound = {breaks = "default_tool_breaks"},
groups = {hoe = 1}
})
minetest.register_craft({
output = "uraniumstuff:uranium_sword",
recipe = {
{ingot_name},
{ingot_name},
{stick_name}
}
})
-- Multitool
if allow_multitool then
minetest.register_tool("uraniumstuff:uranium_multitool", {
description = S("Uranium Multitool"),
inventory_image = "uraniumstuff_uranium_multitool.png",
light_source = 5,
tool_capabilities = {
full_punch_interval = full_punch_interval,
max_drop_level = 3,
groupcaps = {
cracky = {times = {[1] = 2.25, [2] = 0.55, [3] = 0.35}, uses = uses, maxlevel = 3},
crumbly = {times = {[1] = 0.70, [2] = 0.35, [3] = 0.20}, uses = uses, maxlevel = 3},
choppy = {times = {[1] = 1.75, [2] = 0.45, [3] = 0.45}, uses = uses, maxlevel = 3},
fleshy = {times = {[2] = 0.65, [3] = 0.25}, uses = uses, maxlevel = 2},
snappy = {times = {[1] = 1.70, [2] = 0.70, [3] = 0.25}, uses = uses, maxlevel = 3},
},
damage_groups = {fleshy = 10*damage_multiplier, radioactive = radiation_damage},
},
sound = {breaks = "default_tool_breaks"},
groups = {sword = 1, axe = 1, shovel = 1, pickaxe = 1},
range = 8.0,
})
minetest.register_craft({
output = "uraniumstuff:uranium_multitool",
recipe = {
{"", "uraniumstuff:uranium_shovel", ""},
{"uraniumstuff:uranium_axe", "uraniumstuff:uranium_pick", "uraniumstuff:uranium_sword"},
}
})
end
-- Gems
if allow_armor_damage or allow_tool_damage then
minetest.register_craftitem("uraniumstuff:uranium_gem", {
description = S("Uranium Gem"),
inventory_image = "uraniumstuff_uranium_gem.png",
light_source = 5,
})
minetest.register_craft({
output = "uraniumstuff:uranium_gem",
recipe = {
{"", ingot_name, ""},
{ingot_name, ingot_name, ingot_name},
{"", ingot_name, ""},
}
})
minetest.register_craftitem("uraniumstuff:uranium_protection_gem", {
description = S("Uranium Protection Gem"),
inventory_image = "uraniumstuff_uranium_protection_gem.png",
light_source = 5,
})
local iron_ingot = "default:steel_ingot"
local crystal_name = "default:mese_crystal"
if minetest.get_modpath("mcl_core") then
iron_ingot = "mcl_core:iron_ingot"
crystal_name = "mcl_core:emerald"
end
minetest.register_craft({
output = "uraniumstuff:uranium_protection_gem",
recipe = {
{iron_ingot, crystal_name, iron_ingot},
{crystal_name, "uraniumstuff:uranium_gem", crystal_name},
{iron_ingot, crystal_name, iron_ingot},
}
})
end
-- Toolranks Integration
if minetest.get_modpath("toolranks") then
minetest.override_item("uraniumstuff:uranium_sword", {
description = toolranks.create_description(S("Uranium Sword"), 0, 1),
original_description = S("Uranium Sword"),
after_use = toolranks.new_afteruse
})
minetest.override_item("uraniumstuff:uranium_pick", {
description = toolranks.create_description(S("Uranium Pickaxe"), 0, 1),
original_description = S("Uranium Pickaxe"),
after_use = toolranks.new_afteruse
})
minetest.override_item("uraniumstuff:uranium_axe", {
description = toolranks.create_description(S("Uranium Axe"), 0, 1),
original_description = S("Uranium Axe"),
after_use = toolranks.new_afteruse
})
minetest.override_item("uraniumstuff:uranium_shovel", {
description = toolranks.create_description(S("Uranium Shovel"), 0, 1),
original_description = S("Uranium Shovel"),
after_use = toolranks.new_afteruse
})
if allow_multitool then
minetest.override_item("uraniumstuff:uranium_multitool", {
description = toolranks.create_description(S("Uranium Multitool"), 0, 1),
original_description = S("Uranium Multitool"),
after_use = toolranks.new_afteruse
})
end
end
-- Armor
if minetest.get_modpath("3d_armor") then
armor.materials.uranium = ingot_name
armor.config.material_uranium = true
armor:register_armor("uraniumstuff:helmet_uranium", {
description = S("Uranium Helmet"),
inventory_image = "uraniumstuff_inv_uranium_helmet.png",
light_source = 5,
groups = {armor_head=1, armor_heal=12, armor_use=200, armor_fire=3},
armor_groups = {fleshy=20, radiation=10},
damage_groups = {cracky=2, snappy=1, level=3},
wear = 0,
})
minetest.register_alias("uraniumstuff:uranium_helmet", "uraniumstuff:helmet_uranium")
minetest.override_item("uraniumstuff:uranium_helmet", {light_source = 5})
armor:register_armor("uraniumstuff:chestplate_uranium", {
description = S("Uranium Chestplate"),
inventory_image = "uraniumstuff_inv_uranium_chestplate.png",
light_source = 5,
groups = {armor_torso=1, armor_heal=12, armor_use=200, armor_fire=3},
armor_groups = {fleshy=25, radiation=10},
damage_groups = {cracky=2, snappy=1, level=3},
wear = 0,
})
minetest.register_alias("uraniumstuff:uranium_chestplate", "uraniumstuff:chestplate_uranium")
minetest.override_item("uraniumstuff:uranium_chestplate", {light_source = 5})
armor:register_armor("uraniumstuff:leggings_uranium", {
description = S("Uranium Leggings"),
inventory_image = "uraniumstuff_inv_uranium_leggings.png",
light_source = 5,
groups = {armor_legs=1, armor_heal=12, armor_use=200, armor_fire=3},
armor_groups = {fleshy=25, radiation=10},
damage_groups = {cracky=2, snappy=1, level=3},
wear = 0,
})
minetest.register_alias("uraniumstuff:uranium_leggings", "uraniumstuff:leggings_uranium")
minetest.override_item("uraniumstuff:uranium_leggings", {light_source = 5})
armor:register_armor("uraniumstuff:boots_uranium", {
description = S("Uranium Boots"),
inventory_image = "uraniumstuff_inv_uranium_boots.png",
light_source = 5,
groups = {armor_feet=1, armor_heal=12, armor_use=200, armor_fire=3, physics_jump=0.5, physics_speed = 1},
armor_groups = {fleshy=20, radiation=10},
damage_groups = {cracky=2, snappy=1, level=3},
wear = 0,
})
minetest.register_alias("uraniumstuff:uranium_boots", "uraniumstuff:boots_uranium")
minetest.override_item("uraniumstuff:uranium_boots", {light_source = 5})
if minetest.get_modpath("shields") then
armor:register_armor("uraniumstuff:shield_uranium", {
description = S("Uranium Shield"),
inventory_image = "uraniumstuff_inv_uranium_shield.png",
light_source = 5,
groups = {armor_shield=1, armor_heal=12, armor_use=200, armor_fire=3},
armor_groups = {fleshy=25, radiation=10},
damage_groups = {cracky=2, snappy=1, level=3},
wear = 0,
})
minetest.register_alias("uraniumstuff:uranium_shield", "uraniumstuff:shield_uranium")
end
end
if minetest.get_modpath("3d_armor") or minetest.get_modpath("mcl_armor") then
minetest.register_craft({
output = "uraniumstuff:uranium_helmet",
recipe = {
{ingot_name, ingot_name, ingot_name},
{ingot_name, "", ingot_name},
{"", "", ""},
}
})
minetest.register_craft({
output = "uraniumstuff:uranium_chestplate",
recipe = {
{ingot_name, "", ingot_name},
{ingot_name, ingot_name, ingot_name},
{ingot_name, ingot_name, ingot_name},
}
})
minetest.register_craft({
output = "uraniumstuff:uranium_leggings",
recipe = {
{ingot_name, ingot_name, ingot_name},
{ingot_name, "", ingot_name},
{ingot_name, "", ingot_name},
}
})
minetest.register_craft({
output = "uraniumstuff:uranium_boots",
recipe = {
{ingot_name, "", ingot_name},
{ingot_name, "", ingot_name},
}
})
if not minetest.get_modpath("mcl_armor") then
minetest.register_craft({
output = "uraniumstuff:uranium_shield",
recipe = {
{ingot_name, ingot_name, ingot_name},
{ingot_name, ingot_name, ingot_name},
{"", ingot_name, ""},
}
})
end
end
-- Armor/Tool Player Damage
if allow_tool_damage or (allow_armor_damage and minetest.get_modpath("3d_armor")) then
local function has_item(player_name, item_name)
local inventory = minetest.get_inventory({type="player", name=player_name})
local main_list = inventory:get_list("main")
for _, stack in ipairs(main_list) do
if stack:get_name() == item_name then
return true
end
end
return false
end
local function alter_health(player, change)
if player == nil then return end
local hp_max = player:get_properties().hp_max
local current_health = player:get_hp()
local new_health = current_health + change
if new_health > hp_max then new_health = hp_max end
if new_health < 0 then new_health = 0 end
player:set_hp(new_health)
end
local function has_radioactive_tool(player)
local wield = player:get_wielded_item()
if wield then
local tool_cap = wield:get_tool_capabilities()
if tool_cap and tool_cap.damage_groups and tool_cap.damage_groups.radioactive then
return true
end
end
return false
end
local function pattern_count(base, pattern)
return select(2, string.gsub(base, pattern, ""))
end
local function get_radioactive_armor_count(player)
local inv_3d = player:get_meta():get_string("3d_armor_inventory")
if not inv_3d then return 0 end
return pattern_count(inv_3d, "uraniumstuff:")
end
local function damage_players()
local players = minetest.get_connected_players()
for _, player in ipairs(players) do
local damage = 0
if allow_armor_damage then
damage = damage + get_radioactive_armor_count(player)
end
if allow_tool_damage and has_radioactive_tool(player) then
damage = damage + 1
end
if damage > 0 then
local player_name = player:get_player_name()
local has_gem = has_item(player_name, "uraniumstuff:uranium_protection_gem")
if not has_gem then
alter_health(player, damage*-1)
end
end
end
minetest.after(5, damage_players)
end
damage_players()
end
-- Irradiating entities
if allow_irradiating then
local function register_entity_on_punch(callback)
for name, entity in pairs(minetest.registered_entities) do
local orig = entity.on_punch
entity.on_punch = function(punched, puncher, time_from_last_punch, tool_capabilities, direction, damage)
callback(punched, puncher, time_from_last_punch, tool_capabilities, direction, damage)
if orig then
orig(punched, puncher, time_from_last_punch, tool_capabilities, direction, damage)
end
end
end
end
function string_split(inputstr, sep)
if sep == nil then
sep = "%s"
end
local t={}
for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
table.insert(t, str)
end
return t
end
local function set_entity_texture(entity, textures)
local prop = entity.object:get_properties()
prop.textures = textures
prop.glow = 10
prop.use_texture_alpha = true
entity.object:set_properties(prop)
end
local new_texture = "uraniumstuff_goo.png"
local entity_goo_textures = {
new_texture, new_texture, new_texture, new_texture, new_texture,
new_texture, new_texture, new_texture, new_texture, new_texture,
new_texture, new_texture, new_texture, new_texture, new_texture,
new_texture, new_texture, new_texture, new_texture, new_texture,
new_texture, new_texture, new_texture, new_texture, new_texture,
new_texture, new_texture, new_texture, new_texture, new_texture,
}
local function liquify_entity(entity)
if not (entity and entity.object) then return nil end
local pos = entity.object:get_pos()
if not pos then return nil end
entity.state = "stand"
set_entity_texture(entity, entity_goo_textures)
local r_pos = {x = round(pos.x), y = round(pos.y), z = round(pos.z)}
local low_pos_1 = {x = r_pos.x, y = r_pos.y - 1, z = r_pos.z}
local low_pos_2 = {x = r_pos.x, y = r_pos.y - 2, z = r_pos.z}
local low_node = minetest.get_node(low_pos_2)
minetest.set_node(r_pos, {name = "uraniumstuff:goo_source"})
minetest.after(3, function()
minetest.set_node(r_pos, {name = "uraniumstuff:goo_flowing"})
if leave_residue and low_node.name ~= "air" then
minetest.set_node(low_pos_1, {name = "uraniumstuff:goo_source"})
end
end)
end
local function irradiate_entity(entity, damage, time)
local function radiation_damage(entity, damage, time)
entity.health = entity.health - damage
if entity.health <= 0 then
liquify_entity(entity)
entity.health = 0
else
minetest.after(time, radiation_damage, entity, damage, time)
end
end
if entity.health and entity.health > 0 and not entity.irradiated then
entity.irradiated = true
local prop = entity.object:get_properties()
local transparent = false
for i, texture in ipairs(prop.textures) do
local tspl = string_split(texture, "%^")
local t_length = #(tspl)
if t_length > 1 then
transparent = true
prop.textures[i] = texture .. "^uraniumstuff_irradiated_full.png"
else
prop.textures[i] = texture .. "^uraniumstuff_irradiated.png"
end
end
prop.glow = 10
if not transparent then prop.use_texture_alpha = true end
entity.object:set_properties(prop)
minetest.after(time, radiation_damage, entity, damage, time)
end
end
register_entity_on_punch(function(punched, puncher, time_from_last_punch, tool_capabilities, direction, damage)
if tool_capabilities and tool_capabilities.damage_groups then
local rad_damage = tool_capabilities.damage_groups.radioactive
if rad_damage and rad_damage > 0 then
irradiate_entity(punched, rad_damage, 1)
end
end
end)
end