Add files via upload
parent
759f6ababa
commit
8faad112b2
|
@ -0,0 +1,504 @@
|
|||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
Version 2.1, February 1999
|
||||
|
||||
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
[This is the first released version of the Lesser GPL. It also counts
|
||||
as the successor of the GNU Library Public License, version 2, hence
|
||||
the version number 2.1.]
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
Licenses are intended to guarantee your freedom to share and change
|
||||
free software--to make sure the software is free for all its users.
|
||||
|
||||
This license, the Lesser General Public License, applies to some
|
||||
specially designated software packages--typically libraries--of the
|
||||
Free Software Foundation and other authors who decide to use it. You
|
||||
can use it too, but we suggest you first think carefully about whether
|
||||
this license or the ordinary General Public License is the better
|
||||
strategy to use in any particular case, based on the explanations below.
|
||||
|
||||
When we speak of free software, we are referring to freedom of use,
|
||||
not price. Our General Public Licenses are designed to make sure that
|
||||
you have the freedom to distribute copies of free software (and charge
|
||||
for this service if you wish); that you receive source code or can get
|
||||
it if you want it; that you can change the software and use pieces of
|
||||
it in new free programs; and that you are informed that you can do
|
||||
these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
distributors to deny you these rights or to ask you to surrender these
|
||||
rights. These restrictions translate to certain responsibilities for
|
||||
you if you distribute copies of the library or if you modify it.
|
||||
|
||||
For example, if you distribute copies of the library, whether gratis
|
||||
or for a fee, you must give the recipients all the rights that we gave
|
||||
you. You must make sure that they, too, receive or can get the source
|
||||
code. If you link other code with the library, you must provide
|
||||
complete object files to the recipients, so that they can relink them
|
||||
with the library after making changes to the library and recompiling
|
||||
it. And you must show them these terms so they know their rights.
|
||||
|
||||
We protect your rights with a two-step method: (1) we copyright the
|
||||
library, and (2) we offer you this license, which gives you legal
|
||||
permission to copy, distribute and/or modify the library.
|
||||
|
||||
To protect each distributor, we want to make it very clear that
|
||||
there is no warranty for the free library. Also, if the library is
|
||||
modified by someone else and passed on, the recipients should know
|
||||
that what they have is not the original version, so that the original
|
||||
author's reputation will not be affected by problems that might be
|
||||
introduced by others.
|
||||
|
||||
Finally, software patents pose a constant threat to the existence of
|
||||
any free program. We wish to make sure that a company cannot
|
||||
effectively restrict the users of a free program by obtaining a
|
||||
restrictive license from a patent holder. Therefore, we insist that
|
||||
any patent license obtained for a version of the library must be
|
||||
consistent with the full freedom of use specified in this license.
|
||||
|
||||
Most GNU software, including some libraries, is covered by the
|
||||
ordinary GNU General Public License. This license, the GNU Lesser
|
||||
General Public License, applies to certain designated libraries, and
|
||||
is quite different from the ordinary General Public License. We use
|
||||
this license for certain libraries in order to permit linking those
|
||||
libraries into non-free programs.
|
||||
|
||||
When a program is linked with a library, whether statically or using
|
||||
a shared library, the combination of the two is legally speaking a
|
||||
combined work, a derivative of the original library. The ordinary
|
||||
General Public License therefore permits such linking only if the
|
||||
entire combination fits its criteria of freedom. The Lesser General
|
||||
Public License permits more lax criteria for linking other code with
|
||||
the library.
|
||||
|
||||
We call this license the "Lesser" General Public License because it
|
||||
does Less to protect the user's freedom than the ordinary General
|
||||
Public License. It also provides other free software developers Less
|
||||
of an advantage over competing non-free programs. These disadvantages
|
||||
are the reason we use the ordinary General Public License for many
|
||||
libraries. However, the Lesser license provides advantages in certain
|
||||
special circumstances.
|
||||
|
||||
For example, on rare occasions, there may be a special need to
|
||||
encourage the widest possible use of a certain library, so that it becomes
|
||||
a de-facto standard. To achieve this, non-free programs must be
|
||||
allowed to use the library. A more frequent case is that a free
|
||||
library does the same job as widely used non-free libraries. In this
|
||||
case, there is little to gain by limiting the free library to free
|
||||
software only, so we use the Lesser General Public License.
|
||||
|
||||
In other cases, permission to use a particular library in non-free
|
||||
programs enables a greater number of people to use a large body of
|
||||
free software. For example, permission to use the GNU C Library in
|
||||
non-free programs enables many more people to use the whole GNU
|
||||
operating system, as well as its variant, the GNU/Linux operating
|
||||
system.
|
||||
|
||||
Although the Lesser General Public License is Less protective of the
|
||||
users' freedom, it does ensure that the user of a program that is
|
||||
linked with the Library has the freedom and the wherewithal to run
|
||||
that program using a modified version of the Library.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow. Pay close attention to the difference between a
|
||||
"work based on the library" and a "work that uses the library". The
|
||||
former contains code derived from the library, whereas the latter must
|
||||
be combined with the library in order to run.
|
||||
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License Agreement applies to any software library or other
|
||||
program which contains a notice placed by the copyright holder or
|
||||
other authorized party saying it may be distributed under the terms of
|
||||
this Lesser General Public License (also called "this License").
|
||||
Each licensee is addressed as "you".
|
||||
|
||||
A "library" means a collection of software functions and/or data
|
||||
prepared so as to be conveniently linked with application programs
|
||||
(which use some of those functions and data) to form executables.
|
||||
|
||||
The "Library", below, refers to any such software library or work
|
||||
which has been distributed under these terms. A "work based on the
|
||||
Library" means either the Library or any derivative work under
|
||||
copyright law: that is to say, a work containing the Library or a
|
||||
portion of it, either verbatim or with modifications and/or translated
|
||||
straightforwardly into another language. (Hereinafter, translation is
|
||||
included without limitation in the term "modification".)
|
||||
|
||||
"Source code" for a work means the preferred form of the work for
|
||||
making modifications to it. For a library, complete source code means
|
||||
all the source code for all modules it contains, plus any associated
|
||||
interface definition files, plus the scripts used to control compilation
|
||||
and installation of the library.
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running a program using the Library is not restricted, and output from
|
||||
such a program is covered only if its contents constitute a work based
|
||||
on the Library (independent of the use of the Library in a tool for
|
||||
writing it). Whether that is true depends on what the Library does
|
||||
and what the program that uses the Library does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Library's
|
||||
complete source code as you receive it, in any medium, provided that
|
||||
you conspicuously and appropriately publish on each copy an
|
||||
appropriate copyright notice and disclaimer of warranty; keep intact
|
||||
all the notices that refer to this License and to the absence of any
|
||||
warranty; and distribute a copy of this License along with the
|
||||
Library.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy,
|
||||
and you may at your option offer warranty protection in exchange for a
|
||||
fee.
|
||||
|
||||
2. You may modify your copy or copies of the Library or any portion
|
||||
of it, thus forming a work based on the Library, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) The modified work must itself be a software library.
|
||||
|
||||
b) You must cause the files modified to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
c) You must cause the whole of the work to be licensed at no
|
||||
charge to all third parties under the terms of this License.
|
||||
|
||||
d) If a facility in the modified Library refers to a function or a
|
||||
table of data to be supplied by an application program that uses
|
||||
the facility, other than as an argument passed when the facility
|
||||
is invoked, then you must make a good faith effort to ensure that,
|
||||
in the event an application does not supply such function or
|
||||
table, the facility still operates, and performs whatever part of
|
||||
its purpose remains meaningful.
|
||||
|
||||
(For example, a function in a library to compute square roots has
|
||||
a purpose that is entirely well-defined independent of the
|
||||
application. Therefore, Subsection 2d requires that any
|
||||
application-supplied function or table used by this function must
|
||||
be optional: if the application does not supply it, the square
|
||||
root function must still compute square roots.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Library,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Library, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote
|
||||
it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Library.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Library
|
||||
with the Library (or with a work based on the Library) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may opt to apply the terms of the ordinary GNU General Public
|
||||
License instead of this License to a given copy of the Library. To do
|
||||
this, you must alter all the notices that refer to this License, so
|
||||
that they refer to the ordinary GNU General Public License, version 2,
|
||||
instead of to this License. (If a newer version than version 2 of the
|
||||
ordinary GNU General Public License has appeared, then you can specify
|
||||
that version instead if you wish.) Do not make any other change in
|
||||
these notices.
|
||||
|
||||
Once this change is made in a given copy, it is irreversible for
|
||||
that copy, so the ordinary GNU General Public License applies to all
|
||||
subsequent copies and derivative works made from that copy.
|
||||
|
||||
This option is useful when you wish to copy part of the code of
|
||||
the Library into a program that is not a library.
|
||||
|
||||
4. You may copy and distribute the Library (or a portion or
|
||||
derivative of it, under Section 2) in object code or executable form
|
||||
under the terms of Sections 1 and 2 above provided that you accompany
|
||||
it with the complete corresponding machine-readable source code, which
|
||||
must be distributed under the terms of Sections 1 and 2 above on a
|
||||
medium customarily used for software interchange.
|
||||
|
||||
If distribution of object code is made by offering access to copy
|
||||
from a designated place, then offering equivalent access to copy the
|
||||
source code from the same place satisfies the requirement to
|
||||
distribute the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
5. A program that contains no derivative of any portion of the
|
||||
Library, but is designed to work with the Library by being compiled or
|
||||
linked with it, is called a "work that uses the Library". Such a
|
||||
work, in isolation, is not a derivative work of the Library, and
|
||||
therefore falls outside the scope of this License.
|
||||
|
||||
However, linking a "work that uses the Library" with the Library
|
||||
creates an executable that is a derivative of the Library (because it
|
||||
contains portions of the Library), rather than a "work that uses the
|
||||
library". The executable is therefore covered by this License.
|
||||
Section 6 states terms for distribution of such executables.
|
||||
|
||||
When a "work that uses the Library" uses material from a header file
|
||||
that is part of the Library, the object code for the work may be a
|
||||
derivative work of the Library even though the source code is not.
|
||||
Whether this is true is especially significant if the work can be
|
||||
linked without the Library, or if the work is itself a library. The
|
||||
threshold for this to be true is not precisely defined by law.
|
||||
|
||||
If such an object file uses only numerical parameters, data
|
||||
structure layouts and accessors, and small macros and small inline
|
||||
functions (ten lines or less in length), then the use of the object
|
||||
file is unrestricted, regardless of whether it is legally a derivative
|
||||
work. (Executables containing this object code plus portions of the
|
||||
Library will still fall under Section 6.)
|
||||
|
||||
Otherwise, if the work is a derivative of the Library, you may
|
||||
distribute the object code for the work under the terms of Section 6.
|
||||
Any executables containing that work also fall under Section 6,
|
||||
whether or not they are linked directly with the Library itself.
|
||||
|
||||
6. As an exception to the Sections above, you may also combine or
|
||||
link a "work that uses the Library" with the Library to produce a
|
||||
work containing portions of the Library, and distribute that work
|
||||
under terms of your choice, provided that the terms permit
|
||||
modification of the work for the customer's own use and reverse
|
||||
engineering for debugging such modifications.
|
||||
|
||||
You must give prominent notice with each copy of the work that the
|
||||
Library is used in it and that the Library and its use are covered by
|
||||
this License. You must supply a copy of this License. If the work
|
||||
during execution displays copyright notices, you must include the
|
||||
copyright notice for the Library among them, as well as a reference
|
||||
directing the user to the copy of this License. Also, you must do one
|
||||
of these things:
|
||||
|
||||
a) Accompany the work with the complete corresponding
|
||||
machine-readable source code for the Library including whatever
|
||||
changes were used in the work (which must be distributed under
|
||||
Sections 1 and 2 above); and, if the work is an executable linked
|
||||
with the Library, with the complete machine-readable "work that
|
||||
uses the Library", as object code and/or source code, so that the
|
||||
user can modify the Library and then relink to produce a modified
|
||||
executable containing the modified Library. (It is understood
|
||||
that the user who changes the contents of definitions files in the
|
||||
Library will not necessarily be able to recompile the application
|
||||
to use the modified definitions.)
|
||||
|
||||
b) Use a suitable shared library mechanism for linking with the
|
||||
Library. A suitable mechanism is one that (1) uses at run time a
|
||||
copy of the library already present on the user's computer system,
|
||||
rather than copying library functions into the executable, and (2)
|
||||
will operate properly with a modified version of the library, if
|
||||
the user installs one, as long as the modified version is
|
||||
interface-compatible with the version that the work was made with.
|
||||
|
||||
c) Accompany the work with a written offer, valid for at
|
||||
least three years, to give the same user the materials
|
||||
specified in Subsection 6a, above, for a charge no more
|
||||
than the cost of performing this distribution.
|
||||
|
||||
d) If distribution of the work is made by offering access to copy
|
||||
from a designated place, offer equivalent access to copy the above
|
||||
specified materials from the same place.
|
||||
|
||||
e) Verify that the user has already received a copy of these
|
||||
materials or that you have already sent this user a copy.
|
||||
|
||||
For an executable, the required form of the "work that uses the
|
||||
Library" must include any data and utility programs needed for
|
||||
reproducing the executable from it. However, as a special exception,
|
||||
the materials to be distributed need not include anything that is
|
||||
normally distributed (in either source or binary form) with the major
|
||||
components (compiler, kernel, and so on) of the operating system on
|
||||
which the executable runs, unless that component itself accompanies
|
||||
the executable.
|
||||
|
||||
It may happen that this requirement contradicts the license
|
||||
restrictions of other proprietary libraries that do not normally
|
||||
accompany the operating system. Such a contradiction means you cannot
|
||||
use both them and the Library together in an executable that you
|
||||
distribute.
|
||||
|
||||
7. 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 not covered by this License, and distribute such a combined
|
||||
library, provided that the separate distribution of the work based on
|
||||
the Library and of the other library facilities is otherwise
|
||||
permitted, and provided that you do these two things:
|
||||
|
||||
a) Accompany the combined library with a copy of the same work
|
||||
based on the Library, uncombined with any other library
|
||||
facilities. This must be distributed under the terms of the
|
||||
Sections above.
|
||||
|
||||
b) Give prominent notice with the combined library of the fact
|
||||
that part of it is a work based on the Library, and explaining
|
||||
where to find the accompanying uncombined form of the same work.
|
||||
|
||||
8. You may not copy, modify, sublicense, link with, or distribute
|
||||
the Library except as expressly provided under this License. Any
|
||||
attempt otherwise to copy, modify, sublicense, link with, or
|
||||
distribute the Library is void, and will automatically terminate your
|
||||
rights under this License. However, parties who have received copies,
|
||||
or rights, from you under this License will not have their licenses
|
||||
terminated so long as such parties remain in full compliance.
|
||||
|
||||
9. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Library or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Library (or any work based on the
|
||||
Library), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Library or works based on it.
|
||||
|
||||
10. Each time you redistribute the Library (or any work based on the
|
||||
Library), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute, link with or modify the Library
|
||||
subject to these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties with
|
||||
this License.
|
||||
|
||||
11. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Library at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Library by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Library.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under any
|
||||
particular circumstance, the balance of the section is intended to apply,
|
||||
and the section as a whole is intended to apply in other circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
12. If the distribution and/or use of the Library is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Library under this License may add
|
||||
an explicit geographical distribution limitation excluding those countries,
|
||||
so that distribution is permitted only in or among countries not thus
|
||||
excluded. In such case, this License incorporates the limitation as if
|
||||
written in the body of this License.
|
||||
|
||||
13. The Free Software Foundation may publish revised and/or new
|
||||
versions of the 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
|
||||
specifies a version number of this License which applies to it and
|
||||
"any later version", you have the option of following the terms and
|
||||
conditions either of that version or of any later version published by
|
||||
the Free Software Foundation. If the Library does not specify a
|
||||
license version number, you may choose any version ever published by
|
||||
the Free Software Foundation.
|
||||
|
||||
14. If you wish to incorporate parts of the Library into other free
|
||||
programs whose distribution conditions are incompatible with these,
|
||||
write to the author to ask for permission. For software which is
|
||||
copyrighted by the Free Software Foundation, write to the Free
|
||||
Software Foundation; we sometimes make exceptions for this. Our
|
||||
decision will be guided by the two goals of preserving the free status
|
||||
of all derivatives of our free software and of promoting the sharing
|
||||
and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
|
||||
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
|
||||
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
|
||||
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
|
||||
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
|
||||
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
|
||||
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
|
||||
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
|
||||
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
|
||||
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
|
||||
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
|
||||
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
|
||||
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
|
||||
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
|
||||
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Libraries
|
||||
|
||||
If you develop a new library, and you want it to be of the greatest
|
||||
possible use to the public, we recommend making it free software that
|
||||
everyone can redistribute and change. You can do so by permitting
|
||||
redistribution under these terms (or, alternatively, under the terms of the
|
||||
ordinary General Public License).
|
||||
|
||||
To apply these terms, attach the following notices to the library. It is
|
||||
safest to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least the
|
||||
"copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the library's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
||||
USA
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the library, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the
|
||||
library `Frob' (a library for tweaking knobs) written by James Random
|
||||
Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1990
|
||||
Ty Coon, President of Vice
|
||||
|
||||
That's all there is to it!
|
|
@ -0,0 +1,170 @@
|
|||
-- minetest CSM breadcrumbs --
|
||||
-- by SwissalpS --
|
||||
-- Leaves a trail of fading waypoints at intervals.
|
||||
-- Adds command .bread to configure during gameplay
|
||||
bc = {
|
||||
version = 20211206.1721,
|
||||
colour = 0xefef00,
|
||||
interval = 30, -- how often to place a new waypoint
|
||||
duration = 300, -- how long before waypoints fade
|
||||
formName = '__breadcrumbs__',
|
||||
store = assert(core.get_mod_storage()),
|
||||
bMain = true,
|
||||
tCache = {},
|
||||
lastid = -1,
|
||||
}
|
||||
|
||||
|
||||
function bc.clearAll()
|
||||
|
||||
for _, id in pairs(bc.tCache) do
|
||||
core.localplayer:hud_remove(id)
|
||||
end
|
||||
|
||||
bc.tCache = {}
|
||||
|
||||
end -- clearAll
|
||||
|
||||
|
||||
function bc.formInput(sFormName, tFields)
|
||||
|
||||
if bc.formName ~= sFormName then return false end
|
||||
|
||||
local interval = tonumber(tFields.interval)
|
||||
local duration = tonumber(tFields.duration)
|
||||
local colour = tonumber(tFields.colour)
|
||||
if nil == colour and tFields.colour then
|
||||
colour = tonumber('0x' .. tFields.colour)
|
||||
end
|
||||
|
||||
if tFields.bMain then bc.bMain = 'true' == tFields.bMain end
|
||||
if interval and 0 < interval then bc.interval = interval end
|
||||
if duration and 0 < duration then bc.duration = duration end
|
||||
if colour and -1 < colour then bc.colour = colour end
|
||||
|
||||
if tFields.clear then bc.clearAll() end
|
||||
|
||||
return true
|
||||
|
||||
end -- formInput
|
||||
|
||||
|
||||
function bc.formShow()
|
||||
|
||||
local sOut = 'size[5,5]'
|
||||
.. 'button[1,0;2,1;clear;Clear All]'
|
||||
.. 'checkbox[1,1;bMain;Active;'
|
||||
.. (bc.bMain and 'true' or 'false') .. ']'
|
||||
.. 'field[interval;Interval;' .. tostring(bc.interval) .. ']'
|
||||
.. 'field[duration;Duration;' .. tostring(bc.duration) .. ']'
|
||||
.. 'field[colour;Colour;0x' .. string.format('%x', bc.colour) .. ']'
|
||||
--[[
|
||||
.. 'field_close_on_enter[interval;false]'
|
||||
.. 'field_close_on_enter[duration;false]'
|
||||
.. 'field_close_on_enter[colour;false]'
|
||||
--]]
|
||||
|
||||
core.show_formspec(bc.formName, sOut)
|
||||
|
||||
end -- formShow
|
||||
|
||||
|
||||
function bc.init()
|
||||
|
||||
-- read settings
|
||||
local colour = bc.store:get_int('colour')
|
||||
if 0 < colour then bc.colour = colour end
|
||||
|
||||
local interval = bc.store:get_int('interval')
|
||||
if 0 < interval then bc.interval = interval end
|
||||
|
||||
local duration = bc.store:get_int('duration')
|
||||
if 0 < duration then bc.duration = duration end
|
||||
|
||||
local sMain = bc.store:get_string('bMain')
|
||||
bc.bMain = '' == sMain
|
||||
|
||||
-- start loop
|
||||
core.after(5, bc.update)
|
||||
|
||||
end -- init
|
||||
|
||||
|
||||
function bc.pos2string(tPos)
|
||||
|
||||
return tostring(math.floor(tPos.x)) .. ' | '
|
||||
.. tostring(math.floor(tPos.y)) .. ' | '
|
||||
.. tostring(math.floor(tPos.z))
|
||||
|
||||
end -- pos2string
|
||||
|
||||
|
||||
function bc.remove(id, sPos)
|
||||
|
||||
core.localplayer:hud_remove(id)
|
||||
bc.tCache[sPos] = nil
|
||||
|
||||
end -- remove
|
||||
|
||||
|
||||
function bc.shutdown()
|
||||
|
||||
-- save settings
|
||||
bc.store:set_int('colour', bc.colour)
|
||||
bc.store:set_int('interval', bc.interval)
|
||||
bc.store:set_int('duration', bc.duration)
|
||||
bc.store:set_string('bMain', bc.bMain and '' or '-')
|
||||
|
||||
end -- shutdown
|
||||
|
||||
|
||||
function bc.update()
|
||||
|
||||
-- call again
|
||||
core.after(bc.interval, bc.update)
|
||||
|
||||
if not bc.bMain then return end
|
||||
|
||||
local oP = core.localplayer
|
||||
if not oP then return end
|
||||
|
||||
local tPos = oP:get_pos()
|
||||
local sPos = bc.pos2string(tPos)
|
||||
|
||||
if bc.tCache[sPos] then return end
|
||||
|
||||
local id = oP:hud_add({
|
||||
hud_elem_type = 'waypoint',
|
||||
name = sPos,
|
||||
text = 'm',
|
||||
precision = 5,
|
||||
number = bc.colour,
|
||||
world_pos = tPos,
|
||||
offset = { x = 0, y = 0},
|
||||
alignment = {x = 1, y = -1},
|
||||
})
|
||||
bc.tCache[sPos] = id
|
||||
|
||||
-- have waypoint fade
|
||||
core.after(bc.duration, bc.remove, id, sPos)
|
||||
|
||||
end -- update
|
||||
|
||||
|
||||
-- hook in to core shutdown callback
|
||||
core.register_on_shutdown(bc.shutdown)
|
||||
-- hook in to formspec signals
|
||||
core.register_on_formspec_input(bc.formInput)
|
||||
-- register chat command
|
||||
core.register_chatcommand('bread', {
|
||||
description = 'Invokes formspec to change settings .',
|
||||
func = bc.formShow,
|
||||
params = '<none>',
|
||||
})
|
||||
|
||||
-- start delayed
|
||||
core.after(5, bc.init)
|
||||
|
||||
--print('[CSM, Too Much Info, Loaded]')
|
||||
print('[bread-crumbs Loaded]')
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
name = breadcrumbs
|
||||
description = Leave a trail of fading waypoints at intervals.
|
||||
|
|
@ -0,0 +1,504 @@
|
|||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
Version 2.1, February 1999
|
||||
|
||||
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
[This is the first released version of the Lesser GPL. It also counts
|
||||
as the successor of the GNU Library Public License, version 2, hence
|
||||
the version number 2.1.]
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
Licenses are intended to guarantee your freedom to share and change
|
||||
free software--to make sure the software is free for all its users.
|
||||
|
||||
This license, the Lesser General Public License, applies to some
|
||||
specially designated software packages--typically libraries--of the
|
||||
Free Software Foundation and other authors who decide to use it. You
|
||||
can use it too, but we suggest you first think carefully about whether
|
||||
this license or the ordinary General Public License is the better
|
||||
strategy to use in any particular case, based on the explanations below.
|
||||
|
||||
When we speak of free software, we are referring to freedom of use,
|
||||
not price. Our General Public Licenses are designed to make sure that
|
||||
you have the freedom to distribute copies of free software (and charge
|
||||
for this service if you wish); that you receive source code or can get
|
||||
it if you want it; that you can change the software and use pieces of
|
||||
it in new free programs; and that you are informed that you can do
|
||||
these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
distributors to deny you these rights or to ask you to surrender these
|
||||
rights. These restrictions translate to certain responsibilities for
|
||||
you if you distribute copies of the library or if you modify it.
|
||||
|
||||
For example, if you distribute copies of the library, whether gratis
|
||||
or for a fee, you must give the recipients all the rights that we gave
|
||||
you. You must make sure that they, too, receive or can get the source
|
||||
code. If you link other code with the library, you must provide
|
||||
complete object files to the recipients, so that they can relink them
|
||||
with the library after making changes to the library and recompiling
|
||||
it. And you must show them these terms so they know their rights.
|
||||
|
||||
We protect your rights with a two-step method: (1) we copyright the
|
||||
library, and (2) we offer you this license, which gives you legal
|
||||
permission to copy, distribute and/or modify the library.
|
||||
|
||||
To protect each distributor, we want to make it very clear that
|
||||
there is no warranty for the free library. Also, if the library is
|
||||
modified by someone else and passed on, the recipients should know
|
||||
that what they have is not the original version, so that the original
|
||||
author's reputation will not be affected by problems that might be
|
||||
introduced by others.
|
||||
|
||||
Finally, software patents pose a constant threat to the existence of
|
||||
any free program. We wish to make sure that a company cannot
|
||||
effectively restrict the users of a free program by obtaining a
|
||||
restrictive license from a patent holder. Therefore, we insist that
|
||||
any patent license obtained for a version of the library must be
|
||||
consistent with the full freedom of use specified in this license.
|
||||
|
||||
Most GNU software, including some libraries, is covered by the
|
||||
ordinary GNU General Public License. This license, the GNU Lesser
|
||||
General Public License, applies to certain designated libraries, and
|
||||
is quite different from the ordinary General Public License. We use
|
||||
this license for certain libraries in order to permit linking those
|
||||
libraries into non-free programs.
|
||||
|
||||
When a program is linked with a library, whether statically or using
|
||||
a shared library, the combination of the two is legally speaking a
|
||||
combined work, a derivative of the original library. The ordinary
|
||||
General Public License therefore permits such linking only if the
|
||||
entire combination fits its criteria of freedom. The Lesser General
|
||||
Public License permits more lax criteria for linking other code with
|
||||
the library.
|
||||
|
||||
We call this license the "Lesser" General Public License because it
|
||||
does Less to protect the user's freedom than the ordinary General
|
||||
Public License. It also provides other free software developers Less
|
||||
of an advantage over competing non-free programs. These disadvantages
|
||||
are the reason we use the ordinary General Public License for many
|
||||
libraries. However, the Lesser license provides advantages in certain
|
||||
special circumstances.
|
||||
|
||||
For example, on rare occasions, there may be a special need to
|
||||
encourage the widest possible use of a certain library, so that it becomes
|
||||
a de-facto standard. To achieve this, non-free programs must be
|
||||
allowed to use the library. A more frequent case is that a free
|
||||
library does the same job as widely used non-free libraries. In this
|
||||
case, there is little to gain by limiting the free library to free
|
||||
software only, so we use the Lesser General Public License.
|
||||
|
||||
In other cases, permission to use a particular library in non-free
|
||||
programs enables a greater number of people to use a large body of
|
||||
free software. For example, permission to use the GNU C Library in
|
||||
non-free programs enables many more people to use the whole GNU
|
||||
operating system, as well as its variant, the GNU/Linux operating
|
||||
system.
|
||||
|
||||
Although the Lesser General Public License is Less protective of the
|
||||
users' freedom, it does ensure that the user of a program that is
|
||||
linked with the Library has the freedom and the wherewithal to run
|
||||
that program using a modified version of the Library.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow. Pay close attention to the difference between a
|
||||
"work based on the library" and a "work that uses the library". The
|
||||
former contains code derived from the library, whereas the latter must
|
||||
be combined with the library in order to run.
|
||||
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License Agreement applies to any software library or other
|
||||
program which contains a notice placed by the copyright holder or
|
||||
other authorized party saying it may be distributed under the terms of
|
||||
this Lesser General Public License (also called "this License").
|
||||
Each licensee is addressed as "you".
|
||||
|
||||
A "library" means a collection of software functions and/or data
|
||||
prepared so as to be conveniently linked with application programs
|
||||
(which use some of those functions and data) to form executables.
|
||||
|
||||
The "Library", below, refers to any such software library or work
|
||||
which has been distributed under these terms. A "work based on the
|
||||
Library" means either the Library or any derivative work under
|
||||
copyright law: that is to say, a work containing the Library or a
|
||||
portion of it, either verbatim or with modifications and/or translated
|
||||
straightforwardly into another language. (Hereinafter, translation is
|
||||
included without limitation in the term "modification".)
|
||||
|
||||
"Source code" for a work means the preferred form of the work for
|
||||
making modifications to it. For a library, complete source code means
|
||||
all the source code for all modules it contains, plus any associated
|
||||
interface definition files, plus the scripts used to control compilation
|
||||
and installation of the library.
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running a program using the Library is not restricted, and output from
|
||||
such a program is covered only if its contents constitute a work based
|
||||
on the Library (independent of the use of the Library in a tool for
|
||||
writing it). Whether that is true depends on what the Library does
|
||||
and what the program that uses the Library does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Library's
|
||||
complete source code as you receive it, in any medium, provided that
|
||||
you conspicuously and appropriately publish on each copy an
|
||||
appropriate copyright notice and disclaimer of warranty; keep intact
|
||||
all the notices that refer to this License and to the absence of any
|
||||
warranty; and distribute a copy of this License along with the
|
||||
Library.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy,
|
||||
and you may at your option offer warranty protection in exchange for a
|
||||
fee.
|
||||
|
||||
2. You may modify your copy or copies of the Library or any portion
|
||||
of it, thus forming a work based on the Library, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) The modified work must itself be a software library.
|
||||
|
||||
b) You must cause the files modified to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
c) You must cause the whole of the work to be licensed at no
|
||||
charge to all third parties under the terms of this License.
|
||||
|
||||
d) If a facility in the modified Library refers to a function or a
|
||||
table of data to be supplied by an application program that uses
|
||||
the facility, other than as an argument passed when the facility
|
||||
is invoked, then you must make a good faith effort to ensure that,
|
||||
in the event an application does not supply such function or
|
||||
table, the facility still operates, and performs whatever part of
|
||||
its purpose remains meaningful.
|
||||
|
||||
(For example, a function in a library to compute square roots has
|
||||
a purpose that is entirely well-defined independent of the
|
||||
application. Therefore, Subsection 2d requires that any
|
||||
application-supplied function or table used by this function must
|
||||
be optional: if the application does not supply it, the square
|
||||
root function must still compute square roots.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Library,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Library, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote
|
||||
it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Library.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Library
|
||||
with the Library (or with a work based on the Library) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may opt to apply the terms of the ordinary GNU General Public
|
||||
License instead of this License to a given copy of the Library. To do
|
||||
this, you must alter all the notices that refer to this License, so
|
||||
that they refer to the ordinary GNU General Public License, version 2,
|
||||
instead of to this License. (If a newer version than version 2 of the
|
||||
ordinary GNU General Public License has appeared, then you can specify
|
||||
that version instead if you wish.) Do not make any other change in
|
||||
these notices.
|
||||
|
||||
Once this change is made in a given copy, it is irreversible for
|
||||
that copy, so the ordinary GNU General Public License applies to all
|
||||
subsequent copies and derivative works made from that copy.
|
||||
|
||||
This option is useful when you wish to copy part of the code of
|
||||
the Library into a program that is not a library.
|
||||
|
||||
4. You may copy and distribute the Library (or a portion or
|
||||
derivative of it, under Section 2) in object code or executable form
|
||||
under the terms of Sections 1 and 2 above provided that you accompany
|
||||
it with the complete corresponding machine-readable source code, which
|
||||
must be distributed under the terms of Sections 1 and 2 above on a
|
||||
medium customarily used for software interchange.
|
||||
|
||||
If distribution of object code is made by offering access to copy
|
||||
from a designated place, then offering equivalent access to copy the
|
||||
source code from the same place satisfies the requirement to
|
||||
distribute the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
5. A program that contains no derivative of any portion of the
|
||||
Library, but is designed to work with the Library by being compiled or
|
||||
linked with it, is called a "work that uses the Library". Such a
|
||||
work, in isolation, is not a derivative work of the Library, and
|
||||
therefore falls outside the scope of this License.
|
||||
|
||||
However, linking a "work that uses the Library" with the Library
|
||||
creates an executable that is a derivative of the Library (because it
|
||||
contains portions of the Library), rather than a "work that uses the
|
||||
library". The executable is therefore covered by this License.
|
||||
Section 6 states terms for distribution of such executables.
|
||||
|
||||
When a "work that uses the Library" uses material from a header file
|
||||
that is part of the Library, the object code for the work may be a
|
||||
derivative work of the Library even though the source code is not.
|
||||
Whether this is true is especially significant if the work can be
|
||||
linked without the Library, or if the work is itself a library. The
|
||||
threshold for this to be true is not precisely defined by law.
|
||||
|
||||
If such an object file uses only numerical parameters, data
|
||||
structure layouts and accessors, and small macros and small inline
|
||||
functions (ten lines or less in length), then the use of the object
|
||||
file is unrestricted, regardless of whether it is legally a derivative
|
||||
work. (Executables containing this object code plus portions of the
|
||||
Library will still fall under Section 6.)
|
||||
|
||||
Otherwise, if the work is a derivative of the Library, you may
|
||||
distribute the object code for the work under the terms of Section 6.
|
||||
Any executables containing that work also fall under Section 6,
|
||||
whether or not they are linked directly with the Library itself.
|
||||
|
||||
6. As an exception to the Sections above, you may also combine or
|
||||
link a "work that uses the Library" with the Library to produce a
|
||||
work containing portions of the Library, and distribute that work
|
||||
under terms of your choice, provided that the terms permit
|
||||
modification of the work for the customer's own use and reverse
|
||||
engineering for debugging such modifications.
|
||||
|
||||
You must give prominent notice with each copy of the work that the
|
||||
Library is used in it and that the Library and its use are covered by
|
||||
this License. You must supply a copy of this License. If the work
|
||||
during execution displays copyright notices, you must include the
|
||||
copyright notice for the Library among them, as well as a reference
|
||||
directing the user to the copy of this License. Also, you must do one
|
||||
of these things:
|
||||
|
||||
a) Accompany the work with the complete corresponding
|
||||
machine-readable source code for the Library including whatever
|
||||
changes were used in the work (which must be distributed under
|
||||
Sections 1 and 2 above); and, if the work is an executable linked
|
||||
with the Library, with the complete machine-readable "work that
|
||||
uses the Library", as object code and/or source code, so that the
|
||||
user can modify the Library and then relink to produce a modified
|
||||
executable containing the modified Library. (It is understood
|
||||
that the user who changes the contents of definitions files in the
|
||||
Library will not necessarily be able to recompile the application
|
||||
to use the modified definitions.)
|
||||
|
||||
b) Use a suitable shared library mechanism for linking with the
|
||||
Library. A suitable mechanism is one that (1) uses at run time a
|
||||
copy of the library already present on the user's computer system,
|
||||
rather than copying library functions into the executable, and (2)
|
||||
will operate properly with a modified version of the library, if
|
||||
the user installs one, as long as the modified version is
|
||||
interface-compatible with the version that the work was made with.
|
||||
|
||||
c) Accompany the work with a written offer, valid for at
|
||||
least three years, to give the same user the materials
|
||||
specified in Subsection 6a, above, for a charge no more
|
||||
than the cost of performing this distribution.
|
||||
|
||||
d) If distribution of the work is made by offering access to copy
|
||||
from a designated place, offer equivalent access to copy the above
|
||||
specified materials from the same place.
|
||||
|
||||
e) Verify that the user has already received a copy of these
|
||||
materials or that you have already sent this user a copy.
|
||||
|
||||
For an executable, the required form of the "work that uses the
|
||||
Library" must include any data and utility programs needed for
|
||||
reproducing the executable from it. However, as a special exception,
|
||||
the materials to be distributed need not include anything that is
|
||||
normally distributed (in either source or binary form) with the major
|
||||
components (compiler, kernel, and so on) of the operating system on
|
||||
which the executable runs, unless that component itself accompanies
|
||||
the executable.
|
||||
|
||||
It may happen that this requirement contradicts the license
|
||||
restrictions of other proprietary libraries that do not normally
|
||||
accompany the operating system. Such a contradiction means you cannot
|
||||
use both them and the Library together in an executable that you
|
||||
distribute.
|
||||
|
||||
7. 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 not covered by this License, and distribute such a combined
|
||||
library, provided that the separate distribution of the work based on
|
||||
the Library and of the other library facilities is otherwise
|
||||
permitted, and provided that you do these two things:
|
||||
|
||||
a) Accompany the combined library with a copy of the same work
|
||||
based on the Library, uncombined with any other library
|
||||
facilities. This must be distributed under the terms of the
|
||||
Sections above.
|
||||
|
||||
b) Give prominent notice with the combined library of the fact
|
||||
that part of it is a work based on the Library, and explaining
|
||||
where to find the accompanying uncombined form of the same work.
|
||||
|
||||
8. You may not copy, modify, sublicense, link with, or distribute
|
||||
the Library except as expressly provided under this License. Any
|
||||
attempt otherwise to copy, modify, sublicense, link with, or
|
||||
distribute the Library is void, and will automatically terminate your
|
||||
rights under this License. However, parties who have received copies,
|
||||
or rights, from you under this License will not have their licenses
|
||||
terminated so long as such parties remain in full compliance.
|
||||
|
||||
9. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Library or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Library (or any work based on the
|
||||
Library), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Library or works based on it.
|
||||
|
||||
10. Each time you redistribute the Library (or any work based on the
|
||||
Library), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute, link with or modify the Library
|
||||
subject to these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties with
|
||||
this License.
|
||||
|
||||
11. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Library at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Library by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Library.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under any
|
||||
particular circumstance, the balance of the section is intended to apply,
|
||||
and the section as a whole is intended to apply in other circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
12. If the distribution and/or use of the Library is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Library under this License may add
|
||||
an explicit geographical distribution limitation excluding those countries,
|
||||
so that distribution is permitted only in or among countries not thus
|
||||
excluded. In such case, this License incorporates the limitation as if
|
||||
written in the body of this License.
|
||||
|
||||
13. The Free Software Foundation may publish revised and/or new
|
||||
versions of the 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
|
||||
specifies a version number of this License which applies to it and
|
||||
"any later version", you have the option of following the terms and
|
||||
conditions either of that version or of any later version published by
|
||||
the Free Software Foundation. If the Library does not specify a
|
||||
license version number, you may choose any version ever published by
|
||||
the Free Software Foundation.
|
||||
|
||||
14. If you wish to incorporate parts of the Library into other free
|
||||
programs whose distribution conditions are incompatible with these,
|
||||
write to the author to ask for permission. For software which is
|
||||
copyrighted by the Free Software Foundation, write to the Free
|
||||
Software Foundation; we sometimes make exceptions for this. Our
|
||||
decision will be guided by the two goals of preserving the free status
|
||||
of all derivatives of our free software and of promoting the sharing
|
||||
and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
|
||||
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
|
||||
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
|
||||
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
|
||||
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
|
||||
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
|
||||
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
|
||||
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
|
||||
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
|
||||
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
|
||||
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
|
||||
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
|
||||
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
|
||||
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
|
||||
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Libraries
|
||||
|
||||
If you develop a new library, and you want it to be of the greatest
|
||||
possible use to the public, we recommend making it free software that
|
||||
everyone can redistribute and change. You can do so by permitting
|
||||
redistribution under these terms (or, alternatively, under the terms of the
|
||||
ordinary General Public License).
|
||||
|
||||
To apply these terms, attach the following notices to the library. It is
|
||||
safest to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least the
|
||||
"copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the library's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
||||
USA
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the library, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the
|
||||
library `Frob' (a library for tweaking knobs) written by James Random
|
||||
Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1990
|
||||
Ty Coon, President of Vice
|
||||
|
||||
That's all there is to it!
|
|
@ -0,0 +1,20 @@
|
|||
[![ContentDB](https://content.minetest.net/packages/SwissalpS/deathmarkers/shields/downloads/)](https://content.minetest.net/packages/SwissalpS/deathmarkers/)
|
||||
# CSM Death Markers
|
||||
Minetest Client Side Mod that shows waypoints to where player has died.
|
||||
|
||||
The waypoints change colour and fade over time and are stored over sessions per player and server.
|
||||
|
||||
If the bones are punched, the waypoint is cleared. It is also cleared if the player stands in the bone position.
|
||||
Useful when other player has removed bones already, they didn't spawn at all or the items were removed without punching the node.
|
||||
|
||||
Based on https://gitlab.com/PeterNerlich/death_markers
|
||||
|
||||
## Installing the CSM
|
||||
Depending on your OS and build/install of Minetest the location is different. The folder you are looking for is called ``clientmods``.
|
||||
1. Inside the ``clientmods`` folder create one called something like ``deathMarkers``.
|
||||
2. Download and extract the mod files
|
||||
3. and move them into the folder you created in step 1.
|
||||
4. Turn on client side mods in your minetest settings. From the menu go to settings > all settings > client > enable_client_modding.
|
||||
5. Join or start a session and log back out. (This adds a line to mods.conf: ``load_mod_deathmarkers = false``)
|
||||
7. In ``clientmods/mods.conf`` change the line ``load_mod_deathmarkers = false`` to ``load_mod_deathmarkers = true``
|
||||
8. Join or start a session and enjoy
|
|
@ -0,0 +1,275 @@
|
|||
-- minetest CSM deathMarkers --
|
||||
-- 2021 by Luke aka SwissalpS --
|
||||
-- based on https://gitlab.com/PeterNerlich/death_markers --
|
||||
local UPDATE_INTERVAL = 3
|
||||
local WAYPOINT_SATURATION = 1
|
||||
local WAYPOINT_EXPIRES_SECONDS = 42 * 60
|
||||
|
||||
local iDeaths = 0
|
||||
local tDeaths = {}
|
||||
local sStoreID = ''
|
||||
local tColourCache = {}
|
||||
local bSkipClearOnVisit = false
|
||||
local oStore = core.get_mod_storage()
|
||||
|
||||
|
||||
-- by PeterNerlich
|
||||
local function interpolate(a, b, t) return t * (b - a) + a end
|
||||
|
||||
|
||||
-- by PeterNerlich
|
||||
local function currentColour(fT)
|
||||
|
||||
-- clamp t between 0 and 1, in steps of 0.01
|
||||
local iT = math.max(0, math.min(1, math.floor(fT * 100 + 0.5) / 100))
|
||||
|
||||
if nil == tColourCache[iT] then
|
||||
-- helper variables
|
||||
local iT2 = iT^2 -- t squared
|
||||
local iInvT = 1 - iT -- inverse t
|
||||
local iInvT2 = iInvT^2 -- inverse t squared
|
||||
|
||||
local iRed = iT2
|
||||
local iGreen = 2 * iT * iInvT
|
||||
local iBlue = iInvT2
|
||||
local iAverage = math.sqrt(iRed^2 + iGreen^2 + iBlue^2)
|
||||
|
||||
iRed = interpolate(iAverage, iRed, WAYPOINT_SATURATION)
|
||||
iGreen = interpolate(iAverage, iGreen, WAYPOINT_SATURATION)
|
||||
iBlue = interpolate(iAverage, iBlue, WAYPOINT_SATURATION)
|
||||
|
||||
local iWhiteStart = iInvT2^2
|
||||
local iDimming = 1 - iT^8
|
||||
|
||||
iRed = (iRed * (1 - iWhiteStart) + iWhiteStart) * iDimming
|
||||
iGreen = (iGreen * (1 - iWhiteStart) + iWhiteStart) * iDimming
|
||||
iBlue = (iBlue * (1 - iWhiteStart) + iWhiteStart) * iDimming
|
||||
|
||||
-- we have 255 steps per subpixel
|
||||
local iBase = 0xFF
|
||||
|
||||
-- clamp values, discard fractions
|
||||
iRed = math.floor(iBase * math.max(0, math.min(1, iRed)))
|
||||
iGreen = math.floor(iBase * math.max(0, math.min(1, iGreen)))
|
||||
iBlue = math.floor(iBase * math.max(0, math.min(1, iBlue)))
|
||||
|
||||
-- pack it into one number representing the RGB values
|
||||
tColourCache[iT] = iRed * 2^16 + iGreen * 2^8 + iBlue
|
||||
end
|
||||
|
||||
return tColourCache[iT]
|
||||
|
||||
end -- currentColour
|
||||
|
||||
|
||||
local function pos2string(tPos)
|
||||
|
||||
return tostring(math.floor(tPos.x)) .. ' | '
|
||||
.. tostring(math.floor(tPos.y)) .. ' | '
|
||||
.. tostring(math.floor(tPos.z))
|
||||
|
||||
end -- pos2string
|
||||
|
||||
|
||||
local function clearAll()
|
||||
|
||||
local oPlayer = core.localplayer
|
||||
|
||||
for sPos, tMarker in pairs(tDeaths) do
|
||||
|
||||
oPlayer:hud_remove(tMarker.id)
|
||||
tDeaths[sPos] = nil
|
||||
|
||||
end -- loop waypoints
|
||||
|
||||
end -- clearAll
|
||||
|
||||
|
||||
local function onFormInput(sFormName, _)
|
||||
|
||||
if 'bultin:death' ~= sFormName then return end
|
||||
|
||||
bSkipClearOnVisit = false
|
||||
|
||||
end -- onFormInput
|
||||
|
||||
|
||||
local function makeWaypoint(oPlayer, sPos, tPos)
|
||||
|
||||
return oPlayer:hud_add({
|
||||
hud_elem_type = 'waypoint',
|
||||
name = 'Bone #' .. tostring(iDeaths) .. ' ' .. sPos,
|
||||
text = 'm',
|
||||
precision = 3,
|
||||
number = 0xFF0000,
|
||||
world_pos = tPos,
|
||||
offset = { x = 0, y = 0},
|
||||
alignment = {x = 1, y = -1},
|
||||
})
|
||||
|
||||
end -- makeWaypoint
|
||||
|
||||
|
||||
local function onSave()
|
||||
|
||||
-- save shutdown time
|
||||
oStore:set_int(sStoreID .. 'shutdown', os.time())
|
||||
-- save death-count
|
||||
oStore:set_int(sStoreID .. 'deathCount', iDeaths)
|
||||
-- save table of waypoints
|
||||
oStore:set_string(sStoreID .. 'deaths', core.serialize(tDeaths))
|
||||
|
||||
--print('[deathMarkers saved marker DB]')
|
||||
|
||||
end -- onSave
|
||||
|
||||
|
||||
local function onDeath()
|
||||
|
||||
iDeaths = iDeaths + 1
|
||||
local oPlayer = core.localplayer
|
||||
|
||||
-- get player's position
|
||||
local tPos = oPlayer:get_pos()
|
||||
-- adjust position
|
||||
tPos.x = math.floor(tPos.x + 0.5)
|
||||
tPos.y = math.floor(tPos.y + 0.5)
|
||||
tPos.z = math.floor(tPos.z + 0.5)
|
||||
local sPos = pos2string(tPos)
|
||||
|
||||
-- make waypoint and add to table
|
||||
tDeaths[sPos] = {
|
||||
pos = tPos,
|
||||
ts = os.time(),
|
||||
id = makeWaypoint(oPlayer, sPos, tPos),
|
||||
}
|
||||
|
||||
-- mark player as dead
|
||||
bSkipClearOnVisit = true
|
||||
|
||||
onSave()
|
||||
|
||||
end -- onDeath
|
||||
|
||||
|
||||
local function onPunch(tPos, tNode)
|
||||
|
||||
if 'bones:bones' ~= tNode.name then return false end
|
||||
|
||||
local sPos = pos2string(tPos)
|
||||
|
||||
if tDeaths[sPos] then
|
||||
|
||||
-- player punched bones -> clear the waypoint
|
||||
core.localplayer:hud_remove(tDeaths[sPos].id)
|
||||
tDeaths[sPos] = nil
|
||||
|
||||
-- and save (in case our game crashes)
|
||||
onSave()
|
||||
|
||||
end
|
||||
|
||||
return false
|
||||
|
||||
end -- onPunch
|
||||
|
||||
|
||||
local function onUpdate()
|
||||
|
||||
core.after(UPDATE_INTERVAL, onUpdate)
|
||||
|
||||
local oPlayer = core.localplayer
|
||||
|
||||
local iNow = os.time()
|
||||
for sPos, tMarker in pairs(tDeaths) do
|
||||
|
||||
local fT = (iNow - tMarker.ts) / WAYPOINT_EXPIRES_SECONDS
|
||||
if 1 < fT then
|
||||
|
||||
-- waypoint has expired -> remove it
|
||||
oPlayer:hud_remove(tMarker.id)
|
||||
tDeaths[sPos] = nil
|
||||
|
||||
else
|
||||
|
||||
-- adjust colour
|
||||
oPlayer:hud_change(tMarker.id, 'number', currentColour(fT))
|
||||
|
||||
end
|
||||
|
||||
end -- loop waypoints
|
||||
|
||||
-- check if player has visited bones and clear marker
|
||||
-- skip clearing marker as player may still be dead at bones
|
||||
if bSkipClearOnVisit then return end
|
||||
|
||||
local tPos = oPlayer:get_pos()
|
||||
local sPos = pos2string(tPos)
|
||||
|
||||
if tDeaths[sPos] then
|
||||
|
||||
-- player is at bones -> clear the waypoint
|
||||
oPlayer:hud_remove(tDeaths[sPos].id)
|
||||
tDeaths[sPos] = nil
|
||||
|
||||
end
|
||||
|
||||
end -- onUpdate
|
||||
|
||||
|
||||
local function onInit()
|
||||
|
||||
local oPlayer = core.localplayer
|
||||
if not oPlayer then
|
||||
-- onInit was called to early, try again later
|
||||
core.after(1, onInit)
|
||||
return
|
||||
end
|
||||
|
||||
local oSI = core.get_server_info()
|
||||
sStoreID = oPlayer:get_name()
|
||||
-- in singleplayer mode the port changes
|
||||
if 'singleplayer' ~= sStoreID then
|
||||
sStoreID = sStoreID .. '-' .. oSI.ip .. ':' .. oSI.port
|
||||
end
|
||||
|
||||
-- read death-count
|
||||
iDeaths = oStore:get_int(sStoreID .. 'deathCount')
|
||||
-- get table of saved markers
|
||||
tDeaths = core.deserialize(oStore:get_string(sStoreID .. 'deaths')) or {}
|
||||
-- how long between sessions
|
||||
local iDiff = os.time() - oStore:get_int(sStoreID .. 'shutdown')
|
||||
|
||||
for sPos, tMarker in pairs(tDeaths) do
|
||||
|
||||
-- add inactive time passed between sessions to each marker
|
||||
tMarker.ts = tMarker.ts + iDiff
|
||||
-- re-create the waypoint
|
||||
tMarker.id = makeWaypoint(oPlayer, sPos, tMarker.pos)
|
||||
|
||||
end -- loop waypoints
|
||||
|
||||
core.after(UPDATE_INTERVAL, onUpdate)
|
||||
|
||||
print('[deathMarkers initialized]')
|
||||
|
||||
end -- onInit
|
||||
|
||||
|
||||
-- hook in to core shutdown callback to save markers and shutdown time
|
||||
core.register_on_shutdown(onSave)
|
||||
-- hook in to formspec signals to catch when 'you died' formspec is closed
|
||||
core.register_on_formspec_input(onFormInput)
|
||||
-- hook in to death event
|
||||
core.register_on_death(onDeath)
|
||||
-- hook in to check if our bone is being dug
|
||||
core.register_on_punchnode(onPunch)
|
||||
-- add chatcommand to clear all waypoints
|
||||
core.register_chatcommand('cadw', {
|
||||
description = 'Clears all death waypoints.',
|
||||
func = clearAll,
|
||||
params = '<none>',
|
||||
})
|
||||
|
||||
-- init delayed so core.localplayer exists
|
||||
core.after(1, onInit)
|
|
@ -0,0 +1,3 @@
|
|||
name = deathmarkers
|
||||
description = Shows waypoints to where player died. The waypoints change colour and fade over time.
|
||||
|
|
@ -0,0 +1,121 @@
|
|||
Creative Commons Legal Code
|
||||
|
||||
CC0 1.0 Universal
|
||||
|
||||
CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
|
||||
LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
|
||||
ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
|
||||
INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
|
||||
REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
|
||||
PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
|
||||
THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
|
||||
HEREUNDER.
|
||||
|
||||
Statement of Purpose
|
||||
|
||||
The laws of most jurisdictions throughout the world automatically confer
|
||||
exclusive Copyright and Related Rights (defined below) upon the creator
|
||||
and subsequent owner(s) (each and all, an "owner") of an original work of
|
||||
authorship and/or a database (each, a "Work").
|
||||
|
||||
Certain owners wish to permanently relinquish those rights to a Work for
|
||||
the purpose of contributing to a commons of creative, cultural and
|
||||
scientific works ("Commons") that the public can reliably and without fear
|
||||
of later claims of infringement build upon, modify, incorporate in other
|
||||
works, reuse and redistribute as freely as possible in any form whatsoever
|
||||
and for any purposes, including without limitation commercial purposes.
|
||||
These owners may contribute to the Commons to promote the ideal of a free
|
||||
culture and the further production of creative, cultural and scientific
|
||||
works, or to gain reputation or greater distribution for their Work in
|
||||
part through the use and efforts of others.
|
||||
|
||||
For these and/or other purposes and motivations, and without any
|
||||
expectation of additional consideration or compensation, the person
|
||||
associating CC0 with a Work (the "Affirmer"), to the extent that he or she
|
||||
is an owner of Copyright and Related Rights in the Work, voluntarily
|
||||
elects to apply CC0 to the Work and publicly distribute the Work under its
|
||||
terms, with knowledge of his or her Copyright and Related Rights in the
|
||||
Work and the meaning and intended legal effect of CC0 on those rights.
|
||||
|
||||
1. Copyright and Related Rights. A Work made available under CC0 may be
|
||||
protected by copyright and related or neighboring rights ("Copyright and
|
||||
Related Rights"). Copyright and Related Rights include, but are not
|
||||
limited to, the following:
|
||||
|
||||
i. the right to reproduce, adapt, distribute, perform, display,
|
||||
communicate, and translate a Work;
|
||||
ii. moral rights retained by the original author(s) and/or performer(s);
|
||||
iii. publicity and privacy rights pertaining to a person's image or
|
||||
likeness depicted in a Work;
|
||||
iv. rights protecting against unfair competition in regards to a Work,
|
||||
subject to the limitations in paragraph 4(a), below;
|
||||
v. rights protecting the extraction, dissemination, use and reuse of data
|
||||
in a Work;
|
||||
vi. database rights (such as those arising under Directive 96/9/EC of the
|
||||
European Parliament and of the Council of 11 March 1996 on the legal
|
||||
protection of databases, and under any national implementation
|
||||
thereof, including any amended or successor version of such
|
||||
directive); and
|
||||
vii. other similar, equivalent or corresponding rights throughout the
|
||||
world based on applicable law or treaty, and any national
|
||||
implementations thereof.
|
||||
|
||||
2. Waiver. To the greatest extent permitted by, but not in contravention
|
||||
of, applicable law, Affirmer hereby overtly, fully, permanently,
|
||||
irrevocably and unconditionally waives, abandons, and surrenders all of
|
||||
Affirmer's Copyright and Related Rights and associated claims and causes
|
||||
of action, whether now known or unknown (including existing as well as
|
||||
future claims and causes of action), in the Work (i) in all territories
|
||||
worldwide, (ii) for the maximum duration provided by applicable law or
|
||||
treaty (including future time extensions), (iii) in any current or future
|
||||
medium and for any number of copies, and (iv) for any purpose whatsoever,
|
||||
including without limitation commercial, advertising or promotional
|
||||
purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
|
||||
member of the public at large and to the detriment of Affirmer's heirs and
|
||||
successors, fully intending that such Waiver shall not be subject to
|
||||
revocation, rescission, cancellation, termination, or any other legal or
|
||||
equitable action to disrupt the quiet enjoyment of the Work by the public
|
||||
as contemplated by Affirmer's express Statement of Purpose.
|
||||
|
||||
3. Public License Fallback. Should any part of the Waiver for any reason
|
||||
be judged legally invalid or ineffective under applicable law, then the
|
||||
Waiver shall be preserved to the maximum extent permitted taking into
|
||||
account Affirmer's express Statement of Purpose. In addition, to the
|
||||
extent the Waiver is so judged Affirmer hereby grants to each affected
|
||||
person a royalty-free, non transferable, non sublicensable, non exclusive,
|
||||
irrevocable and unconditional license to exercise Affirmer's Copyright and
|
||||
Related Rights in the Work (i) in all territories worldwide, (ii) for the
|
||||
maximum duration provided by applicable law or treaty (including future
|
||||
time extensions), (iii) in any current or future medium and for any number
|
||||
of copies, and (iv) for any purpose whatsoever, including without
|
||||
limitation commercial, advertising or promotional purposes (the
|
||||
"License"). The License shall be deemed effective as of the date CC0 was
|
||||
applied by Affirmer to the Work. Should any part of the License for any
|
||||
reason be judged legally invalid or ineffective under applicable law, such
|
||||
partial invalidity or ineffectiveness shall not invalidate the remainder
|
||||
of the License, and in such case Affirmer hereby affirms that he or she
|
||||
will not (i) exercise any of his or her remaining Copyright and Related
|
||||
Rights in the Work or (ii) assert any associated claims and causes of
|
||||
action with respect to the Work, in either case contrary to Affirmer's
|
||||
express Statement of Purpose.
|
||||
|
||||
4. Limitations and Disclaimers.
|
||||
|
||||
a. No trademark or patent rights held by Affirmer are waived, abandoned,
|
||||
surrendered, licensed or otherwise affected by this document.
|
||||
b. Affirmer offers the Work as-is and makes no representations or
|
||||
warranties of any kind concerning the Work, express, implied,
|
||||
statutory or otherwise, including without limitation warranties of
|
||||
title, merchantability, fitness for a particular purpose, non
|
||||
infringement, or the absence of latent or other defects, accuracy, or
|
||||
the present or absence of errors, whether or not discoverable, all to
|
||||
the greatest extent permissible under applicable law.
|
||||
c. Affirmer disclaims responsibility for clearing rights of other persons
|
||||
that may apply to the Work or any use thereof, including without
|
||||
limitation any person's Copyright and Related Rights in the Work.
|
||||
Further, Affirmer disclaims responsibility for obtaining any necessary
|
||||
consents, permissions or other rights required for any use of the
|
||||
Work.
|
||||
d. Affirmer understands and acknowledges that Creative Commons is not a
|
||||
party to this document and has no duty or obligation with respect to
|
||||
this CC0 or use of the Work.
|
|
@ -0,0 +1,5 @@
|
|||
-- silence beacons when placed in a location that leaves no space to activate.
|
||||
core.register_on_receiving_chat_message(function(sMsg)
|
||||
return sMsg:sub(1, 47) == 'Not enough room to activate beacon pointing in '
|
||||
end)
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
name = silencebeacon
|
||||
description = CSM that silences beacon messages when placed in tight spot
|
|
@ -0,0 +1,187 @@
|
|||
---
|
||||
-- autominer
|
||||
|
||||
|
||||
autominer = {}
|
||||
local dmg=false
|
||||
local digging=false
|
||||
local radius=6
|
||||
|
||||
local nodes=nlist.get("autominer")
|
||||
|
||||
|
||||
local function sleep(n) -- seconds
|
||||
local t0 = os.clock()
|
||||
while os.clock() - t0 <= n do end
|
||||
end
|
||||
local function shuffle(tbl)
|
||||
for i = #tbl, 2, -1 do
|
||||
local j = math.random(i)
|
||||
tbl[i], tbl[j] = tbl[j], tbl[i]
|
||||
end
|
||||
return tbl
|
||||
end
|
||||
local function checklava(pos)
|
||||
local n=minetest.find_node_near(pos, 2, {'mcl_core:lava_source','mcl_core:lava_flowing'}, true)
|
||||
if n == nil then return false end
|
||||
return true
|
||||
end
|
||||
local function checkgravel(pos)
|
||||
local n=minetest.find_node_near(pos, 1, {'mcl_core:gravel','mcl_core:sand'}, true)
|
||||
if n == nil then return false end
|
||||
return true
|
||||
end
|
||||
|
||||
-- shamelessly stolen from dragonfire autotool
|
||||
local function check_tool(stack, node_groups, old_best_time)
|
||||
local toolcaps = stack:get_tool_capabilities()
|
||||
if not toolcaps then return end
|
||||
local best_time = old_best_time
|
||||
for group, groupdef in pairs(toolcaps.groupcaps) do
|
||||
local level = node_groups[group]
|
||||
if level then
|
||||
local this_time = groupdef.times[level]
|
||||
if this_time < best_time then
|
||||
best_time = this_time
|
||||
end
|
||||
end
|
||||
end
|
||||
return best_time < old_best_time, best_time
|
||||
end
|
||||
|
||||
local function amautotool(pos)
|
||||
local player = minetest.localplayer
|
||||
local inventory = minetest.get_inventory("current_player")
|
||||
local node=minetest.get_node_or_nil(pos)
|
||||
local node_groups = minetest.get_node_def(node.name).groups
|
||||
local new_index = player:get_wield_index()
|
||||
local is_better, best_time = false, math.huge
|
||||
is_better, best_time = check_tool(player:get_wielded_item(), node_groups, best_time)
|
||||
is_better, best_time = check_tool(inventory.hand[1], node_groups, best_time)
|
||||
for index, stack in pairs(inventory.main) do
|
||||
is_better, best_time = check_tool(stack, node_groups, best_time)
|
||||
if is_better then
|
||||
new_index = index
|
||||
end
|
||||
end
|
||||
player:set_wield_index(new_index)
|
||||
end
|
||||
|
||||
local function find_tnod()
|
||||
local pos = minetest.localplayer:get_pos()
|
||||
local rr = vector.add(pos,{x=0,y=0,z=radius})
|
||||
local pos1 = vector.add(pos,{x=radius,y=radius,z=radius})
|
||||
local pos2 = vector.add(pos,{x=-radius,y=-radius,z=-radius})
|
||||
local rt=shuffle(minetest.find_nodes_in_area(pos1, pos2, shuffle(nodes), true))
|
||||
for k,v in pairs(rt) do
|
||||
for kk,vv in pairs(shuffle(v)) do
|
||||
-- minetest.display_chat_message("Found nodes:" ..dump(rt))
|
||||
if ( vv.y > -57 ) and not checkgravel(vv) and not checklava(vv) then
|
||||
rr=vv
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
if (checkgravel(rr) or checklava(rr)) then return minetest.after(0.2,find_tnod) end
|
||||
return rr
|
||||
-- return rt
|
||||
end
|
||||
local function get_hnode()
|
||||
local ppos=minetest.localplayer:get_pos()
|
||||
local n=minetest.get_node_or_nil(vector.add(ppos,{x=0,y=1,z=0}))
|
||||
return n
|
||||
end
|
||||
local function dighead()
|
||||
if not minetest.localplayer then return end
|
||||
local ppos=vector.add(minetest.localplayer:get_pos(),{x=0,y=1,z=0})
|
||||
local n=get_hnode()
|
||||
if n==nil or n['name'] == 'air' then return end
|
||||
--amautotool(ppos)
|
||||
minetest.localplayer:set_wield_index(1)
|
||||
minetest.dig_node(ppos)
|
||||
minetest.dig_node(vector.add(ppos,{x=0,y=1,z=0}))
|
||||
digging=false
|
||||
if (minetest.settings:get_bool('aminer_active')) then
|
||||
local hp=minetest.localplayer:get_hp()
|
||||
local hn=get_hnode()
|
||||
if (hp > 17) then
|
||||
minetest.after(0.2,autominer.aminer )
|
||||
else
|
||||
minetest.display_chat_message("taken too much damage. wait.")
|
||||
local ppos=vector.add(minetest.localplayer:get_pos(),{x=0,y=1,z=0})
|
||||
minetest.dig_node(ppos)
|
||||
minetest.dig_node(vector.add(ppos,{x=0,y=1,z=0}))
|
||||
minetest.after(1.0,function() minetest.dig_node(vector.add(ppos,{x=0,y=0,z=0})) end )
|
||||
minetest.after(1.4,function() minetest.dig_node(vector.add(ppos,{x=0,y=1,z=0})) end )
|
||||
minetest.after(1.8,function() minetest.dig_node(vector.add(ppos,{x=0,y=0,z=0})) end )
|
||||
minetest.after(2.5,function() minetest.dig_node(vector.add(ppos,{x=0,y=1,z=0})) end )
|
||||
-- minetest.settings:set_bool("aminer_active",false)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function rwarp()
|
||||
if not (minetest.settings:get_bool("aminer_active")) then return end
|
||||
digging=true
|
||||
local nod=find_tnod()
|
||||
if not nod then
|
||||
minetest.display_chat_message('lava detected. stop.')
|
||||
return
|
||||
end
|
||||
minetest.localplayer:set_pos(vector.add(nod,{x=0.3,y=-1.2,z=0.3}))
|
||||
dighead()
|
||||
minetest.after(0.2, dighead)
|
||||
end
|
||||
|
||||
local function amine()
|
||||
minetest.after(1.0,rwarp)
|
||||
end
|
||||
function autominer.aminer()
|
||||
if not digging then
|
||||
digging=true
|
||||
dmg=hpchange.get_status()
|
||||
if dmg then
|
||||
minetest.after(3.0,rwarp)
|
||||
else
|
||||
minetest.after(0.5,rwarp)
|
||||
end
|
||||
end
|
||||
end
|
||||
local lastch=0
|
||||
minetest.register_globalstep(function()
|
||||
if os.time() < lastch + 5 then return end
|
||||
lastch=os.time()
|
||||
if ( minetest.settings:get_bool('aminer_active') ) then
|
||||
dmg=true
|
||||
digging=false
|
||||
autominer.aminer()
|
||||
end
|
||||
end)
|
||||
|
||||
minetest.register_chatcommand("aminer", {
|
||||
description = "",
|
||||
func = function()
|
||||
dmg=true
|
||||
digging=false
|
||||
minetest.settings:set_bool("aminer_active",true)
|
||||
autominer.aminer()
|
||||
end,
|
||||
})
|
||||
minetest.register_chatcommand("amine", {
|
||||
description = "",
|
||||
func = amine
|
||||
})
|
||||
minetest.register_chatcommand("dhe", {
|
||||
description = "",
|
||||
func = dighead
|
||||
})
|
||||
minetest.register_on_damage_taken(function(hp)
|
||||
dmg=true
|
||||
end)
|
||||
|
||||
|
||||
if (_G["minetest"]["register_cheat"] ~= nil) then
|
||||
minetest.register_cheat("Autominer (!!! ALPHA!! this will lead to you dying!!!)", "Player", "aminer_active")
|
||||
else
|
||||
minetest.settings:set_bool('aminer_active',true)
|
||||
end
|
|
@ -0,0 +1,3 @@
|
|||
name = autominer
|
||||
author = cora
|
||||
description = Mining bot
|
|
@ -0,0 +1 @@
|
|||
aminer_active (Enable Autominer) bool false
|
|
@ -0,0 +1,113 @@
|
|||
--
|
||||
-- coras Chat hacks
|
||||
-- * verify death messages
|
||||
-- * log chat to stdout
|
||||
|
||||
cchat = {}
|
||||
|
||||
-- verify death
|
||||
table.insert(minetest.registered_on_receiving_chat_message, 1, function(msg)
|
||||
local d = msg:find('\1b@mcl_death_messages\1b') --mineclone specific
|
||||
if d then
|
||||
-- minetest.send_chat_message("real.") --uncomment to publish approval
|
||||
minetest.display_chat_message("real.")
|
||||
end
|
||||
|
||||
end)
|
||||
|
||||
|
||||
-- chat logging
|
||||
local mod_name = minetest.get_current_modname()
|
||||
|
||||
local function log(level, message)
|
||||
minetest.log(level, ('[%s] %s'):format(mod_name, message))
|
||||
end
|
||||
|
||||
log('action', 'Chatlog loading...')
|
||||
|
||||
local LOG_LEVEL = 'action'
|
||||
|
||||
local server_info = minetest.get_server_info()
|
||||
local server_id = server_info.address .. ':' .. server_info.port
|
||||
local my_name = ''
|
||||
|
||||
local register_on_send = minetest.register_on_sending_chat_message or minetest.register_on_sending_chat_messages
|
||||
local register_on_receive = minetest.register_on_receiving_chat_message or minetest.register_on_receiving_chat_messages
|
||||
|
||||
|
||||
local function safe(func)
|
||||
-- wrap a function w/ logic to avoid crashing the game
|
||||
local f = function(...)
|
||||
local status, out = pcall(func, ...)
|
||||
if status then
|
||||
return out
|
||||
else
|
||||
log('warning', 'Error (func): ' .. out)
|
||||
return nil
|
||||
end
|
||||
end
|
||||
return f
|
||||
end
|
||||
|
||||
local set_my_name_tries = 0
|
||||
local function set_my_name()
|
||||
if minetest.localplayer then
|
||||
my_name = minetest.localplayer:get_name()
|
||||
elseif set_my_name_tries < 20 then
|
||||
set_my_name_tries = set_my_name_tries + 1
|
||||
minetest.after(1, set_my_name)
|
||||
else
|
||||
my_name = ''
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
local function loglastlogs()
|
||||
if not fren then return end
|
||||
for k,v in pairs(fren.friends) do
|
||||
if fren.on_server(fren.name_of(k)) then
|
||||
log("LASTLOGLOG START")
|
||||
--minetest.display_chat_message('Last login of friend ' .. fren.name_of(k))
|
||||
log("Last login of friend "..fren.name_of(k))
|
||||
minetest.send_chat_message("/last-login "..fren.name_of(k))
|
||||
end
|
||||
end
|
||||
for k,v in pairs(fren.enemies) do
|
||||
if fren.on_server(fren.name_of(k)) then
|
||||
log("Last login of enemy "..fren.name_of(k))
|
||||
--minetest.display_chat_message('Last login of friend ' .. fren.name_of(k))
|
||||
minetest.send_chat_message("/last-login "..fren.name_of(k))
|
||||
minetest.after("5.0",function() log("LASTLOGLOG END") end)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
--minetest.after("5.0",function() loglastlogs() end)
|
||||
|
||||
if minetest.register_on_connect then
|
||||
minetest.register_on_connect(set_my_name)
|
||||
elseif minetest.register_on_mods_loaded then
|
||||
minetest.register_on_mods_loaded(set_my_name)
|
||||
else
|
||||
minetest.after(1, set_my_name)
|
||||
end
|
||||
|
||||
|
||||
if register_on_send then
|
||||
register_on_send(safe(function(message)
|
||||
local msg = minetest.strip_colors(message)
|
||||
if msg ~= '' then
|
||||
log(LOG_LEVEL, ('%s@%s [sent] %s'):format(my_name, server_id, msg))
|
||||
end
|
||||
end))
|
||||
end
|
||||
|
||||
if register_on_receive then
|
||||
register_on_receive(safe(function(message)
|
||||
local msg = minetest.strip_colors(message)
|
||||
if msg ~= '' then
|
||||
log(LOG_LEVEL, ('%s@%s %s'):format(my_name, server_id, msg))
|
||||
end
|
||||
end))
|
||||
end
|
|
@ -0,0 +1,3 @@
|
|||
name = cchat
|
||||
author = cora
|
||||
description = cora's chat extensions, primarily log to stdout
|
|
@ -0,0 +1 @@
|
|||
Add a `chatbell_bell.ogg` to your sound pack.
|
|
@ -0,0 +1 @@
|
|||
csm_com?
|
|
@ -0,0 +1 @@
|
|||
Bell sounds on your name.
|
|
@ -0,0 +1,145 @@
|
|||
--[[
|
||||
.__ __ ___. .__ .__
|
||||
____ | |__ _____ _/ |\_ |__ ____ | | | |
|
||||
_/ ___\| | \\__ \\ __\ __ \_/ __ \| | | |
|
||||
\ \___| Y \/ __ \| | | \_\ \ ___/| |_| |__
|
||||
\___ >___| (____ /__| |___ /\___ >____/____/
|
||||
\/ \/ \/ \/ \/
|
||||
--]]
|
||||
|
||||
local load_time_start = os.clock()
|
||||
local modname = minetest.get_current_modname()
|
||||
|
||||
|
||||
local on = true
|
||||
local own_names = {}
|
||||
local blocked = {}
|
||||
|
||||
local function get_msg(msg)
|
||||
local name
|
||||
if msg:sub(1, 1) == "*" then -- /me
|
||||
local f = msg:find(" ", 3)
|
||||
if not f then
|
||||
return msg
|
||||
end
|
||||
local name = msg:sub(3, f-1)
|
||||
msg = msg:sub(f+1)
|
||||
elseif msg:sub(1, 8) == "PM from " then -- /msg
|
||||
local f = msg:find(":", 9)
|
||||
if not f then
|
||||
return msg
|
||||
end
|
||||
local name = msg:sub(9, f-1)
|
||||
msg = msg:sub(f+2)
|
||||
else -- normal chat
|
||||
if msg:sub(1, 1) ~= "<" then
|
||||
return msg
|
||||
end
|
||||
local f = msg:find(">")
|
||||
if not f then
|
||||
return msg
|
||||
end
|
||||
name = msg:sub(2, f-1)
|
||||
msg = msg:sub(f+2)
|
||||
end
|
||||
if blocked[name] or own_names[name] then
|
||||
return false
|
||||
end
|
||||
return msg
|
||||
end
|
||||
|
||||
local function is_special_char(c)
|
||||
local abc = "abcdefghijklmnopqrstuvwxyzüöäß"
|
||||
return (tonumber(c) or abc:find(c)) == nil
|
||||
end
|
||||
|
||||
--own_names[minetest.localplayer:get_name()] = true
|
||||
|
||||
minetest.register_on_receiving_chat_message(function(omsg)
|
||||
local msg = get_msg(omsg)
|
||||
if not msg then
|
||||
return
|
||||
end
|
||||
local lmsg = " "..msg:lower()
|
||||
local ok = false
|
||||
for own_name, b in pairs(own_names) do
|
||||
local loname = own_name:lower()
|
||||
for i = 1, #lmsg do
|
||||
local f
|
||||
f, i = lmsg:find(loname, i)
|
||||
if not f then
|
||||
break
|
||||
end
|
||||
if is_special_char(lmsg:sub(f-1, f-1)) and
|
||||
(is_special_char(lmsg:sub(i+1, i+1)) or i >= #lmsg) then
|
||||
ok = true
|
||||
break
|
||||
end
|
||||
end
|
||||
if ok then
|
||||
break
|
||||
end
|
||||
end
|
||||
if not ok then
|
||||
return
|
||||
end
|
||||
minetest.sound_play("chatbell_bell", {gain = 0.5})
|
||||
minetest.display_chat_message(minetest.colorize("#52DA2D", omsg))
|
||||
return true
|
||||
end)
|
||||
|
||||
minetest.register_chatcommand("chatbell", {
|
||||
params = "get | toggle | block <player> | name <nickname>",
|
||||
description = "Control the chatbell:n"..
|
||||
" toggle: Toggle the bell on/off. (Default)\n"..
|
||||
" block <player>: Block/unblock a specific player.",
|
||||
func = function(param)
|
||||
local cmd = param
|
||||
do
|
||||
local f = param:find(" ")
|
||||
if f then
|
||||
cmd = param:sub(1, f-1)
|
||||
param = param:sub(f+1)
|
||||
else
|
||||
param = ""
|
||||
end
|
||||
end
|
||||
cmd = cmd:lower()
|
||||
|
||||
if cmd == "toggle" or cmd == "" then
|
||||
on = not on
|
||||
return true, "Chatbell "..((on and "enabled") or "disabled").."."
|
||||
|
||||
elseif cmd == "block" then
|
||||
blocked[param] = not blocked[param]
|
||||
return true, param.." "..((blocked[param] and "") or "not ").."blocked."
|
||||
|
||||
elseif cmd == "name" then
|
||||
own_names[param] = not own_names[param] or nil
|
||||
return true, "Nickname "..param.." toggled "..
|
||||
(own_names[param] and "on" or "off").."."
|
||||
|
||||
elseif cmd == "get" then
|
||||
if not on then
|
||||
return true, "Chatbell is disabled."
|
||||
end
|
||||
local msg = "Blocked players: "..dump(blocked).."Names:"
|
||||
for name, b in pairs(own_names) do
|
||||
msg = msg.."\n"..name
|
||||
end
|
||||
return true, msg
|
||||
|
||||
else
|
||||
return false, "Invalid arguments."
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
|
||||
local time = math.floor(tonumber(os.clock()-load_time_start)*100+0.5)/100
|
||||
local msg = "["..modname.."] loaded after ca. "..time
|
||||
if time > 0.05 then
|
||||
print(msg)
|
||||
else
|
||||
minetest.log("info", msg)
|
||||
end
|
|
@ -0,0 +1 @@
|
|||
CC0
|
|
@ -0,0 +1 @@
|
|||
name = chatbell
|
|
@ -0,0 +1,21 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) 2018 random-geek
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
|
@ -0,0 +1,59 @@
|
|||
# chatcolor
|
||||
|
||||
[![](https://img.shields.io/badge/Minetest%20Forums-chatcolor-4E9A06)](https://forum.minetest.net/viewtopic.php?f=53&t=20345)
|
||||
|
||||
A Minetest client-side mod (CSM) which adds custom chat message coloring based on player name or message type.
|
||||
|
||||
## Features
|
||||
|
||||
* Colors chat messages, DMs, /me messages, and join/leave messages
|
||||
* Colors names in server status messages
|
||||
* Set any color for any name
|
||||
* Set default colors for each type of message
|
||||
* Use either chat commands or GUI
|
||||
|
||||
## How to Use
|
||||
|
||||
### Installation
|
||||
|
||||
See [this great forum post](https://forum.minetest.net/viewtopic.php?f=53&t=17830) on how to install CSMs.
|
||||
|
||||
### Colors
|
||||
|
||||
Colors can be either a hex color (such as `#00FF00`) or a HTML color name (such as `plum`).
|
||||
|
||||
For a full list of HTML colors, see [this page](https://html-color-codes.info/color-names/).
|
||||
|
||||
### `.colors`
|
||||
|
||||
Displays a GUI for modifying colors.
|
||||
|
||||
### `.setcolor <name> <color>`
|
||||
|
||||
Color messages from player `<name>` as `<color>`. To set a default for a certain type of message, use the names `default_chat`, `default_dm`, etc. (see `.colors` for a full list).
|
||||
|
||||
Examples:
|
||||
|
||||
`.setcolor lizzy123 #00FFFF`
|
||||
|
||||
`.setcolor default_me grey`
|
||||
|
||||
### `.delcolor <name>`
|
||||
|
||||
Delete a color setting for a player. Their messages will then appear in a default color.
|
||||
|
||||
Examples:
|
||||
|
||||
`.delcolor joe15`
|
||||
|
||||
### `.listcolors`
|
||||
|
||||
Shows a list of all player and default colors in chat.
|
||||
|
||||
## Screenshots
|
||||
|
||||
![Colored names in chat](https://github.com/random-geek/Chat-color/blob/master/screenshots/Capture20.PNG "Colored names in chat")
|
||||
|
||||
![Main GUI](https://github.com/random-geek/Chat-color/blob/master/screenshots/Capture21.PNG "Main GUI")
|
||||
|
||||
![Modification view](https://github.com/random-geek/Chat-color/blob/master/screenshots/Capture22.PNG "Modification view")
|
|
@ -0,0 +1,301 @@
|
|||
-- random-geek's colored chat CSM
|
||||
|
||||
local MESSAGE_TYPES = {"chat", "me", "join", "leave", "dm"}
|
||||
local DEFAULT_COLOR = "#FFFFFF"
|
||||
|
||||
local data = minetest.get_mod_storage()
|
||||
local guiRow = 1 -- Which row in the GUI is selected
|
||||
|
||||
-- Make sure all our defaults are in place.
|
||||
for _, type in ipairs(MESSAGE_TYPES) do
|
||||
local key = "default_" .. type
|
||||
if data:get_string(key) == "" then
|
||||
data:set_string(key, DEFAULT_COLOR)
|
||||
end
|
||||
end
|
||||
|
||||
-- Removes Minetest \x1b escape sequences (colors, translations) from a string.
|
||||
--
|
||||
-- This may give wrong output for malformed strings or backslash-escaped right
|
||||
-- parentheses within an escape string. See unescape_enriched() in
|
||||
-- minetest/src/util/string.h for a correct implementation.
|
||||
local function remove_escapes(str)
|
||||
-- Remove \x1b followed by anything in parentheses
|
||||
str = string.gsub(str, "\x1b%(.-%)", "")
|
||||
-- Remove \x1b followed by a single character
|
||||
str = string.gsub(str, "\x1b.", "")
|
||||
return str
|
||||
end
|
||||
|
||||
-- Test remove_escapes()
|
||||
-- assert(remove_escapes("\x1b\xb1(Escapes\x1b() are\x1bE cool!\x1b(T@__Az-1\\\\))") == "(Escapes are cool!)")
|
||||
|
||||
-- Find the type and source of a chat message.
|
||||
local function message_info(richMsg)
|
||||
-- Strip any translation data to get a plaintext English message.
|
||||
local msg = remove_escapes(richMsg)
|
||||
local type, name
|
||||
|
||||
if string.sub(msg, 1, 1) == "<" then -- Normal chat messages (<player> message)
|
||||
type = "chat"
|
||||
name = string.match(msg, "^<([1-9A-Za-z-_]+)> ")
|
||||
elseif string.sub(msg, 1, 2) == "* " then -- /me messages (* player message)
|
||||
type = "me"
|
||||
name = string.match(msg, "^%* ([1-9A-Za-z-_]+) ")
|
||||
elseif string.sub(msg, 1, 4) == "*** " then -- Join/leave messages (*** player joined/left the game.)
|
||||
local tempName, typeStr = string.match(msg, "^%*%*%* ([1-9A-Za-z-_]+) (%a+)")
|
||||
name = tempName
|
||||
if typeStr == "joined" then
|
||||
type = "join"
|
||||
elseif typeStr == "left" then
|
||||
type = "leave"
|
||||
end
|
||||
elseif string.sub(msg, 1, 8) == "DM from " then -- Direct messages (DM from player: message)
|
||||
type = "dm"
|
||||
-- PM was switched to DM in Minetest 5.1.0, this supports both.
|
||||
name = string.match(msg, "^DM from ([1-9A-Za-z-_]+): ")
|
||||
end
|
||||
|
||||
-- Note: either may be nil.
|
||||
if type and name then
|
||||
return {type = type, name = name}
|
||||
end
|
||||
-- Unrecognized message types will return nil.
|
||||
end
|
||||
|
||||
local function table_contains(tab, target)
|
||||
for _, val in ipairs(tab) do
|
||||
if val == target then
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
-- Set player/default color.
|
||||
-- name: player name or default_something
|
||||
-- color: HTML string, hex color ('#' will be prepended if necessary), or nil to delete entry.
|
||||
local function set_color(name, color)
|
||||
if not name or name == "" then
|
||||
minetest.display_chat_message("Player or setting name required.")
|
||||
return
|
||||
elseif not string.match(name, "^[1-9A-Za-z-_]+$") then
|
||||
minetest.display_chat_message(string.format("Invalid player or setting name '%s'.", name))
|
||||
return
|
||||
elseif color == "" then
|
||||
minetest.display_chat_message("Color (hex color or color name) required.")
|
||||
return
|
||||
end
|
||||
|
||||
local key
|
||||
if string.sub(name, 1, 8) == "default_" then
|
||||
if not table_contains(MESSAGE_TYPES, string.sub(name, 9)) then
|
||||
minetest.display_chat_message(string.format("No setting called '%s'.", name))
|
||||
return
|
||||
end
|
||||
|
||||
if not color then
|
||||
minetest.display_chat_message("Cannot delete defaults!")
|
||||
return
|
||||
end
|
||||
key = name
|
||||
else
|
||||
-- Note: Commands/GUI omit the player prefix.
|
||||
key = "player_" .. name
|
||||
end
|
||||
|
||||
-- Check color if it exists.
|
||||
if color then
|
||||
-- Prepend '#' to hex colors if necessary.
|
||||
local newColor = color
|
||||
if tonumber(newColor, 16) then
|
||||
newColor = "#" .. newColor
|
||||
end
|
||||
|
||||
if not minetest.colorspec_to_colorstring(newColor) then
|
||||
minetest.display_chat_message(string.format("Invalid color name '%s'.", color))
|
||||
return
|
||||
end
|
||||
|
||||
data:set_string(key, newColor)
|
||||
minetest.display_chat_message(
|
||||
string.format("Set color for %s to %s.", name, minetest.colorize(newColor, newColor))
|
||||
)
|
||||
else -- Delete player color entry
|
||||
data:set_string(key, "")
|
||||
minetest.display_chat_message(string.format("Deleted color for %s.", name))
|
||||
end
|
||||
end
|
||||
|
||||
-- Return a nicely sorted array of {name, color} pairs.
|
||||
local function get_list()
|
||||
local list = data:to_table().fields
|
||||
local arr = {}
|
||||
|
||||
-- List players, excluding player_ prefix.
|
||||
for key, color in pairs(list) do
|
||||
if string.sub(key, 1, 7) == "player_" then
|
||||
local name = string.sub(key, 8)
|
||||
arr[#arr + 1] = {name, color}
|
||||
end
|
||||
end
|
||||
|
||||
-- Sort alphabetically.
|
||||
table.sort(
|
||||
arr,
|
||||
function(a, b)
|
||||
return a[1] < b[1]
|
||||
end
|
||||
)
|
||||
|
||||
-- List defaults at end
|
||||
for _, type in ipairs(MESSAGE_TYPES) do
|
||||
local key = "default_" .. type
|
||||
local color = list[key]
|
||||
arr[#arr + 1] = {key, color}
|
||||
end
|
||||
|
||||
return arr
|
||||
end
|
||||
|
||||
local function get_formspec(modify, defaultPlayer, defaultColor)
|
||||
if not modify then -- Fetch main screen
|
||||
local list = get_list()
|
||||
|
||||
-- Convert list to formspec-friendly format
|
||||
local tableRows = {}
|
||||
for _, row in ipairs(list) do
|
||||
tableRows[#tableRows + 1] = row[1] .. "," .. row[2] .. "," .. row[2]
|
||||
end
|
||||
local tableString = table.concat(tableRows, ",")
|
||||
|
||||
return [[
|
||||
formspec_version[5]
|
||||
size[8,9]
|
||||
label[0.5,0.6;Colored Chat]
|
||||
button[0.5,1;2.1,0.8;main_modify;Modify...]
|
||||
button[2.9,1;2.2,0.8;main_delete;Delete]
|
||||
button[5.4,1;2.1,0.8;main_add;Add...]
|
||||
tablecolumns[text;color;text]
|
||||
table[0.5,2.1;7,5.3;main_table;]] .. tableString .. [[;]] .. guiRow .. [[]
|
||||
button_exit[0.5,7.7;2.1,0.8;exit;Exit]
|
||||
tooltip[main_modify;Change the color for the selected element]
|
||||
tooltip[main_delete;Delete the selected element]
|
||||
tooltip[main_add;Add a color definition]
|
||||
]]
|
||||
else -- Fetch modify screen
|
||||
return [[
|
||||
formspec_version[5]
|
||||
size[8,3.2]
|
||||
field[0.5,0.8;3.4,0.8;mod_player;Player;]] .. defaultPlayer .. [[]
|
||||
field[4.1,0.8;3.4,0.8;mod_color;HTML/hex color;]] .. defaultColor .. [[]
|
||||
button[5,1.9;2.5,0.8;mod_set;Set]
|
||||
button[0.5,1.9;2.5,0.8;mod_cancel;Cancel]
|
||||
]]
|
||||
end
|
||||
end
|
||||
|
||||
minetest.register_on_formspec_input(function(formname, fields)
|
||||
-- Ignore potential formspecs from other mods.
|
||||
if string.sub(formname, 1, 10) ~= "chatcolor:" then
|
||||
return
|
||||
end
|
||||
|
||||
-- Update the selected row index if needed.
|
||||
if fields.main_table then
|
||||
local event = minetest.explode_table_event(fields.main_table)
|
||||
if event.type == "CHG" or event.type == "DCL" then
|
||||
guiRow = event.row
|
||||
end
|
||||
end
|
||||
|
||||
if fields.main_delete then
|
||||
local list = get_list()
|
||||
local key = list[guiRow][1]
|
||||
set_color(key, nil)
|
||||
minetest.show_formspec("chatcolor:maingui", get_formspec())
|
||||
elseif fields.main_modify then
|
||||
local row = get_list()[guiRow]
|
||||
-- Get formspec and send selected name to modify screen
|
||||
minetest.show_formspec("chatcolor:modify", get_formspec(true, row[1], row[2]))
|
||||
elseif fields.main_add then
|
||||
minetest.show_formspec("chatcolor:modify", get_formspec(true, "", ""))
|
||||
elseif (fields.mod_set or fields.key_enter) and fields.mod_player and fields.mod_color then
|
||||
set_color(fields.mod_player, fields.mod_color)
|
||||
minetest.show_formspec("chatcolor:maingui", get_formspec())
|
||||
elseif fields.mod_cancel then
|
||||
minetest.show_formspec("chatcolor:maingui", get_formspec())
|
||||
end
|
||||
end)
|
||||
|
||||
minetest.register_chatcommand("colors", {
|
||||
params = "",
|
||||
description = "Display colored chat GUI.",
|
||||
func = function(param)
|
||||
guiRow = 1 -- Select first row of table
|
||||
minetest.show_formspec("chatcolor:maingui", get_formspec())
|
||||
end
|
||||
})
|
||||
|
||||
minetest.register_chatcommand("setcolor", { -- Assign a color to chat messages from a specific person
|
||||
params = "<name> <color>",
|
||||
description = "Colorize a specified player's chat messages.",
|
||||
func = function(param)
|
||||
local args = string.split(param, " ")
|
||||
-- If color is empty, pass an empty string to avoid deleting the entry.
|
||||
set_color(args[1], args[2] or "")
|
||||
end
|
||||
})
|
||||
|
||||
minetest.register_chatcommand("delcolor", {
|
||||
params = "<name>",
|
||||
description = "Set a specified player's chat messages to the default color.",
|
||||
func = function(param)
|
||||
set_color(param, nil)
|
||||
end
|
||||
})
|
||||
|
||||
minetest.register_chatcommand("listcolors", {
|
||||
params = "",
|
||||
description = "List player/color pairs.",
|
||||
func = function(param)
|
||||
local list = get_list()
|
||||
for _, row in ipairs(list) do
|
||||
minetest.display_chat_message(row[1] .. ", " .. minetest.colorize(row[2], row[2]))
|
||||
end
|
||||
end
|
||||
})
|
||||
|
||||
-- I don't remember if or why `register_on_mods_loaded` was necessary.
|
||||
minetest.register_on_mods_loaded(function()
|
||||
minetest.register_on_receiving_chat_message(function(message)
|
||||
local plain = minetest.strip_colors(message)
|
||||
local info = message_info(plain)
|
||||
|
||||
if info then -- Normal chat/me/join messages
|
||||
local color = data:get_string("player_" .. info.name)
|
||||
if color == "" then -- If no color, set to default
|
||||
color = data:get_string("default_" .. info.type)
|
||||
end
|
||||
|
||||
local colorized = minetest.colorize(color, plain)
|
||||
minetest.display_chat_message(colorized)
|
||||
return true -- Override the original chat
|
||||
elseif string.sub(plain, 1, 2) == "# " then -- /status message
|
||||
local colorized = plain
|
||||
|
||||
local list = data:to_table().fields
|
||||
for key, color in pairs(list) do
|
||||
if string.sub(key, 1, 7) == "player_" then
|
||||
local playerName = string.sub(key, 8)
|
||||
-- Replace plain name with colored version
|
||||
colorized = string.gsub(colorized, playerName, minetest.colorize(color, playerName))
|
||||
end
|
||||
end
|
||||
|
||||
minetest.display_chat_message(colorized)
|
||||
return true -- Override the original chat
|
||||
end
|
||||
end)
|
||||
end)
|
|
@ -0,0 +1,2 @@
|
|||
name = chatcolor
|
||||
description = Adds custom coloring of chat messages based on player or message type.
|
Binary file not shown.
After Width: | Height: | Size: 215 KiB |
Binary file not shown.
After Width: | Height: | Size: 57 KiB |
Binary file not shown.
After Width: | Height: | Size: 17 KiB |
|
@ -0,0 +1,16 @@
|
|||
# df-mod-chatstuff
|
||||
A DragonFire CSM that add's chat stuff. (Don't mistake this for the chateffects csm).
|
||||
|
||||
# Commands
|
||||
1) .bye This will send a chat message to everyone with the text out of the variable $autobye_message.
|
||||
|
||||
# Settings
|
||||
1) autohi_message Message that's send when joining a server
|
||||
2) autobye_message Message that's send when using .bye command
|
||||
|
||||
# Cheat-Menu entrys
|
||||
1) AutoHi
|
||||
|
||||
# Contributors
|
||||
1) @j45 For designing the original idea
|
||||
2) @Code-Sploit For desiging code
|
|
@ -0,0 +1,42 @@
|
|||
-- Some settings
|
||||
|
||||
function init_settings(T)
|
||||
for key, value in pairs(T) do
|
||||
if minetest.settings:get(key) == nil then
|
||||
if type(value) == "boolean" then
|
||||
minetest.settings:set_bool(key, value)
|
||||
else
|
||||
minetest.settings:set(key, value)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
init_settings({
|
||||
autobye_message = "I gotta go, have fun!"
|
||||
})
|
||||
|
||||
-- Function to say the message
|
||||
|
||||
function disconnect()
|
||||
minetest.disconnect()
|
||||
end
|
||||
|
||||
function bye()
|
||||
if type(minetest.settings:get("autobye_message")) ~= "string" or minetest.settings:get("autobye_message") == nil then return end
|
||||
|
||||
local message = minetest.settings:get("autobye_message")
|
||||
|
||||
minetest.send_chat_message(message)
|
||||
disconnect()
|
||||
end
|
||||
|
||||
-- Register section
|
||||
|
||||
minetest.register_chatcommand("bye", {
|
||||
description = "Send's the configured autobye message and exits to mainmenu",
|
||||
|
||||
func = function()
|
||||
bye()
|
||||
end
|
||||
})
|
|
@ -0,0 +1,48 @@
|
|||
-- Some settings
|
||||
|
||||
function init_settings(T)
|
||||
for key, value in pairs(T) do
|
||||
if minetest.settings:get(key) == nil then
|
||||
if type(value) == "boolean" then
|
||||
minetest.settings:set_bool(key, value)
|
||||
else
|
||||
minetest.settings:set(key, value)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
init_settings({
|
||||
autohi_message = "Hi"
|
||||
})
|
||||
|
||||
-- Function to say the message
|
||||
|
||||
function check()
|
||||
if not minetest.localplayer then
|
||||
minetest.after(0, check)
|
||||
return false
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
function say()
|
||||
-- Check if you are in a game
|
||||
if check() ~= true then return end
|
||||
|
||||
-- Check if autohi is enabled
|
||||
if not minetest.settings:get_bool("autohi") then return end
|
||||
|
||||
if type(minetest.settings:get("autohi_message")) ~= "string" or minetest.settings:get("autohi_message") == nil then return end
|
||||
|
||||
local message = minetest.settings:get("autohi_message")
|
||||
|
||||
minetest.send_chat_message(message)
|
||||
end
|
||||
|
||||
-- Register section
|
||||
|
||||
minetest.after(0, say)
|
||||
|
||||
minetest.register_cheat("AutoHi", "Chat", "autohi")
|
|
@ -0,0 +1,8 @@
|
|||
-- Get the modpath of current csm
|
||||
|
||||
local modpath = minetest.get_modpath("chatstuff")
|
||||
|
||||
-- Execute the files
|
||||
|
||||
dofile(modpath .. "autobye.lua")
|
||||
dofile(modpath .. "autohi.lua")
|
|
@ -0,0 +1,3 @@
|
|||
name = chatstuff
|
||||
description = Add's chat stuff
|
||||
author = Code-Sploit
|
|
@ -0,0 +1,2 @@
|
|||
autohi_message (Message to auto-send when joining a server) string Hi
|
||||
autobye_message (Message to auto-send when using .bye chatcommand) string I gotta go, have fun!
|
|
@ -0,0 +1,21 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) 2018 red-001
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
|
@ -0,0 +1,5 @@
|
|||
# colour_chat
|
||||
A minetest CSM mod for changing the colour of text sent to the server.
|
||||
|
||||
### Usage
|
||||
Use .set_colour to set the colour of chat sent to the server, you can use either HTML named colours or HTML hexdecimal colour codes. Use .rainbow to generate rainbow text
|
|
@ -0,0 +1,121 @@
|
|||
local modstorage = core.get_mod_storage()
|
||||
|
||||
local register_on_message = core.register_on_sending_chat_message
|
||||
if core.register_on_sending_chat_messages then
|
||||
register_on_message = core.register_on_sending_chat_messages
|
||||
end
|
||||
|
||||
local function rgb_to_hex(rgb)
|
||||
local hexadecimal = '#'
|
||||
|
||||
for key, value in pairs(rgb) do
|
||||
local hex = ''
|
||||
|
||||
while(value > 0)do
|
||||
local index = math.fmod(value, 16) + 1
|
||||
value = math.floor(value / 16)
|
||||
hex = string.sub('0123456789ABCDEF', index, index) .. hex
|
||||
end
|
||||
|
||||
if(string.len(hex) == 0)then
|
||||
hex = '00'
|
||||
|
||||
elseif(string.len(hex) == 1)then
|
||||
hex = '0' .. hex
|
||||
end
|
||||
|
||||
hexadecimal = hexadecimal .. hex
|
||||
end
|
||||
|
||||
return hexadecimal
|
||||
end
|
||||
|
||||
local function color_from_hue(hue)
|
||||
local h = hue / 60
|
||||
local c = 255
|
||||
local x = (1 - math.abs(h%2 - 1)) * 255
|
||||
|
||||
local i = math.floor(h);
|
||||
if (i == 0) then
|
||||
return rgb_to_hex({c, x, 0})
|
||||
elseif (i == 1) then
|
||||
return rgb_to_hex({x, c, 0})
|
||||
elseif (i == 2) then
|
||||
return rgb_to_hex({0, c, x})
|
||||
elseif (i == 3) then
|
||||
return rgb_to_hex({0, x, c});
|
||||
elseif (i == 4) then
|
||||
return rgb_to_hex({x, 0, c});
|
||||
else
|
||||
return rgb_to_hex({c, 0, x});
|
||||
end
|
||||
end
|
||||
|
||||
local function canTalk()
|
||||
if core.get_privilege_list then
|
||||
return core.get_privilege_list().shout
|
||||
else
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
local function say(message)
|
||||
if not canTalk() then
|
||||
minetest.display_chat_message("You need 'shout' in order to talk")
|
||||
return
|
||||
end
|
||||
minetest.send_chat_message(message)
|
||||
if minetest.get_server_info().protocol_version < 29 then
|
||||
local name = minetest.localplayer:get_name()
|
||||
minetest.display_chat_message("<"..name.."> " .. message)
|
||||
end
|
||||
end
|
||||
|
||||
register_on_message(function(message)
|
||||
if message:sub(1,1) == "/" or modstorage:get_string("colour") == "" or modstorage:get_string("colour") == "white" then
|
||||
return false
|
||||
end
|
||||
|
||||
say(core.get_color_escape_sequence(modstorage:get_string("colour")) .. message)
|
||||
return true
|
||||
end)
|
||||
|
||||
core.register_chatcommand("set_colour", {
|
||||
description = core.gettext("Change chat colour"),
|
||||
func = function(colour)
|
||||
modstorage:set_string("colour", colour)
|
||||
return true, "Chat colour changed."
|
||||
end,
|
||||
})
|
||||
|
||||
core.register_chatcommand("rainbow", {
|
||||
description = core.gettext("rainbow text"),
|
||||
func = function(param)
|
||||
if not canTalk() then
|
||||
return false, "You need 'shout' in order to use this command"
|
||||
end
|
||||
local step = 360 / param:len()
|
||||
local hue = 0
|
||||
-- iterate the whole 360 degrees
|
||||
local output = ""
|
||||
for i = 1, param:len() do
|
||||
local char = param:sub(i,i)
|
||||
if char:match("%s") then
|
||||
output = output .. char
|
||||
else
|
||||
output = output .. core.get_color_escape_sequence(color_from_hue(hue)) .. char
|
||||
end
|
||||
hue = hue + step
|
||||
end
|
||||
say(output)
|
||||
return true
|
||||
end,
|
||||
})
|
||||
|
||||
core.register_chatcommand("say", {
|
||||
description = core.gettext("Send text without applying colour to it"),
|
||||
func = function(text)
|
||||
say(text)
|
||||
return true
|
||||
end,
|
||||
})
|
|
@ -0,0 +1,504 @@
|
|||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
Version 2.1, February 1999
|
||||
|
||||
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
(This is the first released version of the Lesser GPL. It also counts
|
||||
as the successor of the GNU Library Public License, version 2, hence
|
||||
the version number 2.1.)
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
Licenses are intended to guarantee your freedom to share and change
|
||||
free software--to make sure the software is free for all its users.
|
||||
|
||||
This license, the Lesser General Public License, applies to some
|
||||
specially designated software packages--typically libraries--of the
|
||||
Free Software Foundation and other authors who decide to use it. You
|
||||
can use it too, but we suggest you first think carefully about whether
|
||||
this license or the ordinary General Public License is the better
|
||||
strategy to use in any particular case, based on the explanations below.
|
||||
|
||||
When we speak of free software, we are referring to freedom of use,
|
||||
not price. Our General Public Licenses are designed to make sure that
|
||||
you have the freedom to distribute copies of free software (and charge
|
||||
for this service if you wish); that you receive source code or can get
|
||||
it if you want it; that you can change the software and use pieces of
|
||||
it in new free programs; and that you are informed that you can do
|
||||
these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
distributors to deny you these rights or to ask you to surrender these
|
||||
rights. These restrictions translate to certain responsibilities for
|
||||
you if you distribute copies of the library or if you modify it.
|
||||
|
||||
For example, if you distribute copies of the library, whether gratis
|
||||
or for a fee, you must give the recipients all the rights that we gave
|
||||
you. You must make sure that they, too, receive or can get the source
|
||||
code. If you link other code with the library, you must provide
|
||||
complete object files to the recipients, so that they can relink them
|
||||
with the library after making changes to the library and recompiling
|
||||
it. And you must show them these terms so they know their rights.
|
||||
|
||||
We protect your rights with a two-step method: (1) we copyright the
|
||||
library, and (2) we offer you this license, which gives you legal
|
||||
permission to copy, distribute and/or modify the library.
|
||||
|
||||
To protect each distributor, we want to make it very clear that
|
||||
there is no warranty for the free library. Also, if the library is
|
||||
modified by someone else and passed on, the recipients should know
|
||||
that what they have is not the original version, so that the original
|
||||
author's reputation will not be affected by problems that might be
|
||||
introduced by others.
|
||||
|
||||
Finally, software patents pose a constant threat to the existence of
|
||||
any free program. We wish to make sure that a company cannot
|
||||
effectively restrict the users of a free program by obtaining a
|
||||
restrictive license from a patent holder. Therefore, we insist that
|
||||
any patent license obtained for a version of the library must be
|
||||
consistent with the full freedom of use specified in this license.
|
||||
|
||||
Most GNU software, including some libraries, is covered by the
|
||||
ordinary GNU General Public License. This license, the GNU Lesser
|
||||
General Public License, applies to certain designated libraries, and
|
||||
is quite different from the ordinary General Public License. We use
|
||||
this license for certain libraries in order to permit linking those
|
||||
libraries into non-free programs.
|
||||
|
||||
When a program is linked with a library, whether statically or using
|
||||
a shared library, the combination of the two is legally speaking a
|
||||
combined work, a derivative of the original library. The ordinary
|
||||
General Public License therefore permits such linking only if the
|
||||
entire combination fits its criteria of freedom. The Lesser General
|
||||
Public License permits more lax criteria for linking other code with
|
||||
the library.
|
||||
|
||||
We call this license the "Lesser" General Public License because it
|
||||
does Less to protect the user's freedom than the ordinary General
|
||||
Public License. It also provides other free software developers Less
|
||||
of an advantage over competing non-free programs. These disadvantages
|
||||
are the reason we use the ordinary General Public License for many
|
||||
libraries. However, the Lesser license provides advantages in certain
|
||||
special circumstances.
|
||||
|
||||
For example, on rare occasions, there may be a special need to
|
||||
encourage the widest possible use of a certain library, so that it becomes
|
||||
a de-facto standard. To achieve this, non-free programs must be
|
||||
allowed to use the library. A more frequent case is that a free
|
||||
library does the same job as widely used non-free libraries. In this
|
||||
case, there is little to gain by limiting the free library to free
|
||||
software only, so we use the Lesser General Public License.
|
||||
|
||||
In other cases, permission to use a particular library in non-free
|
||||
programs enables a greater number of people to use a large body of
|
||||
free software. For example, permission to use the GNU C Library in
|
||||
non-free programs enables many more people to use the whole GNU
|
||||
operating system, as well as its variant, the GNU/Linux operating
|
||||
system.
|
||||
|
||||
Although the Lesser General Public License is Less protective of the
|
||||
users' freedom, it does ensure that the user of a program that is
|
||||
linked with the Library has the freedom and the wherewithal to run
|
||||
that program using a modified version of the Library.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow. Pay close attention to the difference between a
|
||||
"work based on the library" and a "work that uses the library". The
|
||||
former contains code derived from the library, whereas the latter must
|
||||
be combined with the library in order to run.
|
||||
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License Agreement applies to any software library or other
|
||||
program which contains a notice placed by the copyright holder or
|
||||
other authorized party saying it may be distributed under the terms of
|
||||
this Lesser General Public License (also called "this License").
|
||||
Each licensee is addressed as "you".
|
||||
|
||||
A "library" means a collection of software functions and/or data
|
||||
prepared so as to be conveniently linked with application programs
|
||||
(which use some of those functions and data) to form executables.
|
||||
|
||||
The "Library", below, refers to any such software library or work
|
||||
which has been distributed under these terms. A "work based on the
|
||||
Library" means either the Library or any derivative work under
|
||||
copyright law: that is to say, a work containing the Library or a
|
||||
portion of it, either verbatim or with modifications and/or translated
|
||||
straightforwardly into another language. (Hereinafter, translation is
|
||||
included without limitation in the term "modification".)
|
||||
|
||||
"Source code" for a work means the preferred form of the work for
|
||||
making modifications to it. For a library, complete source code means
|
||||
all the source code for all modules it contains, plus any associated
|
||||
interface definition files, plus the scripts used to control compilation
|
||||
and installation of the library.
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running a program using the Library is not restricted, and output from
|
||||
such a program is covered only if its contents constitute a work based
|
||||
on the Library (independent of the use of the Library in a tool for
|
||||
writing it). Whether that is true depends on what the Library does
|
||||
and what the program that uses the Library does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Library's
|
||||
complete source code as you receive it, in any medium, provided that
|
||||
you conspicuously and appropriately publish on each copy an
|
||||
appropriate copyright notice and disclaimer of warranty; keep intact
|
||||
all the notices that refer to this License and to the absence of any
|
||||
warranty; and distribute a copy of this License along with the
|
||||
Library.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy,
|
||||
and you may at your option offer warranty protection in exchange for a
|
||||
fee.
|
||||
|
||||
2. You may modify your copy or copies of the Library or any portion
|
||||
of it, thus forming a work based on the Library, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) The modified work must itself be a software library.
|
||||
|
||||
b) You must cause the files modified to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
c) You must cause the whole of the work to be licensed at no
|
||||
charge to all third parties under the terms of this License.
|
||||
|
||||
d) If a facility in the modified Library refers to a function or a
|
||||
table of data to be supplied by an application program that uses
|
||||
the facility, other than as an argument passed when the facility
|
||||
is invoked, then you must make a good faith effort to ensure that,
|
||||
in the event an application does not supply such function or
|
||||
table, the facility still operates, and performs whatever part of
|
||||
its purpose remains meaningful.
|
||||
|
||||
(For example, a function in a library to compute square roots has
|
||||
a purpose that is entirely well-defined independent of the
|
||||
application. Therefore, Subsection 2d requires that any
|
||||
application-supplied function or table used by this function must
|
||||
be optional: if the application does not supply it, the square
|
||||
root function must still compute square roots.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Library,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Library, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote
|
||||
it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Library.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Library
|
||||
with the Library (or with a work based on the Library) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may opt to apply the terms of the ordinary GNU General Public
|
||||
License instead of this License to a given copy of the Library. To do
|
||||
this, you must alter all the notices that refer to this License, so
|
||||
that they refer to the ordinary GNU General Public License, version 2,
|
||||
instead of to this License. (If a newer version than version 2 of the
|
||||
ordinary GNU General Public License has appeared, then you can specify
|
||||
that version instead if you wish.) Do not make any other change in
|
||||
these notices.
|
||||
|
||||
Once this change is made in a given copy, it is irreversible for
|
||||
that copy, so the ordinary GNU General Public License applies to all
|
||||
subsequent copies and derivative works made from that copy.
|
||||
|
||||
This option is useful when you wish to copy part of the code of
|
||||
the Library into a program that is not a library.
|
||||
|
||||
4. You may copy and distribute the Library (or a portion or
|
||||
derivative of it, under Section 2) in object code or executable form
|
||||
under the terms of Sections 1 and 2 above provided that you accompany
|
||||
it with the complete corresponding machine-readable source code, which
|
||||
must be distributed under the terms of Sections 1 and 2 above on a
|
||||
medium customarily used for software interchange.
|
||||
|
||||
If distribution of object code is made by offering access to copy
|
||||
from a designated place, then offering equivalent access to copy the
|
||||
source code from the same place satisfies the requirement to
|
||||
distribute the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
5. A program that contains no derivative of any portion of the
|
||||
Library, but is designed to work with the Library by being compiled or
|
||||
linked with it, is called a "work that uses the Library". Such a
|
||||
work, in isolation, is not a derivative work of the Library, and
|
||||
therefore falls outside the scope of this License.
|
||||
|
||||
However, linking a "work that uses the Library" with the Library
|
||||
creates an executable that is a derivative of the Library (because it
|
||||
contains portions of the Library), rather than a "work that uses the
|
||||
library". The executable is therefore covered by this License.
|
||||
Section 6 states terms for distribution of such executables.
|
||||
|
||||
When a "work that uses the Library" uses material from a header file
|
||||
that is part of the Library, the object code for the work may be a
|
||||
derivative work of the Library even though the source code is not.
|
||||
Whether this is true is especially significant if the work can be
|
||||
linked without the Library, or if the work is itself a library. The
|
||||
threshold for this to be true is not precisely defined by law.
|
||||
|
||||
If such an object file uses only numerical parameters, data
|
||||
structure layouts and accessors, and small macros and small inline
|
||||
functions (ten lines or less in length), then the use of the object
|
||||
file is unrestricted, regardless of whether it is legally a derivative
|
||||
work. (Executables containing this object code plus portions of the
|
||||
Library will still fall under Section 6.)
|
||||
|
||||
Otherwise, if the work is a derivative of the Library, you may
|
||||
distribute the object code for the work under the terms of Section 6.
|
||||
Any executables containing that work also fall under Section 6,
|
||||
whether or not they are linked directly with the Library itself.
|
||||
|
||||
6. As an exception to the Sections above, you may also combine or
|
||||
link a "work that uses the Library" with the Library to produce a
|
||||
work containing portions of the Library, and distribute that work
|
||||
under terms of your choice, provided that the terms permit
|
||||
modification of the work for the customer's own use and reverse
|
||||
engineering for debugging such modifications.
|
||||
|
||||
You must give prominent notice with each copy of the work that the
|
||||
Library is used in it and that the Library and its use are covered by
|
||||
this License. You must supply a copy of this License. If the work
|
||||
during execution displays copyright notices, you must include the
|
||||
copyright notice for the Library among them, as well as a reference
|
||||
directing the user to the copy of this License. Also, you must do one
|
||||
of these things:
|
||||
|
||||
a) Accompany the work with the complete corresponding
|
||||
machine-readable source code for the Library including whatever
|
||||
changes were used in the work (which must be distributed under
|
||||
Sections 1 and 2 above); and, if the work is an executable linked
|
||||
with the Library, with the complete machine-readable "work that
|
||||
uses the Library", as object code and/or source code, so that the
|
||||
user can modify the Library and then relink to produce a modified
|
||||
executable containing the modified Library. (It is understood
|
||||
that the user who changes the contents of definitions files in the
|
||||
Library will not necessarily be able to recompile the application
|
||||
to use the modified definitions.)
|
||||
|
||||
b) Use a suitable shared library mechanism for linking with the
|
||||
Library. A suitable mechanism is one that (1) uses at run time a
|
||||
copy of the library already present on the user's computer system,
|
||||
rather than copying library functions into the executable, and (2)
|
||||
will operate properly with a modified version of the library, if
|
||||
the user installs one, as long as the modified version is
|
||||
interface-compatible with the version that the work was made with.
|
||||
|
||||
c) Accompany the work with a written offer, valid for at
|
||||
least three years, to give the same user the materials
|
||||
specified in Subsection 6a, above, for a charge no more
|
||||
than the cost of performing this distribution.
|
||||
|
||||
d) If distribution of the work is made by offering access to copy
|
||||
from a designated place, offer equivalent access to copy the above
|
||||
specified materials from the same place.
|
||||
|
||||
e) Verify that the user has already received a copy of these
|
||||
materials or that you have already sent this user a copy.
|
||||
|
||||
For an executable, the required form of the "work that uses the
|
||||
Library" must include any data and utility programs needed for
|
||||
reproducing the executable from it. However, as a special exception,
|
||||
the materials to be distributed need not include anything that is
|
||||
normally distributed (in either source or binary form) with the major
|
||||
components (compiler, kernel, and so on) of the operating system on
|
||||
which the executable runs, unless that component itself accompanies
|
||||
the executable.
|
||||
|
||||
It may happen that this requirement contradicts the license
|
||||
restrictions of other proprietary libraries that do not normally
|
||||
accompany the operating system. Such a contradiction means you cannot
|
||||
use both them and the Library together in an executable that you
|
||||
distribute.
|
||||
|
||||
7. 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 not covered by this License, and distribute such a combined
|
||||
library, provided that the separate distribution of the work based on
|
||||
the Library and of the other library facilities is otherwise
|
||||
permitted, and provided that you do these two things:
|
||||
|
||||
a) Accompany the combined library with a copy of the same work
|
||||
based on the Library, uncombined with any other library
|
||||
facilities. This must be distributed under the terms of the
|
||||
Sections above.
|
||||
|
||||
b) Give prominent notice with the combined library of the fact
|
||||
that part of it is a work based on the Library, and explaining
|
||||
where to find the accompanying uncombined form of the same work.
|
||||
|
||||
8. You may not copy, modify, sublicense, link with, or distribute
|
||||
the Library except as expressly provided under this License. Any
|
||||
attempt otherwise to copy, modify, sublicense, link with, or
|
||||
distribute the Library is void, and will automatically terminate your
|
||||
rights under this License. However, parties who have received copies,
|
||||
or rights, from you under this License will not have their licenses
|
||||
terminated so long as such parties remain in full compliance.
|
||||
|
||||
9. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Library or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Library (or any work based on the
|
||||
Library), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Library or works based on it.
|
||||
|
||||
10. Each time you redistribute the Library (or any work based on the
|
||||
Library), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute, link with or modify the Library
|
||||
subject to these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties with
|
||||
this License.
|
||||
|
||||
11. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Library at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Library by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Library.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under any
|
||||
particular circumstance, the balance of the section is intended to apply,
|
||||
and the section as a whole is intended to apply in other circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
12. If the distribution and/or use of the Library is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Library under this License may add
|
||||
an explicit geographical distribution limitation excluding those countries,
|
||||
so that distribution is permitted only in or among countries not thus
|
||||
excluded. In such case, this License incorporates the limitation as if
|
||||
written in the body of this License.
|
||||
|
||||
13. The Free Software Foundation may publish revised and/or new
|
||||
versions of the 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
|
||||
specifies a version number of this License which applies to it and
|
||||
"any later version", you have the option of following the terms and
|
||||
conditions either of that version or of any later version published by
|
||||
the Free Software Foundation. If the Library does not specify a
|
||||
license version number, you may choose any version ever published by
|
||||
the Free Software Foundation.
|
||||
|
||||
14. If you wish to incorporate parts of the Library into other free
|
||||
programs whose distribution conditions are incompatible with these,
|
||||
write to the author to ask for permission. For software which is
|
||||
copyrighted by the Free Software Foundation, write to the Free
|
||||
Software Foundation; we sometimes make exceptions for this. Our
|
||||
decision will be guided by the two goals of preserving the free status
|
||||
of all derivatives of our free software and of promoting the sharing
|
||||
and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
|
||||
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
|
||||
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
|
||||
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
|
||||
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
|
||||
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
|
||||
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
|
||||
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
|
||||
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
|
||||
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
|
||||
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
|
||||
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
|
||||
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
|
||||
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
|
||||
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Libraries
|
||||
|
||||
If you develop a new library, and you want it to be of the greatest
|
||||
possible use to the public, we recommend making it free software that
|
||||
everyone can redistribute and change. You can do so by permitting
|
||||
redistribution under these terms (or, alternatively, under the terms of the
|
||||
ordinary General Public License).
|
||||
|
||||
To apply these terms, attach the following notices to the library. It is
|
||||
safest to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least the
|
||||
"copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
{description}
|
||||
Copyright (C) {year} {fullname}
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
||||
USA
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the library, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the
|
||||
library `Frob' (a library for tweaking knobs) written by James Random
|
||||
Hacker.
|
||||
|
||||
{signature of Ty Coon}, 1 April 1990
|
||||
Ty Coon, President of Vice
|
||||
|
||||
That's all there is to it!
|
|
@ -0,0 +1,38 @@
|
|||
# csm-inspect
|
||||
Client mod that adds a command to inspect nodes and items.
|
||||
|
||||
## Commands
|
||||
### inspect
|
||||
Arguments: `help | get | on | off | hand | toggle`
|
||||
|
||||
#### Help
|
||||
Display a help message.
|
||||
|
||||
#### Get
|
||||
Display whether inspection is enabled or disabled.
|
||||
|
||||
#### On
|
||||
Enable inspection.
|
||||
|
||||
#### Off
|
||||
Disable inspection.
|
||||
|
||||
#### Hand
|
||||
Show wielded item.
|
||||
|
||||
#### Toggle
|
||||
Toggle inspection. If run with no arguments, this is default.
|
||||
|
||||
## How to install
|
||||
1. Enter your minetest directory.
|
||||
2. Find the `clientmods` directory.
|
||||
3. Unpack this mod into that directory.
|
||||
4. Rename unpacked directory (should be named `csm-inspect-master`) to `inspect`.
|
||||
5. Set the in-game setting `enable_client_modding` to true.
|
||||
6. You're done!
|
||||
|
||||
## How to use
|
||||
When inspection is enabled (type `.inspect get` to find out), punch a node to see everything about it.
|
||||
|
||||
## License
|
||||
Code: **LGPL v2.1+**
|
|
@ -0,0 +1,61 @@
|
|||
local inspect = false
|
||||
minetest.register_chatcommand("inspect", {
|
||||
description = "Modify inspection settings",
|
||||
params = "help|get|on|off|hand|toggle",
|
||||
func = function(param)
|
||||
param = param:lower()
|
||||
if param == "help" then
|
||||
minetest.display_chat_message("HELP: Show this help message.")
|
||||
minetest.display_chat_message("GET: Inspection settings.")
|
||||
minetest.display_chat_message("ON: Enable inspection.")
|
||||
minetest.display_chat_message("OFF: Disable inspection.")
|
||||
minetest.display_chat_message("HAND: Show held item.")
|
||||
minetest.display_chat_message("TOGGLE: Toggle inspection. (Default)")
|
||||
return true
|
||||
elseif param == "get" then
|
||||
if inspect then
|
||||
return true, "Inspection is enabled."
|
||||
else
|
||||
return true, "Inspection is disabled."
|
||||
end
|
||||
elseif param == "on" then
|
||||
inspect = true
|
||||
return true, "Inspection enabled."
|
||||
elseif param == "off" then
|
||||
inspect = false
|
||||
return true, "Inspection disabled."
|
||||
elseif param == "hand" then
|
||||
local stack = minetest.get_wielded_item()
|
||||
if stack:get_name() == "" then
|
||||
minetest.display_chat_message("Your hand is empty.")
|
||||
return true
|
||||
end
|
||||
if stack:get_wear() > 0 then -- If a tool, then say wear instead of count.
|
||||
minetest.display_chat_message("You are holding a " .. stack:get_name() .. " which is " .. tostring(math.floor((stack:get_wear()/65535) * 100)) .. "% worn.")
|
||||
return true
|
||||
else
|
||||
minetest.display_chat_message("You are holding " .. tostring(stack:get_count()) .. " of " .. stack:get_name() .. ".")
|
||||
return true
|
||||
end
|
||||
return false, "Not Implimented."
|
||||
elseif param == "toggle" or param == "" then
|
||||
inspect = not inspect
|
||||
if inspect then
|
||||
return true, "Inspection enabled."
|
||||
else
|
||||
return true, "Inspection disabled."
|
||||
end
|
||||
return true
|
||||
else
|
||||
return false, "Invalid Arguments."
|
||||
end
|
||||
end
|
||||
})
|
||||
|
||||
minetest.register_on_punchnode(function(pos, node)
|
||||
if inspect then
|
||||
minetest.display_chat_message("Node name: " .. node.name)
|
||||
minetest.display_chat_message("Param1: " .. tostring(node.param1))
|
||||
minetest.display_chat_message("Param2, Facedir: " .. tostring(node.param2) .. ", " .. tostring(node.param2 % 32))
|
||||
end
|
||||
end)
|
Loading…
Reference in New Issue