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