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",
"mcl_crafting_table",
"mcl_enchantments",
"technic",
"Raycast",
"Settings",

View File

@ -1,5 +1,5 @@
# Code of Conduct
Don't be evil.
Don't be evil.
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.
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>
### 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.

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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

View File

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

View File

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

View File

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

View File

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