Technic works, hoppers don't yet

This commit is contained in:
ThePython 2023-11-12 17:30:16 -08:00
parent 15645ebeec
commit 3c8345da1b
17 changed files with 234 additions and 68 deletions

View File

@ -30,6 +30,7 @@ read_globals = {
"screwdriver", "screwdriver",
"mcl_crafting_table", "mcl_crafting_table",
"mcl_enchantments", "mcl_enchantments",
"technic",
"Raycast", "Raycast",
"Settings", "Settings",

View File

@ -1,5 +1,5 @@
# Code of Conduct # Code of Conduct
Don't be evil. Don't be evil.
That's it. That's it.

View File

@ -3,4 +3,6 @@ If you want to contribute, please do so, either through issues or pull requests.
Feel free to report any problems or suggestions (including things as small as typos). If you know how to fix it, a PR would be even more useful. Feel free to report any problems or suggestions (including things as small as typos). If you know how to fix it, a PR would be even more useful.
Please follow the [Code of Conduct](CODE_OF_CONDUCT.md) when contributing. Translations and textures are also welcome! I don't really like the textures for a lot of things. Mostly the nodes, but textures for the tools that don't look quite so similar to EE2/ProjectE would be nice.
Please follow the [Code of Conduct](CODE_OF_CONDUCT.md) when contributing.

View File

@ -56,28 +56,38 @@ Dependencies: Minetest Game or MineClone.
<details><summary><h1>Changelog:</h1></summary> <details><summary><h1>Changelog:</h1></summary>
### 6.0 ### 6.0 (interestingness depends on several things)
* New Features: * New Features:
* Automatically generated energy values! Based on crafting and cooking recipes. * Automatically generated energy values! Based on crafting and cooking recipes.
* For reasons beyond my control, things kind of vary a bit between loads because of which items are added to the list first (which is kind of random). For instance, the Lookup Tool in MineClone2 might sometimes have an energy value of 5 (1 stick + 1 glass) or 16 (4 sticks) depending on whether the energy value for glass is added first or not. At least, I assume that's the reason. * For reasons beyond my control, things kind of vary a bit between loads because of which items are added to the `minetest.registered_items` first (which is kind of random). For instance, the Lookup Tool in MineClone2 might sometimes have an energy value of 5 (1 stick + 1 glass) or 16 (4 sticks) depending on whether the energy value for glass is added first or not. At least, I assume that's the reason.
* Depending on the number of items you have, this could increase loading time.
* 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) * Infinite food (costs 64 energy to use, equal to steak)
* Alchemical Chest * Alchemical Chest
* Repair Talisman (maybe, would only work in Alchemical Chest) * 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) * Covalence Dust (Aux1+right-click with Philosopher's Stone to open repairer, only tools with an energy value can be repaired)
* Mind, Life, Body, and Soul Stones (although MTG only has the soul stone). * Mind, Life, Body, and Soul Stones (although MTG only has the soul stone).
* Mercurial Eye (maybe) * Mercurial Eye (maybe)
* Chat commands to set/add/remove energy from a player (requires `privs` privilege):
* `/add_energy [player] value` (player defaults to self, value can be negative)
* `/set_energy [player] value` (player defaults to self)
* Changes: * Changes:
* Energy values are now in `_exchangeclone_energy/energy_values.lua`, and are laid out differently, and aliases now work. * 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. * 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 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 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.
* Tools that break multiple nodes at once (hammer, hoe, pickaxe, morningstar, and katar) use a better method that may (?) slightly decrease lag. * 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. * Ender pearls can now be crafted with 4 iron and the Philosopher's Stone.
* A couple changes the Philosopher's Stone's transmutation: * A couple changes the Philosopher's Stone's transmutation:
* Ice and obsidian can now be transmuted into water and lava, respectively. * Ice and obsidian can now be transmuted into water and lava, respectively.
* It is now impossible to transmute between bedrock and barriers (MCL). I don't know why I did it in the first place :D * It is now impossible to transmute between bedrock and barriers (MCL). I thought it was funny originally, but now I'm realizing that I don't want this to be annoying to people who run servers (are there any servers with this mod?)
* It now costs 4 dark/red matter to make a block, which is great news if you already have some (because they're now worth more), but not so great if you don't.
* Tool abilities now cost nothing (to match ProjectE).
* Bugfixes: * Bugfixes:
* Fixed potion energy values * Fixed potion energy values
* Fixed Red Matter Shield recipe
### 5.3 ### 5.3
* Bugfixes * Bugfixes
@ -99,7 +109,7 @@ Dependencies: Minetest Game or MineClone.
* Bugfixes: * Bugfixes:
* Fixed Mineclonia energy values (I foolishly assumed that all items would have the same itemstrings and groups, thanks @Ranko-Saotome for reporting this). * Fixed Mineclonia energy values (I foolishly assumed that all items would have the same itemstrings and groups, thanks @Ranko-Saotome for reporting this).
### 5.0 (the most insteresting release so far) ### 5.0 (bigger release than any before it)
**You MUST break and replace any existing Constructors, Deconstructors, and Energy Collectors when updating from any previous version. Nothing will be lost (hopefully). In Minetest Game, this is a bit of a problem (try blowing it up maybe? I don't know, sorry).** **You MUST break and replace any existing Constructors, Deconstructors, and Energy Collectors when updating from any previous version. Nothing will be lost (hopefully). In Minetest Game, this is a bit of a problem (try blowing it up maybe? I don't know, sorry).**
* New features: * New features:
* Added a [wiki](https://github.com/ThePython10110/ExchangeClone/wiki)! This is where you can find more complete information on pretty much everything. * Added a [wiki](https://github.com/ThePython10110/ExchangeClone/wiki)! This is where you can find more complete information on pretty much everything.

View File

@ -1,5 +1,7 @@
exchangeclone.group_values = {} -- Just in case people want to add stuff to these lists in their mods...
exchangeclone.energy_values = {} exchangeclone.group_values = exchangeclone.group_values or {}
exchangeclone.energy_values = exchangeclone.energy_values or {}
if exchangeclone.mcl then if exchangeclone.mcl then
--[[ Groups are organized so that order matters. Groups that are lower on the --[[ Groups are organized so that order matters. Groups that are lower on the
list will have their energies applied later, making them higher priority. It's list will have their energies applied later, making them higher priority. It's
@ -14,18 +16,24 @@ if exchangeclone.mcl then
} }
exchangeclone.energy_values = { exchangeclone.energy_values = {
-- TODO
["doc_identifier:identifier_liquid"] = 5, ["doc_identifier:identifier_liquid"] = 5,
["fake_liquids:bucket_fake_lava"] = 832, ["fake_liquids:bucket_fake_lava"] = 832,
["fake_liquids:bucket_fake_water"] = 960, ["fake_liquids:bucket_fake_water"] = 960,
["lava_sponge:lava_sponge_wet"] = 1160, ["lava_sponge:lava_sponge_wet"] = 1160,
["mcl_amethyst:amethyst_cluster"] = 512, ["mcl_amethyst:amethyst_cluster"] = 512,
["mcl_amethyst:amethyst_shard"] = 256, ["mcl_amethyst:amethyst_shard"] = 256,
["mcl_amethyst:calcite"] = 128, ["mcl_amethyst:calcite"] = 128,
["mcl_amethyst:large_amethyst_bud"] = 426, ["mcl_amethyst:large_amethyst_bud"] = 426,
["mcl_amethyst:medium_amethyst_bud"] = 341, ["mcl_amethyst:medium_amethyst_bud"] = 341,
["mcl_amethyst:small_amethyst_bud"] = 256, ["mcl_amethyst:small_amethyst_bud"] = 256,
["mcl_anvils:anvil_damage_1"] = 5632, ["mcl_anvils:anvil_damage_1"] = 5632,
["mcl_anvils:anvil_damage_2"] = 3328, ["mcl_anvils:anvil_damage_2"] = 3328,
["mcl_armor:boots_chain"] = 768, ["mcl_armor:boots_chain"] = 768,
["mcl_armor:boots_chain_enchanted"] = 768, ["mcl_armor:boots_chain_enchanted"] = 768,
["mcl_armor:boots_diamond_enchanted"] = 32768, ["mcl_armor:boots_diamond_enchanted"] = 32768,
@ -59,23 +67,31 @@ if exchangeclone.mcl then
["mcl_armor:leggings_leather_enchanted"] = 448, ["mcl_armor:leggings_leather_enchanted"] = 448,
["mcl_armor:leggings_netherite"] = 131072, ["mcl_armor:leggings_netherite"] = 131072,
["mcl_armor:leggings_netherite_enchanted"] = 131072, ["mcl_armor:leggings_netherite_enchanted"] = 131072,
["mcl_bamboo:bamboo"] = 2, ["mcl_bamboo:bamboo"] = 2,
["mcl_bamboo:bamboo_block_stripped"] = 16, ["mcl_bamboo:bamboo_block_stripped"] = 16,
["mcl_banners:pattern_globe"] = 360, ["mcl_banners:pattern_globe"] = 360,
["mcl_banners:pattern_piglin"] = 300, ["mcl_banners:pattern_piglin"] = 300,
["mcl_beehives:beehive"] = 144, ["mcl_beehives:beehive"] = 144,
["mcl_bells:bell"] = 8192, ["mcl_bells:bell"] = 8192,
["mcl_blackstone:basalt"] = 1, ["mcl_blackstone:basalt"] = 1,
["mcl_blackstone:blackstone"] = 1, ["mcl_blackstone:blackstone"] = 1,
["mcl_blackstone:blackstone_gilded"] = 2048, ["mcl_blackstone:blackstone_gilded"] = 2048,
["mcl_blackstone:nether_gold"] = 2048, ["mcl_blackstone:nether_gold"] = 2048,
["mcl_blackstone:soul_soil"] = 49, ["mcl_blackstone:soul_soil"] = 49,
["mcl_books:book"] = 150, ["mcl_books:book"] = 150,
["mcl_books:written_book"] = 206, ["mcl_books:written_book"] = 206,
["mcl_bows:bow_enchanted"] = 48, ["mcl_bows:bow_enchanted"] = 48,
["mcl_bows:crossbow_enchanted"] = 295, ["mcl_bows:crossbow_enchanted"] = 295,
["mcl_bows:crossbow_loaded"] = 298, ["mcl_bows:crossbow_loaded"] = 298,
["mcl_bows:crossbow_loaded_enchanted"] = 298, ["mcl_bows:crossbow_loaded_enchanted"] = 298,
["mcl_buckets:bucket_axolotl"] = 1024, ["mcl_buckets:bucket_axolotl"] = 1024,
["mcl_buckets:bucket_cod"] = 896, ["mcl_buckets:bucket_cod"] = 896,
["mcl_buckets:bucket_lava"] = 896, ["mcl_buckets:bucket_lava"] = 896,
@ -83,10 +99,14 @@ if exchangeclone.mcl then
["mcl_buckets:bucket_salmon"] = 896, ["mcl_buckets:bucket_salmon"] = 896,
["mcl_buckets:bucket_tropical_fish"] = 896, ["mcl_buckets:bucket_tropical_fish"] = 896,
["mcl_buckets:bucket_water"] = 768, ["mcl_buckets:bucket_water"] = 768,
["mcl_campfires:campfire"] = 140, ["mcl_campfires:campfire"] = 140,
["mcl_campfires:soul_campfire"] = 157, ["mcl_campfires:soul_campfire"] = 157,
["mcl_cocoas:cocoa_beans"] = 128, ["mcl_cocoas:cocoa_beans"] = 128,
["mcl_copper:raw_copper"] = 85, ["mcl_copper:raw_copper"] = 85,
["mcl_core:andesite"] = 1, ["mcl_core:andesite"] = 1,
["mcl_core:apple"] = 128, ["mcl_core:apple"] = 128,
["mcl_core:apple_gold_enchanted"] = 147584, ["mcl_core:apple_gold_enchanted"] = 147584,
@ -115,17 +135,22 @@ if exchangeclone.mcl then
["mcl_core:reeds"] = 32, ["mcl_core:reeds"] = 32,
["mcl_core:sand"] = 1, ["mcl_core:sand"] = 1,
["mcl_core:vine"] = 8, ["mcl_core:vine"] = 8,
["mcl_crimson:shroomlight"] = 64, ["mcl_crimson:shroomlight"] = 64,
["mcl_crimson:twisting_vines"] = 8, ["mcl_crimson:twisting_vines"] = 8,
["mcl_crimson:warped_wart_block"] = 216, ["mcl_crimson:warped_wart_block"] = 216,
["mcl_crimson:weeping_vines"] = 8, ["mcl_crimson:weeping_vines"] = 8,
["mcl_deepslate:deepslate_cobbled"] = 1, ["mcl_deepslate:deepslate_cobbled"] = 1,
["mcl_deepslate:tuff"] = 1, ["mcl_deepslate:tuff"] = 1,
["mcl_end:chorus_flower"] = 32, ["mcl_end:chorus_flower"] = 32,
["mcl_end:chorus_fruit"] = 16, ["mcl_end:chorus_fruit"] = 16,
["mcl_end:dragon_egg"] = 139264, ["mcl_end:dragon_egg"] = 139264,
["mcl_end:end_stone"] = 1, ["mcl_end:end_stone"] = 1,
["mcl_experience:bottle"] = 2048, ["mcl_experience:bottle"] = 2048,
["mcl_farming:beetroot_item"] = 24, ["mcl_farming:beetroot_item"] = 24,
["mcl_farming:beetroot_seeds"] = 16, ["mcl_farming:beetroot_seeds"] = 16,
["mcl_farming:carrot_item"] = 24, ["mcl_farming:carrot_item"] = 24,
@ -144,25 +169,32 @@ if exchangeclone.mcl then
["mcl_farming:sweet_berry"] = 16, ["mcl_farming:sweet_berry"] = 16,
["mcl_farming:wheat_item"] = 24, ["mcl_farming:wheat_item"] = 24,
["mcl_farming:wheat_seeds"] = 16, ["mcl_farming:wheat_seeds"] = 16,
["mcl_fishing:clownfish_raw"] = 64, ["mcl_fishing:clownfish_raw"] = 64,
["mcl_fishing:fish_raw"] = 40, ["mcl_fishing:fish_raw"] = 40,
["mcl_fishing:fishing_rod_enchanted"] = 36, ["mcl_fishing:fishing_rod_enchanted"] = 36,
["mcl_fishing:pufferfish_raw"] = 64, ["mcl_fishing:pufferfish_raw"] = 64,
["mcl_fishing:salmon_raw"] = 48, ["mcl_fishing:salmon_raw"] = 48,
["mcl_flowers:waterlily"] = 16, ["mcl_flowers:waterlily"] = 16,
["mcl_flowers:wither_rose"] = 128, ["mcl_flowers:wither_rose"] = 128,
["mcl_heads:creeper"] = 256, ["mcl_heads:creeper"] = 256,
["mcl_heads:skeleton"] = 256, ["mcl_heads:skeleton"] = 256,
["mcl_heads:steve"] = 256, ["mcl_heads:steve"] = 256,
["mcl_heads:wither_skeleton"] = 50000, ["mcl_heads:wither_skeleton"] = 50000,
["mcl_heads:zombie"] = 256, ["mcl_heads:zombie"] = 256,
["mcl_honey:honey_bottle"] = 33, ["mcl_honey:honey_bottle"] = 33,
["mcl_honey:honeycomb"] = 32, ["mcl_honey:honeycomb"] = 32,
["mcl_lush_caves:cave_vines"] = 8, ["mcl_lush_caves:cave_vines"] = 8,
["mcl_lush_caves:cave_vines_lit"] = 0, ["mcl_lush_caves:cave_vines_lit"] = 0,
["mcl_lush_caves:glow_berry"] = 36, ["mcl_lush_caves:glow_berry"] = 36,
["mcl_lush_caves:spore_blossom"] = 32, ["mcl_lush_caves:spore_blossom"] = 32,
["mcl_mangrove:mangrove_roots"] = 1, ["mcl_mangrove:mangrove_roots"] = 1,
["mcl_maps:filled_map"] = 1120, ["mcl_maps:filled_map"] = 1120,
["mcl_maps:filled_map_mcl_skins_base_18D471DFF_female_crea"] = 1120, ["mcl_maps:filled_map_mcl_skins_base_18D471DFF_female_crea"] = 1120,
["mcl_maps:filled_map_mcl_skins_base_18D471DFF_female_surv"] = 1120, ["mcl_maps:filled_map_mcl_skins_base_18D471DFF_female_surv"] = 1120,
@ -176,6 +208,7 @@ if exchangeclone.mcl then
["mcl_maps:filled_map_mcl_skins_base_1EEB592FF_female_surv"] = 1120, ["mcl_maps:filled_map_mcl_skins_base_1EEB592FF_female_surv"] = 1120,
["mcl_maps:filled_map_mcl_skins_base_1EEB592FF_male_crea"] = 1120, ["mcl_maps:filled_map_mcl_skins_base_1EEB592FF_male_crea"] = 1120,
["mcl_maps:filled_map_mcl_skins_base_1EEB592FF_male_surv"] = 1120, ["mcl_maps:filled_map_mcl_skins_base_1EEB592FF_male_surv"] = 1120,
["mcl_mobitems:beef"] = 64, ["mcl_mobitems:beef"] = 64,
["mcl_mobitems:blaze_rod"] = 1536, ["mcl_mobitems:blaze_rod"] = 1536,
["mcl_mobitems:bone"] = 144, ["mcl_mobitems:bone"] = 144,
@ -206,14 +239,18 @@ if exchangeclone.mcl then
["mcl_mobitems:slimeball"] = 24, ["mcl_mobitems:slimeball"] = 24,
["mcl_mobitems:spider_eye"] = 128, ["mcl_mobitems:spider_eye"] = 128,
["mcl_mobitems:string"] = 12, ["mcl_mobitems:string"] = 12,
["mcl_mobs:nametag"] = 128, ["mcl_mobs:nametag"] = 128,
["mcl_mud:mud"] = 1, ["mcl_mud:mud"] = 1,
["mcl_nether:ancient_debris"] = 16384, ["mcl_nether:ancient_debris"] = 16384,
["mcl_nether:glowstone_dust"] = 384, ["mcl_nether:glowstone_dust"] = 384,
["mcl_nether:nether_wart_item"] = 24, ["mcl_nether:nether_wart_item"] = 24,
["mcl_nether:netherrack"] = 1, ["mcl_nether:netherrack"] = 1,
["mcl_nether:quartz"] = 128, ["mcl_nether:quartz"] = 128,
["mcl_nether:soul_sand"] = 49, ["mcl_nether:soul_sand"] = 49,
["mcl_ocean:brain_coral"] = 8, ["mcl_ocean:brain_coral"] = 8,
["mcl_ocean:brain_coral_block"] = 8, ["mcl_ocean:brain_coral_block"] = 8,
["mcl_ocean:brain_coral_fan"] = 8, ["mcl_ocean:brain_coral_fan"] = 8,
@ -249,47 +286,54 @@ if exchangeclone.mcl then
["mcl_ocean:tube_coral"] = 8, ["mcl_ocean:tube_coral"] = 8,
["mcl_ocean:tube_coral_block"] = 8, ["mcl_ocean:tube_coral_block"] = 8,
["mcl_ocean:tube_coral_fan"] = 8, ["mcl_ocean:tube_coral_fan"] = 8,
["mcl_potions:dragon_breath"] = 8.5, ["mcl_potions:dragon_breath"] = 8.5,
["mcl_potions:fermented_spider_eye"] = 192, ["mcl_potions:fermented_spider_eye"] = 192,
["mcl_potions:glass_bottle"] = 1, ["mcl_potions:glass_bottle"] = 1,
["mcl_potions:speckled_melon"] = 1852, ["mcl_potions:speckled_melon"] = 1852,
["mcl_pottery_sherds:pot"] = 16, ["mcl_pottery_sherds:pot"] = 16,
["mcl_raw_ores:raw_gold"] = 2048, ["mcl_raw_ores:raw_gold"] = 2048,
["mcl_raw_ores:raw_iron"] = 256, ["mcl_raw_ores:raw_iron"] = 256,
["mcl_sponges:sponge"] = 1024, ["mcl_sponges:sponge"] = 1024,
["mcl_sponges:sponge_wet"] = 1024, ["mcl_sponges:sponge_wet"] = 1024,
["mcl_sponges:sponge_wet_river_water"] = 1024, ["mcl_sponges:sponge_wet_river_water"] = 1024,
["mcl_throwing:egg"] = 32, ["mcl_throwing:egg"] = 32,
["mcl_throwing:ender_pearl"] = 1024, ["mcl_throwing:ender_pearl"] = 1024,
["mcl_throwing:snowball"] = 0.25, ["mcl_throwing:snowball"] = 0.25,
["mcl_tools:axe_stone_enchanted"] = 11,
["mcl_tools:axe_netherite"] = 98312,
["mcl_tools:axe_wood_enchanted"] = 32, ["mcl_tools:axe_wood_enchanted"] = 32,
["mcl_tools:axe_stone_enchanted"] = 11,
["mcl_tools:axe_iron_enchanted"] = 796, ["mcl_tools:axe_iron_enchanted"] = 796,
["mcl_tools:axe_gold_enchanted"] = 6152, ["mcl_tools:axe_gold_enchanted"] = 6152,
["mcl_tools:axe_diamond_enchanted"] = 24584, ["mcl_tools:axe_diamond_enchanted"] = 24584,
["mcl_tools:axe_netherite"] = 98312,
["mcl_tools:axe_netherite_enchanted"] = 98312, ["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_stone_enchanted"] = 11,
["mcl_tools:pick_iron_enchanted"] = 796, ["mcl_tools:pick_iron_enchanted"] = 796,
["mcl_tools:pick_gold_enchanted"] = 6152, ["mcl_tools:pick_gold_enchanted"] = 6152,
["mcl_tools:pick_diamond_enchanted"] = 24584, ["mcl_tools:pick_diamond_enchanted"] = 24584,
["mcl_tools:pick_netherite"] = 98312,
["mcl_tools:pick_netherite_enchanted"] = 98312, ["mcl_tools:pick_netherite_enchanted"] = 98312,
["mcl_tools:pick_wood_enchanted"] = 32,
["mcl_tools:shovel_diamond_enchanted"] = 8200,
["mcl_tools:shovel_gold_enchanted"] = 2056,
["mcl_tools:shovel_iron_enchanted"] = 264,
["mcl_tools:shovel_netherite"] = 81928, ["mcl_tools:shovel_netherite"] = 81928,
["mcl_tools:shovel_netherite_enchanted"] = 81928,
["mcl_tools:shovel_stone_enchanted"] = 9,
["mcl_tools:shovel_wood_enchanted"] = 16, ["mcl_tools:shovel_wood_enchanted"] = 16,
["mcl_tools:sword_diamond_enchanted"] = 16392, ["mcl_tools:shovel_stone_enchanted"] = 9,
["mcl_tools:sword_gold_enchanted"] = 5000, ["mcl_tools:shovel_iron_enchanted"] = 264,
["mcl_tools:sword_iron_enchanted"] = 516, ["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_netherite"] = 90120,
["mcl_tools:sword_netherite_enchanted"] = 90120,
["mcl_tools:sword_stone_enchanted"] = 6,
["mcl_tools:sword_wood_enchanted"] = 20, ["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, ["mcl_totems:totem"] = 106496,
["meat_blocks:meatball"] = 64, ["meat_blocks:meatball"] = 64,
["mesecons:redstone"] = 64, ["mesecons:redstone"] = 64,
@ -316,17 +360,16 @@ if exchangeclone.mcl then
else else
exchangeclone.energy_values = { exchangeclone.energy_values = {
["bones:bones"] = 4, ["bones:bones"] = 4,
["bucket:bucket_lava"] = 896, ["bucket:bucket_lava"] = 896,
["bucket:bucket_river_water"] = 768, ["bucket:bucket_river_water"] = 768,
["bucket:bucket_water"] = 768, ["bucket:bucket_water"] = 768,
["butterflies:butterfly_red"] = 0,
["butterflies:butterfly_violet"] = 0,
["butterflies:butterfly_white"] = 0,
["default:acacia_bush_leaves"] = 1, ["default:acacia_bush_leaves"] = 1,
["default:acacia_bush_sapling"] = 32, ["default:acacia_bush_sapling"] = 32,
["default:acacia_bush_stem"] = 8, ["default:acacia_bush_stem"] = 8,
["default:apple"] = 5, ["default:apple"] = 5,
["default:blueberries"] = 8, ["default:blueberries"] = 16,
["default:blueberry_bush_leaves"] = 1, ["default:blueberry_bush_leaves"] = 1,
["default:blueberry_bush_leaves_with_berries"] = 9, ["default:blueberry_bush_leaves_with_berries"] = 9,
["default:blueberry_bush_sapling"] = 32, ["default:blueberry_bush_sapling"] = 32,
@ -375,16 +418,30 @@ else
["default:snowblock"] = 5, ["default:snowblock"] = 5,
["default:stick"] = 4, ["default:stick"] = 4,
["default:tin_lump"] = 384, ["default:tin_lump"] = 384,
["farming:cotton"] = 12, ["farming:cotton"] = 12,
["farming:cotton_wild"] = 12, ["farming:cotton_wild"] = 12,
["farming:seed_cotton"] = 10, ["farming:seed_cotton"] = 10,
["farming:seed_wheat"] = 16, ["farming:seed_wheat"] = 16,
["farming:wheat"] = 24, ["farming:wheat"] = 24,
["moreores:mithril_lump"] = 16384,
["moreores:silver_lump"] = 4000,
["technic:chromium_lump"] = 4096,
["technic:granite"] = 1,
["technic:lead_lump"] = 256,
["technic:marble"] = 1,
["technic:sulfur_lump"] = 128,
["technic:uranium_lump"] = 8192,
["technic:zinc_lump"] = 512,
["useful_green_potatoes:useful_green_potato"] = 256 ["useful_green_potatoes:useful_green_potato"] = 256
} }
exchangeclone.group_values = { exchangeclone.group_values = {
{"flower", 32}, {"flower", 32},
--{"dye", 8},
} }
end end

View File

@ -20,7 +20,7 @@ local function get_cheapest_recipe(recipes)
end end
end end
end end
elseif recipe.type == "shapeless" then elseif (recipe.type == "shapeless") or (recipe.type == "technic") then
for _, item in ipairs(recipe.recipe) do for _, item in ipairs(recipe.recipe) do
local cost = exchangeclone.get_item_energy(item) local cost = exchangeclone.get_item_energy(item)
if (not cost) or cost == 0 then if (not cost) or cost == 0 then
@ -52,8 +52,6 @@ local function get_cheapest_recipe(recipes)
if (not cheapest) or (cheapest[1] > ingredient_cost) then if (not cheapest) or (cheapest[1] > ingredient_cost) then
cheapest = {ingredient_cost, recipe} cheapest = {ingredient_cost, recipe}
end end
else
minetest.log("info", "\tMissing "..dump(skip))
end end
end end
return cheapest and cheapest[1] return cheapest and cheapest[1]
@ -184,7 +182,7 @@ minetest.register_on_mods_loaded(function()
end end
end end
for i = 1, exchangeclone.num_passes do for i = 1, exchangeclone.num_passes do
minetest.log("info", "PASS #"..i..":") minetest.log("action", "PASS #"..i..":")
if auto == {} then break end if auto == {} then break end
for itemstring, _ in pairs(auto) do for itemstring, _ in pairs(auto) do
local cheapest = get_cheapest_recipe(exchangeclone.recipes[itemstring]) local cheapest = get_cheapest_recipe(exchangeclone.recipes[itemstring])
@ -206,6 +204,15 @@ minetest.register_on_mods_loaded(function()
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)) 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
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))
end
end
end
-- Free up memory (I assume this will do that?) -- Free up memory (I assume this will do that?)
exchangeclone.recipes = nil exchangeclone.recipes = nil
exchangeclone.energy_values = nil exchangeclone.energy_values = nil

View File

@ -1,4 +1,4 @@
name = _exchangeclone_energy name = _exchangeclone_energy
title = ExchangeClone Energy title = ExchangeClone Energy
depends = exchangeclone, zzzz_exchangeclone_crafthook depends = exchangeclone, zzzz_exchangeclone_crafthook
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, _mcl_autogroup 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, _mcl_autogroup, unified_inventory

View File

@ -17,7 +17,7 @@ for _, color in colors do
local itemstring = "exchangeclone:"..lower_color.."_advanced_alchemical_chest" local itemstring = "exchangeclone:"..lower_color.."_advanced_alchemical_chest"
minetest.register_node(itemstring, { minetest.register_node(itemstring, {
description = color.." Alchemical Chest", description = color.." Alchemical Chest",
groups = {container = 1, alchemical_chest = 1}, groups = {container = 2, alchemical_chest = 1},
after_place_node = function(pos, player, itemstack, pointed_thing) after_place_node = function(pos, player, itemstack, pointed_thing)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
meta:set_string("formspec", alchemical_formspec(color)) meta:set_string("formspec", alchemical_formspec(color))

View File

@ -294,9 +294,9 @@ if minetest.get_modpath("3d_armor") then
minetest.register_craft({ minetest.register_craft({
output = "exchangeclone:shield_red_matter", output = "exchangeclone:shield_red_matter",
recipe = { recipe = {
{d,d,d}, {r,r,r},
{d,d,d}, {r,r,r},
{"exchangeclone:shield_dark_matter",d,""}, {"exchangeclone:shield_dark_matter",r,""},
} }
}) })
end end

View File

@ -109,7 +109,7 @@ minetest.register_craft({
}) })
minetest.register_craft({ minetest.register_craft({
output = "exchangeclone:dark_matter_block 4", output = "exchangeclone:dark_matter_block",
recipe = { recipe = {
{"exchangeclone:dark_matter", "exchangeclone:dark_matter"}, {"exchangeclone:dark_matter", "exchangeclone:dark_matter"},
{"exchangeclone:dark_matter", "exchangeclone:dark_matter"} {"exchangeclone:dark_matter", "exchangeclone:dark_matter"}
@ -117,7 +117,7 @@ minetest.register_craft({
}) })
minetest.register_craft({ minetest.register_craft({
output = "exchangeclone:red_matter_block 4", output = "exchangeclone:red_matter_block",
recipe = { recipe = {
{"exchangeclone:red_matter", "exchangeclone:red_matter"}, {"exchangeclone:red_matter", "exchangeclone:red_matter"},
{"exchangeclone:red_matter", "exchangeclone:red_matter"} {"exchangeclone:red_matter", "exchangeclone:red_matter"}
@ -127,15 +127,13 @@ minetest.register_craft({
minetest.register_craft({ minetest.register_craft({
output = "exchangeclone:dark_matter 4", output = "exchangeclone:dark_matter 4",
recipe = { recipe = {
{"exchangeclone:dark_matter_block","exchangeclone:dark_matter_block"}, {"exchangeclone:dark_matter_block"}
{"exchangeclone:dark_matter_block","exchangeclone:dark_matter_block"}
} }
}) })
minetest.register_craft({ minetest.register_craft({
output = "exchangeclone:red_matter 4", output = "exchangeclone:red_matter 4",
recipe = { recipe = {
{"exchangeclone:red_matter_block","exchangeclone:red_matter_block"}, {"exchangeclone:red_matter_block",}
{"exchangeclone:red_matter_block","exchangeclone:red_matter_block"}
} }
}) })

View File

@ -69,7 +69,7 @@ local function deconstructor_action(pos)
end end
local stack = inv:get_stack("src", 1) local stack = inv:get_stack("src", 1)
local individual_energy_value = exchangeclone.get_item_energy(stack:get_name()) local individual_energy_value = exchangeclone.get_item_energy(stack:get_name())
if individual_energy_value and individual_energy_value <= 0 then return end if not (individual_energy_value and individual_energy_value > 0) then return end
local wear = stack:get_wear() local wear = stack:get_wear()
if wear and wear > 1 then if wear and wear > 1 then
individual_energy_value = math.floor(individual_energy_value * (65536 / wear)) individual_energy_value = math.floor(individual_energy_value * (65536 / wear))

View File

@ -0,0 +1,29 @@
-- Runs only if the hopper mod is detected. This pretty much makes it so that anything that works with
-- MineClone hoppers will automatically work with other hoppers.
hopper:add_container({
{"top", "group:container=2", "main"},
{"bottom", "group:container=2", "main"},
{"side", "group:container=2", "main"},
})
-- Intentionally skipping 3, because I don't know if it would still block shulkers
-- If this doesn't start the node timer for the furnace, it won't work.
hopper:add_container({
{"top", "group:container=4", "src"},
{"side", "group:container=4", "fuel"},
{"bottom", "group:container=4", "dst"},
})
-- Hoppers will only be able to insert into one side of a double chest (unless you have 1 hopper per side)
hopper:add_container({
{"top", "group:container=5", "main"},
{"bottom", "group:container=5", "main"},
{"side", "group:container=5", "main"},
})
hopper:add_container({
{"top", "group:container=6", "main"},
{"bottom", "group:container=6", "main"},
{"side", "group:container=6", "main"},
})

View File

@ -14,7 +14,7 @@ exchangeclone.orb_max = 51200000 -- Max capacity of Klein Star Omega in ProjectE
local modpath = minetest.get_modpath("exchangeclone") local modpath = minetest.get_modpath("exchangeclone")
exchangeclone.orb_max = minetest.settings:get("exchangeclone.orb_max") or 5 exchangeclone.orb_max = minetest.settings:get("exchangeclone.orb_max") or 51200000
exchangeclone.num_passes = minetest.settings:get("exchangeclone.num_passes") or 10 exchangeclone.num_passes = minetest.settings:get("exchangeclone.num_passes") or 10
dofile(modpath.."/lib.lua") dofile(modpath.."/lib.lua")
@ -29,6 +29,7 @@ end
if exchangeclone.mcl then if exchangeclone.mcl then
mcl_item_id.set_mod_namespace("exchangeclone") mcl_item_id.set_mod_namespace("exchangeclone")
dofile(modpath.."/shears.lua") dofile(modpath.."/shears.lua")
dofile(modpath.."/tool_upgrades.lua")
end end
dofile(modpath.."/multidig.lua") dofile(modpath.."/multidig.lua")
dofile(modpath.."/swords.lua") dofile(modpath.."/swords.lua")
@ -38,8 +39,8 @@ dofile(modpath.."/pickaxes.lua")
dofile(modpath.."/hammers.lua") dofile(modpath.."/hammers.lua")
dofile(modpath.."/shovels.lua") dofile(modpath.."/shovels.lua")
dofile(modpath.."/red_matter_multitools.lua") dofile(modpath.."/red_matter_multitools.lua")
if exchangeclone.mcl then if minetest.get_modpath("hopper") then
dofile(modpath.."/tool_upgrades.lua") dofile(modpath.."/hopper_compat.lua")
end end
dofile(modpath.."/philosophers_stone.lua") dofile(modpath.."/philosophers_stone.lua")
dofile(modpath.."/pesa.lua") dofile(modpath.."/pesa.lua")

View File

@ -15,6 +15,7 @@ end
function exchangeclone.get_item_energy(item) function exchangeclone.get_item_energy(item)
if (item == "") or not item then return end if (item == "") or not item then return end
-- handle groups
if type(item) == "string" and item:sub(1,6) == "group:" and exchangeclone.group_values then if type(item) == "string" and item:sub(1,6) == "group:" and exchangeclone.group_values then
local item_group = item:sub(7,-1) local item_group = item:sub(7,-1)
for _, group in ipairs(exchangeclone.group_values) do for _, group in ipairs(exchangeclone.group_values) do
@ -34,9 +35,10 @@ function exchangeclone.get_item_energy(item)
end end
return cheapest return cheapest
end end
-- handle items/itemstacks
item = ItemStack(item) item = ItemStack(item)
local meta_energy_value = item:get_meta():get_int("exchangeclone_energy_value") local meta_energy_value = tonumber(item:get_meta():get_string("exchangeclone_energy_value"))
if meta_energy_value > 0 then if meta_energy_value and meta_energy_value > 0 then
return meta_energy_value return meta_energy_value
end end
local def = minetest.registered_items[item:get_name()] local def = minetest.registered_items[item:get_name()]
@ -85,16 +87,11 @@ end
-- Decides what mod to use for sounds -- Decides what mod to use for sounds
if exchangeclone.mcl then exchangeclone.sound_mod = mcl_sounds else exchangeclone.sound_mod = default end if exchangeclone.mcl then exchangeclone.sound_mod = mcl_sounds else exchangeclone.sound_mod = default end
-- Sets the amount of energy in an orb in a specific inventory slot function exchangeclone.set_orb_itemstack_energy(itemstack, amount)
function exchangeclone.set_orb_energy(inventory, listname, index, amount) if not itemstack or not amount then return minetest.log(">:(") end
if not inventory or amount < 0 then return end if itemstack:get_name() ~= "exchangeclone:exchange_orb" then minetest.log(":O") return end
if not listname then listname = "main" end
if not index then index = 1 end
local itemstack = inventory:get_stack(listname, index)
if not itemstack then return end
if itemstack:get_name() ~= "exchangeclone:exchange_orb" then return end
local old_energy = exchangeclone.get_orb_itemstack_energy(itemstack) local old_energy = exchangeclone.get_orb_itemstack_energy(itemstack)
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 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
-- Square roots will hopefully make it less linear -- 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. -- And if they don't, I don't really care and I don't want to think about math anymore.
@ -102,7 +99,7 @@ function exchangeclone.set_orb_energy(inventory, listname, index, amount)
local sqrt_max = math.sqrt(exchangeclone.orb_max) local sqrt_max = math.sqrt(exchangeclone.orb_max)
local r, g, b = 0, 0, 0 local r, g, b = 0, 0, 0
if amount >= 0 then if amount <= 0 then
-- do nothing -- do nothing
elseif sqrt_amount < (sqrt_max/4) then elseif sqrt_amount < (sqrt_max/4) then
r = exchangeclone.map(sqrt_amount, 0, sqrt_max/4, 0, 255) r = exchangeclone.map(sqrt_amount, 0, sqrt_max/4, 0, 255)
@ -118,12 +115,23 @@ function exchangeclone.set_orb_energy(inventory, listname, index, amount)
end end
local colorstring = minetest.rgba(r,g,b) local colorstring = minetest.rgba(r,g,b)
minetest.log(colorstring)
local meta = itemstack:get_meta() local meta = itemstack:get_meta()
meta:set_float("stored_energy", amount) meta:set_float("stored_energy", amount)
meta:set_string("description", "Exchange Orb\nCurrent Charge: "..amount) meta:set_string("description", "Exchange Orb\nCurrent Charge: "..amount)
meta:set_string("color", colorstring) meta:set_string("color", colorstring)
inventory:set_stack(listname, index, itemstack) return itemstack
end
-- Sets the amount of energy in an orb in a specific inventory slot
function exchangeclone.set_orb_energy(inventory, listname, index, amount)
if not inventory or not amount or amount < 0 then return end
if not listname then listname = "main" end
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
inventory:set_stack(listname, index, new_stack)
end end
-- HUD stuff (show energy value in bottom right) -- HUD stuff (show energy value in bottom right)
@ -170,10 +178,17 @@ end
-- Set a player's personal energy -- Set a player's personal energy
function exchangeclone.set_player_energy(player, amount) function exchangeclone.set_player_energy(player, amount)
if not (player and amount) then return end if not (player and amount) then return end
if amount < 0 or amount > exchangeclone.limit then return end
player:get_meta():set_string("exchangeclone_stored_energy", tonumber(amount)) player:get_meta():set_string("exchangeclone_stored_energy", tonumber(amount))
exchangeclone.update_hud(player) exchangeclone.update_hud(player)
end end
-- Add to a player's personal energy (amount can be negative)
function exchangeclone.add_player_energy(player, amount)
if not (player and amount) then return end
exchangeclone.set_player_energy(exchangeclone.get_player_energy(player) + amount)
end
-- copied from http://lua-users.org/wiki/IntegerDomain -- copied from http://lua-users.org/wiki/IntegerDomain
-- Basically gets the highest number Lua supports -- Basically gets the highest number Lua supports
@ -198,6 +213,19 @@ while step > 0 do
step = math.floor(step/2) step = math.floor(step/2)
end end
exchangeclone.limit = exchangeclone.limit/100 -- (to account for .25)
function exchangeclone.split (input, sep)
if sep == nil then
sep = "%s"
end
local result={}
for str in string.gmatch(input, "([^"..sep.."]+)") do
table.insert(result, str)
end
return result
end
-- Returns a table of all items in the specified group(s). -- Returns a table of all items in the specified group(s).
function exchangeclone.get_group_items(groups, allow_duplicates, include_no_group) function exchangeclone.get_group_items(groups, allow_duplicates, include_no_group)
if type(groups) ~= "table" then if type(groups) ~= "table" then
@ -211,10 +239,10 @@ function exchangeclone.get_group_items(groups, allow_duplicates, include_no_grou
allow_duplicates = allow_duplicates or false allow_duplicates = allow_duplicates or false
include_no_group = include_no_group or false include_no_group = include_no_group or false
local g_cnt = #groups local num_groups = #groups
local result = {} local result = {}
for i = 1, g_cnt do for i = 1, num_groups do
result[groups[i]] = {} result[groups[i]] = {}
end end
if include_no_group then if include_no_group then
@ -224,9 +252,17 @@ function exchangeclone.get_group_items(groups, allow_duplicates, include_no_grou
for name, def in pairs(minetest.registered_items) do for name, def in pairs(minetest.registered_items) do
in_group = false in_group = false
for i = 1, g_cnt do for i = 1, num_groups do
local grp = groups[i] local grp = groups[i]
if def.groups[grp] ~= nil then local subgroups = exchangeclone.split(grp, ",")
local success = true
for _, subgroup in ipairs(subgroups) do
if not def.groups[subgroup] then
success = false
break
end
end
if success then
result[grp][#result[grp]+1] = name result[grp][#result[grp]+1] = name
in_group = true in_group = true
if allow_duplicates == false then if allow_duplicates == false then

View File

@ -134,7 +134,7 @@ local function handle_inventory(player, inventory, to_list)
local orb_energy = exchangeclone.get_orb_itemstack_energy(stack) local orb_energy = exchangeclone.get_orb_itemstack_energy(stack)
local charge_amount = math.min(exchangeclone.orb_max - orb_energy, player_energy) local charge_amount = math.min(exchangeclone.orb_max - orb_energy, player_energy)
if charge_amount > 0 then if charge_amount > 0 then
exchangeclone.set_player_energy(player, player_energy - charge_amount) exchangeclone.add_player_energy(player, 0-charge_amount)
exchangeclone.set_orb_energy(inventory, to_list, 1, orb_energy + charge_amount) exchangeclone.set_orb_energy(inventory, to_list, 1, orb_energy + charge_amount)
exchangeclone.show_transmutation_table_formspec(player) exchangeclone.show_transmutation_table_formspec(player)
end end

View File

@ -1,5 +1,5 @@
# Exchange Orb maximum energy (default 51200000) # Exchange Orb maximum energy (default 51200000)
exchangeclone.orb_max (Exchange Orb maximum energy) int 51200000 exchangeclone.orb_max (Exchange Orb maximum energy) int 51200000
# The number of times ExchangeClone goes through the items (more = longer load, but it's more likely that more energy values will be registered) # The number of times ExchangeClone goes through the list of items. More means slightly longer load times, but also means that more items are likely to have energy values.
exchangeclone.num_passes (Energy value number of passes) int 10 exchangeclone.num_passes (Energy value number of passes) int 10

View File

@ -1,4 +1,3 @@
minetest.log("Wrapping craft function")
exchangeclone = {recipes = {}} exchangeclone = {recipes = {}}
local old_func = minetest.register_craft local old_func = minetest.register_craft
@ -7,6 +6,32 @@ function minetest.register_craft(arg, ...)
local itemstring = ItemStack(arg.output):get_name() local itemstring = ItemStack(arg.output):get_name()
exchangeclone.recipes[itemstring] = exchangeclone.recipes[itemstring] or {} exchangeclone.recipes[itemstring] = exchangeclone.recipes[itemstring] or {}
table.insert(exchangeclone.recipes[itemstring], table.copy(arg)) table.insert(exchangeclone.recipes[itemstring], table.copy(arg))
--[[ -- reverse cooking recipes too
if arg.type == "cooking" then
itemstring = ItemStack(arg.recipe):get_name()
local reverse_arg = table.copy(arg)
reverse_arg.recipe, reverse_arg.output = reverse_arg.output, reverse_arg.recipe
exchangeclone.recipes[itemstring] = exchangeclone.recipes[itemstring] or {}
table.insert(exchangeclone.recipes[itemstring], table.copy(reverse_arg))
end --]]
end end
old_func(arg, ...) old_func(arg, ...)
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)
end
function exchangeclone.register_technic_recipe(typename, recipe)
local data = technic.recipes[typename]
if (data.output_size == 1) then
if data.output_size == 1 then
register_technic_recipe(table.copy(recipe))
end
end
end
end end