Technic works, hoppers don't yet
This commit is contained in:
parent
15645ebeec
commit
3c8345da1b
|
@ -30,6 +30,7 @@ read_globals = {
|
|||
"screwdriver",
|
||||
"mcl_crafting_table",
|
||||
"mcl_enchantments",
|
||||
"technic",
|
||||
|
||||
"Raycast",
|
||||
"Settings",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
# Code of Conduct
|
||||
Don't be evil.
|
||||
Don't be evil.
|
||||
|
||||
That's it.
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
||||
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.
|
22
README.md
22
README.md
|
@ -56,28 +56,38 @@ Dependencies: Minetest Game or MineClone.
|
|||
|
||||
<details><summary><h1>Changelog:</h1></summary>
|
||||
|
||||
### 6.0
|
||||
### 6.0 (interestingness depends on several things)
|
||||
* New Features:
|
||||
* 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)
|
||||
* 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)
|
||||
* Mind, Life, Body, and Soul Stones (although MTG only has the soul stone).
|
||||
* 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:
|
||||
* Energy values are now in `_exchangeclone_energy/energy_values.lua`, and are laid out differently, and aliases now work.
|
||||
* ExchangeClone is now a modpack for [annoying reasons](https://forum.minetest.net/viewtopic.php?f=47&p=429775s). *Every single mod* in the modpack is required, regardless of what it says the dependencies are. Disable and then enable it for everything to work correctly.
|
||||
* The default energy value is no longer 1 but none.
|
||||
* The 2-billion-ish personal energy limit is has been increased to the actual maximum Lua allows. This may mean some precision might be lost when your personal energy reaches a few quadrillion... but at that point, you don't really care about the exact number.
|
||||
* 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.
|
||||
* A couple changes the Philosopher's Stone's transmutation:
|
||||
* 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:
|
||||
* Fixed potion energy values
|
||||
* Fixed Red Matter Shield recipe
|
||||
|
||||
### 5.3
|
||||
* Bugfixes
|
||||
|
@ -99,7 +109,7 @@ Dependencies: Minetest Game or MineClone.
|
|||
* Bugfixes:
|
||||
* 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).**
|
||||
* New features:
|
||||
* Added a [wiki](https://github.com/ThePython10110/ExchangeClone/wiki)! This is where you can find more complete information on pretty much everything.
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
exchangeclone.group_values = {}
|
||||
exchangeclone.energy_values = {}
|
||||
-- Just in case people want to add stuff to these lists in their mods...
|
||||
exchangeclone.group_values = exchangeclone.group_values or {}
|
||||
exchangeclone.energy_values = exchangeclone.energy_values or {}
|
||||
|
||||
if exchangeclone.mcl then
|
||||
--[[ 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
|
||||
|
@ -14,18 +16,24 @@ if exchangeclone.mcl then
|
|||
}
|
||||
|
||||
exchangeclone.energy_values = {
|
||||
-- TODO
|
||||
["doc_identifier:identifier_liquid"] = 5,
|
||||
|
||||
["fake_liquids:bucket_fake_lava"] = 832,
|
||||
["fake_liquids:bucket_fake_water"] = 960,
|
||||
|
||||
["lava_sponge:lava_sponge_wet"] = 1160,
|
||||
|
||||
["mcl_amethyst:amethyst_cluster"] = 512,
|
||||
["mcl_amethyst:amethyst_shard"] = 256,
|
||||
["mcl_amethyst:calcite"] = 128,
|
||||
["mcl_amethyst:large_amethyst_bud"] = 426,
|
||||
["mcl_amethyst:medium_amethyst_bud"] = 341,
|
||||
["mcl_amethyst:small_amethyst_bud"] = 256,
|
||||
|
||||
["mcl_anvils:anvil_damage_1"] = 5632,
|
||||
["mcl_anvils:anvil_damage_2"] = 3328,
|
||||
|
||||
["mcl_armor:boots_chain"] = 768,
|
||||
["mcl_armor:boots_chain_enchanted"] = 768,
|
||||
["mcl_armor:boots_diamond_enchanted"] = 32768,
|
||||
|
@ -59,23 +67,31 @@ if exchangeclone.mcl then
|
|||
["mcl_armor:leggings_leather_enchanted"] = 448,
|
||||
["mcl_armor:leggings_netherite"] = 131072,
|
||||
["mcl_armor:leggings_netherite_enchanted"] = 131072,
|
||||
|
||||
["mcl_bamboo:bamboo"] = 2,
|
||||
["mcl_bamboo:bamboo_block_stripped"] = 16,
|
||||
|
||||
["mcl_banners:pattern_globe"] = 360,
|
||||
["mcl_banners:pattern_piglin"] = 300,
|
||||
|
||||
["mcl_beehives:beehive"] = 144,
|
||||
|
||||
["mcl_bells:bell"] = 8192,
|
||||
|
||||
["mcl_blackstone:basalt"] = 1,
|
||||
["mcl_blackstone:blackstone"] = 1,
|
||||
["mcl_blackstone:blackstone_gilded"] = 2048,
|
||||
["mcl_blackstone:nether_gold"] = 2048,
|
||||
["mcl_blackstone:soul_soil"] = 49,
|
||||
|
||||
["mcl_books:book"] = 150,
|
||||
["mcl_books:written_book"] = 206,
|
||||
|
||||
["mcl_bows:bow_enchanted"] = 48,
|
||||
["mcl_bows:crossbow_enchanted"] = 295,
|
||||
["mcl_bows:crossbow_loaded"] = 298,
|
||||
["mcl_bows:crossbow_loaded_enchanted"] = 298,
|
||||
|
||||
["mcl_buckets:bucket_axolotl"] = 1024,
|
||||
["mcl_buckets:bucket_cod"] = 896,
|
||||
["mcl_buckets:bucket_lava"] = 896,
|
||||
|
@ -83,10 +99,14 @@ if exchangeclone.mcl then
|
|||
["mcl_buckets:bucket_salmon"] = 896,
|
||||
["mcl_buckets:bucket_tropical_fish"] = 896,
|
||||
["mcl_buckets:bucket_water"] = 768,
|
||||
|
||||
["mcl_campfires:campfire"] = 140,
|
||||
["mcl_campfires:soul_campfire"] = 157,
|
||||
|
||||
["mcl_cocoas:cocoa_beans"] = 128,
|
||||
|
||||
["mcl_copper:raw_copper"] = 85,
|
||||
|
||||
["mcl_core:andesite"] = 1,
|
||||
["mcl_core:apple"] = 128,
|
||||
["mcl_core:apple_gold_enchanted"] = 147584,
|
||||
|
@ -115,17 +135,22 @@ if exchangeclone.mcl then
|
|||
["mcl_core:reeds"] = 32,
|
||||
["mcl_core:sand"] = 1,
|
||||
["mcl_core:vine"] = 8,
|
||||
|
||||
["mcl_crimson:shroomlight"] = 64,
|
||||
["mcl_crimson:twisting_vines"] = 8,
|
||||
["mcl_crimson:warped_wart_block"] = 216,
|
||||
["mcl_crimson:weeping_vines"] = 8,
|
||||
|
||||
["mcl_deepslate:deepslate_cobbled"] = 1,
|
||||
["mcl_deepslate:tuff"] = 1,
|
||||
|
||||
["mcl_end:chorus_flower"] = 32,
|
||||
["mcl_end:chorus_fruit"] = 16,
|
||||
["mcl_end:dragon_egg"] = 139264,
|
||||
["mcl_end:end_stone"] = 1,
|
||||
|
||||
["mcl_experience:bottle"] = 2048,
|
||||
|
||||
["mcl_farming:beetroot_item"] = 24,
|
||||
["mcl_farming:beetroot_seeds"] = 16,
|
||||
["mcl_farming:carrot_item"] = 24,
|
||||
|
@ -144,25 +169,32 @@ if exchangeclone.mcl then
|
|||
["mcl_farming:sweet_berry"] = 16,
|
||||
["mcl_farming:wheat_item"] = 24,
|
||||
["mcl_farming:wheat_seeds"] = 16,
|
||||
|
||||
["mcl_fishing:clownfish_raw"] = 64,
|
||||
["mcl_fishing:fish_raw"] = 40,
|
||||
["mcl_fishing:fishing_rod_enchanted"] = 36,
|
||||
["mcl_fishing:pufferfish_raw"] = 64,
|
||||
["mcl_fishing:salmon_raw"] = 48,
|
||||
|
||||
["mcl_flowers:waterlily"] = 16,
|
||||
["mcl_flowers:wither_rose"] = 128,
|
||||
|
||||
["mcl_heads:creeper"] = 256,
|
||||
["mcl_heads:skeleton"] = 256,
|
||||
["mcl_heads:steve"] = 256,
|
||||
["mcl_heads:wither_skeleton"] = 50000,
|
||||
["mcl_heads:zombie"] = 256,
|
||||
|
||||
["mcl_honey:honey_bottle"] = 33,
|
||||
["mcl_honey:honeycomb"] = 32,
|
||||
|
||||
["mcl_lush_caves:cave_vines"] = 8,
|
||||
["mcl_lush_caves:cave_vines_lit"] = 0,
|
||||
["mcl_lush_caves:glow_berry"] = 36,
|
||||
["mcl_lush_caves:spore_blossom"] = 32,
|
||||
|
||||
["mcl_mangrove:mangrove_roots"] = 1,
|
||||
|
||||
["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_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_male_crea"] = 1120,
|
||||
["mcl_maps:filled_map_mcl_skins_base_1EEB592FF_male_surv"] = 1120,
|
||||
|
||||
["mcl_mobitems:beef"] = 64,
|
||||
["mcl_mobitems:blaze_rod"] = 1536,
|
||||
["mcl_mobitems:bone"] = 144,
|
||||
|
@ -206,14 +239,18 @@ if exchangeclone.mcl then
|
|||
["mcl_mobitems:slimeball"] = 24,
|
||||
["mcl_mobitems:spider_eye"] = 128,
|
||||
["mcl_mobitems:string"] = 12,
|
||||
|
||||
["mcl_mobs:nametag"] = 128,
|
||||
|
||||
["mcl_mud:mud"] = 1,
|
||||
|
||||
["mcl_nether:ancient_debris"] = 16384,
|
||||
["mcl_nether:glowstone_dust"] = 384,
|
||||
["mcl_nether:nether_wart_item"] = 24,
|
||||
["mcl_nether:netherrack"] = 1,
|
||||
["mcl_nether:quartz"] = 128,
|
||||
["mcl_nether:soul_sand"] = 49,
|
||||
|
||||
["mcl_ocean:brain_coral"] = 8,
|
||||
["mcl_ocean:brain_coral_block"] = 8,
|
||||
["mcl_ocean:brain_coral_fan"] = 8,
|
||||
|
@ -249,47 +286,54 @@ if exchangeclone.mcl then
|
|||
["mcl_ocean:tube_coral"] = 8,
|
||||
["mcl_ocean:tube_coral_block"] = 8,
|
||||
["mcl_ocean:tube_coral_fan"] = 8,
|
||||
|
||||
["mcl_potions:dragon_breath"] = 8.5,
|
||||
["mcl_potions:fermented_spider_eye"] = 192,
|
||||
["mcl_potions:glass_bottle"] = 1,
|
||||
["mcl_potions:speckled_melon"] = 1852,
|
||||
|
||||
["mcl_pottery_sherds:pot"] = 16,
|
||||
|
||||
["mcl_raw_ores:raw_gold"] = 2048,
|
||||
["mcl_raw_ores:raw_iron"] = 256,
|
||||
|
||||
["mcl_sponges:sponge"] = 1024,
|
||||
["mcl_sponges:sponge_wet"] = 1024,
|
||||
["mcl_sponges:sponge_wet_river_water"] = 1024,
|
||||
|
||||
["mcl_throwing:egg"] = 32,
|
||||
["mcl_throwing:ender_pearl"] = 1024,
|
||||
["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_stone_enchanted"] = 11,
|
||||
["mcl_tools:axe_iron_enchanted"] = 796,
|
||||
["mcl_tools:axe_gold_enchanted"] = 6152,
|
||||
["mcl_tools:axe_diamond_enchanted"] = 24584,
|
||||
["mcl_tools:axe_netherite"] = 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_iron_enchanted"] = 796,
|
||||
["mcl_tools:pick_gold_enchanted"] = 6152,
|
||||
["mcl_tools:pick_diamond_enchanted"] = 24584,
|
||||
["mcl_tools:pick_netherite"] = 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_enchanted"] = 81928,
|
||||
["mcl_tools:shovel_stone_enchanted"] = 9,
|
||||
["mcl_tools:shovel_wood_enchanted"] = 16,
|
||||
["mcl_tools:sword_diamond_enchanted"] = 16392,
|
||||
["mcl_tools:sword_gold_enchanted"] = 5000,
|
||||
["mcl_tools:sword_iron_enchanted"] = 516,
|
||||
["mcl_tools:shovel_stone_enchanted"] = 9,
|
||||
["mcl_tools:shovel_iron_enchanted"] = 264,
|
||||
["mcl_tools:shovel_gold_enchanted"] = 2056,
|
||||
["mcl_tools:shovel_diamond_enchanted"] = 8200,
|
||||
["mcl_tools:shovel_netherite_enchanted"] = 81928,
|
||||
["mcl_tools:sword_netherite"] = 90120,
|
||||
["mcl_tools:sword_netherite_enchanted"] = 90120,
|
||||
["mcl_tools:sword_stone_enchanted"] = 6,
|
||||
["mcl_tools:sword_wood_enchanted"] = 20,
|
||||
["mcl_tools:sword_stone_enchanted"] = 6,
|
||||
["mcl_tools:sword_iron_enchanted"] = 516,
|
||||
["mcl_tools:sword_gold_enchanted"] = 5000,
|
||||
["mcl_tools:sword_diamond_enchanted"] = 16392,
|
||||
["mcl_tools:sword_netherite_enchanted"] = 90120,
|
||||
|
||||
["mcl_totems:totem"] = 106496,
|
||||
["meat_blocks:meatball"] = 64,
|
||||
["mesecons:redstone"] = 64,
|
||||
|
@ -316,17 +360,16 @@ if exchangeclone.mcl then
|
|||
else
|
||||
exchangeclone.energy_values = {
|
||||
["bones:bones"] = 4,
|
||||
|
||||
["bucket:bucket_lava"] = 896,
|
||||
["bucket:bucket_river_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_sapling"] = 32,
|
||||
["default:acacia_bush_stem"] = 8,
|
||||
["default:apple"] = 5,
|
||||
["default:blueberries"] = 8,
|
||||
["default:blueberries"] = 16,
|
||||
["default:blueberry_bush_leaves"] = 1,
|
||||
["default:blueberry_bush_leaves_with_berries"] = 9,
|
||||
["default:blueberry_bush_sapling"] = 32,
|
||||
|
@ -375,16 +418,30 @@ else
|
|||
["default:snowblock"] = 5,
|
||||
["default:stick"] = 4,
|
||||
["default:tin_lump"] = 384,
|
||||
|
||||
["farming:cotton"] = 12,
|
||||
["farming:cotton_wild"] = 12,
|
||||
["farming:seed_cotton"] = 10,
|
||||
["farming:seed_wheat"] = 16,
|
||||
["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
|
||||
}
|
||||
|
||||
exchangeclone.group_values = {
|
||||
{"flower", 32},
|
||||
--{"dye", 8},
|
||||
}
|
||||
|
||||
end
|
||||
|
|
|
@ -20,7 +20,7 @@ local function get_cheapest_recipe(recipes)
|
|||
end
|
||||
end
|
||||
end
|
||||
elseif recipe.type == "shapeless" then
|
||||
elseif (recipe.type == "shapeless") or (recipe.type == "technic") then
|
||||
for _, item in ipairs(recipe.recipe) do
|
||||
local cost = exchangeclone.get_item_energy(item)
|
||||
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
|
||||
cheapest = {ingredient_cost, recipe}
|
||||
end
|
||||
else
|
||||
minetest.log("info", "\tMissing "..dump(skip))
|
||||
end
|
||||
end
|
||||
return cheapest and cheapest[1]
|
||||
|
@ -184,7 +182,7 @@ minetest.register_on_mods_loaded(function()
|
|||
end
|
||||
end
|
||||
for i = 1, exchangeclone.num_passes do
|
||||
minetest.log("info", "PASS #"..i..":")
|
||||
minetest.log("action", "PASS #"..i..":")
|
||||
if auto == {} then break end
|
||||
for itemstring, _ in pairs(auto) do
|
||||
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))
|
||||
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?)
|
||||
exchangeclone.recipes = nil
|
||||
exchangeclone.energy_values = nil
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
name = _exchangeclone_energy
|
||||
title = ExchangeClone Energy
|
||||
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
|
|
@ -17,7 +17,7 @@ for _, color in colors do
|
|||
local itemstring = "exchangeclone:"..lower_color.."_advanced_alchemical_chest"
|
||||
minetest.register_node(itemstring, {
|
||||
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)
|
||||
local meta = minetest.get_meta(pos)
|
||||
meta:set_string("formspec", alchemical_formspec(color))
|
||||
|
|
|
@ -294,9 +294,9 @@ if minetest.get_modpath("3d_armor") then
|
|||
minetest.register_craft({
|
||||
output = "exchangeclone:shield_red_matter",
|
||||
recipe = {
|
||||
{d,d,d},
|
||||
{d,d,d},
|
||||
{"exchangeclone:shield_dark_matter",d,""},
|
||||
{r,r,r},
|
||||
{r,r,r},
|
||||
{"exchangeclone:shield_dark_matter",r,""},
|
||||
}
|
||||
})
|
||||
end
|
|
@ -109,7 +109,7 @@ minetest.register_craft({
|
|||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "exchangeclone:dark_matter_block 4",
|
||||
output = "exchangeclone:dark_matter_block",
|
||||
recipe = {
|
||||
{"exchangeclone:dark_matter", "exchangeclone:dark_matter"},
|
||||
{"exchangeclone:dark_matter", "exchangeclone:dark_matter"}
|
||||
|
@ -117,7 +117,7 @@ minetest.register_craft({
|
|||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "exchangeclone:red_matter_block 4",
|
||||
output = "exchangeclone:red_matter_block",
|
||||
recipe = {
|
||||
{"exchangeclone:red_matter", "exchangeclone:red_matter"},
|
||||
{"exchangeclone:red_matter", "exchangeclone:red_matter"}
|
||||
|
@ -127,15 +127,13 @@ minetest.register_craft({
|
|||
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"}
|
||||
{"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"}
|
||||
{"exchangeclone:red_matter_block",}
|
||||
}
|
||||
})
|
|
@ -69,7 +69,7 @@ local function deconstructor_action(pos)
|
|||
end
|
||||
local stack = inv:get_stack("src", 1)
|
||||
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()
|
||||
if wear and wear > 1 then
|
||||
individual_energy_value = math.floor(individual_energy_value * (65536 / wear))
|
||||
|
|
|
@ -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"},
|
||||
})
|
|
@ -14,7 +14,7 @@ exchangeclone.orb_max = 51200000 -- Max capacity of Klein Star Omega in ProjectE
|
|||
|
||||
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
|
||||
|
||||
dofile(modpath.."/lib.lua")
|
||||
|
@ -29,6 +29,7 @@ end
|
|||
if exchangeclone.mcl then
|
||||
mcl_item_id.set_mod_namespace("exchangeclone")
|
||||
dofile(modpath.."/shears.lua")
|
||||
dofile(modpath.."/tool_upgrades.lua")
|
||||
end
|
||||
dofile(modpath.."/multidig.lua")
|
||||
dofile(modpath.."/swords.lua")
|
||||
|
@ -38,8 +39,8 @@ 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")
|
||||
if minetest.get_modpath("hopper") then
|
||||
dofile(modpath.."/hopper_compat.lua")
|
||||
end
|
||||
dofile(modpath.."/philosophers_stone.lua")
|
||||
dofile(modpath.."/pesa.lua")
|
||||
|
|
|
@ -15,6 +15,7 @@ end
|
|||
|
||||
function exchangeclone.get_item_energy(item)
|
||||
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
|
||||
local item_group = item:sub(7,-1)
|
||||
for _, group in ipairs(exchangeclone.group_values) do
|
||||
|
@ -34,9 +35,10 @@ function exchangeclone.get_item_energy(item)
|
|||
end
|
||||
return cheapest
|
||||
end
|
||||
-- handle items/itemstacks
|
||||
item = ItemStack(item)
|
||||
local meta_energy_value = item:get_meta():get_int("exchangeclone_energy_value")
|
||||
if meta_energy_value > 0 then
|
||||
local meta_energy_value = tonumber(item:get_meta():get_string("exchangeclone_energy_value"))
|
||||
if meta_energy_value and meta_energy_value > 0 then
|
||||
return meta_energy_value
|
||||
end
|
||||
local def = minetest.registered_items[item:get_name()]
|
||||
|
@ -85,16 +87,11 @@ end
|
|||
-- Decides what mod to use for sounds
|
||||
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_energy(inventory, listname, index, amount)
|
||||
if not inventory 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)
|
||||
if not itemstack then return end
|
||||
if itemstack:get_name() ~= "exchangeclone:exchange_orb" then return end
|
||||
function exchangeclone.set_orb_itemstack_energy(itemstack, amount)
|
||||
if not itemstack or not amount then return minetest.log(">:(") end
|
||||
if itemstack:get_name() ~= "exchangeclone:exchange_orb" then minetest.log(":O") return end
|
||||
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
|
||||
-- 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 r, g, b = 0, 0, 0
|
||||
if amount >= 0 then
|
||||
if amount <= 0 then
|
||||
-- do nothing
|
||||
elseif sqrt_amount < (sqrt_max/4) then
|
||||
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
|
||||
|
||||
local colorstring = minetest.rgba(r,g,b)
|
||||
|
||||
minetest.log(colorstring)
|
||||
local meta = itemstack:get_meta()
|
||||
meta:set_float("stored_energy", amount)
|
||||
meta:set_string("description", "Exchange Orb\nCurrent Charge: "..amount)
|
||||
meta:set_string("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
|
||||
|
||||
-- HUD stuff (show energy value in bottom right)
|
||||
|
@ -170,10 +178,17 @@ end
|
|||
-- Set a player's personal energy
|
||||
function exchangeclone.set_player_energy(player, amount)
|
||||
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))
|
||||
exchangeclone.update_hud(player)
|
||||
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
|
||||
-- Basically gets the highest number Lua supports
|
||||
|
||||
|
@ -198,6 +213,19 @@ while step > 0 do
|
|||
step = math.floor(step/2)
|
||||
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).
|
||||
function exchangeclone.get_group_items(groups, allow_duplicates, include_no_group)
|
||||
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
|
||||
include_no_group = include_no_group or false
|
||||
|
||||
local g_cnt = #groups
|
||||
local num_groups = #groups
|
||||
|
||||
local result = {}
|
||||
for i = 1, g_cnt do
|
||||
for i = 1, num_groups do
|
||||
result[groups[i]] = {}
|
||||
end
|
||||
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
|
||||
in_group = false
|
||||
for i = 1, g_cnt do
|
||||
for i = 1, num_groups do
|
||||
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
|
||||
in_group = true
|
||||
if allow_duplicates == false then
|
||||
|
|
|
@ -134,7 +134,7 @@ local function handle_inventory(player, inventory, to_list)
|
|||
local orb_energy = exchangeclone.get_orb_itemstack_energy(stack)
|
||||
local charge_amount = math.min(exchangeclone.orb_max - orb_energy, player_energy)
|
||||
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.show_transmutation_table_formspec(player)
|
||||
end
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
# Exchange Orb maximum energy (default 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
|
|
@ -1,4 +1,3 @@
|
|||
minetest.log("Wrapping craft function")
|
||||
exchangeclone = {recipes = {}}
|
||||
|
||||
local old_func = minetest.register_craft
|
||||
|
@ -7,6 +6,32 @@ function minetest.register_craft(arg, ...)
|
|||
local itemstring = ItemStack(arg.output):get_name()
|
||||
exchangeclone.recipes[itemstring] = exchangeclone.recipes[itemstring] or {}
|
||||
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
|
||||
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
|
Loading…
Reference in New Issue