diff --git a/crystals.lua b/crystals.lua index b40347e..81fbf61 100644 --- a/crystals.lua +++ b/crystals.lua @@ -146,6 +146,7 @@ function magicalities.register_crystal(element, description, color) use_texture_alpha = true, mesh = "crystal.obj", paramtype = "light", + paramtype2 = "wallmounted", drawtype = "mesh", light_source = 4, _element = element, @@ -206,16 +207,19 @@ function magicalities.register_crystal(element, description, color) sounds = default.node_sound_glass_defaults(), }) - -- Crystal clusters as ores - minetest.register_ore({ - ore_type = "scatter", - ore = "magicalities:crystal_cluster_"..element, - wherein = "default:stone", - clust_scarcity = 19 * 19 * 19, - clust_num_ores = 1, - clust_size = 1, - y_max = -30, - y_min = -31000, + -- Register cave crystal appearances + minetest.register_decoration({ + deco_type = "simple", + place_on = "default:stone", + sidelen = 16, + + y_max = -30, + y_min = -31000, + flags = "all_floors, all_ceilings", + + fill_ratio = 0.0008, + + decoration = "magicalities:crystal_cluster_"..element, }) minetest.register_craft({ @@ -278,3 +282,17 @@ minetest.register_abm({ end end }) + +minetest.register_on_generated(function (minp, maxp) + local clusters = minetest.find_nodes_in_area(minp, maxp, "group:crystal_cluster") + for _, pos in pairs(clusters) do + local stone = minetest.find_node_near(pos, 1, "default:stone") + if stone then + local param2 = minetest.dir_to_wallmounted(vector.direction(pos, stone)) + + local node = minetest.get_node(pos) + node.param2 = param2 + minetest.set_node(pos, node) + end + end +end) diff --git a/focuses.lua b/focuses.lua index ad9dac0..5c8fc80 100644 --- a/focuses.lua +++ b/focuses.lua @@ -39,3 +39,77 @@ minetest.register_craftitem("magicalities:focus_teleport", { return itemstack end }) + +minetest.register_craftitem("magicalities:focus_swap", { + description = "Wand Focus of Swapping", + groups = {wand_focus = 1}, + inventory_image = "magicalities_focus_swap.png", + stack_max = 1, + _wand_requirements = { + ["earth"] = 1 + }, + _wand_use = function (itemstack, user, pointed_thing) + local meta = itemstack:get_meta() + local tnode = meta:get_string("swapnode") + local pname = user:get_player_name() + if tnode == "" or pointed_thing.type ~= "node" then return itemstack end + + local pos = pointed_thing.under + + if minetest.is_protected(pos, pname) then + return itemstack + end + + local node = minetest.get_node_or_nil(pos) + if not node or node.name == tnode then + return itemstack + end + + local place_node_itm = ItemStack(tnode) + local inv = user:get_inventory() + + local ndef = minetest.registered_nodes[tnode] + if not inv:contains_item("main", place_node_itm) then + minetest.chat_send_player(pname, ("You don't have enough %s in your inventory."):format(ndef.description)) + return itemstack + end + + local drops = minetest.get_node_drops(pos) + + if ndef.can_dig ~= nil and not ndef.can_dig(pos, user) then + return itemstack + end + + minetest.remove_node(pos) + + itemstack = magicalities.wands.wand_take_contents(itemstack, {earth = 1}) + magicalities.wands.update_wand_desc(itemstack) + + inv:remove_item("main", place_node_itm) + + for _, stk in pairs(drops) do + if inv:room_for_item("main", stk) then + inv:add_item("main", stk) + else + minetest.item_drop(ItemStack(stk), user, vector.add(pos, {x=0,y=1,z=0})) + end + end + + minetest.place_node(pos, {name = tnode}) + + return itemstack + end, + _wand_node = function (pos, node, placer, itemstack, pointed_thing) + if not node or node.name == "air" or node.name == "ignore" then return itemstack end + local meta = itemstack:get_meta() + local tnode = meta:get_string("swapnode") + + if tnode == node.name then return itemstack end + meta:set_string("swapnode", node.name) + + local ndef = minetest.registered_nodes[node.name] + minetest.chat_send_player(placer:get_player_name(), "Selected replacement node " .. ndef.description) + + return itemstack + end +}) diff --git a/table.lua b/table.lua index 987bb12..9add630 100644 --- a/table.lua +++ b/table.lua @@ -3,10 +3,10 @@ magicalities.arcane = {} magicalities.arcane.recipes = {} local fmspecelems = { - ["earth"] = {3, 0.15}, + ["earth"] = {2.98, 0.15}, ["water"] = {1, 1}, ["air"] = {5, 1}, - ["fire"] = {3, 4.85}, + ["fire"] = {2.98, 4.85}, ["light"] = {1, 4}, ["dark"] = {5, 4} } diff --git a/textures/magicalities_focus_swap.png b/textures/magicalities_focus_swap.png new file mode 100644 index 0000000..10fbb6e Binary files /dev/null and b/textures/magicalities_focus_swap.png differ diff --git a/textures/magicalities_symbol_hexagram.png b/textures/magicalities_symbol_hexagram.png index 6b6bc65..d455676 100644 Binary files a/textures/magicalities_symbol_hexagram.png and b/textures/magicalities_symbol_hexagram.png differ