--[[ Adds powerful cloud tools for Minetest. Copyright (C) 2019-2024 David Leal (halfpacho@gmail.com) Copyright (C) Various other Minetest developers/contributors This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA --]] -- Translation support local S = minetest.get_translator("cloud_items") ----------------- -- Ores/blocks -- ----------------- minetest.register_node("cloud_items:cloud_ore", { description = S("Cloud Ore"), tiles = {"default_cloud.png^cloud_items_mineral_cloud.png"}, light_source = 7, groups = {cracky = 1, level = 3}, drop = "cloud_items:cloud_lump", sounds = default.node_sound_stone_defaults(), }) minetest.register_node("cloud_items:cloudblock", { description = S("Cloud Block"), tiles = {"cloud_items_cloud_block.png"}, light_source = 5, is_ground_content = false, groups = {cracky = 1, level = 3.9}, sounds = default.node_sound_stone_defaults(), }) minetest.register_node("cloud_items:decoration_block", { description = S("Cloud decoration Block"), tiles = {"cloud_items_decorationblock.png"}, light_source = 5, is_ground_content = false, groups = {cracky = 1, level = 3}, sounds = default.node_sound_stone_defaults(), }) minetest.register_node("cloud_items:cloud", { description = S("Cloud (no drops)"), tiles = {"default_cloud.png"}, light_source = 2, is_ground_content = false, groups = {cracky = 1, level = 3, not_in_creative_inventory = 1}, drop = "", sounds = default.node_sound_stone_defaults(), }) minetest.register_node("cloud_items:decorative_cloud", { description = S("Decorative cloud"), tiles = {"default_cloud.png"}, light_source = 2, is_ground_content = false, groups = {cracky = 1, level = 3, not_in_creative_inventory = 1}, sounds = default.node_sound_stone_defaults(), }) -- On-generation nodes. These nodes are used -- immediately right after generation. minetest.register_node("cloud_items:ongen_small", { description = S("On-generation cloud"), tiles = {"default_cloud.png"}, light_source = 2, is_ground_content = false, groups = {cracky = 1, level = 3, not_in_creative_inventory = 1}, drop = "", sounds = default.node_sound_stone_defaults(), on_place = function(itemstack, user, pointed_thing) minetest.chat_send_player(user:get_player_name(), "You're not allowed to place on-generation cloud blocks!") return itemstack end, }) minetest.register_node("cloud_items:ongen_medium", { description = S("On-generation cloud"), tiles = {"default_cloud.png"}, light_source = 2, is_ground_content = false, groups = {cracky = 1, level = 3, not_in_creative_inventory = 1}, drop = "", sounds = default.node_sound_stone_defaults(), on_place = function(itemstack, user, pointed_thing) minetest.chat_send_player(user:get_player_name(), "You're not allowed to place on-generation cloud blocks!") return itemstack end, }) minetest.register_node("cloud_items:ongen_big", { description = S("On-generation cloud"), tiles = {"default_cloud.png"}, light_source = 2, is_ground_content = false, groups = {cracky = 1, level = 3, not_in_creative_inventory = 1}, drop = "", sounds = default.node_sound_stone_defaults(), on_place = function(itemstack, user, pointed_thing) minetest.chat_send_player(user:get_player_name(), "You're not allowed to place on-generation cloud blocks!") return itemstack end, }) ------------ -- Stairs -- ------------ -- Decorative cloud (white) if not minetest.get_modpath("moreblocks") and minetest.get_modpath("stairs") then local recipe = "cloud_items:decorative_cloud" local groups = {cracky = 1, level = 3, not_in_creative_inventory = 1} local images = {"default_cloud.png"} local sounds = default.node_sound_stone_defaults() stairs.register_stair("decorative_cloud", recipe, groups, images, S("Decorative cloud Stair"), sounds, true) stairs.register_stair_inner("decorative_cloud", recipe, groups, images, "", sounds, true, S("Inner decorative cloud Stair")) stairs.register_stair_outer("decorative_cloud", recipe, groups, images, "", sounds, true, S("Outer decorative cloud Stair")) stairs.register_slab("decorative_cloud", recipe, groups, images, S("Decorative cloud Slab"), sounds, true) -- Normal cloud block recipe = "cloud_items:cloudblock" groups = {cracky = 1, level = 3.9} images = {"cloud_items_cloud_block.png"} sounds = default.node_sound_stone_defaults() stairs.register_stair("cloud", recipe, groups, images, S("Cloud Stair"), sounds, true) stairs.register_stair_inner("cloud", recipe, groups, images, "", sounds, true, S("Inner cloud Stair")) stairs.register_stair_outer("cloud", recipe, groups, images, "", sounds, true, S("Outer cloud Stair")) stairs.register_slab("cloud", recipe, groups, images, S("Cloud Slab"), sounds, true) -- Decorative cloud block recipe = "cloud_items:decoration_block" groups = {cracky = 1, level = 3} images = {"cloud_items_decorationblock.png"} sounds = default.node_sound_stone_defaults() stairs.register_stair("cloud_decorative_block", recipe, groups, images, S("Decorative cloud Stair"), sounds, true) stairs.register_stair_inner("cloud_decorative_block", recipe, groups, images, "", sounds, true, S("Inner decorative cloud Stair")) stairs.register_stair_outer("cloud_decorative_block", recipe, groups, images, "", sounds, true, S("Outer decorative cloud Stair")) stairs.register_slab("cloud_decorative_block", recipe, groups, images, S("Decorative cloud Slab"), sounds, true) end -- Moreblocks support if minetest.get_modpath("moreblocks") then -- Decorative cloud (white) stairsplus:register_all("cloud_items", "decorative_cloud", "cloud_items:decorative_cloud", { description = S("Decorative cloud"), tiles = {"default_cloud.png"}, groups = {cracky = 1, level = 3, not_in_creative_inventory = 1}, light_source = 2, sounds = default.node_sound_stone_defaults() }) -- Normal cloud block stairsplus:register_all("cloud_items", "cloudblock", "cloud_items:cloudblock", { description = S("Cloud"), tiles = {"cloud_items_cloud_block.png"}, groups = {cracky = 1, level = 3}, light_source = 5, sounds = default.node_sound_stone_defaults() }) -- Decorative cloud block stairsplus:register_all("cloud_items", "decoration_block", "cloud_items:decoration_block", { description = S("Decorative cloud"), tiles = {"cloud_items_decorationblock.png"}, groups = {cracky = 1, level = 3.9}, light_source = 5, sounds = default.node_sound_stone_defaults() }) end ------------- -- Mapgen -- ------------- -- Credits to Brett O'Donnell (cornernote) for the "place_schem" function. local schem_offset_x = -3 local schem_offset_y = -4 local schem_offset_z = -3 local schempath = minetest.get_modpath(minetest.get_current_modname())..'/schems' local function place_schem(origin, filename) local file = io.open(schempath..'/'..filename, 'rb') local value = file:read('*a') file:close() local nodes = minetest.deserialize(value) if not nodes then return nil end for _,entry in ipairs(nodes) do local pos = { x=entry.x + origin.x + schem_offset_x, y=entry.y + origin.y + schem_offset_y, z=entry.z + origin.z + schem_offset_z, } if minetest.get_node(pos).name == 'air' then minetest.add_node(pos, {name=entry.name}) end end minetest.log("action", "Successfully placed schematic (no metadata)") end -- Function to load an schematic with metadata -- Uses `worldedit.deserialize` function local function place_schem_metadata(origin, filename) local file, _ = io.open(schempath .. '/' .. filename, 'rb') local value = file:read('*a') file:close() local nodes = worldedit.deserialize(origin, value) minetest.log("action", "Successfully placed schematic with " .. nodes .. " nodes (metadata)") end -- When an schematic is generated, it'll have a special node -- which will have certain chance to convert to an ore or normal cloud. local chance = math.random(1, 100) minetest.register_lbm({ label = "Replace cloud nodes with ore if succeeded", name = "cloud_items:chance_add_ore", nodenames = {"cloud_items:ongen_small", "cloud_items:ongen_medium", "cloud_items:ongen_big"}, run_at_every_load = true, action = function(pos, node) chance = math.random(1, 100) if node.name == "cloud_items:ongen_small" then if chance < 2.5 then minetest.remove_node(pos) minetest.add_node(pos, {name="cloud_items:cloud_ore"}) minetest.log("action", "cloud_items: Replaced on-generation cloud with cloud ore.") else minetest.remove_node(pos) minetest.add_node(pos, {name="cloud_items:cloud"}) minetest.log("action", "cloud_items: Replaced on-generation cloud with normal cloud.") end elseif node.name == "cloud_items:ongen_medium" then if chance < 5 then minetest.remove_node(pos) minetest.add_node(pos, {name="cloud_items:cloud_ore"}) minetest.log("action", "cloud_items: Replaced on-generation cloud with cloud ore.") else minetest.remove_node(pos) minetest.add_node(pos, {name="cloud_items:cloud"}) minetest.log("action", "cloud_items: Replaced on-generation cloud with normal cloud.") end elseif node.name == "cloud_items:ongen_big" then if chance < 7.5 then minetest.remove_node(pos) minetest.add_node(pos, {name="cloud_items:cloud_ore"}) minetest.log("action", "cloud_items: Replaced on-generation cloud with cloud ore.") else minetest.remove_node(pos) minetest.add_node(pos, {name="cloud_items:cloud"}) minetest.log("action", "cloud_items: Replaced on-generation cloud with normal cloud.") end end end, }) --[[ Functions from Minetest Game's nyancat (LGPLv2.1+). This is a modified work. See the mod license (https://github.com/clinew/nyancat/blob/master/license.txt) for more information. --]] local function generate_small(minp, maxp, seed) local height_min = 200 local height_max = 1500 if maxp.y < height_min or minp.y > height_max then return end local y_min = math.max(minp.y, height_min) local y_max = math.min(maxp.y, height_max) local volume = (maxp.x - minp.x + 1) * (y_max - y_min + 1) * (maxp.z - minp.z + 1) local pr = PseudoRandom(seed + 9324342) local max_num_schematics = math.floor(volume / (34 * 34 * 34)) for i = 1, max_num_schematics do if pr:next(0, 1000) == 0 then local x0 = pr:next(minp.x, maxp.x) local y0 = pr:next(minp.y, maxp.y) local z0 = pr:next(minp.z, maxp.z) local p0 = {x = x0, y = y0, z = z0} place_schem(p0, "cloud_small_1.we") end end end -- Medium. local function generate_medium(minp, maxp, seed) local height_min = 380 local height_max = 1680 if maxp.y < height_min or minp.y > height_max then return end local y_min = math.max(minp.y, height_min) local y_max = math.min(maxp.y, height_max) local volume = (maxp.x - minp.x + 1) * (y_max - y_min + 1) * (maxp.z - minp.z + 1) local pr = PseudoRandom(seed + 9324342) local max_num_schematics = math.floor(volume / (42 * 42 * 42)) for i = 1, max_num_schematics do if pr:next(0, 1000) == 0 then local x0 = pr:next(minp.x, maxp.x) local y0 = pr:next(minp.y, maxp.y) local z0 = pr:next(minp.z, maxp.z) local p0 = {x = x0, y = y0, z = z0} place_schem(p0, "cloud_medium_1.we") end end end -- Big. local function generate_big(minp, maxp, seed) local height_min = 580 local height_max = 1880 if maxp.y < height_min or minp.y > height_max then return end local y_min = math.max(minp.y, height_min) local y_max = math.min(maxp.y, height_max) local volume = (maxp.x - minp.x + 1) * (y_max - y_min + 1) * (maxp.z - minp.z + 1) local pr = PseudoRandom(seed + 9324342) local max_num_schematics = math.floor(volume / (50 * 50 * 50)) for i = 1, max_num_schematics do if pr:next(0, 1000) == 0 then local x0 = pr:next(minp.x, maxp.x) local y0 = pr:next(minp.y, maxp.y) local z0 = pr:next(minp.z, maxp.z) local p0 = {x = x0, y = y0, z = z0} place_schem(p0, "cloud_big_1.we") end end end -- Cloud house. local function generate_cloud_house(minp, maxp, seed) local height_min = 1500 local height_max = 3750 if maxp.y < height_min or minp.y > height_max then return end local y_min = math.max(minp.y, height_min) local y_max = math.min(maxp.y, height_max) local volume = (maxp.x - minp.x + 1) * (y_max - y_min + 1) * (maxp.z - minp.z + 1) local pr = PseudoRandom(seed + 9324342) local max_num_schematics = math.floor(volume / (65 * 65 * 65)) for i = 1, max_num_schematics do if pr:next(0, 1000) == 0 then local x0 = pr:next(minp.x, maxp.x) local y0 = pr:next(minp.y, maxp.y) local z0 = pr:next(minp.z, maxp.z) local p0 = {x = x0, y = y0, z = z0} if not minetest.get_modpath("moreblocks") then place_schem_metadata(p0, "cloud_house_1.we") else place_schem_metadata(p0, "cloud_house_2.we") end end end end -- Generate/place the schematics. minetest.register_on_generated(function(minp, maxp, seed) generate_small(minp, maxp, seed) generate_medium(minp, maxp, seed) generate_big(minp, maxp, seed) generate_cloud_house(minp, maxp, seed) end) ------------------ -- Craftitems -- ------------------ minetest.register_craftitem("cloud_items:cloud_lump", { description = S("Cloud Lump"), inventory_image = "cloud_items_cloud_lump.png", }) minetest.register_craftitem("cloud_items:cloud_ingot", { description = S("Cloud Ingot"), inventory_image = "cloud_items_cloud_ingot.png", }) ------------ -- Tools -- ------------ local toolranks_loaded = minetest.get_modpath("toolranks") local sword_desc = S("Cloud Sword") minetest.register_tool("cloud_items:cloud_sword", { description = toolranks_loaded and toolranks.create_description(sword_desc) or sword_desc, inventory_image = "cloud_items_tool_cloudsword.png", range = 5, tool_capabilities = { full_punch_interval = 0.7, max_drop_level=1, groupcaps={ snappy={times={[1]=1.90, [2]=0.90, [3]=0.30}, uses=90, maxlevel=3}, }, damage_groups = {fleshy=11}, }, sound = {breaks = "default_tool_breaks"}, groups = {sword = 1}, -- toolranks support original_description = toolranks_loaded and sword_desc or nil, after_use = toolranks_loaded and toolranks.new_afteruse or nil, }) local pickaxe_desc = S("Cloud Pickaxe") minetest.register_tool("cloud_items:cloud_pickaxe", { description = toolranks_loaded and toolranks.create_description(pickaxe_desc) or pickaxe_desc, inventory_image = "cloud_items_tool_cloudpick.png", tool_capabilities = { full_punch_interval = 0.9, max_drop_level=3, groupcaps={ cracky = {times={[1]=1.0, [2]=1.0, [3]=0.50}, uses=60, maxlevel=3}, }, damage_groups = {fleshy=6}, }, sound = {breaks = "default_tool_breaks"}, groups = {pickaxe = 1}, -- toolranks support original_description = toolranks_loaded and pickaxe_desc or nil, after_use = toolranks_loaded and toolranks.new_afteruse or nil, }) local shovel_desc = S("Cloud Shovel") minetest.register_tool("cloud_items:cloud_shovel", { description = toolranks_loaded and toolranks.create_description(pickaxe_desc) or shovel_desc, inventory_image = "cloud_items_tool_cloudshovel.png", wield_image = "cloud_items_tool_cloudshovel.png^[transformR90", tool_capabilities = { full_punch_interval = 1.0, max_drop_level=1, groupcaps={ crumbly = {times={[1]=0.5, [2]=0.50, [3]=0.30}, uses=60, maxlevel=3}, }, damage_groups = {fleshy=4.50}, }, sound = {breaks = "default_tool_breaks"}, groups = {shovel = 1}, -- toolranks support original_description = toolranks_loaded and shovel_desc or nil, after_use = toolranks_loaded and toolranks.new_afteruse or nil, }) local axe_desc = S("Cloud Axe") minetest.register_tool("cloud_items:cloud_axe", { description = toolranks_loaded and toolranks.create_description(pickaxe_desc) or axe_desc, inventory_image = "cloud_items_tool_cloudaxe.png", tool_capabilities = { full_punch_interval = 0.9, max_drop_level=1, groupcaps={ choppy={times={[1]=0.5, [2]=0.60, [3]=0.60}, uses=40, maxlevel=3}, }, damage_groups = {fleshy=7.50}, }, sound = {breaks = "default_tool_breaks"}, groups = {axe = 1}, -- toolranks support original_description = toolranks_loaded and axe_desc or nil, after_use = toolranks_loaded and toolranks.new_afteruse or nil, }) -- Multitools support if minetest.get_modpath("multitools") then multitools.register_multitool("cloud_items", "cloud", S("Cloud multitool"), "cloud_items_multitool_cloud.png", nil, { full_punch_interval = 0.9, max_drop_level=1, groupcaps={ cracky = {times={[1]=1.0, [2]=1.0, [3]=0.50}, uses=60, maxlevel=3}, choppy = {times={[1]=0.5, [2]=0.60, [3]=0.60}, uses=40, maxlevel=3}, crumbly = {times={[1]=0.5, [2]=0.50, [3]=0.30}, uses=60, maxlevel=3}, snappy = {times={[1]=1.90, [2]=0.90, [3]=0.30}, uses=90, maxlevel=3}, }, damage_groups = {fleshy=7.25}, -- Average damage from all cloud tools } ) end ------------------ -- Cloud ship -- ------------------ -- Code is taken and modified from the Vehicle Mash (https://github.com/minetest-mods/vehicle_mash) mod (WTFPL license). -- See the mod license (https://github.com/minetest-mods/vehicle_mash/blob/master/LICENSE.md) for more information. local ship_def = { terrain_type = 3, max_speed_forward = 10, max_speed_reverse = 7, max_speed_upwards = 5, max_speed_downwards = 3.5, accel = 4, braking = 5, turn_speed = 6, stepheight = 1.5, -- model specific stuff visual = "mesh", visual_size = {x=1, y=1}, wield_scale = {x=1, y=1, z=1}, collisionbox = {-2.3, -0.3, -2, 2.5, 1.9, 2}, can_fly = true, enable_crash = false, onplace_position_adj = 0, textures = {"default_cloud.png"}, -- player specific stuff player_rotation = {x=0, y=0, z=0}, driver_attach_at = {x=-0.6, y=19, z=0}, driver_eye_offset = {x=-0.6, y=19, z=0}, number_of_passengers = 0 } -- Cloud ship (based on the Vehicle Mash boat) local ship_enabled = minetest.settings:get_bool("cloud_items.enable_cloud_ship") if ship_enabled or ship_enabled == nil then loadfile(minetest.get_modpath(minetest.get_current_modname()) .. "/ship.lua")(table.copy(ship_def)) end ---------------- -- Cloud car -- ---------------- -- Code is taken and modified from the Vehicle Mash (https://github.com/minetest-mods/vehicle_mash) mod (WTFPL license). -- See the mod license (https://github.com/minetest-mods/vehicle_mash/blob/master/LICENSE.md) for more information. local car_def = { terrain_type = 1, max_speed_forward = 13, max_speed_reverse = 10, accel = 4, braking = 6, turn_speed = 4, stepheight = 1.3, visual = "mesh", mesh = "car.x", -- Model is from the Vehicle Mash mod; licensed under CC BY-NC-SA 3.0 visual_size = {x=1, y=1}, wield_scale = {x=1, y=1, z=1}, collisionbox = {-0.6, -0.05, -0.6, 0.6, 1, 0.6}, onplace_position_adj = -0.45, player_rotation = {x=0,y=90,z=0}, driver_attach_at = {x=3.5,y=3.7,z=3.5}, driver_eye_offset = {x=-4, y=0, z=0}, number_of_passengers = 3, passenger_attach_at = {x=3.5,y=3.7,z=-3.5}, passenger_eye_offset = {x=4, y=0, z=0}, passenger2_attach_at = {x=-4,y=3.7,z=3.5}, passenger2_eye_offset = {x=-4, y=3, z=0}, passenger3_attach_at = {x=-4,y=3.7,z=-3.5}, passenger3_eye_offset = {x=4, y=3, z=0}, enable_crash = false, drop_on_destroy = {"vehicle_mash:tire 2", "vehicle_mash:windshield", "vehicle_mash:battery", "vehicle_mash:motor"}, } -- Cloud car (similar from the CAR01 from Vehicle Mash) local car_enabled = minetest.settings:get_bool("cloud_items.enable_cloud_car") if car_enabled or car_enabled == nil then loadfile(minetest.get_modpath(minetest.get_current_modname()) .. "/car.lua")(table.copy(car_def)) end ------------- -- Crafts -- ------------- minetest.register_craft({ output = "cloud_items:cloud_sword", recipe = { {"", "cloud_items:cloud_ingot", ""}, {"", "cloud_items:cloud_ingot", ""}, {"", "group:stick", ""}, } }) minetest.register_craft({ output = "cloud_items:cloud_pickaxe", recipe = { {"cloud_items:cloud_ingot", "cloud_items:cloud_ingot", "cloud_items:cloud_ingot"}, {"", "group:stick", ""}, {"", "group:stick", ""}, } }) minetest.register_craft({ output = "cloud_items:cloud_shovel", recipe = { {"", "cloud_items:cloud_ingot", ""}, {"", "group:stick", ""}, {"", "group:stick", ""}, } }) minetest.register_craft({ output = "cloud_items:cloud_axe", recipe = { {"cloud_items:cloud_ingot", "cloud_items:cloud_ingot"}, {"cloud_items:cloud_ingot", "group:stick"}, {"", "group:stick"}, } }) minetest.register_craft({ output = "cloud_items:cloudblock", recipe = { {"cloud_items:cloud_ingot", "cloud_items:cloud_ingot", "cloud_items:cloud_ingot"}, {"cloud_items:cloud_ingot", "cloud_items:cloud_ingot", "cloud_items:cloud_ingot"}, {"cloud_items:cloud_ingot", "cloud_items:cloud_ingot", "cloud_items:cloud_ingot"}, } }) minetest.register_craft({ output = "cloud_items:cloud_ingot 9", recipe = { {"cloud_items:cloudblock"}, } }) -- Multitools support for crafting if minetest.get_modpath("multitools") then minetest.register_craft({ output = "cloud_items:multitool_cloud", recipe = { {"", "cloud_items:cloud_shovel", ""}, {"cloud_items:cloud_axe", "cloud_items:cloud_pickaxe", "cloud_items:cloud_sword"}, } }) end -- Decoration block minetest.register_craft({ output = "cloud_items:decoration_block 7", recipe = { {"cloud_items:cloud_ingot", "cloud_items:cloud_ingot", ""}, {"cloud_items:cloud_ingot", "cloud_items:cloud_ingot", ""}, {"", "", ""}, } }) -- Cooking minetest.register_craft({ type = "cooking", output = "cloud_items:cloud_ingot", recipe = "cloud_items:cloud_lump", cooktime = 30, }) ----------------------- -- 3D Armor support -- ----------------------- if minetest.get_modpath("3d_armor") then armor:register_armor("cloud_items:helmet_cloud", { description = S("Cloud Helmet"), inventory_image = "cloud_items_inv_helmet_cloud.png", groups = {armor_head=1, armor_heal=16, armor_use=70}, armor_groups = {fleshy=10}, damage_groups = {cracky=2, snappy=1, level=6}, }) armor:register_armor("cloud_items:leggings_cloud", { description = S("Cloud Leggings"), inventory_image = "cloud_items_inv_leggings_cloud.png", groups = {armor_legs=1, armor_heal=16, armor_use=70}, armor_groups = {fleshy=30}, damage_groups = {cracky=2, snappy=1, level=6}, }) armor:register_armor("cloud_items:chestplate_cloud", { description = S("Cloud Chestplate"), inventory_image = "cloud_items_inv_chestplate_cloud.png", groups = {armor_torso=1, armor_heal=16, armor_use=70}, armor_groups = {fleshy=30}, damage_groups = {cracky=2, snappy=1, level=6}, }) armor:register_armor("cloud_items:boots_cloud", { description = S("Cloud Boots"), inventory_image = "cloud_items_inv_boots_cloud.png", groups = {armor_feet=1, armor_heal=16, armor_use=70, physics_speed=1, physics_jump=0.5}, armor_groups = {fleshy=10}, damage_groups = {cracky=2, snappy=1, level=6}, }) if minetest.get_modpath("shields") then armor:register_armor("cloud_items:shield_cloud", { description = S("Cloud Shield"), inventory_image = "cloud_items_inv_shield_cloud.png", groups = {armor_shield=1, armor_heal=12, armor_use=70}, armor_groups = {fleshy=10}, damage_groups = {cracky=2, snappy=1, level=6}, }) minetest.register_craft({ output = "cloud_items:shield_cloud", recipe = { {"cloud_items:cloud_ingot", "cloud_items:cloud_ingot", "cloud_items:cloud_ingot"}, {"cloud_items:cloud_ingot", "cloud_items:cloud_ingot", "cloud_items:cloud_ingot"}, {"", "cloud_items:cloud_ingot", ""} } }) end -- Support for 3D Armor Gloves/Gauntlets if minetest.get_modpath("3d_armor_gloves") then armor:register_armor("cloud_items:gloves_cloud", { description = S("Cloud Gauntlets"), inventory_image = "cloud_items_inv_gloves_cloud.png", groups = {armor_hands=1, armor_heal=12, armor_use=70}, armor_groups = {fleshy=10}, damage_groups = {cracky=2, snappy=1, level=6}, }) minetest.register_craft({ output = "cloud_items:gloves_cloud", recipe = { {"cloud_items:cloud_ingot", "", "cloud_items:cloud_ingot"}, {"farming:string", "", "farming:string"}, }, }) end --------------- -- Crafting -- --------------- minetest.register_craft({ output = "cloud_items:helmet_cloud", recipe = { {"cloud_items:cloud_ingot", "cloud_items:cloud_ingot", "cloud_items:cloud_ingot"}, {"cloud_items:cloud_ingot", "", "cloud_items:cloud_ingot"}, {"", "", ""}, }, }) minetest.register_craft({ output = "cloud_items:chestplate_cloud", recipe = { {"cloud_items:cloud_ingot", "", "cloud_items:cloud_ingot"}, {"cloud_items:cloud_ingot", "cloud_items:cloud_ingot", "cloud_items:cloud_ingot"}, {"cloud_items:cloud_ingot", "cloud_items:cloud_ingot", "cloud_items:cloud_ingot"}, }, }) minetest.register_craft({ output = "cloud_items:leggings_cloud", recipe = { {"cloud_items:cloud_ingot", "cloud_items:cloud_ingot", "cloud_items:cloud_ingot"}, {"cloud_items:cloud_ingot", "", "cloud_items:cloud_ingot"}, {"cloud_items:cloud_ingot", "", "cloud_items:cloud_ingot"}, }, }) minetest.register_craft({ output = "cloud_items:boots_cloud", recipe = { {"cloud_items:cloud_ingot", "", "cloud_items:cloud_ingot"}, {"cloud_items:cloud_ingot", "", "cloud_items:cloud_ingot"}, }, }) end -- Log if minetest.settings:get_bool("log_mods") then minetest.log("action", "[Cloud Items] Loaded.") end