diff --git a/README.md b/README.md index fb3d307..4b11cf4 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ If you have a suggestion or notice a bug, visit the [GitHub issues page](https:/ ![Minetest Game Screenshot](screenshot_mtg.png) ## Sources/license: -This mod is inspired by the "Equivalent Exchange" mod for MineCraft, and forked and modified from Enchant97's mod [Element Exchange](https://github.com/enchant97/minetest_element_exchange). Both this mod and Element Exchange are licensed under GPLv3+. The textures for the Constructor, Deconstructor, Collector, and Orb are from Element Exchange and have the same license. The texture for the Philosopher's Stone is my own and also licensed under GPLv3+ just to make things easy. +This mod is inspired by the "Equivalent Exchange" mod for MineCraft, and forked and modified from Enchant97's mod [Element Exchange](https://github.com/enchant97/minetest_element_exchange). Both this mod and Element Exchange are licensed under GPLv3+. The textures for the Constructor, Deconstructor, Collector, and Orb are from Element Exchange and have the same license.The Alchemical Coal, Mobius Fuel, and Aeternalis Fuel textures are modified versions of MineClone's coal texture (CC-BY-SA-3.0). All other textures are my own (inspired by Equivalent Exchange) and licensed under GPLv3+ just to make it match Element Exchange. Copyright (C) 2023 ThePython10110 diff --git a/changelog.txt b/changelog.txt index f3f2e61..53bfcee 100644 --- a/changelog.txt +++ b/changelog.txt @@ -24,6 +24,9 @@ 2.1 The Energy Collector setting is now energy/second instead of second/energy to fit much higher costs than Element Exchange (default is 5 energy/s). Fixed Exchange Orb energy value (forgot to change it after changing the recipe) + PS's enchanting table now is limited to 10-bookshelf enchantments to make it more balanced. + Added Alchemical Coal, Mobius Fuel, Aeternalis Fuel, Dark Matter, and Red Matter + Added Dark Matter sword, pickaxe, axe, shovel, hoe, and shears Changed constructor, deconstructor, and collector recipes and energy values to make them cheaper The Constructor, Deconstructor, and Energy Collector are now not unbreakable in MineClone (I really should test in survival). The Energy Collector now drops its contents when broken in MineClone. @@ -33,4 +36,4 @@ Tuff, blackstone, and basalt are now transmutable (MineClone). A couple of minor transmutation changes (MineClone). Changed emerald value to 4096 (MineClone). - Gold cannot be crafted into diamonds using the PS; it can now be crafted into emeralds and emeralds into diamonds (MineClone). \ No newline at end of file + Gold cannot be crafted into diamonds using the PS; it can now be crafted into emeralds and emeralds into diamonds (MineClone). diff --git a/constructor.lua b/constructor.lua index 48d7ccb..00cdccc 100644 --- a/constructor.lua +++ b/constructor.lua @@ -1,3 +1,5 @@ +local sound_mod = mcl_sounds or default + function get_element_constructor_formspec() if not exchangeclone.mineclone then local formspec = { @@ -167,7 +169,7 @@ minetest.register_node("exchangeclone:element_constructor", { groups = {cracky = 2, container = 4, pickaxey = 2}, _mcl_hardness = 3, _mcl_blast_resistance = 6, - sounds = mcl_sounds.node_sound_metal_defaults(), + sounds = sound_mod.node_sound_metal_defaults(), is_ground_content = false, can_dig = can_dig, after_dig_node = function(pos, oldnode, oldmetadata, digger) diff --git a/craftitems.lua b/craftitems.lua new file mode 100644 index 0000000..340b601 --- /dev/null +++ b/craftitems.lua @@ -0,0 +1,144 @@ +local sound_mod = mcl_sounds or default + +local function get_level(level) + if exchangeclone.mineclone then + return nil + else + return level + end +end + +minetest.register_craftitem("exchangeclone:alchemical_coal", { + description = "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", + wield_image = "exchangeclone_mobius_fuel.png", + inventory_image = "exchangeclone_mobius_fuel.png", + groups = { craftitem=1}, +}) + +minetest.register_craftitem("exchangeclone:aeternalis_fuel", { + description = "Aeternalis Fuel", + wield_image = "exchangeclone_aeternalis_fuel.png", + inventory_image = "exchangeclone_aeternalis_fuel.png", + groups = { craftitem=1}, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "exchangeclone:alchemical_coal", + burntime = 320, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "exchangeclone:mobius_fuel", + burntime = 1280, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "exchangeclone:aeternalis_fuel", + burntime = 5120, +}) + +minetest.register_craftitem("exchangeclone:dark_matter", { + description = "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", + 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", + tiles = {"exchangeclone_dark_matter_block.png"}, + is_ground_content = false, + light_source = 10, + sounds = sound_mod.node_sound_stone_defaults(), + groups = {pickaxey=5, material_stone=1, cracky = 3, level = get_level(4)}, --ridiculous workaround + _mcl_blast_resistance = 1500, + _mcl_hardness = 75, +}) + +minetest.register_node("exchangeclone:red_matter_block", { + description = "Red Matter Block", + tiles = {"exchangeclone_red_matter_block.png"}, + is_ground_content = false, + light_source = 14, + sounds = sound_mod.node_sound_stone_defaults(), + -- TODO: Change level to 5 when adding Red Matter tools + groups = {pickaxey=5, material_stone=1, cracky = 3, level = get_level(4)}, + _mcl_blast_resistance = 1500, + _mcl_hardness = 100, +}) + +minetest.register_craft({ + output = "exchangeclone:dark_matter", + recipe = { + {"exchangeclone:aeternalis_fuel", "exchangeclone:aeternalis_fuel", "exchangeclone:aeternalis_fuel"}, + {"exchangeclone:aeternalis_fuel", "mcl_core:diamondblock", "exchangeclone:aeternalis_fuel"}, + {"exchangeclone:aeternalis_fuel", "exchangeclone:aeternalis_fuel", "exchangeclone:aeternalis_fuel"} + } +}) + +minetest.register_craft({ + output = "exchangeclone:dark_matter", + recipe = { + {"exchangeclone:aeternalis_fuel", "exchangeclone:aeternalis_fuel", "exchangeclone:aeternalis_fuel"}, + {"exchangeclone:aeternalis_fuel", "default:diamondblock", "exchangeclone:aeternalis_fuel"}, + {"exchangeclone:aeternalis_fuel", "exchangeclone:aeternalis_fuel", "exchangeclone:aeternalis_fuel"} + } +}) + +minetest.register_craft({ + output = "exchangeclone:red_matter", + recipe = { + {"exchangeclone:aeternalis_fuel", "exchangeclone:aeternalis_fuel", "exchangeclone:aeternalis_fuel"}, + {"exchangeclone:dark_matter", "exchangeclone:dark_matter", "exchangeclone:dark_matter"}, + {"exchangeclone:aeternalis_fuel", "exchangeclone:aeternalis_fuel", "exchangeclone:aeternalis_fuel"} + } +}) + +minetest.register_craft({ + output = "exchangeclone:dark_matter_block 4", + recipe = { + {"exchangeclone:dark_matter", "exchangeclone:dark_matter"}, + {"exchangeclone:dark_matter", "exchangeclone:dark_matter"} + } +}) + +minetest.register_craft({ + output = "exchangeclone:red_matter_block 4", + recipe = { + {"exchangeclone:red_matter", "exchangeclone:red_matter"}, + {"exchangeclone:red_matter", "exchangeclone:red_matter"} + } +}) + +minetest.register_craft({ + output = "exchangeclone:dark_matter 4", + recipe = { + {"exchangeclone:dark_matter_block","exchangeclone:dark_matter_block}"}, + {"exchangeclone:dark_matter_block","exchangeclone:dark_matter_block}"} + } +}) + +minetest.register_craft({ + output = "exchangeclone:red_matter 4", + recipe = { + {"exchangeclone:red_matter_block","exchangeclone:red_matter_block}"}, + {"exchangeclone:red_matter_block","exchangeclone:red_matter_block}"} + } +}) \ No newline at end of file diff --git a/dark_and_red_tools.lua b/dark_and_red_tools.lua new file mode 100644 index 0000000..726cc04 --- /dev/null +++ b/dark_and_red_tools.lua @@ -0,0 +1,229 @@ +local wield_scale +if exchangeclone.mineclone then + local wield_scale = mcl_vars.tool_wield_scale +else + local wield_scale = {x=1,y=1,z=1} +end + +local make_grass_path +local make_stripped_trunk +if exchangeclone.mineclone then + make_grass_path = function(itemstack, placer, pointed_thing) + -- Use pointed node's on_rightclick function first, if present + local node = minetest.get_node(pointed_thing.under) + if placer and not placer:get_player_control().sneak then + if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then + return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, placer, itemstack) or itemstack + end + end + + -- Only make grass path if tool used on side or top of target node + if pointed_thing.above.y < pointed_thing.under.y then + return itemstack + end + + if (minetest.get_item_group(node.name, "path_creation_possible") == 1) then + local above = table.copy(pointed_thing.under) + above.y = above.y + 1 + if minetest.get_node(above).name == "air" then + if minetest.is_protected(pointed_thing.under, placer:get_player_name()) then + minetest.record_protection_violation(pointed_thing.under, placer:get_player_name()) + return itemstack + end + + if not minetest.is_creative_enabled(placer:get_player_name()) then + -- Add wear (as if digging a shovely node) + local toolname = itemstack:get_name() + local wear = mcl_autogroup.get_wear(toolname, "shovely") + if wear then + itemstack:add_wear(wear) + end + end + minetest.sound_play({name="default_grass_footstep", gain=1}, {pos = above}, true) + minetest.swap_node(pointed_thing.under, {name="mcl_core:grass_path"}) + end + end + return itemstack + end + + make_stripped_trunk = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then return end + + local node = minetest.get_node(pointed_thing.under) + local node_name = minetest.get_node(pointed_thing.under).name + + local noddef = minetest.registered_nodes[node_name] + + if not noddef then + minetest.log("warning", "Trying to right click with an axe the unregistered node: " .. tostring(node_name)) + return + end + + if not placer:get_player_control().sneak and noddef.on_rightclick then + return minetest.item_place(itemstack, placer, pointed_thing) + end + if minetest.is_protected(pointed_thing.under, placer:get_player_name()) then + minetest.record_protection_violation(pointed_thing.under, placer:get_player_name()) + return itemstack + end + + if noddef._mcl_stripped_variant == nil then + return itemstack + else + minetest.swap_node(pointed_thing.under, {name=noddef._mcl_stripped_variant, param2=node.param2}) + if not minetest.is_creative_enabled(placer:get_player_name()) then + -- Add wear (as if digging a axey node) + local toolname = itemstack:get_name() + local wear = mcl_autogroup.get_wear(toolname, "axey") + if wear then + itemstack:add_wear(wear) + end + end + end + return itemstack + end +end + +local carve_pumpkin +if minetest.get_modpath("mcl_farming") then + carve_pumpkin = function(itemstack, placer, pointed_thing) + -- Use pointed node's on_rightclick function first, if present + local node = minetest.get_node(pointed_thing.under) + if placer and not placer:get_player_control().sneak then + if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then + return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, placer, itemstack) or itemstack + end + end + + -- Only carve pumpkin if used on side + if pointed_thing.above.y ~= pointed_thing.under.y then + return + end + if node.name == "mcl_farming:pumpkin" then + if not minetest.is_creative_enabled(placer:get_player_name()) then + -- Add wear (as if digging a shearsy node) + local toolname = itemstack:get_name() + local wear = mcl_autogroup.get_wear(toolname, "shearsy") + if wear then + itemstack:add_wear(wear) + end + + end + minetest.sound_play({name="default_grass_footstep", gain=1}, {pos = pointed_thing.above}, true) + local dir = vector.subtract(pointed_thing.under, pointed_thing.above) + local param2 = minetest.dir_to_facedir(dir) + minetest.set_node(pointed_thing.under, {name="mcl_farming:pumpkin_face", param2 = param2}) + minetest.add_item(pointed_thing.above, "mcl_farming:pumpkin_seeds 4") + end + return itemstack + end +end + +minetest.register_tool("exchangeclone:pick_dark_matter", { + description = "Dark Matter Pickaxe\nImage coming soon.", + groups = { tool=1, pickaxe=1, dig_speed_class=7, enchantability=0 }, + wield_scale = wield_scale, + tool_capabilities = { + -- 1/1.2 + full_punch_interval = 0.5, + max_drop_level=5, + damage_groups = {fleshy=7}, + punch_attack_uses = 0, + groupcaps={ + cracky = {times={[1]=1.5, [2]=0.75, [3]=0.325}, uses=0, maxlevel=4}, + }, + }, + sound = { breaks = "default_tool_breaks" }, + _mcl_toollike_wield = true, + _mcl_diggroups = { + pickaxey = { speed = 16, level = 7, uses = 0 } + }, +}) + +minetest.register_tool("exchangeclone:shovel_dark_matter", { + description = "Dark Matter Shovel\nImage coming soon.", + groups = { tool=1, shovel=1, dig_speed_class=7, enchantability=0 }, + wield_scale = wield_scale, + tool_capabilities = { + -- 1/1.2 + full_punch_interval = 0.5, + max_drop_level=5, + damage_groups = {fleshy=7}, + punch_attack_uses = 0, + groupcaps={ + crumbly = {times={[1]=0.9, [2]=0.45, [3]=0.225}, uses=0, maxlevel=4}, + }, + }, + sound = { breaks = "default_tool_breaks" }, + on_place = make_grass_path, + _mcl_toollike_wield = true, + _mcl_diggroups = { + shovely = { speed = 16, level = 7, uses = 0 } + }, +}) + +minetest.register_tool("exchangeclone:axe_dark_matter", { + description = "Dark Matter Axe\nImage coming soon.", + groups = { tool=1, axe=1, dig_speed_class=7, enchantability=0 }, + wield_scale = wield_scale, + tool_capabilities = { + -- 1/1.2 + full_punch_interval = 0.5, + max_drop_level=5, + damage_groups = {fleshy=16}, + punch_attack_uses = 0, + groupcaps={ + choppy = {times={[1]=1.5, [2]=0.75, [3]=0.38}, uses=0, maxlevel=4}, + }, + }, + sound = { breaks = "default_tool_breaks" }, + on_place = make_stripped_trunk, + _mcl_toollike_wield = true, + _mcl_diggroups = { + axey = { speed = 16, level = 7, uses = 0 } + }, +}) + +minetest.register_tool("exchangeclone:sword_dark_matter", { + description = "Dark Matter Sword\nImage coming soon.", + groups = { tool=1, sword=1, dig_speed_class=7, enchantability=0 }, + wield_scale = wield_scale, + tool_capabilities = { + -- 1/1.2 + full_punch_interval = 0.25, + max_drop_level=5, + damage_groups = {fleshy=14}, + punch_attack_uses = 0, + groupcaps={ + snappy = {times={[1]=0.95, [2]=0.45, [3]=0.15}, uses=0, maxlevel=4}, + }, + }, + sound = { breaks = "default_tool_breaks" }, + _mcl_toollike_wield = true, + _mcl_diggroups = { + swordy = { speed = 16, level = 7, uses = 0 } + }, +}) + +local diamond_itemstring = "default:diamond" +if exchangeclone.mineclone then + diamond_itemstring = "mcl_core:diamond" +end + +minetest.register_craft({ + output = "exchangeclone:shovel_dark_matter", + recipe = { + {"", "exchangeclone:dark_matter", ""}, + {"", diamond_itemstring, ""}, + {"", diamond_itemstring, ""} + } +}) + +minetest.register_craft({ + output = "exchangeclone:pick_dark_matter", + recipe = { + {"exchangeclone:dark_matter", "exchangeclone:dark_matter", "exchangeclone:dark_matter"}, + {"", diamond_itemstring, ""}, + {"", diamond_itemstring, ""} + } +}) \ No newline at end of file diff --git a/deconstructor.lua b/deconstructor.lua index 3351c12..2e23c70 100644 --- a/deconstructor.lua +++ b/deconstructor.lua @@ -1,3 +1,5 @@ +local sound_mod = mcl_sounds or default + --Renamed "fuel" inventory to "main" to (almost) work with hoppers function get_element_deconstructor_formspec() @@ -148,7 +150,7 @@ minetest.register_node("exchangeclone:element_deconstructor", { groups = {cracky = 2, container = 3, pickaxey = 2}, _mcl_hardness = 3, _mcl_blast_resistance = 6, - sounds = mcl_sounds.node_sound_metal_defaults(), + sounds = sound_mod.node_sound_metal_defaults(), is_ground_content = false, can_dig = can_dig, after_dig_node = function(pos, oldnode, oldmetadata, digger) diff --git a/energy.lua b/energy.lua index 4d92758..34c853a 100644 --- a/energy.lua +++ b/energy.lua @@ -6,6 +6,13 @@ exchangeclone.mtg_energy_values = { element_constructor = 92168, energy_collector = 23901, philosophers_stone = 9984, + alchemical_coal = 512, + mobius_fuel = 2048, + aeternalis_fuel = 8192, + dark_matter = 139264, + dark_matter_block = 139264, + red_matter = 466944, + red_matter_block = 466944, }, ["beds"] = { bed_bottom = 168, @@ -310,6 +317,13 @@ exchangeclone.mcl_energy_values = { energy_collector = 23883, orb = 33792, philosophers_stone = 9984, + alchemical_coal = 512, + mobius_fuel = 2048, + aeternalis_fuel = 8192, + dark_matter = 139264, + dark_matter_block = 139264, + red_matter = 466944, + red_matter_block = 466944, }, ["mcl_core"] = { stonebrickmossy = 9, diff --git a/energy_collector.lua b/energy_collector.lua index 8eb8d2f..d1966bd 100644 --- a/energy_collector.lua +++ b/energy_collector.lua @@ -1,3 +1,5 @@ +local sound_mod = mcl_sounds or default + local function get_energy_collector_formspec() if not exchangeclone.mineclone then local formspec = { @@ -136,7 +138,7 @@ minetest.register_node("exchangeclone:energy_collector", { groups = {cracky = 2, container = 2, pickaxey = 2}, _mcl_hardness = 3, _mcl_blast_resistance = 6, - sounds = mcl_sounds.node_sound_metal_defaults(), + sounds = sound_mod.node_sound_metal_defaults(), is_ground_content = false, can_dig = can_dig, on_timer = on_timer, diff --git a/init.lua b/init.lua index 94b86b7..b2b884d 100644 --- a/init.lua +++ b/init.lua @@ -29,5 +29,7 @@ dofile(default_path.."/constructor.lua") dofile(default_path.."/deconstructor.lua") dofile(default_path.."/energy_collector.lua") dofile(default_path.."/orb.lua") +dofile(default_path.."/craftitems.lua") +dofile(default_path.."/dark_and_red_tools.lua") dofile(default_path.."/philosophers_stone.lua") dofile(default_path.."/energy.lua") \ No newline at end of file diff --git a/philosophers_stone.lua b/philosophers_stone.lua index 96c6d46..84f5472 100644 --- a/philosophers_stone.lua +++ b/philosophers_stone.lua @@ -1,6 +1,6 @@ local function show_enchanting(player) local player_meta = player:get_meta() - player_meta:set_int("mcl_enchanting:num_bookshelves", 15) + player_meta:set_int("mcl_enchanting:num_bookshelves", 10) player_meta:set_string("mcl_enchanting:table_name", "Enchanting Table") mcl_enchanting.show_enchanting_formspec(player) end @@ -666,4 +666,96 @@ minetest.register_craft({ "mcl_core:lapis", }, replacements = {{"exchangeclone:philosophers_stone", "exchangeclone:philosophers_stone"}} +}) + +minetest.register_craft({ + output = "exchangeclone:alchemical_coal", + type = "shapeless", + recipe = { + "exchangeclone:philosophers_stone", + "mcl_core:coal_lump", + "mcl_core:coal_lump", + "mcl_core:coal_lump", + "mcl_core:coal_lump", + }, + replacements = {{"exchangeclone:philosophers_stone", "exchangeclone:philosophers_stone"}} +}) + +minetest.register_craft({ + output = "exchangeclone:alchemical_coal", + type = "shapeless", + recipe = { + "exchangeclone:philosophers_stone", + "default:coal_lump", + "default:coal_lump", + "default:coal_lump", + "default:coal_lump", + }, + replacements = {{"exchangeclone:philosophers_stone", "exchangeclone:philosophers_stone"}} +}) + +minetest.register_craft({ + output = "default:coal_lump 4", + type = "shapeless", + recipe = { + "exchangeclone:philosophers_stone", + "exchangeclone:alchemical_coal", + }, + replacements = {{"exchangeclone:philosophers_stone", "exchangeclone:philosophers_stone"}} +}) + +minetest.register_craft({ + output = "mcl_core:coal_lump 4", + type = "shapeless", + recipe = { + "exchangeclone:philosophers_stone", + "exchangeclone:alchemical_coal", + }, + replacements = {{"exchangeclone:philosophers_stone", "exchangeclone:philosophers_stone"}} +}) + +minetest.register_craft({ + output = "exchangeclone:mobius_fuel", + type = "shapeless", + recipe = { + "exchangeclone:philosophers_stone", + "exchangeclone:alchemical_coal", + "exchangeclone:alchemical_coal", + "exchangeclone:alchemical_coal", + "exchangeclone:alchemical_coal", + }, + replacements = {{"exchangeclone:philosophers_stone", "exchangeclone:philosophers_stone"}} +}) + +minetest.register_craft({ + output = "exchangeclone:alchemical_coal 4", + type = "shapeless", + recipe = { + "exchangeclone:philosophers_stone", + "exchangeclone:mobius_fuel", + }, + replacements = {{"exchangeclone:philosophers_stone", "exchangeclone:philosophers_stone"}} +}) + +minetest.register_craft({ + output = "exchangeclone:aeternalis_fuel", + type = "shapeless", + recipe = { + "exchangeclone:philosophers_stone", + "exchangeclone:mobius_fuel", + "exchangeclone:mobius_fuel", + "exchangeclone:mobius_fuel", + "exchangeclone:mobius_fuel", + }, + replacements = {{"exchangeclone:philosophers_stone", "exchangeclone:philosophers_stone"}} +}) + +minetest.register_craft({ + output = "exchangeclone:mobius_fuel 4", + type = "shapeless", + recipe = { + "exchangeclone:philosophers_stone", + "exchangeclone:aeternalis_fuel", + }, + replacements = {{"exchangeclone:philosophers_stone", "exchangeclone:philosophers_stone"}} }) \ No newline at end of file diff --git a/textures/exchangeclone_aeternalis_fuel.png b/textures/exchangeclone_aeternalis_fuel.png new file mode 100644 index 0000000..a05bee3 Binary files /dev/null and b/textures/exchangeclone_aeternalis_fuel.png differ diff --git a/textures/exchangeclone_alchemical_coal.png b/textures/exchangeclone_alchemical_coal.png new file mode 100644 index 0000000..8d5f710 Binary files /dev/null and b/textures/exchangeclone_alchemical_coal.png differ diff --git a/textures/exchangeclone_dark_matter.png b/textures/exchangeclone_dark_matter.png new file mode 100644 index 0000000..7e9d848 Binary files /dev/null and b/textures/exchangeclone_dark_matter.png differ diff --git a/textures/exchangeclone_dark_matter_block.png b/textures/exchangeclone_dark_matter_block.png new file mode 100644 index 0000000..5b3bb27 Binary files /dev/null and b/textures/exchangeclone_dark_matter_block.png differ diff --git a/textures/exchangeclone_mobius_fuel.png b/textures/exchangeclone_mobius_fuel.png new file mode 100644 index 0000000..1af3dde Binary files /dev/null and b/textures/exchangeclone_mobius_fuel.png differ diff --git a/textures/exchangeclone_red_matter.png b/textures/exchangeclone_red_matter.png new file mode 100644 index 0000000..ba8f43b Binary files /dev/null and b/textures/exchangeclone_red_matter.png differ diff --git a/textures/exchangeclone_red_matter_block.png b/textures/exchangeclone_red_matter_block.png new file mode 100644 index 0000000..9a621e7 Binary files /dev/null and b/textures/exchangeclone_red_matter_block.png differ