refactor: remove ABM - replace with LBM and timers, lot of performance improvements
170
license.txt
@ -1,13 +1,165 @@
|
|||||||
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
GNU LESSER GENERAL PUBLIC LICENSE
|
||||||
Version 2, December 2004
|
Version 3, 29 June 2007
|
||||||
|
|
||||||
Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
|
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||||
|
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
|
This version of the GNU Lesser General Public License incorporates
|
||||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
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.
|
BIN
spawners_mobs/_material/untitled.blend
Normal file
BIN
spawners_mobs/_material/untitled.blend1
Normal file
BIN
spawners_ores/_material/spawners_ores_animated_16.xcf
Normal file
BIN
spawners_ores/_material/spawners_ores_animated_16_lava.xcf
Normal file
BIN
spawners_ores/_material/spawners_ores_animated_16_magma.xcf
Normal file
BIN
spawners_ores/_material/stone_minerals.xcf
Normal file
@ -1,6 +1,17 @@
|
|||||||
-- main tables
|
-- main tables
|
||||||
spawners_ores = {}
|
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)
|
function spawners_ores.add_effects(pos, radius)
|
||||||
minetest.add_particlespawner({
|
minetest.add_particlespawner({
|
||||||
amount = 32,
|
amount = 32,
|
||||||
@ -11,50 +22,40 @@ function spawners_ores.add_effects(pos, radius)
|
|||||||
maxvel = {x=0.5, y=10, z=0.5},
|
maxvel = {x=0.5, y=10, z=0.5},
|
||||||
minacc = vector.new(),
|
minacc = vector.new(),
|
||||||
maxacc = vector.new(),
|
maxacc = vector.new(),
|
||||||
minexptime = .5,
|
minexptime = 0.5,
|
||||||
maxexptime = 2,
|
maxexptime = 2,
|
||||||
minsize = .5,
|
minsize = 0.5,
|
||||||
maxsize = 8,
|
maxsize = 8,
|
||||||
texture = "spawners_ores_smoke_particle.png",
|
texture = "spawners_ores_smoke_particle.png^[transform"..math.random(0,3)
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
-- start spawning ores
|
-- 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
|
if not pos or not ore_name then return end
|
||||||
local sound_name
|
|
||||||
local player_near = false
|
local player_near = false
|
||||||
|
local how_many = how_many or 1
|
||||||
-- 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
|
|
||||||
|
|
||||||
for i=1, how_many do
|
for i=1, how_many do
|
||||||
|
|
||||||
if i > 1 then
|
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
|
if not pos then return end
|
||||||
|
|
||||||
minetest.sound_play(sound_name, {
|
minetest.sound_play("spawners_ores_strike", {
|
||||||
pos = pos,
|
pos = pos,
|
||||||
max_hear_distance = 32,
|
max_hear_distance = 16,
|
||||||
gain = 20,
|
gain = 10,
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.set_node(pos, {name=ore_name})
|
minetest.set_node(pos, {name=ore_name})
|
||||||
spawners_ores.add_effects(pos, 1)
|
spawners_ores.add_effects(pos, 1)
|
||||||
else
|
else
|
||||||
minetest.sound_play(sound_name, {
|
minetest.sound_play("spawners_ores_strike", {
|
||||||
pos = pos,
|
pos = pos,
|
||||||
max_hear_distance = 32,
|
max_hear_distance = 16,
|
||||||
gain = 20,
|
gain = 10,
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.set_node(pos, {name=ore_name})
|
minetest.set_node(pos, {name=ore_name})
|
||||||
@ -64,44 +65,185 @@ function spawners_ores.start_spawning_ores(pos, ore_name, sound_custom, spawners
|
|||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function spawners_ores.check_around_radius(pos)
|
function spawners_ores.get_available_node(pos, check_node, radius)
|
||||||
local player_near = false
|
if not pos then return end
|
||||||
local radius = 21
|
|
||||||
local node_ore_pos = nil
|
|
||||||
|
|
||||||
for _,obj in ipairs(minetest.get_objects_inside_radius(pos, radius)) do
|
local check_node = check_node or "default:stone"
|
||||||
if obj:is_player() then
|
local radius = radius or 2
|
||||||
player_near = true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
return player_near
|
local node_ore_pos = minetest.find_node_near(pos, radius, {check_node})
|
||||||
end
|
|
||||||
|
if node_ore_pos and node_ore_pos ~= nil then
|
||||||
function spawners_ores.check_around_radius_ores(pos, check_node)
|
return node_ore_pos
|
||||||
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
|
|
||||||
else
|
else
|
||||||
return true, false
|
return false
|
||||||
end
|
end
|
||||||
end
|
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
|
||||||
|
@ -1,60 +1,36 @@
|
|||||||
-- Formspecs
|
--
|
||||||
local ore_formspec =
|
-- Colorize HEX
|
||||||
"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)
|
|
||||||
|
|
||||||
local function can_dig(pos, player)
|
local colorize = {
|
||||||
local meta = minetest.get_meta(pos);
|
stone_with_gold = "^[colorize:#ffe40030",
|
||||||
local inv = meta:get_inventory()
|
stone_with_tin = "^[colorize:#d0d0d040",
|
||||||
return inv:is_empty("fuel")
|
stone_with_iron = "^[colorize:#b66d4940",
|
||||||
end
|
stone_with_copper = "^[colorize:#b5875240",
|
||||||
|
}
|
||||||
|
|
||||||
function spawners_ores.get_formspec(pos)
|
--
|
||||||
|
-- Handle formspec and inventory management
|
||||||
-- 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
|
|
||||||
|
|
||||||
local function allow_metadata_inventory_put(pos, listname, index, stack, player)
|
local function allow_metadata_inventory_put(pos, listname, index, stack, player)
|
||||||
|
|
||||||
if minetest.is_protected(pos, player:get_player_name()) then
|
if minetest.is_protected(pos, player:get_player_name()) then
|
||||||
minetest.record_protection_violation(pos, player:get_player_name())
|
minetest.record_protection_violation(pos, player:get_player_name())
|
||||||
return 0
|
return 0
|
||||||
end
|
end
|
||||||
|
|
||||||
local meta = minetest.get_meta(pos)
|
local meta = minetest.get_meta(pos)
|
||||||
local inv = meta:get_inventory()
|
local mineral = meta:get_string("mineral")
|
||||||
local ingot = minetest.get_node_or_nil(pos).name
|
|
||||||
|
|
||||||
ingot = string.split(ingot, ":")
|
if mineral == "iron" then
|
||||||
ingot = string.split(ingot[2], "_")
|
mineral = "steel"
|
||||||
|
|
||||||
if ingot[3] == "iron" then
|
|
||||||
ingot[3] = "steel"
|
|
||||||
end
|
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()
|
return stack:get_count()
|
||||||
else
|
else
|
||||||
return 0
|
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())
|
minetest.record_protection_violation(pos, player:get_player_name())
|
||||||
return 0
|
return 0
|
||||||
end
|
end
|
||||||
|
|
||||||
|
minetest.get_node_timer(pos):start(1.0)
|
||||||
|
|
||||||
return stack:get_count()
|
return stack:get_count()
|
||||||
end
|
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
|
function spawners_ores.create(def)
|
||||||
minetest.record_protection_violation(pos, sender:get_player_name())
|
|
||||||
return
|
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
|
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
|
-- dummy inside the spawner
|
||||||
local dummy_ore_definition = {
|
local dummy_ore_definition = {
|
||||||
hp_max = 1,
|
hp_max = 1,
|
||||||
@ -171,11 +111,11 @@ function spawners_ores.create_ore(ore_name, mod_prefix, size, offset, texture, s
|
|||||||
sunlight_propagates = true,
|
sunlight_propagates = true,
|
||||||
tiles = {
|
tiles = {
|
||||||
{
|
{
|
||||||
name = "spawners_ores_spawner_animated.png",
|
name = "spawners_ores_spawner_animated_magma_16.png"..colorize[ore_name],
|
||||||
animation = {
|
animation = {
|
||||||
type = "vertical_frames",
|
type = "vertical_frames",
|
||||||
aspect_w = 32,
|
aspect_w = 16,
|
||||||
aspect_h = 32,
|
aspect_h = 16,
|
||||||
length = 2.0
|
length = 2.0
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@ -183,10 +123,21 @@ function spawners_ores.create_ore(ore_name, mod_prefix, size, offset, texture, s
|
|||||||
is_ground_content = true,
|
is_ground_content = true,
|
||||||
groups = {cracky=1,level=2,igniter=1,not_in_creative_inventory=1},
|
groups = {cracky=1,level=2,igniter=1,not_in_creative_inventory=1},
|
||||||
drop = "spawners_ores:"..ore_name.."_spawner",
|
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_put = allow_metadata_inventory_put,
|
||||||
allow_metadata_inventory_take = allow_metadata_inventory_take,
|
allow_metadata_inventory_take = allow_metadata_inventory_take,
|
||||||
on_receive_fields = on_receive_fields,
|
|
||||||
})
|
})
|
||||||
|
|
||||||
-- node spawner waiting - no stone around or no fuel
|
-- 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,
|
sunlight_propagates = true,
|
||||||
tiles = {
|
tiles = {
|
||||||
{
|
{
|
||||||
name = "spawners_ores_spawner_waiting_animated.png",
|
name = "spawners_ores_spawner_waiting_animated_16.png"..colorize[ore_name],
|
||||||
animation = {
|
animation = {
|
||||||
type = "vertical_frames",
|
type = "vertical_frames",
|
||||||
aspect_w = 32,
|
aspect_w = 32,
|
||||||
@ -212,11 +163,22 @@ function spawners_ores.create_ore(ore_name, mod_prefix, size, offset, texture, s
|
|||||||
},
|
},
|
||||||
is_ground_content = true,
|
is_ground_content = true,
|
||||||
groups = {cracky=1,level=2,not_in_creative_inventory=1},
|
groups = {cracky=1,level=2,not_in_creative_inventory=1},
|
||||||
drop = "spawners_ores:"..ore_name.."_spawner",
|
drop = "spawners_ores:"..ore_name.."_spawner_waiting",
|
||||||
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"
|
||||||
|
minetest.remove_node(pos)
|
||||||
|
return drops
|
||||||
|
end,
|
||||||
|
|
||||||
allow_metadata_inventory_put = allow_metadata_inventory_put,
|
allow_metadata_inventory_put = allow_metadata_inventory_put,
|
||||||
allow_metadata_inventory_take = allow_metadata_inventory_take,
|
allow_metadata_inventory_take = allow_metadata_inventory_take,
|
||||||
on_receive_fields = on_receive_fields,
|
|
||||||
})
|
})
|
||||||
|
|
||||||
-- node spawner inactive (default)
|
-- node spawner inactive (default)
|
||||||
@ -228,87 +190,102 @@ function spawners_ores.create_ore(ore_name, mod_prefix, size, offset, texture, s
|
|||||||
walkable = true,
|
walkable = true,
|
||||||
sounds = default.node_sound_metal_defaults(),
|
sounds = default.node_sound_metal_defaults(),
|
||||||
sunlight_propagates = true,
|
sunlight_propagates = true,
|
||||||
tiles = {"spawners_ores_spawner.png"},
|
tiles = {"spawners_ores_spawner_16.png"..colorize[ore_name]},
|
||||||
is_ground_content = true,
|
is_ground_content = true,
|
||||||
groups = {cracky=1,level=2},
|
groups = {cracky = 1, level = 2},
|
||||||
stack_max = 1,
|
stack_max = 1,
|
||||||
|
|
||||||
|
can_dig = spawners_ores.can_dig,
|
||||||
|
|
||||||
|
on_timer = spawners_ores.on_timer,
|
||||||
|
|
||||||
on_construct = function(pos)
|
on_construct = function(pos)
|
||||||
local meta = minetest.get_meta(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
|
pos.y = pos.y + offset
|
||||||
minetest.add_entity(pos,"spawners_ores:dummy_ore_"..ore_name)
|
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")
|
meta:set_string("infotext", ore[3].." ore spawner is empty")
|
||||||
end,
|
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_put = allow_metadata_inventory_put,
|
||||||
allow_metadata_inventory_take = allow_metadata_inventory_take,
|
allow_metadata_inventory_take = allow_metadata_inventory_take,
|
||||||
on_receive_fields = on_receive_fields,
|
|
||||||
})
|
})
|
||||||
|
|
||||||
-- ABM
|
-- replacement LBM for pre-nodetimer plants
|
||||||
minetest.register_abm({
|
minetest.register_lbm({
|
||||||
nodenames = {"spawners_ores:"..ore_name.."_spawner_active", "spawners_ores:"..ore_name.."_spawner_waiting"},
|
name = "spawners_ores:start_nodetimer_"..ore_name,
|
||||||
interval = 5.0,
|
nodenames = {
|
||||||
chance = 5,
|
"spawners_ores:"..ore_name.."_spawner_active",
|
||||||
action = function(pos, node, active_object_count, active_object_count_wider)
|
"spawners_ores:"..ore_name.."_spawner_waiting"
|
||||||
|
},
|
||||||
local waiting, found_node = spawners_ores.check_node_status_ores(pos, ore_name, "default:stone")
|
action = function(pos, node)
|
||||||
|
spawners_ores.tick_short(pos)
|
||||||
local meta = minetest.get_meta(pos)
|
end,
|
||||||
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
|
|
||||||
})
|
})
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Ore Spawners Definitions
|
||||||
|
--
|
||||||
|
|
||||||
-- default:stone_with_gold
|
-- 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
|
-- 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
|
-- 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({
|
minetest.register_craft({
|
||||||
output = "spawners_ores:stone_with_gold_spawner",
|
output = "spawners_ores:stone_with_gold_spawner",
|
||||||
recipe = {
|
recipe = {
|
||||||
@ -335,3 +312,12 @@ minetest.register_craft({
|
|||||||
{"default:diamondblock", "xpanes:bar_flat", "default:diamondblock"},
|
{"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"},
|
||||||
|
}
|
||||||
|
})
|
||||||
|
BIN
spawners_ores/textures/spawners_ores_ingot_slot.png
Normal file
After Width: | Height: | Size: 185 B |
Before Width: | Height: | Size: 233 B After Width: | Height: | Size: 216 B |
BIN
spawners_ores/textures/spawners_ores_spawner_16.png
Normal file
After Width: | Height: | Size: 255 B |
BIN
spawners_ores/textures/spawners_ores_spawner_animated_16.png
Normal file
After Width: | Height: | Size: 588 B |
After Width: | Height: | Size: 847 B |
After Width: | Height: | Size: 364 B |
Before Width: | Height: | Size: 7.8 KiB |
After Width: | Height: | Size: 990 B |
BIN
spawners_ores/textures/spawners_ores_stone_with_copper.png
Normal file
After Width: | Height: | Size: 316 B |
BIN
spawners_ores/textures/spawners_ores_stone_with_gold.png
Normal file
After Width: | Height: | Size: 302 B |
BIN
spawners_ores/textures/spawners_ores_stone_with_iron.png
Normal file
After Width: | Height: | Size: 313 B |
BIN
spawners_ores/textures/spawners_ores_stone_with_tin.png
Normal file
After Width: | Height: | Size: 327 B |