From 47450327c42c265c8b86cebfd0a3ac781f195bc9 Mon Sep 17 00:00:00 2001 From: ThePython <87204246+ThePython10110@users.noreply.github.com> Date: Sat, 2 Mar 2024 12:55:08 -0800 Subject: [PATCH] Fixed bugs with pedestal abilities, started working on Alchemical Books --- README.md | 9 +- exchangeclone/alchemical_books.lua | 141 +++++++++++++++++++++++++++ exchangeclone/init.lua | 1 + exchangeclone/passive_stones.lua | 30 +++++- exchangeclone/talisman_of_repair.lua | 31 +++--- 5 files changed, 189 insertions(+), 23 deletions(-) create mode 100644 exchangeclone/alchemical_books.lua diff --git a/README.md b/README.md index be6ad2a..d2cbf2d 100644 --- a/README.md +++ b/README.md @@ -92,18 +92,13 @@ You can find the old textures and sounds by going back to previous commits in Gi - [ ] Add Void Ring - [x] Add DM Pedestal - [ ] Add Pedestal abilities - - [ ] Passive Stones - - [x] Soul - - [x] Body - - [x] Life - - [ ] Mind - - [ ] Talisman + - [x] Passive Stones + - [x] Talisman - [ ] Evertide - [ ] Volcanite - [ ] Zero - [ ] Ignition - [ ] Black Hole/Void - - [ ] Functions for passive stones, talisman, evertide/volcanite, zero/ignition ## Changelog
Look at this fancy expanding changelog diff --git a/exchangeclone/alchemical_books.lua b/exchangeclone/alchemical_books.lua new file mode 100644 index 0000000..355722f --- /dev/null +++ b/exchangeclone/alchemical_books.lua @@ -0,0 +1,141 @@ +local function extract_dimension(pos) + if exchangeclone.mtg then + if minetest.get_modpath("nether") then + if pos.y >= nether.DEPTH_FLOOR and pos.y <= nether.DEPTH_CEILING then + local report_y = pos.y - nether.DEPTH_FLOOR + return "Nether", {x = pos.x, y = report_y, z = pos.z} + else + return "Overworld", pos + end + end + return nil, pos + end + + -- overworld + if (pos.y >= mcl_vars.mg_overworld_min) and (pos.y <= mcl_vars.mg_overworld_max) then + return "Overworld", pos + end + + -- nether + if (pos.y >= mcl_vars.mg_nether_min) and (pos.y <= mcl_vars.mg_nether_max) then + local report_y = pos.y - mcl_vars.mg_nether_min + return "Nether", {x = pos.x, y = report_y, z = pos.z} + end + + -- end + if (pos.y >= mcl_vars.mg_end_min) and (pos.y <= mcl_vars.mg_end_max) then + local report_y = pos.y - mcl_vars.mg_end_min + return "End", {x = pos.x, y = report_y, z = pos.z} + end + + -- outside of scoped bounds. + return "Void", pos +end + +local function add_dimension(dimension, pos) + dimension = dimension:lower() + if exchangeclone.mtg then + if dimension == "nether" then + if minetest.get_modpath("nether") then + local report_y = pos.y + nether.DEPTH_FLOOR + return {x = pos.x, y = report_y, z = pos.z} + end + end + return pos + end + + if dimension == "nether" then + local report_y = pos.y + mcl_vars.mg_nether_min + return {x = pos.x, y = report_y, z = pos.z} + end + + if dimension == "end" then + local report_y = pos.y + mcl_vars.mg_end_min + return {x = pos.x, y = report_y, z = pos.z} + end + + return pos +end + +local base_formspec = { + "formspec_version[3]", + "size[13,10]", + "textarea[8.5,0.5;3,0.7;name;;Location Name]", + "button[11.5,0.5;1,0.7;add;Add]", + "button[8.5,1.5;4,1;teleport;Teleport]", + "button[8.5,2.75;4,1;rename;Rename]", + "button[8.5,4;4,1;up;Move Up]", + "button[8.5,5.25;4,1;down;Move Down]", + "button[8.5,6.5;4,1;delete;Delete]", + "field_close_on_enter[name;false]", + "field_enter_after_edit[name;false]" +} + +local using_stack_data = {} + +-- player: The player to be shown the formspec +-- index: The index of the location the player is currently selecting +-- use_stack_data: Whether to use locations stored with the book or the player. +local function show_formspec(player, index, use_stack_data) + local stack = player:get_wielded_item() + if minetest.get_item_group(stack:get_name(), "exchangeclone_alchemical_book") < 1 then + return + end + using_stack_data[player:get_player_name()] = use_stack_data + local book_data = stack:get_definition().alchemical_book_data + local data = minetest.deserialize((use_stack_data and stack or player):get_meta():get_string("exchangeclone_alchemical_book")) + local formspec = table.copy(base_formspec) + local player_pos = player:get_pos() + if type(data) ~= "table" then + data = {} + end + if not data.locations then + data.locations = {} + end + if #data.locations > 0 then + formspec[#formspec+1] = "textlist[0.5,0.5;7,7;location_list;" + for _, location in ipairs(data.locations) do + formspec[#formspec+1] = minetest.formspec_escape(location.name)..";" + end + formspec[#formspec+1] = "]" + end + if index then + local selected = data.locations[index] + if selected then + local dimension, pos = extract_dimension(selected.pos) + local dimension_string = dimension and (" ("..dimension..")") or "" + local distance = vector.distance(pos, player_pos) + local cost = book_data.emc_per_node*distance + local info = minetest.formspec_escape(string.format([[%s +Position: %s, %s, %s%s +Distance: %s +Cost: %s EMC]], selected.name, pos.x, pos.y, pos.z, dimension_string, distance, cost)) + formspec[#formspec+1] = "textarea[0.5,8;4,4;;;"..info.."]" + end + end + minetest.show_formspec(player:get_player_name(), "exchangeclone_alchemical_book", table.concat(formspec)) +end + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname ~= "exchangeclone_alchemical_book" then return end + if fields.quit == "true" then return end + local use_stack_data = using_stack_data[player:get_player_name()] + local stack = player:get_wielded_item() + local data = minetest.deserialize((use_stack_data and stack or player):get_meta():get_string("exchangeclone_alchemical_book")) + if type(data) ~= "table" then + data = {} + end + if not data.locations then + data.locations = {} + end + minetest.log(dump(fields)) +end) + +minetest.register_tool("exchangeclone:basic_alchemical_book", { + description = "Basic Alchemical Book", + groups = {exchangeclone_alchemical_book = 1}, + alchemical_book_data = {emc_per_node = 1000}, + on_secondary_use = function(itemstack, player, pointed_thing) + show_formspec(player) + end +}) \ No newline at end of file diff --git a/exchangeclone/init.lua b/exchangeclone/init.lua index 5ab69e2..2286eaf 100644 --- a/exchangeclone/init.lua +++ b/exchangeclone/init.lua @@ -131,6 +131,7 @@ local files = { "talisman_of_repair", "passive_stones", "emc_link", + "alchemical_books", "dark_matter_pedestal", } diff --git a/exchangeclone/passive_stones.lua b/exchangeclone/passive_stones.lua index d7f477f..f60b284 100644 --- a/exchangeclone/passive_stones.lua +++ b/exchangeclone/passive_stones.lua @@ -43,8 +43,10 @@ minetest.register_tool("exchangeclone:soul_stone", { exclude = {"exchangeclone:life_stone"} }, _exchangeclone_pedestal = function(pos) - for _, player in minetest.get_objects_inside_radius(pos, 5) do - heal(player, 2) + for _, object in pairs(minetest.get_objects_inside_radius(pos, 5)) do + if object:is_player() then + heal(object, 2) + end end end, on_secondary_use = exchangeclone.toggle_active, @@ -79,7 +81,7 @@ if (exchangeclone.mcl and mcl_hunger.active) or (exchangeclone.mtg and minetest. _exchangeclone_pedestal = function(pos) for _, object in pairs(minetest.get_objects_inside_radius(pos, 5)) do if object:is_player() then - heal(object, 2) + satiate(object, 2) end end end, @@ -174,12 +176,12 @@ if exchangeclone.mcl then mcl_experience.set_xp(player, player_xp - amount_to_take) stored = stored + amount_to_take meta:set_int("exchangeclone_stored_xp", stored) - meta:set_string("description", get_mind_description(itemstack)) if stored > 0 then meta:set_string("exchangeclone_emc_value", "none") else meta:set_string("exchangeclone_emc_value", "") end + meta:set_string("description", get_mind_description(itemstack)) return itemstack else local player_xp = mcl_experience.get_xp(player) @@ -208,7 +210,25 @@ if exchangeclone.mcl then on_secondary_use = mind_action, on_place = mind_action, groups = {exchangeclone_passive = 1, disable_repair = 1}, - _mcl_generate_description = get_mind_description + _mcl_generate_description = get_mind_description, + _exchangeclone_pedestal = function(pos, itemstack) + local meta = itemstack:get_meta() + for _, object in pairs(minetest.get_objects_inside_radius(pos, 5)) do + local lua_entity = object:get_luaentity() + if lua_entity and lua_entity.name == "mcl_experience:orb" then + local amount = lua_entity._xp + meta:set_int("exchangeclone_stored_xp", meta:get_int("exchangeclone_stored_xp") + amount) + if meta:get_int("exchangeclone_stored_xp") > 0 then + meta:set_string("exchangeclone_emc_value", "none") + else + meta:set_string("exchangeclone_emc_value", "") + end + meta:set_string("description", get_mind_description(itemstack)) + object:remove() + end + end + return itemstack + end, }) local book = "mcl_books:book" diff --git a/exchangeclone/talisman_of_repair.lua b/exchangeclone/talisman_of_repair.lua index bd20b1c..33f0228 100644 --- a/exchangeclone/talisman_of_repair.lua +++ b/exchangeclone/talisman_of_repair.lua @@ -42,23 +42,32 @@ local function repair_items(inv, listname) end end +local function repair_player_inv(player) + local inv = player:get_inventory() + repair_items(inv, "main") + if exchangeclone.mcl then + repair_items(inv, "offhand") + repair_items(inv, "armor") + elseif minetest.get_modpath("3d_armor") then + local _, armor_inv = armor:get_valid_player(player, "3d_armor") + repair_items(armor_inv, "armor") + end +end + minetest.register_tool("exchangeclone:talisman_of_repair", { description = "Talisman of Repair", inventory_image = "exchangeclone_talisman_of_repair.png", _exchangeclone_passive = { - func = function(player) - local inv = player:get_inventory() - repair_items(inv, "main") - if exchangeclone.mcl then - repair_items(inv, "offhand") - repair_items(inv, "armor") - elseif minetest.get_modpath("3d_armor") then - local _, armor_inv = armor:get_valid_player(player, "3d_armor") - repair_items(armor_inv, "armor") - end - end, + func = repair_player_inv, always_active = true }, + _exchangeclone_pedestal = function(pos) + for _, object in pairs(minetest.get_objects_inside_radius(pos, 5)) do + if object:is_player() then + repair_player_inv(object) + end + end + end, groups = {exchangeclone_passive = 1, disable_repair = 1} })