Initial Commit
27
.luacheckrc
Normal file
@ -0,0 +1,27 @@
|
||||
unused_args = false
|
||||
allow_defined_top = true
|
||||
|
||||
read_globals = {
|
||||
"DIR_DELIM",
|
||||
"minetest",
|
||||
"dump",
|
||||
"vector",
|
||||
"VoxelManip", "VoxelArea",
|
||||
"PseudoRandom", "PcgRandom",
|
||||
"ItemStack",
|
||||
"Settings",
|
||||
"unpack",
|
||||
-- Silence errors about custom table methods.
|
||||
table = { fields = { "copy", "indexof" } },
|
||||
-- Silence warnings about accessing undefined fields of global 'math'
|
||||
math = { fields = { "sign" } }
|
||||
}
|
||||
|
||||
-- Overwrites minetest.handle_node_drops
|
||||
files["mods/creative/init.lua"].globals = { "minetest" }
|
||||
|
||||
-- Overwrites minetest.calculate_knockback
|
||||
files["mods/player_api/api.lua"].globals = { "minetest" }
|
||||
|
||||
-- Don't report on legacy definitions of globals.
|
||||
files["mods/default/legacy.lua"].global = false
|
11
.travis.yml
Normal file
@ -0,0 +1,11 @@
|
||||
language: generic
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- luarocks
|
||||
before_install:
|
||||
- luarocks install --local luacheck
|
||||
script:
|
||||
- $HOME/.luarocks/bin/luacheck ./mods
|
||||
notifications:
|
||||
email: false
|
519
LICENSE.txt
Normal file
@ -0,0 +1,519 @@
|
||||
License of media (textures and sounds)
|
||||
--------------------------------------
|
||||
Copyright (C) 2010-2012 celeron55, Perttu Ahola <celeron55@gmail.com>
|
||||
See README.txt in each mod directory for information about other authors.
|
||||
|
||||
Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)
|
||||
http://creativecommons.org/licenses/by-sa/3.0/
|
||||
|
||||
License of menu/header.png
|
||||
Copyright (C) 2015 paramat CC BY-SA 3.0
|
||||
|
||||
|
||||
License of source code
|
||||
----------------------
|
||||
Copyright (C) 2010-2012 celeron55, Perttu Ahola <celeron55@gmail.com>
|
||||
See README.txt in each mod directory for information about other authors.
|
||||
|
||||
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!
|
35
README.md
Normal file
@ -0,0 +1,35 @@
|
||||
# Minetest Game
|
||||
|
||||
The default game bundled in the Minetest engine.
|
||||
|
||||
For further information, check
|
||||
[this forum topic](https://forum.minetest.net/viewtopic.php?f=15&t=9724).
|
||||
Also see the [Minetest Wiki](https://wiki.minetest.net/Subgames/Minetest_Game)
|
||||
for more information.
|
||||
|
||||
## Installation
|
||||
|
||||
- Unzip the archive, rename the folder to minetest_game and
|
||||
place it in .. minetest/games/
|
||||
|
||||
- GNU/Linux: If you use a system-wide installation place
|
||||
it in ~/.minetest/games/.
|
||||
|
||||
The Minetest engine can be found at [GitHub](https://github.com/minetest/minetest).
|
||||
|
||||
For further information or help, see:
|
||||
https://wiki.minetest.net/Installing_Mods
|
||||
|
||||
## Compatibility
|
||||
|
||||
The Minetest Game GitHub master HEAD is generally compatible with the GitHub
|
||||
master HEAD of the Minetest engine.
|
||||
Additionally, when the Minetest engine is tagged to be a certain version (e.g.
|
||||
0.4.10), Minetest Game is tagged with the version too.
|
||||
|
||||
When stable releases are made, Minetest Game and the Minetest engine is packaged
|
||||
and made available at [www.minetest.net](https://www.minetest.net/downloads/).
|
||||
|
||||
## Licensing
|
||||
|
||||
See `LICENSE.txt`
|
3
game.conf
Normal file
@ -0,0 +1,3 @@
|
||||
name = Survival
|
||||
author = Many Authors, Just_Visiting
|
||||
description = A complete adventure survival game. Much to explore, much to discover!
|
1084
game_api.txt
Normal file
BIN
menu/header.png
Normal file
After Width: | Height: | Size: 935 B |
BIN
menu/icon.png
Normal file
After Width: | Height: | Size: 2.9 KiB |
0
minetest.conf
Normal file
77
minetest.conf.example
Normal file
@ -0,0 +1,77 @@
|
||||
# This file contains settings of Minetest Game that can be changed in
|
||||
# minetest.conf.
|
||||
# By default, all the settings are commented and not functional.
|
||||
# Uncomment settings by removing the preceding #.
|
||||
|
||||
# Whether creative mode (fast digging of all blocks, unlimited resources) should
|
||||
# be enabled.
|
||||
#creative_mode = false
|
||||
|
||||
# Sets the behaviour of the inventory items when a player dies.
|
||||
# bones: Store items in a bone node but drop items if inside protected area.
|
||||
# drop: Drop items on the ground.
|
||||
# keep: Player keeps items.
|
||||
#bones_mode = bones
|
||||
|
||||
# The time in seconds after which the bones of a dead player can be looted by
|
||||
# everyone.
|
||||
# 0 to disable.
|
||||
#share_bones_time = 1200
|
||||
|
||||
# How much earlier the bones of a dead player can be looted by
|
||||
# everyone if the player dies in a protected area they don't own.
|
||||
# 0 to disable. By default it is "share_bones_time" divide by four.
|
||||
#share_bones_time_early = 300
|
||||
|
||||
# Inform player of condition and location of new bones.
|
||||
#bones_position_message = false
|
||||
|
||||
# Whether fire should be enabled. If disabled, 'basic_flame' nodes will
|
||||
# disappear.
|
||||
# 'permanent_flame' nodes will remain with either setting.
|
||||
#enable_fire = true
|
||||
|
||||
# Enable flame sound.
|
||||
#flame_sound = true
|
||||
|
||||
# Whether lavacooling should be enabled.
|
||||
#enable_lavacooling = true
|
||||
|
||||
# Whether the stuff in initial_stuff should be given to new players.
|
||||
#give_initial_stuff = false
|
||||
#initial_stuff = default:pick_steel,default:axe_steel,default:shovel_steel,
|
||||
default:torch 99,default:cobble 99
|
||||
|
||||
# Whether the TNT mod should be enabled.
|
||||
#enable_tnt = <true in singleplayer, false in multiplayer>
|
||||
|
||||
# The radius of a TNT explosion.
|
||||
#tnt_radius = 3
|
||||
|
||||
# Enable the stairs mod ABM that replaces the old 'upside down'
|
||||
# stair and slab nodes in old maps with the new param2 versions.
|
||||
#enable_stairs_replace_abm = false
|
||||
|
||||
# Whether to allow respawning in beds.
|
||||
# Default value is true.
|
||||
#enable_bed_respawn = true
|
||||
|
||||
# Whether players can skip night by sleeping.
|
||||
# Default value is true.
|
||||
#enable_bed_night_skip = true
|
||||
|
||||
# If enabled, fences and walls cannot be jumped over.
|
||||
#enable_fence_tall = false
|
||||
|
||||
# Whether the engine's spawn search, which does not check for a suitable
|
||||
# starting biome, is used.
|
||||
# Default value is false.
|
||||
#engine_spawn = false
|
||||
|
||||
# Whether river water source nodes create flowing sounds.
|
||||
# Helps rivers create more sound, especially on level sections.
|
||||
#river_source_sounds = false
|
||||
|
||||
# Enable cloud variation by the 'weather' mod.
|
||||
# Non-functional in V6 or Singlenode mapgens.
|
||||
#enable_weather = true
|
14
mods/3d_armor/.github/workflows/integration-test.yml
vendored
Normal file
@ -0,0 +1,14 @@
|
||||
name: integration-test
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
|
||||
- name: integration-test
|
||||
run: ./integration-test.sh
|
17
mods/3d_armor/.github/workflows/luacheck.yml
vendored
Normal file
@ -0,0 +1,17 @@
|
||||
name: luacheck
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
- name: apt
|
||||
run: sudo apt-get install -y luarocks
|
||||
- name: luacheck install
|
||||
run: luarocks install --local luacheck
|
||||
- name: luacheck run
|
||||
run: $HOME/.luarocks/bin/luacheck ./
|
11
mods/3d_armor/.gitignore
vendored
Normal file
@ -0,0 +1,11 @@
|
||||
## Generic ignorable patterns and files
|
||||
*~
|
||||
.*.swp
|
||||
*bak*
|
||||
tags
|
||||
*.vim
|
||||
armor.conf
|
||||
|
||||
## Eclipse project files & directories
|
||||
.project
|
||||
.settings
|
32
mods/3d_armor/.luacheckrc
Normal file
@ -0,0 +1,32 @@
|
||||
|
||||
unused_args = false
|
||||
|
||||
globals = {
|
||||
"wieldview",
|
||||
"armor",
|
||||
"inventory_plus"
|
||||
}
|
||||
|
||||
read_globals = {
|
||||
-- Stdlib
|
||||
string = {fields = {"split"}},
|
||||
table = {fields = {"copy", "getn"}},
|
||||
|
||||
-- Minetest
|
||||
"vector", "ItemStack",
|
||||
"dump", "VoxelArea",
|
||||
|
||||
-- deps
|
||||
"default",
|
||||
"minetest",
|
||||
"unified_inventory",
|
||||
"wardrobe",
|
||||
"player_monoids",
|
||||
"armor_monoid",
|
||||
"sfinv",
|
||||
"ARMOR_MATERIALS",
|
||||
"ARMOR_FIRE_NODES",
|
||||
"pova",
|
||||
"skins",
|
||||
"u_skins"
|
||||
}
|
26
mods/3d_armor/3d_armor/LICENSE.txt
Normal file
@ -0,0 +1,26 @@
|
||||
[mod] 3d Armor [3d_armor]
|
||||
=========================
|
||||
|
||||
License Source Code
|
||||
-------------------
|
||||
|
||||
Copyright (C) 2012-2019 stujones11, Stuart Jones <stujones111@gmail.com>
|
||||
|
||||
This program 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 program 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 program; if not, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
License Textures
|
||||
----------------
|
||||
|
||||
Copyright (C) 2017-2019 davidthecreator - CC-BY-SA 3.0
|
524
mods/3d_armor/3d_armor/README.md
Normal file
@ -0,0 +1,524 @@
|
||||
# [mod] Visible Player Armor [3d_armor]
|
||||
|
||||
| | | | |
|
||||
|--|--|--|--|
|
||||
|-[Overview](#overview) |||-[API](#api)
|
||||
|-[Armor Configuration](#armor-configuration) |||- - [3d_Armor Item Storage](#3d_armor-item-storage)
|
||||
|- - [disable_specific_materials](#to-disable-individual-armor-materials) |||- - [Armor Registration](#armor-registration)
|
||||
|- - [armor_init_delay](#initialization-glitches-when-a-player-first-joins) |||- - [Registering Armor Groups](#registering-armor-groups)
|
||||
|- - [armor_init_times](#number-of-initialization-attempts) |||- - [Groups used by 3d_Armor](#groups-used-by-3d_armor)
|
||||
|- - [armor_bones_delay](#armor-not-in-bones-due-to-server-lag) |||- - - [Elements](#elements)
|
||||
|- - [armor_update_time](#how-often-player-armor-items-are-updated) |||- - - [Attributes](#attributes)
|
||||
|- - [armor_drop](#drop-armor-when-a-player-dies) |||- - - [Physics](#physics)
|
||||
|- - [armor_destroy](#destroy-armor-when-a-player-dies) |||- - - [Durability](#durability)
|
||||
|- - [armor_level_multiplier](#armor-level-multiplyer) |||- - - [Armor Material](#armor-material)
|
||||
|- - [armor_heal_multiplier](#armor-healing-multiplyer) |||- - [Armour Functions](#armor-functions)
|
||||
|- - [armor_set_elements](#allows-the-customisation-of-armor-set) |||- - - [armor:set_player_armor](#armor-set_player_armor)
|
||||
|- - [armor_set_bonus](#armor-set-bonus-multiplier) |||- - - [armor:punch](#armor-punch)
|
||||
|- - [armor_water_protect](#enable-water-protection) |||- - - [armor:damage](#armor-damage)
|
||||
|- - [armor_fire_protect](#enable-fire-protection) |||- - - [armor:remove_all](#armor-remove_all)
|
||||
|- - [armor_punch_damage](#enable-punch-damage-effects) |||- - - [armor:equip](#armor-equip)
|
||||
|- - [armor_migrate_old_inventory](#migration-of-old-armor-inventories) |||- - - [armor:unequip](#armor-unequip)
|
||||
|- - [wieldview_update_time](#how-often-player-wield-items-are-updated) |||- - - [armor:update_skin](#armor-update_skin)
|
||||
|-[Credits](#credits) |||- - [Callbacks](#Callbacks)
|
||||
| |||- - - [Item callbacks](#item-callbacks)
|
||||
| |||- - - [Global callbacks](#global-callbacks)
|
||||
|
||||
# Overview
|
||||
|
||||
**Depends:** default
|
||||
|
||||
**Recommends:** sfinv, unified_inventory or smart_inventory (use only one to avoid conflicts)
|
||||
|
||||
**Supports:** player_monoids, armor_monoid and POVA
|
||||
|
||||
Adds craftable armor that is visible to other players. Each armor item worn contributes to
|
||||
a player's armor group level making them less vulnerable to weapons.
|
||||
|
||||
Armor takes damage when a player is hurt but also offers a percentage chance of healing.
|
||||
Overall level is boosted by 10% when wearing a full matching set.
|
||||
|
||||
# Armor Configuration
|
||||
|
||||
Change the following default settings by going to Main Menu>>Settings(Tab)>>All Settings(Button)>>Mods>>minetest-3d_Armor>>3d_Armor
|
||||
|
||||
### To disable individual armor materials
|
||||
**set the below to false**
|
||||
|
||||
armor_material_wood = true
|
||||
armor_material_cactus = true
|
||||
armor_material_steel = true
|
||||
armor_material_bronze = true
|
||||
armor_material_diamond = true
|
||||
armor_material_gold = true
|
||||
armor_material_mithril = true
|
||||
armor_material_crystal = true
|
||||
|
||||
### Initialization glitches when a player first joins
|
||||
**Increase to prevent glitches**
|
||||
|
||||
armor_init_delay = 2
|
||||
|
||||
### Number of initialization attempts
|
||||
**Increase to prevent glitches - Use in conjunction with armor_init_delay if initialization problems persist.**
|
||||
|
||||
armor_init_times = 10
|
||||
|
||||
### Armor not in bones due to server lag
|
||||
**Increase to help resolve**
|
||||
|
||||
armor_bones_delay = 1
|
||||
|
||||
### How often player armor items are updated
|
||||
**Number represents how often per second update is performed, higher value means less performance hit for servers but armor items maybe delayed in updating when switching.Fractional seconds also supported eg 0.1**
|
||||
|
||||
armor_update_time = 1
|
||||
|
||||
### Drop armor when a player dies
|
||||
**Uses bones mod if present, otherwise items are dropped around the player when false.**
|
||||
|
||||
armor_drop = true
|
||||
|
||||
### Destroy armor when a player dies
|
||||
**overrides armor_drop.**
|
||||
|
||||
armor_destroy = false
|
||||
|
||||
### Armor level multiplyer
|
||||
**Increase to make armor more effective and decrease to make armor less effective**
|
||||
**eg: level_multiplier = 0.5 will reduce armor level by half.**
|
||||
|
||||
armor_level_multiplier = 1
|
||||
|
||||
### Armor healing multiplyer
|
||||
**Increase to make armor healing more effective and decrease to make healing less effective**
|
||||
**eg: armor_heal_multiplier = 0 will disable healing altogether.**
|
||||
|
||||
armor_heal_multiplier = 1
|
||||
|
||||
### Allows the customisation of armor set
|
||||
**Shields already configured as need to be worn to complete an armor set**
|
||||
**These names come from [Element names](#groups-used-by-3d_armor), the second half of the element name only is used eg armor_head is head**
|
||||
|
||||
armor_set_elements = head torso legs feet shield
|
||||
|
||||
### Armor set bonus multiplier
|
||||
**Set to 1 to disable set bonus**
|
||||
|
||||
armor_set_multiplier = 1.1
|
||||
|
||||
### Enable water protection
|
||||
**periodically restores breath when activated**
|
||||
|
||||
armor_water_protect = true
|
||||
|
||||
### Enable fire protection
|
||||
**defaults to true if using ethereal mod**
|
||||
|
||||
armor_fire_protect = false
|
||||
|
||||
### Fire protection enabled, disable torch fire damage
|
||||
**when fire protection is enabled allows you to disable fire damage from torches**
|
||||
**defaults to true if using ethereal mod**
|
||||
|
||||
armor_fire_protect_torch = false
|
||||
|
||||
### Enable punch damage effects
|
||||
|
||||
armor_punch_damage = true
|
||||
|
||||
### Migration of old armor inventories
|
||||
|
||||
armor_migrate_old_inventory = true
|
||||
|
||||
### How often player wield items are updated
|
||||
**Number represents how often per second update is performed, higher value means less performance hit for servers but wield items maybe delayed in updating when switching. Fractional seconds also supported eg 0.1**
|
||||
***Note this is MT engine functionality but included for completness***
|
||||
|
||||
wieldview_update_time = 1
|
||||
|
||||
# API
|
||||
|
||||
## 3d_Armor item storage
|
||||
3d_Armor stores each armor piece a player currently has equiped in a ***detached*** inventory. The easiest way to access this inventory if needed is using this line of code
|
||||
|
||||
local _, armor_inv = armor:get_valid_player(player, "3d_armor")
|
||||
|
||||
**Example**
|
||||
|
||||
armor:register_on_equip(function(player, index, stack)
|
||||
local _, armor_inv = armor:get_valid_player(player, "3d_armor")
|
||||
for i = 1, 6 do
|
||||
local stack = armor_inv:get_stack("armor", i)
|
||||
if stack:get_name() == "3d_armor:chestplate_gold" then
|
||||
minetest.chat_send_player(player:get_player_name(),"Got to love the Bling!!!")
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
## Armor Registration
|
||||
|
||||
armor:register_armor(name, def)
|
||||
|
||||
Wrapper function for `minetest.register_tool`, which enables the easy registration of new armor items. While registering armor as a tool item is still supported, this may be deprecated in future so all armor items should be registered using *armor:register_armor(name,def)*.
|
||||
|
||||
### Additional fields supported by 3d_armor
|
||||
|
||||
texture = <filename>
|
||||
preview = <filename>
|
||||
armor_groups = <table>
|
||||
damage_groups = <table>
|
||||
reciprocate_damage = <bool>
|
||||
on_equip = <function>
|
||||
on_unequip = <function>
|
||||
on_destroy = <function>
|
||||
on_damage = <function>
|
||||
on_punched = <function>
|
||||
|
||||
***Reciprocal tool*** damage will apply damage back onto the attacking tool/weapon, however this will only be done by the first armor inventory item with `reciprocate_damage = true`, damage does not stack.
|
||||
|
||||
**Example Simple:**
|
||||
|
||||
armor:register_armor("mod_name:chestplate_leather", {
|
||||
description = "Leather Chestplate",
|
||||
inventory_image = "mod_name_inv_chestplate_leather.png",
|
||||
texture = "mod_name_leather_chestplate.png",
|
||||
preview = "mod_name_leather_chestplate_preview.png",
|
||||
groups = {armor_torso=1, armor_heal=0, armor_use=2000, flammable=1},
|
||||
armor_groups = {fleshy=10},
|
||||
damage_groups = {cracky=3, snappy=2, choppy=3, crumbly=2, level=1}
|
||||
})
|
||||
*See ***armor.lua*** under **3d_armor>>3d_armor** for further examples*
|
||||
|
||||
**Extended functionality**
|
||||
The values for ***texture*** and ***preview*** do not need to be included when registering armor if they follow the naming convention in the textures mod folder of:
|
||||
***texture:*** *mod_name_leather_chestplate.png*
|
||||
***preview:*** *mod_name_leather_chestplate_preview.png*
|
||||
|
||||
## Registering Armor Groups
|
||||
3d armor has a built in armor group which is ***fleshy*** all players base vulnerability to being fleshy is ***100***.
|
||||
3d armour allows for the easy registration/addition of new armor groups::
|
||||
|
||||
armor:register_armor_group(group, base)
|
||||
|
||||
***group:*** Is the name of the new armor group
|
||||
***base*** Is the starting vulnerability that all players have to that new group. This dosent need to be 100.
|
||||
|
||||
**Example**
|
||||
|
||||
armor:register_armor_group("radiation", 100)
|
||||
|
||||
New armor group is registered called *radiation* and all players start off with a base vulnerability of *100* to radiation.
|
||||
|
||||
**Example** *Showing armor reg, new group usage and custom function*
|
||||
|
||||
armor:register_armor("mod_name:speed_boots", {
|
||||
description = "Speed Boots",
|
||||
inventory_image = "mod_name_speed_boots_inv.png",
|
||||
texture = "mod_name_speed_boots.png",
|
||||
preview = "mod_name_speed_boots_preview.png",
|
||||
groups = {armor_feet=1, armor_use=500, physics_speed=1.2, flammable=1},
|
||||
armor_groups = {fleshy=10, radiation=10},
|
||||
damage_groups = {cracky=3, snappy=3, choppy=3, crumbly=3, level=1},
|
||||
reciprocate_damage = true,
|
||||
on_destroy = function(player, index, stack)
|
||||
local pos = player:get_pos()
|
||||
if pos then
|
||||
minetest.sound_play({
|
||||
name = "mod_name_break_sound",
|
||||
pos = pos,
|
||||
gain = 0.5,
|
||||
})
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
### Tools/weapons and new armor groups
|
||||
The above allows armor to block/prevent new damage types but you also need to assign the new damage group to a tool/weapon or even a node (see technic mod) to make wearing the armor item meaningful. Simply add the ***armor_groups*** name to the tool items ***damage_groups***.
|
||||
|
||||
**Example**
|
||||
|
||||
minetest.register_tool("mod_name:glowing_sword", {
|
||||
description = "Glowing Sword",
|
||||
inventory_image = "mod_name_tool_glowingsword.png",
|
||||
tool_capabilities = {full_punch_interval = 1.2,max_drop_level=0,
|
||||
groupcaps={
|
||||
cracky = {times={[3]=1.60}, uses=10, maxlevel=1},},
|
||||
damage_groups = {fleshy=10,radiation=20},
|
||||
},
|
||||
sound = {breaks = "default_tool_breaks"},
|
||||
groups = {pickaxe = 1, flammable = 2}
|
||||
})
|
||||
|
||||
## Groups used by 3d_Armor
|
||||
3d_armor has many default groups already registered, these are categorized under 4 main headings
|
||||
- **Elements:** armor_head, armor_torso, armor_legs, armor_feet
|
||||
- **Attributes:** armor_heal, armor_fire, armor_water
|
||||
- **Physics:** physics_jump, physics_speed, physics_gravity
|
||||
- **Durability:** armor_use, flammable
|
||||
|
||||
***Note: for calculation purposes "Attributes" and "Physics" values stack***
|
||||
|
||||
### Elements
|
||||
Additional armor elements can be added by dependant mods, for example shields adds the group armor_shield which has by default a limit that only 1 shield can be worn at a time.
|
||||
|
||||
Adding Elements is more complex but the below code can be used to add new elements;
|
||||
|
||||
if minetest.global_exists("armor") and armor.elements then
|
||||
table.insert(armor.elements, "hands")
|
||||
end
|
||||
**1st line** not strictly needed but checks that the global table "armor" and subtable "elements" exists
|
||||
**2nd line** adds a new value to the armor.elements table called "hands"
|
||||
|
||||
See ***init.lua*** under **3d_armor>>shields** for a further example
|
||||
|
||||
The new armor item can now be registered using the new element
|
||||
**Example**
|
||||
|
||||
armor:register_armor("mod_name:gloves_wood", {
|
||||
description = "Wood Gauntlets",
|
||||
inventory_image = "mod_name_inv_gloves_wood.png",
|
||||
texture = "mod_name_gloves_wood.png",
|
||||
preview = "mod_name_gloves_wood_preview.png",
|
||||
groups = {armor_hands=1, armor_heal=0, armor_use=2000, flammable=1},
|
||||
armor_groups = {fleshy=5},
|
||||
damage_groups = {cracky=3, snappy=2, choppy=3, crumbly=2, level=1},
|
||||
})
|
||||
|
||||
### Attributes
|
||||
Three attributes are avaliable in 3d_armor these are armor_heal, armor_fire and armor_water. Although possible to add additional attributes they would do nothing as code needs to be provide to specifiy the behaviour this could be done in a dependant mod
|
||||
|
||||
#### Armor_heal
|
||||
This isn't how much the armor will heal but relates to the chance the armor will completely block the damage. For each point of ***armor_heal*** there is a 1% chance that damage will be completely blocked, this value will stack between all armor pieces
|
||||
|
||||
**Example**
|
||||
The below Diamond chestplate has a 12% chance to completely block all damage (armor_heal=12), however so do boots, helmet and trousers so if the player was wearing all 4 pieces they would have a 48% chance of blocking all damage each attack.
|
||||
|
||||
armor:register_armor("3d_armor:chestplate_diamond", {
|
||||
description = S("Diamond Chestplate"),
|
||||
inventory_image = "3d_armor_inv_chestplate_diamond.png",
|
||||
groups = {armor_torso=1, armor_heal=12, armor_use=200},
|
||||
armor_groups = {fleshy=20},
|
||||
damage_groups = {cracky=2, snappy=1, choppy=1, level=3},
|
||||
})
|
||||
|
||||
#### Armor_fire
|
||||
***"Armor_fire"*** provides 5 levels of fire protection
|
||||
- level 1 protects against torches
|
||||
- level 2 protects against crystal spike (Ethereal mod)
|
||||
- level 3 protects against fire
|
||||
- level 4 unused
|
||||
- level 5 protects against lava
|
||||
|
||||
**Example**
|
||||
|
||||
armor:register_armor("mod_name:fire_proof_jacket", {
|
||||
description = "Fire Proof Jacket",
|
||||
inventory_image = "mod_name_inv_fire_proof_jacket.png",
|
||||
groups = {armor_torso=1, armor_fire=3, armor_use=1000},
|
||||
armor_groups = {fleshy=10},
|
||||
damage_groups = {cracky=2, snappy=1, choppy=1, level=3},
|
||||
})
|
||||
|
||||
#### Armor_water
|
||||
***"Armor_water"*** will periodically restore a players breath when underwater. This only has one level or state, which is armor_water=1
|
||||
|
||||
**Example**
|
||||
|
||||
armor:register_armor("mod_name:helmet_underwater_breath", {
|
||||
description = "Helmet of Underwater Breathing",
|
||||
inventory_image = "mod_name_inv_helmet_underwater_breath.png",
|
||||
groups = {armor_head=1, armor_water=1, armor_use=1000},
|
||||
armor_groups = {fleshy=5},
|
||||
damage_groups = {cracky=2, snappy=1, choppy=1, level=3},
|
||||
})
|
||||
|
||||
### Physics
|
||||
The physics attributes supported by 3d_armor are ***physics_jump, physics_speed and physics_gravity***. Although 3d_armor supports the use of this with no other mods it is recommended that the mod [player_monoids](https://forum.minetest.net/viewtopic.php?t=14895) is used to help with intermod compatability.
|
||||
|
||||
***physics_jump*** - Will increase/decrease the jump strength of the player so they can jump more/less. The base number is "1" and any value is added or subtracted, supports fractional so "physics_jump=1" will increase jump strength by 100%. "physics_jump= -0.5" will decrease jump by 50%.
|
||||
|
||||
***physics_speed*** - Will increase/decrease the walk speed of the player so they walk faster/slower. The base number is "1" and any value is added or subtracted, supports fractional so "physics_speed=1.5" will increase speed by 150%, "physics_speed= -0.5" will decrease speed by 50%.
|
||||
|
||||
***physics_gravity*** - Will increase/decrease gravity the player experiences so it's higher/lower. The base number is "1" and any value is added or subtracted, supports fractional so "physics_gravity=2" will increase gravity by 200%, "physics_gravity= -1" will decrease gravity by 100%.
|
||||
|
||||
*Note: The player physics modifications won't be applied via `set_physics_override` if `player_physics_locked` is set to 1 in the respective player's meta.*
|
||||
|
||||
### Durability
|
||||
Durability is determined by the value assigned to the group ***armor_use***. The higher the ***armor_use*** value the faster/more quickly it is damaged/degrades. This is calculated using the formula:
|
||||
|
||||
Total uses = approx(65535/armor_use)
|
||||
|
||||
**Example**
|
||||
All wood armor items have an ***armor_use=2000***;
|
||||
|
||||
65535/2000 = 32.76 (32)
|
||||
After 32 uses(hits) the armor item will break.
|
||||
|
||||
All diamond armor items have an ***armor_use=200***;
|
||||
|
||||
65535/2000 = 327.6 (327)
|
||||
After 327 uses(hits) the armor item will break.
|
||||
|
||||
### Armor Material
|
||||
The material the armor is made from is defined by adding the material to the end of registered armor item name. It is very important the material is the last item in the registered item name and it is preceeded by an "_" eg "_materialname".
|
||||
The material name is what 3d_armor uses to determine if a player is wearing a set of armor. To recieve the set bonus all items worn must be made of the same material.
|
||||
So to get a set bonus under the default set settings the players armor items listed below must be made of the same material:
|
||||
* head - Helmet
|
||||
* torso - Chestplate
|
||||
* legs - Leggings
|
||||
* feet - Boots
|
||||
* shield - Shields
|
||||
|
||||
If all of the above were made of material "wood" the player would recieve an ***armor_set_bonus*** of armor_level * 1.1, essentially +10%
|
||||
|
||||
**Example One**
|
||||
|
||||
armor:register_armor("3d_armor:helmet_bronze", {
|
||||
description = S("Bronze Helmet"),
|
||||
inventory_image = "3d_armor_inv_helmet_bronze.png",
|
||||
groups = {armor_head=1, armor_heal=6, armor_use=400, physics_speed=-0.01, physics_gravity=0.01},
|
||||
armor_groups = {fleshy=10},
|
||||
damage_groups = {cracky=3, snappy=2, choppy=2, crumbly=1, level=2},
|
||||
})
|
||||
|
||||
**Example Two**
|
||||
|
||||
armor:register_armor("new_mod:helmet_spartan_bronze", {
|
||||
description = S("Spartan Helmet"),
|
||||
inventory_image = "new_mod_inv_helmet_spartan_bronze.png",
|
||||
groups = {armor_head=1, armor_heal=6, armor_use=350, physics_speed=-0.01, physics_gravity=0.01},
|
||||
armor_groups = {fleshy=12},
|
||||
damage_groups = {cracky=3, snappy=2, choppy=2, crumbly=1, level=2},
|
||||
})
|
||||
|
||||
***Note: At the moment an armor item can only be made of one material***
|
||||
|
||||
## Armor Functions
|
||||
|
||||
### armor set_player_armor
|
||||
|
||||
armor:set_player_armor(player)
|
||||
|
||||
Primarily an internal function but can be called externally to apply any
|
||||
changes that might not otherwise get handled.
|
||||
|
||||
### armor punch
|
||||
|
||||
armor:punch(player, hitter, time_from_last_punch, tool_capabilities)
|
||||
|
||||
Used to apply damage to all equipped armor based on the damage groups of
|
||||
each individual item.`hitter`, `time_from_last_punch` and `tool_capabilities`
|
||||
are optional but should be valid if included.
|
||||
|
||||
### armor damage
|
||||
|
||||
armor:damage(player, index, stack, use)
|
||||
|
||||
Adds wear to a single armor itemstack, triggers `on_damage` callbacks and
|
||||
updates the necessary inventories. Also handles item destruction callbacks
|
||||
and so should NOT be called from `on_unequip` to avoid an infinite loop.
|
||||
|
||||
### armor remove_all
|
||||
|
||||
armor:remove_all(player)
|
||||
|
||||
Removes all armors from the player's inventory without triggering any callback.
|
||||
|
||||
### armor equip
|
||||
|
||||
armor:equip(player, armor_name)
|
||||
|
||||
Equip the armor, removing the itemstack from the main inventory if there's one.
|
||||
|
||||
### armor unequip
|
||||
|
||||
armor:unequip(player, armor_name)
|
||||
|
||||
Unequip the armor, adding the itemstack to the main inventory.
|
||||
|
||||
### armor update_skin
|
||||
|
||||
armor:update_skin(player_name)
|
||||
|
||||
Triggers a skin update with the same action as if a field with `skins_set` was submitted.
|
||||
|
||||
## Callbacks
|
||||
|
||||
### Item Callbacks
|
||||
|
||||
In all of the below when armor is destroyed `stack` will contain a copy of the previous stack.
|
||||
|
||||
*unsure what this note means may apply to all item callbacks or just on_punched*
|
||||
Return `false` to override armor damage effects.
|
||||
|
||||
#### on_equip
|
||||
|
||||
on_equip = func(player, index, stack)
|
||||
|
||||
#### on_unequip
|
||||
|
||||
on_unequip = func(player, index, stack)
|
||||
|
||||
#### on_destroy
|
||||
|
||||
on_destroy = func(player, index, stack)
|
||||
|
||||
#### on_damage
|
||||
|
||||
on_damage = func(player, index, stack)
|
||||
|
||||
#### on_punched
|
||||
|
||||
on_punched = func(player, hitter, time_from_last_punch, tool_capabilities)
|
||||
|
||||
`on_punched` is called every time a player is punched or takes damage, `hitter`, `time_from_last_punch` and `tool_capabilities` can be `nil` and will be in the case of fall damage.
|
||||
When fire protection is enabled, hitter == "fire" in the event of fire damage.
|
||||
|
||||
|
||||
### Global Callbacks
|
||||
|
||||
#### armor register_on_update
|
||||
|
||||
armor:register_on_update(function(player))
|
||||
|
||||
#### armor register_on_equip
|
||||
|
||||
armor:register_on_equip(function(player, index, stack))
|
||||
|
||||
#### armor register_on_unequip
|
||||
|
||||
armor:register_on_unequip(function(player, index, stack))
|
||||
|
||||
#### armor register_on_destroy
|
||||
armor:register_on_destroy(function(player, index, stack))
|
||||
|
||||
**Example**
|
||||
|
||||
armor:register_on_update(function(player)
|
||||
print(player:get_player_name().." armor updated!")
|
||||
end)
|
||||
|
||||
|
||||
# Credits
|
||||
|
||||
### The below have added too, tested or in other ways contributed to the development and ongoing support of 3d_Armor
|
||||
|
||||
|Stu |Stujones11 |Stu |Github Ghosts |
|
||||
|:---------------:|:---------------:|:---------------:|:---------------:|
|
||||
|Pavel_S |BlockMen |Tenplus1 |donat-b |
|
||||
|JPRuehmann |BrandonReese |Megaf |Zeg9 |
|
||||
|poet.nohit |Echoes91 |Adimgar |Khonkhortisan |
|
||||
|VanessaE |CraigyDavi |proller |Thomasrudin |
|
||||
|Byakuren |kilbith (jp) |afflatus |G1ov4 |
|
||||
|Thomas-S |Dragonop |Napiophelios |Emojigit |
|
||||
|rubenwardy |daviddoesminetest|bell07 |OgelGames |
|
||||
|tobyplowy |crazyginger72 |fireglow |bhree |
|
||||
|Lone_Wolf(HT) |Wuzzy(2) |numberZero |Monte48 |
|
||||
|AntumDeluge |Terumoc |runsy |Dacmot |
|
||||
|codexp |davidthecreator |SmallJoker |orbea |
|
||||
|BuckarooBanzay |daret |Exeterdad |Calinou |
|
||||
|Pilcrow182 |indriApollo |HybridDog |CraigyDavi |
|
||||
|Paly-2 |Diogogomes | | |
|
||||
|
||||
*Note: Names gathered from 3d_armor forum thread and github, I may have missed some people, apologises if I have - S01*
|
667
mods/3d_armor/3d_armor/api.lua
Normal file
@ -0,0 +1,667 @@
|
||||
-- support for i18n
|
||||
local S = minetest.get_translator(minetest.get_current_modname())
|
||||
|
||||
local skin_previews = {}
|
||||
local use_player_monoids = minetest.global_exists("player_monoids")
|
||||
local use_armor_monoid = minetest.global_exists("armor_monoid")
|
||||
local use_pova_mod = minetest.get_modpath("pova")
|
||||
local armor_def = setmetatable({}, {
|
||||
__index = function()
|
||||
return setmetatable({
|
||||
groups = setmetatable({}, {
|
||||
__index = function()
|
||||
return 0
|
||||
end})
|
||||
}, {
|
||||
__index = function()
|
||||
return 0
|
||||
end
|
||||
})
|
||||
end,
|
||||
})
|
||||
local armor_textures = setmetatable({}, {
|
||||
__index = function()
|
||||
return setmetatable({}, {
|
||||
__index = function()
|
||||
return "blank.png"
|
||||
end
|
||||
})
|
||||
end
|
||||
})
|
||||
|
||||
armor = {
|
||||
timer = 0,
|
||||
elements = {"head", "torso", "legs", "feet"},
|
||||
physics = {"jump", "speed", "gravity"},
|
||||
attributes = {"heal", "fire", "water"},
|
||||
formspec = "image[2.5,0;2,4;armor_preview]"..
|
||||
default.gui_bg..
|
||||
default.gui_bg_img..
|
||||
default.gui_slots..
|
||||
default.get_hotbar_bg(0, 4.7)..
|
||||
"list[current_player;main;0,4.7;8,1;]"..
|
||||
"list[current_player;main;0,5.85;8,3;8]",
|
||||
def = armor_def,
|
||||
textures = armor_textures,
|
||||
default_skin = "character",
|
||||
materials = {
|
||||
wood = "group:wood",
|
||||
cactus = "default:cactus",
|
||||
steel = "default:steel_ingot",
|
||||
bronze = "default:bronze_ingot",
|
||||
diamond = "default:diamond",
|
||||
gold = "default:gold_ingot",
|
||||
mithril = "moreores:mithril_ingot",
|
||||
crystal = "ethereal:crystal_ingot",
|
||||
},
|
||||
fire_nodes = {
|
||||
{"default:lava_source", 5, 8},
|
||||
{"default:lava_flowing", 5, 8},
|
||||
{"fire:basic_flame", 3, 4},
|
||||
{"fire:permanent_flame", 3, 4},
|
||||
{"ethereal:crystal_spike", 2, 1},
|
||||
{"ethereal:fire_flower", 2, 1},
|
||||
{"default:torch", 1, 1},
|
||||
{"default:torch_ceiling", 1, 1},
|
||||
{"default:torch_wall", 1, 1},
|
||||
},
|
||||
registered_groups = {["fleshy"]=100},
|
||||
registered_callbacks = {
|
||||
on_update = {},
|
||||
on_equip = {},
|
||||
on_unequip = {},
|
||||
on_damage = {},
|
||||
on_destroy = {},
|
||||
},
|
||||
migrate_old_inventory = true,
|
||||
version = "0.4.13",
|
||||
get_translator = S
|
||||
}
|
||||
|
||||
armor.config = {
|
||||
init_delay = 2,
|
||||
init_times = 10,
|
||||
bones_delay = 1,
|
||||
update_time = 1,
|
||||
drop = minetest.get_modpath("bones") ~= nil,
|
||||
destroy = false,
|
||||
level_multiplier = 1,
|
||||
heal_multiplier = 1,
|
||||
material_wood = true,
|
||||
material_cactus = true,
|
||||
material_steel = true,
|
||||
material_bronze = true,
|
||||
material_diamond = true,
|
||||
material_gold = true,
|
||||
material_mithril = true,
|
||||
material_crystal = true,
|
||||
set_elements = "head torso legs feet shield",
|
||||
set_multiplier = 1.1,
|
||||
water_protect = true,
|
||||
fire_protect = minetest.get_modpath("ethereal") ~= nil,
|
||||
fire_protect_torch = minetest.get_modpath("ethereal") ~= nil,
|
||||
punch_damage = true,
|
||||
}
|
||||
|
||||
-- Armor Registration
|
||||
|
||||
armor.register_armor = function(self, name, def)
|
||||
def.on_secondary_use = function(itemstack, player)
|
||||
return armor:equip(player, itemstack)
|
||||
end
|
||||
def.on_place = function(itemstack, player, pointed_thing)
|
||||
if pointed_thing.type == "node" and player and not player:get_player_control().sneak then
|
||||
local node = minetest.get_node(pointed_thing.under)
|
||||
local ndef = minetest.registered_nodes[node.name]
|
||||
if ndef and ndef.on_rightclick then
|
||||
return ndef.on_rightclick(pointed_thing.under, node, player, itemstack, pointed_thing)
|
||||
end
|
||||
end
|
||||
return armor:equip(player, itemstack)
|
||||
end
|
||||
-- The below is a very basic check to try and see if a material name exists as part
|
||||
-- of the item name. However this check is very simple and just checks theres "_something"
|
||||
-- at the end of the item name and logging an error to debug if not.
|
||||
local check_mat_exists = string.match(name, "%:.+_(.+)$")
|
||||
if check_mat_exists == nil then
|
||||
minetest.log("warning:[3d_armor] Registered armor "..name..
|
||||
" does not have \"_material\" specified at the end of the item registration name")
|
||||
end
|
||||
minetest.register_tool(name, def)
|
||||
end
|
||||
|
||||
armor.register_armor_group = function(self, group, base)
|
||||
base = base or 100
|
||||
self.registered_groups[group] = base
|
||||
if use_armor_monoid then
|
||||
armor_monoid.register_armor_group(group, base)
|
||||
end
|
||||
end
|
||||
|
||||
-- Armor callbacks
|
||||
|
||||
armor.register_on_update = function(self, func)
|
||||
if type(func) == "function" then
|
||||
table.insert(self.registered_callbacks.on_update, func)
|
||||
end
|
||||
end
|
||||
|
||||
armor.register_on_equip = function(self, func)
|
||||
if type(func) == "function" then
|
||||
table.insert(self.registered_callbacks.on_equip, func)
|
||||
end
|
||||
end
|
||||
|
||||
armor.register_on_unequip = function(self, func)
|
||||
if type(func) == "function" then
|
||||
table.insert(self.registered_callbacks.on_unequip, func)
|
||||
end
|
||||
end
|
||||
|
||||
armor.register_on_damage = function(self, func)
|
||||
if type(func) == "function" then
|
||||
table.insert(self.registered_callbacks.on_damage, func)
|
||||
end
|
||||
end
|
||||
|
||||
armor.register_on_destroy = function(self, func)
|
||||
if type(func) == "function" then
|
||||
table.insert(self.registered_callbacks.on_destroy, func)
|
||||
end
|
||||
end
|
||||
|
||||
armor.run_callbacks = function(self, callback, player, index, stack)
|
||||
if stack then
|
||||
local def = stack:get_definition() or {}
|
||||
if type(def[callback]) == "function" then
|
||||
def[callback](player, index, stack)
|
||||
end
|
||||
end
|
||||
local callbacks = self.registered_callbacks[callback]
|
||||
if callbacks then
|
||||
for _, func in pairs(callbacks) do
|
||||
func(player, index, stack)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
armor.update_player_visuals = function(self, player)
|
||||
if not player then
|
||||
return
|
||||
end
|
||||
local name = player:get_player_name()
|
||||
if self.textures[name] then
|
||||
default.player_set_textures(player, {
|
||||
self.textures[name].skin,
|
||||
self.textures[name].armor,
|
||||
self.textures[name].wielditem,
|
||||
})
|
||||
end
|
||||
self:run_callbacks("on_update", player)
|
||||
end
|
||||
|
||||
armor.set_player_armor = function(self, player)
|
||||
local name, armor_inv = self:get_valid_player(player, "[set_player_armor]")
|
||||
if not name then
|
||||
return
|
||||
end
|
||||
local state = 0
|
||||
local count = 0
|
||||
local preview = armor:get_preview(name)
|
||||
local texture = "3d_armor_trans.png"
|
||||
local physics = {}
|
||||
local attributes = {}
|
||||
local levels = {}
|
||||
local groups = {}
|
||||
local change = {}
|
||||
local set_worn = {}
|
||||
local armor_multi = 0
|
||||
local worn_armor = armor:get_weared_armor_elements(player)
|
||||
for _, phys in pairs(self.physics) do
|
||||
physics[phys] = 1
|
||||
end
|
||||
for _, attr in pairs(self.attributes) do
|
||||
attributes[attr] = 0
|
||||
end
|
||||
for group, _ in pairs(self.registered_groups) do
|
||||
change[group] = 1
|
||||
levels[group] = 0
|
||||
end
|
||||
local list = armor_inv:get_list("armor")
|
||||
if type(list) ~= "table" then
|
||||
return
|
||||
end
|
||||
for i, stack in pairs(list) do
|
||||
if stack:get_count() == 1 then
|
||||
local def = stack:get_definition()
|
||||
for _, element in pairs(self.elements) do
|
||||
if def.groups["armor_"..element] then
|
||||
if def.armor_groups then
|
||||
for group, level in pairs(def.armor_groups) do
|
||||
if levels[group] then
|
||||
levels[group] = levels[group] + level
|
||||
end
|
||||
end
|
||||
else
|
||||
local level = def.groups["armor_"..element]
|
||||
levels["fleshy"] = levels["fleshy"] + level
|
||||
end
|
||||
break
|
||||
end
|
||||
-- DEPRECATED, use armor_groups instead
|
||||
if def.groups["armor_radiation"] and levels["radiation"] then
|
||||
levels["radiation"] = def.groups["armor_radiation"]
|
||||
end
|
||||
end
|
||||
local item = stack:get_name()
|
||||
local tex = def.texture or item:gsub("%:", "_")
|
||||
tex = tex:gsub(".png$", "")
|
||||
local prev = def.preview or tex.."_preview"
|
||||
prev = prev:gsub(".png$", "")
|
||||
texture = texture.."^"..tex..".png"
|
||||
preview = preview.."^"..prev..".png"
|
||||
state = state + stack:get_wear()
|
||||
count = count + 1
|
||||
for _, phys in pairs(self.physics) do
|
||||
local value = def.groups["physics_"..phys] or 0
|
||||
physics[phys] = physics[phys] + value
|
||||
end
|
||||
for _, attr in pairs(self.attributes) do
|
||||
local value = def.groups["armor_"..attr] or 0
|
||||
attributes[attr] = attributes[attr] + value
|
||||
end
|
||||
end
|
||||
end
|
||||
-- The following code compares player worn armor items against requirements
|
||||
-- of which armor pieces are needed to be worn to meet set bonus requirements
|
||||
for loc,item in pairs(worn_armor) do
|
||||
local item_mat = string.match(item, "%:.+_(.+)$")
|
||||
local worn_key = item_mat or "unknown"
|
||||
|
||||
-- Perform location checks to ensure the armor is worn correctly
|
||||
for k,set_loc in pairs(armor.config.set_elements)do
|
||||
if set_loc == loc then
|
||||
if set_worn[worn_key] == nil then
|
||||
set_worn[worn_key] = 0
|
||||
set_worn[worn_key] = set_worn[worn_key] + 1
|
||||
else
|
||||
set_worn[worn_key] = set_worn[worn_key] + 1
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- Apply the armor multiplier only if the player is wearing a full set of armor
|
||||
for mat_name,arm_piece_num in pairs(set_worn) do
|
||||
if arm_piece_num == #armor.config.set_elements then
|
||||
armor_multi = armor.config.set_multiplier
|
||||
end
|
||||
end
|
||||
for group, level in pairs(levels) do
|
||||
if level > 0 then
|
||||
level = level * armor.config.level_multiplier
|
||||
if armor_multi ~= 0 then
|
||||
level = level * armor.config.set_multiplier
|
||||
end
|
||||
end
|
||||
local base = self.registered_groups[group]
|
||||
self.def[name].groups[group] = level
|
||||
if level > base then
|
||||
level = base
|
||||
end
|
||||
groups[group] = base - level
|
||||
change[group] = groups[group] / base
|
||||
end
|
||||
for _, attr in pairs(self.attributes) do
|
||||
local mult = attr == "heal" and self.config.heal_multiplier or 1
|
||||
self.def[name][attr] = attributes[attr] * mult
|
||||
end
|
||||
for _, phys in pairs(self.physics) do
|
||||
self.def[name][phys] = physics[phys]
|
||||
end
|
||||
if use_armor_monoid then
|
||||
armor_monoid.monoid:add_change(player, change, "3d_armor:armor")
|
||||
else
|
||||
-- Preserve immortal group (damage disabled for player)
|
||||
local immortal = player:get_armor_groups().immortal
|
||||
if immortal and immortal ~= 0 then
|
||||
groups.immortal = 1
|
||||
end
|
||||
player:set_armor_groups(groups)
|
||||
end
|
||||
if use_player_monoids then
|
||||
player_monoids.speed:add_change(player, physics.speed,
|
||||
"3d_armor:physics")
|
||||
player_monoids.jump:add_change(player, physics.jump,
|
||||
"3d_armor:physics")
|
||||
player_monoids.gravity:add_change(player, physics.gravity,
|
||||
"3d_armor:physics")
|
||||
elseif use_pova_mod then
|
||||
-- only add the changes, not the default 1.0 for each physics setting
|
||||
pova.add_override(name, "3d_armor", {
|
||||
speed = physics.speed - 1,
|
||||
jump = physics.jump - 1,
|
||||
gravity = physics.gravity - 1,
|
||||
})
|
||||
pova.do_override(player)
|
||||
else
|
||||
local player_physics_locked = player:get_meta():get_int("player_physics_locked")
|
||||
if player_physics_locked == nil or player_physics_locked == 0 then
|
||||
player:set_physics_override(physics)
|
||||
end
|
||||
end
|
||||
self.textures[name].armor = texture
|
||||
self.textures[name].preview = preview
|
||||
self.def[name].level = self.def[name].groups.fleshy or 0
|
||||
self.def[name].state = state
|
||||
self.def[name].count = count
|
||||
self:update_player_visuals(player)
|
||||
end
|
||||
|
||||
armor.punch = function(self, player, hitter, time_from_last_punch, tool_capabilities)
|
||||
local name, armor_inv = self:get_valid_player(player, "[punch]")
|
||||
if not name then
|
||||
return
|
||||
end
|
||||
local set_state
|
||||
local set_count
|
||||
local state = 0
|
||||
local count = 0
|
||||
local recip = true
|
||||
local default_groups = {cracky=3, snappy=3, choppy=3, crumbly=3, level=1}
|
||||
local list = armor_inv:get_list("armor")
|
||||
for i, stack in pairs(list) do
|
||||
if stack:get_count() == 1 then
|
||||
local itemname = stack:get_name()
|
||||
local use = minetest.get_item_group(itemname, "armor_use") or 0
|
||||
local damage = use > 0
|
||||
local def = stack:get_definition() or {}
|
||||
if type(def.on_punched) == "function" then
|
||||
damage = def.on_punched(player, hitter, time_from_last_punch,
|
||||
tool_capabilities) ~= false and damage == true
|
||||
end
|
||||
if damage == true and tool_capabilities then
|
||||
local damage_groups = def.damage_groups or default_groups
|
||||
local level = damage_groups.level or 0
|
||||
local groupcaps = tool_capabilities.groupcaps or {}
|
||||
local uses = 0
|
||||
damage = false
|
||||
if next(groupcaps) == nil then
|
||||
damage = true
|
||||
end
|
||||
for group, caps in pairs(groupcaps) do
|
||||
local maxlevel = caps.maxlevel or 0
|
||||
local diff = maxlevel - level
|
||||
if diff == 0 then
|
||||
diff = 1
|
||||
end
|
||||
if diff > 0 and caps.times then
|
||||
local group_level = damage_groups[group]
|
||||
if group_level then
|
||||
local time = caps.times[group_level]
|
||||
if time then
|
||||
local dt = time_from_last_punch or 0
|
||||
if dt > time / diff then
|
||||
if caps.uses then
|
||||
uses = caps.uses * math.pow(3, diff)
|
||||
end
|
||||
damage = true
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
if damage == true and recip == true and hitter and
|
||||
def.reciprocate_damage == true and uses > 0 then
|
||||
local item = hitter:get_wielded_item()
|
||||
if item and item:get_name() ~= "" then
|
||||
item:add_wear(65535 / uses)
|
||||
hitter:set_wielded_item(item)
|
||||
end
|
||||
-- reciprocate tool damage only once
|
||||
recip = false
|
||||
end
|
||||
end
|
||||
if damage == true and hitter == "fire" then
|
||||
damage = minetest.get_item_group(itemname, "flammable") > 0
|
||||
end
|
||||
if damage == true then
|
||||
self:damage(player, i, stack, use)
|
||||
set_state = self.def[name].state
|
||||
set_count = self.def[name].count
|
||||
end
|
||||
state = state + stack:get_wear()
|
||||
count = count + 1
|
||||
end
|
||||
end
|
||||
if set_count and set_count ~= count then
|
||||
state = set_state or state
|
||||
count = set_count or count
|
||||
end
|
||||
self.def[name].state = state
|
||||
self.def[name].count = count
|
||||
end
|
||||
|
||||
armor.damage = function(self, player, index, stack, use)
|
||||
local old_stack = ItemStack(stack)
|
||||
local worn_armor = armor:get_weared_armor_elements(player)
|
||||
local armor_worn_cnt = 0
|
||||
for k,v in pairs(worn_armor) do
|
||||
armor_worn_cnt = armor_worn_cnt + 1
|
||||
end
|
||||
use = math.ceil(use/armor_worn_cnt)
|
||||
stack:add_wear(use)
|
||||
self:run_callbacks("on_damage", player, index, stack)
|
||||
self:set_inventory_stack(player, index, stack)
|
||||
if stack:get_count() == 0 then
|
||||
self:run_callbacks("on_unequip", player, index, old_stack)
|
||||
self:run_callbacks("on_destroy", player, index, old_stack)
|
||||
self:set_player_armor(player)
|
||||
end
|
||||
end
|
||||
|
||||
armor.get_weared_armor_elements = function(self, player)
|
||||
local name, inv = self:get_valid_player(player, "[get_weared_armor]")
|
||||
local weared_armor = {}
|
||||
if not name then
|
||||
return
|
||||
end
|
||||
for i=1, inv:get_size("armor") do
|
||||
local item_name = inv:get_stack("armor", i):get_name()
|
||||
local element = self:get_element(item_name)
|
||||
if element ~= nil then
|
||||
weared_armor[element] = item_name
|
||||
end
|
||||
end
|
||||
return weared_armor
|
||||
end
|
||||
|
||||
armor.equip = function(self, player, itemstack)
|
||||
local name, armor_inv = self:get_valid_player(player, "[equip]")
|
||||
local weared_armor = self:get_weared_armor_elements(player)
|
||||
local armor_element = self:get_element(itemstack:get_name())
|
||||
if name and armor_element then
|
||||
if weared_armor[armor_element] ~= nil then
|
||||
self:unequip(player, armor_element)
|
||||
end
|
||||
armor_inv:add_item("armor", itemstack:take_item())
|
||||
self:set_player_armor(player)
|
||||
self:save_armor_inventory(player)
|
||||
end
|
||||
return itemstack
|
||||
end
|
||||
|
||||
armor.unequip = function(self, player, armor_element)
|
||||
local name, armor_inv = self:get_valid_player(player, "[unequip]")
|
||||
local weared_armor = self:get_weared_armor_elements(player)
|
||||
if not name or not weared_armor[armor_element] then
|
||||
return
|
||||
end
|
||||
local itemstack = armor_inv:remove_item("armor", ItemStack(weared_armor[armor_element]))
|
||||
minetest.after(0, function()
|
||||
local inv = player:get_inventory()
|
||||
if inv:room_for_item("main", itemstack) then
|
||||
inv:add_item("main", itemstack)
|
||||
else
|
||||
minetest.add_item(player:get_pos(), itemstack)
|
||||
end
|
||||
end)
|
||||
self:set_player_armor(player)
|
||||
self:save_armor_inventory(player)
|
||||
end
|
||||
|
||||
armor.remove_all = function(self, player)
|
||||
local name, inv = self:get_valid_player(player, "[remove_all]")
|
||||
if not name then
|
||||
return
|
||||
end
|
||||
inv:set_list("armor", {})
|
||||
self:set_player_armor(player)
|
||||
self:save_armor_inventory(player)
|
||||
end
|
||||
|
||||
armor.get_player_skin = function(self, name)
|
||||
if (self.skin_mod == "skins" or self.skin_mod == "simple_skins") and skins.skins[name] then
|
||||
return skins.skins[name]..".png"
|
||||
elseif self.skin_mod == "u_skins" and u_skins.u_skins[name] then
|
||||
return u_skins.u_skins[name]..".png"
|
||||
elseif self.skin_mod == "wardrobe" and wardrobe.playerSkins and wardrobe.playerSkins[name] then
|
||||
return wardrobe.playerSkins[name]
|
||||
end
|
||||
return armor.default_skin..".png"
|
||||
end
|
||||
|
||||
armor.update_skin = function(self, name)
|
||||
minetest.after(0, function()
|
||||
local pplayer = minetest.get_player_by_name(name)
|
||||
if pplayer then
|
||||
self.textures[name].skin = self:get_player_skin(name)
|
||||
self:set_player_armor(pplayer)
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
armor.add_preview = function(self, preview)
|
||||
skin_previews[preview] = true
|
||||
end
|
||||
|
||||
armor.get_preview = function(self, name)
|
||||
local preview = string.gsub(armor:get_player_skin(name), ".png", "_preview.png")
|
||||
if skin_previews[preview] then
|
||||
return preview
|
||||
end
|
||||
return "character_preview.png"
|
||||
end
|
||||
|
||||
armor.get_armor_formspec = function(self, name, listring)
|
||||
if armor.def[name].init_time == 0 then
|
||||
return "label[0,0;Armor not initialized!]"
|
||||
end
|
||||
local formspec = armor.formspec..
|
||||
"list[detached:"..name.."_armor;armor;0,0.5;2,3;]"
|
||||
if listring == true then
|
||||
formspec = formspec.."listring[current_player;main]"..
|
||||
"listring[detached:"..name.."_armor;armor]"
|
||||
end
|
||||
formspec = formspec:gsub("armor_preview", armor.textures[name].preview)
|
||||
formspec = formspec:gsub("armor_level", armor.def[name].level)
|
||||
for _, attr in pairs(self.attributes) do
|
||||
formspec = formspec:gsub("armor_attr_"..attr, armor.def[name][attr])
|
||||
end
|
||||
for group, _ in pairs(self.registered_groups) do
|
||||
formspec = formspec:gsub("armor_group_"..group,
|
||||
armor.def[name].groups[group])
|
||||
end
|
||||
return formspec
|
||||
end
|
||||
|
||||
armor.get_element = function(self, item_name)
|
||||
for _, element in pairs(armor.elements) do
|
||||
if minetest.get_item_group(item_name, "armor_"..element) > 0 then
|
||||
return element
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
armor.serialize_inventory_list = function(self, list)
|
||||
local list_table = {}
|
||||
for _, stack in ipairs(list) do
|
||||
table.insert(list_table, stack:to_string())
|
||||
end
|
||||
return minetest.serialize(list_table)
|
||||
end
|
||||
|
||||
armor.deserialize_inventory_list = function(self, list_string)
|
||||
local list_table = minetest.deserialize(list_string)
|
||||
local list = {}
|
||||
for _, stack in ipairs(list_table or {}) do
|
||||
table.insert(list, ItemStack(stack))
|
||||
end
|
||||
return list
|
||||
end
|
||||
|
||||
armor.load_armor_inventory = function(self, player)
|
||||
local _, inv = self:get_valid_player(player, "[load_armor_inventory]")
|
||||
if inv then
|
||||
local meta = player:get_meta()
|
||||
local armor_list_string = meta:get_string("3d_armor_inventory")
|
||||
if armor_list_string then
|
||||
inv:set_list("armor",
|
||||
self:deserialize_inventory_list(armor_list_string))
|
||||
return true
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
armor.save_armor_inventory = function(self, player)
|
||||
local _, inv = self:get_valid_player(player, "[save_armor_inventory]")
|
||||
if inv then
|
||||
local meta = player:get_meta()
|
||||
meta:set_string("3d_armor_inventory",
|
||||
self:serialize_inventory_list(inv:get_list("armor")))
|
||||
end
|
||||
end
|
||||
|
||||
armor.update_inventory = function(self, player)
|
||||
-- DEPRECATED: Legacy inventory support
|
||||
end
|
||||
|
||||
armor.set_inventory_stack = function(self, player, i, stack)
|
||||
local _, inv = self:get_valid_player(player, "[set_inventory_stack]")
|
||||
if inv then
|
||||
inv:set_stack("armor", i, stack)
|
||||
self:save_armor_inventory(player)
|
||||
end
|
||||
end
|
||||
|
||||
armor.get_valid_player = function(self, player, msg)
|
||||
msg = msg or ""
|
||||
if not player then
|
||||
minetest.log("warning", ("3d_armor%s: Player reference is nil"):format(msg))
|
||||
return
|
||||
end
|
||||
local name = player:get_player_name()
|
||||
if not name then
|
||||
minetest.log("warning", ("3d_armor%s: Player name is nil"):format(msg))
|
||||
return
|
||||
end
|
||||
local inv = minetest.get_inventory({type="detached", name=name.."_armor"})
|
||||
if not inv then
|
||||
-- This check may fail when called inside `on_joinplayer`
|
||||
-- in that case, the armor will be initialized/updated later on
|
||||
minetest.log("warning", ("3d_armor%s: Detached armor inventory is nil"):format(msg))
|
||||
return
|
||||
end
|
||||
return name, inv
|
||||
end
|
||||
|
||||
armor.drop_armor = function(pos, stack)
|
||||
local node = minetest.get_node_or_nil(pos)
|
||||
if node then
|
||||
local obj = minetest.add_item(pos, stack)
|
||||
if obj then
|
||||
obj:set_velocity({x=math.random(-1, 1), y=5, z=math.random(-1, 1)})
|
||||
end
|
||||
end
|
||||
end
|
65
mods/3d_armor/3d_armor/armor.conf.example
Normal file
@ -0,0 +1,65 @@
|
||||
-- DEPRECATED, will not be supported in future versions
|
||||
|
||||
-- See README.txt for new configuration options.
|
||||
|
||||
-- Armor Configuration (defaults)
|
||||
|
||||
-- You can remove any unwanted armor materials from this table.
|
||||
-- Note that existing armor that is removed will show up as an unknown item.
|
||||
ARMOR_MATERIALS = {
|
||||
wood = "group:wood",
|
||||
cactus = "default:cactus",
|
||||
steel = "default:steel_ingot",
|
||||
bronze = "default:bronze_ingot",
|
||||
diamond = "default:diamond",
|
||||
gold = "default:gold_ingot",
|
||||
mithril = "moreores:mithril_ingot",
|
||||
crystal = "ethereal:crystal_ingot",
|
||||
}
|
||||
|
||||
-- Enable fire protection (defaults true if using ethereal mod)
|
||||
ARMOR_FIRE_PROTECT = false
|
||||
|
||||
-- Fire protection nodes, (name, protection level, damage)
|
||||
ARMOR_FIRE_NODES = {
|
||||
{"default:lava_source", 5, 4},
|
||||
{"default:lava_flowing", 5, 4},
|
||||
{"fire:basic_flame", 3, 4},
|
||||
{"fire:permanent_flame", 3, 4},
|
||||
{"ethereal:crystal_spike", 2, 1},
|
||||
{"ethereal:fire_flower", 2, 1},
|
||||
{"default:torch", 1, 1},
|
||||
}
|
||||
|
||||
-- Increase this if you get initialization glitches when a player first joins.
|
||||
ARMOR_INIT_DELAY = 1
|
||||
|
||||
-- Number of initialization attempts.
|
||||
-- Use in conjunction with ARMOR_INIT_DELAY if initialization problems persist.
|
||||
ARMOR_INIT_TIMES = 1
|
||||
|
||||
-- Increase this if armor is not getting into bones due to server lag.
|
||||
ARMOR_BONES_DELAY = 1
|
||||
|
||||
-- How often player armor/wield items are updated.
|
||||
ARMOR_UPDATE_TIME = 1
|
||||
|
||||
-- Drop armor when a player dies.
|
||||
-- Uses bones mod if present, otherwise items are dropped around the player.
|
||||
ARMOR_DROP = true
|
||||
|
||||
-- Pulverise armor when a player dies, overrides ARMOR_DROP.
|
||||
ARMOR_DESTROY = false
|
||||
|
||||
-- You can use this to increase or decrease overall armor effectiveness,
|
||||
-- eg: ARMOR_LEVEL_MULTIPLIER = 0.5 will reduce armor level by half.
|
||||
ARMOR_LEVEL_MULTIPLIER = 1
|
||||
|
||||
-- You can use this to increase or decrease overall armor healing,
|
||||
-- eg: ARMOR_HEAL_MULTIPLIER = 0 will disable healing altogether.
|
||||
ARMOR_HEAL_MULTIPLIER = 1
|
||||
|
||||
-- You can use this to increase or decrease overall armor radiation protection,
|
||||
-- eg: ARMOR_RADIATION_MULTIPLIER = 0 will completely disable radiation protection.
|
||||
-- Note: patched technic mod is required
|
||||
ARMOR_RADIATION_MULTIPLIER = 1
|
372
mods/3d_armor/3d_armor/armor.lua
Normal file
@ -0,0 +1,372 @@
|
||||
-- support for i18n
|
||||
local S = armor.get_translator
|
||||
|
||||
armor:register_armor("3d_armor:helmet_admin", {
|
||||
description = S("Admin Helmet"),
|
||||
inventory_image = "3d_armor_inv_helmet_admin.png",
|
||||
armor_groups = {fleshy=100},
|
||||
groups = {armor_head=1, armor_heal=100, armor_use=0, armor_water=1,
|
||||
not_in_creative_inventory=1},
|
||||
on_drop = function(itemstack, dropper, pos)
|
||||
return
|
||||
end,
|
||||
})
|
||||
|
||||
armor:register_armor("3d_armor:chestplate_admin", {
|
||||
description = S("Admin Chestplate"),
|
||||
inventory_image = "3d_armor_inv_chestplate_admin.png",
|
||||
armor_groups = {fleshy=100},
|
||||
groups = {armor_torso=1, armor_heal=100, armor_use=0,
|
||||
not_in_creative_inventory=1},
|
||||
on_drop = function(itemstack, dropper, pos)
|
||||
return
|
||||
end,
|
||||
})
|
||||
|
||||
armor:register_armor("3d_armor:leggings_admin", {
|
||||
description = S("Admin Leggings"),
|
||||
inventory_image = "3d_armor_inv_leggings_admin.png",
|
||||
armor_groups = {fleshy=100},
|
||||
groups = {armor_legs=1, armor_heal=100, armor_use=0,
|
||||
not_in_creative_inventory=1},
|
||||
on_drop = function(itemstack, dropper, pos)
|
||||
return
|
||||
end,
|
||||
})
|
||||
|
||||
armor:register_armor("3d_armor:boots_admin", {
|
||||
description = S("Admin Boots"),
|
||||
inventory_image = "3d_armor_inv_boots_admin.png",
|
||||
armor_groups = {fleshy=100},
|
||||
groups = {armor_feet=1, armor_heal=100, armor_use=0,
|
||||
not_in_creative_inventory=1},
|
||||
on_drop = function(itemstack, dropper, pos)
|
||||
return
|
||||
end,
|
||||
})
|
||||
|
||||
minetest.register_alias("adminboots", "3d_armor:boots_admin")
|
||||
minetest.register_alias("adminhelmet", "3d_armor:helmet_admin")
|
||||
minetest.register_alias("adminchestplate", "3d_armor:chestplate_admin")
|
||||
minetest.register_alias("adminleggings", "3d_armor:leggings_admin")
|
||||
|
||||
if armor.materials.wood then
|
||||
armor:register_armor("3d_armor:helmet_wood", {
|
||||
description = S("Wood Helmet"),
|
||||
inventory_image = "3d_armor_inv_helmet_wood.png",
|
||||
groups = {armor_head=1, armor_heal=0, armor_use=2000, flammable=1},
|
||||
armor_groups = {fleshy=5},
|
||||
damage_groups = {cracky=3, snappy=2, choppy=3, crumbly=2, level=1},
|
||||
})
|
||||
armor:register_armor("3d_armor:chestplate_wood", {
|
||||
description = S("Wood Chestplate"),
|
||||
inventory_image = "3d_armor_inv_chestplate_wood.png",
|
||||
groups = {armor_torso=1, armor_heal=0, armor_use=2000, flammable=1},
|
||||
armor_groups = {fleshy=10},
|
||||
damage_groups = {cracky=3, snappy=2, choppy=3, crumbly=2, level=1},
|
||||
})
|
||||
armor:register_armor("3d_armor:leggings_wood", {
|
||||
description = S("Wood Leggings"),
|
||||
inventory_image = "3d_armor_inv_leggings_wood.png",
|
||||
groups = {armor_legs=1, armor_heal=0, armor_use=2000, flammable=1},
|
||||
armor_groups = {fleshy=10},
|
||||
damage_groups = {cracky=3, snappy=2, choppy=3, crumbly=2, level=1},
|
||||
})
|
||||
armor:register_armor("3d_armor:boots_wood", {
|
||||
description = S("Wood Boots"),
|
||||
inventory_image = "3d_armor_inv_boots_wood.png",
|
||||
armor_groups = {fleshy=5},
|
||||
damage_groups = {cracky=3, snappy=2, choppy=3, crumbly=2, level=1},
|
||||
groups = {armor_feet=1, armor_heal=0, armor_use=2000, flammable=1},
|
||||
})
|
||||
local wood_armor_fuel = {
|
||||
helmet = 6,
|
||||
chestplate = 8,
|
||||
leggings = 7,
|
||||
boots = 5
|
||||
}
|
||||
for armor, burn in pairs(wood_armor_fuel) do
|
||||
minetest.register_craft({
|
||||
type = "fuel",
|
||||
recipe = "3d_armor:" .. armor .. "_wood",
|
||||
burntime = burn,
|
||||
})
|
||||
end
|
||||
end
|
||||
|
||||
if armor.materials.cactus then
|
||||
armor:register_armor("3d_armor:helmet_cactus", {
|
||||
description = S("Cactus Helmet"),
|
||||
inventory_image = "3d_armor_inv_helmet_cactus.png",
|
||||
groups = {armor_head=1, armor_heal=0, armor_use=1000},
|
||||
armor_groups = {fleshy=5},
|
||||
damage_groups = {cracky=3, snappy=3, choppy=2, crumbly=2, level=1},
|
||||
})
|
||||
armor:register_armor("3d_armor:chestplate_cactus", {
|
||||
description = S("Cactus Chestplate"),
|
||||
inventory_image = "3d_armor_inv_chestplate_cactus.png",
|
||||
groups = {armor_torso=1, armor_heal=0, armor_use=1000},
|
||||
armor_groups = {fleshy=10},
|
||||
damage_groups = {cracky=3, snappy=3, choppy=2, crumbly=2, level=1},
|
||||
})
|
||||
armor:register_armor("3d_armor:leggings_cactus", {
|
||||
description = S("Cactus Leggings"),
|
||||
inventory_image = "3d_armor_inv_leggings_cactus.png",
|
||||
groups = {armor_legs=1, armor_heal=0, armor_use=1000},
|
||||
armor_groups = {fleshy=10},
|
||||
damage_groups = {cracky=3, snappy=3, choppy=2, crumbly=2, level=1},
|
||||
})
|
||||
armor:register_armor("3d_armor:boots_cactus", {
|
||||
description = S("Cactus Boots"),
|
||||
inventory_image = "3d_armor_inv_boots_cactus.png",
|
||||
groups = {armor_feet=1, armor_heal=0, armor_use=1000},
|
||||
armor_groups = {fleshy=5},
|
||||
damage_groups = {cracky=3, snappy=3, choppy=2, crumbly=2, level=1},
|
||||
})
|
||||
local cactus_armor_fuel = {
|
||||
helmet = 14,
|
||||
chestplate = 16,
|
||||
leggings = 15,
|
||||
boots = 13
|
||||
}
|
||||
for armor, burn in pairs(cactus_armor_fuel) do
|
||||
minetest.register_craft({
|
||||
type = "fuel",
|
||||
recipe = "3d_armor:" .. armor .. "_cactus",
|
||||
burntime = burn,
|
||||
})
|
||||
end
|
||||
end
|
||||
|
||||
if armor.materials.steel then
|
||||
armor:register_armor("3d_armor:helmet_steel", {
|
||||
description = S("Steel Helmet"),
|
||||
inventory_image = "3d_armor_inv_helmet_steel.png",
|
||||
groups = {armor_head=1, armor_heal=0, armor_use=800,
|
||||
physics_speed=-0.01, physics_gravity=0.01},
|
||||
armor_groups = {fleshy=10},
|
||||
damage_groups = {cracky=2, snappy=3, choppy=2, crumbly=1, level=2},
|
||||
})
|
||||
armor:register_armor("3d_armor:chestplate_steel", {
|
||||
description = S("Steel Chestplate"),
|
||||
inventory_image = "3d_armor_inv_chestplate_steel.png",
|
||||
groups = {armor_torso=1, armor_heal=0, armor_use=800,
|
||||
physics_speed=-0.04, physics_gravity=0.04},
|
||||
armor_groups = {fleshy=15},
|
||||
damage_groups = {cracky=2, snappy=3, choppy=2, crumbly=1, level=2},
|
||||
})
|
||||
armor:register_armor("3d_armor:leggings_steel", {
|
||||
description = S("Steel Leggings"),
|
||||
inventory_image = "3d_armor_inv_leggings_steel.png",
|
||||
groups = {armor_legs=1, armor_heal=0, armor_use=800,
|
||||
physics_speed=-0.03, physics_gravity=0.03},
|
||||
armor_groups = {fleshy=15},
|
||||
damage_groups = {cracky=2, snappy=3, choppy=2, crumbly=1, level=2},
|
||||
})
|
||||
armor:register_armor("3d_armor:boots_steel", {
|
||||
description = S("Steel Boots"),
|
||||
inventory_image = "3d_armor_inv_boots_steel.png",
|
||||
groups = {armor_feet=1, armor_heal=0, armor_use=800,
|
||||
physics_speed=-0.01, physics_gravity=0.01},
|
||||
armor_groups = {fleshy=10},
|
||||
damage_groups = {cracky=2, snappy=3, choppy=2, crumbly=1, level=2},
|
||||
})
|
||||
end
|
||||
|
||||
if armor.materials.bronze then
|
||||
armor:register_armor("3d_armor:helmet_bronze", {
|
||||
description = S("Bronze Helmet"),
|
||||
inventory_image = "3d_armor_inv_helmet_bronze.png",
|
||||
groups = {armor_head=1, armor_heal=6, armor_use=400,
|
||||
physics_speed=-0.01, physics_gravity=0.01},
|
||||
armor_groups = {fleshy=10},
|
||||
damage_groups = {cracky=3, snappy=2, choppy=2, crumbly=1, level=2},
|
||||
})
|
||||
armor:register_armor("3d_armor:chestplate_bronze", {
|
||||
description = S("Bronze Chestplate"),
|
||||
inventory_image = "3d_armor_inv_chestplate_bronze.png",
|
||||
groups = {armor_torso=1, armor_heal=6, armor_use=400,
|
||||
physics_speed=-0.04, physics_gravity=0.04},
|
||||
armor_groups = {fleshy=15},
|
||||
damage_groups = {cracky=3, snappy=2, choppy=2, crumbly=1, level=2},
|
||||
})
|
||||
armor:register_armor("3d_armor:leggings_bronze", {
|
||||
description = S("Bronze Leggings"),
|
||||
inventory_image = "3d_armor_inv_leggings_bronze.png",
|
||||
groups = {armor_legs=1, armor_heal=6, armor_use=400,
|
||||
physics_speed=-0.03, physics_gravity=0.03},
|
||||
armor_groups = {fleshy=15},
|
||||
damage_groups = {cracky=3, snappy=2, choppy=2, crumbly=1, level=2},
|
||||
})
|
||||
armor:register_armor("3d_armor:boots_bronze", {
|
||||
description = S("Bronze Boots"),
|
||||
inventory_image = "3d_armor_inv_boots_bronze.png",
|
||||
groups = {armor_feet=1, armor_heal=6, armor_use=400,
|
||||
physics_speed=-0.01, physics_gravity=0.01},
|
||||
armor_groups = {fleshy=10},
|
||||
damage_groups = {cracky=3, snappy=2, choppy=2, crumbly=1, level=2},
|
||||
})
|
||||
end
|
||||
|
||||
if armor.materials.diamond then
|
||||
armor:register_armor("3d_armor:helmet_diamond", {
|
||||
description = S("Diamond Helmet"),
|
||||
inventory_image = "3d_armor_inv_helmet_diamond.png",
|
||||
groups = {armor_head=1, armor_heal=12, armor_use=200},
|
||||
armor_groups = {fleshy=15},
|
||||
damage_groups = {cracky=2, snappy=1, choppy=1, level=3},
|
||||
})
|
||||
armor:register_armor("3d_armor:chestplate_diamond", {
|
||||
description = S("Diamond Chestplate"),
|
||||
inventory_image = "3d_armor_inv_chestplate_diamond.png",
|
||||
groups = {armor_torso=1, armor_heal=12, armor_use=200},
|
||||
armor_groups = {fleshy=20},
|
||||
damage_groups = {cracky=2, snappy=1, choppy=1, level=3},
|
||||
})
|
||||
armor:register_armor("3d_armor:leggings_diamond", {
|
||||
description = S("Diamond Leggings"),
|
||||
inventory_image = "3d_armor_inv_leggings_diamond.png",
|
||||
groups = {armor_legs=1, armor_heal=12, armor_use=200},
|
||||
armor_groups = {fleshy=20},
|
||||
damage_groups = {cracky=2, snappy=1, choppy=1, level=3},
|
||||
})
|
||||
armor:register_armor("3d_armor:boots_diamond", {
|
||||
description = S("Diamond Boots"),
|
||||
inventory_image = "3d_armor_inv_boots_diamond.png",
|
||||
groups = {armor_feet=1, armor_heal=12, armor_use=200},
|
||||
armor_groups = {fleshy=15},
|
||||
damage_groups = {cracky=2, snappy=1, choppy=1, level=3},
|
||||
})
|
||||
end
|
||||
|
||||
if armor.materials.gold then
|
||||
armor:register_armor("3d_armor:helmet_gold", {
|
||||
description = S("Gold Helmet"),
|
||||
inventory_image = "3d_armor_inv_helmet_gold.png",
|
||||
groups = {armor_head=1, armor_heal=6, armor_use=300,
|
||||
physics_speed=-0.02, physics_gravity=0.02},
|
||||
armor_groups = {fleshy=10},
|
||||
damage_groups = {cracky=1, snappy=2, choppy=2, crumbly=3, level=2},
|
||||
})
|
||||
armor:register_armor("3d_armor:chestplate_gold", {
|
||||
description = S("Gold Chestplate"),
|
||||
inventory_image = "3d_armor_inv_chestplate_gold.png",
|
||||
groups = {armor_torso=1, armor_heal=6, armor_use=300,
|
||||
physics_speed=-0.05, physics_gravity=0.05},
|
||||
armor_groups = {fleshy=15},
|
||||
damage_groups = {cracky=1, snappy=2, choppy=2, crumbly=3, level=2},
|
||||
})
|
||||
armor:register_armor("3d_armor:leggings_gold", {
|
||||
description = S("Gold Leggings"),
|
||||
inventory_image = "3d_armor_inv_leggings_gold.png",
|
||||
groups = {armor_legs=1, armor_heal=6, armor_use=300,
|
||||
physics_speed=-0.04, physics_gravity=0.04},
|
||||
armor_groups = {fleshy=15},
|
||||
damage_groups = {cracky=1, snappy=2, choppy=2, crumbly=3, level=2},
|
||||
})
|
||||
armor:register_armor("3d_armor:boots_gold", {
|
||||
description = S("Gold Boots"),
|
||||
inventory_image = "3d_armor_inv_boots_gold.png",
|
||||
groups = {armor_feet=1, armor_heal=6, armor_use=300,
|
||||
physics_speed=-0.02, physics_gravity=0.02},
|
||||
armor_groups = {fleshy=10},
|
||||
damage_groups = {cracky=1, snappy=2, choppy=2, crumbly=3, level=2},
|
||||
})
|
||||
end
|
||||
|
||||
if armor.materials.mithril then
|
||||
armor:register_armor("3d_armor:helmet_mithril", {
|
||||
description = S("Mithril Helmet"),
|
||||
inventory_image = "3d_armor_inv_helmet_mithril.png",
|
||||
groups = {armor_head=1, armor_heal=12, armor_use=100},
|
||||
armor_groups = {fleshy=15},
|
||||
damage_groups = {cracky=2, snappy=1, level=3},
|
||||
})
|
||||
armor:register_armor("3d_armor:chestplate_mithril", {
|
||||
description = S("Mithril Chestplate"),
|
||||
inventory_image = "3d_armor_inv_chestplate_mithril.png",
|
||||
groups = {armor_torso=1, armor_heal=12, armor_use=100},
|
||||
armor_groups = {fleshy=20},
|
||||
damage_groups = {cracky=2, snappy=1, level=3},
|
||||
})
|
||||
armor:register_armor("3d_armor:leggings_mithril", {
|
||||
description = S("Mithril Leggings"),
|
||||
inventory_image = "3d_armor_inv_leggings_mithril.png",
|
||||
groups = {armor_legs=1, armor_heal=12, armor_use=100},
|
||||
armor_groups = {fleshy=20},
|
||||
damage_groups = {cracky=2, snappy=1, level=3},
|
||||
})
|
||||
armor:register_armor("3d_armor:boots_mithril", {
|
||||
description = S("Mithril Boots"),
|
||||
inventory_image = "3d_armor_inv_boots_mithril.png",
|
||||
groups = {armor_feet=1, armor_heal=12, armor_use=100},
|
||||
armor_groups = {fleshy=15},
|
||||
damage_groups = {cracky=2, snappy=1, level=3},
|
||||
})
|
||||
end
|
||||
|
||||
if armor.materials.crystal then
|
||||
armor:register_armor("3d_armor:helmet_crystal", {
|
||||
description = S("Crystal Helmet"),
|
||||
inventory_image = "3d_armor_inv_helmet_crystal.png",
|
||||
groups = {armor_head=1, armor_heal=12, armor_use=100, armor_fire=1},
|
||||
armor_groups = {fleshy=15},
|
||||
damage_groups = {cracky=2, snappy=1, level=3},
|
||||
})
|
||||
armor:register_armor("3d_armor:chestplate_crystal", {
|
||||
description = S("Crystal Chestplate"),
|
||||
inventory_image = "3d_armor_inv_chestplate_crystal.png",
|
||||
groups = {armor_torso=1, armor_heal=12, armor_use=100, armor_fire=1},
|
||||
armor_groups = {fleshy=20},
|
||||
damage_groups = {cracky=2, snappy=1, level=3},
|
||||
})
|
||||
armor:register_armor("3d_armor:leggings_crystal", {
|
||||
description = S("Crystal Leggings"),
|
||||
inventory_image = "3d_armor_inv_leggings_crystal.png",
|
||||
groups = {armor_legs=1, armor_heal=12, armor_use=100, armor_fire=1},
|
||||
armor_groups = {fleshy=20},
|
||||
damage_groups = {cracky=2, snappy=1, level=3},
|
||||
})
|
||||
armor:register_armor("3d_armor:boots_crystal", {
|
||||
description = S("Crystal Boots"),
|
||||
inventory_image = "3d_armor_inv_boots_crystal.png",
|
||||
groups = {armor_feet=1, armor_heal=12, armor_use=100, physics_speed=1,
|
||||
physics_jump=0.5, armor_fire=1},
|
||||
armor_groups = {fleshy=15},
|
||||
damage_groups = {cracky=2, snappy=1, level=3},
|
||||
})
|
||||
end
|
||||
|
||||
for k, v in pairs(armor.materials) do
|
||||
minetest.register_craft({
|
||||
output = "3d_armor:helmet_"..k,
|
||||
recipe = {
|
||||
{v, v, v},
|
||||
{v, "", v},
|
||||
{"", "", ""},
|
||||
},
|
||||
})
|
||||
minetest.register_craft({
|
||||
output = "3d_armor:chestplate_"..k,
|
||||
recipe = {
|
||||
{v, "", v},
|
||||
{v, v, v},
|
||||
{v, v, v},
|
||||
},
|
||||
})
|
||||
minetest.register_craft({
|
||||
output = "3d_armor:leggings_"..k,
|
||||
recipe = {
|
||||
{v, v, v},
|
||||
{v, "", v},
|
||||
{v, "", v},
|
||||
},
|
||||
})
|
||||
minetest.register_craft({
|
||||
output = "3d_armor:boots_"..k,
|
||||
recipe = {
|
||||
{v, "", v},
|
||||
{v, "", v},
|
||||
},
|
||||
})
|
||||
end
|
79
mods/3d_armor/3d_armor/crafting_guide.txt
Normal file
@ -0,0 +1,79 @@
|
||||
3d_armor -- Crafting Guide
|
||||
--------------------------
|
||||
|
||||
Helmets:
|
||||
|
||||
+---+---+---+
|
||||
| X | X | X |
|
||||
+---+---+---+
|
||||
| X | | X |
|
||||
+---+---+---+
|
||||
| | | |
|
||||
+---+---+---+
|
||||
|
||||
[3d_armor:helmet_wood] X = [default:wood]
|
||||
[3d_armor:helmet_cactus] X = [default:cactus]
|
||||
[3d_armor:helmet_steel] X = [default:steel_ingot]
|
||||
[3d_armor:helmet_bronze] X = [default:bronze_ingot]
|
||||
[3d_armor:helmet_diamond] X = [default:diamond]
|
||||
[3d_armor:helmet_gold] X = [default:gold_ingot]
|
||||
[3d_armor:helmet_mithril] X = [moreores:mithril_ingot] *
|
||||
[3d_armor:helmet_crystal] X = [ethereal:crystal_ingot] **
|
||||
|
||||
Chestplates:
|
||||
|
||||
+---+---+---+
|
||||
| X | | X |
|
||||
+---+---+---+
|
||||
| X | X | X |
|
||||
+---+---+---+
|
||||
| X | X | X |
|
||||
+---+---+---+
|
||||
|
||||
[3d_armor:chestplate_wood] X = [default:wood]
|
||||
[3d_armor:chestplate_cactus] X = [default:cactus]
|
||||
[3d_armor:chestplate_steel] X = [default:steel_ingot]
|
||||
[3d_armor:chestplate_bronze] X = [default:bronze_ingot]
|
||||
[3d_armor:chestplate_diamond] X = [default:diamond]
|
||||
[3d_armor:chestplate_gold] X = [default:gold_ingot]
|
||||
[3d_armor:chestplate_mithril] X = [moreores:mithril_ingot] *
|
||||
[3d_armor:chestplate_crystal] X = [ethereal:crystal_ingot] **
|
||||
|
||||
Leggings:
|
||||
|
||||
+---+---+---+
|
||||
| X | X | X |
|
||||
+---+---+---+
|
||||
| X | | X |
|
||||
+---+---+---+
|
||||
| X | | X |
|
||||
+---+---+---+
|
||||
|
||||
[3d_armor:leggings_wood] X = [default:wood]
|
||||
[3d_armor:leggings_cactus] X = [default:cactus]
|
||||
[3d_armor:leggings_steel] X = [default:steel_ingot]
|
||||
[3d_armor:leggings_bronze] X = [default:bronze_ingot]
|
||||
[3d_armor:leggings_diamond] X = [default:diamond]
|
||||
[3d_armor:leggings_gold] X = [default:gold_ingot]
|
||||
[3d_armor:leggings_mithril] X = [moreores:mithril_ingot] *
|
||||
[3d_armor:leggings_crystal] X = [ethereal:crystal_ingot] **
|
||||
|
||||
Boots:
|
||||
|
||||
+---+---+---+
|
||||
| X | | X |
|
||||
+---+---+---+
|
||||
| X | | X |
|
||||
+---+---+---+
|
||||
|
||||
[3d_armor:boots_wood] X = [default:wood]
|
||||
[3d_armor:boots_cactus] X = [default:cactus]
|
||||
[3d_armor:boots_steel] X = [default:steel_ingot]
|
||||
[3d_armor:boots_bronze] X = [default:bronze_ingot
|
||||
[3d_armor:boots_diamond] X = [default:diamond]
|
||||
[3d_armor:boots_gold] X = [default:gold_ingot]
|
||||
[3d_armor:boots_mithril] X = [moreores:mithril_ingot] *
|
||||
[3d_armor:boots_crystal] X = [ethereal:crystal_ingot] **
|
||||
|
||||
* Requires moreores mod by Calinou - https://forum.minetest.net/viewtopic.php?id=549
|
||||
** Requires ethereal mod by Chinchow & TenPlus1 - https://github.com/tenplus1/ethereal
|
8
mods/3d_armor/3d_armor/depends.txt
Normal file
@ -0,0 +1,8 @@
|
||||
default
|
||||
player_monoids?
|
||||
armor_monoid?
|
||||
pova?
|
||||
fire?
|
||||
ethereal?
|
||||
bakedclay?
|
||||
moreores?
|
1
mods/3d_armor/3d_armor/description.txt
Normal file
@ -0,0 +1 @@
|
||||
Adds craftable armor that is visible to other players.
|
504
mods/3d_armor/3d_armor/init.lua
Normal file
@ -0,0 +1,504 @@
|
||||
local modname = minetest.get_current_modname()
|
||||
local modpath = minetest.get_modpath(modname)
|
||||
local worldpath = minetest.get_worldpath()
|
||||
local last_punch_time = {}
|
||||
local pending_players = {}
|
||||
local timer = 0
|
||||
|
||||
dofile(modpath.."/api.lua")
|
||||
|
||||
-- local functions
|
||||
local F = minetest.formspec_escape
|
||||
local S = armor.get_translator
|
||||
|
||||
-- integration test
|
||||
if minetest.settings:get_bool("enable_3d_armor_integration_test") then
|
||||
dofile(modpath.."/integration_test.lua")
|
||||
end
|
||||
|
||||
|
||||
-- Legacy Config Support
|
||||
|
||||
local input = io.open(modpath.."/armor.conf", "r")
|
||||
if input then
|
||||
dofile(modpath.."/armor.conf")
|
||||
input:close()
|
||||
end
|
||||
input = io.open(worldpath.."/armor.conf", "r")
|
||||
if input then
|
||||
dofile(worldpath.."/armor.conf")
|
||||
input:close()
|
||||
end
|
||||
for name, _ in pairs(armor.config) do
|
||||
local global = "ARMOR_"..name:upper()
|
||||
if minetest.global_exists(global) then
|
||||
armor.config[name] = _G[global]
|
||||
end
|
||||
end
|
||||
if minetest.global_exists("ARMOR_MATERIALS") then
|
||||
armor.materials = table.copy(ARMOR_MATERIALS)
|
||||
end
|
||||
if minetest.global_exists("ARMOR_FIRE_NODES") then
|
||||
armor.fire_nodes = table.copy(ARMOR_FIRE_NODES)
|
||||
end
|
||||
|
||||
-- Load Configuration
|
||||
|
||||
for name, config in pairs(armor.config) do
|
||||
local setting = minetest.settings:get("armor_"..name)
|
||||
if type(config) == "number" then
|
||||
setting = tonumber(setting)
|
||||
elseif type(config) == "string" then
|
||||
setting = tostring(setting)
|
||||
elseif type(config) == "boolean" then
|
||||
setting = minetest.settings:get_bool("armor_"..name)
|
||||
end
|
||||
if setting ~= nil then
|
||||
armor.config[name] = setting
|
||||
end
|
||||
end
|
||||
for material, _ in pairs(armor.materials) do
|
||||
local key = "material_"..material
|
||||
if armor.config[key] == false then
|
||||
armor.materials[material] = nil
|
||||
end
|
||||
end
|
||||
|
||||
-- Convert set_elements to a Lua table splitting on blank spaces
|
||||
local t_set_elements = armor.config.set_elements
|
||||
armor.config.set_elements = string.split(t_set_elements, " ")
|
||||
|
||||
-- Remove torch damage if fire_protect_torch == false
|
||||
if armor.config.fire_protect_torch == false and armor.config.fire_protect == true then
|
||||
for k,v in pairs(armor.fire_nodes) do
|
||||
for k2,v2 in pairs(v) do
|
||||
if string.find (v2,"torch") then
|
||||
armor.fire_nodes[k] = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- Mod Compatibility
|
||||
|
||||
if minetest.get_modpath("technic") then
|
||||
armor.formspec = armor.formspec..
|
||||
"label[5,2.5;"..F(S("Radiation"))..": armor_group_radiation]"
|
||||
armor:register_armor_group("radiation")
|
||||
end
|
||||
local skin_mods = {"skins", "u_skins", "simple_skins", "wardrobe"}
|
||||
for _, mod in pairs(skin_mods) do
|
||||
local path = minetest.get_modpath(mod)
|
||||
if path then
|
||||
local dir_list = minetest.get_dir_list(path.."/textures")
|
||||
for _, fn in pairs(dir_list) do
|
||||
if fn:find("_preview.png$") then
|
||||
armor:add_preview(fn)
|
||||
end
|
||||
end
|
||||
armor.skin_mod = mod
|
||||
end
|
||||
end
|
||||
if not minetest.get_modpath("moreores") then
|
||||
armor.materials.mithril = nil
|
||||
end
|
||||
if not minetest.get_modpath("ethereal") then
|
||||
armor.materials.crystal = nil
|
||||
end
|
||||
|
||||
dofile(modpath.."/armor.lua")
|
||||
|
||||
-- Armor Initialization
|
||||
|
||||
armor.formspec = armor.formspec..
|
||||
"label[5,1;"..F(S("Level"))..": armor_level]"..
|
||||
"label[5,1.5;"..F(S("Heal"))..": armor_attr_heal]"
|
||||
if armor.config.fire_protect then
|
||||
armor.formspec = armor.formspec.."label[5,2;"..F(S("Fire"))..": armor_attr_fire]"
|
||||
end
|
||||
armor:register_on_damage(function(player, index, stack)
|
||||
local name = player:get_player_name()
|
||||
local def = stack:get_definition()
|
||||
if name and def and def.description and stack:get_wear() > 60100 then
|
||||
minetest.chat_send_player(name, S("Your @1 is almost broken!", def.description))
|
||||
minetest.sound_play("default_tool_breaks", {to_player = name, gain = 2.0})
|
||||
end
|
||||
end)
|
||||
armor:register_on_destroy(function(player, index, stack)
|
||||
local name = player:get_player_name()
|
||||
local def = stack:get_definition()
|
||||
if name and def and def.description then
|
||||
minetest.chat_send_player(name, S("Your @1 got destroyed!", def.description))
|
||||
minetest.sound_play("default_tool_breaks", {to_player = name, gain = 2.0})
|
||||
end
|
||||
end)
|
||||
|
||||
local function validate_armor_inventory(player)
|
||||
-- Workaround for detached inventory swap exploit
|
||||
local _, inv = armor:get_valid_player(player, "[validate_armor_inventory]")
|
||||
local pos = player:get_pos()
|
||||
if not inv then
|
||||
return
|
||||
end
|
||||
local armor_prev = {}
|
||||
local attribute_meta = player:get_meta() -- I know, the function's name is weird but let it be like that. ;)
|
||||
local armor_list_string = attribute_meta:get_string("3d_armor_inventory")
|
||||
if armor_list_string then
|
||||
local armor_list = armor:deserialize_inventory_list(armor_list_string)
|
||||
for i, stack in ipairs(armor_list) do
|
||||
if stack:get_count() > 0 then
|
||||
armor_prev[stack:get_name()] = i
|
||||
end
|
||||
end
|
||||
end
|
||||
local elements = {}
|
||||
local player_inv = player:get_inventory()
|
||||
for i = 1, 6 do
|
||||
local stack = inv:get_stack("armor", i)
|
||||
if stack:get_count() > 0 then
|
||||
local item = stack:get_name()
|
||||
local element = armor:get_element(item)
|
||||
if element and not elements[element] then
|
||||
if armor_prev[item] then
|
||||
armor_prev[item] = nil
|
||||
else
|
||||
-- Item was not in previous inventory
|
||||
armor:run_callbacks("on_equip", player, i, stack)
|
||||
end
|
||||
elements[element] = true;
|
||||
else
|
||||
inv:remove_item("armor", stack)
|
||||
minetest.item_drop(stack, player, pos)
|
||||
-- The following code returns invalid items to the player's main
|
||||
-- inventory but could open up the possibity for a hacked client
|
||||
-- to receive items back they never really had. I am not certain
|
||||
-- so remove the is_singleplayer check at your own risk :]
|
||||
if minetest.is_singleplayer() and player_inv and
|
||||
player_inv:room_for_item("main", stack) then
|
||||
player_inv:add_item("main", stack)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
for item, i in pairs(armor_prev) do
|
||||
local stack = ItemStack(item)
|
||||
-- Previous item is not in current inventory
|
||||
armor:run_callbacks("on_unequip", player, i, stack)
|
||||
end
|
||||
end
|
||||
|
||||
local function init_player_armor(initplayer)
|
||||
local name = initplayer:get_player_name()
|
||||
local pos = initplayer:get_pos()
|
||||
if not name or not pos then
|
||||
return false
|
||||
end
|
||||
local armor_inv = minetest.create_detached_inventory(name.."_armor", {
|
||||
on_put = function(inv, listname, index, stack, player)
|
||||
validate_armor_inventory(player)
|
||||
armor:save_armor_inventory(player)
|
||||
armor:set_player_armor(player)
|
||||
end,
|
||||
on_take = function(inv, listname, index, stack, player)
|
||||
validate_armor_inventory(player)
|
||||
armor:save_armor_inventory(player)
|
||||
armor:set_player_armor(player)
|
||||
end,
|
||||
on_move = function(inv, from_list, from_index, to_list, to_index, count, player)
|
||||
validate_armor_inventory(player)
|
||||
armor:save_armor_inventory(player)
|
||||
armor:set_player_armor(player)
|
||||
end,
|
||||
allow_put = function(inv, listname, index, put_stack, player)
|
||||
if player:get_player_name() ~= name then
|
||||
return 0
|
||||
end
|
||||
local element = armor:get_element(put_stack:get_name())
|
||||
if not element then
|
||||
return 0
|
||||
end
|
||||
for i = 1, 6 do
|
||||
local stack = inv:get_stack("armor", i)
|
||||
local def = stack:get_definition() or {}
|
||||
if def.groups and def.groups["armor_"..element]
|
||||
and i ~= index then
|
||||
return 0
|
||||
end
|
||||
end
|
||||
return 1
|
||||
end,
|
||||
allow_take = function(inv, listname, index, stack, player)
|
||||
if player:get_player_name() ~= name then
|
||||
return 0
|
||||
end
|
||||
return stack:get_count()
|
||||
end,
|
||||
allow_move = function(inv, from_list, from_index, to_list, to_index, count, player)
|
||||
if player:get_player_name() ~= name then
|
||||
return 0
|
||||
end
|
||||
return count
|
||||
end,
|
||||
}, name)
|
||||
armor_inv:set_size("armor", 6)
|
||||
if not armor:load_armor_inventory(initplayer) and armor.migrate_old_inventory then
|
||||
local player_inv = initplayer:get_inventory()
|
||||
player_inv:set_size("armor", 6)
|
||||
for i=1, 6 do
|
||||
local stack = player_inv:get_stack("armor", i)
|
||||
armor_inv:set_stack("armor", i, stack)
|
||||
end
|
||||
armor:save_armor_inventory(initplayer)
|
||||
player_inv:set_size("armor", 0)
|
||||
end
|
||||
for i=1, 6 do
|
||||
local stack = armor_inv:get_stack("armor", i)
|
||||
if stack:get_count() > 0 then
|
||||
armor:run_callbacks("on_equip", initplayer, i, stack)
|
||||
end
|
||||
end
|
||||
armor.def[name] = {
|
||||
init_time = minetest.get_gametime(),
|
||||
level = 0,
|
||||
state = 0,
|
||||
count = 0,
|
||||
groups = {},
|
||||
}
|
||||
for _, phys in pairs(armor.physics) do
|
||||
armor.def[name][phys] = 1
|
||||
end
|
||||
for _, attr in pairs(armor.attributes) do
|
||||
armor.def[name][attr] = 0
|
||||
end
|
||||
for group, _ in pairs(armor.registered_groups) do
|
||||
armor.def[name].groups[group] = 0
|
||||
end
|
||||
local skin = armor:get_player_skin(name)
|
||||
armor.textures[name] = {
|
||||
skin = skin,
|
||||
armor = "3d_armor_trans.png",
|
||||
wielditem = "3d_armor_trans.png",
|
||||
preview = armor.default_skin.."_preview.png",
|
||||
}
|
||||
local texture_path = minetest.get_modpath("player_textures")
|
||||
if texture_path then
|
||||
local dir_list = minetest.get_dir_list(texture_path.."/textures")
|
||||
for _, fn in pairs(dir_list) do
|
||||
if fn == "player_"..name..".png" then
|
||||
armor.textures[name].skin = fn
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
armor:set_player_armor(initplayer)
|
||||
return true
|
||||
end
|
||||
|
||||
-- Armor Player Model
|
||||
|
||||
default.player_register_model("3d_armor_character.b3d", {
|
||||
animation_speed = 30,
|
||||
textures = {
|
||||
armor.default_skin..".png",
|
||||
"3d_armor_trans.png",
|
||||
"3d_armor_trans.png",
|
||||
},
|
||||
animations = {
|
||||
stand = {x=0, y=79},
|
||||
lay = {x=162, y=166},
|
||||
walk = {x=168, y=187},
|
||||
mine = {x=189, y=198},
|
||||
walk_mine = {x=200, y=219},
|
||||
sit = {x=81, y=160},
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||
local name = armor:get_valid_player(player, "[on_player_receive_fields]")
|
||||
if not name then
|
||||
return
|
||||
end
|
||||
local player_name = player:get_player_name()
|
||||
for field, _ in pairs(fields) do
|
||||
if string.find(field, "skins_set") then
|
||||
armor:update_skin(player_name)
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
minetest.register_on_joinplayer(function(player)
|
||||
default.player_set_model(player, "3d_armor_character.b3d")
|
||||
local player_name = player:get_player_name()
|
||||
|
||||
minetest.after(0, function()
|
||||
-- TODO: Added in 7566ecc - What's the prupose?
|
||||
local pplayer = minetest.get_player_by_name(player_name)
|
||||
if pplayer and init_player_armor(pplayer) == false then
|
||||
pending_players[pplayer] = 0
|
||||
end
|
||||
end)
|
||||
end)
|
||||
|
||||
minetest.register_on_leaveplayer(function(player)
|
||||
local name = player:get_player_name()
|
||||
if name then
|
||||
armor.def[name] = nil
|
||||
armor.textures[name] = nil
|
||||
end
|
||||
pending_players[player] = nil
|
||||
end)
|
||||
|
||||
if armor.config.drop == true or armor.config.destroy == true then
|
||||
minetest.register_on_dieplayer(function(player)
|
||||
local name, armor_inv = armor:get_valid_player(player, "[on_dieplayer]")
|
||||
if not name then
|
||||
return
|
||||
end
|
||||
local drop = {}
|
||||
for i=1, armor_inv:get_size("armor") do
|
||||
local stack = armor_inv:get_stack("armor", i)
|
||||
if stack:get_count() > 0 then
|
||||
table.insert(drop, stack)
|
||||
armor:run_callbacks("on_unequip", player, i, stack)
|
||||
armor_inv:set_stack("armor", i, nil)
|
||||
end
|
||||
end
|
||||
armor:save_armor_inventory(player)
|
||||
armor:set_player_armor(player)
|
||||
local pos = player:get_pos()
|
||||
if pos and armor.config.destroy == false then
|
||||
minetest.after(armor.config.bones_delay, function()
|
||||
local meta = nil
|
||||
local maxp = vector.add(pos, 16)
|
||||
local minp = vector.subtract(pos, 16)
|
||||
local bones = minetest.find_nodes_in_area(minp, maxp, {"bones:bones"})
|
||||
for _, p in pairs(bones) do
|
||||
local m = minetest.get_meta(p)
|
||||
if m:get_string("owner") == name then
|
||||
meta = m
|
||||
break
|
||||
end
|
||||
end
|
||||
if meta then
|
||||
local inv = meta:get_inventory()
|
||||
for _,stack in ipairs(drop) do
|
||||
if inv:room_for_item("main", stack) then
|
||||
inv:add_item("main", stack)
|
||||
else
|
||||
armor.drop_armor(pos, stack)
|
||||
end
|
||||
end
|
||||
else
|
||||
for _,stack in ipairs(drop) do
|
||||
armor.drop_armor(pos, stack)
|
||||
end
|
||||
end
|
||||
end)
|
||||
end
|
||||
end)
|
||||
else -- reset un-dropped armor and it's effects
|
||||
minetest.register_on_respawnplayer(function(player)
|
||||
armor:set_player_armor(player)
|
||||
end)
|
||||
end
|
||||
|
||||
if armor.config.punch_damage == true then
|
||||
minetest.register_on_punchplayer(function(player, hitter,
|
||||
time_from_last_punch, tool_capabilities)
|
||||
local name = player:get_player_name()
|
||||
local hit_ip = hitter:is_player()
|
||||
if name and hit_ip and minetest.is_protected(player:get_pos(), "") then
|
||||
return
|
||||
elseif name then
|
||||
armor:punch(player, hitter, time_from_last_punch, tool_capabilities)
|
||||
last_punch_time[name] = minetest.get_gametime()
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
minetest.register_on_player_hpchange(function(player, hp_change, reason)
|
||||
if player and reason.type ~= "drown" and reason.hunger == nil
|
||||
and hp_change < 0 then
|
||||
local name = player:get_player_name()
|
||||
if name then
|
||||
local heal = armor.def[name].heal
|
||||
if heal >= math.random(100) then
|
||||
hp_change = 0
|
||||
end
|
||||
-- check if armor damage was handled by fire or on_punchplayer
|
||||
local time = last_punch_time[name] or 0
|
||||
if time == 0 or time + 1 < minetest.get_gametime() then
|
||||
armor:punch(player)
|
||||
end
|
||||
end
|
||||
end
|
||||
return hp_change
|
||||
end, true)
|
||||
|
||||
minetest.register_globalstep(function(dtime)
|
||||
timer = timer + dtime
|
||||
if timer <= armor.config.init_delay then
|
||||
return
|
||||
end
|
||||
timer = 0
|
||||
|
||||
for player, count in pairs(pending_players) do
|
||||
local remove = init_player_armor(player) == true
|
||||
pending_players[player] = count + 1
|
||||
if remove == false and count > armor.config.init_times then
|
||||
minetest.log("warning", S("3d_armor: Failed to initialize player"))
|
||||
remove = true
|
||||
end
|
||||
if remove == true then
|
||||
pending_players[player] = nil
|
||||
end
|
||||
end
|
||||
|
||||
-- water breathing protection, added by TenPlus1
|
||||
if armor.config.water_protect == true then
|
||||
for _,player in pairs(minetest.get_connected_players()) do
|
||||
local name = player:get_player_name()
|
||||
if armor.def[name].water > 0 and
|
||||
player:get_breath() < 10 then
|
||||
player:set_breath(10)
|
||||
end
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
-- Fire Protection, added by TenPlus1.
|
||||
if armor.config.fire_protect == true then
|
||||
-- override any hot nodes that do not already deal damage
|
||||
for _, row in pairs(armor.fire_nodes) do
|
||||
if minetest.registered_nodes[row[1]] then
|
||||
local damage = minetest.registered_nodes[row[1]].damage_per_second
|
||||
if not damage or damage == 0 then
|
||||
minetest.override_item(row[1], {damage_per_second = row[3]})
|
||||
end
|
||||
end
|
||||
end
|
||||
else
|
||||
print ("[3d_armor] Fire Nodes disabled")
|
||||
end
|
||||
|
||||
if armor.config.fire_protect == true then
|
||||
minetest.register_on_player_hpchange(function(player, hp_change, reason)
|
||||
|
||||
if reason.type == "node_damage" and reason.node then
|
||||
-- fire protection
|
||||
if armor.config.fire_protect == true and hp_change < 0 then
|
||||
local name = player:get_player_name()
|
||||
for _,igniter in pairs(armor.fire_nodes) do
|
||||
if reason.node == igniter[1] then
|
||||
if armor.def[name].fire < igniter[2] then
|
||||
armor:punch(player, "fire")
|
||||
else
|
||||
hp_change = 0
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
return hp_change
|
||||
end, true)
|
||||
end
|
25
mods/3d_armor/3d_armor/integration_test.lua
Normal file
@ -0,0 +1,25 @@
|
||||
|
||||
minetest.log("warning", "[TEST] integration-test enabled!")
|
||||
|
||||
minetest.register_on_mods_loaded(function()
|
||||
minetest.after(1, function()
|
||||
|
||||
local data = minetest.write_json({ success = true }, true);
|
||||
local file = io.open(minetest.get_worldpath().."/integration_test.json", "w" );
|
||||
if file then
|
||||
file:write(data)
|
||||
file:close()
|
||||
end
|
||||
|
||||
file = io.open(minetest.get_worldpath().."/registered_nodes.txt", "w" );
|
||||
if file then
|
||||
for name in pairs(minetest.registered_nodes) do
|
||||
file:write(name .. '\n')
|
||||
end
|
||||
file:close()
|
||||
end
|
||||
|
||||
minetest.log("warning", "[TEST] integration tests done!")
|
||||
minetest.request_shutdown("success")
|
||||
end)
|
||||
end)
|
58
mods/3d_armor/3d_armor/locale/3d_armor.es.tr
Normal file
@ -0,0 +1,58 @@
|
||||
# textdomain: 3d_armor
|
||||
|
||||
|
||||
### api.lua ###
|
||||
|
||||
3d_armor: Detached armor inventory is nil @1=3d_armor: La armadura desconectada es nula @1
|
||||
3d_armor: Player name is nil @1=3d_armor: El nombre del jugador es nulo @1
|
||||
3d_armor: Player reference is nil @1=3d_armor: La referencia del jugador es nula @1
|
||||
|
||||
### armor.lua ###
|
||||
|
||||
Admin Boots=Botas de admin
|
||||
Admin Chestplate=Peto de admin
|
||||
Admin Helmet=Casco de admin
|
||||
Admin Leggings=Grebas de admin
|
||||
Bronze Boots=Botas de bronce
|
||||
Bronze Chestplate=Peto de bronce
|
||||
Bronze Helmet=Casco de bronce
|
||||
Bronze Leggings=Grebas de bronce
|
||||
Cactus Boots=Botas de cactus
|
||||
Cactus Chestplate=Peto de cactus
|
||||
Cactus Helmet=Casco de cactus
|
||||
Cactus Leggings=Grebas de cactus
|
||||
Crystal Boots=Botas de cristal
|
||||
Crystal Chestplate=Peto de cristal
|
||||
Crystal Helmet=Casco de cristal
|
||||
Crystal Leggings=Grebas de cristal
|
||||
Diamond Boots=Botas de diamante
|
||||
Diamond Chestplate=Peto de diamante
|
||||
Diamond Helmet=Casco de diamante
|
||||
Diamond Leggings=Grebas de diamante
|
||||
Gold Boots=Botas de oro
|
||||
Gold Chestplate=Peto de oro
|
||||
Gold Helmet=Casco de oro
|
||||
Gold Leggings=Grebas de oro
|
||||
Mithril Boots=Botas de mitrilo
|
||||
Mithril Chestplate=Peto de mitrilo
|
||||
Mithril Helmet=Casco de mitrilo
|
||||
Mithril Leggings=Grebas de mitrilo
|
||||
Steel Boots=Botas de acero
|
||||
Steel Chestplate=Peto de acero
|
||||
Steel Helmet=Casco de acero
|
||||
Steel Leggings=Grebas de acero
|
||||
Wood Boots=Botas de madera
|
||||
Wood Chestplate=Peto de madera
|
||||
Wood Helmet=Casco de madera
|
||||
Wood Leggings=Grebas de madera
|
||||
|
||||
### init.lua ###
|
||||
|
||||
3d_armor: Failed to initialize player=3d_armor: Fallo en la inicialización del jugador
|
||||
Fire=Fuego
|
||||
Heal=Salud
|
||||
Level=Nivel
|
||||
Radiation=Radiación
|
||||
Your @1 got destroyed!=¡Tu @1 fue destruído!
|
||||
Your @1 is almost broken!=¡Tu @1 esta a punto de romperse!
|
||||
[3d_armor] Fire Nodes disabled=[3d_armor] Nodos de fuego desabilitados
|
58
mods/3d_armor/3d_armor/locale/3d_armor.fr.tr
Normal file
@ -0,0 +1,58 @@
|
||||
# textdomain: 3d_armor
|
||||
|
||||
|
||||
### api.lua ###
|
||||
|
||||
3d_armor: Detached armor inventory is nil @1=3d_armor : Inventaire détaché pour l'armure non trouvé @1
|
||||
3d_armor: Player name is nil @1=3d_armor : Nom du joueur non trouvé @1
|
||||
3d_armor: Player reference is nil @1=3d_armor : Référence au joueur non trouvée @1
|
||||
|
||||
### armor.lua ###
|
||||
|
||||
Admin Boots=Bottes d'admin
|
||||
Admin Chestplate=Cuirasse d'admin
|
||||
Admin Helmet=Casque d'admin
|
||||
Admin Leggings=Jambières d'admin
|
||||
Bronze Boots=Bottes en bronze
|
||||
Bronze Chestplate=Cuirasse en bronze
|
||||
Bronze Helmet=Casque en bronze
|
||||
Bronze Leggings=Jambières en bronze
|
||||
Cactus Boots=Bottes en cactus
|
||||
Cactus Chestplate=Cuirasse en cactus
|
||||
Cactus Helmet=Casque en cactus
|
||||
Cactus Leggings=Jambières en cactus
|
||||
Crystal Boots=Bottes en cristal
|
||||
Crystal Chestplate=Cuirasse en cristal
|
||||
Crystal Helmet=Casque en cristal
|
||||
Crystal Leggings=Jambières en cristal
|
||||
Diamond Boots=Bottes en diamant
|
||||
Diamond Chestplate=Cuirasse en diamant
|
||||
Diamond Helmet=Casque en diamant
|
||||
Diamond Leggings=Jambières en diamant
|
||||
Gold Boots=Bottes en or
|
||||
Gold Chestplate=Cuirasse en or
|
||||
Gold Helmet=Casque en or
|
||||
Gold Leggings=Jambières en or
|
||||
Mithril Boots=Bottes en mithril
|
||||
Mithril Chestplate=Cuirasse en mithril
|
||||
Mithril Helmet=Casque en mithril
|
||||
Mithril Leggings=Jambières en mithril
|
||||
Steel Boots=Bottes en acier
|
||||
Steel Chestplate=Cuirasse en acier
|
||||
Steel Helmet=Casque en acier
|
||||
Steel Leggings=Jambières en acier
|
||||
Wood Boots=Bottes en bois
|
||||
Wood Chestplate=Cuirasse en bois
|
||||
Wood Helmet=Casque en bois
|
||||
Wood Leggings=Jambières en bois
|
||||
|
||||
### init.lua ###
|
||||
|
||||
3d_armor: Failed to initialize player=3d_armor : Impossible d'initialiser le joueur
|
||||
Fire=Fire
|
||||
Heal=Soins
|
||||
Level=Niveau
|
||||
Radiation=Radiation
|
||||
Your @1 got destroyed!=Une partie de votre armure a été détruite : @1 !
|
||||
Your @1 is almost broken!=Une partie de votre armure est presque détruite : @1 !
|
||||
[3d_armor] Fire Nodes disabled=[3d_armor] Nœuds de type feu désactivés
|
85
mods/3d_armor/3d_armor/locale/3d_armor.it.tr
Normal file
@ -0,0 +1,85 @@
|
||||
# textdomain: 3d_armor
|
||||
|
||||
|
||||
### api.lua ###
|
||||
|
||||
3d_armor: Detached armor inventory is nil @1=3d_armor: L'inventario separato dell'armatura è nullo @1
|
||||
3d_armor: Player name is nil @1=3d_armor: Il nome dell'utente è nullo @1
|
||||
3d_armor: Player reference is nil @1=3d_armor: Il riferimento all'utente è nullo @1
|
||||
|
||||
### armor.lua ###
|
||||
|
||||
Admin Boots=Stivali dell'amministratrice/tore
|
||||
Admin Chestplate=Corazza dell'amministratrice/tore
|
||||
Admin Helmet=Elmo dell'amministratrice/tore
|
||||
Admin Leggings=Gambali dell'amministratrice/tore
|
||||
Bronze Boots=Stivali di bronzo
|
||||
Bronze Chestplate=Corazza di bronzo
|
||||
Bronze Helmet=Elmo di bronzo
|
||||
Bronze Leggings=Gambali di bronzo
|
||||
Cactus Boots=Stivali di cactus
|
||||
Cactus Chestplate=Corazza di cactus
|
||||
Cactus Helmet=Elmo di cactus
|
||||
Cactus Leggings=Gambali di cactus
|
||||
Crystal Boots=Stivali di cristallo
|
||||
Crystal Chestplate=Corazza di cristallo
|
||||
Crystal Helmet=Elmo di cristallo
|
||||
Crystal Leggings=Gambali di cristallo
|
||||
Diamond Boots=Stivali di diamante
|
||||
Diamond Chestplate=Corazza di diamante
|
||||
Diamond Helmet=Elmo di diamante
|
||||
Diamond Leggings=Gambali di diamante
|
||||
Gold Boots=Stivali d'oro
|
||||
Gold Chestplate=Corazza d'oro
|
||||
Gold Helmet=Elmo d'oro
|
||||
Gold Leggings=Gambali d'oro
|
||||
Mithril Boots=Stivali di mithril
|
||||
Mithril Chestplate=Corazza di mithril
|
||||
Mithril Helmet=Elmo di mithril
|
||||
Mithril Leggings=Gambali di mithril
|
||||
Steel Boots=Stivali d'acciaio
|
||||
Steel Chestplate=Corazza d'acciaio
|
||||
Steel Helmet=Elmo d'acciaio
|
||||
Steel Leggings=Gambali d'acciaio
|
||||
Wood Boots=Stivali di legno
|
||||
Wood Chestplate=Corazza di legno
|
||||
Wood Helmet=Elmo di legno
|
||||
Wood Leggings=Gambali di legno
|
||||
|
||||
### init.lua ###
|
||||
|
||||
3d_armor: Failed to initialize player=3d_armor: Inizializzazione dell'utente fallita
|
||||
Fire=Fuoco
|
||||
Heal=Guarigione
|
||||
Level=Livello
|
||||
Radiation=Radiazione
|
||||
Your @1 got destroyed!=@1 in frantumi!
|
||||
Your @1 is almost broken!=@1 quasi in frantumi!
|
||||
[3d_armor] Fire Nodes disabled=[3d_armor] Nodi fuoco disabilitati
|
||||
|
||||
|
||||
##### not used anymore #####
|
||||
|
||||
3d_armor_ip: Mod loaded but unused.=3d_armor_ip: Mod caricata ma inutilizzata.
|
||||
Back=Indietro
|
||||
Armor=Armatura
|
||||
3d_armor_sfinv: Mod loaded but unused.=3d_armor_sfinv: Mod caricata ma inutilizzata.
|
||||
Armor stand top=Parte superiore del supporto per armatura
|
||||
Armor stand=Supporto per armatura
|
||||
Armor Stand=Supporto per armatura
|
||||
Locked Armor stand=Supporto per armatura chiuso a chiave
|
||||
Armor Stand (owned by @1)=Supporto per armatura (di proprietà di @1)
|
||||
3d_armor_ui: Mod loaded but unused.=3d_armor_ui: Mod caricata ma inutilizzata.
|
||||
3d Armor=Armatura 3D
|
||||
Armor not initialized!=Armatura non inizializzata!
|
||||
Admin Shield=Scudo dell'amministratrice/tore
|
||||
Wooden Shield=Scudo di legno
|
||||
Enhanced Wood Shield=Scudo di legno migliorato
|
||||
Cactus Shield=Scudo di cactus
|
||||
Enhanced Cactus Shield=Scudo di cactus migliorato
|
||||
Steel Shield=Scudo d'acciaio
|
||||
Bronze Shield=Scudo di bronzo
|
||||
Diamond Shield=Scudo di diamante
|
||||
Gold Shield=Scudo d'oro
|
||||
Mithril Shield=Scudo di mithril
|
||||
Crystal Shield=Scudo di cristallo
|
85
mods/3d_armor/3d_armor/locale/3d_armor.ms.tr
Normal file
@ -0,0 +1,85 @@
|
||||
# textdomain: 3d_armor
|
||||
|
||||
|
||||
### api.lua ###
|
||||
|
||||
3d_armor: Detached armor inventory is nil @1=3d_armor: Inventori perisai terpisah tiada nilai @1
|
||||
3d_armor: Player name is nil @1=3d_armor: Nama pemain tiada nilai @1
|
||||
3d_armor: Player reference is nil @1=3d_armor: Rujukan pemain tiada nilai @1
|
||||
|
||||
### armor.lua ###
|
||||
|
||||
Admin Boots=But Pentadbir
|
||||
Admin Chestplate=Perisai Dada Pentadbir
|
||||
Admin Helmet=Helmet Pentadbir
|
||||
Admin Leggings=Perisai Kaki Pentadbir
|
||||
Bronze Boots=But Gangsa
|
||||
Bronze Chestplate=Perisai Dada Gangsa
|
||||
Bronze Helmet=Helmet Gangsa
|
||||
Bronze Leggings=Perisai Kaki Gangsa
|
||||
Cactus Boots=But Kaktus
|
||||
Cactus Chestplate=Perisai Dada Kaktus
|
||||
Cactus Helmet=Helmet Kaktus
|
||||
Cactus Leggings=Perisai Kaki Kaktus
|
||||
Crystal Boots=But Kristal
|
||||
Crystal Chestplate=Perisai Dada Kristal
|
||||
Crystal Helmet=Helmet Kristal
|
||||
Crystal Leggings=Perisai Kaki Kristal
|
||||
Diamond Boots=But Intan
|
||||
Diamond Chestplate=Perisai Dada Intan
|
||||
Diamond Helmet=Helmet Intan
|
||||
Diamond Leggings=Perisai Kaki Intan
|
||||
Gold Boots=But Emas
|
||||
Gold Chestplate=Perisai Dada Emas
|
||||
Gold Helmet=Helmet Emas
|
||||
Gold Leggings=Perisai Kaki Emas
|
||||
Mithril Boots=But Mithril
|
||||
Mithril Chestplate=Perisai Dada Mithril
|
||||
Mithril Helmet=Helmet Mithril
|
||||
Mithril Leggings=Perisai Kaki Mithril
|
||||
Steel Boots=But Keluli
|
||||
Steel Chestplate=Perisai Dada Keluli
|
||||
Steel Helmet=Helmet Keluli
|
||||
Steel Leggings=Perisai Kaki Keluli
|
||||
Wood Boots=But Kayu
|
||||
Wood Chestplate=Perisai Dada Kayu
|
||||
Wood Helmet=Helmet Kayu
|
||||
Wood Leggings=Perisai Kaki Kayu
|
||||
|
||||
### init.lua ###
|
||||
|
||||
3d_armor: Failed to initialize player=3d_armor: Gagal mengasalkan pemain
|
||||
Fire=Api
|
||||
Heal=Pulih
|
||||
Level=Tahap
|
||||
Radiation=Radiasi
|
||||
Your @1 got destroyed!=@1 anda telah musnah!
|
||||
Your @1 is almost broken!=
|
||||
[3d_armor] Fire Nodes disabled=[3d_armor] Nod-nod Api dilumpuhkan
|
||||
|
||||
|
||||
##### not used anymore #####
|
||||
|
||||
3d_armor_ip: Mod loaded but unused.=3d_armor_ip: Mods dimuatkan tetapi tidak digunakan.
|
||||
Back=Kembali
|
||||
Armor=Perisai
|
||||
3d_armor_sfinv: Mod loaded but unused.=3d_armor_sfinv: Mods dimuatkan tetapi tidak digunakan.
|
||||
Armor stand top=Bhg atas dirian perisai
|
||||
Armor stand=Dirian perisai
|
||||
Armor Stand=Dirian Perisai
|
||||
Locked Armor stand=Dirian perisai Berkunci
|
||||
Armor Stand (owned by @1)=Dirian Perisai (milik @1)
|
||||
3d_armor_ui: Mod loaded but unused.=3d_armor_ui: Mods dimuatkan tetapi tidak digunakan.
|
||||
3d Armor=Perisai 3d
|
||||
Armor not initialized!=Perisai tidak diasalkan!
|
||||
Admin Shield=Perisai Pegang Pentadbir
|
||||
Wooden Shield=Perisai Pegang Kayu
|
||||
Enhanced Wood Shield=Perisai Pegang Kayu Kukuh
|
||||
Cactus Shield=Perisai Pegang Kaktus
|
||||
Enhanced Cactus Shield=Perisai Pegang Kaktus Kukuh
|
||||
Steel Shield=Perisai Pegang Keluli
|
||||
Bronze Shield=Perisai Pegang Gangsa
|
||||
Diamond Shield=Perisai Pegang Intan
|
||||
Gold Shield=Perisai Pegang Emas
|
||||
Mithril Shield=Perisai Pegang Mithril
|
||||
Crystal Shield=Perisai Pegang Kristal
|
85
mods/3d_armor/3d_armor/locale/3d_armor.pt.tr
Normal file
@ -0,0 +1,85 @@
|
||||
# textdomain: 3d_armor
|
||||
|
||||
|
||||
### api.lua ###
|
||||
|
||||
3d_armor: Detached armor inventory is nil @1=3d_armor: Inventario avulso de armadura é nulo @1
|
||||
3d_armor: Player name is nil @1=3d_armor: Nome de jogador é nulo @1
|
||||
3d_armor: Player reference is nil @1=3d_armor: Referência Jogador é nula @1
|
||||
|
||||
### armor.lua ###
|
||||
|
||||
Admin Boots=Botas de Administrador
|
||||
Admin Chestplate=Peitoral de Administrador
|
||||
Admin Helmet=Capacete de Administrador
|
||||
Admin Leggings=Calças de Administrador
|
||||
Bronze Boots=Botas de Bronze
|
||||
Bronze Chestplate=Peitoral de Bronze
|
||||
Bronze Helmet=Capacete de Bronze
|
||||
Bronze Leggings=Calças de Bronze
|
||||
Cactus Boots=Botas de Madeira
|
||||
Cactus Chestplate=Peitoral de Cacto
|
||||
Cactus Helmet=Capacete de Cacto
|
||||
Cactus Leggings=Calças de Cacto
|
||||
Crystal Boots=Botas de Cristal
|
||||
Crystal Chestplate=Peitoral de Cristal
|
||||
Crystal Helmet=Capacete de Cristal
|
||||
Crystal Leggings=Calças de Cristal
|
||||
Diamond Boots=Botas de Diamante
|
||||
Diamond Chestplate=Peitoral de Diamante
|
||||
Diamond Helmet=Capacete de Diamante
|
||||
Diamond Leggings=Calças de Diamante
|
||||
Gold Boots=Botas de Ouro
|
||||
Gold Chestplate=Peitoral de Ouro
|
||||
Gold Helmet=Capacete de Ouro
|
||||
Gold Leggings=Calças de Ouro
|
||||
Mithril Boots=Botas de Mithril
|
||||
Mithril Chestplate=Peitoral de Mithril
|
||||
Mithril Helmet=Capacete de Mithril
|
||||
Mithril Leggings=Calças de Mithril
|
||||
Steel Boots=Botas de Aço
|
||||
Steel Chestplate=Peitoral de Aço
|
||||
Steel Helmet=Capacete de Aço
|
||||
Steel Leggings=Calças de Aço
|
||||
Wood Boots=Botas de Madeira
|
||||
Wood Chestplate=Peitoral de Madeira
|
||||
Wood Helmet=Capacete de Madeira
|
||||
Wood Leggings=Calças de Madeira
|
||||
|
||||
### init.lua ###
|
||||
|
||||
3d_armor: Failed to initialize player=3d_armor: Falha ao inicializar jogador
|
||||
Fire=Fogo
|
||||
Heal=Saúde
|
||||
Level=Nível
|
||||
Radiation=Radiação
|
||||
Your @1 got destroyed!=@1 foi destruído(a)!
|
||||
Your @1 is almost broken!=
|
||||
[3d_armor] Fire Nodes disabled=[3d_armor] Nodes de gofo desabilitados
|
||||
|
||||
|
||||
##### not used anymore #####
|
||||
|
||||
3d_armor_ip: Mod loaded but unused.=3d_armor_ip: Mod carregado mas inoperante.
|
||||
Back=Voltar
|
||||
Armor=Armadura
|
||||
3d_armor_sfinv: Mod loaded but unused.=3d_armor_sfinv: Mod carregado mas inoperante.
|
||||
Armor stand top=Topo de estande de armadura
|
||||
Armor stand=Estande de armadura
|
||||
Armor Stand=Estande de Armadura
|
||||
Locked Armor stand=Estande de Armadura Trancada
|
||||
Armor Stand (owned by @1)=Estande de Armadura (pertente a @1)
|
||||
3d_armor_ui: Mod loaded but unused.=3d_armor_ui: Mod carregado mas inoperante.
|
||||
3d Armor=3d Armor
|
||||
Armor not initialized!=Armadura não inicializada!
|
||||
Admin Shield=Escudo de Administrador
|
||||
Wooden Shield=Escudo de Madeira
|
||||
Enhanced Wood Shield=Escudo de Madeira Melhorado
|
||||
Cactus Shield=Escudo de Cacto
|
||||
Enhanced Cactus Shield=Escudo de Cacto Melhorado
|
||||
Steel Shield=Escudo de Aço
|
||||
Bronze Shield=Escudo de Bronze
|
||||
Diamond Shield=Escudo de Diamante
|
||||
Gold Shield=Escudo de Ouro
|
||||
Mithril Shield=Escudo de Mithril
|
||||
Crystal Shield=Escudo de Cristal
|
85
mods/3d_armor/3d_armor/locale/3d_armor.pt_BR.tr
Normal file
@ -0,0 +1,85 @@
|
||||
# textdomain: 3d_armor
|
||||
|
||||
|
||||
### api.lua ###
|
||||
|
||||
3d_armor: Detached armor inventory is nil @1=3d_armor: Inventario avulso de armadura é nulo @1
|
||||
3d_armor: Player name is nil @1=3d_armor: Nome de jogador é nulo @1
|
||||
3d_armor: Player reference is nil @1=3d_armor: Referência Jogador é nula @1
|
||||
|
||||
### armor.lua ###
|
||||
|
||||
Admin Boots=Botas de Administrador
|
||||
Admin Chestplate=Peitoral de Administrador
|
||||
Admin Helmet=Capacete de Administrador
|
||||
Admin Leggings=Calças de Administrador
|
||||
Bronze Boots=Botas de Bronze
|
||||
Bronze Chestplate=Peitoral de Bronze
|
||||
Bronze Helmet=Capacete de Bronze
|
||||
Bronze Leggings=Calças de Bronze
|
||||
Cactus Boots=Botas de Madeira
|
||||
Cactus Chestplate=Peitoral de Cacto
|
||||
Cactus Helmet=Capacete de Cacto
|
||||
Cactus Leggings=Calças de Cacto
|
||||
Crystal Boots=Botas de Cristal
|
||||
Crystal Chestplate=Peitoral de Cristal
|
||||
Crystal Helmet=Capacete de Cristal
|
||||
Crystal Leggings=Calças de Cristal
|
||||
Diamond Boots=Botas de Diamante
|
||||
Diamond Chestplate=Peitoral de Diamante
|
||||
Diamond Helmet=Capacete de Diamante
|
||||
Diamond Leggings=Calças de Diamante
|
||||
Gold Boots=Botas de Ouro
|
||||
Gold Chestplate=Peitoral de Ouro
|
||||
Gold Helmet=Capacete de Ouro
|
||||
Gold Leggings=Calças de Ouro
|
||||
Mithril Boots=Botas de Mithril
|
||||
Mithril Chestplate=Peitoral de Mithril
|
||||
Mithril Helmet=Capacete de Mithril
|
||||
Mithril Leggings=Calças de Mithril
|
||||
Steel Boots=Botas de Aço
|
||||
Steel Chestplate=Peitoral de Aço
|
||||
Steel Helmet=Capacete de Aço
|
||||
Steel Leggings=Calças de Aço
|
||||
Wood Boots=Botas de Madeira
|
||||
Wood Chestplate=Peitoral de Madeira
|
||||
Wood Helmet=Capacete de Madeira
|
||||
Wood Leggings=Calças de Madeira
|
||||
|
||||
### init.lua ###
|
||||
|
||||
3d_armor: Failed to initialize player=3d_armor: Falha ao inicializar jogador
|
||||
Fire=Fogo
|
||||
Heal=Saúde
|
||||
Level=Nível
|
||||
Radiation=Radiação
|
||||
Your @1 got destroyed!=@1 foi destruído(a)!
|
||||
Your @1 is almost broken!=
|
||||
[3d_armor] Fire Nodes disabled=[3d_armor] Nodes de gofo desabilitados
|
||||
|
||||
|
||||
##### not used anymore #####
|
||||
|
||||
3d_armor_ip: Mod loaded but unused.=3d_armor_ip: Mod carregado mas inoperante.
|
||||
Back=Voltar
|
||||
Armor=Armadura
|
||||
3d_armor_sfinv: Mod loaded but unused.=3d_armor_sfinv: Mod carregado mas inoperante.
|
||||
Armor stand top=Topo de estande de armadura
|
||||
Armor stand=Estande de armadura
|
||||
Armor Stand=Estande de Armadura
|
||||
Locked Armor stand=Estande de Armadura Trancada
|
||||
Armor Stand (owned by @1)=Estande de Armadura (pertente a @1)
|
||||
3d_armor_ui: Mod loaded but unused.=3d_armor_ui: Mod carregado mas inoperante.
|
||||
3d Armor=3d Armor
|
||||
Armor not initialized!=Armadura não inicializada!
|
||||
Admin Shield=Escudo de Administrador
|
||||
Wooden Shield=Escudo de Madeira
|
||||
Enhanced Wood Shield=Escudo de Madeira Melhorado
|
||||
Cactus Shield=Escudo de Cacto
|
||||
Enhanced Cactus Shield=Escudo de Cacto Melhorado
|
||||
Steel Shield=Escudo de Aço
|
||||
Bronze Shield=Escudo de Bronze
|
||||
Diamond Shield=Escudo de Diamante
|
||||
Gold Shield=Escudo de Ouro
|
||||
Mithril Shield=Escudo de Mithril
|
||||
Crystal Shield=Escudo de Cristal
|
85
mods/3d_armor/3d_armor/locale/3d_armor.ru.tr
Normal file
@ -0,0 +1,85 @@
|
||||
# textdomain: 3d_armor
|
||||
|
||||
|
||||
### api.lua ###
|
||||
|
||||
3d_armor: Detached armor inventory is nil @1=3d_armor: Отдельный инвентарь брони является nil @1
|
||||
3d_armor: Player name is nil @1=3d_armor: Имя игрока является nil @1
|
||||
3d_armor: Player reference is nil @1=3d_armor: Ссылка игрока является nil @1
|
||||
|
||||
### armor.lua ###
|
||||
|
||||
Admin Boots=ботинки админа
|
||||
Admin Chestplate=бронежилет админа
|
||||
Admin Helmet=шлем админа
|
||||
Admin Leggings=гамаши админа
|
||||
Bronze Boots=бронзовые ботинки
|
||||
Bronze Chestplate=бронзовый бронежилет
|
||||
Bronze Helmet=бронзовый шлем
|
||||
Bronze Leggings=бронзовые гамаши
|
||||
Cactus Boots=кактусовые ботинки
|
||||
Cactus Chestplate=кактусовый бронежилет
|
||||
Cactus Helmet=кактусовый шлем
|
||||
Cactus Leggings=кактусовые гамаши
|
||||
Crystal Boots=кристалловые ботинки
|
||||
Crystal Chestplate=кристалловый бронежилет
|
||||
Crystal Helmet=кристалловый шлем
|
||||
Crystal Leggings=кристалловые гамаши
|
||||
Diamond Boots=алмазные ботинки
|
||||
Diamond Chestplate=алмазный бронежилет
|
||||
Diamond Helmet=алмазный шлем
|
||||
Diamond Leggings=алмазные гамаши
|
||||
Gold Boots=золотые ботинки
|
||||
Gold Chestplate=золотой бронежилет
|
||||
Gold Helmet=золотой шлем
|
||||
Gold Leggings=золотые гамаши
|
||||
Mithril Boots=мифриловые ботинки
|
||||
Mithril Chestplate=мифриловый бронежилет
|
||||
Mithril Helmet=мифриловый шлем
|
||||
Mithril Leggings=мифриловые гамаши
|
||||
Steel Boots=стальные ботинки
|
||||
Steel Chestplate=стальной бронежилет
|
||||
Steel Helmet=стальной шлем
|
||||
Steel Leggings=стальные гамаши
|
||||
Wood Boots=деревянные ботинки
|
||||
Wood Chestplate=деревянный бронежилет
|
||||
Wood Helmet=деревянный шлем
|
||||
Wood Leggings=деревянные гамаши
|
||||
|
||||
### init.lua ###
|
||||
|
||||
3d_armor: Failed to initialize player=3d_armor: не смог подготовить игрока
|
||||
Fire=огонь
|
||||
Heal=исцеление
|
||||
Level=уровень
|
||||
Radiation=излучение
|
||||
Your @1 got destroyed!=твой(и) @1 был(и) разрушен(ы)!
|
||||
Your @1 is almost broken!=
|
||||
[3d_armor] Fire Nodes disabled=[3d_armor] блоки огня отключены
|
||||
|
||||
|
||||
##### not used anymore #####
|
||||
|
||||
3d_armor_ip: Mod loaded but unused.=3d_armor_ip: мод загружен но не используется.
|
||||
Back=назад
|
||||
Armor=бронь
|
||||
3d_armor_sfinv: Mod loaded but unused.=3d_armor_sfinv: мод загружен но не используется.
|
||||
Armor stand top=стойка для брони (верх)
|
||||
Armor stand=стойка для брони
|
||||
Armor Stand=стойка для брони
|
||||
Locked Armor stand=защищенная стойка для брони
|
||||
Armor Stand (owned by @1)=стойка для брони (принадлежит @1)
|
||||
3d_armor_ui: Mod loaded but unused.=3d_armor_ui: мод загружен но не используется.
|
||||
3d Armor=3D бронь
|
||||
Armor not initialized!=бронь не подготовлена!
|
||||
Admin Shield=щит админа
|
||||
Wooden Shield=деревянный щит
|
||||
Enhanced Wood Shield=улучшенный деревянный щит
|
||||
Cactus Shield=кактусный щит
|
||||
Enhanced Cactus Shield=улучшенный кактусный щит
|
||||
Steel Shield=стальной щит
|
||||
Bronze Shield=бронзовый щит
|
||||
Diamond Shield=алмазный щит
|
||||
Gold Shield=золотой щит
|
||||
Mithril Shield=мифриловый щит
|
||||
Crystal Shield=кристалловый щит
|
58
mods/3d_armor/3d_armor/locale/template.txt
Normal file
@ -0,0 +1,58 @@
|
||||
# textdomain: 3d_armor
|
||||
|
||||
|
||||
### api.lua ###
|
||||
|
||||
3d_armor: Detached armor inventory is nil @1=
|
||||
3d_armor: Player name is nil @1=
|
||||
3d_armor: Player reference is nil @1=
|
||||
|
||||
### armor.lua ###
|
||||
|
||||
Admin Boots=
|
||||
Admin Chestplate=
|
||||
Admin Helmet=
|
||||
Admin Leggings=
|
||||
Bronze Boots=
|
||||
Bronze Chestplate=
|
||||
Bronze Helmet=
|
||||
Bronze Leggings=
|
||||
Cactus Boots=
|
||||
Cactus Chestplate=
|
||||
Cactus Helmet=
|
||||
Cactus Leggings=
|
||||
Crystal Boots=
|
||||
Crystal Chestplate=
|
||||
Crystal Helmet=
|
||||
Crystal Leggings=
|
||||
Diamond Boots=
|
||||
Diamond Chestplate=
|
||||
Diamond Helmet=
|
||||
Diamond Leggings=
|
||||
Gold Boots=
|
||||
Gold Chestplate=
|
||||
Gold Helmet=
|
||||
Gold Leggings=
|
||||
Mithril Boots=
|
||||
Mithril Chestplate=
|
||||
Mithril Helmet=
|
||||
Mithril Leggings=
|
||||
Steel Boots=
|
||||
Steel Chestplate=
|
||||
Steel Helmet=
|
||||
Steel Leggings=
|
||||
Wood Boots=
|
||||
Wood Chestplate=
|
||||
Wood Helmet=
|
||||
Wood Leggings=
|
||||
|
||||
### init.lua ###
|
||||
|
||||
3d_armor: Failed to initialize player=
|
||||
Fire=
|
||||
Heal=
|
||||
Level=
|
||||
Radiation=
|
||||
Your @1 got destroyed!=
|
||||
Your @1 is almost broken!=
|
||||
[3d_armor] Fire Nodes disabled=
|
4
mods/3d_armor/3d_armor/mod.conf
Normal file
@ -0,0 +1,4 @@
|
||||
name = 3d_armor
|
||||
depends = default
|
||||
optional_depends = player_monoids, armor_monoid, pova, fire, ethereal, bakedclay, moreores
|
||||
description = Adds craftable armor that is visible to other players.
|
BIN
mods/3d_armor/3d_armor/models/3d_armor_character.b3d
Normal file
BIN
mods/3d_armor/3d_armor/models/3d_armor_character.blend
Normal file
BIN
mods/3d_armor/3d_armor/textures/3d_armor_boots_admin.png
Normal file
After Width: | Height: | Size: 258 B |
BIN
mods/3d_armor/3d_armor/textures/3d_armor_boots_admin_preview.png
Normal file
After Width: | Height: | Size: 261 B |
BIN
mods/3d_armor/3d_armor/textures/3d_armor_boots_bronze.png
Normal file
After Width: | Height: | Size: 253 B |
After Width: | Height: | Size: 241 B |
BIN
mods/3d_armor/3d_armor/textures/3d_armor_boots_cactus.png
Normal file
After Width: | Height: | Size: 252 B |
After Width: | Height: | Size: 239 B |
BIN
mods/3d_armor/3d_armor/textures/3d_armor_boots_crystal.png
Normal file
After Width: | Height: | Size: 261 B |
After Width: | Height: | Size: 258 B |
BIN
mods/3d_armor/3d_armor/textures/3d_armor_boots_diamond.png
Normal file
After Width: | Height: | Size: 265 B |
After Width: | Height: | Size: 270 B |
BIN
mods/3d_armor/3d_armor/textures/3d_armor_boots_gold.png
Normal file
After Width: | Height: | Size: 245 B |
BIN
mods/3d_armor/3d_armor/textures/3d_armor_boots_gold_preview.png
Normal file
After Width: | Height: | Size: 226 B |
BIN
mods/3d_armor/3d_armor/textures/3d_armor_boots_mithril.png
Normal file
After Width: | Height: | Size: 261 B |
After Width: | Height: | Size: 272 B |
BIN
mods/3d_armor/3d_armor/textures/3d_armor_boots_steel.png
Normal file
After Width: | Height: | Size: 233 B |
BIN
mods/3d_armor/3d_armor/textures/3d_armor_boots_steel_preview.png
Normal file
After Width: | Height: | Size: 232 B |
BIN
mods/3d_armor/3d_armor/textures/3d_armor_boots_wood.png
Normal file
After Width: | Height: | Size: 267 B |
BIN
mods/3d_armor/3d_armor/textures/3d_armor_boots_wood_preview.png
Normal file
After Width: | Height: | Size: 233 B |
BIN
mods/3d_armor/3d_armor/textures/3d_armor_chestplate_admin.png
Normal file
After Width: | Height: | Size: 409 B |
After Width: | Height: | Size: 285 B |
BIN
mods/3d_armor/3d_armor/textures/3d_armor_chestplate_bronze.png
Normal file
After Width: | Height: | Size: 396 B |
After Width: | Height: | Size: 282 B |
BIN
mods/3d_armor/3d_armor/textures/3d_armor_chestplate_cactus.png
Normal file
After Width: | Height: | Size: 393 B |
After Width: | Height: | Size: 286 B |
BIN
mods/3d_armor/3d_armor/textures/3d_armor_chestplate_crystal.png
Normal file
After Width: | Height: | Size: 404 B |
After Width: | Height: | Size: 289 B |
BIN
mods/3d_armor/3d_armor/textures/3d_armor_chestplate_diamond.png
Normal file
After Width: | Height: | Size: 429 B |
After Width: | Height: | Size: 290 B |
BIN
mods/3d_armor/3d_armor/textures/3d_armor_chestplate_gold.png
Normal file
After Width: | Height: | Size: 402 B |
After Width: | Height: | Size: 281 B |
BIN
mods/3d_armor/3d_armor/textures/3d_armor_chestplate_mithril.png
Normal file
After Width: | Height: | Size: 416 B |
After Width: | Height: | Size: 286 B |
BIN
mods/3d_armor/3d_armor/textures/3d_armor_chestplate_steel.png
Normal file
After Width: | Height: | Size: 385 B |
After Width: | Height: | Size: 274 B |
BIN
mods/3d_armor/3d_armor/textures/3d_armor_chestplate_wood.png
Normal file
After Width: | Height: | Size: 324 B |
After Width: | Height: | Size: 275 B |
BIN
mods/3d_armor/3d_armor/textures/3d_armor_helmet_admin.png
Normal file
After Width: | Height: | Size: 348 B |
After Width: | Height: | Size: 261 B |
BIN
mods/3d_armor/3d_armor/textures/3d_armor_helmet_bronze.png
Normal file
After Width: | Height: | Size: 337 B |
After Width: | Height: | Size: 271 B |
BIN
mods/3d_armor/3d_armor/textures/3d_armor_helmet_cactus.png
Normal file
After Width: | Height: | Size: 325 B |
After Width: | Height: | Size: 203 B |
BIN
mods/3d_armor/3d_armor/textures/3d_armor_helmet_crystal.png
Normal file
After Width: | Height: | Size: 350 B |
After Width: | Height: | Size: 257 B |
BIN
mods/3d_armor/3d_armor/textures/3d_armor_helmet_diamond.png
Normal file
After Width: | Height: | Size: 353 B |
After Width: | Height: | Size: 269 B |
BIN
mods/3d_armor/3d_armor/textures/3d_armor_helmet_gold.png
Normal file
After Width: | Height: | Size: 353 B |
BIN
mods/3d_armor/3d_armor/textures/3d_armor_helmet_gold_preview.png
Normal file
After Width: | Height: | Size: 251 B |
BIN
mods/3d_armor/3d_armor/textures/3d_armor_helmet_mithril.png
Normal file
After Width: | Height: | Size: 338 B |
After Width: | Height: | Size: 253 B |
BIN
mods/3d_armor/3d_armor/textures/3d_armor_helmet_steel.png
Normal file
After Width: | Height: | Size: 354 B |
After Width: | Height: | Size: 267 B |
BIN
mods/3d_armor/3d_armor/textures/3d_armor_helmet_wood.png
Normal file
After Width: | Height: | Size: 327 B |
BIN
mods/3d_armor/3d_armor/textures/3d_armor_helmet_wood_preview.png
Normal file
After Width: | Height: | Size: 237 B |
BIN
mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_admin.png
Normal file
After Width: | Height: | Size: 216 B |
BIN
mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_bronze.png
Normal file
After Width: | Height: | Size: 207 B |
BIN
mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_cactus.png
Normal file
After Width: | Height: | Size: 194 B |
BIN
mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_crystal.png
Normal file
After Width: | Height: | Size: 217 B |
BIN
mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_diamond.png
Normal file
After Width: | Height: | Size: 220 B |
BIN
mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_gold.png
Normal file
After Width: | Height: | Size: 202 B |
BIN
mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_mithril.png
Normal file
After Width: | Height: | Size: 224 B |
BIN
mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_steel.png
Normal file
After Width: | Height: | Size: 209 B |
BIN
mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_wood.png
Normal file
After Width: | Height: | Size: 215 B |
After Width: | Height: | Size: 256 B |
After Width: | Height: | Size: 261 B |