diff --git a/license.txt b/license.txt index 5c93f45..153d416 100644 --- a/license.txt +++ b/license.txt @@ -1,13 +1,165 @@ - DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE - Version 2, December 2004 + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 - Copyright (C) 2004 Sam Hocevar + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. - Everyone is permitted to copy and distribute verbatim or modified - copies of this license document, and changing it is allowed as long - as the name is changed. - DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. - 0. You just DO WHAT THE FUCK YOU WANT TO. + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. \ No newline at end of file diff --git a/spawners_mobs/_material/untitled.blend b/spawners_mobs/_material/untitled.blend new file mode 100644 index 0000000..8534148 Binary files /dev/null and b/spawners_mobs/_material/untitled.blend differ diff --git a/spawners_mobs/_material/untitled.blend1 b/spawners_mobs/_material/untitled.blend1 new file mode 100644 index 0000000..c9bf343 Binary files /dev/null and b/spawners_mobs/_material/untitled.blend1 differ diff --git a/spawners_ores/_material/spawners_ores_animated_16.xcf b/spawners_ores/_material/spawners_ores_animated_16.xcf new file mode 100644 index 0000000..ac4fc4b Binary files /dev/null and b/spawners_ores/_material/spawners_ores_animated_16.xcf differ diff --git a/spawners_ores/_material/spawners_ores_animated_16_lava.xcf b/spawners_ores/_material/spawners_ores_animated_16_lava.xcf new file mode 100644 index 0000000..3300489 Binary files /dev/null and b/spawners_ores/_material/spawners_ores_animated_16_lava.xcf differ diff --git a/spawners_ores/_material/spawners_ores_animated_16_magma.xcf b/spawners_ores/_material/spawners_ores_animated_16_magma.xcf new file mode 100644 index 0000000..0ae2150 Binary files /dev/null and b/spawners_ores/_material/spawners_ores_animated_16_magma.xcf differ diff --git a/spawners_ores/_material/stone_minerals.xcf b/spawners_ores/_material/stone_minerals.xcf new file mode 100644 index 0000000..ab79efe Binary files /dev/null and b/spawners_ores/_material/stone_minerals.xcf differ diff --git a/spawners_ores/api.lua b/spawners_ores/api.lua index 3899b9e..2766885 100644 --- a/spawners_ores/api.lua +++ b/spawners_ores/api.lua @@ -1,6 +1,17 @@ -- main tables spawners_ores = {} +-- how often node timers for plants will tick, +/- some random value +function spawners_ores.tick(pos) + minetest.get_node_timer(pos):start(math.random(30, 60)) +end + +-- how often a growth failure tick is retried (e.g. not enough place to spawn minerals) +function spawners_ores.tick_short(pos) + minetest.get_node_timer(pos):start(math.random(15, 30)) +end + +-- adds smoke particles function spawners_ores.add_effects(pos, radius) minetest.add_particlespawner({ amount = 32, @@ -11,50 +22,40 @@ function spawners_ores.add_effects(pos, radius) maxvel = {x=0.5, y=10, z=0.5}, minacc = vector.new(), maxacc = vector.new(), - minexptime = .5, + minexptime = 0.5, maxexptime = 2, - minsize = .5, + minsize = 0.5, maxsize = 8, - texture = "spawners_ores_smoke_particle.png", + texture = "spawners_ores_smoke_particle.png^[transform"..math.random(0,3) }) end -- start spawning ores -function spawners_ores.start_spawning_ores(pos, ore_name, sound_custom, spawners_pos) +function spawners_ores.start_spawning_ores(pos, ore_name, how_many) if not pos or not ore_name then return end - local sound_name local player_near = false - - -- use custom sounds - if sound_custom ~= "" then - sound_name = sound_custom - else - sound_name = false - end - - local how_many = math.random(1,2) - -- how_many = how_many+1 + local how_many = how_many or 1 for i=1, how_many do if i > 1 then - player_near, pos = spawners_ores.check_around_radius_ores(pos, "default:stone") + pos = spawners_ores.get_available_node(pos, "default:stone") if not pos then return end - minetest.sound_play(sound_name, { + minetest.sound_play("spawners_ores_strike", { pos = pos, - max_hear_distance = 32, - gain = 20, + max_hear_distance = 16, + gain = 10, }) minetest.set_node(pos, {name=ore_name}) spawners_ores.add_effects(pos, 1) else - minetest.sound_play(sound_name, { + minetest.sound_play("spawners_ores_strike", { pos = pos, - max_hear_distance = 32, - gain = 20, + max_hear_distance = 16, + gain = 10, }) minetest.set_node(pos, {name=ore_name}) @@ -64,44 +65,185 @@ function spawners_ores.start_spawning_ores(pos, ore_name, sound_custom, spawners end -function spawners_ores.check_around_radius(pos) - local player_near = false - local radius = 21 - local node_ore_pos = nil +function spawners_ores.get_available_node(pos, check_node, radius) + if not pos then return end - for _,obj in ipairs(minetest.get_objects_inside_radius(pos, radius)) do - if obj:is_player() then - player_near = true - end - end + local check_node = check_node or "default:stone" + local radius = radius or 2 - return player_near -end - -function spawners_ores.check_around_radius_ores(pos, check_node) - local player_near = spawners_ores.check_around_radius(pos); - local found_node = false - local node_ore_pos = nil - if check_node then - - node_ore_pos = minetest.find_node_near(pos, 2, {check_node}) - - if node_ore_pos then - found_node = node_ore_pos - end - end - - return player_near, found_node -end - -function spawners_ores.check_node_status_ores(pos, ore_name, check_node) - if not check_node then return end - - local player_near, found_node = spawners_ores.check_around_radius_ores(pos, check_node) - - if player_near and found_node then - return true, found_node + local node_ore_pos = minetest.find_node_near(pos, radius, {check_node}) + + if node_ore_pos and node_ore_pos ~= nil then + return node_ore_pos else - return true, false + return false end -end \ No newline at end of file +end + +-- build form for spawners +function spawners_ores.get_formspec(pos, table) + -- Inizialize metadata and variables + local meta = minetest.get_meta(pos) + local mineral = table.ore or meta:get_string("mineral") + + local stack_per_obj = table.stack_per_obj or {} + local stack_per = stack_per_obj.stack_per or 0 + local extra_per = stack_per_obj.extra_per or 0 + + -- dynamic form + return "size[8,8.5]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "label[1.8,0.3;Input "..mineral.." Ingot]".. + "list[current_name;fuel;1.8,1;1,1;]".. + "image[1.8,1;1,1;spawners_ores_ingot_slot.png]".. + "list[current_player;main;0,4.25;8,1;]".. + "list[current_player;main;0,5.5;8,3;8]".. + "image[2.8,1;1,1;gui_furnace_arrow_bg.png^[transformR270]".. + "label[1.8,2;"..stack_per.." minerals ("..extra_per.." extra)]".. + "image[4,1;1,1;spawners_ores_stone_with_"..mineral..".png]".. + "listring[current_name;fuel]".. + "listring[current_player;main]".. + default.get_hotbar_bg(0, 4.25) +end + +-- check if is fuel empty in the node +function spawners_ores.can_dig(pos, player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("fuel") +end + +-- add extra percentage on top of the stack +function spawners_ores.stack_per(table) + local table = table or {} + local stack_count = table.stack_count or nil + local percent = table.percent or 10 + local extra_per = (stack_count / 100) * percent + + extra_per = math.floor(extra_per) + + local stack_per = extra_per + stack_count + + -- print(percent.."% from stack("..stack_count..") = "..stack_per.." ("..extra_per.." extra ore(s))") + + return { + stack_per = stack_per, + extra_per = extra_per + } +end + +function spawners_ores.on_timer(pos, elapsed) + + local available_node = spawners_ores.get_available_node(pos, "default:stone") + + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local stack = inv:get_stack("fuel", 1) + local formspec = "" + local infotext = "" + + local stack_per_obj = {} + local percent = 10 + local how_many = 1 + + local ore_name = meta:get_string("ore_name") + local mineral = meta:get_string("mineral") + local status = meta:get_string("status") + + -- + -- active + -- + if available_node and inv:is_empty("fuel") ~= true then + -- make sure the right node status is shown + if status ~= "active" then + meta:set_string("status", "active") + minetest.swap_node(pos, {name="spawners_ores:"..ore_name.."_spawner_active"}) + end + + -- take fuel + stack:take_item() + inv:set_stack("fuel", 1, stack) + + -- update infotext + infotext = mineral.." fuel: "..stack:get_count() + + -- add extra ores based on percentage + stack_per_obj = spawners_ores.stack_per({ + stack_count = stack:get_count(), + percent = percent + }) + + if stack:get_count() % percent == 0 then + -- TODO: should get countent based on 'percent' + how_many = 2 + end + + -- enough place to spawn more ores + spawners_ores.start_spawning_ores(available_node, "default:"..ore_name, how_many) + + -- update infotext and formspec + formspec = spawners_ores.get_formspec(pos, { + stack_per_obj = stack_per_obj, + ore = mineral + }) + + meta:set_string("formspec", formspec) + meta:set_string("infotext", mineral.." fuel: "..inv:get_stack("fuel", 1):get_count()) + + spawners_ores.tick(pos) + + -- + -- default + -- + elseif inv:is_empty("fuel") then + -- empty / no fuel -- stop timer + -- make sure that default status/node is shown + meta:set_string("status", "") + minetest.swap_node(pos, {name="spawners_ores:"..ore_name.."_spawner"}) + + -- update infotext, formspec and stop the timer + stack_per_obj = spawners_ores.stack_per({ + stack_count = stack:get_count() + }) + + formspec = spawners_ores.get_formspec(pos, { + stack_per_obj = stack_per_obj, + ore = mineral + }) + + meta:set_string("infotext", mineral.." ore spawner is empty.") + meta:set_string("formspec", formspec) + + return + + -- + -- waiting + -- + else + -- make sure that waiting status/node is shown + if status ~= "waiting" then + meta:set_string("status", "waiting") + minetest.swap_node(pos, {name="spawners_ores:"..ore_name.."_spawner_waiting"}) + + infotext = "Waiting - no default:stone was found near by, "..mineral.." fuel: "..inv:get_stack("fuel", 1):get_count() + end + + -- update infotext and formspec + stack_per_obj = spawners_ores.stack_per({ + stack_count = stack:get_count() + }) + + formspec = spawners_ores.get_formspec(pos, { + stack_per_obj = stack_per_obj, + ore = mineral + }) + + meta:set_string("formspec", formspec) + meta:set_string("infotext", mineral.." fuel: "..inv:get_stack("fuel", 1):get_count()) + + spawners_ores.tick_short(pos) + end + +end diff --git a/spawners_ores/spawners_ores.lua b/spawners_ores/spawners_ores.lua index 07b6fc7..7b1813c 100644 --- a/spawners_ores/spawners_ores.lua +++ b/spawners_ores/spawners_ores.lua @@ -1,60 +1,36 @@ --- Formspecs -local ore_formspec = - "size[8,8.5]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "label[2,1.7;Input Ingot]".. - "list[current_name;fuel;3.5,1.5;1,1;]".. - "list[current_player;main;0,4.25;8,1;]".. - "list[current_player;main;0,5.5;8,3;8]".. - "button_exit[5,1.5;2,1;exit;Save]".. - "listring[current_name;fuel]".. - "listring[current_player;main]".. - default.get_hotbar_bg(0, 4.25) +-- +-- Colorize HEX +-- -local function can_dig(pos, player) - local meta = minetest.get_meta(pos); - local inv = meta:get_inventory() - return inv:is_empty("fuel") -end +local colorize = { + stone_with_gold = "^[colorize:#ffe40030", + stone_with_tin = "^[colorize:#d0d0d040", + stone_with_iron = "^[colorize:#b66d4940", + stone_with_copper = "^[colorize:#b5875240", +} -function spawners_ores.get_formspec(pos) - - -- Inizialize metadata - local meta = minetest.get_meta(pos) - - -- Inizialize inventory - local inv = meta:get_inventory() - for listname, size in pairs({ - fuel = 1, - }) do - if inv:get_size(listname) ~= size then - inv:set_size(listname, size) - end - end - - -- Update formspec, infotext and node - meta:set_string("formspec", ore_formspec) -end +-- +-- Handle formspec and inventory management +-- local function allow_metadata_inventory_put(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then minetest.record_protection_violation(pos, player:get_player_name()) return 0 end + local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - local ingot = minetest.get_node_or_nil(pos).name + local mineral = meta:get_string("mineral") - ingot = string.split(ingot, ":") - ingot = string.split(ingot[2], "_") - - if ingot[3] == "iron" then - ingot[3] = "steel" + if mineral == "iron" then + mineral = "steel" end - if stack:get_name() == "default:"..ingot[3].."_ingot" then + if stack:get_name() == "default:"..mineral.."_ingot" then + + minetest.get_node_timer(pos):start(1.0) + return stack:get_count() else return 0 @@ -66,63 +42,27 @@ local function allow_metadata_inventory_take(pos, listname, index, stack, player minetest.record_protection_violation(pos, player:get_player_name()) return 0 end + + minetest.get_node_timer(pos):start(1.0) + return stack:get_count() end -local function on_receive_fields(pos, formname, fields, sender) - local ore_node = minetest.get_node_or_nil(pos) +-- +-- Spawners Ores creation function +-- - if minetest.is_protected(pos, sender:get_player_name()) then - minetest.record_protection_violation(pos, sender:get_player_name()) - return +function spawners_ores.create(def) + + local ore_name = def.ore_name or nil + local size = def.size or {x = 0.33, y = 0.33} + local offset = def.offset or 0 + + -- these must be defined + if ore_name == nil then + return false end - -- get the ore name - local ingot = ore_node.name - ingot = string.split(ingot, ":") - ingot = string.split(ingot[2], "_") - - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - local fuellist = inv:get_list("fuel") - - if inv:is_empty("fuel") then - if ore_node.name ~= "spawners_ores:stone_with_"..ingot[3].."_spawner" then - minetest.swap_node(pos, {name="spawners_ores:stone_with_"..ingot[3].."_spawner"}) - end - meta:set_string("infotext", ingot[3].." ore spawner is empty") - else - meta:set_string("infotext", ingot[3].." ore spawner fuel: "..inv:get_stack("fuel", 1):get_count()) - end - - -- fix iron vs. steel issue - if ingot[3] == "iron" then - ingot[3] = "steel" - end - - if not fuellist[1]:is_empty() and inv:get_stack("fuel", 1):get_name() == "default:"..ingot[3].."_ingot" then - - -- fix iron vs. steel issue - if ingot[3] == "steel" then - ingot[3] = "iron" - end - - local waiting, found_node = spawners_ores.check_node_status_ores(pos, "stone_with_"..ingot[3], "default:stone") - - if found_node then - minetest.swap_node(pos, {name="spawners_ores:stone_with_"..ingot[3].."_spawner_active"}) - elseif waiting then - minetest.swap_node(pos, {name="spawners_ores:stone_with_"..ingot[3].."_spawner_waiting"}) - - meta:set_string("infotext", "Waiting status - player was away or no stone around, "..ingot[3].." ore spawner fuel: "..inv:get_stack("fuel", 1):get_count()) - else - return - end - end -end - --- Ores creation -function spawners_ores.create_ore(ore_name, mod_prefix, size, offset, texture, sound_custom) -- dummy inside the spawner local dummy_ore_definition = { hp_max = 1, @@ -171,11 +111,11 @@ function spawners_ores.create_ore(ore_name, mod_prefix, size, offset, texture, s sunlight_propagates = true, tiles = { { - name = "spawners_ores_spawner_animated.png", + name = "spawners_ores_spawner_animated_magma_16.png"..colorize[ore_name], animation = { type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, + aspect_w = 16, + aspect_h = 16, length = 2.0 }, } @@ -183,10 +123,21 @@ function spawners_ores.create_ore(ore_name, mod_prefix, size, offset, texture, s is_ground_content = true, groups = {cracky=1,level=2,igniter=1,not_in_creative_inventory=1}, drop = "spawners_ores:"..ore_name.."_spawner", - can_dig = can_dig, + + can_dig = spawners_ores.can_dig, + + on_timer = spawners_ores.on_timer, + + on_blast = function(pos) + local drops = {} + default.get_inventory_drops(pos, "fuel", drops) + drops[#drops+1] = "spawners_ores:"..ore_name.."_spawner_active" + minetest.remove_node(pos) + return drops + end, + allow_metadata_inventory_put = allow_metadata_inventory_put, allow_metadata_inventory_take = allow_metadata_inventory_take, - on_receive_fields = on_receive_fields, }) -- node spawner waiting - no stone around or no fuel @@ -201,7 +152,7 @@ function spawners_ores.create_ore(ore_name, mod_prefix, size, offset, texture, s sunlight_propagates = true, tiles = { { - name = "spawners_ores_spawner_waiting_animated.png", + name = "spawners_ores_spawner_waiting_animated_16.png"..colorize[ore_name], animation = { type = "vertical_frames", aspect_w = 32, @@ -212,11 +163,22 @@ function spawners_ores.create_ore(ore_name, mod_prefix, size, offset, texture, s }, is_ground_content = true, groups = {cracky=1,level=2,not_in_creative_inventory=1}, - drop = "spawners_ores:"..ore_name.."_spawner", - can_dig = can_dig, + drop = "spawners_ores:"..ore_name.."_spawner_waiting", + + can_dig = spawners_ores.can_dig, + + on_timer = spawners_ores.on_timer, + + on_blast = function(pos) + local drops = {} + default.get_inventory_drops(pos, "fuel", drops) + drops[#drops+1] = "spawners_ores:"..ore_name.."_spawner" + minetest.remove_node(pos) + return drops + end, + allow_metadata_inventory_put = allow_metadata_inventory_put, allow_metadata_inventory_take = allow_metadata_inventory_take, - on_receive_fields = on_receive_fields, }) -- node spawner inactive (default) @@ -228,87 +190,102 @@ function spawners_ores.create_ore(ore_name, mod_prefix, size, offset, texture, s walkable = true, sounds = default.node_sound_metal_defaults(), sunlight_propagates = true, - tiles = {"spawners_ores_spawner.png"}, + tiles = {"spawners_ores_spawner_16.png"..colorize[ore_name]}, is_ground_content = true, - groups = {cracky=1,level=2}, + groups = {cracky = 1, level = 2}, stack_max = 1, + + can_dig = spawners_ores.can_dig, + + on_timer = spawners_ores.on_timer, + on_construct = function(pos) local meta = minetest.get_meta(pos) - spawners_ores.get_formspec(pos) + local formspec = spawners_ores.get_formspec(pos, {ore=ore[3]}) + + -- Inizialize inventory + local inv = meta:get_inventory() + inv:set_size('fuel', 1) + + -- custom meta + meta:set_string("mineral", ore[3]) + meta:set_string("ore_name", ore_name) + meta:set_string("status", "") + + -- add spinning entity inside the spawner pos.y = pos.y + offset minetest.add_entity(pos,"spawners_ores:dummy_ore_"..ore_name) + + -- Update formspec, infotext and node + meta:set_string("formspec", formspec) meta:set_string("infotext", ore[3].." ore spawner is empty") end, - can_dig = can_dig, + on_blast = function(pos) + local drops = {} + default.get_inventory_drops(pos, "fuel", drops) + drops[#drops+1] = "spawners_ores:"..ore_name.."_spawner" + minetest.remove_node(pos) + return drops + end, + on_metadata_inventory_put = function(pos) + -- start timer function, it will sort out whether ingots can burn in to stone and create minerals or not. + minetest.get_node_timer(pos):start(1.0) + end, allow_metadata_inventory_put = allow_metadata_inventory_put, allow_metadata_inventory_take = allow_metadata_inventory_take, - on_receive_fields = on_receive_fields, }) - -- ABM - minetest.register_abm({ - nodenames = {"spawners_ores:"..ore_name.."_spawner_active", "spawners_ores:"..ore_name.."_spawner_waiting"}, - interval = 5.0, - chance = 5, - action = function(pos, node, active_object_count, active_object_count_wider) - - local waiting, found_node = spawners_ores.check_node_status_ores(pos, ore_name, "default:stone") - - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - - if found_node then - -- make sure the right node status is shown - if node.name ~= "spawners_ores:"..ore_name.."_spawner_active" then - minetest.swap_node(pos, {name="spawners_ores:"..ore_name.."_spawner_active"}) - end - - - -- take fuel - local stack = inv:get_stack("fuel", 1) - stack:take_item() - - - inv:set_stack("fuel", 1, stack) - - meta:set_string("infotext", ore[3].." ore spawner fuel: "..inv:get_stack("fuel", 1):get_count()) - - -- enough place to spawn more ores - spawners_ores.start_spawning_ores(found_node, "default:"..ore_name, sound_custom) - - -- empty / no fuel - if inv:is_empty("fuel") then - minetest.swap_node(pos, {name="spawners_ores:"..ore_name.."_spawner"}) - meta:set_string("infotext", ore[3].." ore spawner is empty.") - - end - else - -- waiting status - if node.name ~= "spawners_ores:"..ore_name.."_spawner_waiting" then - minetest.swap_node(pos, {name="spawners_ores:"..ore_name.."_spawner_waiting"}) - - meta:set_string("infotext", "Waiting status - player was away or no stone around, "..ore[3].." ore spawner fuel: "..inv:get_stack("fuel", 1):get_count()) - end - end - - end + -- replacement LBM for pre-nodetimer plants + minetest.register_lbm({ + name = "spawners_ores:start_nodetimer_"..ore_name, + nodenames = { + "spawners_ores:"..ore_name.."_spawner_active", + "spawners_ores:"..ore_name.."_spawner_waiting" + }, + action = function(pos, node) + spawners_ores.tick_short(pos) + end, }) - end +-- +-- Ore Spawners Definitions +-- + -- default:stone_with_gold -spawners_ores.create_ore("stone_with_gold", "", {x=.33,y=.33}, 0, {"default_stone.png^default_mineral_gold.png"}, "spawners_ores_strike") +spawners_ores.create({ + ore_name = "stone_with_gold", + size = {x = 0.33, y = 0.33}, + offset = 0 +}) -- default:stone_with_iron -spawners_ores.create_ore("stone_with_iron", "", {x=.33,y=.33}, 0, {"default_stone.png^default_mineral_gold.png"}, "spawners_ores_strike") +spawners_ores.create({ + ore_name = "stone_with_iron", + size = {x = 0.33, y = 0.33}, + offset = 0 +}) -- default:stone_with_copper -spawners_ores.create_ore("stone_with_copper", "", {x=.33,y=.33}, 0, {"default_stone.png^default_mineral_gold.png"}, "spawners_ores_strike") +spawners_ores.create({ + ore_name = "stone_with_copper", + size = {x = 0.33, y = 0.33}, + offset = 0 +}) +-- default:stone_with_tin +spawners_ores.create({ + ore_name = "stone_with_tin", + size = {x = 0.33, y = 0.33}, + offset = 0 +}) + +-- +-- Recipes +-- --- recipes minetest.register_craft({ output = "spawners_ores:stone_with_gold_spawner", recipe = { @@ -335,3 +312,12 @@ minetest.register_craft({ {"default:diamondblock", "xpanes:bar_flat", "default:diamondblock"}, } }) + +minetest.register_craft({ + output = "spawners_ores:stone_with_tin_spawner", + recipe = { + {"default:diamondblock", "fire:flint_and_steel", "default:diamondblock"}, + {"xpanes:bar_flat", "default:tinblock", "xpanes:bar_flat"}, + {"default:diamondblock", "xpanes:bar_flat", "default:diamondblock"}, + } +}) diff --git a/spawners_ores/textures/spawners_ores_ingot_slot.png b/spawners_ores/textures/spawners_ores_ingot_slot.png new file mode 100644 index 0000000..9b8985d Binary files /dev/null and b/spawners_ores/textures/spawners_ores_ingot_slot.png differ diff --git a/spawners_ores/textures/spawners_ores_smoke_particle.png b/spawners_ores/textures/spawners_ores_smoke_particle.png index 89d81c1..51ba671 100644 Binary files a/spawners_ores/textures/spawners_ores_smoke_particle.png and b/spawners_ores/textures/spawners_ores_smoke_particle.png differ diff --git a/spawners_ores/textures/spawners_ores_spawner_16.png b/spawners_ores/textures/spawners_ores_spawner_16.png new file mode 100644 index 0000000..b919e10 Binary files /dev/null and b/spawners_ores/textures/spawners_ores_spawner_16.png differ diff --git a/spawners_ores/textures/spawners_ores_spawner_animated_16.png b/spawners_ores/textures/spawners_ores_spawner_animated_16.png new file mode 100644 index 0000000..1524f0a Binary files /dev/null and b/spawners_ores/textures/spawners_ores_spawner_animated_16.png differ diff --git a/spawners_ores/textures/spawners_ores_spawner_animated_lava_16.png b/spawners_ores/textures/spawners_ores_spawner_animated_lava_16.png new file mode 100644 index 0000000..4ef6a8e Binary files /dev/null and b/spawners_ores/textures/spawners_ores_spawner_animated_lava_16.png differ diff --git a/spawners_ores/textures/spawners_ores_spawner_animated_magma_16.png b/spawners_ores/textures/spawners_ores_spawner_animated_magma_16.png new file mode 100644 index 0000000..30edcd9 Binary files /dev/null and b/spawners_ores/textures/spawners_ores_spawner_animated_magma_16.png differ diff --git a/spawners_ores/textures/spawners_ores_spawner_normal.png b/spawners_ores/textures/spawners_ores_spawner_normal.png deleted file mode 100644 index b102aa7..0000000 Binary files a/spawners_ores/textures/spawners_ores_spawner_normal.png and /dev/null differ diff --git a/spawners_ores/textures/spawners_ores_spawner_waiting_animated_16.png b/spawners_ores/textures/spawners_ores_spawner_waiting_animated_16.png new file mode 100644 index 0000000..912ab76 Binary files /dev/null and b/spawners_ores/textures/spawners_ores_spawner_waiting_animated_16.png differ diff --git a/spawners_ores/textures/spawners_ores_stone_with_copper.png b/spawners_ores/textures/spawners_ores_stone_with_copper.png new file mode 100644 index 0000000..8f272d0 Binary files /dev/null and b/spawners_ores/textures/spawners_ores_stone_with_copper.png differ diff --git a/spawners_ores/textures/spawners_ores_stone_with_gold.png b/spawners_ores/textures/spawners_ores_stone_with_gold.png new file mode 100644 index 0000000..b82c07d Binary files /dev/null and b/spawners_ores/textures/spawners_ores_stone_with_gold.png differ diff --git a/spawners_ores/textures/spawners_ores_stone_with_iron.png b/spawners_ores/textures/spawners_ores_stone_with_iron.png new file mode 100644 index 0000000..a41a708 Binary files /dev/null and b/spawners_ores/textures/spawners_ores_stone_with_iron.png differ diff --git a/spawners_ores/textures/spawners_ores_stone_with_tin.png b/spawners_ores/textures/spawners_ores_stone_with_tin.png new file mode 100644 index 0000000..5059b65 Binary files /dev/null and b/spawners_ores/textures/spawners_ores_stone_with_tin.png differ