Improvements and aliases

This commit is contained in:
ThePython 2023-11-18 16:48:35 -08:00
parent 3c8345da1b
commit 3874c608f3
30 changed files with 649 additions and 588 deletions

View File

@ -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

View File

@ -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}
})

View File

@ -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
)
minetest.log("action", "ExchangeClone: Done registering energy values.")
end)

View File

@ -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

View File

@ -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

View File

@ -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),

View File

@ -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},

View File

@ -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

View File

@ -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"

View File

@ -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
}
})

View File

@ -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,

View File

@ -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",

View File

@ -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}

View File

@ -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",

View File

@ -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 = {

View File

@ -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 = {

View File

@ -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,

View File

@ -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")

View File

@ -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 = {}
-- <itemstring> will be treated as <alias> in Deconstructors, Constructors, Transmutation Table(t)s, etc.
-- When you put <itemstring> into a TT, you will learn <alias> 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

View File

@ -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

View File

@ -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...
})

View File

@ -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 = {

View File

@ -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,

View File

@ -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 = {

View File

@ -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",

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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]"..

View File

@ -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)