From 9c9c620b84ae8951adbe3d4ba81d2d87eb0330b5 Mon Sep 17 00:00:00 2001 From: ThePython <87204246+ThePython10110@users.noreply.github.com> Date: Sun, 19 Nov 2023 16:01:56 -0800 Subject: [PATCH] Hoppers work now, among other things. --- .luacheckrc | 3 ++ README.md | 10 ++-- _exchangeclone_energy/energy_values.lua | 26 +++++----- _exchangeclone_energy/init.lua | 3 +- exchangeclone/alchemical_chests.lua | 4 ++ exchangeclone/constructor.lua | 35 +++++++++++++- exchangeclone/energy_collector.lua | 63 +++++++++++++------------ exchangeclone/hopper_compat.lua | 18 ++++--- exchangeclone/init.lua | 7 ++- exchangeclone/lib.lua | 56 +++++++++++++++++++++- exchangeclone/mod.conf | 2 +- zzzz_exchangeclone_crafthook/init.lua | 2 +- 12 files changed, 166 insertions(+), 63 deletions(-) diff --git a/.luacheckrc b/.luacheckrc index fed919d..57dad0d 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -30,7 +30,10 @@ read_globals = { "screwdriver", "mcl_crafting_table", "mcl_enchantments", + "technic", + "hopper", + "pipeworks", "Raycast", "Settings", diff --git a/README.md b/README.md index f895dfc..2db75f5 100644 --- a/README.md +++ b/README.md @@ -56,18 +56,17 @@ Dependencies: Minetest Game or MineClone.

Changelog:

-### 6.0 (interestingness depends on several things) +### 6.0) * 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 `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. + * Technic recipe types (grinding, alloying, etc.) will 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 Chests, Alchemical Bags, and Advanced Alchemical Chests - * 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) + * Support for Pipeworks and non-MCL hoppers (MineClone hoppers already worked)! + * Covalence Dust (Aux1+right-click with Philosopher's Stone to open repairing menu; 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): @@ -86,6 +85,7 @@ Dependencies: Minetest Game or MineClone. * 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). + * Tool abilities now take upgrades into account (silk touch, fortune, etc.) except for the sword AOE ability (which is annoying). * Bugfixes: * Fixed potion energy values * Fixed Red Matter Shield recipe diff --git a/_exchangeclone_energy/energy_values.lua b/_exchangeclone_energy/energy_values.lua index 4898b39..4ce7724 100644 --- a/_exchangeclone_energy/energy_values.lua +++ b/_exchangeclone_energy/energy_values.lua @@ -1,21 +1,17 @@ --- This lets mods add things to these lists if they want. -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 unnecessary for single items because order doesn't matter for them. The NO_GROUP value is for values that are not in any other group, but adding this means that NO items will have their energy calculated by recipes. ]] - exchangeclone.group_values = { + table.insert_all(exchangeclone.group_values, { {"flower", 8}, {"mushroom", 32}, {"smithing_template", 8192*7+1792*2}, {"decorated_pot_recipe", 4}, -- has to be 4 because of brick. - } + }) - exchangeclone.energy_values = { + for itemstring, energy_value in pairs({ ["fake_liquids:bucket_fake_lava"] = 832, ["fake_liquids:bucket_fake_water"] = 960, @@ -277,8 +273,12 @@ if exchangeclone.mcl then ["meat_blocks:meatball"] = 64, ["mesecons:redstone"] = 64, ["useful_green_potatoes:useful_green_potato"] = 256, - } - exchangeclone.mcl_potion_data = { -- automatically assumes base cost is awkward potion if not specified + }) do + exchangeclone.energy_values[itemstring] = exchangeclone.energy_values[itemstring] or energy_value + end + + exchangeclone.mcl_potion_data = exchangeclone.mcl_potion_data or {} + table.insert_all(exchangeclone.mcl_potion_data, { -- automatically assumes base cost is awkward potion if not specified {name = "water", ingredient_cost = 0, custom_base_cost = 0, no_arrow = true}, {name = "awkward", ingredient_cost = 0, no_arrow = true}, {name = "fire_resistance", ingredient_cost = 768, plus = true}, @@ -295,9 +295,9 @@ if exchangeclone.mcl then {name = "water_breathing", ingredient_cost = 64, plus = true}, {name = "invisibility", ingredient_cost = 192, custom_base_cost = 623, plus = true}, {name = "withering", ingredient_cost = 128, plus = true, two = true} - } + }) else - exchangeclone.energy_values = { + for itemstring, energy_value in pairs({ ["bones:bones"] = 4, ["bucket:bucket_lava"] = 896, @@ -376,7 +376,9 @@ else ["technic:zinc_ingot"] = 512, ["useful_green_potatoes:useful_green_potato"] = 256 - } + }) do + exchangeclone.energy_values[itemstring] = exchangeclone.energy_values[itemstring] or energy_value + end exchangeclone.group_values = { {"flower", 32}, diff --git a/_exchangeclone_energy/init.lua b/_exchangeclone_energy/init.lua index 0ef7093..5178846 100644 --- a/_exchangeclone_energy/init.lua +++ b/_exchangeclone_energy/init.lua @@ -141,6 +141,7 @@ minetest.register_on_mods_loaded(function() if exchangeclone.mcl then for i = 0, 31 do exchangeclone.register_energy_alias("mcl_compass:18", "mcl_compass:"..i) + exchangeclone.register_energy_alias("mcl_compass:18", "mcl_compass:"..i.."_lodestone") end for i = 0, 63 do exchangeclone.register_energy_alias("mcl_clock:clock", "mcl_clock:clock_"..i) @@ -184,7 +185,7 @@ minetest.register_on_mods_loaded(function() end for i = 1, exchangeclone.num_passes do - minetest.log("action", "ExchangeClone: \tPASS #"..i..":") + minetest.log("action", "ExchangeClone: \tPASS #"..i) if auto == {} then break end for itemstring, _ in pairs(auto) do local cheapest = get_cheapest_recipe(exchangeclone.recipes[itemstring]) diff --git a/exchangeclone/alchemical_chests.lua b/exchangeclone/alchemical_chests.lua index 9e220b4..66bbeec 100644 --- a/exchangeclone/alchemical_chests.lua +++ b/exchangeclone/alchemical_chests.lua @@ -55,6 +55,8 @@ end minetest.register_node("exchangeclone:alchemical_chest", { description = S("Alchemical Chest"), groups = {container = 2, alchemical_chest = 1, cracky = 2, pickaxey = 2}, + _mcl_hardness = 3, + _mcl_blast_resistance = 6, on_construct = function(pos) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() @@ -136,6 +138,8 @@ for dye_color, color in pairs(colors) do minetest.register_node(advanced_itemstring, { description = S("@1 Advanced Alchemical Chest", color).."\n"..S("Shift+right-click with an alchemical bag to change the color."), + _mcl_hardness = 3, + _mcl_blast_resistance = 6, groups = {container = 2, advanced_alchemical_chest = 1}, on_construct = alchemical_on_construct(color) }) diff --git a/exchangeclone/constructor.lua b/exchangeclone/constructor.lua index 51a013a..daae2e8 100644 --- a/exchangeclone/constructor.lua +++ b/exchangeclone/constructor.lua @@ -155,7 +155,7 @@ minetest.register_node("exchangeclone:constructor", { "exchangeclone_constructor_right.png", "exchangeclone_constructor_right.png" }, - groups = {cracky = 2, container = 4, pickaxey = 2}, + groups = {cracky = 2, container = 4, pickaxey = 2, tubedevice = 1, tubedevice_receiver = 1}, _mcl_hardness = 3, _mcl_blast_resistance = 6, sounds = exchangeclone.sound_mod.node_sound_metal_defaults(), @@ -180,6 +180,9 @@ minetest.register_node("exchangeclone:constructor", { after_place_node = function(pos, player, itemstack, pointed_thing) local meta = minetest.get_meta(pos) meta:set_string("exchangeclone_placer", player:get_player_name()) + if exchangeclone.pipeworks then + pipeworks.after_place(pos, player, itemstack, pointed_thing) + end end, on_construct = on_construct, on_metadata_inventory_move = constructor_action, @@ -195,6 +198,36 @@ minetest.register_node("exchangeclone:constructor", { on_timer = constructor_action, }) +if exchangeclone.pipeworks then + local function get_list(direction) + return (direction.y == 0 and "src") or "fuel" + end + minetest.override_item("exchangeclone:constructor", { + tube = { + input_inventory = "dst", + connect_sides = {left = 1, right = 1, back = 1, front = 1, bottom = 1, top = 1}, + insert_object = function(pos, node, stack, direction) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + minetest.get_node_timer(pos):start(1) + return inv:add_item(get_list(direction), stack) + end, + can_insert = function(pos, node, stack, direction) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if get_list(direction) == "fuel" then + if stack:get_name() == "exchangeclone:exchange_orb" then + return inv:room_for_item("fuel", stack) + end + else + return inv:room_for_item("src", stack) + end + end, + }, + on_rotate = pipeworks.on_rotate, + }) +end + local recipe_ingredient = "default:pick_diamond" if exchangeclone.mcl then diff --git a/exchangeclone/energy_collector.lua b/exchangeclone/energy_collector.lua index 7885bca..9fa9f64 100644 --- a/exchangeclone/energy_collector.lua +++ b/exchangeclone/energy_collector.lua @@ -7,7 +7,7 @@ local formspec = exchangeclone.inventory_formspec(0,5).. "listring[current_player;main]".. "listring[context;main]".. - exchangeclone.mcl and mcl_formspec.get_itemslot_bg(4,2,1,1) + (exchangeclone.mcl and mcl_formspec.get_itemslot_bg(4,2,1,1) or "") minetest.register_alias("exchangeclone:energy_collector", "exchangeclone:energy_collector_mk1") @@ -164,6 +164,9 @@ local function on_dig_node(pos, oldnode, oldmetadata, player) end meta:from_table(meta2) end + if exchangeclone.pipeworks then + pipeworks.after_dig(pos) + end end function exchangeclone.register_energy_collector(itemstring, name, amount, modifier, recipe) @@ -177,7 +180,7 @@ function exchangeclone.register_energy_collector(itemstring, name, amount, modif "exchangeclone_energy_collector_right.png"..modifier, "exchangeclone_energy_collector_right.png"..modifier }, - groups = {cracky = 2, container = 2, pickaxey = 2, energy_collector = amount}, + groups = {cracky = 2, container = 2, pickaxey = 2, energy_collector = amount, tubedevice = 1, tubedevice_receiver = 1}, _mcl_hardness = 3, _mcl_blast_resistance = 6, sounds = exchangeclone.sound_mod.node_sound_metal_defaults(), @@ -204,8 +207,12 @@ function exchangeclone.register_energy_collector(itemstring, name, amount, modif meta:set_int("collector_amount", amount) meta:set_string("exchangeclone_placer", player_name) meta:set_string("infotext", name.."\n"..S("Owned by ")..player_name) + if exchangeclone.pipeworks then + pipeworks.after_place(pos, player, itemstack, pointed_thing) + end end, on_blast = on_blast, + on_rotate = exchangeclone.pipeworks and pipeworks.on_rotate, allow_metadata_inventory_put = allow_metadata_inventory_put, allow_metadata_inventory_move = allow_metadata_inventory_move, allow_metadata_inventory_take = allow_metadata_inventory_take, @@ -214,36 +221,30 @@ function exchangeclone.register_energy_collector(itemstring, name, amount, modif output = itemstring, recipe = recipe }) -end ---[[if minetest.get_modpath("pipeworks") then - minetest.override_item("exchangeclone:energy_collector", { - tube = { - input_inventory = "main", - connect_sides = {left = 1, right = 1, back = 1, front = 1, bottom = 1, top = 1}, - insert_object = function(pos, node, stack, direction) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - return inv:add_item("main", stack) - end, - can_insert = function(pos, node, stack, direction) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - if stack:get_name() == "exchangeclone:exchange_orb" then - minetest.log(inv:room_for_item("main", stack)) - return inv:room_for_item("main", stack) - else - minetest.log("failed") - end - end, - }, - after_place_node = function(pos, player) - pipeworks.after_place(pos) - end, - after_dig_node = pipeworks.after_dig, - on_rotate = pipeworks.on_rotate, - }) -end]] + if exchangeclone.pipeworks then + minetest.override_item(itemstring, { + tube = { + input_inventory = "main", + connect_sides = {left = 1, right = 1, back = 1, front = 1, bottom = 1, top = 1}, + insert_object = function(pos, node, stack, direction) + minetest.log(dump(direction)) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return inv:add_item("main", stack) + end, + can_insert = function(pos, node, stack, direction) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if stack:get_name() == "exchangeclone:exchange_orb" then + return inv:room_for_item("main", stack) + end + end, + }, + on_rotate = pipeworks.on_rotate, + }) + end +end local iron = "default:steelblock" local glass = "default:glass" diff --git a/exchangeclone/hopper_compat.lua b/exchangeclone/hopper_compat.lua index 9e41df4..1a46c2d 100644 --- a/exchangeclone/hopper_compat.lua +++ b/exchangeclone/hopper_compat.lua @@ -7,16 +7,20 @@ hopper:add_container({ {"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"}, + {"top", "group:container=3", "main"}, + {"bottom", "group:container=3", "main"}, + {"side", "group:container=3", "main"}, }) --- Hoppers will only be able to insert into one side of a double chest (unless you have 1 hopper per side) +-- I assumed "top" meant when it's on top of a node, not when there's a node on top of it. Whoops. +hopper:add_container({ + {"top", "group:container=4", "dst"}, + {"side", "group:container=4", "fuel"}, + {"bottom", "group:container=4", "src"}, +}) + +-- Hoppers will only be able to insert into one side of a double chest, I think (unless you have 1 hopper per side) hopper:add_container({ {"top", "group:container=5", "main"}, {"bottom", "group:container=5", "main"}, diff --git a/exchangeclone/init.lua b/exchangeclone/init.lua index b2c7db3..0051968 100644 --- a/exchangeclone/init.lua +++ b/exchangeclone/init.lua @@ -10,6 +10,7 @@ end exchangeclone.mineclonia = minetest.get_game_info().id == "mineclonia" -- if exchangeclone.mineclonia, exchangeclone.mcl is also defined. +exchangeclone.pipeworks = minetest.get_modpath("pipeworks") exchangeclone.orb_max = 51200000 -- Max capacity of Klein Star Omega in ProjectE @@ -18,7 +19,7 @@ local modpath = minetest.get_modpath("exchangeclone") exchangeclone.orb_max = minetest.settings:get("exchangeclone.orb_max") or 51200000 exchangeclone.num_passes = minetest.settings:get("exchangeclone.num_passes") or 10 -minetest.log("action", "Loading Exchangeclone") +minetest.log("action", "ExchangeClone: Registering own stuff") dofile(modpath.."/lib.lua") dofile(modpath.."/constructor.lua") @@ -51,4 +52,6 @@ dofile(modpath.."/pesa.lua") dofile(modpath.."/infinite_food.lua") dofile(modpath.."/alchemical_chests.lua") dofile(modpath.."/transmutation_table.lua") -dofile(modpath.."/furnaces.lua") \ No newline at end of file +dofile(modpath.."/furnaces.lua") + +minetest.log("action", "ExchangeClone: Done.") \ No newline at end of file diff --git a/exchangeclone/lib.lua b/exchangeclone/lib.lua index bebe0e4..a185880 100644 --- a/exchangeclone/lib.lua +++ b/exchangeclone/lib.lua @@ -170,8 +170,10 @@ end -- Set a player's personal energy function exchangeclone.set_player_energy(player, amount) + amount = tonumber(amount) if not (player and amount) then return end if amount < 0 or amount > exchangeclone.limit then return end + amount = math.floor(amount*4)/4 -- Floor to nearest .25 player:get_meta():set_string("exchangeclone_stored_energy", tonumber(amount)) exchangeclone.update_hud(player) end @@ -179,7 +181,7 @@ 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) + exchangeclone.set_player_energy(player, (exchangeclone.get_player_energy(player) or 0) + amount) end -- Through trial and error, I have found that this number (1 trillion) works the best. @@ -610,4 +612,54 @@ function exchangeclone.check_cooldown(player, name) if exchangeclone.cooldowns[player_name] then return exchangeclone.cooldowns[player_name][name] end -end \ No newline at end of file +end + +-- Chat commands: +minetest.register_chatcommand("add_energy", { + params = "[player] ", + description = "Add to a player's personal energy (player is self if not included, value can be negative)", + privs = {privs = true}, + func = function(name, param) + local split_param = exchangeclone.split(param, " ") + local player + local value + if #split_param == 1 then + player = minetest.get_player_by_name(name) + value = split_param[1] + end + if #split_param == 2 then + player = minetest.get_player_by_name(split_param[1]) + value = split_param[2] + end + if not (player and value) then + minetest.chat_send_player(name, "Bad command. Use /add_energy [player] [value] or /add_energy [value]") + return + end + exchangeclone.add_player_energy(player, tonumber(value)) + end +}) + +minetest.register_chatcommand("set_energy", { + params = "[player] ", + description = "Set a player's personal energy (player is self if not included; use 'limit' as value to set it to maximum)", + privs = {privs = true}, + func = function(name, param) + local split_param = exchangeclone.split(param, " ") + local player + local value + if #split_param == 1 then + player = minetest.get_player_by_name(name) + value = split_param[1] + end + if #split_param == 2 then + player = minetest.get_player_by_name(split_param[1]) + value = split_param[2] + end + if not (player and value) then + minetest.chat_send_player(name, "Bad command. Use '/set_energy player value' or '/set_energy value'") + return + end + if value == "limit" then value = exchangeclone.limit end + exchangeclone.set_player_energy(player, tonumber(value)) + end +}) \ No newline at end of file diff --git a/exchangeclone/mod.conf b/exchangeclone/mod.conf index d120dc8..e024f62 100644 --- a/exchangeclone/mod.conf +++ b/exchangeclone/mod.conf @@ -2,5 +2,5 @@ name = exchangeclone title = ExchangeClone description = The main part of the modpack (depends on both the other mods) min_minetest_version = 5.5 -optional_depends = mcl_core, default, 3d_armor, mcl_item_id, moreswords, hopper, pipeworks +optional_depends = mcl_core, default, mcl_armor, 3d_armor, mcl_item_id, mobs_mc, hopper, pipeworks, mcl_dispensers author = ThePython10110 \ No newline at end of file diff --git a/zzzz_exchangeclone_crafthook/init.lua b/zzzz_exchangeclone_crafthook/init.lua index 93f3cb9..0676e4e 100644 --- a/zzzz_exchangeclone_crafthook/init.lua +++ b/zzzz_exchangeclone_crafthook/init.lua @@ -1,4 +1,4 @@ -exchangeclone = {recipes = {}} +exchangeclone = {recipes = {}, energy_values = {}, group_values = {}} local old_func = minetest.register_craft function minetest.register_craft(arg, ...)