Done except energy values

This commit is contained in:
ThePython 2023-10-07 08:26:21 -07:00
parent 8e80a15c10
commit 7204d4956f
22 changed files with 744 additions and 122 deletions

View File

@ -29,6 +29,7 @@ read_globals = {
"mcl_particles",
"screwdriver",
"mcl_crafting_table",
"mcl_enchantments",
"Raycast",
"Settings",

View File

@ -40,33 +40,37 @@ If you have a suggestion or notice a bug, visit the [GitHub issues page](https:/
<details><summary><h1>Changelog:</h1></summary>
### 5.0 (the new most insteresting release so far)
#### You MUST break and replace any existing Deconstructors when updating from any previous version.
### 5.0 (the most insteresting release so far)
#### You MUST break and replace any existing Constructors, Deconstructors, and Energy Collectors when updating from any previous version. Nothing will be lost.
* New features:
* Added a [wiki](https://github.com/ThePython10110/ExchangeClone/wiki)! This is where you can find more complete information on pretty much everything.
* Because the wiki exists, I won't be including anywhere near as many details about how features work in the changelog.
* Added the Transmutation Table(t): Much better than the constructor/deconstructor.
* Alchemical Tome: Instantly teaches every item with an energy value to the Transmutation Table(t).
* Dark/Red Matter Furnaces: Can be powered by Energy Collectors, much faster, and sometimes double ores.
* Personal Energy Link: Allows you to use hoppers to get items into/out of your Personal Energy (MineClone)
* Upgraded Energy Collectors: Now MK1-MK5. They use personal energy unless they have an orb.
* The ability to upgrade dark/red matter tools to give them fortune, looting, fire aspect, and silk touch
* The ability to upgrade dark/red matter armor to give it thorns and frost walker
* Mind, Life, Body, and Soul Stones
* Upgraded Energy Collectors: Now MK1-MK5, each giving more energy per second. They now use personal energy by default.
* Upgrades (MCL only)
* Upgrades can give dark/red matter tools fortune, looting, fire aspect, and silk touch (note: abilities ignore enchantments)
* Upgrades can give dark/red matter armor thorns and frost walker
* Mod developers can now set their own energy values by setting `exchangeclone_custom_energy` in the item/node definition.
* Changes
* The changelog now has the most recent updates first, to make things easier to find.
* Energy for Dark/Red Matter tool abilities (as well as the Transmutation Table) is no longer stored in an orb, but inside the player.
* The amount of energy you currently have stored is visible in the bottom right of the screen.
* Because of this, the PESA is now useless and deprecated. It will be removed after a few releases (so probably a couple months at least). Remove any Exchange Orbs from your personal storage.
* Energy for Dark/Red Matter tool abilities (as well as the Transmutation Table) is no longer stored in an orb, but inside the player (called "personal energy").
* The amount of energy you currently have stored is visible in the bottom right of the screen.
* Because of this, the PESA is now useless and deprecated. It will be removed after a few releases (so probably a couple months at least). Remove any Exchange Orbs from your personal storage.
* Energy Collectors, Deconstructors, and Constructors now send their energy to the placer's personal energy when they do not contain an orb.
* A lot of items (including DM/RM tools and armor) will not burn in lava in MineClone2.
* Energy Collectors now send their energy to the placer's personal energy by default.
* Deconstructors and Constructors now work with hoppers and don't have that weird lag thing when deconstructing
* The lag was caused by the fact that Enchant97 copied used node timers. Now they don't.
* **You MUST break and replace any existing Constructors, Deconstructors, and Energy Collectors when updating from any previous version. Nothing will be lost.**
* Red Matter Armor now sets your maximum health to 200 instead of 2000
* Exchange Orbs are now 18x better as fuel than they used to be
* DM/RM Shovels will now only create paths on blocks below air.
* Bugfixes:
* I must have skipped a row while going through MineClone's mod list. Several mods starting with `mcl_b` or `mcl_c` have been added to the whitelist.
* Fixed right-clicking with an orb not showing charge
* Fixed unnecessary chat logging when deconstructing/constructing
* The names for Dark and Red Matter Armor now are correct in MineClone2
* Removed unnecessary tool repair recipes from dark/red matter tools/armor
* Fixed a couple of armor texture issues in Minetest Game (though it still looks like diamond armor; 3D Armor doesn't support texture modifiers)
* The Red Katar is now actually craftable in Minetest Game (I just forgot that shears were only in MCL2)
@ -123,7 +127,7 @@ If you have a suggestion or notice a bug, visit the [GitHub issues page](https:/
* Fixed crash based on PESA inventory movement
* Added `mcl_blackstone` to the mod whitelist
### 3.0 (the most interesting release so far)
### 3.0 (the formerly most interesting release)
* New features:
* Added Alchemical Coal, Mobius Fuel, Aeternalis Fuel, Dark Matter (blocks and orbs), and Red Matter (blocks and orbs)
* Added PESA (Personal Energy Storage Accessor)
@ -213,7 +217,8 @@ If you have a suggestion or notice a bug, visit the [GitHub issues page](https:/
</details>
### Features that I plan on adding eventually:
* Something that places nodes in a square (with varying range), possibly with a low energy cost
* Mind, Life, Body, and Soul Stones
* Mercurial Eye (?)
* Ability to smelt with the Philosopher's Stone and coal/charcoal (maybe?)
* Exchangeclone guidebook (maybe depend on doc mod?)
* As soon as Minetest 5.8 comes out, better textures for armor...

View File

@ -111,7 +111,7 @@ if exchangeclone.mcl then
feet = get_armor_texture("boots","dark"),
},
toughness = 4,
groups = {dark_matter_armor = 1, fire_immune = 1},
groups = {dark_matter_armor = 1, fire_immune = 1, exchangeclone_upgradable = 1},
craft_material = "exchangeclone:dark_matter",
cook_material = "mcl_core:diamondblock",
})
@ -139,7 +139,7 @@ if exchangeclone.mcl then
feet = get_armor_texture("boots","red"),
},
toughness = 5,
groups = {red_matter_armor = 1, disable_repair = 1, fire_immune = 1},
groups = {red_matter_armor = 1, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1},
craft_material = "exchangeclone:red_matter",
cook_material = "exchangeclone:dark_matter",
on_equip_callbacks = {
@ -193,7 +193,7 @@ else
inventory_image = get_armor_texture("inv_helmet","dark"),
preview = get_armor_texture("helmet","dark", true),
armor_groups = {fleshy = 13},
groups = {["armor_head"] = 1, ["dark_matter_armor"] = 1, armor_heal = 5, armor_fire = 1, armor_water = 1, disable_repair = 1,}
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",
@ -201,7 +201,7 @@ else
inventory_image = get_armor_texture("inv_chestplate","dark"),
preview = get_armor_texture("chestplate","dark", true),
armor_groups = {fleshy = 21},
groups = {["armor_torso"] = 1, ["dark_matter_armor"] = 1, armor_heal = 8, armor_fire = 2, armor_water = 1, disable_repair = 1}
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",
@ -209,7 +209,7 @@ else
inventory_image = get_armor_texture("inv_leggings","dark"),
preview = get_armor_texture("leggings","dark", true),
armor_groups = {fleshy = 18},
groups = {["armor_legs"] = 1, ["dark_matter_armor"] = 1, armor_heal = 7, armor_fire = 1, armor_water = 1, disable_repair = 1}
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",
@ -217,7 +217,7 @@ else
inventory_image = get_armor_texture("inv_boots","dark"),
preview = get_armor_texture("boots","dark", true),
armor_groups = {fleshy = 10},
groups = {["armor_feet"] = 1, ["dark_matter_armor"] = 1, armor_heal = 4, armor_fire = 1, armor_water = 1, armor_feather = 1, disable_repair = 1}
groups = {["armor_feet"] = 1, ["dark_matter_armor"] = 1, armor_heal = 4, armor_fire = 1, armor_water = 1, armor_feather = 1, disable_repair = 1, exchangeclone_upgradable = 1}
})
armor:register_armor("exchangeclone:shield_dark_matter", {
description = "Dark Matter Shield",
@ -225,7 +225,7 @@ else
inventory_image = get_armor_texture("inv_shield","dark"),
preview = get_armor_texture("shield","dark", true),
armor_groups = {fleshy = 18},
groups = {["armor_shield"] = 1, ["dark_matter_armor"] = 1, armor_heal = 7, armor_fire = 1, armor_water = 1, disable_repair = 1}
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",
@ -233,7 +233,7 @@ else
inventory_image = get_armor_texture("inv_helmet","red"),
preview = get_armor_texture("helmet","red", true),
armor_groups = {fleshy = 15},
groups = {["armor_head"] = 1, ["red_matter_armor"] = 1, armor_heal = 10, armor_fire = 2, armor_water = 1, disable_repair = 1}
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",
@ -241,7 +241,7 @@ else
inventory_image = get_armor_texture("inv_chestplate","red"),
preview = get_armor_texture("chestplate","red", true),
armor_groups = {fleshy = 23},
groups = {["armor_torso"] = 1, ["red_matter_armor"] = 1, armor_heal = 16, armor_fire = 2, armor_water = 1, disable_repair = 1}
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",
@ -249,7 +249,7 @@ else
inventory_image = get_armor_texture("inv_leggings","red"),
preview = get_armor_texture("leggings","red", true),
armor_groups = {fleshy = 20},
groups = {["armor_legs"] = 1, ["red_matter_armor"] = 1, armor_heal = 14, armor_fire = 2, armor_water = 1, armor_feather = 1, disable_repair = 1}
groups = {["armor_legs"] = 1, ["red_matter_armor"] = 1, armor_heal = 14, armor_fire = 2, armor_water = 1, armor_feather = 1, disable_repair = 1, exchangeclone_upgradable = 1}
})
armor:register_armor("exchangeclone:boots_red_matter", {
description = "Red Matter Boots",
@ -257,7 +257,7 @@ else
inventory_image = get_armor_texture("inv_boots","red"),
preview = get_armor_texture("boots","red", true),
armor_groups = {fleshy = 12},
groups = {["armor_feet"] = 1, ["red_matter_armor"] = 1, armor_heal = 8, armor_fire = 2, armor_water = 1, armor_feather = 1, disable_repair = 1}
groups = {["armor_feet"] = 1, ["red_matter_armor"] = 1, armor_heal = 8, armor_fire = 2, armor_water = 1, armor_feather = 1, disable_repair = 1, exchangeclone_upgradable = 1}
})
armor:register_armor("exchangeclone:shield_red_matter", {
description = "Red Matter Shield",
@ -265,7 +265,7 @@ else
inventory_image = get_armor_texture("inv_shield","red"),
preview = get_armor_texture("shield","red", true),
armor_groups = {fleshy = 20},
groups = {["armor_shield"] = 1, ["red_matter_armor"] = 1, armor_heal = 14, armor_fire = 2, armor_water = 1, disable_repair = 1}
groups = {["armor_shield"] = 1, ["red_matter_armor"] = 1, armor_heal = 14, armor_fire = 2, armor_water = 1, disable_repair = 1, exchangeclone_upgradable = 1}
})
armor:register_on_equip(function(player, index, stack)
exchangeclone.check_armor_health(player)

View File

@ -68,7 +68,7 @@ minetest.register_tool("exchangeclone:dark_matter_axe", {
description = "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 },
groups = { tool=1, axe=1, dig_speed_class=7, enchantability=0, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1},
wield_scale = exchangeclone.wield_scale,
tool_capabilities = {
-- 1/1.2
@ -93,7 +93,7 @@ minetest.register_tool("exchangeclone:red_matter_axe", {
description = "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 },
groups = { tool=1, axe=1, dig_speed_class=8, enchantability=0, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1},
wield_scale = exchangeclone.wield_scale,
tool_capabilities = {
-- 1/1.2

View File

@ -44,14 +44,16 @@ local function get_constructor_formspec()
end
end
minetest.register_alias("exchangeclone:element_constructor", "exchangeclone:constructor")
-- Register LBM to update constructors
minetest.register_lbm({
name = "exchangeclone:constructor_alert",
nodenames = {"exchangeclone:constructor"},
run_at_every_load = true,
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]")
meta:set_string("formspec", "size[3,1]label[0,0;Break and replace.\nNothing will be lost.]")
end,
})
@ -63,11 +65,19 @@ local function can_dig(pos, player)
end
local function constructor_action(pos)
local inv = minetest.get_meta(pos):get_inventory()
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
using_orb = false
player = minetest.get_player_by_name(meta:get_string("exchangeclone_placer"))
if not (player and player ~= "") then return end
end
local src_stack = inv:get_stack("src", 1)
local dst_stack = inv:get_stack("dst", 1)
if not inv:is_empty("fuel") and not inv:is_empty("src") then
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
@ -88,13 +98,23 @@ local function constructor_action(pos)
and result ~= "mcl_core:apple_gold_enchanted" then
result = string.sub(src_stack:get_name(), 1, -11)
end
-- make sure orb has enough charge
local orb_charge = exchangeclone.get_orb_energy(inv, "fuel", 1)
-- make sure orb/player has enough energy
local current_energy
if using_orb then
current_energy = exchangeclone.get_orb_energy(inv, "fuel", 1)
else
current_energy = exchangeclone.get_player_energy(player)
end
local energy_value = exchangeclone.get_item_energy(src_stack:get_name())
if energy_value > 0 then
local max_amount = math.min(src_stack:get_stack_max(), math.floor(orb_charge/energy_value))
local max_amount = math.min(src_stack:get_stack_max(), math.floor(current_energy/energy_value))
local added_amount = max_amount - inv:add_item("dst", ItemStack(result.." "..max_amount)):get_count()
exchangeclone.set_orb_energy(inv, "fuel", 1, math.min(orb_charge, orb_charge - (energy_value * added_amount))) -- not sure if "math.min()" is necessary
local result_energy = math.min(current_energy, current_energy - (energy_value * added_amount)) -- not sure if "math.min()" is necessary
if using_orb then
exchangeclone.set_orb_energy(inv, "fuel", 1, result_energy)
else
exchangeclone.set_player_energy(player, result_energy)
end
end
end
end
@ -107,7 +127,6 @@ local function on_construct(pos)
inv:set_size("dst", 1)
meta:set_string("formspec", get_constructor_formspec())
meta:set_string("infotext", "Constructor")
constructor_action(pos)
end
local function allow_metadata_inventory_put(pos, listname, index, stack, player)
@ -184,11 +203,17 @@ minetest.register_node("exchangeclone:constructor", {
meta:from_table(meta2)
end
end,
on_timer = constructor_action,
after_place_node = function(pos, player, itemstack, pointed_thing)
local meta = minetest.get_meta(pos)
meta:set_string("exchangeclone_placer", player:get_player_name())
end,
on_construct = on_construct,
on_metadata_inventory_move = constructor_action,
on_metadata_inventory_put = constructor_action,
on_metadata_inventory_take = constructor_action,
on_metadata_inventory_take = function(pos, listname, index, stack, player)
if listname == "fuel" then return end
constructor_action(pos)
end,
on_blast = on_blast,
allow_metadata_inventory_put = allow_metadata_inventory_put,
allow_metadata_inventory_move = allow_metadata_inventory_move,

View File

@ -35,14 +35,16 @@ local function get_deconstructor_formspec()
end
end
minetest.register_alias("exchangeclone:element_deconstructor", "exchangeclone:deconstructor")
-- Register LBM to update deconstructors
minetest.register_lbm({
name = "exchangeclone:deconstructor_alert",
nodenames = {"exchangeclone:deconstructor"},
run_at_every_load = true,
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]")
meta:set_string("formspec", "size[3,1]label[0,0;Break and replace.\nNothing will be lost.]")
end,
})
@ -54,9 +56,17 @@ local function can_dig(pos, player)
end
local function deconstructor_action(pos)
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 return end
if inv:get_stack("fuel", 1):get_name() ~= "exchangeclone:exchange_orb" then
limit = 2147483647
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 individual_energy_value <= 0 then return end
@ -67,13 +77,22 @@ 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 orb_energy = exchangeclone.get_orb_energy(inv, "fuel", 1)
local max_count = math.floor((exchangeclone.orb_max - orb_energy)/individual_energy_value)
local current_energy
if using_orb then
current_energy = exchangeclone.get_orb_energy(inv, "fuel", 1)
else
current_energy = exchangeclone.get_player_energy(player)
end
local max_count = math.floor((limit - current_energy)/individual_energy_value)
local add_count = math.min(max_count, stack:get_count())
local energy_value = individual_energy_value * add_count
local result = orb_energy + energy_value
if result < 0 or result > exchangeclone.orb_max then return end
exchangeclone.set_orb_energy(inv, "fuel", 1, result)
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
exchangeclone.set_player_energy(player, result)
end
stack:set_count(stack:get_count() - add_count)
if stack:get_count() == 0 then stack = ItemStack("") end
inv:set_stack("src", 1, stack)
@ -162,11 +181,18 @@ minetest.register_node("exchangeclone:deconstructor", {
meta:from_table(meta2)
end
end,
after_place_node = function(pos, player, itemstack, pointed_thing)
local meta = minetest.get_meta(pos)
meta:set_string("exchangeclone_placer", player:get_player_name())
end,
on_timer = deconstructor_action,
on_construct = on_construct,
on_metadata_inventory_move = deconstructor_action,
on_metadata_inventory_put = deconstructor_action,
on_metadata_inventory_take = deconstructor_action,
on_metadata_inventory_take = function(pos, listname, index, stack, player)
if listname == "fuel" then return end
deconstructor_action(pos)
end,
on_blast = on_blast,
allow_metadata_inventory_put = allow_metadata_inventory_put,
allow_metadata_inventory_move = allow_metadata_inventory_move,

View File

@ -26,6 +26,19 @@ local function get_energy_collector_formspec()
return table.concat(formspec, "")
end
minetest.register_alias("exchangeclone:energy_collector", "exchangeclone:energy_collector_mk1")
-- Register LBM to update deconstructors
minetest.register_lbm({
name = "exchangeclone:collector_alert",
nodenames = {"exchangeclone:energy_collector_mk1"},
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.]")
end,
})
local check_positions = {
{x=0,y=0,z=1},
{x=0,y=0,z=-1},
@ -35,13 +48,24 @@ local check_positions = {
{x=-1,y=0,z=0},
}
local function check_for_furnaces(pos, set_furnace)
local function check_for_furnaces(pos, set_furnace, start)
local found = false
for _, check_pos in ipairs(check_positions) do
local new_pos = vector.add(pos, check_pos)
local node = minetest.get_node(new_pos)
if minetest.get_item_group(node.name, "exchangeclone_furnace") > 0 then
local furnace = minetest.get_item_group(node.name, "exchangeclone_furnace")
if furnace > 0 then
found = true
if start then
local timer = minetest.get_node_timer(new_pos)
if not timer:is_started() then
if furnace == 1 then -- Dark Matter
timer:start(0.45)
elseif furnace == 2 then -- Red Matter
timer:start(0.16)
end
end
end
if set_furnace ~= nil then
local meta = minetest.get_meta(new_pos)
meta:set_int("using_collector", set_furnace)
@ -72,9 +96,9 @@ local function on_timer(pos, elapsed)
end
if minetest.get_natural_light(above) >= 14 then
if check_for_furnaces(pos, 1) then
if check_for_furnaces(pos, 1, true) then
-- do nothing, energy is being used for the furnace.
return
return true
end
local amount = meta:get_int("collector_amount")
if using_orb then
@ -86,7 +110,7 @@ local function on_timer(pos, elapsed)
end
exchangeclone.set_orb_energy(inv, "main", 1, stored)
else
local placer = meta:get_string("collector_placer")
local placer = meta:get_string("exchangeclone_placer")
if placer and placer ~= "" then
local player = minetest.get_player_by_name(placer)
if player then
@ -151,12 +175,10 @@ local function on_dig_node(pos, oldnode, oldmetadata, player)
local meta2 = meta:to_table()
meta:from_table(oldmetadata)
local inv = meta:get_inventory()
for _, listname in ipairs({"main"}) do
local stack = inv:get_stack(listname, 1)
if not stack:is_empty() then
local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5}
minetest.add_item(p, stack)
end
local stack = inv:get_stack("main", 1)
if not stack:is_empty() then
local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5}
minetest.add_item(p, stack)
end
meta:from_table(meta2)
end
@ -198,7 +220,7 @@ function exchangeclone.register_energy_collector(itemstring, name, amount, modif
local player_name = player:get_player_name()
local meta = minetest.get_meta(pos)
meta:set_int("collector_amount", amount)
meta:set_string("collector_placer", player_name)
meta:set_string("exchangeclone_placer", player_name)
meta:set_string("infotext", name.."\nOwned by"..player_name)
end,
on_blast = on_blast,
@ -206,7 +228,10 @@ function exchangeclone.register_energy_collector(itemstring, name, amount, modif
allow_metadata_inventory_move = allow_metadata_inventory_move,
allow_metadata_inventory_take = allow_metadata_inventory_take,
})
minetest.register_craft(recipe)
minetest.register_craft({
output = itemstring,
recipe = recipe
})
end
--[[if minetest.get_modpath("pipeworks") then
@ -248,47 +273,37 @@ if exchangeclone.mcl then
chest = "mcl_chests:chest"
end
exchangeclone.register_energy_collector("exchangeclone:energy_collector", "Energy Collector MK1", 4, "", {
output = "exchangeclone:energy_collector",
recipe = {
exchangeclone.register_energy_collector("exchangeclone:energy_collector_mk1", "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", {
output = "exchangeclone:energy_collector_mk2",
recipe = {
{iron, iron, iron},
{"exchangeclone:energy_collector", "exchangeclone:energy_collector", "exchangeclone:energy_collector"},
{"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", {
output = "exchangeclone:energy_collector_mk3",
recipe = {
{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", {
output = "exchangeclone:energy_collector_mk4",
recipe = {
{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", {
output = "exchangeclone:energy_collector_mk5",
recipe = {
{iron, iron, iron},
{"exchangeclone:energy_collector_mk4", "exchangeclone:energy_collector_mk4", "exchangeclone:energy_collector_mk4"},
{iron, iron, iron}
}
})
)

View File

@ -45,8 +45,8 @@ local base_formspec =
"size[10,8.75]"..
"label[0,4;Inventory]"..
exchangeclone.inventory_formspec(0,4.5)..
"list[context;src;2.75,0.5;1,1]"..
"list[context;fuel;2.75,2.5;1,1;]"..
"list[context;src;2.9,0.5;1,1]"..
"list[context;fuel;2.9,2.5;1,1;]"..
"list[context;dst;5.75,1.5;1,1;]"..
"listring[context;dst]"..
"listring[current_player;main]"..
@ -59,29 +59,43 @@ if exchangeclone.mcl then
base_formspec = base_formspec..
mcl_formspec.get_itemslot_bg(0,4.5,9,3)..
mcl_formspec.get_itemslot_bg(0,7.74,9,1)..
mcl_formspec.get_itemslot_bg(2.75,0.5,1,1)..
mcl_formspec.get_itemslot_bg(2.75,2.5,1,1)..
mcl_formspec.get_itemslot_bg(2.9,0.5,1,1)..
mcl_formspec.get_itemslot_bg(2.9,2.5,1,1)..
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
return base_formspec..
"list[context;src;0,1;"..tostring(num_columns)..",3;1]"..
"label[2.75,0;"..type.." Matter Furnace]"..
"image[2.75,1.5;1,1;default_furnace_fire_bg.png]"..
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]"..
"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
result = result..
mcl_formspec.get_itemslot_bg(0,0.5,num_columns,3)..
mcl_formspec.get_itemslot_bg(7,0.5,num_columns,3)
end
return result
end
local function active_formspec(fuel_percent, item_percent, type)
local num_columns = (type == "Dark" and 2) or 3
return base_formspec..
"image[2.75,1.5;1,1;default_furnace_fire_bg.png^[lowpart:"..
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,1;"..tostring(num_columns)..",3;1]"..
"list[context;src;0,0.5;"..tostring(num_columns)..",3;1]"..
"list[context;dst;7,0.5;"..tostring(num_columns)..",3;1]"..
"image[4.1,1.5;1.5,1;gui_furnace_arrow_bg.png^[lowpart:"..
(item_percent)..":gui_furnace_arrow_fg.png^[transformR270]"..
"label[2.75,0;"..type.." Matter Furnace]"
"label[2.9,0;"..type.." Matter Furnace]"
if exchangeclone.mcl then
result = result..
mcl_formspec.get_itemslot_bg(0,0.5,num_columns,3)..
mcl_formspec.get_itemslot_bg(7,0.5,num_columns,3)
end
return result
end
local receive_fields = function(pos, formname, fields, sender)
@ -277,12 +291,9 @@ local function check_srclist(pos)
return "not empty"
end
local size = inv:get_size("src")
minetest.log(size)
for i=2,size do
local stack = inv:get_stack("src", i)
minetest.log(dump(stack))
if not stack:is_empty() then
minetest.log("Setting stacks")
inv:set_stack("src", 1, stack)
inv:set_stack("src", i, ItemStack(""))
return true
@ -493,7 +504,7 @@ local inactive_def = {
meta:from_table(oldmetadata)
local inv = meta:get_inventory()
for _, listname in ipairs({"src", "dst", "fuel"}) do
if listname == "src" then
if listname == "src" or listname == "dst" then
for i = 1,7 do
local stack = inv:get_stack(listname, i)
if not stack:is_empty() then
@ -518,7 +529,7 @@ local inactive_def = {
local inv = meta:get_inventory()
inv:set_size("src", 7)
inv:set_size("fuel", 1)
inv:set_size("dst", 1)
inv:set_size("dst", 7)
end,
on_destruct = function(pos)
if exchangeclone.mcl then
@ -583,7 +594,7 @@ local active_def = {
meta:from_table(oldmetadata)
local inv = meta:get_inventory()
for _, listname in ipairs({"src", "dst", "fuel"}) do
if listname == "src" then
if listname == "src" or listname == "dst" then
for i = 1,7 do
local stack = inv:get_stack(listname, i)
if not stack:is_empty() then
@ -671,7 +682,7 @@ minetest.override_item("exchangeclone:red_matter_furnace", {
local inv = meta:get_inventory()
inv:set_size("src", 10)
inv:set_size("fuel", 1)
inv:set_size("dst", 1)
inv:set_size("dst", 10)
end,
after_dig_node = function(pos, oldnode, oldmetadata, digger)
@ -680,7 +691,7 @@ minetest.override_item("exchangeclone:red_matter_furnace", {
meta:from_table(oldmetadata)
local inv = meta:get_inventory()
for _, listname in ipairs({"src", "dst", "fuel"}) do
if listname == "src" then
if listname == "src" or listname == "dst" then
for i = 1,10 do
local stack = inv:get_stack(listname, i)
if not stack:is_empty() then
@ -721,7 +732,7 @@ minetest.override_item("exchangeclone:red_matter_furnace_active", {
local inv = meta:get_inventory()
inv:set_size("src", 10)
inv:set_size("fuel", 1)
inv:set_size("dst", 1)
inv:set_size("dst", 10)
end,
after_dig_node = function(pos, oldnode, oldmetadata, digger)
@ -730,7 +741,7 @@ minetest.override_item("exchangeclone:red_matter_furnace_active", {
meta:from_table(oldmetadata)
local inv = meta:get_inventory()
for _, listname in ipairs({"src", "dst", "fuel"}) do
if listname == "src" then
if listname == "src" or listname == "dst" then
for i = 1,10 do
local stack = inv:get_stack(listname, i)
if not stack:is_empty() then

View File

@ -72,7 +72,7 @@ minetest.register_tool("exchangeclone:dark_matter_hammer", {
description = "Dark Matter Hammer",
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 },
groups = { tool=1, hammer=1, dig_speed_class=7, enchantability=0, dark_matter_hammer = 1, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1},
wield_scale = exchangeclone.wield_scale,
tool_capabilities = {
-- 1/1.2
@ -97,7 +97,7 @@ minetest.register_tool("exchangeclone:dark_matter_hammer_3x3", {
description = "Dark Matter Hammer",
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 },
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},
wield_scale = exchangeclone.wield_scale,
tool_capabilities = {
-- 1/1.2
@ -122,7 +122,7 @@ minetest.register_tool("exchangeclone:red_matter_hammer", {
description = "Red Matter Hammer",
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 },
groups = { tool=1, hammer=1, dig_speed_class=7, enchantability=0, red_matter_hammer = 1, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1},
wield_scale = exchangeclone.wield_scale,
tool_capabilities = {
-- 1/1.2
@ -147,7 +147,7 @@ minetest.register_tool("exchangeclone:red_matter_hammer_3x3", {
description = "Red Matter Hammer",
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 },
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},
wield_scale = exchangeclone.wield_scale,
tool_capabilities = {
-- 1/1.2

View File

@ -115,7 +115,7 @@ local hoe_def = {
wield_scale = exchangeclone.wield_scale,
on_place = hoe_on_place,
on_secondary_use = hoe_on_place,
groups = { tool=1, hoe=1, enchantability=0, dark_matter_hoe = 1, disable_repair = 1, fire_immune = 1 },
groups = { tool=1, hoe=1, enchantability=0, dark_matter_hoe = 1, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1},
tool_capabilities = {
full_punch_interval = 0.25,
damage_groups = { fleshy = 7, },
@ -142,7 +142,7 @@ minetest.register_tool("exchangeclone:dark_matter_hoe_3x3", table.copy(hoe_3x3_d
hoe_def.description = "Red Matter Hoe"
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 }
hoe_def.groups = { tool=1, hoe=1, enchantability=0, red_matter_hoe = 1, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1}
hoe_def.tool_capabilities = {
full_punch_interval = 0.25,
damage_groups = { fleshy = 8, },

View File

@ -25,11 +25,11 @@ dofile(modpath.."/craftitems.lua")
if exchangeclone.mcl or minetest.get_modpath("3d_armor") then
dofile(modpath.."/armor.lua")
end
dofile(modpath.."/multidig.lua")
if exchangeclone.mcl then
mcl_item_id.set_mod_namespace("exchangeclone")
dofile(modpath.."/shears.lua")
end
dofile(modpath.."/multidig.lua")
dofile(modpath.."/swords.lua")
dofile(modpath.."/axes.lua")
dofile(modpath.."/hoes.lua")
@ -37,6 +37,9 @@ dofile(modpath.."/pickaxes.lua")
dofile(modpath.."/hammers.lua")
dofile(modpath.."/shovels.lua")
dofile(modpath.."/red_matter_multitools.lua")
if exchangeclone.mcl then
dofile(modpath.."/tool_upgrades.lua")
end
dofile(modpath.."/philosophers_stone.lua")
dofile(modpath.."/pesa.lua")
dofile(modpath.."/transmutation_table.lua")

View File

@ -349,8 +349,6 @@ local longdesc = "A mysterious device discovered by alchemists millenia ago.
"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 ancient tome (entitled the \"Tekkit Wiki\") vaguely mentioned a \"cooldown\" when used to transmute large areas, "..
"but ThePython was far to lazy to implement such a thing (maybe just have the charge level/radius reset every time?).\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."
@ -478,7 +476,7 @@ minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv
end) --]]
minetest.register_tool("exchangeclone:philosophers_stone", {
description = "Philosopher's Stone",
description = "Philosopher's Stone\nAlways returned when crafting",
inventory_image = "exchangeclone_philosophers_stone.png",
wield_image = "exchangeclone_philosophers_stone.png",
_tt_help = tt_help,

View File

@ -81,9 +81,15 @@ local function pickaxe_on_use(itemstack, player, pointed_thing)
end
for name, def in pairs(minetest.registered_nodes) do
if name:find("_ore") or name:find("stone_with") or name:find("deepslate_with")
or name:find("diorite_with") or name:find("andesite_with") or name:find("granite_with")
or name:find("tuff_with") or (name == "mcl_blackstone:nether_gold") or (name == "mcl_nether:ancient_debris") then
if name:find("_ore")
or name:find("stone_with")
or name:find("deepslate_with")
or name:find("diorite_with")
or name:find("andesite_with")
or name:find("granite_with")
or name:find("tuff_with")
or (name == "mcl_blackstone:nether_gold")
or (name == "mcl_nether:ancient_debris") then
local groups = table.copy(def.groups)
groups.exchangeclone_ore = 1
minetest.override_item(name, {groups = groups})
@ -95,7 +101,7 @@ local pick_def = {
wield_image = "exchangeclone_dark_matter_pickaxe.png",
inventory_image = "exchangeclone_dark_matter_pickaxe.png",
exchangeclone_pick_mode = "1x1",
groups = { tool=1, pickaxe=1, dig_speed_class=7, enchantability=0, dark_matter_pickaxe=1, disable_repair = 1, fire_immune = 1 },
groups = { tool=1, pickaxe=1, dig_speed_class=7, enchantability=0, dark_matter_pickaxe=1, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1},
wield_scale = exchangeclone.wield_scale,
tool_capabilities = {
-- 1/1.2

View File

@ -69,7 +69,7 @@ local katar_def = {
inventory_image = "exchangeclone_red_katar.png",
on_secondary_use = katar_on_use,
on_place = katar_on_use,
groups = { tool=1, red_katar = 1, sword = 1, axe=1, hoe = 1, shears = 1, dig_speed_class=8, enchantability=0, disable_repair = 1, fire_immune = 1 },
groups = { tool=1, red_katar = 1, sword = 1, axe=1, hoe = 1, shears = 1, dig_speed_class=8, enchantability=0, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1},
wield_scale = exchangeclone.wield_scale,
tool_capabilities = {
full_punch_interval = 0.3,
@ -232,7 +232,7 @@ local morningstar_def = {
on_secondary_use = morningstar_on_use,
exchangeclone_pick_mode = "1x1",
on_place = morningstar_on_use,
groups = { tool=1, red_morningstar = 1, shovel = 1, hammer=1, pickaxe = 1, dig_speed_class=8, enchantability=0, disable_repair = 1, fire_immune = 1 },
groups = { tool=1, red_morningstar = 1, shovel = 1, hammer=1, pickaxe = 1, dig_speed_class=8, enchantability=0, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1},
wield_scale = exchangeclone.wield_scale,
tool_capabilities = {
full_punch_interval = 0.3,

View File

@ -75,7 +75,7 @@ minetest.register_tool("exchangeclone:dark_matter_shears", {
wield_image = "exchangeclone_dark_matter_shears.png",
inventory_image = "exchangeclone_dark_matter_shears.png",
stack_max = 1,
groups = { tool=1, shears=1, dig_speed_class=7, disable_repair = 1, fire_immune = 1 },
groups = { tool=1, shears=1, dig_speed_class=7, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1},
tool_capabilities = {
full_punch_interval = 0.4,
max_drop_level=1,
@ -97,7 +97,7 @@ minetest.register_tool("exchangeclone:red_matter_shears", {
wield_image = "exchangeclone_red_matter_shears.png",
inventory_image = "exchangeclone_red_matter_shears.png",
stack_max = 1,
groups = { tool=1, shears=1, dig_speed_class=8, disable_repair = 1, fire_immune = 1 },
groups = { tool=1, shears=1, dig_speed_class=8, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1},
tool_capabilities = {
full_punch_interval = 0.3,
max_drop_level=1,

View File

@ -77,7 +77,7 @@ minetest.register_tool("exchangeclone:dark_matter_shovel", {
description = "Dark Matter Shovel",
wield_image = "exchangeclone_dark_matter_shovel.png",
inventory_image = "exchangeclone_dark_matter_shovel.png",
groups = { tool=1, shovel=1, dig_speed_class=7, enchantability=0, disable_repair = 1, fire_immune = 1 },
groups = { tool=1, shovel=1, dig_speed_class=7, enchantability=0, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1},
wield_scale = exchangeclone.wield_scale,
tool_capabilities = {
-- 1/1.2
@ -102,7 +102,7 @@ minetest.register_tool("exchangeclone:red_matter_shovel", {
description = "Red Matter Shovel",
wield_image = "exchangeclone_red_matter_shovel.png",
inventory_image = "exchangeclone_red_matter_shovel.png",
groups = { tool=1, shovel=1, dig_speed_class=8, enchantability=0, disable_repair = 1, fire_immune = 1 },
groups = { tool=1, shovel=1, dig_speed_class=8, enchantability=0, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1},
wield_scale = exchangeclone.wield_scale,
tool_capabilities = {
-- 1/1.2

View File

@ -151,7 +151,7 @@ end
local red_matter_sword_action = function(itemstack, player, pointed_thing)
local damage_all = itemstack:get_meta():get_int("exchangeclone_damage_all")
if not damage_all == 0 then damage_all = 1 end
if damage_all ~= 0 then damage_all = 1 end
if player:get_player_control().sneak then
if damage_all == 0 then
@ -173,7 +173,7 @@ minetest.register_tool("exchangeclone:dark_matter_sword", {
description = "Dark Matter Sword",
wield_image = "exchangeclone_dark_matter_sword.png",
inventory_image = "exchangeclone_dark_matter_sword.png",
groups = { tool=1, sword=1, dig_speed_class=7, enchantability=0, disable_repair = 1, fire_immune = 1 },
groups = { tool=1, sword=1, dig_speed_class=7, enchantability=0, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1},
wield_scale = exchangeclone.wield_scale,
tool_capabilities = {
-- 1/1.2
@ -198,7 +198,7 @@ minetest.register_tool("exchangeclone:red_matter_sword", {
description = "Red Matter Sword",
wield_image = "exchangeclone_red_matter_sword.png",
inventory_image = "exchangeclone_red_matter_sword.png",
groups = { tool=1, sword=1, dig_speed_class=8, enchantability=0, disable_repair = 1, fire_immune = 1 },
groups = { tool=1, sword=1, dig_speed_class=8, enchantability=0, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1},
wield_scale = exchangeclone.wield_scale,
tool_capabilities = {
-- 1/1.2

Binary file not shown.

After

Width:  |  Height:  |  Size: 666 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 689 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 645 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 767 B

532
tool_upgrades.lua Normal file
View File

@ -0,0 +1,532 @@
local width = (exchangeclone.mcl and 9) or 8
local upgrader_formspec =
"size["..tostring(width)..", 7]"..
"label[0.5,0.5;Upgrader]"..
"label["..tostring(width/3-0.5)..",0.5;Upgrade]"..
"list[context;fuel;"..tostring(width/3-0.5)..",1;1,1]"..
"label["..tostring(width/2-0.5)..",0.5;Tool/Armor]"..
"list[context;src;"..tostring(width/2-0.5)..",1;1,1]"..
"label["..tostring(2*width/3-0.5)..",0.5;Output]"..
"list[context;dst;"..tostring(2*width/3-0.5)..",1;1,1]"..
exchangeclone.inventory_formspec(0,2.75)..
"listring[current_player;main]"..
"listring[context;src]"..
"listring[current_player;main]"..
"listring[context;fuel]"..
"listring[current_player;main]"..
"listring[context;dst]"..
"listring[current_player;main]"
if exchangeclone.mcl then
upgrader_formspec = upgrader_formspec..
mcl_formspec.get_itemslot_bg(width/3-0.5,1,1,1)..
mcl_formspec.get_itemslot_bg(width/2-0.5,1,1,1)..
mcl_formspec.get_itemslot_bg(2*width/3-0.5,1,1,1)
end
function exchangeclone.enchant(itemstack, enchantment, level)
local enchantments = mcl_enchanting.get_enchantments(itemstack) or {}
if enchantments[enchantment] and enchantments[enchantment] == level then return false end
enchantments[enchantment] = level
mcl_enchanting.set_enchantments(itemstack, enchantments)
return itemstack
end
function exchangeclone.register_upgrade(itemstring, name, modifier, recipe, enchantment, level, upgradable_items)
minetest.register_craftitem(itemstring, {
description = name,
wield_image = "exchangeclone_upgrade.png"..modifier,
inventory_image = "exchangeclone_upgrade.png"..modifier,
groups = {exchangeclone_upgrade = 1},
enchantment = enchantment,
level = level,
upgradable_items = upgradable_items
})
minetest.register_craft({
output = itemstring,
recipe = recipe,
})
end
minetest.register_craft({
type = "fuel",
recipe = "group:exchangeclone_upgrade",
time = 10000
})
local function upgrader_action(pos)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
local upgrade = inv:get_stack("fuel", 1)
local tool = inv:get_stack("src", 1)
local dst = inv:get_stack("dst", 1)
if (not dst:is_empty())
or upgrade:is_empty()
or tool:is_empty() then
return
end
local upgrade_def = upgrade:get_definition()
if not upgrade_def.upgradable_items[tool:get_name()] then
local found = false
for item, _ in pairs(upgrade_def.upgradable_items) do
if item:sub(1,6) == "group:" and (minetest.get_item_group(tool:get_name(), item:sub(7,-1)) > 0) then
found = true
break
end
end
if not found then return end
end
local new_tool = exchangeclone.enchant(tool, upgrade_def.enchantment, upgrade_def.level)
if not new_tool then return end -- If the tool already has that enchantment
inv:set_stack("dst", 1, new_tool)
tool:set_count(tool:get_count() - 1)
if tool:get_count() == 0 then tool = ItemStack("") end
inv:set_stack("src", 1, tool)
upgrade:set_count(upgrade:get_count() - 1)
if upgrade:get_count() == 0 then upgrade = ItemStack("") end
inv:set_stack("fuel", 1, upgrade)
end
local function allow_metadata_inventory_put(pos, listname, index, stack, player)
if minetest.is_protected(pos, player:get_player_name()) then
return 0
end
if listname == "fuel" then
if minetest.get_item_group(stack:get_name(), "exchangeclone_upgrade") > 0 then
return stack:get_count()
else
return 0
end
elseif listname == "src" then
if minetest.get_item_group(stack:get_name(), "exchangeclone_upgradable") > 0 then
return stack:get_count()
else
return 0
end
elseif listname == "dst" then
return 0
end
end
local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
local stack = inv:get_stack(from_list, from_index)
return allow_metadata_inventory_put(pos, to_list, to_index, stack, player)
end
local function allow_metadata_inventory_take(pos, listname, index, stack, player)
if minetest.is_protected(pos, player:get_player_name()) then
return 0
end
return stack:get_count()
end
local after_dig_node = function(pos, oldnode, oldmetadata, player)
if exchangeclone.mcl then
local meta = minetest.get_meta(pos)
local meta2 = meta:to_table()
meta:from_table(oldmetadata)
local inv = meta:get_inventory()
for _, listname in ipairs({"fuel", "dst", "src"}) do
local stack = inv:get_stack(listname, 1)
if not stack:is_empty() then
local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5}
minetest.add_item(p, stack)
end
end
meta:from_table(meta2)
local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5}
end
end
local function on_blast(pos)
local drops = {}
exchangeclone.get_inventory_drops(pos, "src", drops)
exchangeclone.get_inventory_drops(pos, "fuel", drops)
exchangeclone.get_inventory_drops(pos, "dst", drops)
minetest.remove_node(pos)
return drops
end
local function can_dig(pos, player)
if exchangeclone.mcl then return true end
local meta = minetest.get_meta(pos);
local inv = meta:get_inventory()
return inv:is_empty("src") and inv:is_empty("fuel") and inv:is_empty("dst")
end
local function get_level(level)
if exchangeclone.mcl then
return nil
else
return level
end
end
minetest.register_node("exchangeclone:upgrader", {
description = "Upgrader",
tiles = {
"exchangeclone_upgrader_top.png",
"exchangeclone_upgrader_bottom.png",
"exchangeclone_upgrader_side.png",
},
on_construct = function(pos)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
inv:set_size("fuel", 1)
inv:set_size("src", 1)
inv:set_size("dst", 1)
meta:set_string("infotext", "Upgrader")
meta:set_string("formspec", upgrader_formspec)
end,
groups = {pickaxey=5, material_stone=1, cracky = 3, container = 4, level = get_level(4)}, --ridiculous workaround
allow_metadata_inventory_move = allow_metadata_inventory_move,
allow_metadata_inventory_take = allow_metadata_inventory_take,
allow_metadata_inventory_put = allow_metadata_inventory_put,
on_metadata_inventory_move = upgrader_action,
on_metadata_inventory_take = upgrader_action,
on_metadata_inventory_put = upgrader_action,
on_blast = on_blast,
after_dig_node = after_dig_node,
can_dig = can_dig,
_mcl_blast_resistance = 1500,
_mcl_hardness = 75,
})
minetest.register_craftitem("exchangeclone:blank_upgrade", {
description = "Blank Upgrade",
wield_image = "exchangeclone_upgrade.png",
inventory_image = "exchangeclone_upgrade.png",
})
minetest.register_craft({
output = "exchangeclone:blank_upgrade",
recipe = {
{"exchangeclone:dark_matter_block", "mcl_deepslate:tuff", "exchangeclone:dark_matter_block"}, -- Tuff has to be useful SOMEHOW...
{"mcl_deepslate:tuff", "exchangeclone:philosophers_stone", "mcl_deepslate:tuff"},
{"exchangeclone:red_matter_block", "mcl_deepslate:tuff", "exchangeclone:red_matter_block"}
},
replacements = {{"exchangeclone:philosophers_stone", "exchangeclone:philosophers_stone"}}
})
exchangeclone.register_upgrade(
"exchangeclone:fire_aspect_1_upgrade",
"Fire Aspect I Upgrade",
"^[multiply:#ff0000",
{
{"exchangeclone:dark_matter", "mcl_nether:magma", "exchangeclone:dark_matter"},
{"mcl_nether:magma", "exchangeclone:blank_upgrade", "mcl_nether:magma"},
{"exchangeclone:dark_matter", "mcl_nether:magma", "exchangeclone:dark_matter"},
},
"fire_aspect",
1,
{
["exchangeclone:dark_matter_sword"] = true,
["exchangeclone:red_matter_sword"] = true,
["exchangeclone:dark_matter_axe"] = true,
["exchangeclone:red_matter_axe"] = true,
["exchangeclone:red_katar"] = true,
["exchangeclone:red_katar_3x3"] = true,
}
)
exchangeclone.register_upgrade(
"exchangeclone:fire_aspect_2_upgrade",
"Fire Aspect II Upgrade",
"^[multiply:#ffaa00",
{
{"exchangeclone:dark_matter", "mcl_nether:magma", "exchangeclone:dark_matter"},
{"mcl_nether:magma", "exchangeclone:fire_aspect_1_upgrade", "mcl_nether:magma"},
{"exchangeclone:dark_matter", "mcl_nether:magma", "exchangeclone:dark_matter"},
},
"fire_aspect",
2,
{
["exchangeclone:dark_matter_sword"] = true,
["exchangeclone:red_matter_sword"] = true,
["exchangeclone:dark_matter_axe"] = true,
["exchangeclone:red_matter_axe"] = true,
["exchangeclone:red_katar"] = true,
["exchangeclone:red_katar_3x3"] = true,
}
)
exchangeclone.register_upgrade(
"exchangeclone:looting_1_upgrade",
"Looting I Upgrade",
"^[multiply:#33aa00",
{
{"exchangeclone:dark_matter", "mcl_mobitems:blaze_rod", "exchangeclone:dark_matter"},
{"mcl_mobitems:blaze_rod", "exchangeclone:blank_upgrade", "mcl_mobitems:blaze_rod"},
{"exchangeclone:dark_matter", "mcl_mobitems:blaze_rod", "exchangeclone:dark_matter"},
},
"looting",
1,
{
["exchangeclone:dark_matter_sword"] = true,
["exchangeclone:red_matter_sword"] = true,
["exchangeclone:dark_matter_axe"] = true,
["exchangeclone:red_matter_axe"] = true,
["exchangeclone:red_katar"] = true,
["exchangeclone:red_katar_3x3"] = true,
}
)
exchangeclone.register_upgrade(
"exchangeclone:looting_2_upgrade",
"Looting II Upgrade",
"^[multiply:#77ff00",
{
{"exchangeclone:dark_matter", "mcl_mobitems:blaze_rod", "exchangeclone:dark_matter"},
{"mcl_mobitems:blaze_rod", "exchangeclone:looting_1_upgrade", "mcl_mobitems:blaze_rod"},
{"exchangeclone:dark_matter", "mcl_mobitems:blaze_rod", "exchangeclone:dark_matter"},
},
"looting",
2,
{
["exchangeclone:dark_matter_sword"] = true,
["exchangeclone:red_matter_sword"] = true,
["exchangeclone:dark_matter_axe"] = true,
["exchangeclone:red_matter_axe"] = true,
["exchangeclone:red_katar"] = true,
["exchangeclone:red_katar_3x3"] = true,
}
)
exchangeclone.register_upgrade(
"exchangeclone:looting_3_upgrade",
"Looting III Upgrade",
"^[multiply:#ffff00",
{
{"exchangeclone:dark_matter", "mcl_mobitems:blaze_rod", "exchangeclone:dark_matter"},
{"mcl_mobitems:blaze_rod", "exchangeclone:looting_2_upgrade", "mcl_mobitems:blaze_rod"},
{"exchangeclone:dark_matter", "mcl_mobitems:blaze_rod", "exchangeclone:dark_matter"},
},
"looting",
3,
{
["exchangeclone:dark_matter_sword"] = true,
["exchangeclone:red_matter_sword"] = true,
["exchangeclone:dark_matter_axe"] = true,
["exchangeclone:red_matter_axe"] = true,
["exchangeclone:red_katar"] = true,
["exchangeclone:red_katar_3x3"] = true,
}
)
exchangeclone.register_upgrade(
"exchangeclone:thorns_1_upgrade",
"Thorns I Upgrade",
"^[multiply:#773300",
{
{"exchangeclone:dark_matter", "mcl_core:cactus", "exchangeclone:dark_matter"},
{"mcl_core:cactus", "exchangeclone:blank_upgrade", "mcl_core:cactus"},
{"exchangeclone:dark_matter", "mcl_core:cactus", "exchangeclone:dark_matter"},
},
"thorns",
1,
{
["group:dark_matter_armor"] = true,
["group:red_matter_armor"] = true,
}
)
exchangeclone.register_upgrade(
"exchangeclone:thorns_2_upgrade",
"Thorns II Upgrade",
"^[multiply:#441100",
{
{"exchangeclone:dark_matter", "mcl_core:cactus", "exchangeclone:dark_matter"},
{"mcl_core:cactus", "exchangeclone:thorns_1_upgrade", "mcl_core:cactus"},
{"exchangeclone:dark_matter", "mcl_core:cactus", "exchangeclone:dark_matter"},
},
"thorns",
2,
{
["group:dark_matter_armor"] = true,
["group:red_matter_armor"] = true,
}
)
exchangeclone.register_upgrade(
"exchangeclone:thorns_3_upgrade",
"Thorns III Upgrade",
"^[multiply:#220500",
{
{"exchangeclone:dark_matter", "mcl_core:cactus", "exchangeclone:dark_matter"},
{"mcl_core:cactus", "exchangeclone:thorns_2_upgrade", "mcl_core:cactus"},
{"exchangeclone:dark_matter", "mcl_core:cactus", "exchangeclone:dark_matter"},
},
"thorns",
3,
{
["group:dark_matter_armor"] = true,
["group:red_matter_armor"] = true,
}
)
exchangeclone.register_upgrade(
"exchangeclone:frost_walker_1_upgrade",
"Frost Walker I Upgrade",
"^[multiply:#77aaff",
{
{"exchangeclone:dark_matter", "mcl_core:packed_ice", "exchangeclone:dark_matter"},
{"mcl_core:packed_ice", "exchangeclone:blank_upgrade", "mcl_core:packed_ice"},
{"exchangeclone:dark_matter", "mcl_core:packed_ice", "exchangeclone:dark_matter"},
},
"frost_walker",
1,
{
["exchangeclone:boots_dark_matter"] = true,
["exchangeclone:boots_red_matter"] = true,
}
)
exchangeclone.register_upgrade(
"exchangeclone:frost_walker_2_upgrade",
"Frost Walker II Upgrade",
"^[multiply:#77ffff",
{
{"exchangeclone:dark_matter", "mcl_core:packed_ice", "exchangeclone:dark_matter"},
{"mcl_core:packed_ice", "exchangeclone:frost_walker_1_upgrade", "mcl_core:packed_ice"},
{"exchangeclone:dark_matter", "mcl_core:packed_ice", "exchangeclone:dark_matter"},
},
"frost_walker",
2,
{
["exchangeclone:boots_dark_matter"] = true,
["exchangeclone:boots_red_matter"] = true,
}
)
exchangeclone.register_upgrade(
"exchangeclone:silk_touch_upgrade",
"Silk Touch Upgrade",
"^[brighten",
{
{"exchangeclone:dark_matter", "mcl_core:cobweb", "exchangeclone:dark_matter"},
{"mcl_core:cobweb", "exchangeclone:blank_upgrade", "mcl_core:cobweb"},
{"exchangeclone:dark_matter", "mcl_core:cobweb", "exchangeclone:dark_matter"},
},
"silk_touch",
1,
{
["exchangeclone:dark_matter_sword"] = true,
["exchangeclone:red_matter_sword"] = true,
["exchangeclone:dark_matter_axe"] = true,
["exchangeclone:red_matter_axe"] = true,
["exchangeclone:dark_matter_shovel"] = true,
["exchangeclone:red_matter_shovel"] = true,
["exchangeclone:dark_matter_shears"] = true,
["exchangeclone:red_matter_shears"] = true,
["group:dark_matter_pickaxe"] = true,
["group:red_matter_pickaxe"] = true,
["group:dark_matter_hoe"] = true,
["group:red_matter_hoe"] = true,
["group:dark_matter_hammer"] = true,
["group:red_matter_hammer"] = true,
["group:red_katar"] = true,
["group:red_morningstar"] = true,
}
)
exchangeclone.register_upgrade(
"exchangeclone:fortune_1_upgrade",
"Fortune I Upgrade",
"^[multiply:#ff00ff",
{
{"exchangeclone:dark_matter", "mcl_core:diamond", "exchangeclone:dark_matter"},
{"mcl_core:diamond", "exchangeclone:blank_upgrade", "mcl_core:diamond"},
{"exchangeclone:dark_matter", "mcl_core:diamond", "exchangeclone:dark_matter"},
},
"fortune",
1,
{
["exchangeclone:dark_matter_sword"] = true,
["exchangeclone:red_matter_sword"] = true,
["exchangeclone:dark_matter_axe"] = true,
["exchangeclone:red_matter_axe"] = true,
["exchangeclone:dark_matter_shovel"] = true,
["exchangeclone:red_matter_shovel"] = true,
["exchangeclone:dark_matter_shears"] = true,
["exchangeclone:red_matter_shears"] = true,
["group:dark_matter_pickaxe"] = true,
["group:red_matter_pickaxe"] = true,
["group:dark_matter_hoe"] = true,
["group:red_matter_hoe"] = true,
["group:dark_matter_hammer"] = true,
["group:red_matter_hammer"] = true,
["group:red_katar"] = true,
["group:red_morningstar"] = true,
}
)
exchangeclone.register_upgrade(
"exchangeclone:fortune_2_upgrade",
"Fortune II Upgrade",
"^[multiply:#aa00ff",
{
{"exchangeclone:dark_matter", "mcl_core:diamond", "exchangeclone:dark_matter"},
{"mcl_core:diamond", "exchangeclone:fortune_1_upgrade", "mcl_core:diamond"},
{"exchangeclone:dark_matter", "mcl_core:diamond", "exchangeclone:dark_matter"},
},
"fortune",
2,
{
["exchangeclone:dark_matter_sword"] = true,
["exchangeclone:red_matter_sword"] = true,
["exchangeclone:dark_matter_axe"] = true,
["exchangeclone:red_matter_axe"] = true,
["exchangeclone:dark_matter_shovel"] = true,
["exchangeclone:red_matter_shovel"] = true,
["exchangeclone:dark_matter_shears"] = true,
["exchangeclone:red_matter_shears"] = true,
["group:dark_matter_pickaxe"] = true,
["group:red_matter_pickaxe"] = true,
["group:dark_matter_hoe"] = true,
["group:red_matter_hoe"] = true,
["group:dark_matter_hammer"] = true,
["group:red_matter_hammer"] = true,
["group:red_katar"] = true,
["group:red_morningstar"] = true,
}
)
exchangeclone.register_upgrade(
"exchangeclone:fortune_3_upgrade",
"Fortune III Upgrade",
"^[multiply:#7700ff",
{
{"exchangeclone:dark_matter", "mcl_core:diamond", "exchangeclone:dark_matter"},
{"mcl_core:diamond", "exchangeclone:fortune_2_upgrade", "mcl_core:diamond"},
{"exchangeclone:dark_matter", "mcl_core:diamond", "exchangeclone:dark_matter"},
},
"fortune",
3,
{
["exchangeclone:dark_matter_sword"] = true,
["exchangeclone:red_matter_sword"] = true,
["exchangeclone:dark_matter_axe"] = true,
["exchangeclone:red_matter_axe"] = true,
["exchangeclone:dark_matter_shovel"] = true,
["exchangeclone:red_matter_shovel"] = true,
["exchangeclone:dark_matter_shears"] = true,
["exchangeclone:red_matter_shears"] = true,
["group:dark_matter_pickaxe"] = true,
["group:red_matter_pickaxe"] = true,
["group:dark_matter_hoe"] = true,
["group:red_matter_hoe"] = true,
["group:dark_matter_hammer"] = true,
["group:red_matter_hammer"] = true,
["group:red_katar"] = true,
["group:red_morningstar"] = true,
}
)