From 329bd2de971bd22c1b7b71a11ad1e1f792666274 Mon Sep 17 00:00:00 2001 From: Evert Date: Tue, 17 Apr 2018 12:39:28 +0300 Subject: [PATCH] first commit --- crystals.lua | 131 +++++++++ init.lua | 26 ++ mod.conf | 3 + models/crystal.obj | 214 +++++++++++++++ table.lua | 300 +++++++++++++++++++++ textures/magicalities_crystal.png | Bin 0 -> 186 bytes textures/magicalities_crystal_shard.png | Bin 0 -> 295 bytes textures/magicalities_gui_arrow.png | Bin 0 -> 634 bytes textures/magicalities_spark.png | Bin 0 -> 233 bytes textures/magicalities_symbol_air.png | Bin 0 -> 3773 bytes textures/magicalities_symbol_dark.png | Bin 0 -> 3333 bytes textures/magicalities_symbol_earth.png | Bin 0 -> 3220 bytes textures/magicalities_symbol_fire.png | Bin 0 -> 5170 bytes textures/magicalities_symbol_hexagram.png | Bin 0 -> 28704 bytes textures/magicalities_symbol_light.png | Bin 0 -> 3266 bytes textures/magicalities_symbol_water.png | Bin 0 -> 3268 bytes textures/magicalities_table_arcane.png | Bin 0 -> 663 bytes textures/magicalities_table_arcane_top.png | Bin 0 -> 520 bytes textures/magicalities_table_wood.png | Bin 0 -> 642 bytes textures/magicalities_table_wood_top.png | Bin 0 -> 613 bytes textures/magicalities_wand_gold.png | Bin 0 -> 403 bytes textures/magicalities_wand_iron.png | Bin 0 -> 412 bytes wands.lua | 223 +++++++++++++++ 23 files changed, 897 insertions(+) create mode 100644 crystals.lua create mode 100644 init.lua create mode 100644 mod.conf create mode 100644 models/crystal.obj create mode 100644 table.lua create mode 100644 textures/magicalities_crystal.png create mode 100644 textures/magicalities_crystal_shard.png create mode 100644 textures/magicalities_gui_arrow.png create mode 100644 textures/magicalities_spark.png create mode 100644 textures/magicalities_symbol_air.png create mode 100644 textures/magicalities_symbol_dark.png create mode 100644 textures/magicalities_symbol_earth.png create mode 100644 textures/magicalities_symbol_fire.png create mode 100644 textures/magicalities_symbol_hexagram.png create mode 100644 textures/magicalities_symbol_light.png create mode 100644 textures/magicalities_symbol_water.png create mode 100644 textures/magicalities_table_arcane.png create mode 100644 textures/magicalities_table_arcane_top.png create mode 100644 textures/magicalities_table_wood.png create mode 100644 textures/magicalities_table_wood_top.png create mode 100644 textures/magicalities_wand_gold.png create mode 100644 textures/magicalities_wand_iron.png create mode 100644 wands.lua diff --git a/crystals.lua b/crystals.lua new file mode 100644 index 0000000..5107b7d --- /dev/null +++ b/crystals.lua @@ -0,0 +1,131 @@ +-- Magicalities crystals + +function magicalities.register_crystal(element, description, color) + -- Crystal Item + minetest.register_craftitem("magicalities:crystal_"..element, { + description = description.." Crystal Shard", + inventory_image = "magicalities_crystal_shard.png^[multiply:"..color, + _element = element, + groups = {crystal = 1, ["elemental_"..element] = 1} + }) + + -- Crystal Cluster + minetest.register_node("magicalities:crystal_cluster_"..element, { + description = description.." Crystal Cluster", + use_texture_alpha = true, + mesh = "crystal.obj", + paramtype = "light", + drawtype = "mesh", + light_source = 4, + _element = element, + collision_box = { + type = "fixed", + fixed = { + {-0.4375, -0.5000, -0.4375, 0.4375, 0.3750, 0.4375} + } + }, + selection_box = { + type = "fixed", + fixed = { + {-0.4375, -0.5000, -0.4375, 0.4375, 0.3750, 0.4375} + } + }, + tiles = { + { + name = "magicalities_crystal.png^[multiply:"..color, + backface_culling = true + } + }, + drop = { + max_items = 1, + items = { + { + items = {"magicalities:crystal_"..element.." 4"}, + rarity = 1, + }, + { + items = {"magicalities:crystal_"..element.." 5"}, + rarity = 5, + }, + }, + }, + groups = {cracky = 3, oddly_breakable_by_hand = 3, crystal_cluster = 1, ["elemental_"..element] = 1}, + sunlight_propagates = true, + is_ground_content = false, + sounds = default.node_sound_glass_defaults(), + }) + + -- Crystal Block + minetest.register_node("magicalities:crystal_block_"..element, { + description = description.." Crystal Block", + use_texture_alpha = true, + paramtype = "light", + drawtype = "glasslike", + tiles = { + { + name = "magicalities_crystal.png^[multiply:"..color + } + }, + groups = {cracky = 3, oddly_breakable_by_hand = 3, crystal_block = 1, ["elemental_"..element] = 1}, + sunlight_propagates = true, + is_ground_content = false, + _element = element, + 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, + }) + + -- Crafting between clusters, shards and blocks + minetest.register_craft({ + type = "shapeless", + output = "magicalities:crystal_cluster_"..element, + recipe = { + "magicalities:crystal_"..element, + "magicalities:crystal_"..element, + "magicalities:crystal_"..element, + "magicalities:crystal_"..element, + "magicalities:crystal_"..element + }, + }) + + minetest.register_craft({ + type = "shapeless", + output = "magicalities:crystal_block_"..element, + recipe = { + "magicalities:crystal_"..element, + "magicalities:crystal_"..element, + "magicalities:crystal_"..element, + "magicalities:crystal_"..element, + "magicalities:crystal_"..element, + "magicalities:crystal_"..element, + "magicalities:crystal_"..element, + "magicalities:crystal_"..element, + "magicalities:crystal_"..element + }, + }) + + minetest.register_craft({ + type = "shapeless", + output = "magicalities:crystal_"..element.." 9", + recipe = { + "magicalities:crystal_block_"..element + }, + }) +end + +-- Register all crystals +for name, data in pairs(magicalities.elements) do + if not data.inheritance then + magicalities.register_crystal(name, data.description, data.color) + end +end diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..0d0c40e --- /dev/null +++ b/init.lua @@ -0,0 +1,26 @@ +-- Magicalities +magicalities = {} + +local modpath = minetest.get_modpath(minetest.get_current_modname()) +magicalities.modpath = modpath + +magicalities.elements = { + -- Base Elements + ["air"] = {color = "#ffff00", description = "Air", inheritance = nil}, + ["water"] = {color = "#003cff", description = "Water", inheritance = nil}, + ["fire"] = {color = "#ff2424", description = "Fire", inheritance = nil}, + ["earth"] = {color = "#00a213", description = "Earth", inheritance = nil}, + ["light"] = {color = "#ffffff", description = "Light", inheritance = nil}, + ["dark"] = {color = "#232323", description = "Dark", inheritance = nil}, + + -- Inherited Elements +} + +-- Crystals +dofile(modpath.."/crystals.lua") + +-- Wands +dofile(modpath.."/wands.lua") + +-- Tables +dofile(modpath.."/table.lua") diff --git a/mod.conf b/mod.conf new file mode 100644 index 0000000..15a7299 --- /dev/null +++ b/mod.conf @@ -0,0 +1,3 @@ +name = magicalities +description = Magic mod. +depends = default diff --git a/models/crystal.obj b/models/crystal.obj new file mode 100644 index 0000000..338e44b --- /dev/null +++ b/models/crystal.obj @@ -0,0 +1,214 @@ +# Blender v2.79 (sub 0) OBJ File: 'crystal.blend' +# www.blender.org +o Circle +v 0.000000 -0.513871 -0.076853 +v -0.072172 -0.525424 -0.023749 +v -0.044605 -0.521011 0.062175 +v 0.044605 -0.506731 0.062175 +v 0.072172 -0.502318 -0.023749 +v -0.112661 0.189941 -0.105862 +v -0.212076 0.174027 -0.032713 +v -0.174103 0.180105 0.085644 +v -0.051219 0.199776 0.085644 +v -0.013246 0.205854 -0.032713 +v -0.144633 0.389677 -0.000000 +v 0.050003 -0.507107 -0.059548 +v -0.001855 -0.489759 -0.015181 +v 0.017953 -0.508363 0.049781 +v 0.082052 -0.537208 0.045563 +v 0.101860 -0.536432 -0.022006 +v 0.279996 -0.003452 -0.008753 +v 0.208564 0.020444 0.052361 +v 0.235849 -0.005181 0.141845 +v 0.324144 -0.044915 0.136035 +v 0.351428 -0.043846 0.042961 +v 0.345267 0.126615 0.093655 +v 0.006559 -0.529833 -0.071262 +v -0.027307 -0.501216 -0.033591 +v 0.003446 -0.492188 0.014964 +v 0.056318 -0.515225 0.007302 +v 0.058242 -0.538491 -0.045988 +v 0.151323 -0.135651 -0.257527 +v 0.104674 -0.096232 -0.205638 +v 0.147036 -0.083796 -0.138754 +v 0.219865 -0.115530 -0.149308 +v 0.222514 -0.147578 -0.222713 +v 0.211547 -0.002344 -0.242770 +v 0.019552 -0.525602 -0.053058 +v -0.018678 -0.525725 -0.027794 +v -0.011679 -0.498792 0.008613 +v 0.030877 -0.482024 0.005850 +v 0.050179 -0.498593 -0.032265 +v -0.102357 -0.248972 -0.251876 +v -0.155018 -0.249141 -0.217076 +v -0.145377 -0.212042 -0.166927 +v -0.086758 -0.188944 -0.170733 +v -0.060170 -0.211768 -0.223235 +v -0.145122 -0.141584 -0.258823 +v -0.018026 -0.520659 0.065952 +v 0.024917 -0.518690 0.081822 +v 0.050201 -0.495533 0.051420 +v 0.022885 -0.483190 0.016761 +v -0.019282 -0.498718 0.025741 +v -0.106777 -0.218207 0.243607 +v -0.047625 -0.215496 0.265468 +v -0.012796 -0.183598 0.223591 +v -0.050423 -0.166595 0.175848 +v -0.108506 -0.187985 0.188219 +v -0.087181 -0.106689 0.267877 +vt 0.036992 0.310017 +vt 0.444154 0.007480 +vt 0.110291 0.000182 +vt 0.272198 0.480906 +vt 0.507409 0.310019 +vt 0.000182 0.315450 +vt 0.265993 0.517594 +vt 0.417569 0.033512 +vt 0.126832 0.033512 +vt 0.540384 0.327257 +vt 0.272201 0.233592 +vt 0.374867 0.726983 +vt 0.000182 0.853181 +vt 0.245908 0.939002 +vt 0.241672 0.543657 +vt 0.026157 0.613683 +vt 0.403461 0.731822 +vt 0.255109 0.517957 +vt 0.026157 0.840286 +vt 0.241672 0.910312 +vt 0.005868 0.592961 +vt 0.182105 0.726985 +vt 0.713394 0.690659 +vt 0.403825 0.794923 +vt 0.606847 0.865829 +vt 0.603346 0.539191 +vt 0.425288 0.597047 +vt 0.737020 0.694655 +vt 0.614450 0.517957 +vt 0.425288 0.784270 +vt 0.603345 0.842126 +vt 0.408523 0.579926 +vt 0.554133 0.690658 +vt 0.557472 0.105466 +vt 0.814742 0.102710 +vt 0.679920 0.000182 +vt 0.603041 0.245712 +vt 0.750502 0.245712 +vt 0.540747 0.096722 +vt 0.589555 0.258915 +vt 0.796071 0.105467 +vt 0.676773 0.018790 +vt 0.758893 0.262617 +vt 0.676771 0.144229 +vt 0.842669 0.536627 +vt 0.996118 0.743142 +vt 0.999818 0.573805 +vt 0.755992 0.655928 +vt 0.842669 0.775227 +vt 0.839912 0.517957 +vt 0.737384 0.652779 +vt 0.982913 0.729658 +vt 0.982913 0.582195 +vt 0.833924 0.791951 +vt 0.881431 0.655927 +vn 0.5853 0.0604 -0.8086 +vn 0.0052 -0.0325 0.9995 +vn -0.5749 -0.1254 -0.8086 +vn 0.9438 0.1177 0.3088 +vn -0.9334 -0.1827 0.3088 +vn -0.0616 0.3850 0.9209 +vn -0.5961 0.2994 -0.7450 +vn 0.8032 0.5234 0.2846 +vn -0.9264 0.2466 0.2846 +vn 0.4728 0.4705 -0.7450 +vn 0.5211 -0.1533 -0.8396 +vn -0.0136 -0.1742 0.9846 +vn -0.5484 0.3280 -0.7692 +vn 0.8516 -0.4637 0.2443 +vn -0.8789 0.3151 0.3582 +vn 0.1614 0.2179 0.9625 +vn -0.3313 0.6807 -0.6534 +vn 0.9586 -0.0488 0.2805 +vn -0.6358 0.6688 0.3854 +vn 0.6541 0.2372 -0.7182 +vn 0.3125 -0.4972 -0.8094 +vn 0.2496 0.2630 0.9319 +vn -0.7552 -0.0320 -0.6547 +vn 0.9336 -0.3149 0.1712 +vn -0.7941 0.4379 0.4215 +vn 0.3670 0.6082 0.7039 +vn -0.5589 0.3364 -0.7580 +vn 0.9971 0.0757 0.0029 +vn -0.5947 0.7693 0.2336 +vn 0.4249 -0.0923 -0.9005 +vn 0.6710 -0.2144 -0.7098 +vn -0.1298 0.4730 0.8715 +vn -0.4202 -0.6444 -0.6389 +vn 0.8504 0.4761 0.2237 +vn -0.9151 -0.2195 0.3383 +vn -0.2637 0.7659 0.5865 +vn -0.5312 -0.2636 -0.8052 +vn 0.6395 0.7688 -0.0104 +vn -0.9872 0.1278 0.0953 +vn 0.4741 0.1325 -0.8704 +vn -0.9689 -0.2288 -0.0946 +vn 0.7805 0.4155 -0.4672 +vn -0.2685 -0.5452 0.7941 +vn -0.3206 0.3650 -0.8741 +vn 0.8127 -0.1471 0.5638 +vn 0.6292 0.7419 -0.2317 +vn -0.3373 -0.1432 0.9304 +vn -0.3853 0.6954 -0.6066 +vn 0.6588 0.2236 0.7183 +vn -0.9826 0.1484 0.1116 +s off +f 1/1/1 6/2/1 10/3/1 5/4/1 +f 4/5/2 9/6/2 8/7/2 3/8/2 +f 2/9/3 7/10/3 6/2/3 1/1/3 +f 5/4/4 10/3/4 9/6/4 4/5/4 +f 3/8/5 8/7/5 7/10/5 2/9/5 +f 8/7/6 9/6/6 11/11/6 +f 6/2/7 7/10/7 11/11/7 +f 9/6/8 10/3/8 11/11/8 +f 7/10/9 8/7/9 11/11/9 +f 10/3/10 6/2/10 11/11/10 +f 12/12/11 17/13/11 21/14/11 16/15/11 +f 15/16/12 20/17/12 19/18/12 14/19/12 +f 13/20/13 18/21/13 17/13/13 12/12/13 +f 16/15/14 21/14/14 20/17/14 15/16/14 +f 14/19/15 19/18/15 18/21/15 13/20/15 +f 19/18/16 20/17/16 22/22/16 +f 17/13/17 18/21/17 22/22/17 +f 20/17/18 21/14/18 22/22/18 +f 18/21/19 19/18/19 22/22/19 +f 21/14/20 17/13/20 22/22/20 +f 23/23/21 28/24/21 32/25/21 27/26/21 +f 26/27/22 31/28/22 30/29/22 25/30/22 +f 24/31/23 29/32/23 28/24/23 23/23/23 +f 27/26/24 32/25/24 31/28/24 26/27/24 +f 25/30/25 30/29/25 29/32/25 24/31/25 +f 30/29/26 31/28/26 33/33/26 +f 28/24/27 29/32/27 33/33/27 +f 31/28/28 32/25/28 33/33/28 +f 29/32/29 30/29/29 33/33/29 +f 32/25/30 28/24/30 33/33/30 +f 34/34/31 39/35/31 43/36/31 38/37/31 +f 37/38/32 42/39/32 41/40/32 36/41/32 +f 35/42/33 40/43/33 39/35/33 34/34/33 +f 38/37/34 43/36/34 42/39/34 37/38/34 +f 36/41/35 41/40/35 40/43/35 35/42/35 +f 41/40/36 42/39/36 44/44/36 +f 39/35/37 40/43/37 44/44/37 +f 42/39/38 43/36/38 44/44/38 +f 40/43/39 41/40/39 44/44/39 +f 43/36/40 39/35/40 44/44/40 +f 45/45/41 50/46/41 54/47/41 49/48/41 +f 48/49/42 53/50/42 52/51/42 47/52/42 +f 46/53/43 51/54/43 50/46/43 45/45/43 +f 49/48/44 54/47/44 53/50/44 48/49/44 +f 47/52/45 52/51/45 51/54/45 46/53/45 +f 52/51/46 53/50/46 55/55/46 +f 50/46/47 51/54/47 55/55/47 +f 53/50/48 54/47/48 55/55/48 +f 51/54/49 52/51/49 55/55/49 +f 54/47/50 50/46/50 55/55/50 diff --git a/table.lua b/table.lua new file mode 100644 index 0000000..0f6ba43 --- /dev/null +++ b/table.lua @@ -0,0 +1,300 @@ + +magicalities.arcane = {} +magicalities.arcane.recipes = {} + +local fmspecelems = { + ["earth"] = {3, 0.15}, + ["water"] = {1, 1}, + ["air"] = {5, 1}, + ["fire"] = {3, 4.85}, + ["light"] = {1, 4}, + ["dark"] = {5, 4} +} + +local function arcane_table_formspec(data) + local spec = "" + local labels = "" + + if not data then + data = {} + end + + for name, pos in pairs(fmspecelems) do + local cp = "" + local y = -0.4 + + if not data[name] then + cp = "^[colorize:#2f2f2f" + end + + if pos[2] > 2.5 then + y = 0.85 + end + + spec = spec .. "image["..pos[1]..","..pos[2]..";1,1;magicalities_symbol_"..name..".png"..cp.."]" + + if data[name] then + labels = labels .. "label["..(pos[1] + 0.3)..","..(pos[2] + y)..";"..data[name].."]" + end + end + + return "size[10,10.5]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "label[0,0;Arcane Crafting Table]".. + "image[0.98,0.3;6,6;magicalities_symbol_hexagram.png]".. + spec.. + "list[context;craft;2,1.5;3,3;]".. + "list[context;craftres;7,2.5;1,1;]".. + "list[context;wand;7,1;1,1;]".. + labels.. + "image[6,2.5;1,1;gui_furnace_arrow_bg.png^[transformR270]".. + "list[current_player;main;1,6.25;8,1;]".. + "list[current_player;main;1,7.5;8,3;8]".. + "listring[context;wand]".. + "listring[current_player;main]".. + "listring[context;craft]".. + "listring[current_player;main]".. + "listring[context;craftres]".. + "listring[current_player;main]".. + default.get_hotbar_bg(1, 6.25) +end + +function magicalities.arcane.register_recipe(data) + table.insert(magicalities.arcane.recipes, data) +end + +local function split_components(items) + local arrays = {} + local temp = {} + local index = 1 + + for i, k in pairs(items) do + temp[#temp + 1] = k:get_name() + index = index + 1 + if index == 4 then + -- Don't add blank rows + local blanks = 0 + for _, tmp in pairs(temp) do + if tmp == "" then + blanks = blanks + 1 + end + end + + if blanks ~= 3 then + arrays[#arrays + 1] = temp + end + + temp = {} + index = 1 + end + end + + return arrays +end + +local function compare_find(splitup) + local found = nil + + for _,recipe in pairs(magicalities.arcane.recipes) do + -- Don't even bother if it doesnt have the correct amount of rows + if #splitup == #recipe.input then + local rows = 0 + for index, row in pairs(recipe.input) do + if not splitup[index] then break end + if #splitup[index] ~= #row then break end + + local cells = 0 + for i, cell in pairs(row) do + if splitup[index][i] == cell then + cells = cells + 1 + end + end + + if cells == #row then + rows = rows + 1 + end + end + + if rows == #recipe.input then + found = recipe + break + end + end + end + + return found +end + +function magicalities.arcane.get_recipe(items) + local split = split_components(items) + local recipe = compare_find(split) + + if not recipe then return nil end + local result = {new_input = {}, output = recipe.output, requirements = recipe.requirements} + for _,stack in pairs(items) do + stack:take_item(1) + result.new_input[#result.new_input + 1] = stack + end + + return result +end + +local function allow_metadata_inventory_put (pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + + if (listname == "wand" and minetest.get_item_group(stack:get_name(), "wand") == 0) or listname == "craftres" then + return 0 + end + + return stack:get_count() +end + +local function allow_metadata_inventory_move (pos, from_list, from_index, to_list, to_index, count, player) + if from_list == "craftres" and to_list == "craft" then return 0 end + + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local stack = inv:get_stack(from_list, from_index) + + return allow_metadata_inventory_put(pos, to_list, to_index, stack, player) +end + +local function allow_metadata_inventory_take (pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + return stack:get_count() +end + +local function set_output(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + + -- Check for possible result + local result = magicalities.arcane.get_recipe(inv:get_list("craft")) + if not result then return nil end + + -- Check for wand + local wand = inv:get_stack("wand", 1) + if not wand or wand:is_empty() then + return nil, result.requirements + end + + -- Check requirements + local requirements = result.requirements + if not magicalities.wands.wand_has_contents(wand, requirements) then + return nil, result.requirements + end + + -- Output fits + local output = ItemStack(result.output) + if not inv:room_for_item("craftres", output) then + return inv:get_stack("craftres", 1), result.requirements + end + + -- Set output + return output, result.requirements +end + +local function update_craft(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local out, reqs = set_output(pos) + + if reqs then + meta:set_string("formspec", arcane_table_formspec(reqs)) + else + meta:set_string("formspec", arcane_table_formspec({})) + end + + inv:set_list("craftres", { out }) +end + +-- Arcane Crafting Table +minetest.register_node("magicalities:arcane_table", { + description = "Arcane Crafting Table", + tiles = { + "magicalities_table_arcane_top.png", "magicalities_table_arcane.png", "magicalities_table_arcane.png", + "magicalities_table_arcane.png", "magicalities_table_arcane.png", "magicalities_table_arcane.png", + }, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", arcane_table_formspec()) + + local inv = meta:get_inventory() + inv:set_size("craft", 9) + inv:set_size("craftres", 1) + inv:set_size("wand", 1) + end, + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_take = allow_metadata_inventory_take, + allow_metadata_inventory_move = allow_metadata_inventory_move, + + on_metadata_inventory_take = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + + if listname == "craftres" then + local res = magicalities.arcane.get_recipe(inv:get_list("craft")) + if res then + inv:set_list("craft", res.new_input) + + -- Take from wand + local wand = inv:get_stack("wand", 1) + wand = magicalities.wands.wand_take_contents(wand, res.requirements) + magicalities.wands.update_wand_desc(wand) + inv:set_list("wand", {wand}) + end + end + + update_craft(pos) + end, + on_metadata_inventory_put = update_craft, + on_metadata_inventory_move = update_craft, + + groups = {choppy = 2, oddly_breakable_by_hand = 1, arcane_table = 1} +}) + +-- Base Table +minetest.register_node("magicalities:table", { + description = "Table", + drawtype = "nodebox", + tiles = { + "magicalities_table_wood_top.png", "magicalities_table_wood.png", "magicalities_table_wood.png", + "magicalities_table_wood.png", "magicalities_table_wood.png", "magicalities_table_wood.png", + }, + node_box = { + type = "fixed", + fixed = { + {-0.2500, -0.5000, -0.2500, 0.2500, -0.3750, 0.2500}, + {-0.1250, -0.3750, -0.1250, 0.1250, 0.3750, 0.1250}, + {-0.5000, 0.3750, -0.5000, 0.5000, 0.5000, 0.5000} + } + }, + groups = {choppy = 2, oddly_breakable_by_hand = 1, mg_table = 1} +}) + +-- Basic recipes +local recipes = { + { + input = { + {"default:gold_ingot", "default:glass", "default:gold_ingot"}, + {"default:glass", "", "default:glass"}, + {"default:gold_ingot", "default:glass", "default:gold_ingot"}, + }, + output = "default:diamond", + requirements = { + ["earth"] = 10, + ["light"] = 5, + ["dark"] = 5 + } + } +} + +for _, recipe in pairs(recipes) do + magicalities.arcane.register_recipe(recipe) +end diff --git a/textures/magicalities_crystal.png b/textures/magicalities_crystal.png new file mode 100644 index 0000000000000000000000000000000000000000..4b269041b0056632ffa379f5fffd8c52119be5e1 GIT binary patch literal 186 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4MunGE?ix$~KUBAf*t zk;M!Q+`=Ht$S`Y;1W=H@#M9T6{SgZ<2d`=Z_tZ9^kZfj1M2T~LZf1%(l;gl#j&-56kwOe>Ok zSJ+b+&Tl;DQn}6DoV2{Ob*t`Gf4{eT^{RNDcHOwoZx0@mcrqu|ia}v%3DWFU8GbZ8()Nlj2>E@cM*00G`fL_t(&-tC&-O2aS| zhkvnwwbUtsc<-%G;Y)aP9xw<#l-})TP?e2VSeX}|=%K8CwkB;>dmwDIBkk8OCp`&M z@D~a|#LY&@ZSV3z+9QMoh{dsjKX#ip$s$`vBTunvjn)qxCJ6@>GO?munEFmGZ)KR z^npMHB=2E=BLK1vzb~2qxOr9SX!R01>^Ob511q+4MTw#EzyiJH;JJh~Oa#{OzBfB}6%e_k^u;*2b8} zBl=7MEQ#nj1PEJ#XGiuK)O+GokTRs<)TacGLP_koik%^5h#6vr2oj=bIJa#%|36Lm z_;1HTtjljjQD{s0HJ333+-$~qfzV=oo`}Vj+*`FAOHXW07*qoM6N<$g3SB;bpQYW literal 0 HcmV?d00001 diff --git a/textures/magicalities_spark.png b/textures/magicalities_spark.png new file mode 100644 index 0000000000000000000000000000000000000000..4b6435b0799adbe7accdcb7cc7a2ca5d5ba38ef6 GIT binary patch literal 233 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 literal 0 HcmV?d00001 diff --git a/textures/magicalities_symbol_dark.png b/textures/magicalities_symbol_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..27c458e9e2a74fc808ca64c994cd7aa726c21968 GIT binary patch literal 3333 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 P00000NkvXXu0mjf80B5E literal 0 HcmV?d00001 diff --git a/textures/magicalities_symbol_earth.png b/textures/magicalities_symbol_earth.png new file mode 100644 index 0000000000000000000000000000000000000000..4ebae9c6f0970126101673fe712528db8471cb2c GIT binary patch literal 3220 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 AF#rGn literal 0 HcmV?d00001 diff --git a/textures/magicalities_symbol_water.png b/textures/magicalities_symbol_water.png new file mode 100644 index 0000000000000000000000000000000000000000..f43e0903d09aa22c6d340676079bf146e4e201b3 GIT binary patch literal 3268 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 literal 0 HcmV?d00001 diff --git a/textures/magicalities_wand_iron.png b/textures/magicalities_wand_iron.png new file mode 100644 index 0000000000000000000000000000000000000000..a7b2fa93f262c24da74d7d92e094b99b04000e6b GIT binary patch literal 412 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4MunGE?ix$~KUBAf*t zk;M!Q+`=Ht$S`Y;1W=H@#M9T6{SgZrRNM&%P!uRF@aVaqr7jw|Nq~zgX`!PPk}v;%iryOZ}($y$mEAQ zr;mKL=`mFCT*P4Z>QLo8ZvmEwY{O#{maSy?QOdjJS_g-h=)$#IO}q;3zJEA}`M~$T zX|geLif?@*Bs$jR6`T`1zHwEmK1Es%5{K^=%#6J4_L^W&ZJUA)i zHo2(cDd%&=O}lx6dHvU~et1dWCH_Nu>vOIj*Ez*wmuzM|ckrJ}>UqxbO`IDR zc;kg^-uu^kBWe%N729+6VQQG{?vUl|Cr;WOs(&pkW0ex=D0l}PN}jHMF6*2UngCs) Bo$UYs literal 0 HcmV?d00001 diff --git a/wands.lua b/wands.lua new file mode 100644 index 0000000..bc3fd04 --- /dev/null +++ b/wands.lua @@ -0,0 +1,223 @@ +-- Magicalities Wands + +magicalities.wands = {} + +local transform_recipes = { + ["mg_table"] = {result = "magicalities:arcane_table", requires = {["earth"] = 5, ["light"] = 5}} +} + +local wandcaps = { + full_punch_interval = 1.0, + max_drop_level = 0, + groupcaps = {}, + damage_groups = {fleshy = 2}, +} + +local randparticles = PcgRandom(os.clock()) + +local function align(len) + local str = "" + for i = 1, len do + str = str.."\t" + end + return str +end + +-- Update wand's description +function magicalities.wands.update_wand_desc(stack) + local meta = stack:get_meta() + local data_table = minetest.deserialize(meta:get_string("contents")) + + local wanddata = minetest.registered_items[stack:get_name()] + local description = wanddata.description + local capcontents = wanddata["_cap_max"] or 15 + local strbld = description.."\n" + + local longest_desc = 0 + for _,data in pairs(magicalities.elements) do + if not data.inheritance then + local len = #data.description + if len > longest_desc then + longest_desc = len + end + end + end + + for elem, amount in pairs(data_table) do + local dataelem = magicalities.elements[elem] + if amount > 0 then + strbld = strbld.."\n" + strbld = strbld..minetest.colorize(dataelem.color, dataelem.description.." ") + strbld = strbld..align(longest_desc * 2 - #dataelem.description) + strbld = strbld..amount.."/"..capcontents + end + end + + meta:set_string("description", strbld) +end + +-- Ensure wand has contents +function magicalities.wands.wand_has_contents(stack, requirements) + local meta = stack:get_meta() + local data_table = minetest.deserialize(meta:get_string("contents")) + + if not data_table then return false end + + for name, count in pairs(requirements) do + if not data_table[name] or data_table[name] < count then + return false + end + end + + return true +end + +-- Take wand contents +function magicalities.wands.wand_take_contents(stack, to_take) + local meta = stack:get_meta() + local data_table = minetest.deserialize(meta:get_string("contents")) + + for name, count in pairs(to_take) do + if not data_table[name] or data_table[name] - count < 0 then + return nil + end + + data_table[name] = data_table[name] - count + end + + local data_res = minetest.serialize(data_table) + meta:set_string("contents", data_res) + + return stack +end + +-- Initialize wand metadata +local function initialize_wand(stack) + local data_table = {} + + for name, data in pairs(magicalities.elements) do + if not data.inheritance then + data_table[name] = 10 + end + end + + local meta = stack:get_meta() + meta:set_string("contents", minetest.serialize(data_table)) +end + +local function wand_action(itemstack, placer, pointed_thing) + if not pointed_thing.type == "node" then return itemstack end + local node = minetest.get_node(pointed_thing.under) + local imeta = itemstack:get_meta() + + -- Initialize wand metadata + if imeta:get_string("contents") == nil or imeta:get_string("contents") == "" then + initialize_wand(itemstack) + magicalities.wands.update_wand_desc(itemstack) + end + + local to_replace = nil + for grp, result in pairs(transform_recipes) do + if minetest.get_item_group(node.name, grp) > 0 then + to_replace = result + break + end + end + + if not to_replace then return itemstack end + if to_replace.requires then + if not magicalities.wands.wand_has_contents(itemstack, to_replace.requires) then return itemstack end + itemstack = magicalities.wands.wand_take_contents(itemstack, to_replace.requires) + magicalities.wands.update_wand_desc(itemstack) + end + + minetest.swap_node(pointed_thing.under, {name = to_replace.result, param1 = node.param1, param2 = node.param2}) + + local spec = minetest.registered_nodes[to_replace.result] + if spec.on_construct then + spec.on_construct(pointed_thing.under) + end + + return itemstack +end + +local function use_wand(itemstack, user, pointed_thing) + local imeta = itemstack:get_meta() + + -- Initialize wand metadata + if imeta:get_string("contents") == nil or imeta:get_string("contents") == "" then + initialize_wand(itemstack) + magicalities.wands.update_wand_desc(itemstack) + end + + if not magicalities.wands.wand_has_contents(itemstack, {water = 5}) then + return itemstack + end + + --itemstack = magicalities.wands.wand_take_contents(itemstack, {water = 5}) + + -- Calculate velocity + local dir = user:get_look_dir() + local vel = {x=0,y=0,z=0} + vel.x = dir.x * 16 + vel.y = dir.y * 16 + vel.z = dir.z * 16 + + -- Calculate position + local pos = user:get_pos() + pos.x = pos.x + (dir.x * 2) + pos.y = pos.y + (dir.y * 2) + 1.5 + pos.z = pos.z + (dir.z * 2) + + for i = 1, 8 do + -- Deviation + local relvel = {x=0,y=0,z=0} + relvel.x = vel.x + (randparticles:next((-i/2.5) * 1000, (i/2.5) * 1000) / 1000) + relvel.y = vel.y + (randparticles:next((-i/2.5) * 1000, (i/2.5) * 1000) / 1000) + relvel.z = vel.z + (randparticles:next((-i/2.5) * 1000, (i/2.5) * 1000) / 1000) + minetest.add_particle({ + pos = pos, + velocity = relvel, + acceleration = relvel, + expirationtime = 1, + size = 4, + collisiondetection = true, + collision_removal = true, + texture = "magicalities_spark.png", + -- animation = {Tile Animation definition}, + glow = 2 + }) + end + + magicalities.wands.update_wand_desc(itemstack) + return itemstack +end + +function magicalities.wands.register_wand(name, data) + local mod = minetest.get_current_modname() + minetest.register_tool(mod..":wand_"..name, { + description = data.description, + inventory_image = data.image, + tool_capabilities = wandcaps, + stack_max = 1, + _cap_max = data.wand_cap, + on_use = use_wand, + on_place = wand_action, + groups = {wand = 1} + }) +end + +-- Iron +magicalities.wands.register_wand("steel", { + description = "Steel-Capped Wand", + image = "magicalities_wand_iron.png", + wand_cap = 25, +}) + +-- Gold +magicalities.wands.register_wand("gold", { + description = "Gold-Capped Wand", + image = "magicalities_wand_gold.png", + wand_cap = 50, +}) +