diff --git a/README.md b/README.md index 9caa575..f895dfc 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,7 @@ Dependencies: Minetest Game or MineClone. * Technic recipe types (grinding, alloying, etc.) now also work, as long as their `output_size` is 1. * Added energy values for Basic Materials and Technic! * Infinite food (costs 64 energy to use, equal to steak) - * Alchemical Chest + * Alchemical Chests, Alchemical Bags, and Advanced Alchemical Chests * Support for pipeworks and (non-MCL) hoppers! * Repair Talisman * Covalence Dust (Aux1+right-click with Philosopher's Stone to open repairer, only tools with an energy value can be repaired) @@ -77,7 +77,8 @@ Dependencies: Minetest Game or MineClone. * Energy values are now in `_exchangeclone_energy/energy_values.lua`, and are laid out differently, and aliases now work. * ExchangeClone is now a modpack for [annoying reasons](https://forum.minetest.net/viewtopic.php?f=47&p=429775s). *Every single mod* in the modpack is required, regardless of what it says the dependencies are. Disable and then enable it for everything to work correctly. * The default energy value is no longer 1 but none. - * The 2-billion-ish personal energy limit is has been increased to the actual maximum Lua allows. This may mean some precision might be lost when your personal energy reaches a few quadrillion... but at that point, you don't really care about the exact number. + * The 2-billion-ish personal energy limit is has been increased to 1,000,000,000,000 (1 trillion). Any higher and there are precision-based exploits like being able to create infinite glass panes when you have enough energy. + * Added comma separators when energy is shown (to make it easier to identify large numbers) * Tools that break multiple nodes at once (hammers, hoes, katar, and morningstar) use a better method that may (?) slightly decrease lag. * Ender pearls can now be crafted with 4 iron and the Philosopher's Stone. * A couple changes the Philosopher's Stone's transmutation: @@ -88,6 +89,7 @@ Dependencies: Minetest Game or MineClone. * Bugfixes: * Fixed potion energy values * Fixed Red Matter Shield recipe + * Fixed other modes of DM/RM tools not having energy values ### 5.3 * Bugfixes diff --git a/_exchangeclone_energy/energy_values.lua b/_exchangeclone_energy/energy_values.lua index 14f55e8..4898b39 100644 --- a/_exchangeclone_energy/energy_values.lua +++ b/_exchangeclone_energy/energy_values.lua @@ -1,4 +1,4 @@ --- Just in case people want to add stuff to these lists in their mods... +-- This lets mods add things to these lists if they want. exchangeclone.group_values = exchangeclone.group_values or {} exchangeclone.energy_values = exchangeclone.energy_values or {} @@ -16,8 +16,6 @@ if exchangeclone.mcl then } exchangeclone.energy_values = { - -- TODO - ["doc_identifier:identifier_liquid"] = 5, ["fake_liquids:bucket_fake_lava"] = 832, ["fake_liquids:bucket_fake_water"] = 960, @@ -35,38 +33,14 @@ if exchangeclone.mcl then ["mcl_anvils:anvil_damage_2"] = 3328, ["mcl_armor:boots_chain"] = 768, - ["mcl_armor:boots_chain_enchanted"] = 768, - ["mcl_armor:boots_diamond_enchanted"] = 32768, - ["mcl_armor:boots_gold_enchanted"] = 8192, - ["mcl_armor:boots_iron_enchanted"] = 1024, - ["mcl_armor:boots_leather_enchanted"] = 256, ["mcl_armor:boots_netherite"] = 106496, - ["mcl_armor:boots_netherite_enchanted"] = 106496, ["mcl_armor:chestplate_chain"] = 1792, - ["mcl_armor:chestplate_chain_enchanted"] = 1792, - ["mcl_armor:chestplate_diamond_enchanted"] = 65536, - ["mcl_armor:chestplate_gold_enchanted"] = 16384, - ["mcl_armor:chestplate_iron_enchanted"] = 2048, - ["mcl_armor:chestplate_leather_enchanted"] = 512, ["mcl_armor:chestplate_netherite"] = 139264, - ["mcl_armor:chestplate_netherite_enchanted"] = 139264, ["mcl_armor:elytra"] = 297216, ["mcl_armor:helmet_chain"] = 1024, - ["mcl_armor:helmet_chain_enchanted"] = 1024, - ["mcl_armor:helmet_diamond_enchanted"] = 40960, - ["mcl_armor:helmet_gold_enchanted"] = 10240, - ["mcl_armor:helmet_iron_enchanted"] = 1280, - ["mcl_armor:helmet_leather_enchanted"] = 320, ["mcl_armor:helmet_netherite"] = 114688, - ["mcl_armor:helmet_netherite_enchanted"] = 114688, ["mcl_armor:leggings_chain"] = 1536, - ["mcl_armor:leggings_chain_enchanted"] = 1536, - ["mcl_armor:leggings_diamond_enchanted"] = 57344, - ["mcl_armor:leggings_gold_enchanted"] = 14336, - ["mcl_armor:leggings_iron_enchanted"] = 1792, - ["mcl_armor:leggings_leather_enchanted"] = 448, ["mcl_armor:leggings_netherite"] = 131072, - ["mcl_armor:leggings_netherite_enchanted"] = 131072, ["mcl_bamboo:bamboo"] = 2, ["mcl_bamboo:bamboo_block_stripped"] = 16, @@ -87,10 +61,7 @@ if exchangeclone.mcl then ["mcl_books:book"] = 150, ["mcl_books:written_book"] = 206, - ["mcl_bows:bow_enchanted"] = 48, - ["mcl_bows:crossbow_enchanted"] = 295, ["mcl_bows:crossbow_loaded"] = 298, - ["mcl_bows:crossbow_loaded_enchanted"] = 298, ["mcl_buckets:bucket_axolotl"] = 1024, ["mcl_buckets:bucket_cod"] = 896, @@ -105,7 +76,7 @@ if exchangeclone.mcl then ["mcl_cocoas:cocoa_beans"] = 128, - ["mcl_copper:raw_copper"] = 85, + ["mcl_copper:copper_ingot"] = 85, ["mcl_core:andesite"] = 1, ["mcl_core:apple"] = 128, @@ -124,10 +95,12 @@ if exchangeclone.mcl then ["mcl_core:dirt"] = 1, ["mcl_core:emerald"] = 4096, ["mcl_core:flint"] = 4, + ["mcl_core:gold_ingot"] = 2048, ["mcl_core:granite"] = 1, ["mcl_core:grass"] = 1, ["mcl_core:gravel"] = 1, ["mcl_core:ice"] = 1, + ["mcl_core:iron_ingot"] = 256, ["mcl_core:lapis"] = 864, ["mcl_core:mycelium"] = 1, ["mcl_core:obsidian"] = 64, @@ -154,13 +127,7 @@ if exchangeclone.mcl then ["mcl_farming:beetroot_item"] = 24, ["mcl_farming:beetroot_seeds"] = 16, ["mcl_farming:carrot_item"] = 24, - ["mcl_farming:hoe_diamond_enchanted"] = 16380, - ["mcl_farming:hoe_gold_enchanted"] = 4104, - ["mcl_farming:hoe_iron_enchanted"] = 520, ["mcl_farming:hoe_netherite"] = 90108, - ["mcl_farming:hoe_netherite_enchanted"] = 90108, - ["mcl_farming:hoe_stone_enchanted"] = 10, - ["mcl_farming:hoe_wood_enchanted"] = 24, ["mcl_farming:melon_item"] = 36, ["mcl_farming:potato_item"] = 24, ["mcl_farming:potato_item_poison"] = 24, @@ -172,7 +139,6 @@ if exchangeclone.mcl then ["mcl_fishing:clownfish_raw"] = 64, ["mcl_fishing:fish_raw"] = 40, - ["mcl_fishing:fishing_rod_enchanted"] = 36, ["mcl_fishing:pufferfish_raw"] = 64, ["mcl_fishing:salmon_raw"] = 48, @@ -294,9 +260,6 @@ if exchangeclone.mcl then ["mcl_pottery_sherds:pot"] = 16, - ["mcl_raw_ores:raw_gold"] = 2048, - ["mcl_raw_ores:raw_iron"] = 256, - ["mcl_sponges:sponge"] = 1024, ["mcl_sponges:sponge_wet"] = 1024, ["mcl_sponges:sponge_wet_river_water"] = 1024, @@ -306,33 +269,9 @@ if exchangeclone.mcl then ["mcl_throwing:snowball"] = 0.25, ["mcl_tools:axe_netherite"] = 98312, - ["mcl_tools:axe_wood_enchanted"] = 32, - ["mcl_tools:axe_stone_enchanted"] = 11, - ["mcl_tools:axe_iron_enchanted"] = 796, - ["mcl_tools:axe_gold_enchanted"] = 6152, - ["mcl_tools:axe_diamond_enchanted"] = 24584, - ["mcl_tools:axe_netherite_enchanted"] = 98312, ["mcl_tools:pick_netherite"] = 98312, - ["mcl_tools:pick_wood_enchanted"] = 32, - ["mcl_tools:pick_stone_enchanted"] = 11, - ["mcl_tools:pick_iron_enchanted"] = 796, - ["mcl_tools:pick_gold_enchanted"] = 6152, - ["mcl_tools:pick_diamond_enchanted"] = 24584, - ["mcl_tools:pick_netherite_enchanted"] = 98312, ["mcl_tools:shovel_netherite"] = 81928, - ["mcl_tools:shovel_wood_enchanted"] = 16, - ["mcl_tools:shovel_stone_enchanted"] = 9, - ["mcl_tools:shovel_iron_enchanted"] = 264, - ["mcl_tools:shovel_gold_enchanted"] = 2056, - ["mcl_tools:shovel_diamond_enchanted"] = 8200, - ["mcl_tools:shovel_netherite_enchanted"] = 81928, ["mcl_tools:sword_netherite"] = 90120, - ["mcl_tools:sword_wood_enchanted"] = 20, - ["mcl_tools:sword_stone_enchanted"] = 6, - ["mcl_tools:sword_iron_enchanted"] = 516, - ["mcl_tools:sword_gold_enchanted"] = 5000, - ["mcl_tools:sword_diamond_enchanted"] = 16392, - ["mcl_tools:sword_netherite_enchanted"] = 90120, ["mcl_totems:totem"] = 106496, ["meat_blocks:meatball"] = 64, @@ -381,7 +320,7 @@ else ["default:clay_lump"] = 4, ["default:coal_lump"] = 128, ["default:cobble"] = 1, - ["default:copper_lump"] = 320, + ["default:copper_ingot"] = 320, ["default:coral_brown"] = 8, ["default:coral_cyan"] = 8, ["default:coral_green"] = 8, @@ -398,11 +337,11 @@ else ["default:dry_dirt_with_grass"] = 1, ["default:emergent_jungle_sapling"] = 32, ["default:flint"] = 4, - ["default:gold_lump"] = 2048, + ["default:gold_ingot"] = 2048, ["default:grass"] = 1, ["default:gravel"] = 1, ["default:ice"] = 1, - ["default:iron_lump"] = 256, + ["default:iron_ingot"] = 256, ["default:large_cactus_seedling"] = 32, ["default:mese_crystal"] = 4096, ["default:mossycobble"] = 32, @@ -417,7 +356,7 @@ else ["default:snow"] = 0.5, ["default:snowblock"] = 5, ["default:stick"] = 4, - ["default:tin_lump"] = 384, + ["default:tin_ingot"] = 384, ["farming:cotton"] = 12, ["farming:cotton_wild"] = 12, @@ -425,16 +364,16 @@ else ["farming:seed_wheat"] = 16, ["farming:wheat"] = 24, - ["moreores:mithril_lump"] = 16384, - ["moreores:silver_lump"] = 4000, + ["moreores:mithril_ingot"] = 16384, + ["moreores:silver_ingot"] = 4000, - ["technic:chromium_lump"] = 4096, + ["technic:chromium_ingot"] = 4096, ["technic:granite"] = 1, - ["technic:lead_lump"] = 256, + ["technic:lead_ingot"] = 256, ["technic:marble"] = 1, ["technic:sulfur_lump"] = 128, - ["technic:uranium_lump"] = 8192, - ["technic:zinc_lump"] = 512, + ["technic:uranium_ingot"] = 8192, + ["technic:zinc_ingot"] = 512, ["useful_green_potatoes:useful_green_potato"] = 256 } @@ -446,12 +385,19 @@ else end -table.insert_all(exchangeclone.energy_values, { +-- For things that are the same in both games: + +for itemstring, energy_value in pairs ({ ["exchangeclone:alchemical_tome"] = 0, -}) +}) do + exchangeclone.energy_values[itemstring] = energy_value +end table.insert_all(exchangeclone.group_values, { {"tree", 32}, + {"leaves", 1}, {"sapling", 32}, {"useless", 0}, + {"exchangeclone_dirt", 1}, + {"exchangeclone_ore", 0} }) \ No newline at end of file diff --git a/_exchangeclone_energy/init.lua b/_exchangeclone_energy/init.lua index eccc609..0ef7093 100644 --- a/_exchangeclone_energy/init.lua +++ b/_exchangeclone_energy/init.lua @@ -59,35 +59,29 @@ end local function set_item_energy(itemstring, energy_value) if not (energy_value and itemstring) then return end + energy_value = math.floor(energy_value*4)/4 -- floor to nearest .25 if energy_value < 0 then return end - if energy_value < 10 then - energy_value = math.floor(energy_value*4)/4 -- floor to nearest .5 - end - itemstring = minetest.registered_aliases[itemstring] or itemstring local def = minetest.registered_items[itemstring] if not def then return end - local description = def.description - local groups = def.groups and table.copy(def.groups) or {} - description = description:gsub("Energy Value: ([%d%.]+)", "") - local existing_energy_value = description:find("Energy Value: ([%d%.]+)") + local description = def.description or "" + local existing_energy_value = description:find("Energy Value: ([%d%.,]+)") if existing_energy_value then - description = description:gsub("Energy Value: ([%d%.]+)", "Energy Value: "..energy_value) + description = description:gsub("Energy Value: ([%d%.,]+)", "Energy Value: "..exchangeclone.format_number(energy_value)) else if description[#description] ~= "\n" then description = description.."\n" end - description = description.."Energy Value: "..(energy_value) + description = description.."Energy Value: "..exchangeclone.format_number(energy_value) end minetest.override_item(itemstring, { description = description, energy_value = energy_value, - groups = groups }) end local function add_potion_energy(info) local base_cost = exchangeclone.get_item_energy("mcl_potions:water") or 1 --cost of water bottle - --TODO: Change dragon's breath when MineClone does. + -- TODO: Change dragon's breath when MineClone does. local dragon_breath_cost = exchangeclone.get_item_energy("mcl_potions:dragon_breath") or 8.5 base_cost = math.floor(base_cost + (info.ingredient_cost / 3)) -- /3 because 3 potions/ingredient base_cost = base_cost + (info.custom_base_cost or (exchangeclone.get_item_energy("mcl_nether:nether_wart_item") or 24)/3) @@ -130,7 +124,9 @@ end -- This is much easier than making it depend on every single mod. -- Actually, I'm kind of surprised that override_item still works... minetest.register_on_mods_loaded(function() + minetest.log("action", "ExchangeClone: Registering energy values") local auto = {} + local groupnames = {} for index, group in ipairs(exchangeclone.group_values) do groupnames[#groupnames + 1] = group[1] --Get list of group names @@ -141,25 +137,21 @@ minetest.register_on_mods_loaded(function() set_item_energy(item, group[2]) end end + if exchangeclone.mcl then for i = 0, 31 do - set_item_energy("mcl_compass:"..i.."_recovery", 443456) - end - for i = 0, 31 do - set_item_energy("mcl_compass:"..i, (exchangeclone.get_item_energy("mcl_core:iron_ingot") or 256)*4+(exchangeclone.get_item_energy("mesecons:redstone") or 64)) + exchangeclone.register_energy_alias("mcl_compass:18", "mcl_compass:"..i) end for i = 0, 63 do - set_item_energy("mcl_clock:clock_"..i, (exchangeclone.get_item_energy("mcl_core:gold_ingot") or 256)*4+(exchangeclone.get_item_energy("mesecons:redstone") or 64)) - end - -- It's almost like the "compass" and "clock" groups don't exist. I tried using them, but it just didn't work. - -- Bone meal just doesn't work either, for some reason. - for i = 1, 8 do --faster than doing everything individually. - set_item_energy("mcl_jukebox:record_"..i, 16384) + exchangeclone.register_energy_alias("mcl_clock:clock", "mcl_clock:clock_"..i) end + exchangeclone.register_energy_alias("doc_identifier:identifier_solid", "doc_identifier:identifier_liquid") end + for itemstring, energy_value in pairs(exchangeclone.energy_values) do set_item_energy(itemstring, energy_value) end + for itemstring, def in pairs(minetest.registered_items) do if def.exchangeclone_custom_energy then set_item_energy(itemstring, def.exchangeclone_custom_energy) @@ -171,8 +163,9 @@ minetest.register_on_mods_loaded(function() and mod_name and def.description and def.description ~= "" - and (minetest.get_item_group(itemstring, "not_in_creative_inventory") < 1) - and (not def.energy_value) + -- I hate recovery compasses. + and ((minetest.get_item_group(itemstring, "not_in_creative_inventory") < 1) or (mod_name == "mcl_compass")) + and (not exchangeclone.get_item_energy(itemstring)) and (itemstring:sub(1,12) ~= "mcl_potions:") -- This does mean that other items in mcl_potions will be ignored unless explicitly specified, -- and items that are in groups mentioned above. @@ -181,8 +174,17 @@ minetest.register_on_mods_loaded(function() end end end + + -- handle aliases in exchangeclone.recipes + for itemstring, recipes in pairs(exchangeclone.recipes) do + local new_name = ItemStack(itemstring):get_name() + if new_name ~= itemstring then + exchangeclone.recipes[new_name] = recipes + end + end + for i = 1, exchangeclone.num_passes do - minetest.log("action", "PASS #"..i..":") + minetest.log("action", "ExchangeClone: \tPASS #"..i..":") if auto == {} then break end for itemstring, _ in pairs(auto) do local cheapest = get_cheapest_recipe(exchangeclone.recipes[itemstring]) @@ -192,6 +194,9 @@ minetest.register_on_mods_loaded(function() end end end + + --minetest.log(dump(auto)) + if exchangeclone.mcl then for _, info in ipairs(exchangeclone.mcl_potion_data) do add_potion_energy(info) @@ -199,22 +204,41 @@ minetest.register_on_mods_loaded(function() for _, state in ipairs({"exposed", "weathered", "oxidized"}) do set_item_energy("mcl_copper:block_"..state, exchangeclone.get_item_energy("mcl_copper:block")) end + -- Concrete and banners/shields (don't remember why the shields don't work) for _, color in ipairs({"red", "orange", "yellow", "green", "dark_green", "cyan", "light_blue", "blue", "purple", "magenta", "pink", "black", "white", "silver", "grey", "brown"}) do set_item_energy("mcl_colorblocks:concrete_"..color, exchangeclone.get_item_energy("mcl_colorblocks:concrete_powder_"..color) or 2) set_item_energy("mcl_shields:shield_"..color, (exchangeclone.get_item_energy("mcl_banners:banner_item_"..color) or 340) + (exchangeclone.get_item_energy("mcl_shields:shield") or 304)) end - end - - for output, recipes in pairs(exchangeclone.recipes) do - if output:find("silicon") then - for _, recipe in ipairs(recipes) do - minetest.log(dump(recipe)) + -- Enchanted/netherite tools + for name, def in pairs(minetest.registered_items) do + if def._mcl_enchanting_enchanted_tool then + exchangeclone.register_energy_alias(name, def._mcl_enchanting_enchanted_tool) + end + if def._mcl_upgrade_item then + if not name:find("enchanted") then + set_item_energy(def._mcl_upgrade_item, (exchangeclone.get_item_energy(name) or 0)+(exchangeclone.get_item_energy("mcl_nether:netherite_ingot") or 73728)) + end end end + -- Recovery compasses use a random compass frame for the crafting recipe... Incredibly irritating. + for i = 0, 31 do + if exchangeclone.get_item_energy("mcl_compass:"..i.."_recovery") then + minetest.log(i) + for j = 0, 31 do + exchangeclone.register_energy_alias("mcl_compass:"..i.."_recovery", "mcl_compass:"..j.."_recovery") + end + break + end + end + end + + -- Adds energy values to aliased items, even though they're not used (just so it's displayed) + for alias, itemstring in pairs(exchangeclone.energy_aliases) do + set_item_energy(alias, exchangeclone.get_item_energy(itemstring)) end -- Free up memory (I assume this will do that?) exchangeclone.recipes = nil exchangeclone.energy_values = nil -end -) \ No newline at end of file + minetest.log("action", "ExchangeClone: Done registering energy values.") +end) \ No newline at end of file diff --git a/exchangeclone/alchemical_chest.lua b/exchangeclone/alchemical_chest.lua deleted file mode 100644 index edb6877..0000000 --- a/exchangeclone/alchemical_chest.lua +++ /dev/null @@ -1,35 +0,0 @@ -local function alchemical_formspec(color) -end - -local colors = { - "Red", - "Orange", - "Yellow", - "Green", - "Cyan", - "Blue", - "Magenta", - "" -} - -for _, color in colors do - local lower_color = string.lower(color) - local itemstring = "exchangeclone:"..lower_color.."_advanced_alchemical_chest" - minetest.register_node(itemstring, { - description = color.." Alchemical Chest", - groups = {container = 2, alchemical_chest = 1}, - after_place_node = function(pos, player, itemstack, pointed_thing) - local meta = minetest.get_meta(pos) - meta:set_string("formspec", alchemical_formspec(color)) - meta:set_string("infotext", color.." Alchemical Chest") - end, - }) - local wool_itemstring = (exchangeclone.mcl and "mcl_wool:" or "wool:")..lower_color - minetest.register_craft({ - output = itemstring, - recipe = { - {"exchangeclone:low_covalence_dust", "exchangeclone:medium_covalence_dust", "exchangeclone:high_covalence_dust"}, - - } - }) -end \ No newline at end of file diff --git a/exchangeclone/alchemical_chests.lua b/exchangeclone/alchemical_chests.lua new file mode 100644 index 0000000..9e220b4 --- /dev/null +++ b/exchangeclone/alchemical_chests.lua @@ -0,0 +1,159 @@ +local S = minetest.get_translator() + +local colors = { + red = "Red", + orange = "Orange", + yellow = "Yellow", + green = "Lime", + dark_green = "Green", + cyan = "Cyan", + light_blue = "Light Blue", + blue = "Blue", + purple = "Purple", + magenta = "Magenta", + pink = "Pink", + black = "Black", + white = "White", + silver = exchangeclone.mcl and "Light Gray", + grey = "Gray", + brown = "Brown", +} + +-- color is nil for regular alchemical chests (not advanced/bags) +local function alchemical_formspec(color) + local listname, label + local centered = exchangeclone.mcl and 2 or 2.5 + if color then + local codified_color = string.lower(color):gsub(" ", "_") + listname = "current_player;"..codified_color.."_alchemical_inventory" + label = S("@1 Alchemical Inventory", S(color)) + else + listname = "context;main" + label = S("Alchemical Chest") + end + local formspec = + "size[14,13]".. + "label[0.25,0.0;"..label.."]".. + "list["..listname..";0,0.5;13,8]".. + exchangeclone.inventory_formspec(centered, 9).. + "listring[current_player;main]".. + "listring["..listname.."]" + if exchangeclone.mcl then + formspec = formspec..mcl_formspec.get_itemslot_bg(0,0.5,13,8) + end + return formspec +end + +local function alchemical_on_construct(color) + return function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", alchemical_formspec(color)) + meta:set_string("infotext", color.." Alchemical Chest") + end +end + +minetest.register_node("exchangeclone:alchemical_chest", { + description = S("Alchemical Chest"), + groups = {container = 2, alchemical_chest = 1, cracky = 2, pickaxey = 2}, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + meta:set_string("formspec", alchemical_formspec()) + meta:set_string("infotext", S("Alchemical Chest")) + inv:set_size("main", 104) + inv:set_width("main", 13) + end, +}) + +local stone_itemstring = exchangeclone.mcl and "mcl_core:stone" or "default:stone" +local chest_itemstring = exchangeclone.mcl and "mcl_chests:chest" or "default:chest" + +minetest.register_craft({ + output = "exchangeclone:alchemical_chest", + recipe = { + {"exchangeclone:low_covalence_dust", "exchangeclone:medium_covalence_dust", "exchangeclone:high_covalence_dust"}, + {stone_itemstring, exchangeclone.itemstrings.diamond, stone_itemstring}, + {exchangeclone.itemstrings.iron, chest_itemstring, exchangeclone.itemstrings.iron} + } +}) + +minetest.register_on_joinplayer(function(player, last_login) + local inv = player:get_inventory() + for _, color in pairs(colors) do + local codified_color = string.lower(color):gsub(" ", "_") + inv:set_size(codified_color.."_alchemical_inventory", 104) + inv:set_width(codified_color.."_alchemical_inventory", 13) + end +end) + +for dye_color, color in pairs(colors) do + local codified_color = string.lower(color):gsub(" ", "_") + local bag_itemstring = "exchangeclone:"..codified_color.."_alchemical_bag" + local advanced_itemstring = "exchangeclone:"..codified_color.."_advanced_alchemical_chest" + local wool_itemstring = (exchangeclone.mcl and "mcl_wool:" or "wool:")..dye_color + local dye_itemstring = (exchangeclone.mcl and "mcl_dye:" or "dye:")..dye_color + + local function alchemical_bag_action(itemstack, player, pointed_thing) + local click_test = exchangeclone.check_on_rightclick(itemstack, player, pointed_thing) + if click_test ~= false then + return click_test + end + if pointed_thing.type == "node" + and minetest.get_item_group(minetest.get_node(pointed_thing.under).name, "advanced_alchemical_chest") > 0 then + --minetest.log(advanced_itemstring) + minetest.set_node(pointed_thing.under, {name=advanced_itemstring}) + local on_construct = alchemical_on_construct(color) + on_construct(pointed_thing.under) + return + else + minetest.show_formspec(player:get_player_name(), bag_itemstring, alchemical_formspec(color)) + end + end + + minetest.register_tool(bag_itemstring, { + description = S("@1 Alchemical Bag", S(color)), + groups = {disable_repair = 1, alchemical_bag = 1}, + on_secondary_use = alchemical_bag_action, + on_place = alchemical_bag_action + }) + + minetest.register_craft({ + output = bag_itemstring, + recipe = { + {"exchangeclone:high_covalence_dust", "exchangeclone:high_covalence_dust", "exchangeclone:high_covalence_dust"}, + {wool_itemstring, "exchangeclone:alchemical_chest", wool_itemstring}, + {wool_itemstring, wool_itemstring, wool_itemstring}, + } + }) + minetest.register_craft({ + output = bag_itemstring, + type = "shapeless", + recipe = { + "group:alchemical_bag", + dye_itemstring + } + }) + + minetest.register_node(advanced_itemstring, { + description = S("@1 Advanced Alchemical Chest", color).."\n"..S("Shift+right-click with an alchemical bag to change the color."), + groups = {container = 2, advanced_alchemical_chest = 1}, + on_construct = alchemical_on_construct(color) + }) + + minetest.register_craft({ + output = advanced_itemstring, + recipe = { + {"exchangeclone:dark_matter", "exchangeclone:low_covalence_dust", "exchangeclone:dark_matter"}, + {"exchangeclone:medium_covalence_dust", "exchangeclone:"..codified_color.."_alchemical_bag", "exchangeclone:medium_covalence_dust"}, + {"exchangeclone:high_covalence_dust", "exchangeclone:low_covalence_dust", "exchangeclone:high_covalence_dust"}, + } + }) + minetest.register_craft({ + output = advanced_itemstring, + type = "shapeless", + recipe = { + "group:advanced_alchemical_chest", + dye_itemstring + } + }) +end \ No newline at end of file diff --git a/exchangeclone/armor.lua b/exchangeclone/armor.lua index 8595e80..5a108ef 100644 --- a/exchangeclone/armor.lua +++ b/exchangeclone/armor.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator() + -- true = blocks all damage -- {base_block, block_per_rm}: Amount blocked by full dark matter, extra amount per red matter armor piece local blocked_damage_types = { @@ -48,10 +50,10 @@ if exchangeclone.mcl then name = "dark_matter", description = "Dark Matter", descriptions = exchangeclone.mineclonia and { - head = "Dark Matter Helmet", - torso = "Dark Matter Chestplate", - legs = "Dark Matter Leggings", - feet = "Dark Matter Boots" + head = S("Dark Matter Helmet"), + torso = S("Dark Matter Chestplate"), + legs = S("Dark Matter Leggings"), + feet = S("Dark Matter Boots") }, durability = -1, enchantability = 0, @@ -76,10 +78,10 @@ if exchangeclone.mcl then name = "red_matter", description = "Red Matter", descriptions = exchangeclone.mineclonia and { - head = "Red Matter Helmet", - torso = "Red Matter Chestplate", - legs = "Red Matter Leggings", - feet = "Red Matter Boots" + head = S("Red Matter Helmet"), + torso = S("Red Matter Chestplate"), + legs = S("Red Matter Leggings"), + feet = S("Red Matter Boots") }, durability = -1, enchantability = 0, @@ -140,7 +142,7 @@ if exchangeclone.mcl then end) else armor:register_armor("exchangeclone:helmet_dark_matter", { - description = "Dark Matter Helmet", + description = S("Dark Matter Helmet"), texture = get_armor_texture("helmet","dark"), inventory_image = get_armor_texture("inv_helmet","dark"), preview = get_armor_texture("helmet","dark", true), @@ -148,7 +150,7 @@ else groups = {armor_head = 1, dark_matter_armor = 1, armor_heal = 5, armor_fire = 1, armor_water = 1, disable_repair = 1, exchangeclone_upgradable = 1} }) armor:register_armor("exchangeclone:chestplate_dark_matter", { - description = "Dark Matter Chestplate", + description = S("Dark Matter Chestplate"), texture = get_armor_texture("chestplate","dark"), inventory_image = get_armor_texture("inv_chestplate","dark"), preview = get_armor_texture("chestplate","dark", true), @@ -156,7 +158,7 @@ else groups = {armor_torso = 1, dark_matter_armor = 1, armor_heal = 8, armor_fire = 2, armor_water = 1, disable_repair = 1, exchangeclone_upgradable = 1} }) armor:register_armor("exchangeclone:leggings_dark_matter", { - description = "Dark Matter Leggings", + description = S("Dark Matter Leggings"), texture = get_armor_texture("leggings","dark"), inventory_image = get_armor_texture("inv_leggings","dark"), preview = get_armor_texture("leggings","dark", true), @@ -164,7 +166,7 @@ else groups = {armor_legs = 1, dark_matter_armor = 1, armor_heal = 7, armor_fire = 1, armor_water = 1, disable_repair = 1, exchangeclone_upgradable = 1} }) armor:register_armor("exchangeclone:boots_dark_matter", { - description = "Dark Matter Boots", + description = S("Dark Matter Boots"), texture = get_armor_texture("boots","dark"), inventory_image = get_armor_texture("inv_boots","dark"), preview = get_armor_texture("boots","dark", true), @@ -172,7 +174,7 @@ else groups = {armor_feet = 1, dark_matter_armor = 1, armor_heal = 4, armor_fire = 1, armor_water = 1, disable_repair = 1, exchangeclone_upgradable = 1} }) armor:register_armor("exchangeclone:shield_dark_matter", { - description = "Dark Matter Shield", + description = S("Dark Matter Shield"), texture = get_armor_texture("shield","dark"), inventory_image = get_armor_texture("inv_shield","dark"), preview = get_armor_texture("shield","dark", true), @@ -180,7 +182,7 @@ else groups = {armor_shield = 1, dark_matter_armor = 1, armor_heal = 7, armor_fire = 1, armor_water = 1, disable_repair = 1, exchangeclone_upgradable = 1} }) armor:register_armor("exchangeclone:helmet_red_matter", { - description = "Red Matter Helmet", + description = S("Red Matter Helmet"), texture = get_armor_texture("helmet","red"), inventory_image = get_armor_texture("inv_helmet","red"), preview = get_armor_texture("helmet","red", true), @@ -188,7 +190,7 @@ else groups = {armor_head = 1, red_matter_armor = 1, armor_heal = 10, armor_fire = 2, armor_water = 1, disable_repair = 1, exchangeclone_upgradable = 1} }) armor:register_armor("exchangeclone:chestplate_red_matter", { - description = "Red Matter Chestplate", + description = S("Red Matter Chestplate"), texture = get_armor_texture("chestplate","red"), inventory_image = get_armor_texture("inv_chestplate","red"), preview = get_armor_texture("chestplate","red", true), @@ -196,7 +198,7 @@ else groups = {armor_torso = 1, red_matter_armor = 1, armor_heal = 16, armor_fire = 2, armor_water = 1, disable_repair = 1, exchangeclone_upgradable = 1} }) armor:register_armor("exchangeclone:leggings_red_matter", { - description = "Red Matter Leggings", + description = S("Red Matter Leggings"), texture = get_armor_texture("leggings","red"), inventory_image = get_armor_texture("inv_leggings","red"), preview = get_armor_texture("leggings","red", true), @@ -204,7 +206,7 @@ else groups = {armor_legs = 1, red_matter_armor = 1, armor_heal = 14, armor_fire = 2, armor_water = 1, disable_repair = 1, exchangeclone_upgradable = 1} }) armor:register_armor("exchangeclone:boots_red_matter", { - description = "Red Matter Boots", + description = S("Red Matter Boots"), texture = get_armor_texture("boots","red"), inventory_image = get_armor_texture("inv_boots","red"), preview = get_armor_texture("boots","red", true), @@ -212,7 +214,7 @@ else groups = {armor_feet = 1, red_matter_armor = 1, armor_heal = 8, armor_fire = 2, armor_water = 1, disable_repair = 1, exchangeclone_upgradable = 1} }) armor:register_armor("exchangeclone:shield_red_matter", { - description = "Red Matter Shield", + description = S("Red Matter Shield"), texture = get_armor_texture("shield","red"), inventory_image = get_armor_texture("inv_shield","red"), preview = get_armor_texture("shield","red", true), diff --git a/exchangeclone/axes.lua b/exchangeclone/axes.lua index 8443941..3e886f3 100644 --- a/exchangeclone/axes.lua +++ b/exchangeclone/axes.lua @@ -1,19 +1,19 @@ +local S = minetest.get_translator() + exchangeclone.axe_action = { - start_action = function(player, center, range) + start_action = function(player, center, range, itemstack) if exchangeclone.check_cooldown(player, "axe") then return end local data = {} - data.player_energy = exchangeclone.get_player_energy(player) - data.energy_cost = 0 if exchangeclone.mcl then data.strip = not player:get_player_control().sneak end if range > 0 or not data.strip then exchangeclone.play_ability_sound(player) end + data.itemstack = itemstack return data end, action = function(player, pos, node, data) - if data.energy_cost + 8 > data.player_energy then return end local node_def = minetest.registered_items[node.name] if (node_def.groups.tree or node_def.groups.leaves) then if minetest.is_protected(pos, player:get_player_name()) then @@ -21,12 +21,10 @@ exchangeclone.axe_action = { else if data.strip then if node_def._mcl_stripped_variant ~= nil then - data.energy_cost = data.energy_cost + 4 minetest.swap_node(pos, {name=node_def._mcl_stripped_variant, param2=node.param2}) end else - data.energy_cost = data.energy_cost + 8 - local drops = minetest.get_node_drops(node.name, "exchangeclone:red_matter_axe") + local drops = minetest.get_node_drops(node.name, data.itemstack) exchangeclone.drop_items_on_player(pos, drops, player) minetest.set_node(pos, {name = "air"}) end @@ -36,7 +34,6 @@ exchangeclone.axe_action = { end, end_action = function(player, center, range, data) if range > 0 or not data.strip then - exchangeclone.set_player_energy(player, data.player_energy - data.energy_cost) exchangeclone.start_cooldown(player, "axe", range/6) end end @@ -60,12 +57,12 @@ local function axe_on_place(itemstack, player, pointed_thing) local center = player:get_pos() if pointed_thing.type == "node" then center = pointed_thing.under end - exchangeclone.node_radius_action(player, center, range, exchangeclone.axe_action) + exchangeclone.node_radius_action(player, center, range, exchangeclone.axe_action, itemstack) return itemstack end minetest.register_tool("exchangeclone:dark_matter_axe", { - description = "Dark Matter Axe", + description = S("Dark Matter Axe"), wield_image = "exchangeclone_dark_matter_axe.png", inventory_image = "exchangeclone_dark_matter_axe.png", groups = { tool=1, axe=1, dig_speed_class=7, enchantability=0, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1}, @@ -90,7 +87,7 @@ minetest.register_tool("exchangeclone:dark_matter_axe", { }) minetest.register_tool("exchangeclone:red_matter_axe", { - description = "Red Matter Axe", + description = S("Red Matter Axe"), wield_image = "exchangeclone_red_matter_axe.png", inventory_image = "exchangeclone_red_matter_axe.png", groups = { tool=1, axe=1, dig_speed_class=8, enchantability=0, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1}, diff --git a/exchangeclone/baubles.lua b/exchangeclone/baubles.lua index b9ad975..d494f5d 100644 --- a/exchangeclone/baubles.lua +++ b/exchangeclone/baubles.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator() + local storage = minetest.get_mod_storage() exchangeclone.bauble_data = minetest.deserialize(storage:get_string("bauble_data")) @@ -73,13 +75,13 @@ function exchangeclone.show_baubles(player) end minetest.register_tool("exchangeclone:bauble_accessor", { - description = "Bauble Accessor", + description = S("Bauble Accessor"), groups = {disable_repair = 1}, }) minetest.register_tool("exchangeclone:repair_talisman", { - description = "Repair Talisman", - groups = {disable_repair = 1, bauble = 1}, -- kind of ironic :D + description = S("Repair Talisman"), + groups = {disable_repair = 1, bauble = 1}, bauble_info = { action = "repair", hotbar = true @@ -87,8 +89,8 @@ minetest.register_tool("exchangeclone:repair_talisman", { }) minetest.register_tool("exchangeclone:gem_of_eternal_density", { - description = "Gem of Eternal Density", - groups = {disable_repair = 1, bauble = 1}, -- kind of ironic :D + description = S("Gem of Eternal Density"), + groups = {disable_repair = 1, bauble = 1}, bauble_info = { action = "density", hotbar = true diff --git a/exchangeclone/constructor.lua b/exchangeclone/constructor.lua index 2499d0d..51a013a 100644 --- a/exchangeclone/constructor.lua +++ b/exchangeclone/constructor.lua @@ -1,47 +1,25 @@ -local function get_constructor_formspec() - if not exchangeclone.mcl then - local formspec = { - "size[8,9]", - "label[2,1;Orb]", - "list[context;fuel;2,2;1,1;]", - "label[3,1;Source]", - "list[context;src;3,2;1,1;]", - "label[5,1;Output]", - "list[context;dst;5,2;1,1;]", - "list[current_player;main;0,5;8,4;]", - "listring[current_player;main]", - "listring[context;src]", - "listring[current_player;main]", - "listring[context;fuel]", - "listring[current_player;main]", - "listring[context;dst]", - } - return table.concat(formspec, "") - else - local formspec = { - "size[9,10]", - "label[2,1;Orb]", - "list[context;fuel;2,2;1,1;]", - mcl_formspec.get_itemslot_bg(2,2,1,1), - "label[3,1;Source]", - "list[context;src;3,2;1,1;]", - mcl_formspec.get_itemslot_bg(3,2,1,1), - "label[5,1;Output]", - "list[context;dst;5,2;1,1;]", - mcl_formspec.get_itemslot_bg(5,2,1,1), - "list[current_player;main;0,5;9,3;9]", - mcl_formspec.get_itemslot_bg(0,5,9,3), - "list[current_player;main;0,8.5;9,1;]", - mcl_formspec.get_itemslot_bg(0,8.5,9,1), - "listring[current_player;main]", - "listring[context;src]", - "listring[current_player;main]", - "listring[context;fuel]", - "listring[current_player;main]", - "listring[context;dst]", - } - return table.concat(formspec, "") - end +local S = minetest.get_translator() + +local formspec = + "size["..(exchangeclone.mcl and 9 or 8)..",9]".. + "label[2,1;"..S("Orb").."]".. + "list[context;fuel;2,2;1,1;]".. + "label[3,1;"..S("Source").."]".. + "list[context;src;3,2;1,1;]".. + "label[5,1;"..S("Output").."]".. + "list[context;dst;5,2;1,1;]".. + exchangeclone.inventory_formspec(0,5).. + "listring[current_player;main]".. + "listring[context;src]".. + "listring[current_player;main]".. + "listring[context;fuel]".. + "listring[current_player;main]".. + "listring[context;dst]" +if exchangeclone.mcl then + formspec = formspec.. + mcl_formspec.get_itemslot_bg(2,2,1,1).. + mcl_formspec.get_itemslot_bg(3,2,1,1).. + mcl_formspec.get_itemslot_bg(5,2,1,1) end minetest.register_alias("exchangeclone:element_constructor", "exchangeclone:constructor") @@ -53,7 +31,7 @@ minetest.register_lbm({ run_at_every_load = false, action = function(pos, node) local meta = minetest.get_meta(pos) - meta:set_string("formspec", "size[3,1]label[0,0;Break and replace.\nNothing will be lost.]") + meta:set_string("formspec", "size[3,1]label[0,0;"..S("Break and replace.").."\n"..S("Nothing will be lost.").."]") end, }) @@ -80,24 +58,11 @@ local function constructor_action(pos) if not inv:is_empty("src") then -- make sure the stack at dst is same as the src (including enchantments) if not inv:is_empty("dst") then - if src_stack:get_name() ~= dst_stack:get_name() then - if exchangeclone.mcl then - if not(string.sub(src_stack:get_name(), -10, -1) == "_enchanted" - and string.sub(src_stack:get_name(), 1, -11) == dst_stack:get_name() - and src_stack:get_name() ~= "mcl_core:apple_gold_enchanted") then - return - end - else - return - end + if exchangeclone.handle_alias(src_stack) ~= dst_stack:get_name() then + return end end - local result = src_stack:get_name() - if exchangeclone.mcl - and string.sub(result, -10, -1) == "_enchanted" - and result ~= "mcl_core:apple_gold_enchanted" then - result = string.sub(src_stack:get_name(), 1, -11) - end + local result = exchangeclone.handle_alias(src_stack) -- make sure orb/player has enough energy local current_energy if using_orb then @@ -117,6 +82,15 @@ local function constructor_action(pos) end end end + + local timer = minetest.get_node_timer(pos) + if inv:get_stack("src", 1):is_empty() then + timer:stop() + else + if not timer:is_started() then + timer:start(1) -- keep trying to construct if there are items in the src stack + end + end end local function on_construct(pos) @@ -125,8 +99,8 @@ local function on_construct(pos) inv:set_size("fuel", 1) inv:set_size("src", 1) inv:set_size("dst", 1) - meta:set_string("formspec", get_constructor_formspec()) - meta:set_string("infotext", "Constructor") + meta:set_string("formspec", formspec) + meta:set_string("infotext", S("Constructor")) end local function allow_metadata_inventory_put(pos, listname, index, stack, player) @@ -172,7 +146,7 @@ local function on_blast(pos) end minetest.register_node("exchangeclone:constructor", { - description = "Constructor", + description = S("Constructor"), tiles = { "exchangeclone_constructor_up.png", "exchangeclone_constructor_down.png", @@ -218,6 +192,7 @@ minetest.register_node("exchangeclone:constructor", { allow_metadata_inventory_put = allow_metadata_inventory_put, allow_metadata_inventory_move = allow_metadata_inventory_move, allow_metadata_inventory_take = allow_metadata_inventory_take, + on_timer = constructor_action, }) local recipe_ingredient = "default:pick_diamond" diff --git a/exchangeclone/covalence_dust.lua b/exchangeclone/covalence_dust.lua index 0306df4..2ae58a2 100644 --- a/exchangeclone/covalence_dust.lua +++ b/exchangeclone/covalence_dust.lua @@ -1,16 +1,17 @@ -local charcoal_itemstring = exchangeclone.mcl and "mcl_core:charcoal" or "group:tree" -local redstone_itemstring = exchangeclone.mcl and "mcl_core:redstone" or "default:obsidian" +local S = minetest.get_translator() + +local charcoal_itemstring = exchangeclone.mcl and "mcl_core:charcoal_lump" or "group:tree" minetest.register_craftitem("exchangeclone:low_covalence_dust", { - description = "Low Covalence Dust" + description = S("Low Covalence Dust") }) minetest.register_craftitem("exchangeclone:medium_covalence_dust", { - description = "Medium Covalence Dust" + description = S("Medium Covalence Dust") }) minetest.register_craftitem("exchangeclone:high_covalence_dust", { - description = "High Covalence Dust" + description = S("High Covalence Dust") }) minetest.register_craft({ @@ -33,7 +34,7 @@ minetest.register_craft({ output = "exchangeclone:medium_covalence_dust 40", type = "shapeless", recipe = { - exchangeclone.itemstrings.iron, redstone_itemstring + exchangeclone.itemstrings.iron, exchangeclone.itemstrings.redstoneworth } }) diff --git a/exchangeclone/craftitems.lua b/exchangeclone/craftitems.lua index 8f63df0..5daeaf4 100644 --- a/exchangeclone/craftitems.lua +++ b/exchangeclone/craftitems.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator() + local function get_level(level) if exchangeclone.mcl then return nil @@ -7,21 +9,21 @@ local function get_level(level) end minetest.register_craftitem("exchangeclone:alchemical_coal", { - description = "Alchemical Coal", + description = S("Alchemical Coal"), wield_image = "exchangeclone_alchemical_coal.png", inventory_image = "exchangeclone_alchemical_coal.png", groups = { craftitem=1}, }) minetest.register_craftitem("exchangeclone:mobius_fuel", { - description = "Mobius Fuel", + description = S("Mobius Fuel"), wield_image = "exchangeclone_mobius_fuel.png", inventory_image = "exchangeclone_mobius_fuel.png", groups = { craftitem=1}, }) minetest.register_craftitem("exchangeclone:aeternalis_fuel", { - description = "Aeternalis Fuel", + description = S("Aeternalis Fuel"), wield_image = "exchangeclone_aeternalis_fuel.png", inventory_image = "exchangeclone_aeternalis_fuel.png", groups = { craftitem=1}, @@ -46,21 +48,21 @@ minetest.register_craft({ }) minetest.register_craftitem("exchangeclone:dark_matter", { - description = "Dark Matter Orb", + description = S("Dark Matter Orb"), wield_image = "exchangeclone_dark_matter.png", inventory_image = "exchangeclone_dark_matter.png", groups = {craftitem = 1} }) minetest.register_craftitem("exchangeclone:red_matter", { - description = "Red Matter Orb", + description = S("Red Matter Orb"), wield_image = "exchangeclone_red_matter.png", inventory_image = "exchangeclone_red_matter.png", groups = {craftitem = 1}, }) minetest.register_node("exchangeclone:dark_matter_block", { - description = "Dark Matter Block", + description = S("Dark Matter Block"), tiles = {"exchangeclone_dark_matter_block.png"}, is_ground_content = false, sounds = exchangeclone.sound_mod.node_sound_stone_defaults(), @@ -70,7 +72,7 @@ minetest.register_node("exchangeclone:dark_matter_block", { }) minetest.register_node("exchangeclone:red_matter_block", { - description = "Red Matter Block", + description = S("Red Matter Block"), tiles = {"exchangeclone_red_matter_block.png"}, is_ground_content = false, light_source = 14, diff --git a/exchangeclone/deconstructor.lua b/exchangeclone/deconstructor.lua index 954231d..885b64f 100644 --- a/exchangeclone/deconstructor.lua +++ b/exchangeclone/deconstructor.lua @@ -1,38 +1,22 @@ -local function get_deconstructor_formspec() - if not exchangeclone.mcl then - local formspec = { - "size[8,9]", - "label[2,1;Items]", - "list[context;src;2,2;1,1;]", - "label[5,1;Orb]", - "list[context;fuel;5,2;1,1;]", - "list[current_player;main;0,5;8,4;]", - "listring[current_player;main]", - "listring[context;src]", - "listring[current_player;main]", - "listring[context;fuel]", - } - return table.concat(formspec, "") - else - local formspec = { - "size[9,10]", - "label[2,1;Items]", - "list[context;src;2,2;1,1;]", - mcl_formspec.get_itemslot_bg(2,2,1,1), - "label[5,1;Orb]", - "list[context;fuel;5,2;1,1;]", - mcl_formspec.get_itemslot_bg(5,2,1,1), - "list[current_player;main;0,5;9,3;9]", - mcl_formspec.get_itemslot_bg(0,5,9,3), - "list[current_player;main;0,8.5;9,1;]", - mcl_formspec.get_itemslot_bg(0,8.5,9,1), - "listring[current_player;main]", - "listring[context;src]", - "listring[current_player;main]", - "listring[context;fuel]" - } - return table.concat(formspec, "") - end +local S = minetest.get_translator() + +local formspec = + "size["..(exchangeclone.mcl and 9 or 8)..",9]".. + "label[2,1;"..S("Input").."]".. + "list[context;src;2,2;1,1;]".. + "label[5,1;"..S("Orb").."]".. + "list[context;fuel;5,2;1,1;]".. + exchangeclone.inventory_formspec(0,5).. + "listring[current_player;main]".. + "listring[context;src]".. + "listring[current_player;main]".. + "listring[context;fuel]".. + "listring[current_player;main]".. + "listring[context;dst]" +if exchangeclone.mcl then + formspec = formspec.. + mcl_formspec.get_itemslot_bg(2,2,1,1).. + mcl_formspec.get_itemslot_bg(5,2,1,1) end minetest.register_alias("exchangeclone:element_deconstructor", "exchangeclone:deconstructor") @@ -44,7 +28,7 @@ minetest.register_lbm({ run_at_every_load = false, action = function(pos, node) local meta = minetest.get_meta(pos) - meta:set_string("formspec", "size[3,1]label[0,0;Break and replace.\nNothing will be lost.]") + meta:set_string("formspec", "size[3,1]label[0,0;"..S("Break and replace.").."\n"..S("Nothing will be lost.").."]") end, }) @@ -55,18 +39,20 @@ local function can_dig(pos, player) return inv:is_empty("src") and inv:is_empty("fuel") and inv:is_empty("main") end -local function deconstructor_action(pos) +local function deconstructor_action(pos, elapsed) local limit = exchangeclone.orb_max local using_orb = true local player local meta = minetest.get_meta(pos) local inv = meta:get_inventory() + if inv:get_stack("fuel", 1):get_name() ~= "exchangeclone:exchange_orb" then limit = exchangeclone.limit using_orb = false player = minetest.get_player_by_name(meta:get_string("exchangeclone_placer")) if not (player and player ~= "") then return end end + local stack = inv:get_stack("src", 1) local individual_energy_value = exchangeclone.get_item_energy(stack:get_name()) if not (individual_energy_value and individual_energy_value > 0) then return end @@ -77,6 +63,7 @@ local function deconstructor_action(pos) if stack:get_name() == "exchangeclone:exchange_orb" then individual_energy_value = individual_energy_value + exchangeclone.get_orb_itemstack_energy(stack) end + local current_energy if using_orb then current_energy = exchangeclone.get_orb_energy(inv, "fuel", 1) @@ -88,6 +75,7 @@ local function deconstructor_action(pos) local energy_value = individual_energy_value * add_count local result = current_energy + energy_value if result < 0 or result > limit then return end + if using_orb then exchangeclone.set_orb_energy(inv, "fuel", 1, result) else @@ -96,6 +84,15 @@ local function deconstructor_action(pos) stack:set_count(stack:get_count() - add_count) if stack:get_count() == 0 then stack = ItemStack("") end inv:set_stack("src", 1, stack) + + local timer = minetest.get_node_timer(pos) + if inv:get_stack("src", 1):is_empty() then + timer:stop() + else + if not timer:is_started() then + timer:start(1) -- keep trying to deconstruct if there are items in the src stack + end + end end local function on_construct(pos) @@ -103,8 +100,8 @@ local function on_construct(pos) local inv = meta:get_inventory() inv:set_size("src", 1) inv:set_size("fuel", 1) - meta:set_string("formspec", get_deconstructor_formspec()) - meta:set_string("infotext", "Deconstructor") + meta:set_string("formspec", formspec) + meta:set_string("infotext", S("Deconstructor")) deconstructor_action(pos, 0) end @@ -150,7 +147,7 @@ local function on_blast(pos) end minetest.register_node("exchangeclone:deconstructor", { - description = "Deconstructor", + description = S("Deconstructor"), tiles = { "exchangeclone_deconstructor_up.png", "exchangeclone_deconstructor_down.png", diff --git a/exchangeclone/energy_collector.lua b/exchangeclone/energy_collector.lua index d0619c4..7885bca 100644 --- a/exchangeclone/energy_collector.lua +++ b/exchangeclone/energy_collector.lua @@ -1,30 +1,13 @@ -local function get_energy_collector_formspec() - local formspec - if not exchangeclone.mcl then - formspec = { - "size[8,9]", - "label[3,2;Orb]", - "list[context;main;4,2;1,1;]", - "list[current_player;main;0,5;8,4;]", - "listring[current_player;main]", - "listring[context;main]" - } - else - formspec = { - "size[9,10]", - "label[3,2;Orb]", - "list[context;main;4,2;1,1;]", - mcl_formspec.get_itemslot_bg(4,2,1,1), - "list[current_player;main;0,5;9,3;9]", - mcl_formspec.get_itemslot_bg(0,5,9,3), - "list[current_player;main;0,8.5;9,1;]", - mcl_formspec.get_itemslot_bg(0,8.5,9,1), - "listring[current_player;main]", - "listring[context;main]" - } - end - return table.concat(formspec, "") -end +local S = minetest.get_translator() + +local formspec = + "size["..(exchangeclone.mcl and 9 or 8)..",9]".. + "label[3,2;"..S("Orb").."]".. + "list[context;main;4,2;1,1;]".. + exchangeclone.inventory_formspec(0,5).. + "listring[current_player;main]".. + "listring[context;main]".. + exchangeclone.mcl and mcl_formspec.get_itemslot_bg(4,2,1,1) minetest.register_alias("exchangeclone:energy_collector", "exchangeclone:energy_collector_mk1") @@ -35,7 +18,7 @@ minetest.register_lbm({ run_at_every_load = false, action = function(pos, node) local meta = minetest.get_meta(pos) - meta:set_string("formspec", "size[3,1]label[0,0;Break and replace.\nNothing will be lost.]") + meta:set_string("formspec", "size[3,1]label[0,0;"..S("Break and replace.").."\n"..S("Nothing will be lost.").."]") end, }) @@ -114,8 +97,7 @@ local function on_timer(pos, elapsed) if placer and placer ~= "" then local player = minetest.get_player_by_name(placer) if player then - local player_energy = exchangeclone.get_player_energy(player) - exchangeclone.set_player_energy(player, player_energy + amount) + exchangeclone.add_player_energy(player, amount) end end end @@ -129,7 +111,7 @@ local function on_construct(pos) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() inv:set_size("main", 1) - meta:set_string("formspec", get_energy_collector_formspec()) + meta:set_string("formspec", formspec) minetest.get_node_timer(pos):start(1) end @@ -221,7 +203,7 @@ function exchangeclone.register_energy_collector(itemstring, name, amount, modif local meta = minetest.get_meta(pos) meta:set_int("collector_amount", amount) meta:set_string("exchangeclone_placer", player_name) - meta:set_string("infotext", name.."\nOwned by"..player_name) + meta:set_string("infotext", name.."\n"..S("Owned by ")..player_name) end, on_blast = on_blast, allow_metadata_inventory_put = allow_metadata_inventory_put, @@ -273,35 +255,35 @@ if exchangeclone.mcl then chest = "mcl_chests:chest" end -exchangeclone.register_energy_collector("exchangeclone:energy_collector_mk1", "Energy Collector MK1", 4, "", { +exchangeclone.register_energy_collector("exchangeclone:energy_collector_mk1", S("Energy Collector MK1"), 4, "", { {glass, glass, glass}, {"exchangeclone:exchange_orb", chest, "exchangeclone:exchange_orb"}, {iron, iron, iron} } ) -exchangeclone.register_energy_collector("exchangeclone:energy_collector_mk2", "Energy Collector MK2", 12, "^[multiply:#555555", { +exchangeclone.register_energy_collector("exchangeclone:energy_collector_mk2", S("Energy Collector MK2"), 12, "^[multiply:#555555", { {iron, iron, iron}, {"exchangeclone:energy_collector_mk1", "exchangeclone:energy_collector_mk1", "exchangeclone:energy_collector_mk1"}, {iron, iron, iron} } ) -exchangeclone.register_energy_collector("exchangeclone:energy_collector_mk3", "Energy Collector MK3", 40, "^[multiply:#770000", { +exchangeclone.register_energy_collector("exchangeclone:energy_collector_mk3", S("Energy Collector MK3"), 40, "^[multiply:#770000", { {iron, iron, iron}, {"exchangeclone:energy_collector_mk2", "exchangeclone:energy_collector_mk2", "exchangeclone:energy_collector_mk2"}, {iron, iron, iron} } ) -exchangeclone.register_energy_collector("exchangeclone:energy_collector_mk4", "Energy Collector MK4", 160, "^[multiply:#007700", { +exchangeclone.register_energy_collector("exchangeclone:energy_collector_mk4", S("Energy Collector MK4"), 160, "^[multiply:#007700", { {iron, iron, iron}, {"exchangeclone:energy_collector_mk3", "exchangeclone:energy_collector_mk3", "exchangeclone:energy_collector_mk3"}, {iron, iron, iron} } ) -exchangeclone.register_energy_collector("exchangeclone:energy_collector_mk5", "Energy Collector MK5", 640, "^[multiply:#000077", { +exchangeclone.register_energy_collector("exchangeclone:energy_collector_mk5", S("Energy Collector MK5"), 640, "^[multiply:#000077", { {iron, iron, iron}, {"exchangeclone:energy_collector_mk4", "exchangeclone:energy_collector_mk4", "exchangeclone:energy_collector_mk4"}, {iron, iron, iron} diff --git a/exchangeclone/furnaces.lua b/exchangeclone/furnaces.lua index 71afd87..5fc2fa5 100644 --- a/exchangeclone/furnaces.lua +++ b/exchangeclone/furnaces.lua @@ -1,4 +1,7 @@ +local S = minetest.get_translator() + -- Everything with the exchangeclone_ore group is also included (see pickaxes.lua) +-- This is pretty much the one thing I can't really figure out how to automate. local ores = { ["mcl_raw_ores:raw_gold"] = true, ["mcl_raw_ores:raw_iron"] = true, @@ -31,7 +34,7 @@ end local LIGHT_ACTIVE_FURNACE = 13 ---90% of the code is copied from MineClone's blast furnaces. +-- Modified from MineClone's blast furnaces. -- -- Formspecs @@ -43,7 +46,7 @@ local base_formspec = --"image_button[8,0;1,1;craftguide_book.png;craftguide;]".. --"tooltip[craftguide;"..minetest.formspec_escape("Recipe book").."]".. "size[10,8.75]".. - "label[0,4;Inventory]".. + "label[0,4;"..S("Inventory").."]".. exchangeclone.inventory_formspec(0,4.5).. "list[context;src;2.9,0.5;1,1]".. "list[context;fuel;2.9,2.5;1,1;]".. @@ -64,12 +67,12 @@ if exchangeclone.mcl then mcl_formspec.get_itemslot_bg(5.75,1.5,1,1) end -local function inactive_formspec(type) - local num_columns = (type == "Dark" and 2) or 3 +local function inactive_formspec(matter_type) + local num_columns = (matter_type == "Dark" and 2) or 3 local result = base_formspec.. "list[context;src;0,0.5;"..tostring(num_columns)..",3;1]".. "list[context;dst;7,0.5;"..tostring(num_columns)..",3;1]".. - "label[2.9,0;"..type.." Matter Furnace]".. + "label[2.9,0;"..S("@1 Matter Furnace", S(matter_type)).."]".. "image[2.9,1.5;1,1;default_furnace_fire_bg.png]".. "image[4.1,1.5;1.5,1;gui_furnace_arrow_bg.png^[transformR270]" if exchangeclone.mcl then @@ -80,16 +83,16 @@ local function inactive_formspec(type) return result end -local function active_formspec(fuel_percent, item_percent, type) - local num_columns = (type == "Dark" and 2) or 3 +local function active_formspec(fuel_percent, item_percent, matter_type) + local num_columns = (matter_type == "Dark" and 2) or 3 local result = base_formspec.. "image[2.9,1.5;1,1;default_furnace_fire_bg.png^[lowpart:".. (100-fuel_percent)..":default_furnace_fire_fg.png]".. "list[context;src;0,0.5;"..tostring(num_columns)..",3;1]".. "list[context;dst;7,0.5;"..tostring(num_columns)..",3;1]".. + "label[2.9,0;"..S("@1 Matter Furnace", S(matter_type)).."]".. "image[4.1,1.5;1.5,1;gui_furnace_arrow_bg.png^[lowpart:".. - (item_percent)..":gui_furnace_arrow_fg.png^[transformR270]".. - "label[2.9,0;"..type.." Matter Furnace]" + (item_percent)..":gui_furnace_arrow_fg.png^[transformR270]" if exchangeclone.mcl then result = result.. mcl_formspec.get_itemslot_bg(0,0.5,num_columns,3).. @@ -321,10 +324,10 @@ local function furnace_node_timer(pos, elapsed) local using_collector = meta:get_int("using_collector") > 0 - local type = "Dark" + local matter_type = "Dark" local speed = 22 -- /10 to get items/second if minetest.get_node(pos).name:find("red_matter") then - type = "Red" + matter_type = "Red" speed = 66 end @@ -400,7 +403,7 @@ local function furnace_node_timer(pos, elapsed) if src_time >= cooked.time then local count = cooked.item:get_count() if is_ore(srclist[1]:get_name()) and (count * 2 <= cooked.item:get_stack_max()) then - if type == "Red" or (type == "Dark" and math.random(1,2) == 1) then + if matter_type == "Red" or (matter_type == "Dark" and math.random(1,2) == 1) then cooked.item:set_count(count*2) end end @@ -428,7 +431,7 @@ local function furnace_node_timer(pos, elapsed) -- -- Update formspec and node -- - local formspec = inactive_formspec(type) + local formspec = inactive_formspec(matter_type) local item_percent = 0 if cookable then item_percent = math.floor(src_time / cooked.time * 100) @@ -441,12 +444,12 @@ local function furnace_node_timer(pos, elapsed) if fuel_totaltime > 0 then fuel_percent = math.floor(fuel_time / fuel_totaltime * 100) end - formspec = active_formspec(fuel_percent, item_percent, type) - swap_node(pos, "exchangeclone:"..type:lower().."_matter_furnace_active") + formspec = active_formspec(fuel_percent, item_percent, matter_type) + swap_node(pos, "exchangeclone:"..matter_type:lower().."_matter_furnace_active") -- make sure timer restarts automatically result = true else - swap_node(pos, "exchangeclone:"..type:lower().."_matter_furnace") + swap_node(pos, "exchangeclone:"..matter_type:lower().."_matter_furnace") -- stop timer on the inactive furnace minetest.get_node_timer(pos):stop() end @@ -483,7 +486,7 @@ if minetest.get_modpath("screwdriver") then end local inactive_def = { - description = "Dark Matter Furnace", + description = S("Dark Matter Furnace"), tiles = { "exchangeclone_dark_matter_block.png", "exchangeclone_dark_matter_block.png", @@ -570,7 +573,7 @@ local inactive_def = { } local active_def = { - description = "Active Dark Matter Furnace", + description = S("Active Dark Matter Furnace"), tiles = { "exchangeclone_dark_matter_block.png", "exchangeclone_dark_matter_block.png", @@ -580,7 +583,7 @@ local active_def = { "exchangeclone_dark_matter_furnace.png", }, paramtype2 = "facedir", - paramtype = "light", + parammatter_type = "light", light_source = LIGHT_ACTIVE_FURNACE, drop = "exchangeclone:dark_matter_furnace", groups = {pickaxey=5, not_in_creative_inventory = 1, container = 4, material_stone=1, cracky = 3, level = get_level(4), exchangeclone_furnace = 1}, @@ -641,7 +644,7 @@ minetest.register_node("exchangeclone:dark_matter_furnace_active", table.copy(ac minetest.register_node("exchangeclone:red_matter_furnace_active", table.copy(active_def)) minetest.override_item("exchangeclone:red_matter_furnace", { - description = "Red Matter Furnace", + description = S("Red Matter Furnace"), tiles = { "exchangeclone_red_matter_block.png", "exchangeclone_red_matter_block.png", @@ -713,7 +716,7 @@ minetest.override_item("exchangeclone:red_matter_furnace", { }) minetest.override_item("exchangeclone:red_matter_furnace_active", { - description = "Active Red Matter Furnace", + description = S("Active Red Matter Furnace"), tiles = { "exchangeclone_red_matter_block.png", "exchangeclone_red_matter_block.png", diff --git a/exchangeclone/hammers.lua b/exchangeclone/hammers.lua index 384cec5..3b852ba 100644 --- a/exchangeclone/hammers.lua +++ b/exchangeclone/hammers.lua @@ -1,26 +1,25 @@ +local S = minetest.get_translator() + local stone_group = "cracky" if exchangeclone.mcl then stone_group = "pickaxey" end exchangeclone.hammer_action = { - start_action = function(player, center, range) + start_action = function(player, center, range, itemstack) if exchangeclone.check_cooldown(player, "hammer") then return end local data = {} exchangeclone.multidig[player:get_player_name()] = true -- to prevent doing 3x3 as well as AOE exchangeclone.play_ability_sound(player) - data.player_energy = exchangeclone.get_player_energy(player) - data.energy_cost = 0 + data.itemstack = itemstack return data end, action = function(player, pos, node, data) - if data.energy_cost + 8 > data.player_energy then return end if minetest.get_item_group(node.name, stone_group) ~= 0 then if minetest.is_protected(pos, player:get_player_name()) then minetest.record_protection_violation(pos, player:get_player_name()) else - data.energy_cost = data.energy_cost + 8 - local drops = minetest.get_node_drops(node.name, "exchangeclone:red_matter_hammer") + local drops = minetest.get_node_drops(node.name, data.itemstack) exchangeclone.drop_items_on_player(pos, drops, player) minetest.set_node(pos, {name = "air"}) end @@ -28,7 +27,6 @@ exchangeclone.hammer_action = { return data end, end_action = function(player, center, range, data) - exchangeclone.set_player_energy(player, data.player_energy - data.energy_cost) exchangeclone.multidig[player:get_player_name()] = nil exchangeclone.start_cooldown(player, "hammer", range/2) -- The hammer has by far the most lag potential and therefore a long cooldown. end @@ -52,10 +50,10 @@ local function hammer_on_place(itemstack, player, pointed_thing) local current_name = itemstack:get_name() if string.sub(current_name, -4, -1) == "_3x3" then itemstack:set_name(string.sub(current_name, 1, -5)) - minetest.chat_send_player(player:get_player_name(), "Single node mode") + minetest.chat_send_player(player:get_player_name(), S("Single node mode")) else itemstack:set_name(current_name.."_3x3") - minetest.chat_send_player(player:get_player_name(), "3x3 mode") + minetest.chat_send_player(player:get_player_name(), S("3x3 mode")) end return itemstack end @@ -65,11 +63,11 @@ local function hammer_on_place(itemstack, player, pointed_thing) if pointed_thing.type == "node" then center = pointed_thing.under end - exchangeclone.node_radius_action(player, center, range, exchangeclone.hammer_action) + exchangeclone.node_radius_action(player, center, range, exchangeclone.hammer_action, itemstack) end minetest.register_tool("exchangeclone:dark_matter_hammer", { - description = "Dark Matter Hammer", + description = S("Dark Matter Hammer").."\n"..S("Single node mode"), wield_image = "exchangeclone_dark_matter_hammer.png", inventory_image = "exchangeclone_dark_matter_hammer.png", groups = { tool=1, hammer=1, dig_speed_class=7, enchantability=0, dark_matter_hammer = 1, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1}, @@ -94,7 +92,7 @@ minetest.register_tool("exchangeclone:dark_matter_hammer", { }) minetest.register_tool("exchangeclone:dark_matter_hammer_3x3", { - description = "Dark Matter Hammer", + description = S("Dark Matter Hammer").."\n"..S("3x3 mode"), wield_image = "exchangeclone_dark_matter_hammer.png", inventory_image = "exchangeclone_dark_matter_hammer.png", groups = { tool=1, hammer=1, dig_speed_class=7, enchantability=0, dark_matter_hammer = 1, not_in_creative_inventory = 1, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1}, @@ -118,8 +116,10 @@ minetest.register_tool("exchangeclone:dark_matter_hammer_3x3", { on_secondary_use = hammer_on_place, }) +exchangeclone.register_energy_alias("exchangeclone:dark_matter_hammer", "exchangeclone:dark_matter_hammer_3x3") + minetest.register_tool("exchangeclone:red_matter_hammer", { - description = "Red Matter Hammer", + description = S("Red Matter Hammer").."\n"..S("Single node mode"), wield_image = "exchangeclone_red_matter_hammer.png", inventory_image = "exchangeclone_red_matter_hammer.png", groups = { tool=1, hammer=1, dig_speed_class=7, enchantability=0, red_matter_hammer = 1, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1}, @@ -144,7 +144,7 @@ minetest.register_tool("exchangeclone:red_matter_hammer", { }) minetest.register_tool("exchangeclone:red_matter_hammer_3x3", { - description = "Red Matter Hammer", + description = S("Red Matter Hammer\n3x3 mode"), wield_image = "exchangeclone_red_matter_hammer.png", inventory_image = "exchangeclone_red_matter_hammer.png", groups = { tool=1, hammer=1, dig_speed_class=7, enchantability=0, red_matter_hammer = 1, not_in_creative_inventory = 1, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1}, @@ -168,6 +168,8 @@ minetest.register_tool("exchangeclone:red_matter_hammer_3x3", { on_secondary_use = hammer_on_place, }) +exchangeclone.register_energy_alias("exchangeclone:red_matter_hammer", "exchangeclone:red_matter_hammer_3x3") + minetest.register_craft({ output = "exchangeclone:dark_matter_hammer", recipe = { diff --git a/exchangeclone/hoes.lua b/exchangeclone/hoes.lua index 902e75e..b93fa65 100644 --- a/exchangeclone/hoes.lua +++ b/exchangeclone/hoes.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator() + local function create_soil(itemstack, player, pointed_thing) if not pointed_thing.under then return end if not pointed_thing.under.x then return end @@ -30,7 +32,11 @@ local hoe_function if exchangeclone.mcl then hoe_function = create_soil else - hoe_function = farming.hoe_on_use -- assuming farming exists + if farming then + hoe_function = farming.hoe_on_use + else + hoe_function = function(...) end + end end exchangeclone.hoe_action = { @@ -40,27 +46,22 @@ exchangeclone.hoe_action = { if range > 0 then exchangeclone.play_ability_sound(player) end - data.player_energy = exchangeclone.get_player_energy(player) - data.energy_cost = 0 data.itemstack = itemstack return data end, action = function(player, pos, node, data) local new_pointed_thing = {type = "node", under = pos, above = {x=pos.x,y=pos.y+1,z=pos.z}} - data.energy_cost = data.energy_cost + 4 hoe_function(data.itemstack, player, new_pointed_thing) return data end, end_action = function(player, center, range, data) if range > 0 then - exchangeclone.set_player_energy(player, data.player_energy - data.energy_cost) exchangeclone.start_cooldown(player, "hoe", range/4) end end } local hoe_on_place = function(itemstack, player, pointed_thing) - local click_test = exchangeclone.check_on_rightclick(itemstack, player, pointed_thing) if click_test ~= false then return click_test @@ -78,10 +79,10 @@ local hoe_on_place = function(itemstack, player, pointed_thing) local current_name = itemstack:get_name() if string.sub(current_name, -4, -1) == "_3x3" then itemstack:set_name(string.sub(current_name, 1, -5)) - minetest.chat_send_player(player:get_player_name(), "Single node mode") + minetest.chat_send_player(player:get_player_name(), S("Single node mode")) else itemstack:set_name(current_name.."_3x3") - minetest.chat_send_player(player:get_player_name(), "3x3 mode") + minetest.chat_send_player(player:get_player_name(), S("3x3 mode")) end return itemstack end @@ -109,7 +110,7 @@ for name, def in pairs(minetest.registered_nodes) do end local hoe_def = { - description = "Dark Matter Hoe", + description = S("Dark Matter Hammer").."\n"..S("Single node mode"), wield_image = "exchangeclone_dark_matter_hoe.png", inventory_image = "exchangeclone_dark_matter_hoe.png", wield_scale = exchangeclone.wield_scale, @@ -133,13 +134,16 @@ local hoe_def = { minetest.register_tool("exchangeclone:dark_matter_hoe", table.copy(hoe_def)) local hoe_3x3_def = table.copy(hoe_def) +hoe_3x3_def.description = S("Dark Matter Hammer").."\n"..S("3x3 mode") hoe_3x3_def.groups.not_in_creative_inventory = 1 hoe_3x3_def.tool_capabilities.groupcaps.exchangeclone_dirt.times = {[1]=0.4, [2]=0.4, [3]=0.4} hoe_3x3_def._mcl_diggroups.exchangeclone_dirt = { speed = 8, level = 7, uses = 0 } minetest.register_tool("exchangeclone:dark_matter_hoe_3x3", table.copy(hoe_3x3_def)) -hoe_def.description = "Red Matter Hoe" +exchangeclone.register_energy_alias("exchangeclone:dark_matter_hoe", "exchangeclone:dark_matter_hoe_3x3") + +hoe_def.description = S("Red Matter Hammer").."\n"..S("Single node mode") hoe_def.wield_image = "exchangeclone_red_matter_hoe.png" hoe_def.inventory_image = "exchangeclone_red_matter_hoe.png" hoe_def.groups = { tool=1, hoe=1, enchantability=0, red_matter_hoe = 1, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1} @@ -158,12 +162,15 @@ hoe_def._mcl_diggroups = { minetest.register_tool("exchangeclone:red_matter_hoe", table.copy(hoe_def)) hoe_3x3_def = table.copy(hoe_def) +hoe_3x3_def.description = S("Red Matter Hammer").."\n"..S("3x3 mode") hoe_3x3_def.groups.not_in_creative_inventory = 1 hoe_3x3_def.tool_capabilities.groupcaps.exchangeclone_dirt.times = {[1]=0.25, [2]=0.25, [3]=0.25} hoe_3x3_def._mcl_diggroups.exchangeclone_dirt = { speed = 9, level = 8, uses = 0 } minetest.register_tool("exchangeclone:red_matter_hoe_3x3", table.copy(hoe_3x3_def)) +exchangeclone.register_energy_alias("exchangeclone:red_matter_hoe", "exchangeclone:red_matter_hoe_3x3") + minetest.register_craft({ output = "exchangeclone:dark_matter_hoe", recipe = { diff --git a/exchangeclone/infinite_food.lua b/exchangeclone/infinite_food.lua index d2fae86..6fe60cd 100644 --- a/exchangeclone/infinite_food.lua +++ b/exchangeclone/infinite_food.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator() + local function infinite_food_function(itemstack, player, pointed_thing) local click_test = exchangeclone.check_on_rightclick(itemstack, player, pointed_thing) local original = ItemStack(itemstack) @@ -13,7 +15,7 @@ local function infinite_food_function(itemstack, player, pointed_thing) end minetest.register_tool("exchangeclone:infinite_food", { - description = "Infinite Food\nConsumes 64 energy when eaten", + description = S("Infinite Food").."\n"..S("Consumes 64 energy when eaten"), groups = { food = 2, eatable = 8, disable_repair = 1, fire_immune = 1}, on_place = infinite_food_function, on_secondary_use = infinite_food_function, diff --git a/exchangeclone/init.lua b/exchangeclone/init.lua index 53efd1c..b2c7db3 100644 --- a/exchangeclone/init.lua +++ b/exchangeclone/init.lua @@ -7,6 +7,7 @@ if (not minetest.get_modpath("mcl_core")) and (not minetest.get_modpath("default else exchangeclone.mcl = minetest.get_modpath("mcl_core") end + exchangeclone.mineclonia = minetest.get_game_info().id == "mineclonia" -- if exchangeclone.mineclonia, exchangeclone.mcl is also defined. @@ -17,6 +18,8 @@ local modpath = minetest.get_modpath("exchangeclone") exchangeclone.orb_max = minetest.settings:get("exchangeclone.orb_max") or 51200000 exchangeclone.num_passes = minetest.settings:get("exchangeclone.num_passes") or 10 +minetest.log("action", "Loading Exchangeclone") + dofile(modpath.."/lib.lua") dofile(modpath.."/constructor.lua") dofile(modpath.."/deconstructor.lua") @@ -39,11 +42,13 @@ dofile(modpath.."/pickaxes.lua") dofile(modpath.."/hammers.lua") dofile(modpath.."/shovels.lua") dofile(modpath.."/red_matter_multitools.lua") +dofile(modpath.."/covalence_dust.lua") if minetest.get_modpath("hopper") then dofile(modpath.."/hopper_compat.lua") end dofile(modpath.."/philosophers_stone.lua") dofile(modpath.."/pesa.lua") dofile(modpath.."/infinite_food.lua") +dofile(modpath.."/alchemical_chests.lua") dofile(modpath.."/transmutation_table.lua") dofile(modpath.."/furnaces.lua") \ No newline at end of file diff --git a/exchangeclone/lib.lua b/exchangeclone/lib.lua index e460c49..bebe0e4 100644 --- a/exchangeclone/lib.lua +++ b/exchangeclone/lib.lua @@ -1,7 +1,21 @@ --- Just a collection of a whole bunch of functions used here. There's very little order. +-- A ton of functions with approximately zero organization. At least there are comments now. --- Don't know if this even works. -function exchangeclone.get_inventory_drops(pos, inventory, drops) --removes default dependency +local S = minetest.get_translator() + +-- Rounds to the nearest integer +function exchangeclone.round(num) + if num % 1 < 0.5 then + return math.floor(num) + else + return math.ceil(num) + end +end + +-- Decides what mod to use for sounds +if exchangeclone.mcl then exchangeclone.sound_mod = mcl_sounds else exchangeclone.sound_mod = default end + +-- Don't think this even works correctly. +function exchangeclone.get_inventory_drops(pos, inventory, drops) local inv = minetest.get_meta(pos):get_inventory() local n = #drops for i = 1, inv:get_size(inventory) do @@ -37,9 +51,12 @@ function exchangeclone.get_item_energy(item) end -- handle items/itemstacks item = ItemStack(item) + if item == ItemStack("") then return end + item:set_name(exchangeclone.handle_alias(item)) local meta_energy_value = tonumber(item:get_meta():get_string("exchangeclone_energy_value")) - if meta_energy_value and meta_energy_value > 0 then - return meta_energy_value + if meta_energy_value then + if meta_energy_value < 0 then return 0 end + if meta_energy_value > 0 then return meta_energy_value end end local def = minetest.registered_items[item:get_name()] if not def then return end @@ -53,15 +70,6 @@ function exchangeclone.get_item_energy(item) end end --- Rounds to the nearest integer -function exchangeclone.round(num) - if num % 1 < 0.5 then - return math.floor(num) - else - return math.ceil(num) - end -end - -- https://forum.unity.com/threads/re-map-a-number-from-one-range-to-another.119437/ -- Remaps a number from one range to another function exchangeclone.map(input, min1, max1, min2, max2) @@ -84,14 +92,11 @@ function exchangeclone.get_orb_energy(inventory, listname, index) return exchangeclone.get_orb_itemstack_energy(itemstack) end --- Decides what mod to use for sounds -if exchangeclone.mcl then exchangeclone.sound_mod = mcl_sounds else exchangeclone.sound_mod = default end - function exchangeclone.set_orb_itemstack_energy(itemstack, amount) - if not itemstack or not amount then return minetest.log(">:(") end - if itemstack:get_name() ~= "exchangeclone:exchange_orb" then minetest.log(":O") return end + if not itemstack or not amount then return end + if itemstack:get_name() ~= "exchangeclone:exchange_orb" then return end local old_energy = exchangeclone.get_orb_itemstack_energy(itemstack) - if amount > old_energy and old_energy > exchangeclone.orb_max then minetest.log(":(") return end -- don't allow more energy to be put into an over-filled orb + if amount > old_energy and old_energy > exchangeclone.orb_max then return end -- don't allow more energy to be put into an over-filled orb -- Square roots will hopefully make it less linear -- And if they don't, I don't really care and I don't want to think about math anymore. @@ -115,10 +120,9 @@ function exchangeclone.set_orb_itemstack_energy(itemstack, amount) end local colorstring = minetest.rgba(r,g,b) - minetest.log(colorstring) local meta = itemstack:get_meta() meta:set_float("stored_energy", amount) - meta:set_string("description", "Exchange Orb\nCurrent Charge: "..amount) + meta:set_string("description", S("Exchange Orb").."\n"..S("Current Charge: @1", exchangeclone.format_number(amount))) meta:set_string("color", colorstring) return itemstack end @@ -130,7 +134,7 @@ function exchangeclone.set_orb_energy(inventory, listname, index, amount) if not index then index = 1 end local itemstack = inventory:get_stack(listname, index) local new_stack = exchangeclone.set_orb_itemstack_energy(itemstack, amount) - if not new_stack then minetest.log("D:") return end + if not new_stack then return end inventory:set_stack(listname, index, new_stack) end @@ -139,7 +143,7 @@ local hud_elements = {} function exchangeclone.update_hud(player) local hud_text = hud_elements[player:get_player_name()] - player:hud_change(hud_text, "text", "Personal Energy: "..tostring(exchangeclone.get_player_energy(player))) + player:hud_change(hud_text, "text", S("Personal Energy: @1", exchangeclone.format_number(exchangeclone.get_player_energy(player)))) end minetest.register_on_joinplayer(function(player, last_login) @@ -147,7 +151,7 @@ minetest.register_on_joinplayer(function(player, last_login) hud_elem_type = "text", position = {x = 1, y = 1}, offset = {x = 0, y = 0}, - text = "Personal Energy: 0", + text = S("Personal Energy: @1", 0), alignment = {x = -1, y = -1}, scale = {x = 100, y = 100}, number = 0xDDDDDD @@ -159,17 +163,6 @@ minetest.register_on_leaveplayer(function(player, timed_out) hud_elements[player:get_player_name()] = nil end) --- Go from old integer energy to fancy new string energy -minetest.register_on_joinplayer(function(player, last_login) - local meta = player:get_meta() - local energy = meta:get_int("exchangeclone_stored_energy") or 0 - if energy > 0 then - -- Not sure at all whether this is necessary - meta:set_int("exchangeclone_stored_energy", 0) - meta:set_string("exchangeclone_stored_energy", tonumber(energy)) - end -end) - -- Get a player's personal energy function exchangeclone.get_player_energy(player) return tonumber(player:get_meta():get_string("exchangeclone_stored_energy")) or 0 @@ -189,32 +182,27 @@ function exchangeclone.add_player_energy(player, amount) exchangeclone.set_player_energy(exchangeclone.get_player_energy(player) + amount) end --- copied from http://lua-users.org/wiki/IntegerDomain --- Basically gets the highest number Lua supports +-- Through trial and error, I have found that this number (1 trillion) works the best. +-- When a player has any more energy (as in ANY more), precision-based exploits such as creating infinite glass panes are possible. +-- I temporarily considered finding some Lua library that allowed for arbitrary precision (and therefore infinite masimum energy) +-- but I decided not to. +exchangeclone.limit = 1000000000000 --- get highest power of 2 which Lua can still handle as integer -local step = 2 -while true do - local nextstep = step*2 - if nextstep - (nextstep-1) == 1 and nextstep > 0 then - step = nextstep - else - break - end -end +-- From https://stackoverflow.com/questions/10989788/format-integer-in-lua +-- Formats an integer with commas, accounting for decimal points. +function exchangeclone.format_number(number) + -- Quit if not a number + if not tonumber(tostring(number)) then return tostring(number) end --- now get the highest number which Lua can still handle as integer -exchangeclone.limit, step = step, math.floor(step/2) -while step > 0 do - local nextlimit = exchangeclone.limit + step - if nextlimit - (nextlimit-1) == 1 and nextlimit > 0 then - exchangeclone.limit = nextlimit - end - step = math.floor(step/2) -end - -exchangeclone.limit = exchangeclone.limit/100 -- (to account for .25) + local _, _, minus, int, fraction = tostring(number):find('([-]?)(%d+)([.]?%d*)') + -- reverse the int-string and append a comma to all blocks of 3 digits + int = int:reverse():gsub("(%d%d%d)", "%1,") + -- reverse the int-string back remove an optional comma and put the + -- optional minus and fractional part back + return minus .. int:reverse():gsub("^,", "") .. fraction + end + -- Splits a string into a table using a delimiter (copied from somewhere, I don't remember) function exchangeclone.split (input, sep) if sep == nil then sep = "%s" @@ -316,7 +304,7 @@ function exchangeclone.range_update(itemstack, player, max) range = range + 1 end end - minetest.chat_send_player(player:get_player_name(), "Current Range: "..range) + minetest.chat_send_player(player:get_player_name(), S("Current Range: @1", range)) itemstack:get_meta():set_int("exchangeclone_item_range", range) return itemstack end @@ -327,9 +315,9 @@ if exchangeclone.mcl then exchangeclone.wield_scale = mcl_vars.tool_wield_scale end -exchangeclone.wield_scale = vector.multiply(exchangeclone.wield_scale, 1.4) +exchangeclone.wield_scale = vector.multiply(exchangeclone.wield_scale, 1.3) --- Itemstrings for various items +-- Itemstrings for various items used in crafting recipes. exchangeclone.itemstrings = { cobble = exchangeclone.mcl and "mcl_core:cobble" or "default:cobble", redstoneworth = exchangeclone.mcl and "mesecons:redstone" or "default:obsidian", @@ -341,22 +329,45 @@ exchangeclone.itemstrings = { diamond = exchangeclone.mcl and "mcl_core:diamond" or "default:diamond", } +exchangeclone.energy_aliases = {} + +-- will be treated as in Deconstructors, Constructors, Transmutation Table(t)s, etc. +-- When you put into a TT, you will learn instead. +function exchangeclone.register_energy_alias_force(alias, itemstring) + exchangeclone.energy_aliases[itemstring] = alias +end + +function exchangeclone.register_energy_alias(alias, itemstring) + if not exchangeclone.energy_aliases[alias] then + exchangeclone.register_energy_alias_force(alias, itemstring) + end +end + +-- Returns the correct itemstring, handling aliases. +function exchangeclone.handle_alias(item) + item = ItemStack(item) + if not item:is_empty() then + local de_aliased = exchangeclone.energy_aliases[item:get_name()] or item:get_name() + return ItemStack(de_aliased):get_name() -- Not at all sure if this is necessary to resolve MT aliases + end +end + -- Returns a player's inventory formspec with the correct width and hotbar position for the current game function exchangeclone.inventory_formspec(x,y) local formspec if exchangeclone.mcl then - formspec = "list[current_player;main;"..tostring(x)..","..tostring(y)..";9,3;9]".. + formspec = "list[current_player;main;"..x..","..y..";9,3;9]".. mcl_formspec.get_itemslot_bg(x,y,9,3).. - "list[current_player;main;"..tostring(x)..","..tostring(y+3.25)..";9,1]".. + "list[current_player;main;"..x..","..(y+3.25)..";9,1]".. mcl_formspec.get_itemslot_bg(x,y+3.25,9,1) else - formspec = "list[current_player;main;"..tostring(x)..","..tostring(y)..";8,1]".. - "list[current_player;main;"..tostring(x)..","..tostring(y+1.25)..";8,3;8]" + formspec = "list[current_player;main;"..x..","..y..";8,1]".. + "list[current_player;main;"..x..","..(y+1.25)..";8,3;8]" end return formspec end --- Modified from MineClone2 { +-- Modified from MineClone2, basically helps drop items on the player { local doTileDrops = minetest.settings:get_bool("mcl_doTileDrops", true) local function get_fortune_drops(fortune_drops, fortune_level) @@ -398,7 +409,8 @@ local function get_drops(drop, toolname, param2, paramtype2) return drops end -function exchangeclone.drop_items_on_player(pos, drops, player) --copied from MineClone's code +-- This function gets the drops from a node and drops them at the player's position +function exchangeclone.drop_items_on_player(pos, drops, player) -- modified from MineClone's code if not exchangeclone.mcl then return minetest.handle_node_drops(pos, drops, player) end @@ -440,7 +452,7 @@ function exchangeclone.drop_items_on_player(pos, drops, player) --copied from Mi * table: Drop every itemstring in this table when dug by shears _mcl_silk_touch_drop ]] - local enchantments = tool and mcl_enchanting.get_enchantments(tool) +local enchantments = tool and mcl_enchanting.get_enchantments(tool) local silk_touch_drop = false local nodedef = minetest.registered_nodes[dug_node.name] @@ -538,6 +550,7 @@ function exchangeclone.get_face_direction(player) end -- Execute an action for every node within a cubic radius +-- extra_info is usually used for the tool's itemstack. function exchangeclone.node_radius_action(player, center, range, functions, extra_info) if not functions.action then return end local data diff --git a/exchangeclone/mod.conf b/exchangeclone/mod.conf index d6afaff..d120dc8 100644 --- a/exchangeclone/mod.conf +++ b/exchangeclone/mod.conf @@ -2,6 +2,5 @@ name = exchangeclone title = ExchangeClone description = The main part of the modpack (depends on both the other mods) min_minetest_version = 5.5 -#depends = item_tracking -optional_depends = 3d_armor, mcl_item_id, mcl_core, default, moreswords, mcl_stairs, meat_blocks, sticky_things, fake_liquids, sound_machine, stairs, mcl_dispensers, farming, mobs_mc, screwdriver +optional_depends = mcl_core, default, 3d_armor, mcl_item_id, moreswords, hopper, pipeworks author = ThePython10110 \ No newline at end of file diff --git a/exchangeclone/orb.lua b/exchangeclone/orb.lua index abf5b45..de60904 100644 --- a/exchangeclone/orb.lua +++ b/exchangeclone/orb.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator() + local function read_orb_charge(itemstack, player, pointed_thing) local click_test = exchangeclone.check_on_rightclick(itemstack, player, pointed_thing) if click_test ~= false then @@ -5,14 +7,13 @@ local function read_orb_charge(itemstack, player, pointed_thing) end local stored = exchangeclone.get_orb_itemstack_energy(itemstack) - minetest.chat_send_player(player:get_player_name(), "Current Charge: "..stored) + minetest.chat_send_player(player:get_player_name(), S("Current Charge: @1", stored)) return itemstack end minetest.register_tool("exchangeclone:exchange_orb", { - description = "Exchange Orb\nCurrent Charge: 0", + description = S("Exchange Orb").."\n"..S("Current Charge: @1", 0), inventory_image = "exchangeclone_exchange_orb.png", - energy_value = 33792, color = "#000000", on_secondary_use = read_orb_charge, on_place = read_orb_charge, @@ -38,8 +39,8 @@ minetest.register_craft({ }, replacements = {{"exchangeclone:philosophers_stone", "exchangeclone:philosophers_stone"}} }) -minetest.register_craft({ --Making it fuel so hopper will work with constructor better +minetest.register_craft({ -- Making it fuel so MineClone hoppers will work with (de)constructors type = "fuel", recipe = "exchangeclone:exchange_orb", - burntime = 24000 --Basically 30 coal blocks... it should be worth it. + burntime = 24000 --Basically 30 coal blocks... }) \ No newline at end of file diff --git a/exchangeclone/pesa.lua b/exchangeclone/pesa.lua index 3e0d7a5..f7bf14b 100644 --- a/exchangeclone/pesa.lua +++ b/exchangeclone/pesa.lua @@ -1,6 +1,8 @@ -- Personal Energy Storage Accessor (PESA) -- Deprecated now that personal energy exists. +-- Not bothering to add translation stuff. + local formspec if not exchangeclone.mcl then formspec = { diff --git a/exchangeclone/philosophers_stone.lua b/exchangeclone/philosophers_stone.lua index f7b214b..50261c2 100644 --- a/exchangeclone/philosophers_stone.lua +++ b/exchangeclone/philosophers_stone.lua @@ -1,7 +1,9 @@ +local S = minetest.get_translator() + local function show_enchanting(player) local player_meta = player:get_meta() player_meta:set_int("mcl_enchanting:num_bookshelves", 8) -- 15 for max enchantments - player_meta:set_string("mcl_enchanting:table_name", "Enchanting Table") + player_meta:set_string("mcl_enchanting:table_name", S("Enchanting Table").." (".. S("Philosopher's Stone")..")") mcl_enchanting.show_enchanting_formspec(player) end @@ -229,6 +231,7 @@ exchangeclone.node_transmutations = { exchangeclone.stone_action = { start_action = function(player, center, range, mode) + -- Yes, I named the cooldown Phil. His last name is Osophersstone. if exchangeclone.check_cooldown(player, "phil") then return end exchangeclone.play_ability_sound(player) return mode @@ -268,8 +271,6 @@ if exchangeclone.mcl then end end - - local function on_right_click(itemstack, player, pointed_thing) local click_test = exchangeclone.check_on_rightclick(itemstack, player, pointed_thing) if click_test ~= false then @@ -291,42 +292,10 @@ local function on_right_click(itemstack, player, pointed_thing) end end -local tt_help = "(Shift)-right-click: transmute nodes. (Shift)-Aux1-right-click: Change range" - -local item1 = "mese crystals" -if exchangeclone.mcl then - item1 = "emeralds" -end - -local longdesc = "A mysterious device discovered by alchemists millenia ago. The crafting recipe was recently rediscovered by ThePython.\n\n".. - "It has the ability to transmute nearby nodes into other nodes. The range can be increased or decreased from 0 to 4 by (shift-)aux1-right-clicking.\n".. - "Transmute nodes by (shift-)right-clicking (holding shift causes a few differences in transmutation). They are changed in a cube centered on ".. - "the node directly below you, with a radius equal to the range.\n".. - "The Philosopher's Stone is also useful in converting various resources, such as turning coal into iron, or gold into "..item1..".\n".. - "See the crafting guide for recipes. The Philosopher's Stone is NEVER used up in crafting recipes (if it is, it's a bug). The transmutation ".. - "range is reset when used in a crafting recipe." - -local usagehelp = "The range can be increased or decreased from 0 to 4 by (shift-)aux1-right-clicking. Transmute nodes by (shift-)right-clicking (holding shift causes a few differences in transmutation). They are changed in a cube centered on ".. - "the node directly below you, with a radius equal to the range.\n\n".. - "The Philosopher's Stone is also useful in converting various resources, such as turning coal into iron, or gold into "..item1..".\n".. - "See the crafting guide for recipes. The Philosopher's Stone is NEVER used up in crafting recipes (if it is, it's a bug). The transmutation ".. - "range is reset when used in a crafting recipe." - -if exchangeclone.mcl then - tt_help = tt_help.."\nClick: crafting table. Shift-click: enchanting table." - local extra_stuff = "\n\nIn MineClone, clicking opens a 3x3 crafting table and shift+clicking opens an enchanting table (the equivalent of a real ".. - "enchanting table with eight bookshelves around it)." - longdesc = longdesc..extra_stuff - usagehelp = usagehelp..extra_stuff -end - minetest.register_tool("exchangeclone:philosophers_stone", { - description = "Philosopher's Stone\nAlways returned when crafting", + description = S("Philosopher's Stone").."\n"..S("Always returned when crafting"), inventory_image = "exchangeclone_philosophers_stone.png", wield_image = "exchangeclone_philosophers_stone.png", - _tt_help = tt_help, - _doc_items_longdesc = longdesc, - _doc_items_usagehelp = usagehelp, exchangeclone_item_range = 0, on_use = on_left_click, on_place = on_right_click, diff --git a/exchangeclone/pickaxes.lua b/exchangeclone/pickaxes.lua index b473aa2..fe50f86 100644 --- a/exchangeclone/pickaxes.lua +++ b/exchangeclone/pickaxes.lua @@ -1,24 +1,23 @@ -function exchangeclone.mine_vein(player, player_energy, start_pos, node_name, pos) - -- Not very efficient, but it SHOULD work. - if not player then return 0 end - if not start_pos then return 0 end +local S = minetest.get_translator() + +function exchangeclone.mine_vein(player, start_pos, node_name, pos, depth) + -- Not very efficient, but it works. + if not player then return end + if not start_pos then return end if not pos then pos = start_pos end + depth = depth or 0 + --minetest.log(dump(pos)) local node = minetest.get_node(pos) if not node_name then node_name = node.name end local distance = vector.distance(pos, start_pos) - if distance > 10 then return 0 end - if player_energy < 8 then return 0 end if node_name == node.name then - local energy_cost = 8 exchangeclone.drop_items_on_player(pos, minetest.get_node_drops(node.name, "exchangeclone:red_matter_pickaxe"), player) minetest.set_node(pos, {name = "air"}) for x = pos.x-1,pos.x+1 do for y = pos.y-1,pos.y+1 do for z = pos.z-1,pos.z+1 do - local cost = exchangeclone.mine_vein(player, player_energy, start_pos, node_name, {x=x,y=y,z=z}) - if cost and cost > 0 then - energy_cost = energy_cost + cost + if depth <= 10 then + exchangeclone.mine_vein(player, start_pos, node_name, {x=x,y=y,z=z}, depth+1) end end end end - return energy_cost end return 0 end @@ -44,17 +43,17 @@ local function pickaxe_on_use(itemstack, player, pointed_thing) if current_mode == "1x1" then itemstack:set_name(current_name.."_3x1") -- set to 3x1 pick meta:set_string("exchangeclone_pick_mode", "tall") - minetest.chat_send_player(player:get_player_name(), "3x1 tall mode") + minetest.chat_send_player(player:get_player_name(), S("3x1 tall mode")) elseif current_mode == "tall" then meta:set_string("exchangeclone_pick_mode", "wide") - minetest.chat_send_player(player:get_player_name(), "3x1 wide mode") + minetest.chat_send_player(player:get_player_name(), S("3x1 wide mode")) elseif current_mode == "wide" then meta:set_string("exchangeclone_pick_mode", "long") - minetest.chat_send_player(player:get_player_name(), "3x1 long mode") + minetest.chat_send_player(player:get_player_name(), S("3x1 long mode")) elseif current_mode == "long" then itemstack:set_name(string.sub(current_name, 1, -5)) -- set to 1x1 pick meta:set_string("exchangeclone_pick_mode", "1x1") - minetest.chat_send_player(player:get_player_name(), "Single node mode") + minetest.chat_send_player(player:get_player_name(), S("Single node mode")) end return itemstack end @@ -62,14 +61,10 @@ local function pickaxe_on_use(itemstack, player, pointed_thing) if pointed_thing.type == "node" then if exchangeclone.check_cooldown(player, "pickaxe") then return itemstack end if (minetest.get_item_group(minetest.get_node(pointed_thing.under).name, "exchangeclone_ore") > 0) then - local player_energy = exchangeclone.get_player_energy(player) exchangeclone.play_ability_sound(player) exchangeclone.multidig[player:get_player_name()] = true - local energy_cost = exchangeclone.mine_vein(player, player_energy, pointed_thing.under) + exchangeclone.mine_vein(player, pointed_thing.under) exchangeclone.multidig[player:get_player_name()] = nil - if energy_cost then - exchangeclone.set_player_energy(player, player_energy - energy_cost) - end elseif itemstack:get_name():find("red") then local player_energy = exchangeclone.get_player_energy(player) torch_on_place(ItemStack(torch_itemstring), player, pointed_thing) @@ -88,6 +83,7 @@ for name, def in pairs(minetest.registered_nodes) do or name:find("andesite_with") or name:find("granite_with") or name:find("tuff_with") + or name:find("mineral_") or (name == "mcl_blackstone:nether_gold") or (name == "mcl_nether:ancient_debris") then local groups = table.copy(def.groups) @@ -97,7 +93,7 @@ for name, def in pairs(minetest.registered_nodes) do end local pick_def = { - description = "Dark Matter Pickaxe", + description = S("Dark Matter Pickaxe").."\n"..S("Single node mode"), wield_image = "exchangeclone_dark_matter_pickaxe.png", inventory_image = "exchangeclone_dark_matter_pickaxe.png", exchangeclone_pick_mode = "1x1", @@ -125,6 +121,7 @@ local pick_def = { minetest.register_tool("exchangeclone:dark_matter_pickaxe", table.copy(pick_def)) local pick_def_3x1 = table.copy(pick_def) +pick_def_3x1.description = S("Dark Matter Pickaxe").."\n"..S("3x1 mode") pick_def_3x1.exchangeclone_pick_mode = "tall" pick_def_3x1.groups.not_in_creative_inventory = 1 pick_def_3x1.tool_capabilities.groupcaps.cracky.times = {[1]=0.45, [2]=0.27, [3]=0.11} @@ -132,7 +129,9 @@ pick_def_3x1._mcl_diggroups.pickaxey.speed = 35 minetest.register_tool("exchangeclone:dark_matter_pickaxe_3x1", table.copy(pick_def_3x1)) -pick_def.description = "Red Matter Pickaxe" +exchangeclone.register_energy_alias("exchangeclone:dark_matter_pickaxe", "exchangeclone:dark_matter_pickaxe_3x1") + +pick_def.description = S("Red Matter Pickaxe").."\n"..S("Single node mode") pick_def.wield_image = "exchangeclone_red_matter_pickaxe.png" pick_def.inventory_image = "exchangeclone_red_matter_pickaxe.png" pick_def.groups.dark_matter_pickaxe = nil @@ -151,7 +150,8 @@ pick_def._mcl_diggroups.pickaxey = { speed = 60, level = 8, uses = 0 } minetest.register_tool("exchangeclone:red_matter_pickaxe", table.copy(pick_def)) -local pick_def_3x1 = table.copy(pick_def) +pick_def_3x1.description = S("Red Matter Pickaxe").."\n"..S("3x1 mode") +pick_def_3x1 = table.copy(pick_def) pick_def_3x1.exchangeclone_pick_mode = "tall" pick_def_3x1.groups.not_in_creative_inventory = 1 pick_def_3x1.tool_capabilities.groupcaps.cracky.times = {[1]=0.32, [2]=0.16, [3]=0.08} @@ -159,6 +159,8 @@ pick_def_3x1._mcl_diggroups.pickaxey.speed = 52 minetest.register_tool("exchangeclone:red_matter_pickaxe_3x1", table.copy(pick_def_3x1)) +exchangeclone.register_energy_alias("exchangeclone:red_matter_pickaxe", "exchangeclone:red_matter_pickaxe_3x1") + minetest.register_craft({ output = "exchangeclone:dark_matter_pickaxe", recipe = { diff --git a/exchangeclone/red_matter_multitools.lua b/exchangeclone/red_matter_multitools.lua index c7c18e6..5264edf 100644 --- a/exchangeclone/red_matter_multitools.lua +++ b/exchangeclone/red_matter_multitools.lua @@ -1,3 +1,5 @@ +local S = minetest.get_translator() + --------------------------------------RED KATAR-------------------------------------- local katar_on_use = function(itemstack, player, pointed_thing) @@ -38,9 +40,9 @@ local katar_on_use = function(itemstack, player, pointed_thing) exchangeclone.node_radius_action(player, center, range, exchangeclone.hoe_action, itemstack) end elseif minetest.get_item_group(node.name, "tree") > 0 then - exchangeclone.node_radius_action(player, center, range, exchangeclone.axe_action) + exchangeclone.node_radius_action(player, center, range, exchangeclone.axe_action, itemstack) elseif minetest.get_item_group(node.name, "shearsy") > 0 or minetest.get_item_group(node.name, "shearsy_cobweb") > 0 then - exchangeclone.node_radius_action(player, center, range, exchangeclone.shear_action) + exchangeclone.node_radius_action(player, center, range, exchangeclone.shear_action, itemstack) end else local damage_all = itemstack:get_meta():get_int("exchangeclone_damage_all") @@ -63,7 +65,7 @@ local katar_on_use = function(itemstack, player, pointed_thing) end local katar_def = { - description = "Red Katar", + description = S("Red Katar").."\n"..S("Single node mode"), wield_image = "exchangeclone_red_katar.png", inventory_image = "exchangeclone_red_katar.png", on_secondary_use = katar_on_use, @@ -95,11 +97,16 @@ local katar_def = { } minetest.register_tool("exchangeclone:red_katar", table.copy(katar_def)) + +katar_def.description = S("Red Katar").."\n"..S("3x3 mode") katar_def.groups.not_in_creative_inventory = 1 katar_def._mcl_diggroups.exchangeclone_dirt = {speed = 8, level = 8, uses = 0} katar_def.tool_capabilities.groupcaps.exchangeclone_dirt = {times={[1]=0.25,[2]=0.25,[3]=0.25}} + minetest.register_tool("exchangeclone:red_katar_3x3", table.copy(katar_def)) +exchangeclone.register_energy_alias("exchangeclone:red_katar", "exchangeclone:red_katar_3x3") + minetest.register_craft({ output = "exchangeclone:red_katar", type = "shapeless", @@ -118,24 +125,21 @@ minetest.register_craft({ --------------------------------------RED MORNINGSTAR-------------------------------------- exchangeclone.morningstar_action = { - start_action = function(player, center, range) + start_action = function(player, center, range, itemstack) if exchangeclone.check_cooldown(player, "shovel") then return end if exchangeclone.check_cooldown(player, "hammer") then return end local data = {} - data.player_energy = exchangeclone.get_player_energy(player) - data.energy_cost = 0 + data.itemstack = itemstack exchangeclone.play_ability_sound(player) return data end, action = function(player, pos, node, data) - if data.energy_cost + 8 > data.player_energy then return end if ((minetest.get_item_group(node.name, "crumbly") > 0) or (minetest.get_item_group(node.name, "shovely") > 0)) or ((minetest.get_item_group(node.name, "cracky") > 0) or (minetest.get_item_group(node.name, "pickaxey") > 0)) then if minetest.is_protected(pos, player:get_player_name()) then minetest.record_protection_violation(pos, player:get_player_name()) else - data.energy_cost = data.energy_cost + 8 - local drops = minetest.get_node_drops(node.name, "exchangeclone:red_morningstar") + local drops = minetest.get_node_drops(node.name, data.itemstack) exchangeclone.drop_items_on_player(pos, drops, player) minetest.set_node(pos, {name = "air"}) end @@ -143,7 +147,6 @@ exchangeclone.morningstar_action = { return data end, end_action = function(player, center, range, data) - exchangeclone.set_player_energy(player, data.player_energy - data.energy_cost) exchangeclone.start_cooldown(player, "shovel", range/4) -- Longish cooldown exchangeclone.start_cooldown(player, "hammer", range/2) end @@ -172,18 +175,14 @@ local function morningstar_on_use(itemstack, player, pointed_thing) if pointed_thing.type == "node" then center = pointed_thing.under if player:get_player_control().sneak then - exchangeclone.node_radius_action(player, center, range, exchangeclone.morningstar_action) + exchangeclone.node_radius_action(player, center, range, exchangeclone.morningstar_action, itemstack) return elseif (minetest.get_item_group(minetest.get_node(pointed_thing.under).name, "exchangeclone_ore") > 0) then if exchangeclone.check_cooldown(player, "pickaxe") then return itemstack end - local player_energy = exchangeclone.get_player_energy(player) exchangeclone.play_ability_sound(player) exchangeclone.multidig[player:get_player_name()] = true - local energy_cost = exchangeclone.mine_vein(player, player_energy, pointed_thing.under) + exchangeclone.mine_vein(player, pointed_thing.under) exchangeclone.multidig[player:get_player_name()] = nil - if energy_cost then - exchangeclone.set_player_energy(player, player_energy - energy_cost) - end exchangeclone.start_cooldown(player, "pickaxe", 0.3) return else @@ -202,30 +201,30 @@ local function morningstar_on_use(itemstack, player, pointed_thing) if current_mode == "1x1" then itemstack:set_name(current_name.."_3x3") -- set to 3x3 pick meta:set_string("exchangeclone_pick_mode", "3x3") - minetest.chat_send_player(player:get_player_name(), "3x3 mode") + minetest.chat_send_player(player:get_player_name(), S("3x3 mode")) elseif current_mode == "3x3" then itemstack:set_name(string.sub(current_name, 1, -5).."_3x1") -- set to 3x1 pick meta:set_string("exchangeclone_pick_mode", "tall") - minetest.chat_send_player(player:get_player_name(), "3x1 tall mode") + minetest.chat_send_player(player:get_player_name(), S("3x1 tall mode")) elseif current_mode == "tall" then meta:set_string("exchangeclone_pick_mode", "wide") - minetest.chat_send_player(player:get_player_name(), "3x1 wide mode") + minetest.chat_send_player(player:get_player_name(), S("3x1 wide mode")) elseif current_mode == "wide" then meta:set_string("exchangeclone_pick_mode", "long") - minetest.chat_send_player(player:get_player_name(), "3x1 long mode") + minetest.chat_send_player(player:get_player_name(), S("3x1 long mode")) elseif current_mode == "long" then itemstack:set_name(string.sub(current_name, 1, -5)) -- set to 1x1 pick meta:set_string("exchangeclone_pick_mode", "1x1") - minetest.chat_send_player(player:get_player_name(), "Single node mode") + minetest.chat_send_player(player:get_player_name(), S("Single node mode")) end return itemstack else - exchangeclone.node_radius_action(player, center, range, exchangeclone.morningstar_action) + exchangeclone.node_radius_action(player, center, range, exchangeclone.morningstar_action, itemstack) end end local morningstar_def = { - description = "Red Morningstar", + description = S("Red Morningstar").."\n"..S("Single node mode"), wield_image = "exchangeclone_red_morningstar.png", inventory_image = "exchangeclone_red_morningstar.png", on_secondary_use = morningstar_on_use, @@ -259,19 +258,26 @@ for k, v in pairs({cracky = "pickaxey", crumbly = "shovely"}) do morningstar_def.tool_capabilities.groupcaps[k].times = {[1]=0.7,[2]=0.5,[3]=0.25} morningstar_def._mcl_diggroups[v].speed = 70 end +morningstar_def.description = S("Red Morningstar").."\n"..S("3x3 mode") morningstar_def.groups.not_in_creative_inventory = 1 morningstar_def.exchangeclone_pick_mode = "3x3" minetest.register_tool("exchangeclone:red_morningstar_3x3", table.copy(morningstar_def)) +exchangeclone.register_energy_alias("exchangeclone:red_morningstar", "exchangeclone:red_morningstar_3x3") + for k, v in pairs({cracky = "pickaxey", crumbly = "shovely"}) do morningstar_def.tool_capabilities.groupcaps[k].times = {[1]=0.6,[2]=0.4,[3]=0.20} - morningstar_def._mcl_diggroups[v].speed = 60 + morningstar_def._mcl_diggroups[v].speed = 80 end morningstar_def.exchangeclone_pick_mode = "tall" +morningstar_def.description = S("Red Morningstar").."\n"..S("3x1 mode") + minetest.register_tool("exchangeclone:red_morningstar_3x1", table.copy(morningstar_def)) +exchangeclone.register_energy_alias("exchangeclone:red_morningstar", "exchangeclone:red_morningstar_3x1") + minetest.register_craft({ output = "exchangeclone:red_morningstar", type = "shapeless", diff --git a/exchangeclone/shears.lua b/exchangeclone/shears.lua index 63b0820..43c7451 100644 --- a/exchangeclone/shears.lua +++ b/exchangeclone/shears.lua @@ -1,23 +1,20 @@ exchangeclone.shear_action = { - start_action = function(player, center, range) + start_action = function(player, center, range, itemstack) if exchangeclone.check_cooldown(player, "shears") then return end local data = {} - data.player_energy = exchangeclone.get_player_energy(player) - if data.player_energy < 8 then return end exchangeclone.play_ability_sound(player) - data.energy_cost = 0 + data.itemstack = itemstack return data end, action = function(player, pos, node, data) - if data.energy_cost + 8 > data.player_energy then return end local node_def = minetest.registered_items[node.name] if (node_def.groups.shearsy or node_def.groups.shearsy_cobweb) and node.name ~= "mcl_flowers:double_grass_top" then if minetest.is_protected(pos, player:get_player_name()) then minetest.record_protection_violation(pos, player:get_player_name()) else - data.energy_cost = data.energy_cost + 8 - local drops = minetest.get_node_drops(node.name, "exchangeclone:red_matter_shears") + local drops = minetest.get_node_drops(node.name, data.itemstack) exchangeclone.drop_items_on_player(pos, drops, player) + -- Annoying manual override if node.name:sub(1,18) == "mcl_ocean:seagrass" then minetest.set_node(pos, {name="sand"}) else @@ -28,7 +25,6 @@ exchangeclone.shear_action = { return data end, end_action = function(player, center, range, data) - exchangeclone.set_player_energy(player, data.player_energy - data.energy_cost) exchangeclone.start_cooldown(player, "shears", (range+1)/7) return data end @@ -66,7 +62,7 @@ local shears_rightclick = function(itemstack, player, pointed_thing) center = pointed_thing.under end local range = tonumber(itemstack:get_meta():get_int("exchangeclone_item_range")) - exchangeclone.node_radius_action(player, center, range, exchangeclone.shear_action) + exchangeclone.node_radius_action(player, center, range, exchangeclone.shear_action, itemstack) return itemstack end diff --git a/exchangeclone/shovels.lua b/exchangeclone/shovels.lua index 4d0e50f..f779cd7 100644 --- a/exchangeclone/shovels.lua +++ b/exchangeclone/shovels.lua @@ -1,19 +1,17 @@ exchangeclone.shovel_action = { - start_action = function(player, center, range) + start_action = function(player, center, range, itemstack) if exchangeclone.check_cooldown(player, "shovel") then return end local data = {} - data.player_energy = exchangeclone.get_player_energy(player) - data.energy_cost = 0 if exchangeclone.mcl then data.path = not player:get_player_control().sneak end if range > 0 or not data.path then exchangeclone.play_ability_sound(player) end + data.itemstack = itemstack return data end, action = function(player, pos, node, data) - if data.energy_cost + 8 > data.player_energy then return end if ((minetest.get_item_group(node.name, "crumbly") > 0) or (minetest.get_item_group(node.name, "shovely") > 0)) then if minetest.is_protected(pos, player:get_player_name()) then minetest.record_protection_violation(pos, player:get_player_name()) @@ -24,13 +22,11 @@ exchangeclone.shovel_action = { minetest.get_item_group(node.name, "path_creation_possible") == 1 then if minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z}).name == "air" then minetest.sound_play({name="default_grass_footstep", gain=1}, {pos = pos}, true) - data.energy_cost = data.energy_cost + 4 minetest.swap_node(pos, {name="mcl_core:grass_path"}) end end else - data.energy_cost = data.energy_cost + 8 - local drops = minetest.get_node_drops(node.name, "exchangeclone:red_matter_shovel") + local drops = minetest.get_node_drops(node.name, data.itemstack) exchangeclone.drop_items_on_player(pos, drops, player) minetest.set_node(pos, {name = "air"}) end @@ -40,7 +36,6 @@ exchangeclone.shovel_action = { end, end_action = function(player, center, range, data) if range > 0 or not data.path then - exchangeclone.set_player_energy(player, data.player_energy - data.energy_cost) exchangeclone.start_cooldown(player, "shovel", range/4) -- Longish cooldown end end @@ -68,7 +63,7 @@ local function shovel_on_place(itemstack, player, pointed_thing) center = pointed_thing.under end - exchangeclone.node_radius_action(player, center, range, exchangeclone.shovel_action) + exchangeclone.node_radius_action(player, center, range, exchangeclone.shovel_action, itemstack) return itemstack end diff --git a/exchangeclone/swords.lua b/exchangeclone/swords.lua index 4760a1b..219ed37 100644 --- a/exchangeclone/swords.lua +++ b/exchangeclone/swords.lua @@ -74,13 +74,6 @@ function exchangeclone.aoe_attack(info) if exchangeclone.check_cooldown(player, "sword") then return end - local player_energy = exchangeclone.get_player_energy(player) - if player_energy >= 384 then - exchangeclone.set_player_energy(player, player_energy - 384) - else - return - end - exchangeclone.play_ability_sound(player) local pos = player:get_pos() @@ -94,9 +87,9 @@ function exchangeclone.aoe_attack(info) -- Ignore items to lower lag if (obj:is_player() - or (ent and not aoe_exclude[ent.name] - and not (damage_all == 0 and not hostile_mobs[ent.name]))) --ignore hostile mobs if necessary - and obj:get_hp() > 0 and obj ~= player then + or (ent and not aoe_exclude[ent.name] + and not (damage_all == 0 and not hostile_mobs[ent.name]))) --ignore hostile mobs if necessary + and obj:get_hp() > 0 and obj ~= player then local opos = obj:get_pos() local distance = math.max(1, vector.distance(pos, opos)) @@ -126,7 +119,7 @@ function exchangeclone.aoe_attack(info) return end if exchangeclone.mcl then - mcl_util.deal_damage(obj, damage, { type = "generic", direct = player}) + mcl_util.deal_damage(obj, damage, { type = "hit", direct = player}) else obj:set_hp(obj:get_hp() - damage) end @@ -134,7 +127,7 @@ function exchangeclone.aoe_attack(info) end) else if exchangeclone.mcl then - mcl_util.deal_damage(obj, damage, { type = "generic", direct = player}) + mcl_util.deal_damage(obj, damage, { type = "hit", direct = player}) else obj:set_hp(obj:get_hp() - damage) end diff --git a/exchangeclone/transmutation_table.lua b/exchangeclone/transmutation_table.lua index 9e0ecdd..14aa865 100644 --- a/exchangeclone/transmutation_table.lua +++ b/exchangeclone/transmutation_table.lua @@ -43,7 +43,7 @@ function exchangeclone.reload_transmutation_list(player, search) if not search or search == "" then search = player:get_meta():get_string("exchangeclone_transmutation_search") or "" end if search and search ~= "" then local filtered_items = {} - for _,name in ipairs(items_to_show) do + for _, name in pairs(items_to_show) do local def = minetest.registered_items[name] if def and def.description and def.description ~= "" then if filter_item(string.lower(def.name), def.description, lang, search) then @@ -53,15 +53,28 @@ function exchangeclone.reload_transmutation_list(player, search) items_to_show = table.copy(filtered_items) end end - for _, item in ipairs(items_to_show) do - local energy_value = exchangeclone.get_item_energy(item) - if energy_value and energy_value <= player_energy and energy_value > 0 then - page_num = math.floor(i/16) + 1 - if not pages[page_num] then pages[page_num] = {} end - pages[page_num][(i % 16) + 1] = item - i = i + 1 + local no_duplicates = {} + for _, item in pairs(items_to_show) do + if type(item) == "string" then + local energy_value = exchangeclone.get_item_energy(item) + if energy_value and energy_value <= player_energy and energy_value > 0 then + no_duplicates[exchangeclone.handle_alias(item)] = true -- gets rid of duplicates + end end end + + items_to_show = {} + for item, _ in pairs(no_duplicates) do + table.insert(items_to_show, item) + end + table.sort(items_to_show) + + for _, item in ipairs(items_to_show) do + page_num = math.floor(i/16) + 1 + if not pages[page_num] then pages[page_num] = {} end + pages[page_num][(i % 16) + 1] = item + i = i + 1 + end player:get_meta():set_string("exchangeclone_transmutation", minetest.serialize(pages)) return pages end @@ -84,9 +97,11 @@ end local function handle_inventory(player, inventory, to_list) local stack = inventory:get_stack(to_list, 1) + local itemstring = stack:get_name() + itemstring = exchangeclone.energy_aliases[itemstring] or itemstring if to_list == "learn" then local list = minetest.deserialize(player:get_meta():get_string("exchangeclone_transmutation_learned_items")) or {} - if stack:get_name() == "exchangeclone:alchemical_tome" then + if itemstring == "exchangeclone:alchemical_tome" then list = {} local i = 0 for name, def in pairs(minetest.registered_items) do @@ -100,13 +115,13 @@ local function handle_inventory(player, inventory, to_list) player:get_meta():set_string("exchangeclone_transmutation_learned_items", minetest.serialize(list)) inventory:set_stack(to_list, 1, nil) else - local individual_energy_value = exchangeclone.get_item_energy(stack:get_name()) + local individual_energy_value = exchangeclone.get_item_energy(itemstring) if not individual_energy_value or individual_energy_value <= 0 then return end local wear = stack:get_wear() if wear and wear > 1 then individual_energy_value = math.floor(individual_energy_value * (65536 / wear)) end - if stack:get_name() == "exchangeclone:exchange_orb" then + if itemstring == "exchangeclone:exchange_orb" then individual_energy_value = individual_energy_value + exchangeclone.get_orb_itemstack_energy(stack) end local player_energy = exchangeclone.get_player_energy(player) @@ -116,9 +131,9 @@ local function handle_inventory(player, inventory, to_list) local result = player_energy + energy_value if result < 0 or result > exchangeclone.limit then return end exchangeclone.set_player_energy(player, result) - local item_index = table.indexof(list, stack:get_name()) + local item_index = table.indexof(list, itemstring) if item_index == -1 then - list[#list+1] = stack:get_name() + list[#list+1] = itemstring table.sort(list) player:get_meta():set_string("exchangeclone_transmutation_learned_items", minetest.serialize(list)) end @@ -161,10 +176,8 @@ local function allow_inventory_action(player, stack, to_list, count, move, inven return 0 elseif to_list == "learn" then if stack:get_name() == "exchangeclone:alchemical_tome" then return count end - local name = stack:get_name() - local energy_value = exchangeclone.get_item_energy(stack:get_name()) + local energy_value = exchangeclone.get_item_energy(exchangeclone.handle_alias(stack)) if not energy_value then return 0 end - local def = minetest.registered_items[name] if energy_value <= 0 then return 0 else @@ -198,7 +211,7 @@ function exchangeclone.show_transmutation_table_formspec(player, data) local selection = data.selection or player:get_meta():get_string("exchangeclone_transmutation_selection") local player_name = player:get_player_name() local inventory_name = "detached:exchangeclone_transmutation_"..player_name - local label = "Transmutation\n"..tostring(player_energy).." energy" + local label = "Transmutation\n"..exchangeclone.format_number(player_energy).." energy" local formspec = "size[9,11]".. diff --git a/zzzz_exchangeclone_crafthook/init.lua b/zzzz_exchangeclone_crafthook/init.lua index e4020a1..93f3cb9 100644 --- a/zzzz_exchangeclone_crafthook/init.lua +++ b/zzzz_exchangeclone_crafthook/init.lua @@ -21,7 +21,6 @@ end if minetest.get_modpath("technic") then local function register_technic_recipe(recipe) local result = {recipe = recipe.input, output = recipe.output, type = "technic"} - --minetest.log(dump(result)) local output_itemstring = ItemStack(recipe.output):get_name() exchangeclone.recipes[output_itemstring] = exchangeclone.recipes[output_itemstring] or {} table.insert(exchangeclone.recipes[output_itemstring], result)