Update 1.6.0

master
Noodlemire 2020-09-06 13:45:23 -05:00
parent feaf84ef9f
commit 1f00da9972
85 changed files with 4533 additions and 1794 deletions

621
LICENSE.txt Normal file
View File

@ -0,0 +1,621 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, 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
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If 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 convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU 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
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "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 PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS

View File

@ -260,3 +260,25 @@ Alpha 1.5.0:
Visual:
Particles no longer become black when inside nodes.
Alpha 1.6.0:
Identification:
Various items are now unidentified when first found.
Unidentified weapons have their level hidden, and become identified after 20 "proper" uses (No spam clicking)
Unidentified armors have their level hidden, and become identified after 15 hits taken while worn
Unidentified wands have their level hidden, which becomes known after 10 zaps.
Implemented: Scroll of Identify, instantly fully identifies a single selected item.
Misc:
Eating mystery meat can now cause spontaneous combustion.
Repair tools now prevent you from trying to select items with no wear, rather than giving you a message about the item being fully repaired.
Updated various mods
Copied LICENSE.txt into base directory
Fixed:
Armor's durability not being saved properly after taking damage.
Grass not properly dropping seeds
Compatability issues with MT 5.3
Performance:
Instead of a blob always iterating over every single position it covers, it instead is limited to 100 positions per second. So, extremely large blobs slow themselves more than the server as a whole.

0
mods/3d_armor/3d_armor/tools/updatepo.sh Executable file → Normal file
View File

0
mods/3d_armor/preview_gen.py Executable file → Normal file
View File

0
mods/bucket/textures/bucket.png Executable file → Normal file
View File

Before

Width:  |  Height:  |  Size: 205 B

After

Width:  |  Height:  |  Size: 205 B

View File

@ -123,6 +123,8 @@ paramat (CC BY-SA 3.0):
default_fence_rail_junglewood
default_fence_rail_pine_wood
default_fence_rail_wood -- Derived from a texture by BlockMen (CC BY-SA 3.0)
gui_hotbar.png
gui_hotbar_selected.png
TumeniNodes (CC BY-SA 3.0):
default_desert_cobble.png -- Derived from a texture by brunob.santos (CC BY-SA 3.0)
@ -149,8 +151,10 @@ BlockMen (CC BY-SA 3.0):
default_chest_top.png
default_mineral_mese.png
default_meselamp.png
bubble.png
gui_*.png
gui_formbg.png
gui_furnace_arrow_bg.png
gui_furnace_arrow_fg.png
gui_hb_bg.png
sofar (CC BY-SA 3.0):
default_aspen_sapling
@ -191,9 +195,6 @@ Gambit (CC BY-SA 3.0):
asl97 (CC BY-SA 3.0):
default_ice.png
KevDoy (CC BY-SA 3.0):
heart.png
Pithydon (CC BY-SA 3.0)
default_coral_brown.png
default_coral_orange.png
@ -248,6 +249,11 @@ Topywo (CC BY-SA 3.0)
Extex101 (CC BY-SA 3.0)
default_large_cactus_seedling.png
default_dry_shrub.png -- Derived from the original texture by celeron55
An0n3m0us (CC BY-SA 3.0):
heart.png -- Derived from a texture by KevDoy (CC BY-SA 3.0)
bubble.png -- Derived from a texture by BlockMen (CC BY-SA 3.0)
Sounds
@ -330,6 +336,10 @@ http://freesound.org/people/Ryding/sounds/94337/
Ferk (CC0 1.0):
default_item_smoke.ogg, based on a sound by http://opengameart.org/users/bart
sonictechtonic (CC BY 3.0):
https://www.freesound.org/people/sonictechtonic/sounds/241872/
player_damage.ogg
Models
------

View File

@ -44,9 +44,10 @@ function default.chest.chest_lid_close(pn)
end
local node = minetest.get_node(pos)
minetest.after(0.2, minetest.swap_node, pos, { name = "default:" .. swap,
minetest.after(0.2, minetest.swap_node, pos, { name = swap,
param2 = node.param2 })
minetest.sound_play(sound, {gain = 0.3, pos = pos, max_hear_distance = 10})
minetest.sound_play(sound, {gain = 0.3, pos = pos,
max_hear_distance = 10}, true)
end
default.chest.open_chests = {}
@ -75,7 +76,8 @@ minetest.register_on_leaveplayer(function(player)
end
end)
function default.chest.register_chest(name, d)
function default.chest.register_chest(prefixed_name, d)
local name = prefixed_name:sub(1,1) == ':' and prefixed_name:sub(2,-1) or prefixed_name
local def = table.copy(d)
def.drawtype = "mesh"
def.visual = "mesh"
@ -128,10 +130,10 @@ function default.chest.register_chest(name, d)
end
minetest.sound_play(def.sound_open, {gain = 0.3,
pos = pos, max_hear_distance = 10})
pos = pos, max_hear_distance = 10}, true)
if not default.chest.chest_lid_obstructed(pos) then
minetest.swap_node(pos,
{ name = "default:" .. name .. "_open",
{ name = name .. "_open",
param2 = node.param2 })
end
minetest.after(0.2, minetest.show_formspec,
@ -199,10 +201,10 @@ function default.chest.register_chest(name, d)
end
def.on_rightclick = function(pos, node, clicker)
minetest.sound_play(def.sound_open, {gain = 0.3, pos = pos,
max_hear_distance = 10})
max_hear_distance = 10}, true)
if not default.chest.chest_lid_obstructed(pos) then
minetest.swap_node(pos, {
name = "default:" .. name .. "_open",
name = name .. "_open",
param2 = node.param2 })
end
minetest.after(0.2, minetest.show_formspec,
@ -214,7 +216,7 @@ function default.chest.register_chest(name, d)
def.on_blast = function(pos)
local drops = {}
default.get_inventory_drops(pos, "main", drops)
drops[#drops+1] = "default:" .. name
drops[#drops+1] = name
minetest.remove_node(pos)
return drops
end
@ -247,7 +249,7 @@ function default.chest.register_chest(name, d)
def_opened.tiles[i].backface_culling = true
end
end
def_opened.drop = "default:" .. name
def_opened.drop = name
def_opened.groups.not_in_creative_inventory = 1
def_opened.selection_box = {
type = "fixed",
@ -264,29 +266,31 @@ function default.chest.register_chest(name, d)
def_closed.tiles[5] = def.tiles[3] -- drawtype to make them match the mesh
def_closed.tiles[3] = def.tiles[3].."^[transformFX"
minetest.register_node("default:" .. name, def_closed)
minetest.register_node("default:" .. name .. "_open", def_opened)
minetest.register_node(prefixed_name, def_closed)
minetest.register_node(prefixed_name .. "_open", def_opened)
-- convert old chests to this new variant
minetest.register_lbm({
label = "update chests to opening chests",
name = "default:upgrade_" .. name .. "_v2",
nodenames = {"default:" .. name},
action = function(pos, node)
local meta = minetest.get_meta(pos)
meta:set_string("formspec", nil)
local inv = meta:get_inventory()
local list = inv:get_list("default:chest")
if list then
inv:set_size("main", 8*4)
inv:set_list("main", list)
inv:set_list("default:chest", nil)
if name == "default:chest" or name == "default:chest_locked" then
minetest.register_lbm({
label = "update chests to opening chests",
name = "default:upgrade_" .. name:sub(9,-1) .. "_v2",
nodenames = {name},
action = function(pos, node)
local meta = minetest.get_meta(pos)
meta:set_string("formspec", nil)
local inv = meta:get_inventory()
local list = inv:get_list("default:chest")
if list then
inv:set_size("main", 8*4)
inv:set_list("main", list)
inv:set_list("default:chest", nil)
end
end
end
})
})
end
end
default.chest.register_chest("chest", {
default.chest.register_chest("default:chest", {
description = S("Chest"),
tiles = {
"default_chest_top.png",
@ -302,7 +306,7 @@ default.chest.register_chest("chest", {
groups = {choppy = 2, oddly_breakable_by_hand = 2},
})
default.chest.register_chest("chest_locked", {
default.chest.register_chest("default:chest_locked", {
description = S("Locked Chest"),
tiles = {
"default_chest_top.png",
@ -318,3 +322,39 @@ default.chest.register_chest("chest_locked", {
groups = {choppy = 2, oddly_breakable_by_hand = 2},
protected = true,
})
minetest.register_craft({
output = "default:chest",
recipe = {
{"group:wood", "group:wood", "group:wood"},
{"group:wood", "", "group:wood"},
{"group:wood", "group:wood", "group:wood"},
}
})
minetest.register_craft({
output = "default:chest_locked",
recipe = {
{"group:wood", "group:wood", "group:wood"},
{"group:wood", "default:steel_ingot", "group:wood"},
{"group:wood", "group:wood", "group:wood"},
}
})
minetest.register_craft( {
type = "shapeless",
output = "default:chest_locked",
recipe = {"default:chest", "default:steel_ingot"},
})
minetest.register_craft({
type = "fuel",
recipe = "default:chest",
burntime = 30,
})
minetest.register_craft({
type = "fuel",
recipe = "default:chest_locked",
burntime = 30,
})

View File

@ -56,13 +56,6 @@ minetest.register_craft({
}
})
minetest.register_craft({
output = "default:stick 4",
recipe = {
{"group:wood"},
}
})
minetest.register_craft({
output = "default:sign_wall_steel 3",
recipe = {
@ -81,273 +74,6 @@ minetest.register_craft({
}
})
minetest.register_craft({
output = "default:torch 4",
recipe = {
{"default:coal_lump"},
{"group:stick"},
}
})
minetest.register_craft({
output = "default:pick_wood",
recipe = {
{"group:wood", "group:wood", "group:wood"},
{"", "group:stick", ""},
{"", "group:stick", ""},
}
})
minetest.register_craft({
output = "default:pick_stone",
recipe = {
{"group:stone", "group:stone", "group:stone"},
{"", "group:stick", ""},
{"", "group:stick", ""},
}
})
minetest.register_craft({
output = "default:pick_steel",
recipe = {
{"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"},
{"", "group:stick", ""},
{"", "group:stick", ""},
}
})
minetest.register_craft({
output = "default:pick_bronze",
recipe = {
{"default:bronze_ingot", "default:bronze_ingot", "default:bronze_ingot"},
{"", "group:stick", ""},
{"", "group:stick", ""},
}
})
minetest.register_craft({
output = "default:pick_mese",
recipe = {
{"default:mese_crystal", "default:mese_crystal", "default:mese_crystal"},
{"", "group:stick", ""},
{"", "group:stick", ""},
}
})
minetest.register_craft({
output = "default:pick_diamond",
recipe = {
{"default:diamond", "default:diamond", "default:diamond"},
{"", "group:stick", ""},
{"", "group:stick", ""},
}
})
minetest.register_craft({
output = "default:shovel_wood",
recipe = {
{"group:wood"},
{"group:stick"},
{"group:stick"},
}
})
minetest.register_craft({
output = "default:shovel_stone",
recipe = {
{"group:stone"},
{"group:stick"},
{"group:stick"},
}
})
minetest.register_craft({
output = "default:shovel_steel",
recipe = {
{"default:steel_ingot"},
{"group:stick"},
{"group:stick"},
}
})
minetest.register_craft({
output = "default:shovel_bronze",
recipe = {
{"default:bronze_ingot"},
{"group:stick"},
{"group:stick"},
}
})
minetest.register_craft({
output = "default:shovel_mese",
recipe = {
{"default:mese_crystal"},
{"group:stick"},
{"group:stick"},
}
})
minetest.register_craft({
output = "default:shovel_diamond",
recipe = {
{"default:diamond"},
{"group:stick"},
{"group:stick"},
}
})
-- Axes
-- Recipes face left to match appearence in textures and inventory
minetest.register_craft({
output = "default:axe_wood",
recipe = {
{"group:wood", "group:wood"},
{"group:wood", "group:stick"},
{"", "group:stick"},
}
})
minetest.register_craft({
output = "default:axe_stone",
recipe = {
{"group:stone", "group:stone"},
{"group:stone", "group:stick"},
{"", "group:stick"},
}
})
minetest.register_craft({
output = "default:axe_steel",
recipe = {
{"default:steel_ingot", "default:steel_ingot"},
{"default:steel_ingot", "group:stick"},
{"", "group:stick"},
}
})
minetest.register_craft({
output = "default:axe_bronze",
recipe = {
{"default:bronze_ingot", "default:bronze_ingot"},
{"default:bronze_ingot", "group:stick"},
{"", "group:stick"},
}
})
minetest.register_craft({
output = "default:axe_mese",
recipe = {
{"default:mese_crystal", "default:mese_crystal"},
{"default:mese_crystal", "group:stick"},
{"", "group:stick"},
}
})
minetest.register_craft({
output = "default:axe_diamond",
recipe = {
{"default:diamond", "default:diamond"},
{"default:diamond", "group:stick"},
{"", "group:stick"},
}
})
minetest.register_craft({
output = "default:sword_wood",
recipe = {
{"group:wood"},
{"group:wood"},
{"group:stick"},
}
})
minetest.register_craft({
output = "default:sword_stone",
recipe = {
{"group:stone"},
{"group:stone"},
{"group:stick"},
}
})
minetest.register_craft({
output = "default:sword_steel",
recipe = {
{"default:steel_ingot"},
{"default:steel_ingot"},
{"group:stick"},
}
})
minetest.register_craft({
output = "default:sword_bronze",
recipe = {
{"default:bronze_ingot"},
{"default:bronze_ingot"},
{"group:stick"},
}
})
minetest.register_craft({
output = "default:sword_mese",
recipe = {
{"default:mese_crystal"},
{"default:mese_crystal"},
{"group:stick"},
}
})
minetest.register_craft({
output = "default:sword_diamond",
recipe = {
{"default:diamond"},
{"default:diamond"},
{"group:stick"},
}
})
minetest.register_craft({
output = "default:skeleton_key",
recipe = {
{"default:gold_ingot"},
}
})
minetest.register_craft({
output = "default:chest",
recipe = {
{"group:wood", "group:wood", "group:wood"},
{"group:wood", "", "group:wood"},
{"group:wood", "group:wood", "group:wood"},
}
})
minetest.register_craft({
output = "default:chest_locked",
recipe = {
{"group:wood", "group:wood", "group:wood"},
{"group:wood", "default:steel_ingot", "group:wood"},
{"group:wood", "group:wood", "group:wood"},
}
})
minetest.register_craft( {
type = "shapeless",
output = "default:chest_locked",
recipe = {"default:chest", "default:steel_ingot"},
})
minetest.register_craft({
output = "default:furnace",
recipe = {
{"group:stone", "group:stone", "group:stone"},
{"group:stone", "", "group:stone"},
{"group:stone", "group:stone", "group:stone"},
}
})
minetest.register_craft({
output = "default:coalblock",
recipe = {
@ -357,13 +83,6 @@ minetest.register_craft({
}
})
minetest.register_craft({
output = "default:coal_lump 9",
recipe = {
{"default:coalblock"},
}
})
minetest.register_craft({
output = "default:steelblock",
recipe = {
@ -373,13 +92,6 @@ minetest.register_craft({
}
})
minetest.register_craft({
output = "default:steel_ingot 9",
recipe = {
{"default:steelblock"},
}
})
minetest.register_craft({
output = "default:copperblock",
recipe = {
@ -389,13 +101,6 @@ minetest.register_craft({
}
})
minetest.register_craft({
output = "default:copper_ingot 9",
recipe = {
{"default:copperblock"},
}
})
minetest.register_craft({
output = "default:tinblock",
recipe = {
@ -405,22 +110,6 @@ minetest.register_craft({
}
})
minetest.register_craft({
output = "default:tin_ingot 9",
recipe = {
{"default:tinblock"},
}
})
minetest.register_craft({
output = "default:bronze_ingot 9",
recipe = {
{"default:copper_ingot", "default:copper_ingot", "default:copper_ingot"},
{"default:copper_ingot", "default:tin_ingot", "default:copper_ingot"},
{"default:copper_ingot", "default:copper_ingot", "default:copper_ingot"},
}
})
minetest.register_craft({
output = "default:bronzeblock",
recipe = {
@ -446,13 +135,6 @@ minetest.register_craft({
}
})
minetest.register_craft({
output = "default:gold_ingot 9",
recipe = {
{"default:goldblock"},
}
})
minetest.register_craft({
output = "default:diamondblock",
recipe = {
@ -462,13 +144,6 @@ minetest.register_craft({
}
})
minetest.register_craft({
output = "default:diamond 9",
recipe = {
{"default:diamondblock"},
}
})
minetest.register_craft({
output = "default:sandstone",
recipe = {
@ -573,13 +248,6 @@ minetest.register_craft({
}
})
minetest.register_craft({
output = "default:clay_lump 4",
recipe = {
{"default:clay"},
}
})
minetest.register_craft({
output = "default:brick",
recipe = {
@ -588,29 +256,6 @@ minetest.register_craft({
}
})
minetest.register_craft({
output = "default:clay_brick 4",
recipe = {
{"default:brick"},
}
})
minetest.register_craft({
output = "default:paper",
recipe = {
{"default:papyrus", "default:papyrus", "default:papyrus"},
}
})
minetest.register_craft({
output = "default:book",
recipe = {
{"default:paper"},
{"default:paper"},
{"default:paper"},
}
})
minetest.register_craft({
output = "default:bookshelf",
recipe = {
@ -647,29 +292,6 @@ minetest.register_craft({
}
})
minetest.register_craft({
output = "default:mese_crystal 9",
recipe = {
{"default:mese"},
}
})
minetest.register_craft({
output = "default:mese_crystal_fragment 9",
recipe = {
{"default:mese_crystal"},
}
})
minetest.register_craft({
output = "default:mese_crystal",
recipe = {
{"default:mese_crystal_fragment", "default:mese_crystal_fragment", "default:mese_crystal_fragment"},
{"default:mese_crystal_fragment", "default:mese_crystal_fragment", "default:mese_crystal_fragment"},
{"default:mese_crystal_fragment", "default:mese_crystal_fragment", "default:mese_crystal_fragment"},
}
})
minetest.register_craft({
output = "default:meselamp",
recipe = {
@ -687,13 +309,6 @@ minetest.register_craft({
}
})
minetest.register_craft({
output = "default:obsidian_shard 9",
recipe = {
{"default:obsidian"}
}
})
minetest.register_craft({
output = "default:obsidian",
recipe = {
@ -833,50 +448,6 @@ minetest.register_craft({
recipe = "default:desert_cobble",
})
minetest.register_craft({
type = "cooking",
output = "default:steel_ingot",
recipe = "default:iron_lump",
})
minetest.register_craft({
type = "cooking",
output = "default:copper_ingot",
recipe = "default:copper_lump",
})
minetest.register_craft({
type = "cooking",
output = "default:tin_ingot",
recipe = "default:tin_lump",
})
minetest.register_craft({
type = "cooking",
output = "default:gold_ingot",
recipe = "default:gold_lump",
})
minetest.register_craft({
type = "cooking",
output = "default:clay_brick",
recipe = "default:clay_lump",
})
minetest.register_craft({
type = "cooking",
output = "default:gold_ingot",
recipe = "default:skeleton_key",
cooktime = 5,
})
minetest.register_craft({
type = "cooking",
output = "default:gold_ingot",
recipe = "default:key",
cooktime = 5,
})
--
-- Fuels
@ -1005,7 +576,6 @@ minetest.register_craft({
burntime = 7,
})
minetest.register_craft({
type = "fuel",
recipe = "default:fence_aspen_wood",
@ -1067,7 +637,6 @@ minetest.register_craft({
burntime = 7,
})
minetest.register_craft({
type = "fuel",
recipe = "default:bush_stem",
@ -1134,36 +703,12 @@ minetest.register_craft({
burntime = 60,
})
minetest.register_craft({
type = "fuel",
recipe = "default:torch",
burntime = 4,
})
minetest.register_craft({
type = "fuel",
recipe = "default:sign_wall_wood",
burntime = 10,
})
minetest.register_craft({
type = "fuel",
recipe = "default:chest",
burntime = 30,
})
minetest.register_craft({
type = "fuel",
recipe = "default:chest_locked",
burntime = 30,
})
minetest.register_craft({
type = "fuel",
recipe = "default:coal_lump",
burntime = 40,
})
minetest.register_craft({
type = "fuel",
recipe = "default:coalblock",
@ -1194,57 +739,8 @@ minetest.register_craft({
burntime = 2,
})
minetest.register_craft({
type = "fuel",
recipe = "default:paper",
burntime = 1,
})
minetest.register_craft({
type = "fuel",
recipe = "default:book",
burntime = 3,
})
minetest.register_craft({
type = "fuel",
recipe = "default:book_written",
burntime = 3,
})
minetest.register_craft({
type = "fuel",
recipe = "default:dry_shrub",
burntime = 2,
})
minetest.register_craft({
type = "fuel",
recipe = "group:stick",
burntime = 1,
})
minetest.register_craft({
type = "fuel",
recipe = "default:pick_wood",
burntime = 6,
})
minetest.register_craft({
type = "fuel",
recipe = "default:shovel_wood",
burntime = 4,
})
minetest.register_craft({
type = "fuel",
recipe = "default:axe_wood",
burntime = 6,
})
minetest.register_craft({
type = "fuel",
recipe = "default:sword_wood",
burntime = 5,
})

View File

@ -3,19 +3,6 @@
-- support for MT game translation.
local S = default.get_translator
minetest.register_craftitem("default:stick", {
description = S("Stick"),
inventory_image = "default_stick.png",
groups = {stick = 1, flammable = 2},
})
minetest.register_craftitem("default:paper", {
description = S("Paper"),
inventory_image = "default_paper.png",
groups = {flammable = 3},
})
local lpp = 14 -- Lines per book's page
local function book_on_use(itemstack, user)
local player_name = user:get_player_name()
@ -158,54 +145,9 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
player:set_wielded_item(stack)
end)
minetest.register_craftitem("default:book", {
description = S("Book"),
inventory_image = "default_book.png",
groups = {book = 1, flammable = 3},
on_use = book_on_use,
})
minetest.register_craftitem("default:book_written", {
description = S("Book with Text"),
inventory_image = "default_book_written.png",
groups = {book = 1, not_in_creative_inventory = 1, flammable = 3},
stack_max = 1,
on_use = book_on_use,
})
minetest.register_craft({
type = "shapeless",
output = "default:book_written",
recipe = {"default:book", "default:book_written"}
})
minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv)
if itemstack:get_name() ~= "default:book_written" then
return
end
local original
local index
for i = 1, player:get_inventory():get_size("craft") do
if old_craft_grid[i]:get_name() == "default:book_written" then
original = old_craft_grid[i]
index = i
end
end
if not original then
return
end
local copymeta = original:get_meta():to_table()
-- copy of the book held by player's mouse cursor
itemstack:get_meta():from_table(copymeta)
-- put the book with metadata back in the craft grid
craft_inv:set_stack("craft", index, original)
end)
minetest.register_craftitem("default:skeleton_key", {
description = S("Skeleton Key"),
inventory_image = "default_key_skeleton.png",
groups = {key = 1},
on_use = function(itemstack, user, pointed_thing)
if pointed_thing.type ~= "node" then
return itemstack
@ -258,91 +200,9 @@ minetest.register_craftitem("default:skeleton_key", {
end
})
minetest.register_craftitem("default:coal_lump", {
description = S("Coal Lump"),
inventory_image = "default_coal_lump.png",
groups = {coal = 1, flammable = 1}
})
minetest.register_craftitem("default:iron_lump", {
description = S("Iron Lump"),
inventory_image = "default_iron_lump.png"
})
minetest.register_craftitem("default:copper_lump", {
description = S("Copper Lump"),
inventory_image = "default_copper_lump.png"
})
minetest.register_craftitem("default:tin_lump", {
description = S("Tin Lump"),
inventory_image = "default_tin_lump.png"
})
minetest.register_craftitem("default:mese_crystal", {
description = S("Mese Crystal"),
inventory_image = "default_mese_crystal.png",
})
minetest.register_craftitem("default:gold_lump", {
description = S("Gold Lump"),
inventory_image = "default_gold_lump.png"
})
minetest.register_craftitem("default:diamond", {
description = S("Diamond"),
inventory_image = "default_diamond.png",
})
minetest.register_craftitem("default:clay_lump", {
description = S("Clay Lump"),
inventory_image = "default_clay_lump.png",
})
minetest.register_craftitem("default:steel_ingot", {
description = S("Steel Ingot"),
inventory_image = "default_steel_ingot.png"
})
minetest.register_craftitem("default:copper_ingot", {
description = S("Copper Ingot"),
inventory_image = "default_copper_ingot.png"
})
minetest.register_craftitem("default:tin_ingot", {
description = S("Tin Ingot"),
inventory_image = "default_tin_ingot.png"
})
minetest.register_craftitem("default:bronze_ingot", {
description = S("Bronze Ingot"),
inventory_image = "default_bronze_ingot.png"
})
minetest.register_craftitem("default:gold_ingot", {
description = S("Gold Ingot"),
inventory_image = "default_gold_ingot.png"
})
minetest.register_craftitem("default:mese_crystal_fragment", {
description = S("Mese Crystal Fragment"),
inventory_image = "default_mese_crystal_fragment.png",
})
minetest.register_craftitem("default:clay_brick", {
description = S("Clay Brick"),
inventory_image = "default_clay_brick.png",
})
minetest.register_craftitem("default:obsidian_shard", {
description = S("Obsidian Shard"),
inventory_image = "default_obsidian_shard.png",
})
minetest.register_craftitem("default:flint", {
description = S("Flint"),
inventory_image = "default_flint.png"
})
--
-- Craftitem registry
--
minetest.register_craftitem("default:blueberries", {
description = S("Blueberries"),
@ -350,3 +210,329 @@ minetest.register_craftitem("default:blueberries", {
groups = {food_blueberries = 1, food_berry = 1},
on_use = minetest.item_eat(2),
})
minetest.register_craftitem("default:book", {
description = S("Book"),
inventory_image = "default_book.png",
groups = {book = 1, flammable = 3},
on_use = book_on_use,
})
minetest.register_craftitem("default:book_written", {
description = S("Book with Text"),
inventory_image = "default_book_written.png",
groups = {book = 1, not_in_creative_inventory = 1, flammable = 3},
stack_max = 1,
on_use = book_on_use,
})
minetest.register_craftitem("default:bronze_ingot", {
description = S("Bronze Ingot"),
inventory_image = "default_bronze_ingot.png"
})
minetest.register_craftitem("default:clay_brick", {
description = S("Clay Brick"),
inventory_image = "default_clay_brick.png",
})
minetest.register_craftitem("default:clay_lump", {
description = S("Clay Lump"),
inventory_image = "default_clay_lump.png",
})
minetest.register_craftitem("default:coal_lump", {
description = S("Coal Lump"),
inventory_image = "default_coal_lump.png",
groups = {coal = 1, flammable = 1}
})
minetest.register_craftitem("default:copper_ingot", {
description = S("Copper Ingot"),
inventory_image = "default_copper_ingot.png"
})
minetest.register_craftitem("default:copper_lump", {
description = S("Copper Lump"),
inventory_image = "default_copper_lump.png"
})
minetest.register_craftitem("default:diamond", {
description = S("Diamond"),
inventory_image = "default_diamond.png",
})
minetest.register_craftitem("default:flint", {
description = S("Flint"),
inventory_image = "default_flint.png"
})
minetest.register_craftitem("default:gold_ingot", {
description = S("Gold Ingot"),
inventory_image = "default_gold_ingot.png"
})
minetest.register_craftitem("default:gold_lump", {
description = S("Gold Lump"),
inventory_image = "default_gold_lump.png"
})
minetest.register_craftitem("default:iron_lump", {
description = S("Iron Lump"),
inventory_image = "default_iron_lump.png"
})
minetest.register_craftitem("default:mese_crystal", {
description = S("Mese Crystal"),
inventory_image = "default_mese_crystal.png",
})
minetest.register_craftitem("default:mese_crystal_fragment", {
description = S("Mese Crystal Fragment"),
inventory_image = "default_mese_crystal_fragment.png",
})
minetest.register_craftitem("default:obsidian_shard", {
description = S("Obsidian Shard"),
inventory_image = "default_obsidian_shard.png",
})
minetest.register_craftitem("default:paper", {
description = S("Paper"),
inventory_image = "default_paper.png",
groups = {flammable = 3},
})
minetest.register_craftitem("default:steel_ingot", {
description = S("Steel Ingot"),
inventory_image = "default_steel_ingot.png"
})
minetest.register_craftitem("default:stick", {
description = S("Stick"),
inventory_image = "default_stick.png",
groups = {stick = 1, flammable = 2},
})
minetest.register_craftitem("default:tin_ingot", {
description = S("Tin Ingot"),
inventory_image = "default_tin_ingot.png"
})
minetest.register_craftitem("default:tin_lump", {
description = S("Tin Lump"),
inventory_image = "default_tin_lump.png"
})
--
-- Crafting recipes
--
minetest.register_craft({
output = "default:book",
recipe = {
{"default:paper"},
{"default:paper"},
{"default:paper"},
}
})
default.register_craft_metadata_copy("default:book", "default:book_written")
minetest.register_craft({
output = "default:bronze_ingot 9",
recipe = {
{"default:copper_ingot", "default:copper_ingot", "default:copper_ingot"},
{"default:copper_ingot", "default:tin_ingot", "default:copper_ingot"},
{"default:copper_ingot", "default:copper_ingot", "default:copper_ingot"},
}
})
minetest.register_craft({
output = "default:clay_brick 4",
recipe = {
{"default:brick"},
}
})
minetest.register_craft({
output = "default:clay_lump 4",
recipe = {
{"default:clay"},
}
})
minetest.register_craft({
output = "default:coal_lump 9",
recipe = {
{"default:coalblock"},
}
})
minetest.register_craft({
output = "default:copper_ingot 9",
recipe = {
{"default:copperblock"},
}
})
minetest.register_craft({
output = "default:diamond 9",
recipe = {
{"default:diamondblock"},
}
})
minetest.register_craft({
output = "default:gold_ingot 9",
recipe = {
{"default:goldblock"},
}
})
minetest.register_craft({
output = "default:mese_crystal",
recipe = {
{"default:mese_crystal_fragment", "default:mese_crystal_fragment", "default:mese_crystal_fragment"},
{"default:mese_crystal_fragment", "default:mese_crystal_fragment", "default:mese_crystal_fragment"},
{"default:mese_crystal_fragment", "default:mese_crystal_fragment", "default:mese_crystal_fragment"},
}
})
minetest.register_craft({
output = "default:mese_crystal 9",
recipe = {
{"default:mese"},
}
})
minetest.register_craft({
output = "default:mese_crystal_fragment 9",
recipe = {
{"default:mese_crystal"},
}
})
minetest.register_craft({
output = "default:obsidian_shard 9",
recipe = {
{"default:obsidian"}
}
})
minetest.register_craft({
output = "default:paper",
recipe = {
{"default:papyrus", "default:papyrus", "default:papyrus"},
}
})
minetest.register_craft({
output = "default:skeleton_key",
recipe = {
{"default:gold_ingot"},
}
})
minetest.register_craft({
output = "default:steel_ingot 9",
recipe = {
{"default:steelblock"},
}
})
minetest.register_craft({
output = "default:stick 4",
recipe = {
{"group:wood"},
}
})
minetest.register_craft({
output = "default:tin_ingot 9",
recipe = {
{"default:tinblock"},
}
})
--
-- Cooking recipes
--
minetest.register_craft({
type = "cooking",
output = "default:clay_brick",
recipe = "default:clay_lump",
})
minetest.register_craft({
type = "cooking",
output = "default:copper_ingot",
recipe = "default:copper_lump",
})
minetest.register_craft({
type = "cooking",
output = "default:gold_ingot",
recipe = "default:gold_lump",
})
minetest.register_craft({
type = "cooking",
output = "default:gold_ingot",
recipe = "default:key",
cooktime = 5,
})
minetest.register_craft({
type = "cooking",
output = "default:gold_ingot",
recipe = "default:skeleton_key",
cooktime = 5,
})
minetest.register_craft({
type = "cooking",
output = "default:steel_ingot",
recipe = "default:iron_lump",
})
minetest.register_craft({
type = "cooking",
output = "default:tin_ingot",
recipe = "default:tin_lump",
})
--
-- Fuels
--
minetest.register_craft({
type = "fuel",
recipe = "default:book",
burntime = 3,
})
minetest.register_craft({
type = "fuel",
recipe = "default:book_written",
burntime = 3,
})
minetest.register_craft({
type = "fuel",
recipe = "default:coal_lump",
burntime = 40,
})
minetest.register_craft({
type = "fuel",
recipe = "default:paper",
burntime = 1,
})
minetest.register_craft({
type = "fuel",
recipe = "group:stick",
burntime = 1,
})

View File

@ -141,7 +141,7 @@ default.cool_lava = function(pos, node)
minetest.set_node(pos, {name = "default:stone"})
end
minetest.sound_play("default_cool_lava",
{pos = pos, max_hear_distance = 16, gain = 0.25})
{pos = pos, max_hear_distance = 16, gain = 0.25}, true)
end
if minetest.settings:get_bool("enable_lavacooling") ~= false then
@ -210,7 +210,12 @@ end
function default.grow_papyrus(pos, node)
pos.y = pos.y - 1
local name = minetest.get_node(pos).name
if name ~= "default:dirt_with_grass" and name ~= "default:dirt" then
if name ~= "default:dirt" and
name ~= "default:dirt_with_grass" and
name ~= "default:dirt_with_dry_grass" and
name ~= "default:dirt_with_rainforest_litter" and
name ~= "default:dry_dirt" and
name ~= "default:dry_dirt_with_dry_grass" then
return
end
if not minetest.find_node_near(pos, 3, {"group:water"}) then
@ -247,7 +252,17 @@ minetest.register_abm({
minetest.register_abm({
label = "Grow papyrus",
nodenames = {"default:papyrus"},
neighbors = {"default:dirt", "default:dirt_with_grass"},
-- Grows on the dirt and surface dirt nodes of the biomes papyrus appears in,
-- including the old savanna nodes.
-- 'default:dirt_with_grass' is here only because it was allowed before.
neighbors = {
"default:dirt",
"default:dirt_with_grass",
"default:dirt_with_dry_grass",
"default:dirt_with_rainforest_litter",
"default:dry_dirt",
"default:dry_dirt_with_dry_grass",
},
interval = 14,
chance = 71,
action = function(...)
@ -433,6 +448,9 @@ local function leafdecay_after_destruct(pos, oldnode, def)
end
end
local movement_gravity = tonumber(
minetest.settings:get("movement_gravity")) or 9.81
local function leafdecay_on_timer(pos, def)
if minetest.find_node_near(pos, def.radius, def.trunks) then
return false
@ -459,6 +477,21 @@ local function leafdecay_on_timer(pos, def)
minetest.remove_node(pos)
minetest.check_for_falling(pos)
-- spawn a few particles for the removed node
minetest.add_particlespawner({
amount = 8,
time = 0.001,
minpos = vector.subtract(pos, {x=0.5, y=0.5, z=0.5}),
maxpos = vector.add(pos, {x=0.5, y=0.5, z=0.5}),
minvel = vector.new(-0.5, -1, -0.5),
maxvel = vector.new(0.5, 0, 0.5),
minacc = vector.new(0, -movement_gravity, 0),
maxacc = vector.new(0, -movement_gravity, 0),
minsize = 0,
maxsize = 0,
node = node,
})
end
function default.register_leafdecay(def)
@ -483,7 +516,7 @@ end
--
-- Convert dirt to something that fits the environment
-- Convert default:dirt to something that fits the environment
--
minetest.register_abm({
@ -492,6 +525,7 @@ minetest.register_abm({
neighbors = {
"air",
"group:grass",
"group:dry_grass",
"default:snow",
},
interval = 6,
@ -520,6 +554,8 @@ minetest.register_abm({
minetest.set_node(pos, {name = "default:dirt_with_snow"})
elseif minetest.get_item_group(name, "grass") ~= 0 then
minetest.set_node(pos, {name = "default:dirt_with_grass"})
elseif minetest.get_item_group(name, "dry_grass") ~= 0 then
minetest.set_node(pos, {name = "default:dirt_with_dry_grass"})
end
end
})
@ -581,6 +617,40 @@ minetest.register_abm({
end
})
--
-- Register a craft to copy the metadata of items
--
function default.register_craft_metadata_copy(ingredient, result)
minetest.register_craft({
type = "shapeless",
output = result,
recipe = {ingredient, result}
})
minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv)
if itemstack:get_name() ~= result then
return
end
local original
local index
for i = 1, #old_craft_grid do
if old_craft_grid[i]:get_name() == result then
original = old_craft_grid[i]
index = i
end
end
if not original then
return
end
local copymeta = original:get_meta():to_table()
itemstack:get_meta():from_table(copymeta)
-- put the book with metadata back in the craft grid
craft_inv:set_stack("craft", index, original)
end)
end
--
-- NOTICE: This method is not an official part of the API yet.
@ -605,7 +675,7 @@ function default.can_interact_with_node(player, pos)
-- Is player wielding the right key?
local item = player:get_wielded_item()
if item:get_name() == "default:key" then
if minetest.get_item_group(item:get_name(), "key") == 1 then
local key_meta = item:get_meta()
if key_meta:get_string("secret") == "" then

View File

@ -352,3 +352,12 @@ minetest.register_node("default:furnace_active", {
allow_metadata_inventory_move = allow_metadata_inventory_move,
allow_metadata_inventory_take = allow_metadata_inventory_take,
})
minetest.register_craft({
output = "default:furnace",
recipe = {
{"group:stone", "group:stone", "group:stone"},
{"group:stone", "", "group:stone"},
{"group:stone", "group:stone", "group:stone"},
}
})

View File

@ -14,11 +14,22 @@ default.get_translator = S
-- GUI related stuff
minetest.register_on_joinplayer(function(player)
player:set_formspec_prepend([[
-- Set formspec prepend
local formspec = [[
bgcolor[#080808BB;true]
background[5,5;1,1;gui_formbg.png;true]
background9[5,5;1,1;gui_formbg.png;true;10]
listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF] ]])
listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF] ]]
local name = player:get_player_name()
local info = minetest.get_player_information(name)
if info.formspec_version > 1 then
formspec = formspec .. "background9[5,5;1,1;gui_formbg.png;true;10]"
else
formspec = formspec .. "background[5,5;1,1;gui_formbg.png;true]"
end
player:set_formspec_prepend(formspec)
-- Set hotbar textures
player:hud_set_hotbar_image("gui_hotbar.png")
player:hud_set_hotbar_selected_image("gui_hotbar_selected.png")
end)
function default.get_hotbar_bg(x,y)

View File

@ -15,12 +15,12 @@ local item = {
burn_up = function(self)
-- disappear in a smoke puff
self.object:remove()
local p = self.object:get_pos()
self.object:remove()
minetest.sound_play("default_item_smoke", {
pos = p,
max_hear_distance = 8,
})
}, true)
minetest.add_particlespawner({
amount = 3,
time = 0.1,
@ -39,16 +39,20 @@ local item = {
})
end,
on_step = function(self, dtime)
builtin_item.on_step(self, dtime)
on_step = function(self, dtime, ...)
builtin_item.on_step(self, dtime, ...)
if self.flammable then
-- flammable, check for igniters
-- flammable, check for igniters every 10 s
self.ignite_timer = (self.ignite_timer or 0) + dtime
if self.ignite_timer > 10 then
self.ignite_timer = 0
local node = minetest.get_node_or_nil(self.object:get_pos())
local pos = self.object:get_pos()
if pos == nil then
return -- object already deleted
end
local node = minetest.get_node_or_nil(pos)
if not node then
return
end

View File

@ -51,6 +51,7 @@ Copyright (C) 2010-2018:
Mossmanikin
random-geek
Extex101
An0n3m0us
You are free to:
Share — copy and redistribute the material in any medium or format.

View File

@ -62,12 +62,12 @@ Obsidian Block=Obsidianblock
Dirt=Erde
Dirt with Grass=Erde mit Gras
Dirt with Grass and Footsteps=Erde mit Gras und Fußstapfen
Dirt with Dry Grass=Erde mit trockenem Gras
Dirt with Savanna Grass=Erde mit Savannengras
Dirt with Snow=Erde mit Schnee
Dirt with Rainforest Litter=Erde mit Regenwaldboden
Dirt with Coniferous Litter=Erde mit Nadelwaldboden
Dry Dirt=Trockene Erde
Dry Dirt with Dry Grass=Trockene Erde mit trockenem Gras
Savanna Dirt=Savannenerde
Savanna Dirt with Savanna Grass=Savannenerde mit Savannengras
Permafrost=Permafrost
Permafrost with Stones=Permafrost mit Steinen
Permafrost with Moss=Permafrost mit Moos
@ -124,7 +124,7 @@ Papyrus=Papyrus
Dry Shrub=Trockener Busch
Jungle Grass=Dschungelgras
Grass=Gras
Dry Grass=Trockenes Gras
Savanna Grass=Savannengras
Fern=Farn
Marram Grass=Dünengras
Bush Stem=Buschstamm

View File

@ -0,0 +1,211 @@
# textdomain: default
Stone=Batu
Cobblestone=Bongkahan Batu
Stone Brick=Tembok Batu
Stone Block=Balok Batu
Mossy Cobblestone=Bongkahan Batu Berlumut
Desert Stone=Batu Gurun
Desert Cobblestone=Bongkahan Batu Gurun
Desert Stone Brick=Tembok Batu Gurun
Desert Stone Block=Balok Batu Gurun
Sandstone=Batu Pasir
Sandstone Brick=Tembok Batu Pasir
Sandstone Block=Balok Batu Pasir
Desert Sandstone=Batu Pasir Gurun
Desert Sandstone Brick=Tembok Batu Pasir Gurun
Desert Sandstone Block=Balok Batu Pasir Gurun
Silver Sandstone=Batu Pasir Perak
Silver Sandstone Brick=Tembok Batu Pasir Perak
Silver Sandstone Block=Balok Batu Pasir Perak
Obsidian=Obsidian
Obsidian Brick=Tembok Obsidian
Obsidian Block=Balok Obsidian
Dirt=Tanah
Dirt with Grass=Tanah Berumput
Dirt with Grass and Footsteps=Tanah Berumput dan Tapak Kaki
Dirt with Savanna Grass=Tanah Berumput Sabana
Dirt with Snow=Tanah Bersalju
Dirt with Rainforest Litter=Tanah Berserasah Hutan Hujan
Dirt with Coniferous Litter=Tanah Berserasah Hutan Konifer
Savanna Dirt=Tanah Sabana
Savanna Dirt with Savanna Grass=Tanah Sabana Berumput Sabana
Permafrost=Ibun Abadi
Permafrost with Stones=Ibun Abadi Berbatu
Permafrost with Moss=Ibun Abadi Berlumut
Sand=Pasir
Desert Sand=Pasir Gurun
Silver Sand=Pasir Perak
Gravel=Kerikil
Clay=Semen
Snow=Salju
Snow Block=Balok Salju
Ice=Es
Cave Ice=Es Gua
Apple Tree=Pohon Apel
Apple Wood Planks=Papan Kayu Pohon Apel
Apple Tree Sapling=Bibit Apel
Apple Tree Leaves=Daun Pohon Apel
Apple=Apel
Apple Marker=Penanda Apel
Jungle Tree=Pohon Hutan Rimba
Jungle Wood Planks=Papan Kayu Pohon Rimba
Jungle Tree Leaves=Daun Pohon Rimba
Jungle Tree Sapling=Bibit Pohon Rimba
Emergent Jungle Tree Sapling=Bibit Bertumbuh Pohon Rimba
Pine Tree=Pohon Pinus
Pine Wood Planks=Papan Kayu Pinus
Pine Needles=Daun Pinus
Pine Tree Sapling=Bibit Pinus
Acacia Tree=Pohon Akasia
Acacia Wood Planks=Papan Kayu Akasia
Acacia Tree Leaves=Daun Akasia
Acacia Tree Sapling=Bibit Akasia
Aspen Tree=Pohon Aspen
Aspen Wood Planks=Papan Kayu Aspen
Aspen Tree Leaves=Daun Aspen
Aspen Tree Sapling=Bibit Aspen
Coal Ore=Bijih Batu Bara
Coal Block=Balok Batu Bara
Iron Ore=Biji Besi
Steel Block=Balok Baja
Copper Ore=Bijih Tembaga
Copper Block=Balok Tembaga
Tin Ore=Bijih Timah
Tin Block=Balok Timah
Bronze Block=Balok Perunggu
Mese Ore=Bijih Mese
Mese Block=Balok Mese
Gold Ore=Bijih Emas
Gold Block=Balok Emas
Diamond Ore=Bijih Berlian
Diamond Block=Balok Berlian
Cactus=Kaktus
Large Cactus Seedling=Bibit Kaktus Besar
Papyrus=Papirus
Dry Shrub=Semak Kering
Jungle Grass=Rumput Rimba
Grass=Rumput
Savanna Grass=Rumput Sabana
Fern=Pakis
Marram Grass=Rumput Pantai
Bush Stem=Batang Semak
Bush Leaves=Daun Semak
Bush Sapling=Bibit Semak
Blueberry Bush Leaves with Berries=Daun Bluberi Berbuah
Blueberry Bush Leaves=Daun Bluberi
Blueberry Bush Sapling=Bibit Bluberi
Acacia Bush Stem=Batang Semak Akasia
Acacia Bush Leaves=Daun Semak Akasia
Acacia Bush Sapling=Bibit Semak Akasia
Pine Bush Stem=Batang Semak Pinus
Pine Bush Needles=Daun Semak Pinus
Pine Bush Sapling=Bibit Semak Pinus
Kelp=Kelp
Green Coral=Koral Hijau
Pink Coral=Koral Jambon
Cyan Coral=Koral Sian
Brown Coral=Koral Cokelat
Orange Coral=Koral Oranye
Coral Skeleton=Kerangka Koral
Water Source=Mata Air
Flowing Water=Aliran Air
River Water Source=Mata Air Sungai
Flowing River Water=Aliran Air Sungai
Lava Source=Sumber Lava
Flowing Lava=Aliran Lava
Empty Bookshelf=Rak Buku Kosong
Bookshelf (@1 written, @2 empty books)=Rak Buku (@1 buku tertulis, @2 buku kosong)
Bookshelf=Rak Buku
Text too long=Teks terlalu panjang
Wooden Sign=Penanda Kayu
Steel Sign=Penanda Baja
Wooden Ladder=Tangga Kayu
Steel Ladder=Tangga Baja
Apple Wood Fence=Pagar Kayu Apel
Acacia Wood Fence=Pagar Akasia
Jungle Wood Fence=Pagar Kayu Rimba
Pine Wood Fence=Pagar Pinus
Aspen Wood Fence=Pagar Aspen
Apple Wood Fence Rail=Rel Pagar Kayu Apel
Acacia Wood Fence Rail=Rel Pagar Akasia
Jungle Wood Fence Rail=Rel Pagar Kayu Rimba
Pine Wood Fence Rail=Rel Pagar Pinus
Aspen Wood Fence Rail=Rel Pagar Aspen
Glass=Kaca
Obsidian Glass=Kaca Obsidian
Brick Block=Balok Bata
Mese Lamp=Lampu Mese
Mese Post Light=Lampu Taman Mese
Cloud=Awan
@1 will intersect protection on growth.=@1 akan memotong perlindungan ketika tumbuh.
Torch=Obor
Wooden Pickaxe=Beliung Kayu
Stone Pickaxe=Beliung Batu
Bronze Pickaxe=Beliung Perunggu
Steel Pickaxe=Beliung Baja
Mese Pickaxe=Beliung Mese
Diamond Pickaxe=Beliung Berlian
Wooden Shovel=Sekop Kayu
Stone Shovel=Sekop Batu
Bronze Shovel=Sekop Perunggu
Steel Shovel=Sekop Baja
Mese Shovel=Sekop Mese
Diamond Shovel=Sekop Berlian
Wooden Axe=Kapak Kayu
Stone Axe=Kapak Batu
Bronze Axe=Kapak Perunggu
Steel Axe=Kapak Baja
Mese Axe=Kapak Mese
Diamond Axe=Kapak Berlian
Wooden Sword=Pedang Kayu
Stone Sword=Pedang Batu
Bronze Sword=Pedang Perunggu
Steel Sword=Pedang Baja
Mese Sword=Pedang Mese
Diamond Sword=Pedang Berlian
Key=Kunci
Furnace is empty=Tungku kosong
100% (output full)=100% (keluaran penuh)
@1%=@1%
Not cookable=Tidak bisa dimasak
Empty=Kosong
Furnace active=Tungku nyala
Furnace inactive=Tungku mati
(Item: @1; Fuel: @2)=(Barang: @1; Bahan Bakar: @2)
Furnace=Tungku
Title:=Judul:
Contents:=Isi:
Save=Simpan
by @1=oleh @1
Page @1 of @2=Halaman @1 dari @2
"@1"="@1"
"@1" by @2="@1" oleh @2
Skeleton Key=Kunci Induk
Key to @1's @2=Kunci @2 milik @1
Blueberries=Bluberi
Book=Buku
Book with Text=Buku Tertulis
Bronze Ingot=Perunggu Batangan
Clay Brick=Bata
Clay Lump=Bongkahan Semen
Coal Lump=Bongkahan Batu Bara
Copper Ingot=Tembaga Batangan
Copper Lump=Bongkahan Tembaga
Diamond=Berlian
Flint=Batu Api
Gold Ingot=Emas Batangan
Gold Lump=Bongkahan Emas
Iron Lump=Bongkahan Besi
Mese Crystal=Kristal Mese
Mese Crystal Fragment=Pecahan Kristal Mese
Obsidian Shard=Pecahan Obsidian
Paper=Kertas
Steel Ingot=Baja Batangan
Stick=Tongkat
Tin Ingot=Timah Batangan
Tin Lump=Bongkahan Timah
Locked Chest=Peti Terkunci
Locked Chest (owned by @1)=Peti Terkunci (milik @1)
You do not own this chest.=Anda bukan pemilik peti ini.
a locked chest=suatu peti terkunci
Chest=Peti

View File

@ -0,0 +1,211 @@
# textdomain: default
Locked Chest=Peti Berkunci
Locked Chest (owned by @1)=Peti Berkunci (milik @1)
You do not own this chest.=Ini bukan peti milik anda.
a locked chest=peti berkunci
Chest=Peti
Stick=Serpihan Kayu
Paper=Kertas
"@1" by @2="@1" oleh @2
Book=Buku
Book with Text=Buku Bertulisan
Skeleton Key=Kunci Induk
Key to @1's @2=Kunci @2 milik @1
Coal Lump=Longgokan Batu Arang
Iron Lump=Longgokan Besi
Copper Lump=Longgokan Tembaga
Tin Lump=Longgokan Timah
Mese Crystal=Kristal Mese
Gold Lump=Longgokan Emas
Diamond=Berlian
Clay Lump=Longgokan Tanah Liat
Steel Ingot=Jongkong Keluli
Copper Ingot=Jongkong Tembaga
Tin Ingot=Jongkong Timah
Bronze Ingot=Jongkong Gangsa
Gold Ingot=Jongkong Emas
Mese Crystal Fragment=Serpihan Mese
Clay Brick=Bata Tanah Liat
Obsidian Shard=Serpihan Obsidia
Flint=Batu Api
Blueberries=Beri Biru
Furnace is empty=Relau masih kosong
100% (output full)=100% (keluaran penuh)
@1%=@1%
Empty=Kosong
Not cookable=Tidak boleh dimasak
Furnace active=Relau aktif
Furnace inactive=Relau tidak aktif
(Item: @1; Fuel: @2)=(Item: @1; Bahan api: @2)
Furnace=Relau
Stone=Batu
Cobblestone=Batu Buntar
Stone Brick=Bata Batu
Stone Block=Bongkah Batu
Mossy Cobblestone=Batu Buntar Berlumut
Desert Stone=Batu Gurun
Desert Cobblestone=Batu Buntar Gurun
Desert Stone Brick=Bata Batu Gurun
Desert Stone Block=Bongkah Batu Gurun
Sandstone=Batu Pasir
Sandstone Brick=Bata Batu Pasir
Sandstone Block=Bongkah Batu Pasir
Desert Sandstone=Batu Pasir Gurun
Desert Sandstone Brick=Bata Batu Pasir Gurun
Desert Sandstone Block=Bongkah Batu Pasir Gurun
Silver Sandstone=Batu Pasir Perak
Silver Sandstone Brick=Bata Batu Pasir Perak
Silver Sandstone Block=Bongkah Batu Pasir Perak
Obsidian=Obsidia
Obsidian Brick=Bata Obsidia
Obsidian Block=Bongkah Obsidia
Dirt=Tanah
Dirt with Grass=Tanah Berumput
Dirt with Grass and Footsteps=Tanah Berumput dan Tapak Kaki
Dirt with Dry Grass=Tanah Berumput Kering
Dirt with Snow=Tanah Bersalji
Dirt with Rainforest Litter=Tanah Bersarap Hutan Hujan
Dirt with Coniferous Litter=Tanah Bersarap Hutan Konifer
Dry Dirt=Tanah Kering
Dry Dirt with Dry Grass=Tanah Kering Berumput Kering
Permafrost=Ibun Abadi
Permafrost with Stones=Ibun Abadi Berbatu
Permafrost with Moss=Ibun Abadi Berlumut
Sand=Pasir
Desert Sand=Pasir Gurun
Silver Sand=Pasir Perak
Gravel=Kelikir
Clay=Tanah Liat
Snow=Salji
Snow Block=Bongkah Salji
Ice=Ais
Cave Ice=Ais Gua
Apple Tree=Kayu Pokok Epal
Apple Wood Planks=Papan Kayu Epal
Apple Tree Sapling=Anak Pokok Epal
Apple Tree Leaves=Daun Pokok Epal
Apple=Epal
Apple Marker=Penanda Epal
Jungle Tree=Kayu Pokok Hutan
Jungle Wood Planks=Papan Kayu Hutan
Jungle Tree Leaves=Daun Pokok Hutan
Jungle Tree Sapling=Anak Pokok Hutan
Emergent Jungle Tree Sapling=Anak Pokok Hutan Kembang
Pine Tree=Kayu Pokok Pain
Pine Wood Planks=Papan Kayu Pain
Pine Needles=Daun Pokok Pain
Pine Tree Sapling=Anak Pokok Pain
Acacia Tree=Kayu Pokok Akasia
Acacia Wood Planks=Papan Kayu Akasia
Acacia Tree Leaves=Daun Pokok Akasia
Acacia Tree Sapling=Anak Pokok Akasia
Aspen Tree=Kayu Pokok Aspen
Aspen Wood Planks=Papan Kayu Aspen
Aspen Tree Leaves=Daun Pokok Aspen
Aspen Tree Sapling=Anak Pokok Aspen
Coal Ore=Bijih Batu Arang
Coal Block=Bongkah Batu Arang
Iron Ore=Bijih Besi
Steel Block=Bongkah Keluli
Copper Ore=Bijih Tembaga
Copper Block=Bongkah Tembaga
Tin Ore=Bijih Timah
Tin Block=Bongkah Timah
Bronze Block=Bongkah Gangsa
Mese Ore=Bijih Mese
Mese Block=Bongkah Mese
Gold Ore=Bijih Emas
Gold Block=Bongkah Emas
Diamond Ore=Bijih Intan
Diamond Block=Bongkah Intan
Cactus=Kaktus
Large Cactus Seedling=Benih Kaktus Besar
Papyrus=Papirus
Dry Shrub=Pokok Renek Kering
Jungle Grass=Rumput Hutan
Grass=Rumput
Dry Grass=Rumput Kering
Fern=Paku Pakis
Marram Grass=Rumput Maram
Bush Stem=Batang Belukar
Bush Leaves=Daun Belukar
Bush Sapling=Anak Belukar
Blueberry Bush Leaves with Berries=Daun Belukar Beri Biru Berberi
Blueberry Bush Leaves=Daun Belukar Beri Biru
Blueberry Bush Sapling=Anak Belukar Beri Biru
Acacia Bush Stem=Batang Belukar Akasia
Acacia Bush Leaves=Daun Belukar Akasia
Acacia Bush Sapling=Anak Belukar Akasia
Pine Bush Stem=Batang Belukar Pain
Pine Bush Needles=Daun Belukar Pain
Pine Bush Sapling=Anak Belukar Pain
Kelp=Kelpa
Green Coral=Batu Karang Hijau
Pink Coral=Batu Karang Merah Jambu
Cyan Coral=Batu Karang Biru Kehijauan
Brown Coral=Batu Karang Perang
Orange Coral=Batu Karang Jingga
Coral Skeleton= Rangka Karang
Water Source=Sumber Air
Flowing Water=Air Mengalir
River Water Source=Sumber Air Sungai
Flowing River Water=Air Sungai Mengalir
Lava Source=Sumber Lava
Flowing Lava=Lava Mengalir
Empty Bookshelf=Rak Buku Kosong
Bookshelf (@1 written, @2 empty books)=Rak Buku (@1 buku bertulis, @2 buku kosong)
Bookshelf=Rak Buku
Text too long=Tulisan terlalu panjang
Wooden Sign=Papan Tanda Kayu
Steel Sign=Papan Tanda Keluli
Wooden Ladder=Tangga Panjat Kayu
Steel Ladder=Tangga Panjat Keluli
Apple Wood Fence=Pagar Kayu Epal
Acacia Wood Fence=Pagar Kayu Akasia
Jungle Wood Fence=Pagar Kayu Hutan
Pine Wood Fence=Pagar Kayu Pain
Aspen Wood Fence=Pagar Kayu Aspen
Apple Wood Fence Rail=Pagar Rel Kayu Epal
Acacia Wood Fence Rail=Pagar Rel Kayu Akasia
Jungle Wood Fence Rail=Pagar Rel Kayu Hutan
Pine Wood Fence Rail=Pagar Rel Kayu Pain
Aspen Wood Fence Rail=Pagar Rel Kayu Aspen
Glass=Kaca
Obsidian Glass=Kaca Obsidia
Brick Block=Bongkah Bata
Mese Lamp=Lampu Mese
Mese Post Light=Lampu Tiang Mese
Cloud=Awan
Wooden Pickaxe=Beliung Kayu
Stone Pickaxe=Beliung Batu
Bronze Pickaxe=Beliung Gangsa
Steel Pickaxe=Beliung Keluli
Mese Pickaxe=Beliung Mese
Diamond Pickaxe=Beliung Intan
Wooden Shovel=Penyodok Kayu
Stone Shovel=Penyodok Batu
Bronze Shovel=Penyodok Gangsa
Steel Shovel=Penyodok Keluli
Mese Shovel=Penyodok Mese
Diamond Shovel=Penyodok Intan
Wooden Axe=Kapak Kayu
Stone Axe=Kapak Batu
Bronze Axe=Kapak Gangsa
Steel Axe=Kapak Keluli
Mese Axe=Kapak Mese
Diamond Axe=Kapak Intan
Wooden Sword=Pedang Kayu
Stone Sword=Pedang Batu
Bronze Sword=Pedang Gangsa
Steel Sword=Pedang Keluli
Mese Sword=Pedang Mese
Diamond Sword=Pedang Intan
Key=Kunci
Torch=Obor
@1 will intersect protection on growth.=@1 akan masuk kawasan perlindungan lain apabila ia tumbuh.
Title:=Tajuk:
Contents:=Kandungan:
Save=Simpan
by @1=oleh @1
Page @1 of @2=Ms. @1 / @2
"@1"="@1"

View File

@ -0,0 +1,211 @@
# textdomain: default
Locked Chest=Заблокированный Сундук
Locked Chest (owned by @1)=Заблокированный Сундук (владелец: @1)
You do not own this chest.=Вы не владелец этого сундука.
a locked chest=заблокированный сундук
Chest=Сундук
Stick=Палка
Paper=Бумага
"@1" by @2="@1" @2
Book=Книга
Book with Text=Книга с Текстом
Skeleton Key=Ключ Скелета
Key to @1's @2=Ключ к @2 от @1
Coal Lump=Кусок Угля
Iron Lump=Кусок Железа
Copper Lump=Кусок Меди
Tin Lump=Кусок Олова
Mese Crystal=Кристалл Месе
Gold Lump=Кусок Золота
Diamond=Алмаз
Clay Lump=Ком Глины
Steel Ingot=Железный Брусок
Copper Ingot=Медный Брусок
Tin Ingot=Оловянный Брусок
Bronze Ingot=Бронзовый Брусок
Gold Ingot=Золотой Брусок
Mese Crystal Fragment=Осколок Кристалла Месе
Clay Brick=Глиняный Кирпич
Obsidian Shard=Обсидиановый Осколок
Flint=Огниво
Blueberries=Черника
Furnace is empty=Печь пустая
100% (output full)=100% (полное приготовление)
@1%=@1%
Empty=Пустое
Not cookable=Не может быть приготовлено
Furnace active=Печь зажжена
Furnace inactive=Печь не зажжена
(Item: @1; Fuel: @2)=(Предмет: @1; Топливо: @2)
Furnace=Печь
Stone=Камень
Cobblestone=Булыжник
Stone Brick=Каменный Кирпич
Stone Block=Каменный Блок
Mossy Cobblestone=Мшистый Булыжник
Desert Stone=Пустынный Камень
Desert Cobblestone=Пустынный Булыжник
Desert Stone Brick=Пустынный Каменный Кирпич
Desert Stone Block=Пустынный Каменный Блок
Sandstone=Песчаник
Sandstone Brick=Песчаниковый Кирпич
Sandstone Block=Песчаниковый Блок
Desert Sandstone=Пустынный Песчаник
Desert Sandstone Brick=Пустынный Песчаниковый Кирпич
Desert Sandstone Block=Пустынный Песчаниковый Блок
Silver Sandstone=Серебряный Песчаник
Silver Sandstone Brick=Серебряный Песчаниковый Кирпич
Silver Sandstone Block=Серебряный Песчаниковый Блок
Obsidian=Обсидиан
Obsidian Brick=Обсидиановый Кирпич
Obsidian Block=Обсидиановый Блок
Dirt=Земля
Dirt with Grass=Земля с Травой
Dirt with Grass and Footsteps=Земля с Травой и Следами
Dirt with Dry Grass=Земля с Сухой Травой
Dirt with Snow=Земля Со Снегом
Dirt with Rainforest Litter=Земля с Тропической Подстилкой
Dirt with Coniferous Litter=Земля с Сосновой Подстилкой
Dry Dirt=Сухая Земля
Dry Dirt with Dry Grass=Сухая Земля с Сухой Травой
Permafrost=Замороженная Почва
Permafrost with Stones=Замороженная Почва с Камнями
Permafrost with Moss=Замороженная Почва с Мхом
Sand=Песок
Desert Sand=Пустынный Песок
Silver Sand=Серебряный Песок
Gravel=Гравий
Clay=Глиняный Блок
Snow=Снег
Snow Block=Снежный Блок
Ice=Лёд
Cave Ice=Пещерный Лёд
Apple Tree=Яблоневый Ствол
Apple Wood Planks=Яблоневые Деревянные Доски
Apple Tree Sapling=Яблоневый Саженец
Apple Tree Leaves=Яблоневая Листва
Apple=Яблоко
Apple Marker=Яблочная Метка
Jungle Tree=Ствол Тропического Дерева
Jungle Wood Planks=Деревянные Доски Тропического Дерева
Jungle Tree Leaves=Листва Тропического Дерева
Jungle Tree Sapling=Саженец Тропического Дерева
Emergent Jungle Tree Sapling=Выросший Саженец Тропического Дерева
Pine Tree=Сосновый Ствол
Pine Wood Planks=Сосновые Деревянные Доски
Pine Needles=Сосновая Хвоя
Pine Tree Sapling=Сосновый Саженец
Acacia Tree=Ствол Акации
Acacia Wood Planks=Деревянные Доски Акации
Acacia Tree Leaves=Листва Акации
Acacia Tree Sapling=Саженец Акации
Aspen Tree=Осиновый Ствол
Aspen Wood Planks=Осиновые Деревянные Доски
Aspen Tree Leaves=Осиновая Листва
Aspen Tree Sapling=Осиновый Саженец
Coal Ore=Уголь
Coal Block=Угольный Блок
Iron Ore=Железная Руда
Steel Block=Стальной Блок
Copper Ore=Медная Руда
Copper Block=Медный Блок
Tin Ore=Оловянная Руда
Tin Block=Оловянный Блок
Bronze Block=Бронзовый Блок
Mese Ore=Месевая Руда
Mese Block=Месевый Блок
Gold Ore=Золотая Руда
Gold Block=Золотой Блок
Diamond Ore=Алмаз
Diamond Block=Алмазный Блок
Cactus=Кактус
Large Cactus Seedling=Кактусовый Саженец
Papyrus=Папирус
Dry Shrub=Сухой Куст
Jungle Grass=Тропическая Трава
Grass=Трава
Dry Grass=Сухая Трава
Fern=Папоротник
Marram Grass=Песколюб
Bush Stem=Ствол Яблочного Деревца
Bush Leaves=Листья Яблочного Деревца
Bush Sapling=Саженца яблочного деревца
Blueberry Bush Leaves with Berries=Куст Черники с Ягодами
Blueberry Bush Leaves=Куст Черники
Blueberry Bush Sapling=Саженца Куста Черники
Acacia Bush Stem=Ствол Деревца Акации
Acacia Bush Leaves=Листья Деревца Акации
Acacia Bush Sapling=Саженца Деревца Акации
Pine Bush Stem=Сосновое Деревце
Pine Bush Needles=Хвоя Соснового Деревца
Pine Bush Sapling=Саженца Соснового Деревца
Kelp=Ламинария
Green Coral=Зеленый Коралл
Pink Coral=Розовый Коралл
Cyan Coral=Голубой Коралл
Brown Coral=Бурый Коралл
Orange Coral=Оранжевый Коралл
Coral Skeleton=Коралловый Остов
Water Source=Водный Источник
Flowing Water=Текущая Вода
River Water Source=Речной Водный Источник
Flowing River Water=Текущая Речная Вода
Lava Source=Лавовый Источник
Flowing Lava=Текущая Лава
Empty Bookshelf=Пустая Книжная Полка
Bookshelf (@1 written, @2 empty books)=Книжная Полка (@1 написано, @2 чистые книги)
Bookshelf=Книжная Полка
Text too long=Текст слишком длинный
Wooden Sign=Деревянная Табличка
Steel Sign=Стальная Табличка
Wooden Ladder=Деревянная Лестница
Steel Ladder=Стальная Лестница
Apple Wood Fence=Яблоневый Деревянный Забор
Acacia Wood Fence=Деревянный Забор Из Акации
Jungle Wood Fence=Деревянный Забор Из Тропического Дерева
Pine Wood Fence=Сосновый Деревянный Забор
Aspen Wood Fence=Осиновый Деревянный Забор
Apple Wood Fence Rail=Яблоневый Деревянный Реечный Забор
Acacia Wood Fence Rail=Деревянный Реечный Забор Из Акации
Jungle Wood Fence Rail=Деревянный Реечный Забор Из Тропического Дерева
Pine Wood Fence Rail=Сосновый Деревянный Реечный Забор
Aspen Wood Fence Rail=Осиновый Деревянный Реечный Забор
Glass=Стекло
Obsidian Glass=Обсидиановое Стекло
Brick Block=Кирпичный Блок
Mese Lamp=Месе Лампа
Mese Post Light=Столб с Месе Фонарем
Cloud=Облако
Wooden Pickaxe=Деревянная Кирка
Stone Pickaxe=Каменная Кирка
Bronze Pickaxe=Бронзовая Кирка
Steel Pickaxe=Стальная Кирка
Mese Pickaxe=Месе Кирка
Diamond Pickaxe=Алмазная Кирка
Wooden Shovel=Деревянная Лопата
Stone Shovel=Каменная Лопата
Bronze Shovel=Бронзовая Лопата
Steel Shovel=Стальная Лопата
Mese Shovel=Месе Лопата
Diamond Shovel=Алмазная Лопата
Wooden Axe=Деревянный Топор
Stone Axe=Каменный Топор
Bronze Axe=Бронзовый Топор
Steel Axe=Стальной Топор
Mese Axe=Месе Топор
Diamond Axe=Алмазный Топор
Wooden Sword=Деревянный Меч
Stone Sword=Каменный Меч
Bronze Sword=Бронзовый Меч
Steel Sword=Стальной Меч
Mese Sword=Месе Меч
Diamond Sword=Алмазный Меч
Key=Ключ
Torch=Факел
@1 will intersect protection on growth.=@1 пересечёт защиту по росту.
Title:=Заголовок:
Contents:=Содержимое:
Save=Сохранить
by @1=@1
Page @1 of @2=Страница @1 из @2
"@1"="@1"

View File

@ -0,0 +1,211 @@
## textdomain: default
Locked Chest=Låst kista
Locked Chest (owned by @1)=Låst kista (Ägd av @1)
You do not own this chest.=Du äger inte denna kistan.
a locked chest=en låst kista
Chest=Kista
Stick=Pinne
Paper=Papper
"@1" by @2="@1" av @2
Book=Bok
Book with Text=Bok med text
Skeleton Key=Skelett Nyckel
Key to @1's @2=Nyckel till @1s @2
Coal Lump=Kol Klumo
Iron Lump=Järn Klump
Copper Lump=Koppar Klump
Tin Lump=Tenn Klump
Mese Crystal=Mese Kristall
Gold Lump=Guld Klump
Diamond=Diamant
Clay Lump=Lerklump
Steel Ingot=Stål tacka
Copper Ingot=Koppar tacka
Tin Ingot=Tenn tacka
Bronze Ingot=Brons tacka
Gold Ingot=Guld tacka
Mese Crystal Fragment=Mese Kristall Fragment
Clay Brick=Tegelsten
Obsidian Shard=Obsidian Skärva
Flint=Flinta
Blueberries=Blåbär
Furnace is empty=Ugnen är tom
100% (output full)=100% (utgången full)
@1%=@1%
Empty=Tom
Not cookable=Inte kokbar
Furnace active=Ugn aktiv
Furnace inactive=Ugn inaktiv
(Item: @1; Fuel: @2)=(Sak: @1; Bränsle: @2)
Furnace=Ugn
Stone=Sten
Cobblestone=Kullersten
Stone Brick=Stentegel
Stone Block=Sten block
Mossy Cobblestone=Mossig kullersten
Desert Stone=Öken sten
Desert Cobblestone=Öken kullersten
Desert Stone Brick=Öken stentegel
Desert Stone Block=Öken sten block
Sandstone=Sandsten
Sandstone Brick=Sandstenstegel
Sandstone Block=Sandsten block
Desert Sandstone=Öken sandsten
Desert Sandstone Brick=Öken Sandstenstegel
Desert Sandstone Block=Öken sandsten block
Silver Sandstone=Silver sandsten
Silver Sandstone Brick=Silver Sandstenstegel
Silver Sandstone Block=Silver sandsten block
Obsidian=Obsidian
Obsidian Brick=Obsidiantegel
Obsidian Block=Obsidian block
Dirt=Jord
Dirt with Grass=Jord med gräs
Dirt with Grass and Footsteps=Jord med gräs och fotsteg
Dirt with Dry Grass=Jord med torrt gräs
Dirt with Snow=Jord med snö
Dirt with Rainforest Litter=Jord med regnskogströ
Dirt with Coniferous Litter=Jord med Barrträd
Dry Dirt=Torr jord
Dry Dirt with Dry Grass=Torr jord med torrt gräs
Permafrost=Permafrost
Permafrost with Stones=Permafrost med sten
Permafrost with Moss=Permafrost med mossa
Sand=Sand
Desert Sand=Öken sand
Silver Sand=Silver sand
Gravel=Grus
Clay=Lera
Snow=Snö
Snow Block=Snö block
Ice=Is
Cave Ice=Grott Is
Apple Tree=Äpple Träd
Apple Wood Planks=Äpple Plankor
Apple Tree Sapling=Äpple Planta
Apple Tree Leaves=Äpple Löv
Apple=Äpple
Apple Marker=Äpple Markör
Jungle Tree=Djungel Träd
Jungle Wood Planks=Djungel Plankor
Jungle Tree Leaves=Djungel Löv
Jungle Tree Sapling=Djungel Planta
Emergent Jungle Tree Sapling=Nybliven Djungel Planta
Pine Tree=Tall
Pine Wood Planks= Tall Plankor
Pine Needles=Granbarr
Pine Tree Sapling=Tall Planta
Acacia Tree=Akacia Träd
Acacia Wood Planks=Akacia Plankor
Acacia Tree Leaves=Akacia Löv
Acacia Tree Sapling=Akacia Planta
Aspen Tree=Asp
Aspen Wood Planks=Asp Plankor
Aspen Tree Leaves=Asp Löv
Aspen Tree Sapling=Asp Planta
Coal Ore=Kol Malm
Coal Block=Kol Block
Iron Ore=Järn Malm
Steel Block=Stål Block
Copper Ore=Koppar Malm
Copper Block=Koppar Block
Tin Ore=Tenn Malm
Tin Block=Tenn Block
Bronze Block=Brons Block
Mese Ore=Mese Malm
Mese Block=Mese Block
Gold Ore=Guld Malm
Gold Block=Guld Block
Diamond Ore=Diamant Malm
Diamond Block=Diamant Block
Cactus=Kaktus
Large Cactus Seedling=Stor kaktusplanta
Papyrus=Papyrus
Dry Shrub=Torr Buske
Jungle Grass=Djungel Gräs
Grass=Gräs
Dry Grass=Torrt Gräs
Fern=Ormbunke
Marram Grass=Marram Gräs
Bush Stem=Busk Stam
Bush Leaves=Busk Löv
Bush Sapling=Busk Planta
Blueberry Bush Leaves with Berries=Blåbärsbusks Löv med Bär
Blueberry Bush Leaves=Blåbärsbusks Löv
Blueberry Bush Sapling=Blåbärsbusks Plantga
Acacia Bush Stem=Akacia Busks Stam
Acacia Bush Leaves=Akacia Busks Löv
Acacia Bush Sapling=Akacia Busks Planta
Pine Bush Stem=Tall Busks Stam
Pine Bush Needles=Tall Busks Granbarr
Pine Bush Sapling=Tall Busks Planta
Kelp=Brunalg
Green Coral=Grön Korall
Pink Coral=Rosa Korall
Cyan Coral=Cyan Korall
Brown Coral=Brun Korall
Orange Coral=Orange Korall
Coral Skeleton=Korall Skelett
Water Source=Vattenkälla
Flowing Water=Flödande Vatten
River Water Source=Flodvattenkälla
Flowing River Water=Flödande Flodvatten
Lava Source=Lavakälla
Flowing Lava=Flödande Lava
Empty Bookshelf=Tom Bokhylla
Bookshelf (@1 written, @2 empty books)=Bokhylla (@1 skriva, @2 tomma böcker)
Bookshelf=Bokhylla
Text too long=Text för lång
Wooden Sign=Trä Skylt
Steel Sign=Stål Skylt
Wooden Ladder=Trä Stege
Steel Ladder=Stål Stege
Apple Wood Fence=Äpple Trä Staket
Acacia Wood Fence=Akacia Trä Staket
Jungle Wood Fence=Djungel Trä Staket
Pine Wood Fence=Tall Trä Staket
Aspen Wood Fence=Asp Trä Staket
Apple Wood Fence Rail=Äpple Trä Staket Pinne
Acacia Wood Fence Rail=Akacia Trä Staket Pinne
Jungle Wood Fence Rail=Djungel Trä Staket Pinne
Pine Wood Fence Rail=Tall Trä Staket Pinne
Aspen Wood Fence Rail=Asp Trä Staket Pinne
Glass=Glas
Obsidian Glass=Obsidian Glas
Brick Block=Tegelstens Block
Mese Lamp=Mese Lampa
Mese Post Light=Mese Postljus
Cloud=Moln
Wooden Pickaxe=Trä Hacka
Stone Pickaxe=Sten Hacka
Bronze Pickaxe=Brons Hacka
Steel Pickaxe=Stål Hacka
Mese Pickaxe=Mese Hacka
Diamond Pickaxe=Diamant Hacka
Wooden Shovel=Trä Spade
Stone Shovel=Sten Spade
Bronze Shovel=Brons Spade
Steel Shovel=Stål Spade
Mese Shovel=Mese Spade
Diamond Shovel=Diamant Spade
Wooden Axe=Trä Yxa
Stone Axe=Sten Yxa
Bronze Axe=Brons Yxa
Steel Axe=Stål Yxa
Mese Axe=Mese Yxa
Diamond Axe=Diamant Yxa
Wooden Sword=Trä Svärd
Stone Sword=Sten Svärd
Bronze Sword=Brons Svärd
Steel Sword=Stål Svärd
Mese Sword=Mese Svärd
Diamond Sword=Diamant Svärd
Key=Nyckel
Torch=Fakla
@1 will intersect protection on growth.=@1 kommer korsa skyddet mot tillväxt.
Title:=Titel:
Contents:=Innehåll:
Save=Spara
by @1=av @1
Page @1 of @2=Sida @1 av @2
"@1"="@1"

View File

@ -0,0 +1,211 @@
# textdomain: default
Locked Chest=已上锁的箱子
Locked Chest (owned by @1)=已上锁的箱子(属于@1所有
You do not own this chest.=这个箱子不属于你所有。
a locked chest=一个已上锁的箱子
Chest=箱子
Stick=棒
Paper=纸
"@1" by @2="@1" by @2
Book=书
Book with Text=带文字的书
Skeleton Key=万能钥匙
Key to @1's @2=@1的@2的钥匙
Coal Lump=煤块
Iron Lump=铁块
Copper Lump=铜块
Tin Lump=锡块
Mese Crystal=黄石晶体
Gold Lump=金块
Diamond=钻石
Clay Lump=粘土块
Steel Ingot=铁锭
Copper Ingot=铜锭
Tin Ingot=锡锭
Bronze Ingot=青铜锭
Gold Ingot=金锭
Mese Crystal Fragment=黄石晶体碎片
Clay Brick=粘土砖
Obsidian Shard=黑曜石碎片
Flint=燧石
Blueberries=蓝莓
Furnace is empty=熔炉是空的
100% (output full)=100输出已满
@1%=@1%
Empty=空
Not cookable=不可烹饪
Furnace active=熔炉正在运转
Furnace inactive=熔炉未使用
(Item: @1; Fuel: @2)=(项目:@1;燃料:@2
Furnace=熔炉
Stone=石
Cobblestone=鹅卵石
Stone Brick=石砖
Stone Block=石方块
Mossy Cobblestone=苔藓覆盖的鹅卵石
Desert Stone=沙漠石
Desert Cobblestone=沙漠鹅卵石
Desert Stone Brick=沙漠鹅卵石砖
Desert Stone Block=沙漠鹅卵石方块
Sandstone=砂岩
Sandstone Brick=砂岩砖
Sandstone Block=砂岩方块
Desert Sandstone=沙漠砂岩
Desert Sandstone Brick=沙漠砂岩砖
Desert Sandstone Block=沙漠砂岩方块
Silver Sandstone=银砂岩
Silver Sandstone Brick=银砂岩砖
Silver Sandstone Block=银砂岩方块
Obsidian=黑曜石
Obsidian Brick=黑曜石砖
Obsidian Block=黑曜石方块
Dirt=土
Dirt with Grass=带草的土
Dirt with Grass and Footsteps=带草的土及脚印
Dirt with Dry Grass=带干草的土
Dirt with Snow=带雪的土
Dirt with Rainforest Litter=雨林腐土
Dirt with Coniferous Litter=针叶林腐土
Dry Dirt=干土
Dry Dirt with Dry Grass=干土和干草
Permafrost=多年冻土
Permafrost with Stones=带石头的多年冻土
Permafrost with Moss=生苔的多年冻土
Sand=沙
Desert Sand=沙漠沙
Silver Sand=银沙
Gravel=沙砾
Clay=粘土
Snow=雪
Snow Block=雪方块
Ice=冰
Cave Ice=洞穴冰
Apple Tree=苹果树
Apple Wood Planks=苹果树木板
Apple Tree Sapling=苹果树苗
Apple Tree Leaves=苹果树叶
Apple=苹果
Apple Marker=苹果标记
Jungle Tree=丛林树
Jungle Wood Planks=丛林树木板
Jungle Tree Leaves=丛林树叶
Jungle Tree Sapling=丛林树苗
Emergent Jungle Tree Sapling=应急丛林树苗
Pine Tree=松树
Pine Wood Planks=松树木板
Pine Needles=松针
Pine Tree Sapling=松树树苗
Acacia Tree=相思树
Acacia Wood Planks=相思树木板
Acacia Tree Leaves=相思树叶
Acacia Tree Sapling=相思树树苗
Aspen Tree=白杨树
Aspen Wood Planks=白杨树木板
Aspen Tree Leaves=白杨树叶
Aspen Tree Sapling=白杨树树苗
Coal Ore=煤炭矿石
Coal Block=煤炭方块
Iron Ore=铁矿石
Steel Block=钢方块
Copper Ore=铜矿石
Copper Block=铜方块
Tin Ore=锡矿石
Tin Block=锡方块
Bronze Block=青铜方块
Mese Ore=黄石矿石
Mese Block=黄石方块
Gold Ore=金矿石
Gold Block=金方块
Diamond Ore=钻石矿石
Diamond Block=钻石方块
Cactus=仙人掌
Large Cactus Seedling=大仙人掌苗
Papyrus=莎草纸
Dry Shrub=干灌木
Jungle Grass=丛林草
Grass=草
Dry Grass=干草
Fern=蕨
Marram Grass=滨草
Bush Stem=灌木
Bush Leaves=灌木叶
Bush Sapling=灌木苗
Blueberry Bush Leaves with Berries=蓝莓灌木叶与浆果
Blueberry Bush Leaves=蓝莓灌木叶
Blueberry Bush Sapling=蓝莓灌木苗
Acacia Bush Stem=相思灌木
Acacia Bush Leaves=相思灌木叶
Acacia Bush Sapling=相思灌木苗
Pine Bush Stem=松树灌木
Pine Bush Needles=松树灌木针
Pine Bush Sapling=松树灌木苗
Kelp=海带
Green Coral=绿珊瑚
Pink Coral=淡红珊瑚
Cyan Coral=青珊瑚
Brown Coral=棕珊瑚
Orange Coral=橙珊瑚
Coral Skeleton=珊瑚骨架
Water Source=水方块
Flowing Water=流动的水
River Water Source=河水方块
Flowing River Water=流动的河水
Lava Source=岩浆方块
Flowing Lava=流动的岩浆
Empty Bookshelf=空书架
Bookshelf (@1 written, @2 empty books)=书架(@1本有字的书@2本空书
Bookshelf=书架
Text too long=文字太长
Wooden Sign=木牌
Steel Sign=铁牌
Wooden Ladder=木梯子
Steel Ladder=铁梯子
Apple Wood Fence=苹果木栅栏
Acacia Wood Fence=相思木栅栏
Jungle Wood Fence=丛林木栅栏
Pine Wood Fence=松木栅栏
Aspen Wood Fence=白杨木栅栏
Apple Wood Fence Rail=苹果木栏杆
Acacia Wood Fence Rail=相思木栏杆
Jungle Wood Fence Rail=丛林木栏杆
Pine Wood Fence Rail=松木栏杆
Aspen Wood Fence Rail=白杨木栏杆
Glass=玻璃
Obsidian Glass=黑曜石玻璃
Brick Block=砖方块
Mese Lamp=黄石灯
Mese Post Light=黄石柱灯
Cloud=云
Wooden Pickaxe=木镐
Stone Pickaxe=石镐
Bronze Pickaxe=青铜镐
Steel Pickaxe=铁镐
Mese Pickaxe=黄石镐
Diamond Pickaxe=钻石镐
Wooden Shovel=木铲
Stone Shovel=石铲
Bronze Shovel=青铜铲
Steel Shovel=铁铲
Mese Shovel=黄石铲
Diamond Shovel=钻石铲
Wooden Axe=木斧
Stone Axe=石斧
Bronze Axe=青铜斧
Steel Axe=铁斧
Mese Axe=黄石斧
Diamond Axe=钻石斧
Wooden Sword=木剑
Stone Sword=石剑
Bronze Sword=青铜剑
Steel Sword=铁剑
Mese Sword=黄石剑
Diamond Sword=钻石剑
Key=钥匙
Torch=火把
@1 will intersect protection on growth.=@1将与增长的保护相交。
Title:=标题:
Contents:=内容:
Save=保存
by @1=由@1
Page @1 of @2=第@1页共@2页。
"@1"="@1"

View File

@ -0,0 +1,211 @@
# textdomain: default
Locked Chest=已上鎖的箱子
Locked Chest (owned by @1)=已上鎖的箱子(屬於@1所有
You do not own this chest.=這個箱子不屬於你所有。
a locked chest=一個已上鎖的箱子
Chest=箱子
Stick=棒
Paper=紙
"@1" by @2="@1" by @2
Book=書
Book with Text=帶文字的書
Skeleton Key=萬能鑰匙
Key to @1's @2=@1的@2的鑰匙
Coal Lump=煤塊
Iron Lump=鐵塊
Copper Lump=銅塊
Tin Lump=錫塊
Mese Crystal=黃石晶體
Gold Lump=金塊
Diamond=鑽石
Clay Lump=粘土塊
Steel Ingot=鐵錠
Copper Ingot=銅錠
Tin Ingot=錫錠
Bronze Ingot=青銅錠
Gold Ingot=金錠
Mese Crystal Fragment=黃石晶體碎片
Clay Brick=粘土磚
Obsidian Shard=黑曜石碎片
Flint=燧石
Blueberries=藍莓
Furnace is empty=熔爐是空的
100% (output full)=100輸出已滿
@1%=@1%
Empty=空
Not cookable=不可烹飪
Furnace active=熔爐正在運轉
Furnace inactive=熔爐未使用
(Item: @1; Fuel: @2)=(項目:@1;燃料:@2
Furnace=熔爐
Stone=石
Cobblestone=鵝卵石
Stone Brick=石磚
Stone Block=石方塊
Mossy Cobblestone=苔蘚覆蓋的鵝卵石
Desert Stone=沙漠石
Desert Cobblestone=沙漠鵝卵石
Desert Stone Brick=沙漠鵝卵石磚
Desert Stone Block=沙漠鵝卵石方塊
Sandstone=砂岩
Sandstone Brick=砂岩磚
Sandstone Block=砂岩方塊
Desert Sandstone=沙漠砂岩
Desert Sandstone Brick=沙漠砂岩磚
Desert Sandstone Block=沙漠砂岩方塊
Silver Sandstone=銀砂岩
Silver Sandstone Brick=銀砂岩磚
Silver Sandstone Block=銀砂岩方塊
Obsidian=黑曜石
Obsidian Brick=黑曜石磚
Obsidian Block=黑曜石方塊
Dirt=土
Dirt with Grass=帶草的土
Dirt with Grass and Footsteps=帶草的土及腳印
Dirt with Dry Grass=帶乾草的土
Dirt with Snow=帶雪的土
Dirt with Rainforest Litter=雨林腐土
Dirt with Coniferous Litter=針葉林腐土
Dry Dirt=乾土
Dry Dirt with Dry Grass=乾土和乾草
Permafrost=多年凍土
Permafrost with Stones=帶石頭的多年凍土
Permafrost with Moss=生苔的多年凍土
Sand=沙
Desert Sand=沙漠沙
Silver Sand=銀沙
Gravel=沙礫
Clay=粘土
Snow=雪
Snow Block=雪方塊
Ice=冰
Cave Ice=洞穴冰
Apple Tree=蘋果樹
Apple Wood Planks=蘋果樹木板
Apple Tree Sapling=蘋果樹苗
Apple Tree Leaves=蘋果樹葉
Apple=蘋果
Apple Marker=蘋果標記
Jungle Tree=叢林樹
Jungle Wood Planks=叢林樹木板
Jungle Tree Leaves=叢林樹葉
Jungle Tree Sapling=叢林樹苗
Emergent Jungle Tree Sapling=應急叢林樹苗
Pine Tree=松樹
Pine Wood Planks=松樹木板
Pine Needles=松針
Pine Tree Sapling=松樹樹苗
Acacia Tree=相思樹
Acacia Wood Planks=相思樹木板
Acacia Tree Leaves=相思樹葉
Acacia Tree Sapling=相思樹樹苗
Aspen Tree=白楊樹
Aspen Wood Planks=白楊樹木板
Aspen Tree Leaves=白楊樹葉
Aspen Tree Sapling=白楊樹樹苗
Coal Ore=煤炭礦石
Coal Block=煤炭方塊
Iron Ore=鐵礦石
Steel Block=鋼方塊
Copper Ore=銅礦石
Copper Block=銅方塊
Tin Ore=錫礦石
Tin Block=錫方塊
Bronze Block=青銅方塊
Mese Ore=黃石礦石
Mese Block=黃石方塊
Gold Ore=金礦石
Gold Block=金方塊
Diamond Ore=鑽石礦石
Diamond Block=鑽石方塊
Cactus=仙人掌
Large Cactus Seedling=大仙人掌苗
Papyrus=莎草紙
Dry Shrub=幹灌木
Jungle Grass=叢林草
Grass=草
Dry Grass=乾草
Fern=蕨
Marram Grass=濱草
Bush Stem=灌木
Bush Leaves=灌木葉
Bush Sapling=灌木苗
Blueberry Bush Leaves with Berries=藍莓灌木葉與漿果
Blueberry Bush Leaves=藍莓灌木葉
Blueberry Bush Sapling=藍莓灌木苗
Acacia Bush Stem=相思灌木
Acacia Bush Leaves=相思灌木葉
Acacia Bush Sapling=相思灌木苗
Pine Bush Stem=松樹灌木
Pine Bush Needles=松樹灌木針
Pine Bush Sapling=松樹灌木苗
Kelp=海帶
Green Coral=綠珊瑚
Pink Coral=淡紅珊瑚
Cyan Coral=青珊瑚
Brown Coral=棕珊瑚
Orange Coral=橙珊瑚
Coral Skeleton=珊瑚骨架
Water Source=水方塊
Flowing Water=流動的水
River Water Source=河水方塊
Flowing River Water=流動的河水
Lava Source=岩漿方塊
Flowing Lava=流動的岩漿
Empty Bookshelf=空書架
Bookshelf (@1 written, @2 empty books)=書架(@1本有字的書@2本空書
Bookshelf=書架
Text too long=文字太長
Wooden Sign=木牌
Steel Sign=鐵牌
Wooden Ladder=木梯子
Steel Ladder=鐵梯子
Apple Wood Fence=蘋果木柵欄
Acacia Wood Fence=相思木柵欄
Jungle Wood Fence=叢林木柵欄
Pine Wood Fence=松木柵欄
Aspen Wood Fence=白楊木柵欄
Apple Wood Fence Rail=蘋果木欄杆
Acacia Wood Fence Rail=相思木欄杆
Jungle Wood Fence Rail=叢林木欄杆
Pine Wood Fence Rail=松木欄杆
Aspen Wood Fence Rail=白楊木欄杆
Glass=玻璃
Obsidian Glass=黑曜石玻璃
Brick Block=磚方塊
Mese Lamp=黃石燈
Mese Post Light=黃石柱燈
Cloud=雲
Wooden Pickaxe=木鎬
Stone Pickaxe=石鎬
Bronze Pickaxe=青銅鎬
Steel Pickaxe=鐵鎬
Mese Pickaxe=黃石鎬
Diamond Pickaxe=鑽石鎬
Wooden Shovel=木鏟
Stone Shovel=石鏟
Bronze Shovel=青銅鏟
Steel Shovel=鐵鏟
Mese Shovel=黃石鏟
Diamond Shovel=鑽石鏟
Wooden Axe=木斧
Stone Axe=石斧
Bronze Axe=青銅斧
Steel Axe=鐵斧
Mese Axe=黃石斧
Diamond Axe=鑽石斧
Wooden Sword=木劍
Stone Sword=石劍
Bronze Sword=青銅劍
Steel Sword=鐵劍
Mese Sword=黃石劍
Diamond Sword=鑽石劍
Key=鑰匙
Torch=火把
@1 will intersect protection on growth.=@1將與增長的保護相交。
Title:=標題:
Contents:=內容:
Save=保存
by @1=由@1
Page @1 of @2=第@1頁共@2頁。
"@1"="@1"

View File

@ -1,43 +1,4 @@
# textdomain: default
Locked Chest=
Locked Chest (owned by @1)=
You do not own this chest.=
a locked chest=
Chest=
Stick=
Paper=
"@1" by @2=
Book=
Book with Text=
Skeleton Key=
Key to @1's @2=
Coal Lump=
Iron Lump=
Copper Lump=
Tin Lump=
Mese Crystal=
Gold Lump=
Diamond=
Clay Lump=
Steel Ingot=
Copper Ingot=
Tin Ingot=
Bronze Ingot=
Gold Ingot=
Mese Crystal Fragment=
Clay Brick=
Obsidian Shard=
Flint=
Blueberries=
Furnace is empty=
100% (output full)=
@1%=
Empty=
Not cookable=
Furnace active=
Furnace inactive=
(Item: @1; Fuel: @2)=
Furnace=
Stone=
Cobblestone=
Stone Brick=
@ -62,12 +23,12 @@ Obsidian Block=
Dirt=
Dirt with Grass=
Dirt with Grass and Footsteps=
Dirt with Dry Grass=
Dirt with Savanna Grass=
Dirt with Snow=
Dirt with Rainforest Litter=
Dirt with Coniferous Litter=
Dry Dirt=
Dry Dirt with Dry Grass=
Savanna Dirt=
Savanna Dirt with Savanna Grass=
Permafrost=
Permafrost with Stones=
Permafrost with Moss=
@ -124,7 +85,7 @@ Papyrus=
Dry Shrub=
Jungle Grass=
Grass=
Dry Grass=
Savanna Grass=
Fern=
Marram Grass=
Bush Stem=
@ -176,6 +137,8 @@ Brick Block=
Mese Lamp=
Mese Post Light=
Cloud=
@1 will intersect protection on growth.=
Torch=
Wooden Pickaxe=
Stone Pickaxe=
Bronze Pickaxe=
@ -201,11 +164,48 @@ Steel Sword=
Mese Sword=
Diamond Sword=
Key=
Torch=
@1 will intersect protection on growth.=
Furnace is empty=
100% (output full)=
@1%=
Not cookable=
Empty=
Furnace active=
Furnace inactive=
(Item: @1; Fuel: @2)=
Furnace=
Title:=
Contents:=
Save=
by @1=
Page @1 of @2=
"@1"=
"@1" by @2=
Skeleton Key=
Key to @1's @2=
Blueberries=
Book=
Book with Text=
Bronze Ingot=
Clay Brick=
Clay Lump=
Coal Lump=
Copper Ingot=
Copper Lump=
Diamond=
Flint=
Gold Ingot=
Gold Lump=
Iron Lump=
Mese Crystal=
Mese Crystal Fragment=
Obsidian Shard=
Paper=
Steel Ingot=
Stick=
Tin Ingot=
Tin Lump=
Locked Chest=
Locked Chest (owned by @1)=
You do not own this chest.=
a locked chest=
Chest=

View File

@ -576,7 +576,7 @@ function default.register_ores()
-- Only where default:dirt is present as surface material
biomes = {"taiga", "snowy_grassland", "grassland", "coniferous_forest",
"deciduous_forest", "deciduous_forest_shore", "rainforest",
"rainforest_swamp", "floatland_coniferous_forest"}
"rainforest_swamp"}
})
-- Gravel
@ -890,7 +890,7 @@ end
-- All mapgens except mgv6
function default.register_biomes(upper_limit)
function default.register_biomes()
-- Icesheet
@ -909,7 +909,7 @@ function default.register_biomes(upper_limit)
depth_riverbed = 2,
node_dungeon = "default:ice",
node_dungeon_stair = "stairs:stair_ice",
y_max = upper_limit,
y_max = 31000,
y_min = -8,
heat_point = 0,
humidity_point = 73,
@ -956,7 +956,7 @@ function default.register_biomes(upper_limit)
node_dungeon = "default:cobble",
node_dungeon_alt = "default:mossycobble",
node_dungeon_stair = "stairs:stair_cobble",
y_max = upper_limit,
y_max = 31000,
y_min = 47,
heat_point = 0,
humidity_point = 40,
@ -1043,7 +1043,7 @@ function default.register_biomes(upper_limit)
node_dungeon = "default:cobble",
node_dungeon_alt = "default:mossycobble",
node_dungeon_stair = "stairs:stair_cobble",
y_max = upper_limit,
y_max = 31000,
y_min = 4,
heat_point = 25,
humidity_point = 70,
@ -1095,7 +1095,7 @@ function default.register_biomes(upper_limit)
node_dungeon = "default:cobble",
node_dungeon_alt = "default:mossycobble",
node_dungeon_stair = "stairs:stair_cobble",
y_max = upper_limit,
y_max = 31000,
y_min = 4,
heat_point = 20,
humidity_point = 35,
@ -1146,7 +1146,7 @@ function default.register_biomes(upper_limit)
node_dungeon = "default:cobble",
node_dungeon_alt = "default:mossycobble",
node_dungeon_stair = "stairs:stair_cobble",
y_max = upper_limit,
y_max = 31000,
y_min = 6,
heat_point = 50,
humidity_point = 35,
@ -1213,7 +1213,7 @@ function default.register_biomes(upper_limit)
node_dungeon = "default:cobble",
node_dungeon_alt = "default:mossycobble",
node_dungeon_stair = "stairs:stair_cobble",
y_max = upper_limit,
y_max = 31000,
y_min = 6,
heat_point = 45,
humidity_point = 70,
@ -1280,7 +1280,7 @@ function default.register_biomes(upper_limit)
node_dungeon = "default:cobble",
node_dungeon_alt = "default:mossycobble",
node_dungeon_stair = "stairs:stair_cobble",
y_max = upper_limit,
y_max = 31000,
y_min = 1,
heat_point = 60,
humidity_point = 68,
@ -1347,7 +1347,7 @@ function default.register_biomes(upper_limit)
depth_riverbed = 2,
node_dungeon = "default:desert_stone",
node_dungeon_stair = "stairs:stair_desert_stone",
y_max = upper_limit,
y_max = 31000,
y_min = 4,
heat_point = 92,
humidity_point = 16,
@ -1397,7 +1397,7 @@ function default.register_biomes(upper_limit)
depth_riverbed = 2,
node_dungeon = "default:sandstonebrick",
node_dungeon_stair = "stairs:stair_sandstone_block",
y_max = upper_limit,
y_max = 31000,
y_min = 4,
heat_point = 60,
humidity_point = 0,
@ -1446,7 +1446,7 @@ function default.register_biomes(upper_limit)
node_dungeon = "default:cobble",
node_dungeon_alt = "default:mossycobble",
node_dungeon_stair = "stairs:stair_cobble",
y_max = upper_limit,
y_max = 31000,
y_min = 4,
heat_point = 40,
humidity_point = 0,
@ -1496,7 +1496,7 @@ function default.register_biomes(upper_limit)
node_dungeon = "default:cobble",
node_dungeon_alt = "default:mossycobble",
node_dungeon_stair = "stairs:stair_cobble",
y_max = upper_limit,
y_max = 31000,
y_min = 1,
heat_point = 89,
humidity_point = 42,
@ -1563,7 +1563,7 @@ function default.register_biomes(upper_limit)
node_dungeon = "default:cobble",
node_dungeon_alt = "default:mossycobble",
node_dungeon_stair = "stairs:stair_cobble",
y_max = upper_limit,
y_max = 31000,
y_min = 1,
heat_point = 86,
humidity_point = 65,
@ -1619,59 +1619,6 @@ function default.register_biomes(upper_limit)
end
-- Biomes for floatlands
-- TODO Temporary simple biomes to be replaced by special floatland biomes later.
function default.register_floatland_biomes(floatland_level, shadow_limit)
minetest.register_biome({
name = "floatland_grassland",
node_top = "default:dirt_with_grass",
depth_top = 1,
node_filler = "default:dirt",
depth_filler = 1,
node_dungeon = "default:cobble",
node_dungeon_alt = "default:mossycobble",
node_dungeon_stair = "stairs:stair_cobble",
y_max = 31000,
y_min = floatland_level + 2,
heat_point = 50,
humidity_point = 25,
})
minetest.register_biome({
name = "floatland_coniferous_forest",
node_top = "default:dirt_with_coniferous_litter",
depth_top = 1,
node_filler = "default:dirt",
depth_filler = 3,
node_dungeon = "default:cobble",
node_dungeon_alt = "default:mossycobble",
node_dungeon_stair = "stairs:stair_cobble",
y_max = 31000,
y_min = floatland_level + 2,
heat_point = 50,
humidity_point = 75,
})
minetest.register_biome({
name = "floatland_ocean",
node_top = "default:sand",
depth_top = 1,
node_filler = "default:sand",
depth_filler = 3,
node_dungeon = "default:cobble",
node_dungeon_alt = "default:mossycobble",
node_dungeon_stair = "stairs:stair_cobble",
y_max = floatland_level + 1,
y_min = shadow_limit,
heat_point = 50,
humidity_point = 50,
})
end
--
-- Register decorations
--
@ -1787,7 +1734,7 @@ local function register_grass_decoration(offset, scale, length)
octaves = 3,
persist = 0.6
},
biomes = {"grassland", "deciduous_forest", "floatland_grassland"},
biomes = {"grassland", "deciduous_forest"},
y_max = 31000,
y_min = 1,
decoration = "default:grass_" .. length,
@ -1829,7 +1776,7 @@ local function register_fern_decoration(seed, length)
octaves = 3,
persist = 0.7
},
biomes = {"coniferous_forest", "floatland_coniferous_forest"},
biomes = {"coniferous_forest"},
y_max = 31000,
y_min = 6,
decoration = "default:fern_" .. length,
@ -1944,11 +1891,35 @@ function default.register_decorations()
minetest.register_decoration({
name = "default:jungle_tree",
deco_type = "schematic",
place_on = {"default:dirt_with_rainforest_litter", "default:dirt"},
place_on = {"default:dirt_with_rainforest_litter"},
sidelen = 80,
fill_ratio = 0.1,
biomes = {"rainforest", "rainforest_swamp"},
biomes = {"rainforest"},
y_max = 31000,
y_min = 1,
schematic = minetest.get_modpath("default") .. "/schematics/jungle_tree.mts",
flags = "place_center_x, place_center_z",
rotation = "random",
})
-- Swamp jungle trees
minetest.register_decoration({
name = "default:jungle_tree(swamp)",
deco_type = "schematic",
place_on = {"default:dirt"},
sidelen = 16,
-- Noise tuned to place swamp trees where papyrus is absent
noise_params = {
offset = 0.0,
scale = -0.1,
spread = {x = 200, y = 200, z = 200},
seed = 354,
octaves = 1,
persist = 0.5
},
biomes = {"rainforest_swamp"},
y_max = 0,
y_min = -1,
schematic = minetest.get_modpath("default") .. "/schematics/jungle_tree.mts",
flags = "place_center_x, place_center_z",
@ -1962,7 +1933,7 @@ function default.register_decorations()
place_offset_y = 1,
sidelen = 80,
fill_ratio = 0.005,
biomes = {"rainforest", "rainforest_swamp"},
biomes = {"rainforest"},
y_max = 31000,
y_min = 1,
schematic = minetest.get_modpath("default") .. "/schematics/jungle_log.mts",
@ -1987,7 +1958,7 @@ function default.register_decorations()
octaves = 3,
persist = 0.66
},
biomes = {"taiga", "coniferous_forest", "floatland_coniferous_forest"},
biomes = {"taiga", "coniferous_forest"},
y_max = 31000,
y_min = 4,
schematic = minetest.get_modpath("default") .. "/schematics/pine_tree.mts",
@ -2007,7 +1978,7 @@ function default.register_decorations()
octaves = 3,
persist = 0.66
},
biomes = {"taiga", "coniferous_forest", "floatland_coniferous_forest"},
biomes = {"taiga", "coniferous_forest"},
y_max = 31000,
y_min = 4,
schematic = minetest.get_modpath("default") .. "/schematics/small_pine_tree.mts",
@ -2021,7 +1992,7 @@ function default.register_decorations()
place_offset_y = 1,
sidelen = 80,
fill_ratio = 0.0018,
biomes = {"taiga", "coniferous_forest", "floatland_coniferous_forest"},
biomes = {"taiga", "coniferous_forest"},
y_max = 31000,
y_min = 4,
schematic = minetest.get_modpath("default") .. "/schematics/pine_log.mts",
@ -2172,8 +2143,10 @@ function default.register_decorations()
-- Papyrus
-- Dirt version for rainforest swamp
minetest.register_decoration({
name = "default:papyrus",
name = "default:papyrus_on_dirt",
deco_type = "schematic",
place_on = {"default:dirt"},
sidelen = 16,
@ -2185,10 +2158,32 @@ function default.register_decorations()
octaves = 3,
persist = 0.7
},
biomes = {"rainforest_swamp"},
y_max = 0,
y_min = 0,
schematic = minetest.get_modpath("default") .. "/schematics/papyrus_on_dirt.mts",
})
-- Dry dirt version for savanna shore
minetest.register_decoration({
name = "default:papyrus_on_dry_dirt",
deco_type = "schematic",
place_on = {"default:dry_dirt"},
sidelen = 16,
noise_params = {
offset = -0.3,
scale = 0.7,
spread = {x = 200, y = 200, z = 200},
seed = 354,
octaves = 3,
persist = 0.7
},
biomes = {"savanna_shore"},
y_max = 0,
y_min = 0,
schematic = minetest.get_modpath("default") .. "/schematics/papyrus.mts",
schematic = minetest.get_modpath("default") ..
"/schematics/papyrus_on_dry_dirt.mts",
})
-- Bush
@ -2206,8 +2201,7 @@ function default.register_decorations()
octaves = 3,
persist = 0.7,
},
biomes = {"grassland", "deciduous_forest",
"floatland_grassland"},
biomes = {"grassland", "deciduous_forest"},
y_max = 31000,
y_min = 1,
schematic = minetest.get_modpath("default") .. "/schematics/bush.mts",
@ -2479,22 +2473,9 @@ end
--
-- Detect mapgen, flags and parameters to select functions
-- Detect mapgen to select functions
--
-- Get setting or default
local mgv7_spflags = minetest.get_mapgen_setting("mgv7_spflags") or
"mountains, ridges, nofloatlands, caverns"
local captures_float = string.match(mgv7_spflags, "floatlands")
local captures_nofloat = string.match(mgv7_spflags, "nofloatlands")
-- Get setting or default
-- Make global for mods to use to register floatland biomes
default.mgv7_floatland_level =
minetest.get_mapgen_setting("mgv7_floatland_level") or 1280
default.mgv7_shadow_limit =
minetest.get_mapgen_setting("mgv7_shadow_limit") or 1024
minetest.clear_registered_biomes()
minetest.clear_registered_ores()
minetest.clear_registered_decorations()
@ -2504,19 +2485,8 @@ local mg_name = minetest.get_mapgen_setting("mg_name")
if mg_name == "v6" then
default.register_mgv6_ores()
default.register_mgv6_decorations()
-- Need to check for 'nofloatlands' because that contains
-- 'floatlands' which makes the second condition true.
elseif mg_name == "v7" and
captures_float == "floatlands" and
captures_nofloat ~= "nofloatlands" then
-- Mgv7 with floatlands and floatland biomes
default.register_biomes(default.mgv7_shadow_limit - 1)
default.register_floatland_biomes(
default.mgv7_floatland_level, default.mgv7_shadow_limit)
default.register_ores()
default.register_decorations()
else
default.register_biomes(31000)
default.register_biomes()
default.register_ores()
default.register_decorations()
end

View File

@ -458,12 +458,12 @@ minetest.register_node("default:dirt_with_grass_footsteps", {
})
minetest.register_node("default:dirt_with_dry_grass", {
description = S("Dirt with Dry Grass"),
description = S("Dirt with Savanna Grass"),
tiles = {"default_dry_grass.png",
"default_dirt.png",
{name = "default_dirt.png^default_dry_grass_side.png",
tileable_vertical = false}},
groups = {crumbly = 3, soil = 1},
groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1},
drop = "default:dirt",
sounds = default.node_sound_dirt_defaults({
footstep = {name = "default_grass_footstep", gain = 0.4},
@ -513,14 +513,14 @@ minetest.register_node("default:dirt_with_coniferous_litter", {
})
minetest.register_node("default:dry_dirt", {
description = S("Dry Dirt"),
description = S("Savanna Dirt"),
tiles = {"default_dry_dirt.png"},
groups = {crumbly = 3, soil = 1},
sounds = default.node_sound_dirt_defaults(),
})
minetest.register_node("default:dry_dirt_with_dry_grass", {
description = S("Dry Dirt with Dry Grass"),
description = S("Savanna Dirt with Savanna Grass"),
tiles = {"default_dry_grass.png", "default_dry_dirt.png",
{name = "default_dry_dirt.png^default_dry_grass_side.png",
tileable_vertical = false}},
@ -621,7 +621,7 @@ minetest.register_node("default:snow", {
collision_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, -7 / 16, 0.5},
{-0.5, -0.5, -0.5, 0.5, -6 / 16, 0.5},
},
},
groups = {crumbly = 3, falling_node = 1, snowy = 1},
@ -1497,7 +1497,7 @@ end
minetest.register_node("default:dry_grass_1", {
description = S("Dry Grass"),
description = S("Savanna Grass"),
drawtype = "plantlike",
waving = 1,
tiles = {"default_dry_grass_1.png"},
@ -1526,7 +1526,7 @@ minetest.register_node("default:dry_grass_1", {
for i = 2, 5 do
minetest.register_node("default:dry_grass_" .. i, {
description = S("Dry Grass"),
description = S("Savanna Grass"),
drawtype = "plantlike",
waving = 1,
tiles = {"default_dry_grass_" .. i .. ".png"},
@ -2031,7 +2031,7 @@ local function coral_on_place(itemstack, placer, pointed_thing)
local def_under = minetest.registered_nodes[node_under.name]
if def_under and def_under.on_rightclick and not placer:get_player_control().sneak then
return def_under.on_rightclick(pos_under, node_under.name,
return def_under.on_rightclick(pos_under, node_under,
placer, itemstack, pointed_thing) or itemstack
end
@ -2203,7 +2203,7 @@ minetest.register_node("default:water_source", {
},
},
},
alpha = 160,
alpha = 191,
paramtype = "light",
walkable = false,
pointable = false,
@ -2234,7 +2234,7 @@ minetest.register_node("default:water_flowing", {
type = "vertical_frames",
aspect_w = 16,
aspect_h = 16,
length = 0.8,
length = 0.5,
},
},
{
@ -2244,11 +2244,11 @@ minetest.register_node("default:water_flowing", {
type = "vertical_frames",
aspect_w = 16,
aspect_h = 16,
length = 0.8,
length = 0.5,
},
},
},
alpha = 160,
alpha = 191,
paramtype = "light",
paramtype2 = "flowingliquid",
walkable = false,
@ -2330,7 +2330,7 @@ minetest.register_node("default:river_water_flowing", {
type = "vertical_frames",
aspect_w = 16,
aspect_h = 16,
length = 0.8,
length = 0.5,
},
},
{
@ -2340,7 +2340,7 @@ minetest.register_node("default:river_water_flowing", {
type = "vertical_frames",
aspect_w = 16,
aspect_h = 16,
length = 0.8,
length = 0.5,
},
},
},
@ -2579,12 +2579,10 @@ local function register_sign(material, desc, def)
sounds = def.sounds,
on_construct = function(pos)
--local n = minetest.get_node(pos)
local meta = minetest.get_meta(pos)
meta:set_string("formspec", "field[text;;${text}]")
end,
on_receive_fields = function(pos, formname, fields, sender)
--print("Sign at "..minetest.pos_to_string(pos).." got "..dump(fields))
local player_name = sender:get_player_name()
if minetest.is_protected(pos, player_name) then
minetest.record_protection_violation(pos, player_name)
@ -2598,8 +2596,8 @@ local function register_sign(material, desc, def)
minetest.chat_send_player(player_name, S("Text too long"))
return
end
minetest.log("action", (player_name or "") .. " wrote \"" ..
text .. "\" to sign at " .. minetest.pos_to_string(pos))
minetest.log("action", player_name .. " wrote \"" .. text ..
"\" to the sign at " .. minetest.pos_to_string(pos))
local meta = minetest.get_meta(pos)
meta:set_string("text", text)
@ -2816,7 +2814,10 @@ minetest.register_node("default:brick", {
description = S("Brick Block"),
paramtype2 = "facedir",
place_param2 = 0,
tiles = {"default_brick.png"},
tiles = {
"default_brick.png^[transformFX",
"default_brick.png",
},
is_ground_content = false,
groups = {cracky = 3},
sounds = default.node_sound_stone_defaults(),

Binary file not shown.

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 459 B

After

Width:  |  Height:  |  Size: 331 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 148 B

After

Width:  |  Height:  |  Size: 154 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 411 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 279 B

View File

@ -402,6 +402,57 @@ minetest.register_tool("default:sword_diamond", {
groups = {sword = 1}
})
--
-- Register Craft Recipies
--
local craft_ingreds = {
wood = "group:wood",
stone = "group:stone",
steel = "default:steel_ingot",
bronze = "default:bronze_ingot",
mese = "default:mese_crystal",
diamond = "default:diamond"
}
for name, mat in pairs(craft_ingreds) do
minetest.register_craft({
output = "default:pick_".. name,
recipe = {
{mat, mat, mat},
{"", "group:stick", ""},
{"", "group:stick", ""}
}
})
minetest.register_craft({
output = "default:shovel_".. name,
recipe = {
{mat},
{"group:stick"},
{"group:stick"}
}
})
minetest.register_craft({
output = "default:axe_".. name,
recipe = {
{mat, mat},
{mat, "group:stick"},
{"", "group:stick"}
}
})
minetest.register_craft({
output = "default:sword_".. name,
recipe = {
{mat},
{mat},
{"group:stick"}
}
})
end
minetest.register_tool("default:key", {
description = S("Key"),
inventory_image = "default_key.png",
@ -441,3 +492,27 @@ minetest.register_tool("default:key", {
return nil
end
})
minetest.register_craft({
type = "fuel",
recipe = "default:pick_wood",
burntime = 6,
})
minetest.register_craft({
type = "fuel",
recipe = "default:shovel_wood",
burntime = 4,
})
minetest.register_craft({
type = "fuel",
recipe = "default:axe_wood",
burntime = 6,
})
minetest.register_craft({
type = "fuel",
recipe = "default:sword_wood",
burntime = 5,
})

View File

@ -11,7 +11,8 @@ local function on_flood(pos, oldnode, newnode)
nodedef.groups.igniter and nodedef.groups.igniter > 0) then
minetest.sound_play(
"default_cool_lava",
{pos = pos, max_hear_distance = 16, gain = 0.1}
{pos = pos, max_hear_distance = 16, gain = 0.1},
true
)
end
-- Remove the torch node
@ -70,6 +71,7 @@ minetest.register_node("default:torch", {
end,
floodable = true,
on_flood = on_flood,
on_rotate = false
})
minetest.register_node("default:torch_wall", {
@ -93,6 +95,7 @@ minetest.register_node("default:torch_wall", {
sounds = default.node_sound_wood_defaults(),
floodable = true,
on_flood = on_flood,
on_rotate = false
})
minetest.register_node("default:torch_ceiling", {
@ -116,6 +119,7 @@ minetest.register_node("default:torch_ceiling", {
sounds = default.node_sound_wood_defaults(),
floodable = true,
on_flood = on_flood,
on_rotate = false
})
minetest.register_lbm({
@ -134,3 +138,17 @@ minetest.register_lbm({
end
end
})
minetest.register_craft({
output = "default:torch 4",
recipe = {
{"default:coal_lump"},
{"group:stick"},
}
})
minetest.register_craft({
type = "fuel",
recipe = "default:torch",
burntime = 4,
})

View File

@ -16,9 +16,7 @@ function default.can_grow(pos)
if not node_under then
return false
end
local name_under = node_under.name
local is_soil = minetest.get_item_group(name_under, "soil")
if is_soil == 0 then
if minetest.get_item_group(node_under.name, "soil") == 0 then
return false
end
local light_level = minetest.get_node_light(pos)

View File

@ -0,0 +1,12 @@
# textdomain: flowers
Red Rose=Mawar Merah
Orange Tulip=Tulip Oranye
Yellow Dandelion=Dandelion Kuning
Green Chrysanthemum=Krisan Hijau
Blue Geranium=Geranium Biru
Viola=Viola
White Dandelion=Dandelion Putih
Black Tulip=Tulip Hitam
Red Mushroom=Jamur Merah
Brown Mushroom=Jamur Cokelat
Waterlily=Teratai

View File

@ -0,0 +1,12 @@
# textdomain: flowers
Red Rose=Ros Merah
Orange Tulip=Tulip Jingga
Yellow Dandelion=Dandelion Kuning
Green Chrysanthemum=Kekwa Hijau
Blue Geranium=Geranium Biru
Viola=Violet
White Dandelion=Dandelion Putih
Black Tulip=Tulip Hitam
Red Mushroom=Cendawan Merah
Brown Mushroom=Cendawan Perang
Waterlily=Teratai

View File

@ -0,0 +1,12 @@
# textdomain: flowers
Red Rose=Красная Роза
Orange Tulip=Оранжевый Тюльпан
Yellow Dandelion=Желтый Одуванчик
Green Chrysanthemum=Зелёная Хризантема
Blue Geranium=Синяя Герань
Viola=Фиалка
White Dandelion=Белый Одуванчик
Black Tulip=Черный Тюльпан
Red Mushroom=Мухомор
Brown Mushroom=Коричневый Гриб
Waterlily=Кувшинка

View File

@ -0,0 +1,12 @@
# textdomain: flowers
Red Rose=Röd ros
Orange Tulip=Orange Tulpan
Yellow Dandelion=Gul Maskros
Green Chrysanthemum=Grön Krysantemum
Blue Geranium=Blå Geranium
Viola=Violett Viola
White Dandelion=Vit Maskros
Black Tulip=Svart Tulpan
Red Mushroom=Röd Svamp
Brown Mushroom=Brun Svamp
Waterlily=Näckros

View File

@ -0,0 +1,12 @@
# textdomain: flowers
Red Rose=红玫瑰
Orange Tulip=橙郁金香
Yellow Dandelion=黄蒲公英
Green Chrysanthemum=绿菊花
Blue Geranium=蓝天竺葵
Viola=三色堇
White Dandelion=白蒲公英
Black Tulip=黑郁金香
Red Mushroom=红蘑菇
Brown Mushroom=棕蘑菇
Waterlily=睡莲

View File

@ -0,0 +1,12 @@
# textdomain: flowers
Red Rose=紅玫瑰
Orange Tulip=橙鬱金香
Yellow Dandelion=黃蒲公英
Green Chrysanthemum=綠菊花
Blue Geranium=藍天竺葵
Viola=三色堇
White Dandelion=白蒲公英
Black Tulip=黑鬱金香
Red Mushroom=紅蘑菇
Brown Mushroom=棕蘑菇
Waterlily=睡蓮

View File

@ -100,7 +100,7 @@ local function register_flower(seed, flower_name)
octaves = 3,
persist = 0.6
},
biomes = {"grassland", "deciduous_forest", "floatland_grassland"},
biomes = {"grassland", "deciduous_forest"},
y_max = 31000,
y_min = 1,
decoration = "flowers:"..flower_name,
@ -121,8 +121,7 @@ local function register_mushroom(mushroom_name)
octaves = 3,
persist = 0.66
},
biomes = {"deciduous_forest", "coniferous_forest",
"floatland_coniferous_forest"},
biomes = {"deciduous_forest", "coniferous_forest"},
y_max = 31000,
y_min = 1,
decoration = "flowers:"..mushroom_name,

View File

@ -27,7 +27,7 @@ end
mobkit.terminal_velocity = sqrt(2*-mobkit.gravity*20) -- 20 meter fall = dead
mobkit.safe_velocity = sqrt(2*-mobkit.gravity*5) -- 5 m safe fall
local abr = minetest.get_mapgen_setting('active_block_range')
local abr = tonumber(minetest.get_mapgen_setting('active_block_range')) or 3
local neighbors ={
{x=1,z=0},
@ -161,10 +161,13 @@ function mobkit.get_nodes_in_area(pos1,pos2,full)
y=y+sy
local pos = {x=x,y=y,z=z}
if full==true then
result[pos] = minetest.registered_nodes[minetest.get_node(pos).name]
else
result[minetest.registered_nodes[minetest.get_node(pos).name]] = true
local node = mobkit.nodeatpos(pos)
if node then
if full==true then
result[pos] = node
else
result[node] = true
end
end
cnt=cnt+1
@ -441,6 +444,7 @@ function mobkit.make_sound(self, sound)
param_table.gain = in_range(spec.gain)
param_table.fade = in_range(spec.fade)
param_table.pitch = in_range(spec.pitch)
return minetest.sound_play(spec.name, param_table)
end
return minetest.sound_play(spec, param_table)
end
@ -892,6 +896,11 @@ function mobkit.actfunc(self, staticdata, dtime_s)
end
end
if self.textures==nil then
local prop_tex = self.object:get_properties().textures
if prop_tex then self.textures=prop_tex end
end
if not self.memory then -- this is the initial activation
self.memory = {}
@ -904,7 +913,7 @@ function mobkit.actfunc(self, staticdata, dtime_s)
end
-- apply texture
if self.texture_no then
if self.textures and self.texture_no then
local props = {}
props.textures = {self.textures[self.texture_no]}
self.object:set_properties(props)
@ -1288,8 +1297,13 @@ end
function mobkit.hq_warn(self,prty,tgtobj)
local timer=0
local tgttime = 0
local init = true
local func = function(self)
if not mobkit.is_alive(tgtobj) then return true end
if init then
mobkit.animate(self,'stand')
init = false
end
local pos = mobkit.get_stand_pos(self)
local opos = tgtobj:get_pos()
local dist = vector.distance(pos,opos)
@ -1478,7 +1492,7 @@ function mobkit.is_in_deep(target)
local node2 = mobkit.nodeatpos(nodepos)
nodepos.y=nodepos.y-2
local node3 = mobkit.nodeatpos(nodepos)
if node1 and node2 and node1.drawtype=='liquid' and (node2.drawtype=='liquid' or node3.drawtype=='liquid') then
if node1 and node2 and node3 and node1.drawtype=='liquid' and (node2.drawtype=='liquid' or node3.drawtype=='liquid') then
return true
end
end

View File

@ -8,8 +8,8 @@ Contents
1.2 Logic function
1.3 Processing diagram
1.4 Entity definition
1.5 Exposed luaentity members
1.5 Exposed luaentity members
2 Reference
2.1 Utility functions
2.2 Built in behaviors
@ -17,7 +17,7 @@ Contents
2.2.2 Low level behaviors
2.3 Constants and member variables
-----------
-----------
1. Concepts
-----------
@ -41,22 +41,22 @@ Queuing is covered by behavour defining conventions
!!! To start using the api it's enough to learn defining mobs and writing brain functions !!!
1.1.1 Low level behavior functions
1.1.1 Low level behavior functions
These are physical actions and interactions: steps, jumps, turns etc. here you'll set velocity, yaw, kick off animations and sounds.
Low level behavior definition:
function mobkit.lq_bhv1(self,[optional additional persistent parameters]) -- enclosing function
... -- optional definitions of additional persistent variables
... -- optional definitions of additional persistent variables
local func=function(self) -- enclosed function, self is mandatory and the only allowed parameter
... -- actual function definition, remember to return true eventually
... -- actual function definition, remember to return true eventually
end
mobkit.queue_low(self,func) -- this will queue the behavior at the time of lq_bhv1 call
end
1.1.2 High level behavior functions
1.1.2 High level behavior functions
These are complex tasks like getting to a position, following other objects, hiding, patrolling an area etc.
Their job is tracking changes in the environment and managing low level behavior queue accordingly.
@ -64,9 +64,9 @@ Their job is tracking changes in the environment and managing low level behavior
High level behavior definition:
function mobkit.hq_bhv1(self,priority,[optional additional persistent parameters]) -- enclosing function
... -- optional definitions of additional persistent variables
... -- optional definitions of additional persistent variables
local func=function(self) -- enclosed function, self is mandatory and the only allowed parameter
... -- actual function definition, remember to return true eventually
... -- actual function definition, remember to return true eventually
end
mobkit.queue_high(self,func,priority) -- this will queue the behavior at the time of hq_bhv1 call
end
@ -75,7 +75,7 @@ end
1.1.2.1 Priority
Unlike low level behaviors which are executed in FIFO order, high level behaviors support prioritization.
This concept is essential for making sure the right behavior is active at the right time.
This concept is essential for making sure the right behavior is active at the right time.
Prioritization is what makes it possible to interrupt a task in order to perform a more important one
The currently executing behavior is always the first in the queue.
@ -87,37 +87,37 @@ Common idioms:
hq_bhv1(self,prty):
...
hq_bhv2(self,prty) -- bhv1 kicks off bhv2 with equal priority
return true -- and ends,
hq_bhv2(self,prty) -- bhv1 kicks off bhv2 with equal priority
return true -- and ends,
-- bhv2 becomes active on the next engine step.
hq_bhv1(self,prty):
...
hq_bhv2(self,prty+1) -- bhv1 kicks off bhv2 with higher priority
hq_bhv2(self,prty+1) -- bhv1 kicks off bhv2 with higher priority
-- bhv2 takes over and when it ends, bhv1 resumes.
Particular prioritization scheme is to be designed by the user according to specific mod requirements.
1.2 Logic function
1.2 Logic function
------------------
Every mob must have one.
Its job is managing high level behavior queue in response to events which are not intercepted by callbacks.
Every mob must have one.
Its job is managing high level behavior queue in response to events which are not intercepted by callbacks.
Contrary to what the name suggests, these functions needn't necessarily be too complex thanks to their limited responsibilities.
Typical flow might look like this:
Typical flow might look like this:
if mobkit.timer(self,1) then -- returns true approx every second
local prty = mobkit.get_queue_priority(self)
if prty < 20
if ... then
hq_do_important_stuff(self,20)
return
end
end
if prty < 10 then
if ... then
hq_do_something_else(self,10)
@ -127,7 +127,7 @@ if mobkit.timer(self,1) then -- returns true approx every second
return
end
end
if mobkit.is_queue_empty_high(self) then
hq_fool_around(self,0)
end
@ -146,7 +146,7 @@ end
| | |
| -----|----------------- |
| | V HL Queue | |
| | | 1 | 2 | 3 |... | |
| | | 1 | 2 | 3 |... | |
| ----------------------- |
| | |
| -----|----------------- |
@ -158,50 +158,52 @@ end
Order of execution during an engine step:
First comes physics: gravity, buoyancy, friction etc., then the logic function is called.
After that, the first behavior on the high level queue, if exists,
After that, the first behavior on the high level queue, if exists,
and the last, the first low level behavior if present.
1.4 Entity definition
---------------------
minetest.register_entity("mod:name",{
-- required minetest api props
physical = true,
collide_with_objects = true,
collisionbox = {...},
visual = "mesh",
mesh = "...",
textures = {...},
-- required mobkit props
-- required minetest api props
initial_properties = {
physical = true,
collide_with_objects = true,
collisionbox = {...},
visual = "mesh",
mesh = "...",
textures = {...},
},
-- required mobkit props
timeout = [num], -- entities are removed after this many seconds inactive
-- 0 is never
-- mobs having memory entries are not affected
buoyancy = [num], -- (0,1) - portion of collisionbox submerged
-- = 1 - controlled buoyancy (fish, submarine)
-- > 1 - drowns
-- < 0 - MC like water trampolining
lung_capacity = [num], -- seconds
max_hp = [num],
on_step = mobkit.stepfunc,
on_activate = mobkit.actfunc,
on_step = mobkit.stepfunc,
on_activate = mobkit.actfunc,
get_staticdata = mobkit.statfunc,
logic = [function user defined], -- older 'brainfunc' name works as well.
-- optional mobkit props
-- or used by built in behaviors
physics = [function user defined] -- optional, overrides built in physics
physics = [function user defined] -- optional, overrides built in physics
animation = {
[name]={range={x=[num],y=[num]},speed=[num],loop=[bool]}, -- single
[name]={ -- variant, animations are chosen randomly.
{range={x=[num],y=[num]},speed=[num],loop=[bool]},
{range={x=[num],y=[num]},speed=[num],loop=[bool]},
{range={x=[num],y=[num]},speed=[num],loop=[bool]},
...
}
@ -209,14 +211,14 @@ minetest.register_entity("mod:name",{
}
sounds = {
[name] = [string filename], --single, simple,
[name] = { --single, more powerful. All fields but 'name' are optional
name = [string filename],
gain=[num or range], --range is a table of the format {left_bound, right_bound}
fade=[num or range],
pitch=[num or range],
},
[name] = { --variant, sound is chosen randomly
{
name = [string filename],
@ -241,7 +243,7 @@ minetest.register_entity("mod:name",{
damage_groups={fleshy=[num]}}, -- and the tip of the murder weapon in nodes/meters
armor_groups = {fleshy=[num]}
})
1.5 Exposed luaentity members
Some frequently used entity fields to be accessed directly for convenience
@ -266,16 +268,16 @@ function mobkit.get_terrain_height(pos,steps)
-- steps (optional) is how far from pos it gives up, expressed in nodes, default 3
-- Returns:
-- surface height at pos, or nil if not found
-- liquid flag: true if found surface is covered with liquid
-- liquid flag: true if found surface is covered with liquid
function mobkit.turn2yaw(self,tyaw,rate)
-- gradually turns towards yaw
-- self: luaentity
-- tyaw: target yaw in radians
-- rate: turn rate in rads/s
--returns: true if facing tyaw; current yaw
function mobkit.timer(self,s)
function mobkit.timer(self,s)
-- returns true approx every s seconds
-- used to reduce execution of code that needn't necessarily be done on every engine step
@ -287,18 +289,18 @@ function mobkit.pos_shift(pos,vec)
function mobkit.pos_translate2d(pos,yaw,dist)
-- returns pos translated in the yaw direction by dist
function mobkit.get_stand_pos(thing)
function mobkit.get_stand_pos(thing)
-- returns object pos projected onto the bottom collisionbox face
-- thing can be luaentity or objectref.
function mobkit.nodeatpos(pos)
-- convenience function
-- returns nodedef or nil if it's an ignore node
function mobkit.get_node_pos(pos)
-- returns center of the node that pos is inside
-- returns center of the node that pos is inside
function mobkit.get_nodes_in_area(pos1,pos2,[full])
-- in basic mode returns a table of unique nodes within area indexed by node
-- in full=true mode returns a table of nodes indexed by pos
@ -307,7 +309,7 @@ function mobkit.get_nodes_in_area(pos1,pos2,[full])
function mobkit.isnear2d(p1,p2,thresh)
-- returns true if pos p2 is within a square with center at pos p1 and radius thresh
-- y components are ignored
function mobkit.is_there_yet2d(pos,dir,dest) -- obj positon; facing vector; destination position
-- returns true if a position dest is behind position pos according to facing vector dir
-- (checks if dest is in the rear half plane as defined by pos and dir)
@ -315,31 +317,31 @@ function mobkit.is_there_yet2d(pos,dir,dest) -- obj positon; facing vector; dest
function mobkit.isnear3d(p1,p2,thresh)
-- returns true if pos p2 is within a cube with center at pos p1 and radius thresh
function mobkit.dir_to_rot(v,rot)
-- converts a 3d vector v to rotation like in set_rotation() object method
-- rot (optional) is current object rotation
function mobkit.rot_to_dir(rot)
-- converts minetest rotation vector (pitch,yaw,roll) to direction unit vector
function mobkit.is_alive(thing)
function mobkit.rot_to_dir(rot)
-- converts minetest rotation vector (pitch,yaw,roll) to direction unit vector
function mobkit.is_alive(thing)
-- non essential, checks if thing exists in the world and is alive
-- makes an assumption that luaentities are considered dead when their hp < 100
-- thing can be luaentity or objectref.
-- used for stored luaentities and objectrefs
function mobkit.exists(thing)
-- checks if thing exists in the world
-- thing can be luaentity or objectref.
-- used for stored luaentities and objectrefs
function mobkit.hurt(luaent,dmg)
-- decrease luaent.hp by dmg
function mobkit.heal(luaent,dmg)
-- increase luaent.hp by dmg
function mobkit.get_spawn_pos_abr(dtime,intrvl,radius,chance,reduction)
-- returns a potential spawn position at random intervals
-- intrvl: avg spawn attempt interval for every player
@ -358,23 +360,23 @@ function mobkit.animate(self,anim)
-- makes an entity play an animation of name anim, or does nothing if not defined
-- anim is string, see entity definition
-- does nothing if the same animation is already running
function mobkit.make_sound(self,sound)
-- sound is string, see entity definition
-- makes an entity play sound, or does nothing if not defined
--returns sound handle
function mobkit.go_forward_horizontal(self,speed)
-- sets an entity's horizontal velocity in yaw direction. Vertical velocity unaffected.
function mobkit.drive_to_pos(self,tpos,speed,turn_rate,dist)
function mobkit.drive_to_pos(self,tpos,speed,turn_rate,dist)
-- moves in facing direction while gradually turning towards tpos, returns true if in dist distance from tpos
-- tpos: target position
-- speed: in m/s
-- turn_rate: in rad/s
-- dist: in m.
-- Memory functions.
-- Memory functions.
This represents mob long term memory
Warning: Stuff in memory is serialized, never try to remember objectrefs or tables referencing them
@ -391,14 +393,14 @@ function mobkit.recall(self,key)
function mobkit.queue_high(self,func,priority)
-- only for use in behavior definitions, see 1.1.2
function mobkit.queue_low(self,func)
-- only for use in behavior definitions, see 1.1.1
function mobkit.clear_queue_high(self)
function mobkit.clear_queue_low(self)
function mobkit.is_queue_empty_high(self)
function mobkit.is_queue_empty_low(self)
@ -411,14 +413,14 @@ function mobkit.get_queue_priority(self)
function mobkit.vitals(self)
-- default drowning and fall damage, call it before hp check
function mobkit.get_nearby_player(self)
function mobkit.get_nearby_player(self)
-- returns random player if nearby or nil
function mobkit.get_nearby_entity(self,name)
function mobkit.get_nearby_entity(self,name)
-- returns random nearby entity of name or nil
function mobkit.get_closest_entity(self,name)
function mobkit.get_closest_entity(self,name)
-- returns closest entity of name or nil
-- Misc
Neighbors structure represents a node's horizontal neighbors
@ -429,17 +431,17 @@ Neighbor #1 is offset {x=1,z=0}, subsequent numbers go clockwise
function mobkit.dir2neighbor(dir)
-- converts a 3d vector to neighbor number, y component ignored
function mobkit.neighbor_shift(neighbor,shift)
function mobkit.neighbor_shift(neighbor,shift)
-- get another neighbor number relative to the given, shift: plus is clockwise, minus the opposite
-- 1,1 = 2; 1,-2 = 7
2.2 Built in behaviors
function mobkit.goto_next_waypoint(self,tpos)
-- this functions groups common operations making mobs move in a specific direction
-- not a behavior itself, but is used by some built in HL behaviors
-- not a behavior itself, but is used by some built in HL behaviors
-- which use node by node movement algorithm
2.2.1 High Level Behaviors --
@ -447,67 +449,67 @@ function mobkit.goto_next_waypoint(self,tpos)
function mobkit.hq_roam(self,prty)
-- slow random roaming
-- never returns
function mobkit.hq_follow(self,prty,tgtobj)
-- follow the tgtobj
-- follow the tgtobj
-- returns if tgtobj becomes inactive
function mobkit.hq_goto(self,prty,tpos)
-- go to tpos position
-- returns on arrival
function mobkit.hq_runfrom(self,prty,tgtobj)
-- run away from tgtobj object
-- returns when tgtobj far enough
function mobkit.hq_hunt(self,prty,tgtobj)
-- follow tgtobj and when close enough, kick off hq_attack
-- returns when tgtobj too far
function mobkit.hq_warn(self,prty,tgtobj)
-- when a tgtobj close by, turn towards them and make the 'warn' sound
-- kick off hq_hunt if tgtobj too close or timer expired
-- returns when tgtobj moves away
function mobkit.hq_die(self)
-- default death, rotate and remove() after set time
function mobkit.hq_attack(self,prty,tgtobj)
-- default attack, turns towards tgtobj and leaps
-- returns when tgtobj out of range
function mobkit.hq_liquid_recovery(self,prty)
function mobkit.hq_liquid_recovery(self,prty)
-- use when submerged in liquid, scan for nearest land
-- if land is found within view_range, kick off hq_swimto
-- otherwise die
function mobkit.hq_swimto(self,prty,tpos)
-- swim towards the position tpos, jump if necessary
-- returns if standing firmly on dry land
Aquatic behaviors:
Macros:
function aqua_radar_dumb(pos,yaw,range,reverse)
-- assumes a mob will avoid shallows
-- checks if a pos in front of a moving entity swimmable
-- otherwise returns new position
-- otherwise returns new position
function mobkit.is_in_deep(target)
-- checks if an object is in water at least 2 nodes deep
Hq Behaviors:
function mobkit.hq_aqua_roam(self,prty,speed)
function mobkit.hq_aqua_attack(self,prty,tgtobj,speed)
function mobkit.hq_aqua_turn(self,prty,tyaw,speed)
-- used by both previous bhv
2.2.2 Low Level Behaviors --
function mobkit.lq_turn2pos(self,tpos)
-- gradually turn towards tpos position
-- returns when facing tpos
function mobkit.lq_idle(self,duration)
-- do nothing for duration seconds
-- set 'stand' animation
@ -515,7 +517,7 @@ function mobkit.lq_idle(self,duration)
function mobkit.lq_dumbwalk(self,dest,speed_factor)
-- simply move towards dest
-- set 'walk' animation
function mobkit.lq_dumbjump(self,height)
-- if standing on the ground, jump in the facing direction
-- height is relative to feet level
@ -525,15 +527,15 @@ function mobkit.lq_freejump(self)
-- unconditional jump in the facing direction
-- useful e.g for getting out of water
-- returns when the apex has been reached
function mobkit.lq_jumpattack(self,height,target)
-- jump towards the target, punch if a hit
-- returns after punch or on the ground
function mobkit.lq_fallover(self)
-- gradually rotates Z = 0 to pi/2
-- gradually rotates Z = 0 to pi/2
2.3 Constants and member variables --
mobkit.gravity = -9.8
@ -542,4 +544,4 @@ mobkit.friction = 0.4 -- inert entities will slow down when in contact with the
self.dtime -- for convenience, dtime as passed to currently executing on_step()
self.isonground -- true if y velocity is 0 for at least two succesive steps
self.isinliquid -- true if feet submerged in liquid type=source
self.isinliquid -- true if feet submerged in liquid type=source

View File

@ -1,17 +1,30 @@
std = "lua51+minetest"
unused_args = false
allow_defined_top = true
max_line_length = 999
max_comment_line_length = 999
read_globals = {
"DIR_DELIM",
"minetest", "core",
"dump",
"vector", "nodeupdate",
"VoxelManip", "VoxelArea",
"PseudoRandom", "ItemStack",
"intllib",
"default",
table = { fields = { "copy", "getn" } },
"biome_lib",
"stairs", "stairsplus",
stds.minetest = {
read_globals = {
"minetest",
"vector",
"VoxelManip",
"VoxelArea",
"PseudoRandom",
"ItemStack",
"default",
table = {
fields = {
"copy",
},
},
"dump",
}
}
read_globals = {
"biome_lib",
"stairsplus",
"stairs",
"doors",
}

View File

@ -1,6 +1,6 @@
local S = moretrees.intllib
-- © 2016, Rogier <rogier777@gmail.com>
-- Translation support
local S = minetest.get_translator("moretrees")
-- Some constants
@ -23,7 +23,11 @@ end
ftrunk.drop = "moretrees:palm_trunk"
gftrunk.drop = "moretrees:palm_trunk"
ftrunk.after_destruct = function(pos, oldnode)
local coconuts = minetest.find_nodes_in_area({x=pos.x-1, y=pos.y, z=pos.z-1}, {x=pos.x+1, y=pos.y, z=pos.z+1}, {"group:moretrees_coconut"})
local coconuts = minetest.find_nodes_in_area(
{x=pos.x-1, y=pos.y, z=pos.z-1},
{x=pos.x+1, y=pos.y, z=pos.z+1},
{"group:moretrees_coconut"}
)
for _,coconutpos in pairs(coconuts) do
-- minetest.dig_node(coconutpos) does not cause nearby coconuts to be dropped :-( ...
--minetest.dig_node(coconutpos)
@ -46,7 +50,11 @@ local coconut_regrow_abm_spec = {
interval = moretrees.coconut_flower_interval,
chance = moretrees.coconut_flower_chance,
action = function(pos, node, active_object_count, active_object_count_wider)
local coconuts = minetest.find_nodes_in_area({x=pos.x-1, y=pos.y, z=pos.z-1}, {x=pos.x+1, y=pos.y, z=pos.z+1}, "group:moretrees_coconut")
local coconuts = minetest.find_nodes_in_area(
{x=pos.x-1, y=pos.y, z=pos.z-1},
{x=pos.x+1, y=pos.y, z=pos.z+1},
"group:moretrees_coconut"
)
-- Expected growth interval increases exponentially with number of coconuts already hanging.
-- Also: if more coconuts are hanging, the chance of picking an empty spot decreases as well...
if math.random(2^#coconuts) <= 2 then
@ -76,15 +84,18 @@ minetest.register_abm({
chance = 1,
action = function(pos, node, active_object_count, active_object_count_wider)
minetest.swap_node(pos, {name="moretrees:palm_fruit_trunk"})
local poslist = minetest.find_nodes_in_area({x=pos.x-1, y=pos.y, z=pos.z-1}, {x=pos.x+1, y=pos.y, z=pos.z+1}, "air")
local poslist = minetest.find_nodes_in_area(
{x=pos.x-1, y=pos.y, z=pos.z-1},
{x=pos.x+1, y=pos.y, z=pos.z+1},
"air"
)
local genlist = {}
for k,v in pairs(poslist) do
genlist[k] = {x = math.random(100), pos = v}
end
table.sort(genlist, function(a, b) return a.x < b.x; end)
local gen
local count = 0
for _,gen in pairs(genlist) do
for _, gen in pairs(genlist) do
minetest.swap_node(gen.pos, {name = "moretrees:coconut_3"})
count = count + 1
if count == 4 then
@ -109,7 +120,8 @@ local coconut_growfn = function(pos, elapsed)
-- Drop coconuts (i.e. remove them), so that new coconuts can grow.
-- Coconuts will drop as items with a small chance
if math.random(coconut_drop_ichance) == 1 then
if moretrees.coconut_item_drop_ichance > 0 and math.random(moretrees.coconut_item_drop_ichance) == 1 then
if moretrees.coconut_item_drop_ichance > 0
and math.random(moretrees.coconut_item_drop_ichance) == 1 then
local items = minetest.get_node_drops(minetest.get_node(pos).name)
for _, itemname in pairs(items) do
minetest.add_item(pos, itemname)
@ -190,55 +202,95 @@ if moretrees.coconuts_convert_existing_palms then
local leaves
local coconuts
-- One regular trunk must be adjacent to the coconut
trunks = minetest.find_nodes_in_area({x=pos.x-1, y=pos.y, z=pos.z-1}, {x=pos.x+1, y=pos.y, z=pos.z+1}, "moretrees:palm_trunk")
trunks = minetest.find_nodes_in_area(
{x=pos.x-1, y=pos.y, z=pos.z-1},
{x=pos.x+1, y=pos.y, z=pos.z+1},
"moretrees:palm_trunk"
)
if #trunks ~= 1 then
return
end
local tpos = trunks[1]
-- 1 or 2 other trunks must be one level below to the trunk being converted.
trunks = minetest.find_nodes_in_area({x=tpos.x-1, y=tpos.y-1, z=tpos.z-1}, {x=tpos.x+1, y=tpos.y-1, z=tpos.z+1}, "moretrees:palm_trunk")
trunks = minetest.find_nodes_in_area(
{x=tpos.x-1, y=tpos.y-1, z=tpos.z-1},
{x=tpos.x+1, y=tpos.y-1, z=tpos.z+1},
"moretrees:palm_trunk"
)
if #trunks < 1 or #trunks > 2 then
return
end
-- 1 or 2 other trunks must be two levels below to the trunk being converted.
trunks = minetest.find_nodes_in_area({x=tpos.x-1, y=tpos.y-2, z=tpos.z-1}, {x=tpos.x+1, y=tpos.y-2, z=tpos.z+1}, "moretrees:palm_trunk")
trunks = minetest.find_nodes_in_area(
{x=tpos.x-1, y=tpos.y-2, z=tpos.z-1},
{x=tpos.x+1, y=tpos.y-2, z=tpos.z+1},
"moretrees:palm_trunk"
)
if #trunks < 1 or #trunks > 2 then
return
end
-- 1 or 2 trunks must at the level of the trunk being converted.
cvtrunks = minetest.find_nodes_in_area({x=tpos.x-1, y=tpos.y, z=tpos.z-1}, {x=tpos.x+1, y=tpos.y, z=tpos.z+1}, "moretrees:palm_trunk")
cvtrunks = minetest.find_nodes_in_area(
{x=tpos.x-1, y=tpos.y, z=tpos.z-1},
{x=tpos.x+1, y=tpos.y, z=tpos.z+1},
"moretrees:palm_trunk"
)
if #cvtrunks < 1 or #cvtrunks > 2 then
return
end
-- No trunks may be one level above the trunk being converted.
trunks = minetest.find_nodes_in_area({x=tpos.x-1, y=tpos.y+1, z=tpos.z-1}, {x=tpos.x+1, y=tpos.y+1, z=tpos.z+1}, "moretrees:palm_trunk")
trunks = minetest.find_nodes_in_area(
{x=tpos.x-1, y=tpos.y+1, z=tpos.z-1},
{x=tpos.x+1, y=tpos.y+1, z=tpos.z+1},
"moretrees:palm_trunk"
)
if #trunks ~= 0 then
return
end
-- Leaves must be one level above the trunk being converted.
leaves = minetest.find_nodes_in_area({x=tpos.x-1, y=tpos.y+1, z=tpos.z-1}, {x=tpos.x+1, y=tpos.y+1, z=tpos.z+1}, "moretrees:palm_leaves")
leaves = minetest.find_nodes_in_area(
{x=tpos.x-1, y=tpos.y+1, z=tpos.z-1},
{x=tpos.x+1, y=tpos.y+1, z=tpos.z+1},
"moretrees:palm_leaves"
)
if #leaves == 0 then
return
end
-- Leaves must be two levels above the trunk being converted.
leaves = minetest.find_nodes_in_area({x=tpos.x-1, y=tpos.y+2, z=tpos.z-1}, {x=tpos.x+1, y=tpos.y+2, z=tpos.z+1}, "moretrees:palm_leaves")
leaves = minetest.find_nodes_in_area(
{x=tpos.x-1, y=tpos.y+2, z=tpos.z-1},
{x=tpos.x+1, y=tpos.y+2, z=tpos.z+1},
"moretrees:palm_leaves"
)
if #leaves == 0 then
return
end
-- No cocos fruit trunk may already be adjacent to the coconut
trunks = minetest.find_nodes_in_area({x=pos.x-1, y=pos.y, z=pos.z-1}, {x=pos.x+1, y=pos.y, z=pos.z+1}, "moretrees:palm_fruit_trunk")
trunks = minetest.find_nodes_in_area(
{x=pos.x-1, y=pos.y, z=pos.z-1},
{x=pos.x+1, y=pos.y, z=pos.z+1},
"moretrees:palm_fruit_trunk"
)
if #trunks ~= 0 then
return
end
-- No cocos fruit trunk may be adjacent to or below the trunk being converted.
trunks = minetest.find_nodes_in_area({x=tpos.x-1, y=tpos.y-2, z=tpos.z-1}, {x=tpos.x+1, y=tpos.y, z=tpos.z+1}, "moretrees:palm_fruit_trunk")
trunks = minetest.find_nodes_in_area(
{x=tpos.x-1, y=tpos.y-2, z=tpos.z-1},
{x=tpos.x+1, y=tpos.y, z=tpos.z+1},
"moretrees:palm_fruit_trunk"
)
if #trunks ~= 0 then
return
end
-- Convert trunk and all coconuts nearby. Maybe convert 2 trunks, just in case...
for _, tpos in pairs(cvtrunks) do
minetest.swap_node(tpos, {name = "moretrees:palm_fruit_trunk"})
coconuts = minetest.find_nodes_in_area({x=tpos.x-1, y=tpos.y, z=tpos.z-1}, {x=tpos.x+1, y=tpos.y, z=tpos.z+1}, "moretrees:coconut")
for _, tpos_1 in pairs(cvtrunks) do
minetest.swap_node(tpos_1, {name = "moretrees:palm_fruit_trunk"})
coconuts = minetest.find_nodes_in_area(
{x=tpos_1.x-1, y=tpos_1.y, z=tpos_1.z-1},
{x=tpos_1.x+1, y=tpos_1.y, z=tpos_1.z+1},
"moretrees:coconut"
)
for _, coconutpos in pairs(coconuts) do
minetest.swap_node(coconutpos, {name = "moretrees:coconut_3"})
end

View File

@ -1,4 +1,4 @@
local S = moretrees.intllib
local S = minetest.get_translator("moretrees")
for i in ipairs(moretrees.treelist) do
local treename = moretrees.treelist[i][1]
@ -38,7 +38,8 @@ minetest.register_craftitem("moretrees:coconut_milk", {
description = S("Coconut Milk"),
inventory_image = "moretrees_coconut_milk_inv.png",
wield_image = "moretrees_coconut_milk.png",
on_use = minetest.item_eat(2),
on_use = minetest.item_eat(2, "vessels:drinking_glass"),
groups = {vessel = 1},
})
minetest.register_craftitem("moretrees:raw_coconut", {
@ -117,11 +118,63 @@ for i in ipairs(moretrees.cutting_tools) do
},
replacements = {
{ "moretrees:coconut", "moretrees:raw_coconut" },
{ tool, tool }
}
})
end
-- give tool back with wear preserved
minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv)
if (itemstack:get_name() == "moretrees:coconut_milk") then
for i, j in pairs(old_craft_grid) do
-- find tool used to do the craft
local ocg_name = j:get_name()
if ((ocg_name ~= "") and (ocg_name ~= "moretrees:coconut") and (ocg_name ~= "vessels:drinking_glass")) then
-- abort if using cutting board
if minetest.get_item_group(ocg_name, "food_cutting_board") == 1 then
return
end
-- create a new tool and set wear
local t = ItemStack(ocg_name)
local w = j:get_wear()
-- works if tool used is an axe
local uses = j:get_tool_capabilities().groupcaps.choppy.uses or 0
if (w == 0 and uses ~= 0) then
-- tool has never been used
-- use tool once
t:set_wear(65535/(9*(uses - 1)))
else
-- set wear back
t:set_wear(w)
-- use tool once
if (uses ~= 0) then
t:add_wear(65535/(9*(uses - 1)))
end
end
-- add to craft inventory
craft_inv:add_item("craft", t)
end
end
end
end)
-- coconut milk using food_cutting_board from farming redo
if minetest.registered_items["farming:cutting_board"] then
minetest.register_craft({
type = "shapeless",
output = "moretrees:coconut_milk",
recipe = {
"moretrees:coconut",
"vessels:drinking_glass",
"group:food_cutting_board",
},
replacements = {
{ "moretrees:coconut", "moretrees:raw_coconut" },
{ "group:food_cutting_board", "farming:cutting_board" },
}
})
end
minetest.register_craft({
type = "shapeless",
output = "moretrees:date_nut_snack",

View File

@ -11,7 +11,7 @@
-- © 2016, Rogier <rogier777@gmail.com>
local S = moretrees.intllib
local S = minetest.get_translator("moretrees")
-- Some constants
@ -44,7 +44,11 @@ for k,v in pairs(trunk.tiles) do
end
ftrunk.drop = "moretrees:date_palm_trunk"
ftrunk.after_destruct = function(pos, oldnode)
local dates = minetest.find_nodes_in_area({x=pos.x-2, y=pos.y, z=pos.z-2}, {x=pos.x+2, y=pos.y, z=pos.z+2}, {"group:moretrees_dates"})
local dates = minetest.find_nodes_in_area(
{x=pos.x-2, y=pos.y, z=pos.z-2},
{x=pos.x+2, y=pos.y, z=pos.z+2},
{"group:moretrees_dates"}
)
for _,datespos in pairs(dates) do
-- minetest.dig_node(datespos) does not cause nearby dates to be dropped :-( ...
local items = minetest.get_node_drops(minetest.get_node(datespos).name)
@ -120,8 +124,11 @@ minetest.register_abm({
type = "m"
minetest.swap_node(pos, {name="moretrees:date_palm_mfruit_trunk"})
end
local dates1 = minetest.find_nodes_in_area({x=pos.x-1, y=pos.y, z=pos.z-1}, {x=pos.x+1, y=pos.y, z=pos.z+1}, "air")
local genpos
local dates1 = minetest.find_nodes_in_area(
{x=pos.x-1, y=pos.y, z=pos.z-1},
{x=pos.x+1, y=pos.y, z=pos.z+1},
"air"
)
for _,genpos in pairs(dates1) do
if math.random(100) <= 20 then
if type == "m" then
@ -131,7 +138,11 @@ minetest.register_abm({
end
end
end
local dates2 = minetest.find_nodes_in_area({x=pos.x-2, y=pos.y, z=pos.z-2}, {x=pos.x+2, y=pos.y, z=pos.z+2}, "air")
local dates2 = minetest.find_nodes_in_area(
{x=pos.x-2, y=pos.y, z=pos.z-2},
{x=pos.x+2, y=pos.y, z=pos.z+2},
"air"
)
for _,genpos in pairs(dates2) do
if math.random(100) <= 5 then
if type == "m" then
@ -195,7 +206,7 @@ local function find_fruit_trunks_near(ftpos, sect)
local r = moretrees.dates_pollination_distance + 2 * math.sqrt(2)
local sect_hr = math.floor(r / 3 + 0.9999)
local sect_vr = math.floor(r / 2 + 0.9999)
local t0us = core.get_us_time()
local t0us = minetest.get_us_time()
local t0s = os.time()
-- Compute elapsed time since last search.
@ -266,7 +277,7 @@ local function find_fruit_trunks_near(ftpos, sect)
end
-- Update search statistics
local t1us = core.get_us_time()
local t1us = minetest.get_us_time()
if t1us < t0us then
-- Wraparound. Assume the search lasted less than 2^32 microseconds (~71 min)
-- (so no need to apply another correction)
@ -306,7 +317,7 @@ minetest.register_chatcommand("dates_stats", {
params = "|chat|log|reset",
privs = { server = true },
func = function(name, param)
param = string.lower(string.trim(param))
param = string.lower(param:gsub("%s+", ""))
if param == "" or param == "chat" then
return dates_print_search_stats(false)
elseif param == "log" then
@ -526,7 +537,6 @@ end
local dates_growfn = function(pos, elapsed)
local node = minetest.get_node(pos)
local delay = moretrees.dates_grow_interval
local r = moretrees.dates_pollination_distance
local action
if not node then
return
@ -594,15 +604,16 @@ local dates_growfn = function(pos, elapsed)
return action
end
--[[
-- Alternate growth function for dates.
-- It calls the primary growth function, but also measures CPU time consumed.
-- Use this function to analyze date growing performance.
local stat = {}
stat.count = 0
local dates_growfn_profiling = function(pos, elapsed)
local t0 = core.get_us_time()
local t0 = minetest.get_us_time()
local action = dates_growfn(pos, elapsed)
local t1 = core.get_us_time()
local t1 = minetest.get_us_time()
if t1 < t0 then
t1 = t1 + 2^32
end
@ -656,6 +667,7 @@ local dates_growfn_profiling = function(pos, elapsed)
"TOTAL", count, sum/count))
end
end
--]]
-- Register dates

View File

@ -1,9 +0,0 @@
default
biome_lib
vessels
doors?
stairs?
moreblocks?
intllib?
farming?

View File

@ -1 +0,0 @@
This mod adds a whole bunch of new types of trees to the game

View File

@ -62,14 +62,6 @@ if io.open(worldpath.."/moretrees_settings.txt","r") then
dofile(worldpath.."/moretrees_settings.txt")
end
-- Boilerplate to support localized strings if intllib mod is installed.
local S
if minetest.get_modpath("intllib") then
S = intllib.Getter()
else
S = function(s) return s end
end
moretrees.intllib = S
-- infinite stacks checking
@ -334,4 +326,4 @@ function moretrees.grow_fir_snow(pos)
minetest.spawn_tree(pos,moretrees.fir_model)
end
print(S("[Moretrees] Loaded (2013-02-11)"))
print("[Moretrees] Loaded (2013-02-11)")

View File

@ -1,73 +0,0 @@
# Translation by Xanthin
### crafts.lua ###
Coconut Milk = Kokosnussmilch
Raw Coconut = Kokosnussfleisch
Acorn Muffin batter = Eichelmuffinteig
Acorn Muffin = Eichelmuffin
Roasted Spruce Cone Nuts = Geroestete Fichtenzapfen
Roasted Pine Cone Nuts = Geroestete Kiefernzapfen
Roasted Fir Cone Nuts = Geroestete Tannenzapfen
### node_defs.lua ###
Beech Tree Trunk = Buchenstamm
Apple Tree Trunk = Apfelbaumstamm
Oak Tree Trunk = Eichenstamm
Giant Sequoia Trunk = Riesenmammutbaumstamm
Birch Tree Trunk = Birkenstamm
Palm Tree Trunk = Palmenstamm
Spruce Tree Trunk = Fichtenstamm
Pine Tree Trunk = Kiefernstamm
Willow Tree Trunk = Weidenstamm
Rubber Tree Trunk = Gummibaumstamm
Jungle Tree Trunk = Tropenbaumstamm
Douglas Fir Trunk = Douglasienstamm
Beech Tree Planks = Buchebretter
Apple Tree Planks = Apfelbaumbretter
Oak Tree Planks = Eichenbretter
Giant Sequoia Planks = Riesenmammutbaumbretter
Birch Tree Planks = Birkebretter
Palm Tree Planks = Palmenbretter
Spruce Tree Planks = Fichtenbretter
Pine Tree Planks = Kiefernbretter
Willow Tree Planks = Weidenbretter
Rubber Tree Planks = Gummibaumbretter
Jungle Tree Planks = Tropenholzbretter
Douglas Fir Planks = Douglasienbretter
Beech Tree Sapling = Buchesetzling
Apple Tree Sapling = Apfelbaumsetzling
Oak Tree Sapling = Eichensetzling
Giant Sequoia Sapling = Riesenmammutbaumsetzling
Birch Tree Sapling = Birkensetzling
Palm Tree Sapling = Palmensetzling
Spruce Tree Sapling = Fichtensetzling
Pine Tree Sapling = Kiefernsetzling
Willow Tree Sapling = Weidensetzling
Rubber Tree Sapling = Gummibaumsetzling
Jungle Tree Sapling = Tropenbaumsetzling
Douglas Fir Sapling = Douglasiensetzling
Beech Tree Leaves = Buchenlaub
Apple Tree Leaves = Apfelbaumlaub
Oak Tree Leaves = Eichenlaub
Giant Sequoia Leaves = Riesenmammutbaumlaub
Birch Tree Leaves = Birkenlaub
Palm Tree Leaves = Palmenlaub
Spruce Tree Leaves = Fichtennadeln
Pine Tree Leaves = Kiefernnadeln
Willow Tree Leaves = Weidenlaub
Rubber Tree Leaves = Gummibaumlaub
Jungle Tree Leaves = Tropenbaumlaub
Douglas Fir Leaves = Douglasiennadeln
Acorn = Eichel
Coconut = Kokosnuss
Spruce Cone = Fichtenzapfen
Pine Cone = Kiefernzapfen
Fir Cone = Tannenzapfen
Jungle Sapling = Tropenbaumsetzling
Jungle Tree Leaves (Yellow) = Tropenbaumlaub (gelb)
Jungle Tree Leaves (Red) = Tropenbaumlaub (rot)
Douglas Fir Leaves (Bright) = Douglasiennadeln (breit)
Rubber Tree Trunk (Empty) = Gummibaumstamm (leer)
[Moretrees] Loaded (2013-02-11) = [Moretrees] geladen (2013-02-11)

View File

@ -1,100 +0,0 @@
# Traducido por Carlos Barraza
### crafts.lua ###
Coconut Milk = Leche de Coco
Raw Coconut = Coco crudo
Acorn Muffin batter = Masa de Mollete de Bellota
Acorn Muffin = Mollete de Bellota
Roasted Spruce Cone Nuts = Cono de Picea Tostado
Roasted Pine Cone Nuts = Cono de Pino Tostado
Roasted Fir Cone Nuts = Cono de Abeto Tostado
Roasted Cedar Cone Nuts = Coco de Alamo Tostado
Date = Datilera
Date & nut snack = Datilera y Nueces
Date-nut cake batter = Pasta de torta de Datilera
Date-nut cake = Pastel de Datilera
Date-nut energy bar = Barra energetica de Datilera
### date_palm.lua ###
Dates = Datilera
Date Stem = Tallo de Datilera
Date Flowers = Flores de Datilera
### node_defs.lua ###
Beech Tree Trunk = Tronco de Arbol de Haya
Apple Tree Trunk = Tronco de Arbol de Manzana
Oak Tree Trunk = Tronco de Arbol de Roble
Giant Sequoia Trunk = Tronco de Sequoia Gigante
Birch Tree Trunk = Tronco de Arbol de Abedul
Palm Tree Trunk = Tronco de Palmera
Spruce Tree Trunk = Tronco de Arbol de Abeto
Willow Tree Trunk = Tronco de Arbol de Sauce
Rubber Tree Trunk = Tronco de Arbol de Arbol de Goma
Jungle Tree = Tronco de Arbol de Arbol de la Selva
Douglas Fir Trunk = Tronco de Arbol de Abeto de Douglas
Cedar Tree Trunk = Tronco de Arbol de Cedro
Date Palm Tree Trunk = Tronco de Palmera Datilera
Acacia Tree Trunk = Tronco de Arbol de Acacia
Poplar Tree Trunk = Tronco de Arbol de Alamo
Beech Tree Planks = Madera de Arbol de Haya
Apple Tree Planks = Madera de Arbol de Manzana
Oak Tree Planks = Madera de Arbol de Roble
Giant Sequoia Planks = Madera de Sequoia Gigante
Birch Tree Planks = Madera de Arbol de Abedul
Palm Tree Planks = Madera de Palmera
Spruce Tree Planks = Madera de Arbol de Abeto
Willow Tree Planks = Madera de Arbol de Sauce
Rubber Tree Planks = Madera de Arbol de Arbol de Goma
Jungle Planks = Madera de Arbol de Arbol de la Selva
Douglas Fir Planks = Madera de Arbol de Abeto de Douglas
Cedar Tree Planks = Madera de Arbol de Cedro
Date Palm Tree Planks = Madera de Palmera Datilera
Acacia Tree Planks = Madera de Arbol de Acacia
Poplar Tree Planks = Madera de Arbol de Alamo
Beech Tree Sapling = Retoño de Arbol de Haya
Apple Tree Sapling = Retoño de Arbol de Manzana
Oak Tree Sapling = Retoño de Arbol de Roble
Giant Sequoia Sapling = Retoño de Arbol de Sequoia Gigante
Birch Tree Sapling = Retoño de Arbol de Abedul
Palm Tree Sapling = Retoño de Palmera
Spruce Tree Sapling = Retoño de Arbol de Abeto
Willow Tree Sapling = Retoño de Arbol de Sauce
Rubber Tree Sapling = Retoño de Arbol de Arbol de Goma
Jungle Sapling = Retoño de Arbol de Arbol de la Selva
Douglas Fir Sapling = Retoño de Arbol de Abeto de Douglas
Cedar Tree Sapling = Retoño de Arbol de Cedro
Date Palm Tree Tree Sapling = Retoño de Palmera Datilera
Acacia Tree Sapling = Retoño de Arbol de Acacia
Poplar Tree Sapling = Retoño de Arbol de Alamo
Beech Tree Leaves = Hojas de Arbol de Haya
Apple Tree Leaves = Hojas de Arbol de Manzana
Oak Tree Leaves = Hojas de Arbol de Roble
Giant Sequoia Leaves = Hojas de Sequoia Gigante
Birch Tree Leaves = Hojas de Arbol de Abedul
Palm Tree Leaves = Hojas de Palmera
Spruce Tree Leaves = Hojas de Arbol de Abeto
Willow Tree Leaves = Hojas de Arbol de Sauce
Rubber Tree Leaves = Hojas de Arbol de Arbol de Goma
Jungle Leaves = Hojas de Arbol de Arbol de la Selva
Douglas Fir Leaves = Hojas de Arbol de Abeto de Douglas
Cedar Tree Leaves = Hojas de Arbol de Cedro
Date Palm Tree Tree Leaves = Hojas de Palmera Datilera
Acacia Tree Leaves = Hojas de Arbol de Acacia
Poplar Tree Leaves = Hojas de Arbol de Alamo
Acorn = Bellota
Coconut = Coco
Spruce Cone = Coco de Picea
Pine Cone = Coco de Pino
Fir Cone = Coco de Abeto
Cedar Cone = Coco de Alamo
Jungle Sapling = Retoño de Arbol de la Selva
Jungle Tree Leaves (Yellow) = Hojas de Arbol de la Selva (Amarilla)
Jungle Tree Leaves (Red) = Hojas de Arbol de la Selva (Roja)
Douglas Fir Leaves (Bright) = Hojas de Arbol de Abeto de Douglas (Brillante)
Rubber Tree Trunk (Empty) = Tronco de Arbol de Goma (Vacio)
[Moretrees] Loaded (2013-02-11) = [Masarboles] Cargado

View File

@ -1,74 +0,0 @@
# Traduction par Yoan31
#
### crafts.lua ###
Coconut Milk = Lait de Coco
Raw Coconut = Noix de Coco Crue
Acorn Muffin batter = Pate à Muffins au Gland
Acorn Muffin = Muffins au Gland
Roasted Spruce Cone Nuts = Noix de Cône de Sapin Roties
Roasted Pine Cone Nuts = Noix de Pomme de pin Roties
Roasted Fir Cone Nuts = Noix de Cône de Sapin Roties
### node_defs.lua ###
Beech Tree Trunk = Tronc d'Arbre de Hêtre
Apple Tree Trunk = Tronc d'Arbre de Pommier
Oak Tree Trunk = Tronc d'Arbre de chêne
Giant Sequoia Trunk = Tronc d'Arbre de Séquoia Géant
Birch Tree Trunk = Tronc d'Arbre de bouleau
Palm Tree Trunk = Tronc d'Arbre de Palmier
Spruce Tree Trunk = Tronc d'Arbre d'Epicéa
Pine Tree Trunk = Tronc d'Arbre de Pin
Willow Tree Trunk = Tronc d'Arbre de Saule
Rubber Tree Trunk = Tronc d'Arbre a Caoutchouc
Jungle Tree Trunk = Tronc d'Arbre de la Jungle
Douglas Fir Trunk = Tronc de Sapin de Douglas
Beech Tree Planks = Planches de Hêtre
Apple Tree Planks = Planches de Pommier
Oak Tree Planks = Planches de Chêne
Giant Sequoia Planks = Planches de d'Arbre de Séquoia Géant
Birch Tree Planks = Planches d'Arbre de bouleau
Palm Tree Planks = Planches d'Arbre de Palmier
Spruce Tree Planks = Planches d'Arbre d'Epicéa
Pine Tree Planks = Planches d'Arbre de Pin
Willow Tree Planks = Planches d'Arbre de Saule
Rubber Tree Planks = Planches d'Arbre a Caoutchouc
Jungle Tree Planks = Planches d'Arbre de la Jungle
Douglas Fir Planks = Planches de Sapin de Douglas
Beech Tree Sapling = Pousse d'Arbre de Hêtre
Apple Tree Sapling = Pousse d'Arbre de Pommier
Oak Tree Sapling = Pousse d'Arbre de chêne
Giant Sequoia Sapling = Pousse d'Arbre de Séquoia Géant
Birch Tree Sapling = Pousse d'Arbre de bouleau
Palm Tree Sapling = Pousse d'Arbre de Palmier
Spruce Tree Sapling = Pousse d'Arbre d'Epicéa
Pine Tree Sapling = Pousse d'Arbre de Pin
Willow Tree Sapling = Pousse d'Arbre de Saule
Rubber Tree Sapling = Pousse d'Arbre a Caoutchouc
Jungle Tree Sapling = Pousse d'Arbre de la Jungle
Douglas Fir Sapling = Pousse de Sapin de Douglas
Beech Tree Leaves = Feuilles d'Arbre de Hêtre
Apple Tree Leaves = Feuilles d'Arbre de Pommier
Oak Tree Leaves = Feuilles d'Arbre de chêne
Giant Sequoia Leaves = Feuilles d'Arbre de Séquoia Géant
Birch Tree Leaves = Feuilles d'Arbre de bouleau
Palm Tree Leaves = Feuilles d'Arbre de Palmier
Spruce Tree Leaves = Feuilles d'Arbre d'Epicéa
Pine Tree Leaves = Feuilles d'Arbre de Pin
Willow Tree Leaves = Feuilles d'Arbre de Saule
Rubber Tree Leaves = Feuilles d'Arbre a Caoutchouc
Jungle Tree Leaves = Feuilles d'Arbre de la Jungle
Douglas Fir Leaves = Feuilles de Sapin de Douglas
Acorn = Gland
Coconut = Noix de Coco
Spruce Cone = Cône de Sapin
Pine Cone = Pomme de Pin
Fir Cone = Pomme de Sapin
Jungle Sapling = Pousse d'Arbre de la Jungle
Jungle Tree Leaves (Yellow) = Feuille d'Arbre de la Jungle (Jaune)
Jungle Tree Leaves (Red) = Feuille d'Arbre de la Jungle (Rouge)
Douglas Fir Leaves (Bright) = Feuille de Sapin de Douglas (Brillant)
Rubber Tree Trunk (Empty) = Tronc d'Arbre en Caoutchouc (Vide)
[Moretrees] Loaded (2013-02-11) =

View File

@ -0,0 +1,211 @@
# textdomain: moretrees
# Translation by Xanthin
### cocos_palm.lua ###
Coconut=Kokosnuss
Coconut Flower=
### crafts.lua ###
Acorn Muffin=Eichelmuffin
Acorn Muffin batter=Eichelmuffinteig
Coconut Milk=Kokosnussmilch
Date=
Date & nut snack=
Date-nut cake=
Date-nut cake batter=
Date-nut energy bar=
Raw Coconut=Kokosnussfleisch
Roasted Cedar Cone Nuts=
Roasted Fir Cone Nuts=Geroestete Tannenzapfen
Roasted Spruce Cone Nuts=Geroestete Fichtenzapfen
### date_palm.lua ###
Date Flowers=
Date Stem=
Dates=
### node_defs.lua ###
@1 (fast growth)=
Acorn=Eichel
Apple Tree=
Apple Tree Fence=
Apple Tree Fence Gate=
Apple Tree Fence Rail=
Apple Tree Leaves=Apfelbaumlaub
Apple Tree Planks=Apfelbaumbretter
Apple Tree Planks Slab=
Apple Tree Planks Stair=
Apple Tree Sapling=Apfelbaumsetzling
Apple Tree Trunk=Apfelbaumstamm
Apple Tree Trunk Slab=
Apple Tree Trunk Stair=
Beech Tree=
Beech Tree Fence=
Beech Tree Fence Gate=
Beech Tree Fence Rail=
Beech Tree Leaves=Buchenlaub
Beech Tree Planks=Buchebretter
Beech Tree Planks Slab=
Beech Tree Planks Stair=
Beech Tree Sapling=Buchesetzling
Beech Tree Trunk=Buchenstamm
Beech Tree Trunk Slab=
Beech Tree Trunk Stair=
Birch Tree=
Birch Tree Fence=
Birch Tree Fence Gate=
Birch Tree Fence Rail=
Birch Tree Leaves=Birkenlaub
Birch Tree Planks=Birkebretter
Birch Tree Planks Slab=
Birch Tree Planks Stair=
Birch Tree Sapling=Birkensetzling
Birch Tree Trunk=Birkenstamm
Birch Tree Trunk Slab=
Birch Tree Trunk Stair=
Cedar Cone=
Cedar Tree=
Cedar Tree Fence=
Cedar Tree Fence Gate=
Cedar Tree Fence Rail=
Cedar Tree Leaves=
Cedar Tree Planks=
Cedar Tree Planks Slab=
Cedar Tree Planks Stair=
Cedar Tree Sapling=
Cedar Tree Trunk=
Cedar Tree Trunk Slab=
Cedar Tree Trunk Stair=
Date Palm Tree=
Date Palm Tree Fence=
Date Palm Tree Fence Gate=
Date Palm Tree Fence Rail=
Date Palm Tree Leaves=
Date Palm Tree Planks=
Date Palm Tree Planks Slab=
Date Palm Tree Planks Stair=
Date Palm Tree Sapling=
Date Palm Tree Trunk=
Date Palm Tree Trunk Slab=
Date Palm Tree Trunk Stair=
Douglas Fir=
Douglas Fir Fence=
Douglas Fir Fence Gate=
Douglas Fir Fence Rail=
Douglas Fir Leaves=Douglasiennadeln
Douglas Fir Leaves (Bright)=Douglasiennadeln (breit)
Douglas Fir Planks=Douglasienbretter
Douglas Fir Planks Slab=
Douglas Fir Planks Stair=
Douglas Fir Sapling=Douglasiensetzling
Douglas Fir Trunk=Douglasienstamm
Douglas Fir Trunk Slab=
Douglas Fir Trunk Stair=
Fir Cone=Tannenzapfen
Giant Sequoia=
Giant Sequoia Fence=
Giant Sequoia Fence Gate=
Giant Sequoia Fence Rail=
Giant Sequoia Leaves=Riesenmammutbaumlaub
Giant Sequoia Planks=Riesenmammutbaumbretter
Giant Sequoia Planks Slab=
Giant Sequoia Planks Stair=
Giant Sequoia Sapling=Riesenmammutbaumsetzling
Giant Sequoia Trunk=Riesenmammutbaumstamm
Giant Sequoia Trunk Slab=
Giant Sequoia Trunk Stair=
Jungle Tree=
Jungle Tree Fence=
Jungle Tree Fence Gate=
Jungle Tree Fence Rail=
Jungle Tree Leaves=Tropenbaumlaub
Jungle Tree Leaves (@1)=Tropenbaumlaub (@1)
Jungle Tree Planks=Tropenholzbretter
Jungle Tree Planks Slab=
Jungle Tree Planks Stair=
Jungle Tree Sapling=Tropenbaumsetzling
Jungle Tree Trunk=Tropenbaumstamm
Jungle Tree Trunk Slab=
Jungle Tree Trunk Stair=
Oak Tree=
Oak Tree Fence=
Oak Tree Fence Gate=
Oak Tree Fence Rail=
Oak Tree Leaves=Eichenlaub
Oak Tree Planks=Eichenbretter
Oak Tree Planks Slab=
Oak Tree Planks Stair=
Oak Tree Sapling=Eichensetzling
Oak Tree Trunk=Eichenstamm
Oak Tree Trunk Slab=
Oak Tree Trunk Stair=
Palm Tree=
Palm Tree Fence=
Palm Tree Fence Gate=
Palm Tree Fence Rail=
Palm Tree Leaves=Palmenlaub
Palm Tree Planks=Palmenbretter
Palm Tree Planks Slab=
Palm Tree Planks Stair=
Palm Tree Sapling=Palmensetzling
Palm Tree Trunk=Palmenstamm
Palm Tree Trunk Slab=
Palm Tree Trunk Stair=
Poplar Tree=
Poplar Tree Fence=
Poplar Tree Fence Gate=
Poplar Tree Fence Rail=
Poplar Tree Leaves=
Poplar Tree Planks=
Poplar Tree Planks Slab=
Poplar Tree Planks Stair=
Poplar Tree Sapling=
Poplar Tree Trunk=
Poplar Tree Trunk Slab=
Poplar Tree Trunk Stair=
Red=rot
Rubber Tree=
Rubber Tree Fence=
Rubber Tree Fence Gate=
Rubber Tree Fence Rail=
Rubber Tree Leaves=Gummibaumlaub
Rubber Tree Planks=Gummibaumbretter
Rubber Tree Planks Slab=
Rubber Tree Planks Stair=
Rubber Tree Sapling=Gummibaumsetzling
Rubber Tree Trunk=Gummibaumstamm
Rubber Tree Trunk (Empty)=Gummibaumstamm (leer)
Rubber Tree Trunk Slab=
Rubber Tree Trunk Stair=
Small poplar Tree Sapling=
Spruce Cone=Fichtenzapfen
Spruce Tree=
Spruce Tree Fence=
Spruce Tree Fence Gate=
Spruce Tree Fence Rail=
Spruce Tree Leaves=Fichtennadeln
Spruce Tree Planks=Fichtenbretter
Spruce Tree Planks Slab=
Spruce Tree Planks Stair=
Spruce Tree Sapling=Fichtensetzling
Spruce Tree Trunk=Fichtenstamm
Spruce Tree Trunk Slab=
Spruce Tree Trunk Stair=
Willow Tree=
Willow Tree Fence=
Willow Tree Fence Gate=
Willow Tree Fence Rail=
Willow Tree Leaves=Weidenlaub
Willow Tree Planks=Weidenbretter
Willow Tree Planks Slab=
Willow Tree Planks Stair=
Willow Tree Sapling=Weidensetzling
Willow Tree Trunk=Weidenstamm
Willow Tree Trunk Slab=
Willow Tree Trunk Stair=
Yellow=gelb

View File

@ -0,0 +1,211 @@
# textdomain: moretrees
# Translation by Carlos Barraza
### cocos_palm.lua ###
Coconut=Coco
Coconut Flower=
### crafts.lua ###
Acorn Muffin=Mollete de Bellota
Acorn Muffin batter= Masa de Mollete de Bellota
Coconut Milk=Leche de Coco
Date=Datilera
Date & nut snack=Datilera y Nueces
Date-nut cake=Pastel de Datilera
Date-nut cake batter=Pasta de torta de Datilera
Date-nut energy bar=Barra energetica de Datilera
Raw Coconut=Coco crudo
Roasted Cedar Cone Nuts=Coco de Alamo Tostado
Roasted Fir Cone Nuts=Cono de Abeto Tostado
Roasted Spruce Cone Nuts=Cono de Picea Tostado
### date_palm.lua ###
Date Flowers=Flores de Datilera
Date Stem=Tallo de Datilera
Dates=Datilera
### node_defs.lua ###
@1 (fast growth)=
Acorn=Bellota
Apple Tree=
Apple Tree Fence=
Apple Tree Fence Gate=
Apple Tree Fence Rail=
Apple Tree Leaves=Hojas de Arbol de Manzana
Apple Tree Planks=Madera de Arbol de Manzana
Apple Tree Planks Slab=
Apple Tree Planks Stair=
Apple Tree Sapling=Retoño de Arbol de Manzana
Apple Tree Trunk=Tronco de Arbol de Manzana
Apple Tree Trunk Slab=
Apple Tree Trunk Stair=
Beech Tree=
Beech Tree Fence=
Beech Tree Fence Gate=
Beech Tree Fence Rail=
Beech Tree Leaves=Hojas de Arbol de Haya
Beech Tree Planks=Madera de Arbol de Haya
Beech Tree Planks Slab=
Beech Tree Planks Stair=
Beech Tree Sapling=Retoño de Arbol de Haya
Beech Tree Trunk=Tronco de Arbol de Haya
Beech Tree Trunk Slab=
Beech Tree Trunk Stair=
Birch Tree=
Birch Tree Fence=
Birch Tree Fence Gate=
Birch Tree Fence Rail=
Birch Tree Leaves=Hojas de Arbol de Abedul
Birch Tree Planks=Madera de Arbol de Abedul
Birch Tree Planks Slab=
Birch Tree Planks Stair=
Birch Tree Sapling=Retoño de Arbol de Abedul
Birch Tree Trunk=Tronco de Arbol de Abedul
Birch Tree Trunk Slab=
Birch Tree Trunk Stair=
Cedar Cone=Coco de Alamo
Cedar Tree=
Cedar Tree Fence=
Cedar Tree Fence Gate=
Cedar Tree Fence Rail=
Cedar Tree Leaves=Hojas de Arbol de Cedro
Cedar Tree Planks=Madera de Arbol de Cedro
Cedar Tree Planks Slab=
Cedar Tree Planks Stair=
Cedar Tree Sapling=Retoño de Arbol de Cedro
Cedar Tree Trunk=Tronco de Arbol de Cedro
Cedar Tree Trunk Slab=
Cedar Tree Trunk Stair=
Date Palm Tree=
Date Palm Tree Fence=
Date Palm Tree Fence Gate=
Date Palm Tree Fence Rail=
Date Palm Tree Leaves=
Date Palm Tree Planks=Madera de Palmera Datilera
Date Palm Tree Planks Slab=
Date Palm Tree Planks Stair=
Date Palm Tree Sapling=
Date Palm Tree Trunk=Tronco de Palmera Datilera
Date Palm Tree Trunk Slab=
Date Palm Tree Trunk Stair=
Douglas Fir=
Douglas Fir Fence=
Douglas Fir Fence Gate=
Douglas Fir Fence Rail=
Douglas Fir Leaves=Hojas de Arbol de Abeto de Douglas
Douglas Fir Leaves (Bright)=Hojas de Arbol de Abeto de Douglas (Brillante)
Douglas Fir Planks=Madera de Arbol de Abeto de Douglas
Douglas Fir Planks Slab=
Douglas Fir Planks Stair=
Douglas Fir Sapling=Retoño de Arbol de Abeto de Douglas
Douglas Fir Trunk=Tronco de Arbol de Abeto de Douglas
Douglas Fir Trunk Slab=
Douglas Fir Trunk Stair=
Fir Cone=Coco de Abeto
Giant Sequoia=
Giant Sequoia Fence=
Giant Sequoia Fence Gate=
Giant Sequoia Fence Rail=
Giant Sequoia Leaves=Hojas de Sequoia Gigante
Giant Sequoia Planks=Madera de Sequoia Gigante
Giant Sequoia Planks Slab=
Giant Sequoia Planks Stair=
Giant Sequoia Sapling=Retoño de Arbol de Sequoia Gigante
Giant Sequoia Trunk=Tronco de Sequoia Gigante
Giant Sequoia Trunk Slab=
Giant Sequoia Trunk Stair=
Jungle Tree=Tronco de Arbol de Arbol de la Selva
Jungle Tree Fence=
Jungle Tree Fence Gate=
Jungle Tree Fence Rail=
Jungle Tree Leaves=Hojas de Arbol de la Selva
Jungle Tree Leaves (@1)=Hojas de Arbol de la Selva (@1)
Jungle Tree Planks=
Jungle Tree Planks Slab=
Jungle Tree Planks Stair=
Jungle Tree Sapling=
Jungle Tree Trunk=
Jungle Tree Trunk Slab=
Jungle Tree Trunk Stair=
Oak Tree=
Oak Tree Fence=
Oak Tree Fence Gate=
Oak Tree Fence Rail=
Oak Tree Leaves=Hojas de Arbol de Roble
Oak Tree Planks=Madera de Arbol de Roble
Oak Tree Planks Slab=
Oak Tree Planks Stair=
Oak Tree Sapling=Retoño de Arbol de Roble
Oak Tree Trunk=Tronco de Arbol de Roble
Oak Tree Trunk Slab=
Oak Tree Trunk Stair=
Palm Tree=
Palm Tree Fence=
Palm Tree Fence Gate=
Palm Tree Fence Rail=
Palm Tree Leaves=Hojas de Palmera
Palm Tree Planks=Madera de Palmera
Palm Tree Planks Slab=
Palm Tree Planks Stair=
Palm Tree Sapling=Retoño de Palmera
Palm Tree Trunk=Tronco de Palmera
Palm Tree Trunk Slab=
Palm Tree Trunk Stair=
Poplar Tree=
Poplar Tree Fence=
Poplar Tree Fence Gate=
Poplar Tree Fence Rail=
Poplar Tree Leaves=Hojas de Arbol de Alamo
Poplar Tree Planks=Madera de Arbol de Alamo
Poplar Tree Planks Slab=
Poplar Tree Planks Stair=
Poplar Tree Sapling=Retoño de Arbol de Alamo
Poplar Tree Trunk=Tronco de Arbol de Alamo
Poplar Tree Trunk Slab=
Poplar Tree Trunk Stair=
Red=Roja
Rubber Tree=
Rubber Tree Fence=
Rubber Tree Fence Gate=
Rubber Tree Fence Rail=
Rubber Tree Leaves=Hojas de Arbol de Arbol de Goma
Rubber Tree Planks=Madera de Arbol de Arbol de Goma
Rubber Tree Planks Slab=
Rubber Tree Planks Stair=
Rubber Tree Sapling=Retoño de Arbol de Arbol de Goma
Rubber Tree Trunk=Tronco de Arbol de Arbol de Goma
Rubber Tree Trunk (Empty)=Tronco de Arbol de Goma (Vacio)
Rubber Tree Trunk Slab=
Rubber Tree Trunk Stair=
Small poplar Tree Sapling=
Spruce Cone=Coco de Picea
Spruce Tree=
Spruce Tree Fence=
Spruce Tree Fence Gate=
Spruce Tree Fence Rail=
Spruce Tree Leaves=Hojas de Arbol de Abeto
Spruce Tree Planks=Madera de Arbol de Abeto
Spruce Tree Planks Slab=
Spruce Tree Planks Stair=
Spruce Tree Sapling=Retoño de Arbol de Abeto
Spruce Tree Trunk=Tronco de Arbol de Abeto
Spruce Tree Trunk Slab=
Spruce Tree Trunk Stair=
Willow Tree=
Willow Tree Fence=
Willow Tree Fence Gate=
Willow Tree Fence Rail=
Willow Tree Leaves=Hojas de Arbol de Sauce
Willow Tree Planks=Madera de Arbol de Sauce
Willow Tree Planks Slab=
Willow Tree Planks Stair=
Willow Tree Sapling=Retoño de Arbol de Sauce
Willow Tree Trunk=Tronco de Arbol de Sauce
Willow Tree Trunk Slab=
Willow Tree Trunk Stair=
Yellow=Amarilla

View File

@ -0,0 +1,211 @@
# textdomain: moretrees
# Translation by Yoan31 and Louis Royer
### cocos_palm.lua ###
Coconut=Noix de coco
Coconut Flower=Fleur de coco
### crafts.lua ###
Acorn Muffin=Muffins au gland
Acorn Muffin batter=Pate à muffins au Gland
Coconut Milk=Lait de coco
Date=Datte
Date & nut snack=Collation aux dattes et aux noix
Date-nut cake=Gâteau datte-noix
Date-nut cake batter=Pâte à gâteau datte-noix
Date-nut energy bar=Barre énergétique datte-noix
Raw Coconut=Noix de coco crue
Roasted Cedar Cone Nuts=Noix de pomme de pin roties
Roasted Fir Cone Nuts=Noix de cône de sapin roties
Roasted Spruce Cone Nuts=Noix de cône de sapin roties
### date_palm.lua ###
Date Flowers=Fleurs de datte
Date Stem=Tige de datte
Dates=Dattes
### node_defs.lua ###
@1 (fast growth)=@1 (croissance rapide)
Acorn=Gland
Apple Tree=Pommier
Apple Tree Fence=Barrière en bois de pommier
Apple Tree Fence Gate=Porte de clôture en bois de pommier
Apple Tree Fence Rail=Clôture en bois de pommier
Apple Tree Leaves=Feuilles de pommier
Apple Tree Planks=Planches de pommier
Apple Tree Planks Slab=Dalle en bois de pommier
Apple Tree Planks Stair=Escaliers en bois de pommier
Apple Tree Sapling=Pousse d'arbre de pommier
Apple Tree Trunk=Tronc d'arbre de pommier
Apple Tree Trunk Slab=Dalle en tronc de pommier
Apple Tree Trunk Stair=Escalier en tronc de pommier
Beech Tree=Hêtre
Beech Tree Fence=Barrière en bois de hêtre
Beech Tree Fence Gate=Porte de clôture en bois de hêtre
Beech Tree Fence Rail=Clôture en bois de hêtre
Beech Tree Leaves=Feuilles de hêtre
Beech Tree Planks=Planches de hêtre
Beech Tree Planks Slab=Dalle en bois de hêtre
Beech Tree Planks Stair=Escalier en bois de hêtre
Beech Tree Sapling=Pousse d'arbre de hêtre
Beech Tree Trunk=Tronc d'arbre de hêtre
Beech Tree Trunk Slab=Dalle en tronc de hêtre
Beech Tree Trunk Stair=Escalier en tronc de hêtre
Birch Tree=Bouleau
Birch Tree Fence=Barrière en bois de bouleau
Birch Tree Fence Gate=Porte de clôture en bois de bouleau
Birch Tree Fence Rail=Clôture en bois de bouleau
Birch Tree Leaves=Feuilles de bouleau
Birch Tree Planks=Planches d'arbre de bouleau
Birch Tree Planks Slab=Dalle en bois de bouleau
Birch Tree Planks Stair=Escalier en bois de bouleau
Birch Tree Sapling=Pousse d'arbre de bouleau
Birch Tree Trunk=Tronc d'arbre de bouleau
Birch Tree Trunk Slab=Dalle en tronc de bouleau
Birch Tree Trunk Stair=Escalier en tronc de bouleau
Cedar Cone=Pomme de pin
Cedar Tree=Pin
Cedar Tree Fence=Barrière en bois de pin
Cedar Tree Fence Gate=Porte de clôture en bois de pin
Cedar Tree Fence Rail=Clôture en bois de pin
Cedar Tree Leaves=Feuilles de pin
Cedar Tree Planks=Planches d'arbre de pin
Cedar Tree Planks Slab=Dalle en bois de pin
Cedar Tree Planks Stair=Escalier en bois de pin
Cedar Tree Sapling=Pousse d'arbre de pin
Cedar Tree Trunk=Tronc d'arbre de pin
Cedar Tree Trunk Slab=Dalle en tronc de pin
Cedar Tree Trunk Stair=Escalier en tronc de pin
Date Palm Tree=Dattier
Date Palm Tree Fence=Barrière en bois de dattier
Date Palm Tree Fence Gate=Porte de clôture en bois de dattier
Date Palm Tree Fence Rail=Clôture en bois de dattier
Date Palm Tree Leaves=Feuille de dattier
Date Palm Tree Planks=Planches de dattier
Date Palm Tree Planks Slab=Dalle en bois de dattier
Date Palm Tree Planks Stair=Escalier en bois de dattier
Date Palm Tree Sapling=Pousse de dattier
Date Palm Tree Trunk=Tronc de dattier
Date Palm Tree Trunk Slab=Dalle en tronc de dattier
Date Palm Tree Trunk Stair=Escalier en tronc de dattier
Douglas Fir=Sapin de Douglas
Douglas Fir Fence=Barrière en bois de sapin de Douglas
Douglas Fir Fence Gate=Porte de clôture en bois de sapin de Douglas
Douglas Fir Fence Rail=Clôture en bois de sapin de Douglas
Douglas Fir Leaves=Feuilles de sapin de Douglas
Douglas Fir Leaves (Bright)=Feuille de sapin de Douglas (brillant)
Douglas Fir Planks=Planches de sapin de Douglas
Douglas Fir Planks Slab=Dalle en bois de sapin de Douglas
Douglas Fir Planks Stair=Escalier en bois de sapin de Douglas
Douglas Fir Sapling=Pousse de sapin de Douglas
Douglas Fir Trunk=Tronc de sapin de Douglas
Douglas Fir Trunk Slab=Dalle en tronc de sapin de Douglas
Douglas Fir Trunk Stair=Escalier en tronc de sapin de Douglas
Fir Cone=Pomme de sapin
Giant Sequoia=Séquoia géant
Giant Sequoia Fence=Barrière en bois de séquoia géant
Giant Sequoia Fence Gate=Porte de clôture en bois de séquoia géant
Giant Sequoia Fence Rail=Clôture en bois de séquoia géant
Giant Sequoia Leaves=Feuilles de séquoia géant
Giant Sequoia Planks=Planches de séquoia géant
Giant Sequoia Planks Slab=Dalle en bois de séquoia géant
Giant Sequoia Planks Stair=Escalier en bois de séquoia géant
Giant Sequoia Sapling=Pousse de séquoia géant
Giant Sequoia Trunk=Tronc de séquoia géant
Giant Sequoia Trunk Slab=Dalle en tronc de séquoia géant
Giant Sequoia Trunk Stair=Escalier en tronc de séquoia géant
Jungle Tree=Arbre de la jungle
Jungle Tree Fence=Barrière en bois d'arbre de la jungle
Jungle Tree Fence Gate=Porte de clôture en bois d'arbre de la jungle
Jungle Tree Fence Rail=Clôture en bois d'arbre de la jungle
Jungle Tree Leaves=Feuilles d'arbre de la jungle
Jungle Tree Leaves (@1)=Feuilles d'arbre de la jungle (@1)
Jungle Tree Planks=Planches d'arbre de la jungle
Jungle Tree Planks Slab=Dalle en bois d'arbre de la jungle
Jungle Tree Planks Stair=Escalier en bois d'arbre de la jungle
Jungle Tree Sapling=Pousse d'arbre de la jungle
Jungle Tree Trunk=Tronc d'arbre de la jungle
Jungle Tree Trunk Slab=Dalle en tronc d'arbre de la jungle
Jungle Tree Trunk Stair=Escalier en tronc d'arbre de la jungle
Oak Tree=Chêne
Oak Tree Fence=Barrière en bois de chêne
Oak Tree Fence Gate=Porte de clôture en bois de chêne
Oak Tree Fence Rail=Clôture en bois de chêne
Oak Tree Leaves=Feuilles de chêne
Oak Tree Planks=Planches de chêne
Oak Tree Planks Slab=Dalle en bois de chêne
Oak Tree Planks Stair=Escalier en bois de chêne
Oak Tree Sapling=Pousse d'arbre de chêne
Oak Tree Trunk=Tronc d'arbre de chêne
Oak Tree Trunk Slab=Dalle en tronc de chêne
Oak Tree Trunk Stair=Escalier en tronc de chêne
Palm Tree=Palmier
Palm Tree Fence=Barrière en bois de palmier
Palm Tree Fence Gate=Porte de clôture en bois de palmier
Palm Tree Fence Rail=Clôture en bois de palmier
Palm Tree Leaves=Feuilles de palmier
Palm Tree Planks=Planches de palmier
Palm Tree Planks Slab=Dalle en bois de palmier
Palm Tree Planks Stair=Escalier en bois de palmier
Palm Tree Sapling=Pousse d'arbre de palmier
Palm Tree Trunk=Tronc d'arbre de palmier
Palm Tree Trunk Slab=Dalle en tronc de palmier
Palm Tree Trunk Stair=Escalier en tronc de palmier
Poplar Tree=Peuplier
Poplar Tree Fence=Barrière en bois de peuplier
Poplar Tree Fence Gate=Porte de clôture en bois de peuplier
Poplar Tree Fence Rail=Clôture en bois de peuplier
Poplar Tree Leaves=Feuilles de peuplier
Poplar Tree Planks=Plances de peuplier
Poplar Tree Planks Slab=Dalle en bois de peuplier
Poplar Tree Planks Stair=Escalier en bois de peuplier
Poplar Tree Sapling=Pousse de peuplier
Poplar Tree Trunk=Tronc de peuplier
Poplar Tree Trunk Slab=Dalle en tronc de peuplier
Poplar Tree Trunk Stair=Escalier en tronc de peuplier
Red=rouge
Rubber Tree=Arbre à caoutchouc
Rubber Tree Fence=Barrière en bois d'arbre à caoutchouc
Rubber Tree Fence Gate=Porte de clôture en bois d'arbre à caoutchouc
Rubber Tree Fence Rail=Clôture en bois d'arbre à caoutchouc
Rubber Tree Leaves=Feuilles d'arbre à caoutchouc
Rubber Tree Planks=Planches d'arbre à caoutchouc
Rubber Tree Planks Slab=Dalle en bois d'arbre à caoutchouc
Rubber Tree Planks Stair=Escalier en bois d'arbre à caoutchouc
Rubber Tree Sapling=Pousse d'arbre à caoutchouc
Rubber Tree Trunk=Tronc d'arbre a caoutchouc
Rubber Tree Trunk (Empty)=Tronc d'arbre à caoutchouc (vide)
Rubber Tree Trunk Slab=Dalle en tronc d'arbre à caoutchouc
Rubber Tree Trunk Stair=Escalier en tronc d'arbre à caoutchouc
Small poplar Tree Sapling=Pousse de petit peuplier
Spruce Cone=Cône de sapin
Spruce Tree=Épicéa
Spruce Tree Fence=Barrière en bois d'épicéa
Spruce Tree Fence Gate=Porte de clôture en bois d'épicéa
Spruce Tree Fence Rail=Clôture en bois d'épicéa
Spruce Tree Leaves=Feuilles d'épicéa
Spruce Tree Planks=Planches d'arbre d'épicéa
Spruce Tree Planks Slab=Dalle en bois d'épicéa
Spruce Tree Planks Stair=Escalier en bois d'épicéa
Spruce Tree Sapling=Pousse d'arbre d'épicéa
Spruce Tree Trunk=Tronc d'arbre d'épicéa
Spruce Tree Trunk Slab=Dalle en tronc d'épicéa
Spruce Tree Trunk Stair=Escalier en tronc d'épicéa
Willow Tree=Saule
Willow Tree Fence=Barrière en bois de saule
Willow Tree Fence Gate=Porte de clôture en bois de saule
Willow Tree Fence Rail=Clôture en bois de saule
Willow Tree Leaves=Feuilles de saule
Willow Tree Planks=Planches de saule
Willow Tree Planks Slab=Dalle en bois de saule
Willow Tree Planks Stair=Escalier en bois de saule
Willow Tree Sapling=Pousse de saule
Willow Tree Trunk=Tronc d'arbre de saule
Willow Tree Trunk Slab=Dalle en tronc de saule
Willow Tree Trunk Stair=Escalier en tronc de saule
Yellow=jaune

View File

@ -1,73 +1,210 @@
# Template
# textdomain: moretrees
### cocos_palm.lua ###
Coconut=
Coconut Flower=
### crafts.lua ###
Coconut Milk =
Raw Coconut =
Acorn Muffin batter =
Acorn Muffin =
Roasted Spruce Cone Nuts =
Roasted Pine Cone Nuts =
Roasted Fir Cone Nuts =
Acorn Muffin=
Acorn Muffin batter=
Coconut Milk=
Date=
Date & nut snack=
Date-nut cake=
Date-nut cake batter=
Date-nut energy bar=
Raw Coconut=
Roasted Cedar Cone Nuts=
Roasted Fir Cone Nuts=
Roasted Spruce Cone Nuts=
### date_palm.lua ###
Date Flowers=
Date Stem=
Dates=
### node_defs.lua ###
Beech Tree Trunk =
Apple Tree Trunk =
Oak Tree Trunk =
Giant Sequoia Trunk =
Birch Tree Trunk =
Palm Tree Trunk =
Spruce Tree Trunk =
Pine Tree Trunk =
Willow Tree Trunk =
Rubber Tree Trunk =
Jungle Tree Trunk =
Douglas Fir Trunk =
Beech Tree Planks =
Apple Tree Planks =
Oak Tree Planks =
Giant Sequoia Planks =
Birch Tree Planks =
Palm Tree Planks =
Spruce Tree Planks =
Pine Tree Planks =
Willow Tree Planks =
Rubber Tree Planks =
Jungle Tree Planks =
Douglas Fir Planks =
Beech Tree Sapling =
Apple Tree Sapling =
Oak Tree Sapling =
Giant Sequoia Sapling =
Birch Tree Sapling =
Palm Tree Sapling =
Spruce Tree Sapling =
Pine Tree Sapling =
Willow Tree Sapling =
Rubber Tree Sapling =
Jungle Tree Sapling =
Douglas Fir Sapling =
Beech Tree Leaves =
Apple Tree Leaves =
Oak Tree Leaves =
Giant Sequoia Leaves =
Birch Tree Leaves =
Palm Tree Leaves =
Spruce Tree Leaves =
Pine Tree Leaves =
Willow Tree Leaves =
Rubber Tree Leaves =
Jungle Tree Leaves =
Douglas Fir Leaves =
Acorn =
Coconut =
Spruce Cone =
Pine Cone =
Fir Cone =
Jungle Sapling =
Jungle Tree Leaves (Yellow) =
Jungle Tree Leaves (Red) =
Douglas Fir Leaves (Bright) =
Rubber Tree Trunk (Empty) =
[Moretrees] Loaded (2013-02-11) =
@1 (fast growth)=
Acorn=
Apple Tree=
Apple Tree Fence=
Apple Tree Fence Gate=
Apple Tree Fence Rail=
Apple Tree Leaves=
Apple Tree Planks=
Apple Tree Planks Slab=
Apple Tree Planks Stair=
Apple Tree Sapling=
Apple Tree Trunk=
Apple Tree Trunk Slab=
Apple Tree Trunk Stair=
Beech Tree=
Beech Tree Fence=
Beech Tree Fence Gate=
Beech Tree Fence Rail=
Beech Tree Leaves=
Beech Tree Planks=
Beech Tree Planks Slab=
Beech Tree Planks Stair=
Beech Tree Sapling=
Beech Tree Trunk=
Beech Tree Trunk Slab=
Beech Tree Trunk Stair=
Birch Tree=
Birch Tree Fence=
Birch Tree Fence Gate=
Birch Tree Fence Rail=
Birch Tree Leaves=
Birch Tree Planks=
Birch Tree Planks Slab=
Birch Tree Planks Stair=
Birch Tree Sapling=
Birch Tree Trunk=
Birch Tree Trunk Slab=
Birch Tree Trunk Stair=
Cedar Cone=
Cedar Tree=
Cedar Tree Fence=
Cedar Tree Fence Gate=
Cedar Tree Fence Rail=
Cedar Tree Leaves=
Cedar Tree Planks=
Cedar Tree Planks Slab=
Cedar Tree Planks Stair=
Cedar Tree Sapling=
Cedar Tree Trunk=
Cedar Tree Trunk Slab=
Cedar Tree Trunk Stair=
Date Palm Tree=
Date Palm Tree Fence=
Date Palm Tree Fence Gate=
Date Palm Tree Fence Rail=
Date Palm Tree Leaves=
Date Palm Tree Planks=
Date Palm Tree Planks Slab=
Date Palm Tree Planks Stair=
Date Palm Tree Sapling=
Date Palm Tree Trunk=
Date Palm Tree Trunk Slab=
Date Palm Tree Trunk Stair=
Douglas Fir=
Douglas Fir Fence=
Douglas Fir Fence Gate=
Douglas Fir Fence Rail=
Douglas Fir Leaves=
Douglas Fir Leaves (Bright)=
Douglas Fir Planks=
Douglas Fir Planks Slab=
Douglas Fir Planks Stair=
Douglas Fir Sapling=
Douglas Fir Trunk=
Douglas Fir Trunk Slab=
Douglas Fir Trunk Stair=
Fir Cone=
Giant Sequoia=
Giant Sequoia Fence=
Giant Sequoia Fence Gate=
Giant Sequoia Fence Rail=
Giant Sequoia Leaves=
Giant Sequoia Planks=
Giant Sequoia Planks Slab=
Giant Sequoia Planks Stair=
Giant Sequoia Sapling=
Giant Sequoia Trunk=
Giant Sequoia Trunk Slab=
Giant Sequoia Trunk Stair=
Jungle Tree=
Jungle Tree Fence=
Jungle Tree Fence Gate=
Jungle Tree Fence Rail=
Jungle Tree Leaves=
Jungle Tree Leaves (@1)=
Jungle Tree Planks=
Jungle Tree Planks Slab=
Jungle Tree Planks Stair=
Jungle Tree Sapling=
Jungle Tree Trunk=
Jungle Tree Trunk Slab=
Jungle Tree Trunk Stair=
Oak Tree=
Oak Tree Fence=
Oak Tree Fence Gate=
Oak Tree Fence Rail=
Oak Tree Leaves=
Oak Tree Planks=
Oak Tree Planks Slab=
Oak Tree Planks Stair=
Oak Tree Sapling=
Oak Tree Trunk=
Oak Tree Trunk Slab=
Oak Tree Trunk Stair=
Palm Tree=
Palm Tree Fence=
Palm Tree Fence Gate=
Palm Tree Fence Rail=
Palm Tree Leaves=
Palm Tree Planks=
Palm Tree Planks Slab=
Palm Tree Planks Stair=
Palm Tree Sapling=
Palm Tree Trunk=
Palm Tree Trunk Slab=
Palm Tree Trunk Stair=
Poplar Tree=
Poplar Tree Fence=
Poplar Tree Fence Gate=
Poplar Tree Fence Rail=
Poplar Tree Leaves=
Poplar Tree Planks=
Poplar Tree Planks Slab=
Poplar Tree Planks Stair=
Poplar Tree Sapling=
Poplar Tree Trunk=
Poplar Tree Trunk Slab=
Poplar Tree Trunk Stair=
Red=
Rubber Tree=
Rubber Tree Fence=
Rubber Tree Fence Gate=
Rubber Tree Fence Rail=
Rubber Tree Leaves=
Rubber Tree Planks=
Rubber Tree Planks Slab=
Rubber Tree Planks Stair=
Rubber Tree Sapling=
Rubber Tree Trunk=
Rubber Tree Trunk (Empty)=
Rubber Tree Trunk Slab=
Rubber Tree Trunk Stair=
Small poplar Tree Sapling=
Spruce Cone=
Spruce Tree=
Spruce Tree Fence=
Spruce Tree Fence Gate=
Spruce Tree Fence Rail=
Spruce Tree Leaves=
Spruce Tree Planks=
Spruce Tree Planks Slab=
Spruce Tree Planks Stair=
Spruce Tree Sapling=
Spruce Tree Trunk=
Spruce Tree Trunk Slab=
Spruce Tree Trunk Stair=
Willow Tree=
Willow Tree Fence=
Willow Tree Fence Gate=
Willow Tree Fence Rail=
Willow Tree Leaves=
Willow Tree Planks=
Willow Tree Planks Slab=
Willow Tree Planks Stair=
Willow Tree Sapling=
Willow Tree Trunk=
Willow Tree Trunk Slab=
Willow Tree Trunk Stair=
Yellow=

View File

@ -1 +1,4 @@
name = moretrees
depends = default, biome_lib, vessels
optional_depends = doors, stairs, moreblocks, farming
min_minetest_version = 5.2.0

View File

@ -1,28 +1,217 @@
local S = moretrees.intllib
local S = minetest.get_translator("moretrees")
moretrees.avoidnodes = {}
moretrees.treelist = {
{"beech", "Beech Tree"},
{"apple_tree", "Apple Tree"},
{"oak", "Oak Tree", "acorn", "Acorn", {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 0.8 },
{"sequoia", "Giant Sequoia"},
{"birch", "Birch Tree"},
{"palm", "Palm Tree", "palm_fruit_trunk_gen", "Palm Tree", {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 1.0 },
{"date_palm", "Date Palm Tree", "date_palm_fruit_trunk", "Date Palm Tree", {0, 0, 0, 0, 0, 0}, 0.0 },
{"spruce", "Spruce Tree", "spruce_cone", "Spruce Cone", {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 0.8 },
{"cedar", "Cedar Tree", "cedar_cone", "Cedar Cone", {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 0.8 },
{"poplar", "Poplar Tree"},
{"poplar_small", "Poplar Tree"},
{"willow", "Willow Tree"},
{"rubber_tree", "Rubber Tree"},
{"fir", "Douglas Fir", "fir_cone", "Fir Cone", {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 0.8 },
{"jungletree", "Jungle Tree", nil, nil, nil, nil, "default_junglesapling.png" },
{"beech", S("Beech Tree")},
{"apple_tree", S("Apple Tree")},
{"oak", S("Oak Tree"), "acorn", S("Acorn"), {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 0.8 },
{"sequoia", S("Giant Sequoia")},
{"birch", S("Birch Tree")},
{"palm", S("Palm Tree"), "palm_fruit_trunk_gen", S("Palm Tree"), {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 1.0 },
{"date_palm", S("Date Palm Tree"), "date_palm_fruit_trunk", S("Date Palm Tree"), {0, 0, 0, 0, 0, 0}, 0.0 },
{"spruce", S("Spruce Tree"), "spruce_cone", S("Spruce Cone"), {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 0.8 },
{"cedar", S("Cedar Tree"), "cedar_cone", S("Cedar Cone"), {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 0.8 },
{"poplar", S("Poplar Tree")},
{"poplar_small", S("Poplar Tree")},
{"willow", S("Willow Tree")},
{"rubber_tree", S("Rubber Tree")},
{"fir", S("Douglas Fir"), "fir_cone", S("Fir Cone"), {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 0.8 },
{"jungletree", S("Jungle Tree"), nil, nil, nil, nil, "default_junglesapling.png" },
}
local dirs1 = { 21, 20, 23, 22, 21 }
moretrees.treedesc = {
beech = {
trunk = S("Beech Tree Trunk"),
planks = S("Beech Tree Planks"),
sapling = S("Beech Tree Sapling"),
leaves = S("Beech Tree Leaves"),
trunk_stair = S("Beech Tree Trunk Stair"),
trunk_slab = S("Beech Tree Trunk Slab"),
planks_stair = S("Beech Tree Planks Stair"),
planks_slab = S("Beech Tree Planks Slab"),
fence = S("Beech Tree Fence"),
fence_rail = S("Beech Tree Fence Rail"),
fence_gate = S("Beech Tree Fence Gate"),
},
apple_tree = {
trunk = S("Apple Tree Trunk"),
planks = S("Apple Tree Planks"),
sapling = S("Apple Tree Sapling"),
leaves = S("Apple Tree Leaves"),
trunk_stair = S("Apple Tree Trunk Stair"),
trunk_slab = S("Apple Tree Trunk Slab"),
planks_stair = S("Apple Tree Planks Stair"),
planks_slab = S("Apple Tree Planks Slab"),
fence = S("Apple Tree Fence"),
fence_rail = S("Apple Tree Fence Rail"),
fence_gate = S("Apple Tree Fence Gate"),
},
oak = {
trunk = S("Oak Tree Trunk"),
planks = S("Oak Tree Planks"),
sapling = S("Oak Tree Sapling"),
leaves = S("Oak Tree Leaves"),
trunk_stair = S("Oak Tree Trunk Stair"),
trunk_slab = S("Oak Tree Trunk Slab"),
planks_stair = S("Oak Tree Planks Stair"),
planks_slab = S("Oak Tree Planks Slab"),
fence = S("Oak Tree Fence"),
fence_rail = S("Oak Tree Fence Rail"),
fence_gate = S("Oak Tree Fence Gate"),
},
sequoia = {
trunk = S("Giant Sequoia Trunk"),
planks = S("Giant Sequoia Planks"),
sapling = S("Giant Sequoia Sapling"),
leaves = S("Giant Sequoia Leaves"),
trunk_stair = S("Giant Sequoia Trunk Stair"),
trunk_slab = S("Giant Sequoia Trunk Slab"),
planks_stair = S("Giant Sequoia Planks Stair"),
planks_slab = S("Giant Sequoia Planks Slab"),
fence = S("Giant Sequoia Fence"),
fence_rail = S("Giant Sequoia Fence Rail"),
fence_gate = S("Giant Sequoia Fence Gate"),
},
birch = {
trunk = S("Birch Tree Trunk"),
planks = S("Birch Tree Planks"),
sapling = S("Birch Tree Sapling"),
leaves = S("Birch Tree Leaves"),
trunk_stair = S("Birch Tree Trunk Stair"),
trunk_slab = S("Birch Tree Trunk Slab"),
planks_stair = S("Birch Tree Planks Stair"),
planks_slab = S("Birch Tree Planks Slab"),
fence = S("Birch Tree Fence"),
fence_rail = S("Birch Tree Fence Rail"),
fence_gate = S("Birch Tree Fence Gate"),
},
palm = {
trunk = S("Palm Tree Trunk"),
planks = S("Palm Tree Planks"),
sapling = S("Palm Tree Sapling"),
leaves = S("Palm Tree Leaves"),
trunk_stair = S("Palm Tree Trunk Stair"),
trunk_slab = S("Palm Tree Trunk Slab"),
planks_stair = S("Palm Tree Planks Stair"),
planks_slab = S("Palm Tree Planks Slab"),
fence = S("Palm Tree Fence"),
fence_rail = S("Palm Tree Fence Rail"),
fence_gate = S("Palm Tree Fence Gate"),
},
date_palm = {
trunk = S("Date Palm Tree Trunk"),
planks = S("Date Palm Tree Planks"),
sapling = S("Date Palm Tree Sapling"),
leaves = S("Date Palm Tree Leaves"),
trunk_stair = S("Date Palm Tree Trunk Stair"),
trunk_slab = S("Date Palm Tree Trunk Slab"),
planks_stair = S("Date Palm Tree Planks Stair"),
planks_slab = S("Date Palm Tree Planks Slab"),
fence = S("Date Palm Tree Fence"),
fence_rail = S("Date Palm Tree Fence Rail"),
fence_gate = S("Date Palm Tree Fence Gate"),
},
spruce = {
trunk = S("Spruce Tree Trunk"),
planks = S("Spruce Tree Planks"),
sapling = S("Spruce Tree Sapling"),
leaves = S("Spruce Tree Leaves"),
trunk_stair = S("Spruce Tree Trunk Stair"),
trunk_slab = S("Spruce Tree Trunk Slab"),
planks_stair = S("Spruce Tree Planks Stair"),
planks_slab = S("Spruce Tree Planks Slab"),
fence = S("Spruce Tree Fence"),
fence_rail = S("Spruce Tree Fence Rail"),
fence_gate = S("Spruce Tree Fence Gate"),
},
cedar = {
trunk = S("Cedar Tree Trunk"),
planks = S("Cedar Tree Planks"),
sapling = S("Cedar Tree Sapling"),
leaves = S("Cedar Tree Leaves"),
trunk_stair = S("Cedar Tree Trunk Stair"),
trunk_slab = S("Cedar Tree Trunk Slab"),
planks_stair = S("Cedar Tree Planks Stair"),
planks_slab = S("Cedar Tree Planks Slab"),
fence = S("Cedar Tree Fence"),
fence_rail = S("Cedar Tree Fence Rail"),
fence_gate = S("Cedar Tree Fence Gate"),
},
poplar = {
trunk = S("Poplar Tree Trunk"),
planks = S("Poplar Tree Planks"),
sapling = S("Poplar Tree Sapling"),
leaves = S("Poplar Tree Leaves"),
trunk_stair = S("Poplar Tree Trunk Stair"),
trunk_slab = S("Poplar Tree Trunk Slab"),
planks_stair = S("Poplar Tree Planks Stair"),
planks_slab = S("Poplar Tree Planks Slab"),
fence = S("Poplar Tree Fence"),
fence_rail = S("Poplar Tree Fence Rail"),
fence_gate = S("Poplar Tree Fence Gate"),
},
poplar_small = {
sapling = S("Small poplar Tree Sapling"),
},
willow = {
trunk = S("Willow Tree Trunk"),
planks = S("Willow Tree Planks"),
sapling = S("Willow Tree Sapling"),
leaves = S("Willow Tree Leaves"),
trunk_stair = S("Willow Tree Trunk Stair"),
trunk_slab = S("Willow Tree Trunk Slab"),
planks_stair = S("Willow Tree Planks Stair"),
planks_slab = S("Willow Tree Planks Slab"),
fence = S("Willow Tree Fence"),
fence_rail = S("Willow Tree Fence Rail"),
fence_gate = S("Willow Tree Fence Gate"),
},
rubber_tree = {
trunk = S("Rubber Tree Trunk"),
planks = S("Rubber Tree Planks"),
sapling = S("Rubber Tree Sapling"),
leaves = S("Rubber Tree Leaves"),
trunk_stair = S("Rubber Tree Trunk Stair"),
trunk_slab = S("Rubber Tree Trunk Slab"),
planks_stair = S("Rubber Tree Planks Stair"),
planks_slab = S("Rubber Tree Planks Slab"),
fence = S("Rubber Tree Fence"),
fence_rail = S("Rubber Tree Fence Rail"),
fence_gate = S("Rubber Tree Fence Gate"),
},
fir = {
trunk = S("Douglas Fir Trunk"),
planks = S("Douglas Fir Planks"),
sapling = S("Douglas Fir Sapling"),
leaves = S("Douglas Fir Leaves"),
trunk_stair = S("Douglas Fir Trunk Stair"),
trunk_slab = S("Douglas Fir Trunk Slab"),
planks_stair = S("Douglas Fir Planks Stair"),
planks_slab = S("Douglas Fir Planks Slab"),
fence = S("Douglas Fir Fence"),
fence_rail = S("Douglas Fir Fence Rail"),
fence_gate = S("Douglas Fir Fence Gate"),
},
jungletree = {
trunk = S("Jungle Tree Trunk"),
planks = S("Jungle Tree Planks"),
sapling = S("Jungle Tree Sapling"),
leaves = S("Jungle Tree Leaves"),
trunk_stair = S("Jungle Tree Trunk Stair"),
trunk_slab = S("Jungle Tree Trunk Slab"),
planks_stair = S("Jungle Tree Planks Stair"),
planks_slab = S("Jungle Tree Planks Slab"),
fence = S("Jungle Tree Fence"),
fence_rail = S("Jungle Tree Fence Rail"),
fence_gate = S("Jungle Tree Fence Gate"),
},
}
-- local dirs1 = { 21, 20, 23, 22, 21 }
local dirs2 = { 12, 9, 18, 7, 12 }
local dirs3 = { 14, 11, 16, 5, 14 }
-- local dirs3 = { 14, 11, 16, 5, 14 }
local moretrees_new_leaves_drawtype = "allfaces_optional"
local moretrees_plantlike_leaves_visual_scale = 1
@ -54,7 +243,6 @@ end
for i in ipairs(moretrees.treelist) do
local treename = moretrees.treelist[i][1]
local treedesc = moretrees.treelist[i][2]
local fruit = moretrees.treelist[i][3]
local fruitdesc = moretrees.treelist[i][4]
local selbox = moretrees.treelist[i][5]
@ -83,7 +271,7 @@ for i in ipairs(moretrees.treelist) do
saptex = "moretrees_"..treename.."_sapling.png"
minetest.register_node("moretrees:"..treename.."_trunk", {
description = S(treedesc.." Trunk"),
description = moretrees.treedesc[treename].trunk,
tiles = {
"moretrees_"..treename.."_trunk_top.png",
"moretrees_"..treename.."_trunk_top.png",
@ -97,7 +285,7 @@ for i in ipairs(moretrees.treelist) do
})
minetest.register_node("moretrees:"..treename.."_planks", {
description = S(treedesc.." Planks"),
description = moretrees.treedesc[treename].planks,
tiles = {"moretrees_"..treename.."_wood.png"},
is_ground_content = false,
groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1},
@ -105,7 +293,7 @@ for i in ipairs(moretrees.treelist) do
})
minetest.register_node("moretrees:"..treename.."_sapling", {
description = S(treedesc.." Sapling"),
description = moretrees.treedesc[treename].sapling,
drawtype = "plantlike",
tiles = {saptex},
inventory_image = saptex,
@ -119,6 +307,18 @@ for i in ipairs(moretrees.treelist) do
},
groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,sapling=1},
sounds = default.node_sound_defaults(),
on_place = function(itemstack, placer, pointed_thing)
itemstack = default.sapling_on_place(itemstack, placer, pointed_thing,
"moretrees:" ..treename.. "_sapling",
-- minp, maxp to be checked, relative to sapling pos
-- minp_relative.y = 1 because sapling pos has been checked
{x = -3, y = 1, z = -3},
{x = 3, y = 6, z = 3},
-- maximum interval of interior volume check
4)
return itemstack
end,
})
local moretrees_leaves_inventory_image = nil
@ -131,7 +331,7 @@ for i in ipairs(moretrees.treelist) do
end
minetest.register_node("moretrees:"..treename.."_leaves", {
description = S(treedesc.." Leaves"),
description = moretrees.treedesc[treename].leaves,
drawtype = moretrees_new_leaves_drawtype,
waving = moretrees_new_leaves_waving,
visual_scale = moretrees_plantlike_leaves_visual_scale,
@ -167,7 +367,7 @@ for i in ipairs(moretrees.treelist) do
"moretrees_"..treename.."_trunk_top.png",
"moretrees_"..treename.."_trunk.png"
},
description = S(treedesc.." Trunk"),
description = moretrees.treedesc[treename].trunk,
drop = treename.."_trunk",
}
)
@ -179,7 +379,7 @@ for i in ipairs(moretrees.treelist) do
{
groups = { snappy=1, choppy=2, oddly_breakable_by_hand=2, flammable=3, not_in_creative_inventory=1 },
tiles = { "moretrees_"..treename.."_wood.png" },
description = S(treedesc.." Planks"),
description = moretrees.treedesc[treename].planks,
drop = treename.."_planks",
}
)
@ -192,8 +392,8 @@ for i in ipairs(moretrees.treelist) do
"moretrees_"..treename.."_trunk_top.png",
"moretrees_"..treename.."_trunk.png"
},
S(treedesc.." Trunk Stair"),
S(treedesc.." Trunk Slab"),
moretrees.treedesc[treename].trunk_stair,
moretrees.treedesc[treename].trunk_slab,
default.node_sound_wood_defaults()
)
@ -202,8 +402,8 @@ for i in ipairs(moretrees.treelist) do
"moretrees:"..treename.."_planks",
{ snappy=1, choppy=2, oddly_breakable_by_hand=2, flammable=3 },
{ "moretrees_"..treename.."_wood.png" },
S(treedesc.." Planks Stair"),
S(treedesc.." Planks Slab"),
moretrees.treedesc[treename].planks_stair,
moretrees.treedesc[treename].planks_slab,
default.node_sound_wood_defaults()
)
@ -214,7 +414,7 @@ for i in ipairs(moretrees.treelist) do
local planks_name = "moretrees:" .. treename .. "_planks"
local planks_tile = "moretrees_" .. treename .. "_wood.png"
default.register_fence("moretrees:" .. treename .. "_fence", {
description = S(treedesc.." Fence"),
description = moretrees.treedesc[treename].fence,
texture = planks_tile,
inventory_image = "default_fence_overlay.png^" .. planks_tile ..
"^default_fence_overlay.png^[makealpha:255,126,126",
@ -225,7 +425,7 @@ for i in ipairs(moretrees.treelist) do
sounds = default.node_sound_wood_defaults()
})
default.register_fence_rail("moretrees:" .. treename .. "_fence_rail", {
description = S(treedesc.." Fence Rail"),
description = moretrees.treedesc[treename].fence_rail,
texture = planks_tile,
inventory_image = "default_fence_rail_overlay.png^" .. planks_tile ..
"^default_fence_rail_overlay.png^[makealpha:255,126,126",
@ -237,7 +437,7 @@ for i in ipairs(moretrees.treelist) do
})
if minetest.global_exists("doors") then
doors.register_fencegate("moretrees:" .. treename .. "_gate", {
description = S(treedesc .. " Fence Gate"),
description = moretrees.treedesc[treename].fence_gate,
texture = planks_tile,
material = planks_name,
groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}
@ -247,7 +447,7 @@ for i in ipairs(moretrees.treelist) do
end
minetest.register_node("moretrees:"..treename.."_sapling_ongen", {
description = S(treedesc.." Sapling (fast growth)"),
description = S("@1 (fast growth)", moretrees.treedesc[treename].sapling),
drawtype = "plantlike",
tiles = {saptex},
inventory_image = saptex,
@ -261,14 +461,26 @@ for i in ipairs(moretrees.treelist) do
},
groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,sapling=1},
sounds = default.node_sound_defaults(),
drop = "moretrees:"..treename.."_sapling"
drop = "moretrees:"..treename.."_sapling",
on_place = function(itemstack, placer, pointed_thing)
itemstack = default.sapling_on_place(itemstack, placer, pointed_thing,
"moretrees:" ..treename.. "_sapling_ongen",
-- minp, maxp to be checked, relative to sapling pos
-- minp_relative.y = 1 because sapling pos has been checked
{x = -3, y = 1, z = -3},
{x = 3, y = 6, z = 3},
-- maximum interval of interior volume check
4)
return itemstack
end,
})
local fruitname = nil
if fruit then
fruitname = "moretrees:"..fruit
minetest.register_node(fruitname, {
description = S(fruitdesc),
description = fruitdesc,
drawtype = "plantlike",
tiles = { "moretrees_"..fruit..".png" },
inventory_image = "moretrees_"..fruit..".png^[transformR180",
@ -303,7 +515,7 @@ for i in ipairs(moretrees.treelist) do
chance = 1,
action = function(pos, node, active_object_count, active_object_count_wider)
local fdir = node.param2 or 0
nfdir = dirs2[fdir+1]
local nfdir = dirs2[fdir+1]
minetest.add_node(pos, {name = "moretrees:"..treename.."_trunk", param2 = nfdir})
end,
})
@ -358,7 +570,7 @@ minetest.override_item("moretrees:poplar_leaves", {
-- Extra nodes for jungle trees:
local jungleleaves = {"yellow","red"}
local jungleleavesnames = {"Yellow", "Red"}
local jungleleavesnames = {S("Yellow"), S("Red")}
for color = 1, #jungleleaves do
local leave_name = "moretrees:jungletree_leaves_"..jungleleaves[color]
@ -371,7 +583,7 @@ for color = 1, #jungleleaves do
end
minetest.register_node(leave_name, {
description = S("Jungle Tree Leaves ("..jungleleavesnames[color]..")"),
description = S("Jungle Tree Leaves (@1)", jungleleavesnames[color]),
drawtype = moretrees_new_leaves_drawtype,
waving = moretrees_new_leaves_waving,
visual_scale = moretrees_plantlike_leaves_visual_scale,
@ -466,7 +678,6 @@ minetest.register_node("moretrees:rubber_tree_trunk_empty", {
"moretrees_rubber_tree_trunk_top.png",
"moretrees_rubber_tree_trunk_empty.png"
},
is_ground_content = true,
groups = {tree=1,snappy=1,choppy=2,oddly_breakable_by_hand=1,flammable=2},
sounds = default.node_sound_wood_defaults(),
paramtype2 = "facedir",
@ -480,7 +691,7 @@ minetest.register_abm({
chance = 1,
action = function(pos, node, active_object_count, active_object_count_wider)
local fdir = node.param2 or 0
nfdir = dirs2[fdir+1]
local nfdir = dirs2[fdir+1]
minetest.add_node(pos, {name = "moretrees:rubber_tree_trunk_empty", param2 = nfdir})
end,
})

View File

@ -31,7 +31,7 @@ index 8189ffd..afd4644 100644
@@ -225,9 +225,12 @@ moretrees.ct_rules_b1 = "[-FBf][+FBf]"
moretrees.ct_rules_a2 = "FF[FF][&&-FBF][&&+FBF][&&---FBF][&&+++FBF]F/A"
moretrees.ct_rules_b2 = "[-fB][+fB]"
+local jleaves = 1
function moretrees.grow_jungletree(pos)
local r1 = math.random(2)
@ -40,11 +40,11 @@ index 8189ffd..afd4644 100644
+ jleaves = jleaves % 2 + 1
if r1 == 1 then
moretrees.jungletree_model.leaves2 = "moretrees:jungletree_leaves_red"
else
else
@@ -235,6 +238,7 @@ function moretrees.grow_jungletree(pos)
end
moretrees.jungletree_model.leaves2_chance = math.random(25, 75)
+ r2=3
if r2 == 1 then
moretrees.jungletree_model.trunk_type = "single"
@ -62,7 +62,7 @@ minetest.register_chatcommand("make-scene", {
minetest.place_node({x=780, y=30, z=-276}, {name="default:obsidian"})
for z = -360, -300 do
dy=2
local dy=2
for x = 630 + (-z - 360)/3, 660 + (-z - 300)/3 do
for y = 5, 22 do
minetest.place_node({x=x, y=y, z=z}, {name="default:desert_stone"})

View File

@ -49,7 +49,6 @@ moretrees.poplar_model={
rules_b="[[T]&&G++f++ff++ff++ff++f--]G",
rules_c="[[T]&&G++f++ff++ff++ff++f--G++[d]G[d]G++G[d]G[d]G[d]G++G[d]G[d]G[d]G++G[d]G[d]G[d]G++G[d]G]G",
rules_d="f",
trunk="air",
trunk="moretrees:poplar_trunk",
leaves="moretrees:poplar_leaves",
angle=45,

View File

@ -21,33 +21,74 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
voxeldungeon.armor = {} --global variable
local HITS_TO_KNOW = 15
function voxeldungeon.armor.getDefenseOf(armor)
function voxeldungeon.armor.getDefenseOf(armor, unIdentified)
local level = armor:get_meta():get_int("voxeldungeon:level")
if unIdentified then
level = 0
end
local def = armor:get_definition()
local tier = def._tier
return tier + tier * level
end
function voxeldungeon.armor.isLevelKnown(armor)
return armor:get_meta():get_int("voxeldungeon:levelKnown") >= HITS_TO_KNOW
end
function voxeldungeon.armor.isIdentified(armor)
return voxeldungeon.armor.isLevelKnown(armor)
end
function voxeldungeon.armor.identify(armor)
armor:get_meta():set_int("voxeldungeon:levelKnown", HITS_TO_KNOW)
voxeldungeon.armor.updateDescription(armor)
end
function voxeldungeon.armor.checkLevelKnown(armor, user)
local meta = armor:get_meta()
local levelKnown = meta:get_int("voxeldungeon:levelKnown")
if levelKnown < HITS_TO_KNOW then
levelKnown = levelKnown + 1
meta:set_int("voxeldungeon:levelKnown", levelKnown)
if levelKnown == HITS_TO_KNOW then
voxeldungeon.armor.updateDescription(armor)
voxeldungeon.glog.i("You are now familiar with your "..voxeldungeon.utils.itemShortDescription(armor)..".", user)
end
end
end
function voxeldungeon.armor.updateDescription(armor)
local meta = armor:get_meta()
local level = meta:get_int("voxeldungeon:level")
local levelKnown = voxeldungeon.armor.isLevelKnown(armor)
local def = armor:get_definition()
local tier = def._tier
local info = def._info
local defense = voxeldungeon.armor.getDefenseOf(armor)
local strreq = voxeldungeon.tools.getStrengthRequirementOf(armor)
local defense = voxeldungeon.armor.getDefenseOf(armor, not levelKnown)
local strreq = voxeldungeon.tools.getStrengthRequirementOf(armor, not levelKnown)
local statsDesc = "tier-"..tier.." armor blocks "..defense.." damage and requires "..strreq.." points of strength to wear properly."
if levelKnown then
statsDesc = "This "..statsDesc
else
statsDesc = "Typically, this "..statsDesc
end
local strTip = "\n \nBe careful about equipping armor without enough strength, your movement speed will decrease."
meta:set_string("description", voxeldungeon.utils.itemDescription(voxeldungeon.utils.itemShortDescription(armor).."\n \n"..info..
"\n \nThis tier-"..tier.." armor blocks "..defense.." damage and requires "..strreq..
" points of strength to wear properly."..strTip))
meta:set_string("description", voxeldungeon.utils.itemDescription(voxeldungeon.utils.itemShortDescription(armor).."\n \n"..info..
"\n \n"..statsDesc..strTip))
end
function voxeldungeon.armor.updateStrdiffArmor(player)

View File

@ -23,6 +23,7 @@ voxeldungeon.blobs = {}
voxeldungeon.blobs.registered_blobs = {}
local TIMESCALE = 1
local MAX_CYCLE_SIZE = 100
local function expandUpon(posses, spreadCondition)
local newposses = voxeldungeon.smartVectorTable()
@ -59,9 +60,8 @@ function voxeldungeon.blobs.register(name, def)
blob.posses.table = minetest.deserialize(possesString)
end
blob.volume = voxeldungeon.storage.getNum(name.."_volume") or 0
blob.timer = voxeldungeon.storage.getNum(name.."_timer") or TIMESCALE
blob.queue = voxeldungeon.storage.getNum(name.."_queue") or 1
blob.on_step = function(dtime)
voxeldungeon.storage.put(name.."_timer", blob.timer)
@ -73,10 +73,7 @@ function voxeldungeon.blobs.register(name, def)
blob.timer = TIMESCALE
--if blob.volume > 0 then
if blob.posses.size() > 0 then
blob.volume = 0
blob:evolve()
if blob.effectTerr then
@ -113,13 +110,15 @@ function voxeldungeon.blobs.register(name, def)
end
voxeldungeon.storage.put(name.."_posses", minetest.serialize(blob.posses.table))
voxeldungeon.storage.put(name.."_volume", blob.volume)
voxeldungeon.storage.put(name.."_queue", blob.queue)
end
blob.evolve = blob.evolve or function(blob)
local offload = expandUpon(blob.posses, blob.spreadCondition)
for i = 1, offload.size() do
local cycleSize = math.min(MAX_CYCLE_SIZE, offload.size())
for i = blob.queue, blob.queue + offload.size() - 1 do
local p = offload.getVector(i)
if p then
@ -143,14 +142,12 @@ function voxeldungeon.blobs.register(name, def)
end
offload.set(p, value)
blob.volume = blob.volume + value
else
offload.del(p)
end
else
local value = blob.posses.get(p) or 0
offload.set(p, value)
blob.volume = blob.volume + value
end
end
end
@ -162,10 +159,15 @@ function voxeldungeon.blobs.register(name, def)
end
blob.posses = offload
blob.queue = blob.queue + MAX_CYCLE_SIZE
if blob.queue > offload.size() then
blob.queue = 1
end
end
blob.seed = function(pos, amount)
blob.volume = blob.volume + amount
blob.posses.set(pos, amount)
end
@ -173,7 +175,6 @@ function voxeldungeon.blobs.register(name, def)
local cur = blob.posses.get(pos)
if cur then
blob.volume = blob.volume - cur
blob.posses.del(pos)
end
end
@ -246,7 +247,9 @@ voxeldungeon.blobs.register("fire", {
evolve = function(blob)
local offload = expandUpon(blob.posses, blob.spreadCondition)
for i = 1, offload.size() do
local cycleSize = math.min(MAX_CYCLE_SIZE, offload.size())
for i = blob.queue, blob.queue + offload.size() - 1 do
local p = offload.getVector(i)
if p then
@ -275,7 +278,6 @@ voxeldungeon.blobs.register("fire", {
end
offload.set(p, value)
blob.volume = blob.volume + value
end
else
offload.del(p)
@ -283,7 +285,7 @@ voxeldungeon.blobs.register("fire", {
else
local value = blob.posses.get(p) or 0
offload.set(p, value)
blob.volume = blob.volume + value
cycleSize = cycleSize + 1
end
end
end
@ -295,6 +297,12 @@ voxeldungeon.blobs.register("fire", {
end
blob.posses = offload
blob.queue = blob.queue + MAX_CYCLE_SIZE
if blob.queue > offload.size() then
blob.queue = 1
end
end,
effectTerr = function(blob, pos, amount, objs)

View File

@ -134,6 +134,14 @@ minetest.register_craft({
--Any crafted item is instantly identified
minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv)
voxeldungeon.items.identify(itemstack)
return itemstack
end)
--Bed recipes that allow any wool
minetest.register_craft({

View File

@ -47,7 +47,7 @@ register_food("mystery_meat", {
groups = {freezable = 1, flammable = 1},
on_eat = function(itemstack, user)
local effect = math.random(3)
local effect = math.random(4)
if effect == 2 then
voxeldungeon.glog.w("You are not feeling well.", user)
@ -55,6 +55,9 @@ register_food("mystery_meat", {
elseif effect == 3 then
voxeldungeon.glog.w("You can't feel your legs!", user)
voxeldungeon.buffs.attach_buff("voxeldungeon:rooted", user, 10)
elseif effect == 4 then
voxeldungeon.glog.w("Oh, it's hot!", user)
voxeldungeon.buffs.attach_buff("voxeldungeon:burning", user, 8)
end
end,

View File

@ -66,3 +66,4 @@ dofile(mp.."mapgen.lua")
--Unregistration files
dofile(mp.."trashbin.lua")

View File

@ -23,6 +23,18 @@ voxeldungeon.items = {}
function voxeldungeon.items.identify(item)
if minetest.get_item_group(item:get_name(), "armor") > 0 then
voxeldungeon.armor.identify(item)
elseif minetest.get_item_group(item:get_name(), "wand") > 0 then
voxeldungeon.wands.identify(item)
elseif minetest.get_item_group(item:get_name(), "weapon") > 0 then
voxeldungeon.weapons.identify(item)
end
end
local function get_pointed_pos(pointed_thing)
if pointed_thing.type == "node" then
return pointed_thing.above
@ -229,8 +241,8 @@ entitycontrol.override_entity("__builtin:item", {
end
end,
on_step = function(self, dtime)
super_on_step(self, dtime)
on_step = function(self, dtime, moveresult)
super_on_step(self, dtime, moveresult)
if voxeldungeon.blobs.get("voxeldungeon:blob_fire", self.object:get_pos()) > 0 then
local item = ItemStack(self.itemstring)

View File

@ -33,21 +33,7 @@ local function tileToString(tile)
end
end
local function get_item_groups(itemname, groups)
local val = 0
if type(groups) == "table" then
for _, group in ipairs(groups) do
val = val + minetest.get_item_group(itemname, group)
end
else
val = minetest.get_item_group(itemname, groups)
end
return val
end
function voxeldungeon.itemselector.showSelector(player, label, selectable, select_goal, callback)
function voxeldungeon.itemselector.showSelector(player, label, selectCondition, callback)
local fs = "size[8,5]label[0,0;"..label.."]"
local inv = player:get_inventory()
local playername = player:get_player_name()
@ -59,7 +45,7 @@ function voxeldungeon.itemselector.showSelector(player, label, selectable, selec
if item:is_empty() then
fs = fs.."image["..x..","..y..";1,1;voxeldungeon_ui_itemslot.png]"
elseif get_item_groups(item:get_name(), selectable) >= select_goal then
elseif selectCondition(item) then
fs = fs.."item_image_button["..x..","..y..";1,1;"..item:get_name()..";slot_button_"..i..";]"..
"tooltip[slot_button_"..i..";"..voxeldungeon.utils.itemShortDescription(item).."]"
else
@ -82,7 +68,7 @@ function voxeldungeon.itemselector.showSelector(player, label, selectable, selec
if armor:is_empty() then
fs = fs.."image[7,0;1,1;voxeldungeon_ui_itemslot.png]"
elseif get_item_groups(armor:get_name(), selectable) >= select_goal then
elseif selectCondition(armor) then
fs = fs.."item_image_button[7,0;1,1;"..armor:get_name()..";slot_button_a;]"..
"tooltip[slot_button_a;"..voxeldungeon.utils.itemShortDescription(armor).."]"
else

View File

@ -19,43 +19,39 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>
--]]
--Unregister default underground biomes,
minetest.unregister_biome("icesheet_under")
--minetest.unregister_biome("icesheet_ocean")
minetest.unregister_biome("tundra_under")
minetest.unregister_biome("icesheet_ocean")
minetest.unregister_biome("taiga_under")
minetest.unregister_biome("taiga_ocean")
minetest.unregister_biome("snowy_grassland_under")
minetest.unregister_biome("snowy_grassland_ocean")
minetest.unregister_biome("grassland_under")
minetest.unregister_biome("grassland_ocean")
minetest.unregister_biome("coniferous_forest_under")
minetest.unregister_biome("coniferous_forest_ocean")
minetest.unregister_biome("deciduous_forest_under")
minetest.unregister_biome("deciduous_forest_ocean")
minetest.unregister_biome("desert_under")
minetest.unregister_biome("desert_ocean")
minetest.unregister_biome("sandstone_desert_under")
minetest.unregister_biome("sandstone_desert_ocean")
minetest.unregister_biome("cold_desert_under")
minetest.unregister_biome("cold_desert_ocean")
minetest.unregister_biome("savanna_under")
minetest.unregister_biome("savanna_ocean")
minetest.unregister_biome("rainforest_under")
minetest.unregister_biome("rainforest_ocean")
--[[
--Surface biome types can stay, but use mostly sewer-style nodes underneath them
for k, _ in pairs(minetest.registered_biomes) do
minetest.registered_biomes[k].node_stone = "voxeldungeon:sewerstone"
minetest.registered_biomes[k].node_dungeon = "voxeldungeon:sewerwall"
minetest.registered_biomes[k].node_dungeon_alt = nil
minetest.registered_biomes[k].node_dungeon_stair = nil
local function safe_unregister_biome(bname)
if minetest.registered_biomes[bname] then
minetest.unregister_biome(bname)
end
end
--]]
--Unregister default underground biomes,
safe_unregister_biome("icesheet_under")
--safe_unregister_biome("icesheet_ocean")
safe_unregister_biome("tundra_under")
safe_unregister_biome("icesheet_ocean")
safe_unregister_biome("taiga_under")
safe_unregister_biome("taiga_ocean")
safe_unregister_biome("snowy_grassland_under")
safe_unregister_biome("snowy_grassland_ocean")
safe_unregister_biome("grassland_under")
safe_unregister_biome("grassland_ocean")
safe_unregister_biome("coniferous_forest_under")
safe_unregister_biome("coniferous_forest_ocean")
safe_unregister_biome("deciduous_forest_under")
safe_unregister_biome("deciduous_forest_ocean")
safe_unregister_biome("desert_under")
safe_unregister_biome("desert_ocean")
safe_unregister_biome("sandstone_desert_under")
safe_unregister_biome("sandstone_desert_ocean")
safe_unregister_biome("cold_desert_under")
safe_unregister_biome("cold_desert_ocean")
safe_unregister_biome("savanna_under")
safe_unregister_biome("savanna_ocean")
safe_unregister_biome("rainforest_under")
safe_unregister_biome("rainforest_ocean")

View File

@ -181,203 +181,3 @@ function voxeldungeon.mobkit.landBrain(self)
end
end
end
--[[
function voxeldungeon.mobkit.skyBrain(self)
-- vitals should be checked every step
mobkit.vitals(self)
local doReturn = voxeldungeon.mobkit.HPChecks(self)
if doReturn then return end
--decision making needn't happen every engine step
if mobkit.timer(self,1) then
local prty = mobkit.get_queue_priority(self)
--[[
-- hunt
if prty < 20 then
local enemy = chooseEnemy(self)
if enemy then
local hunt = self._huntfunc or mobkit.hq_hunt
hunt(self, 10, enemy)
end
end
-- fool around
if mobkit.is_queue_empty_high(self) then
voxeldungeon.mobkit.fly_roam(self, 0)
end
end
end
function voxeldungeon.mobkit.fly_roam(self, prty)
local func = function(self)
if mobkit.is_queue_empty_low(self) then
local tpos = vector.add(self.object:get_pos(), voxeldungeon.utils.NEIGHBORS8[math.random(8)])
mobkit.dumbstep(self, 5, tpos, 0.3)
end
end
mobkit.queue_high(self,func,prty)
end
function voxeldungeon.mobkit.hq_climb(self,prty)
local func = function(self)
if mobkit.timer(self,5) then
local pos = self.object:get_pos()
local pos2 = mobkit.pos_translate2d(pos,self.object:get_yaw(),5)
pos2.y = pos2.y - 15
local height = mobkit.get_terrain_height(pos2,32)
if not height or pos.y-max(height,1)>24 then
minetest.chat_send_all('glide')
voxeldungeon.mobkit.hq_glide(self,prty)
return true
end
end
if mobkit.timer(self,15) then mobkit.clear_queue_low(self) end
if mobkit.is_queue_empty_low(self) then voxeldungeon.mobkit.lq_fly_pitch(self,0.6,8,(random(2)-1.5)*30,1) end
end
mobkit.queue_high(self,func,prty)
end
function voxeldungeon.mobkit.hq_glide(self,prty)
local func = function(self)
if mobkit.timer(self,5) then
local pos = self.object:get_pos()
pos2 = mobkit.pos_translate2d(pos,self.object:get_yaw(),5)
pos2.y = pos2.y - 15
local height = mobkit.get_terrain_height(pos2,32)
if height and pos.y-max(height,1)<18 then
minetest.chat_send_all('climb')
voxeldungeon.mobkit.hq_climb(self,prty)
return true
end
end
if mobkit.timer(self,15) then mobkit.clear_queue_low(self) end
if mobkit.is_queue_empty_low(self) then voxeldungeon.mobkit.lq_fly_pitch(self,0.6,-4,(random(2)-1.5)*30,0) end
end
mobkit.queue_high(self,func,prty)
end
local function pitchroll2pitchyaw(aoa,roll)
if roll == 0.0 then return aoa,0 end
-- assumed vector x=0,y=0,z=1
local p1 = tan(aoa)
local y = cos(roll)*p1
local x = sqrt(p1^2-y^2)
local pitch = atan(y)
local yaw=atan(x)*math.sign(roll)
return pitch,yaw
end
function voxeldungeon.mobkit.lq_fly_aoa(self,lift,aoa,roll,acc,anim)
aoa=rad(aoa)
roll=rad(roll)
local hpitch = 0
local hyaw = 0
local caoa = 0
local laoa = nil
local croll=roll
local lroll = nil
local lastrot = nil
local init = true
local func=function(self)
local rotation=self.object:get_rotation()
local vel = self.object:get_velocity()
local vrot = mobkit.dir_to_rot(vel,lastrot)
lastrot = vrot
if init then
if anim then mobkit.animate(self,anim) end
init = false
end
local accel=self.object:get_acceleration()
-- gradual changes
if abs(roll-rotation.z) > 0.5*self.dtime then
croll = rotation.z+0.5*self.dtime*math.sign(roll-rotation.z)
end
if croll~=lroll then
hpitch,hyaw = pitchroll2pitchyaw(aoa,croll)
lroll = croll
end
local hrot = {x=vrot.x+hpitch,y=vrot.y-hyaw,z=croll}
self.object:set_rotation(hrot)
local hdir = mobkit.rot_to_dir(hrot)
local cross = vector.cross(vel,hdir)
local lift_dir = vector.normalize(vector.cross(cross,hdir))
local daoa = deg(aoa)
local lift_coefficient = 0.24*abs(daoa)*(1/(0.025*daoa+1))^4*math.sign(aoa) -- homegrown formula
local lift_val = lift*vector.length(vel)^2*lift_coefficient
local lift_acc = vector.multiply(lift_dir,lift_val)
lift_acc=vector.add(vector.multiply(minetest.yaw_to_dir(rotation.y),acc),lift_acc)
self.object:set_acceleration(vector.add(accel,lift_acc))
end
mobkit.queue_low(self,func)
end
function voxeldungeon.mobkit.lq_fly_pitch(self,lift,pitch,roll,acc,anim)
pitch = rad(pitch)
roll=rad(roll)
local cpitch = pitch
local croll = roll
local hpitch = 0
local hyaw = 0
local lpitch = nil
local lroll = nil
local lastrot = nil
local init = true
local func=function(self)
if init then
if anim then mobkit.animate(self,anim) end
init = false
end
local rotation=self.object:get_rotation()
local accel=self.object:get_acceleration()
local vel = self.object:get_velocity()
local speed = vector.length(vel)
local vdir = vector.normalize(vel)
local vrot = mobkit.dir_to_rot(vel,lastrot)
lastrot = vrot
-- gradual changes
if abs(roll-rotation.z) > 0.5*self.dtime then
croll = rotation.z+0.5*self.dtime*math.sign(roll-rotation.z)
end
if abs(pitch-rotation.x) > 0.5*self.dtime then
cpitch = rotation.x+0.5*self.dtime*math.sign(pitch-rotation.x)
end
if cpitch~=lpitch or croll~=lroll then
hpitch,hyaw = pitchroll2pitchyaw(cpitch,croll)
lpitch = cpitch lroll = croll
end
local aoa = deg(-vrot.x+cpitch) -- angle of attack
local hrot = {x=hpitch, y=vrot.y-hyaw, z=croll} -- hull rotation
self.object:set_rotation(hrot)
local hdir = mobkit.rot_to_dir(hrot) -- hull dir
local cross = vector.cross(hdir,vel)
local lift_dir = vector.normalize(vector.cross(hdir,cross))
local lift_coefficient = 0.24*abs(aoa)*(1/(0.025*aoa+1))^4 -- homegrown formula
local lift_val = mobkit.minmax(lift*speed^2*lift_coefficient,speed/self.dtime)
local lift_acc = vector.multiply(lift_dir,lift_val)
lift_acc=vector.add(vector.multiply(minetest.yaw_to_dir(rotation.y),acc),lift_acc)
accel=vector.add(accel,lift_acc)
accel=vector.add(accel,vector.multiply(vdir,-speed*speed*0.02)) -- drag
accel=vector.add(accel,vector.multiply(hdir,acc)) -- propeller
self.object:set_acceleration(accel)
--if mobkit.timer(self,2) then minetest.chat_send_all('aoa: '.. aoa ..' spd '.. speed ..' hgt:'.. self.object:get_pos().y) end
end
mobkit.queue_low(self,func)
end
--]]

View File

@ -109,11 +109,12 @@ local function register_mob(name, def)
def.attack.full_punch_interval = def.attack.full_punch_interval or 1
def.armor = def.armor or 0
def.on_step = function(self, dtime)
def.on_step = function(self, dtime, moveresult)
mobkit.stepfunc(self, dtime)
if def._on_step then def._on_step(self, dtime) end
if def._on_step then def._on_step(self, dtime, moveresult) end
local pos = self.object:get_pos()
if not pos then return end
pos.y = pos.y + 0.5
if #voxeldungeon.utils.getPlayersInArea(pos, 100) > 0 then
@ -175,7 +176,7 @@ local function register_mob(name, def)
time_from_last_punch = voxeldungeon.playerhandler.getTimeFromLastPunch(puncher)
if minetest.get_item_group(weapon:get_name(), "weapon") > 0 then
weapon, tool_capabilities = voxeldungeon.weapons.on_use(weapon, puncher, {type = "object", ref = self.object})
weapon, tool_capabilities = voxeldungeon.weapons.on_use(weapon, puncher, self.object, time_from_last_punch)
minetest.after(0, function() puncher:set_wielded_item(weapon) end)
end
end

View File

@ -276,7 +276,7 @@ function voxeldungeon.particles.blastwave_trail(pos)
end
function voxeldungeon.particles.blood(pos, customdata)
color = customdata.color or {r = 204, g = 0, b = 0}
local color = customdata.color or {r = 204, g = 0, b = 0}
local particle = minetest.add_entity(pos, "voxeldungeon:particle_dot")

View File

@ -62,8 +62,8 @@ function voxeldungeon.register_foilage(name, desc, trampled, ch)
check_foilage(pos)
if math.random(18) == 1 then
local seedname = voxeldungeon.generator.randomSeed()
minetest.add_item(pos, {name = seedname})
local seed = voxeldungeon.generator.randomSeed()
minetest.add_item(pos, seed)
end
if math.random(6) == 1 then
@ -97,9 +97,8 @@ function voxeldungeon.register_foilage(name, desc, trampled, ch)
}
local nodename = minetest.get_node(above).name
local nodedef = minetest.registered_nodes[nodename]
if not nodedef or nodename ~= "voxeldungeon:foilage_"..name.."_top" then
if nodename ~= "voxeldungeon:foilage_"..name.."_top" then
do_activate(pos)
end
end
@ -274,10 +273,9 @@ voxeldungeon.register_foilage("halls_tallgrass", "Hall Tall Grass", "halls_short
local function set_foilage_checks()
minetest.register_on_mods_loaded(function()
for nodename, _ in pairs(minetest.registered_nodes) do
voxeldungeon.override.add_dig_event(nodename, check_foilage)
voxeldungeon.override.add_after_place_event(nodename, check_foilage)
end
end
minetest.after(0, set_foilage_checks)
end)

View File

@ -139,7 +139,7 @@ minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch,
time_from_last_punch = voxeldungeon.playerhandler.getTimeFromLastPunch(hitter)
if minetest.get_item_group(weapon:get_name(), "weapon") > 0 then
weapon, tool_capabilities = voxeldungeon.weapons.on_use(weapon, hitter, {type = "object", ref = player})
weapon, tool_capabilities = voxeldungeon.weapons.on_use(weapon, hitter, player, time_from_last_punch)
minetest.after(0, function() hitter:set_wielded_item(weapon) end)
end
end
@ -148,15 +148,19 @@ minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch,
* math.min(1, time_from_last_punch / (tool_capabilities.full_punch_interval or 1))))
local armor_inv = minetest.get_inventory({type="detached", name=playername.."_armor"})
local armor = armor_inv:get_stack("armor", 1)
if not armor:is_empty() then
local defense = voxeldungeon.armor.getDefenseOf(armor)
local armor_item = armor_inv:get_stack("armor", 1)
if not armor_item:is_empty() then
local defense = voxeldungeon.armor.getDefenseOf(armor_item)
damage = math.max(0, damage - defense)
local wear = math.floor(65535 / (1000 / armor:get_definition()._durabilityPerUse))
armor:add_wear(wear)
armor_inv:set_stack("armor", 1, armor)
voxeldungeon.armor.checkLevelKnown(armor_item, player)
local wear = math.floor(65535 / (1000 / armor_item:get_definition()._durabilityPerUse))
armor_item:add_wear(wear)
armor_inv:set_stack("armor", 1, armor_item)
armor:save_armor_inventory(player)
end
voxeldungeon.utils.on_punch_common(player, hitter, time_from_last_punch, tool_capabilities, dir, damage)

View File

@ -19,6 +19,20 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>
--]]
voxeldungeon.potions = {}
function voxeldungeon.potions.identify(player, potion)
voxeldungeon.typeIdentification.setKnown(player, "potion", potion:get_definition()._ti_key)
end
function voxeldungeon.potions.isIdentified(player, potion)
voxeldungeon.typeIdentification.isKnown(player, "potion", potion:get_definition()._ti_key)
end
local potion_defs =
{
{
@ -227,6 +241,7 @@ local function register_potion(name, desc, color, drink, shatter)
inventory_image = "voxeldungeon_item_potion_"..color..".png",
_cornerLR = "voxeldungeon_icon_potion_"..name..".png",
groups = {freezable = 1, vessel = 1},
_ti_key = color,
on_use = function(itemstack, user)
if drink then

View File

@ -35,21 +35,26 @@ local function register_repair(name, desc)
def.groups = {repair = 1}
local do_repair = function(itemstack, user, pointed_thing)
voxeldungeon.itemselector.showSelector(user, "Choose which "..name.." to repair.", name, 1, function(player, choice)
if choice then
if choice:get_wear() == 0 then
voxeldungeon.glog.i("That "..name.." is already fully repaired.")
else
local amount = math.ceil(65536 / 3)
itemstack:add_wear(amount)
user:get_inventory():set_stack("main", user:get_wield_index(), itemstack)
voxeldungeon.itemselector.showSelector(user, "Choose which "..name.." to repair.",
function(item)
return item:get_wear() > 0 and minetest.get_item_group(item:get_name(), name) > 0
end,
function(player, choice)
if choice then
if choice:get_wear() == 0 then
voxeldungeon.glog.i("That "..name.." is already fully repaired.")
else
local amount = math.ceil(65536 / 3)
itemstack:add_wear(amount)
user:get_inventory():set_stack("main", user:get_wield_index(), itemstack)
choice:add_wear(-amount)
choice:add_wear(-amount)
end
return choice
end
return choice
end
end)
)
end
def.on_place = do_repair

View File

@ -26,27 +26,50 @@ local scroll_defs =
desc = "Upgrade\n \nThis scroll will upgrade a single item, improving its quality. A wand will increase in power and in number of charges; a weapon will inflict more damage or find its mark more frequently; a suit of armor will deflect additional blows; the effect of a ring on its wearer will intensify. Weapons and armor will also require less strength to use, and any curses on the item will be lifted.",
read = function(itemstack, user, pointed_thing)
local itemname = itemstack:get_name()
voxeldungeon.utils.take_item(user, itemstack)
voxeldungeon.itemselector.showSelector(user, "Select an item to upgrade.", "upgradable", 1, function(player, item)
if item then
voxeldungeon.tools.upgrade(item)
voxeldungeon.glog.p("Your "..voxeldungeon.utils.itemShortDescription(item).." looks much better now.", player)
return item
else
voxeldungeon.utils.return_item(user, itemname)
voxeldungeon.itemselector.showSelector(user, "Select an item to upgrade.",
function(item)
return minetest.get_item_group(item:get_name(), "upgradable") > 0
end,
function(player, item)
if item then
voxeldungeon.tools.upgrade(item)
voxeldungeon.glog.p("Your "..voxeldungeon.utils.itemShortDescription(item).." looks much better now.", player)
return item
else
voxeldungeon.utils.return_item(user, itemstack:get_name())
end
end
end)
)
return itemstack
end
},
{
name = "identify",
desc = "Identify",
desc = "Identify\n \nThis scroll permanently reveals all of the secrets of a single item.",
read = function(itemstack, user, pointed_thing)
voxeldungeon.utils.take_item(user, itemstack)
voxeldungeon.itemselector.showSelector(user, "Select an item to identify.",
function(item)
return (minetest.get_item_group(item:get_name(), "armor") > 0 and not voxeldungeon.armor.isIdentified(item)) or
(minetest.get_item_group(item:get_name(), "wand") > 0 and not voxeldungeon.wands.isIdentified(item)) or
(minetest.get_item_group(item:get_name(), "weapon") > 0 and not voxeldungeon.weapons.isIdentified(item))
end,
function(player, item)
if item then
voxeldungeon.items.identify(item)
voxeldungeon.glog.i("The scroll identifies your "..voxeldungeon.utils.itemShortDescription(item)..".", player)
return item
else
voxeldungeon.utils.return_item(user, itemstack:get_name())
end
end
)
return voxeldungeon.utils.take_item(user, itemstack)
end
},

View File

@ -80,10 +80,14 @@ minetest.register_tool("voxeldungeon:pick_demonite", {
--general upgradable item methods
function voxeldungeon.tools.getStrengthRequirementOf(tierItem)
function voxeldungeon.tools.getStrengthRequirementOf(tierItem, unIdentified)
local level = tierItem:get_meta():get_int("voxeldungeon:level")
local tier = tierItem:get_definition()._tier
if unIdentified then
level = 0
end
--strength requirement decreases at +1, +3, +6, +10, etc.
return 8 + 2 * tier - math.floor(math.floor(math.sqrt(8 * level + 1) - 1) / 2)
end
@ -106,18 +110,3 @@ function voxeldungeon.tools.upgrade(upItem)
voxeldungeon.tools.setLevelOf(upItem, level + 1)
upItem:set_wear(0)
end
minetest.register_on_craft(function(itemstack)
if minetest.get_item_group(itemstack:get_name(), "weapon") > 0 then
voxeldungeon.weapons.updateDescription(itemstack)
return itemstack
elseif minetest.get_item_group(itemstack:get_name(), "wand") > 0 then
voxeldungeon.wands.updateDescription(itemstack)
return itemstack
elseif minetest.get_item_group(itemstack:get_name(), "armor_torso") > 0 then
voxeldungeon.armor.updateDescription(itemstack)
return itemstack
end
end)

View File

@ -345,12 +345,21 @@ end
function voxeldungeon.utils.itemShortDescription(item)
local level = item:get_meta():get_int("voxeldungeon:level")
local levelKnown = true
if minetest.get_item_group(item:get_name(), "weapon") > 0 then
levelKnown = voxeldungeon.weapons.isLevelKnown(item)
elseif minetest.get_item_group(item:get_name(), "wand") > 0 then
levelKnown = voxeldungeon.wands.isLevelKnown(item)
elseif minetest.get_item_group(item:get_name(), "armor") > 0 then
levelKnown = voxeldungeon.armor.isLevelKnown(item)
end
if minetest.get_item_group(item:get_name(), "upgradable") > 0 then
local desc = minetest.registered_items[item:get_name()].description
local lvlstr = ""
if level > 0 then
if level > 0 and levelKnown then
lvlstr = " +"..level
end
@ -360,6 +369,19 @@ function voxeldungeon.utils.itemShortDescription(item)
end
end
function voxeldungeon.utils.iteratePlayerInventories(player, func)
local lists = {"main", "craft"}
local inv = player:get_inventory()
for _, list in ipairs(lists) do
for i = 1, inv:get_size(list) do
local itemstack = inv:get_stack(list, i)
itemstack = func(player, inv, itemstack, i)
inv:set_stack(list, i, itemstack)
end
end
end
function voxeldungeon.utils.on_punch_common(defender, attacker, time_from_last_punch, tool_capabilities, dir, damage)
local para = voxeldungeon.buffs.get_buff("voxeldungeon:paralyzed", defender)
local hp

View File

@ -21,7 +21,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
voxeldungeon.wands = {}
local wear = math.floor(65535 / (200))
local ZAPS_TO_KNOW = 10
local wear = math.floor(65535 / 200)
local timer = 0
local wand_defs =
@ -41,9 +42,15 @@ local wand_defs =
def = {
desc = "Blast Wave",
info = function(wand)
local dmg = wand:get_meta():get_int("voxeldungeon:level") + 2
return "This wand shoots a bolt which violently detonates at a target location. Although the force of this blast only deals "..dmg.." damage, it can send most enemies flying."
info = function(wand, unidentified)
local dmgtext = "only deals "..(wand:get_meta():get_int("voxeldungeon:level") + 2).." damage"
if unidentified then
dmgtext = "typically only deals 2 damage"
end
return "This wand shoots a bolt which violently detonates at a target location. Although the force of this blast "
..dmgtext..", it can send most enemies flying."
end,
zap = function(itemstack, user, pointed_thing)
@ -93,10 +100,14 @@ local wand_defs =
def = {
desc = "Disintegration",
info = function(wand)
local dmg = 5 + wand:get_meta():get_int("voxeldungeon:level") * 2
info = function(wand, unidentified)
local dmgtext = "deals "..(5 + wand:get_meta():get_int("voxeldungeon:level") * 2).." damage"
return "This wand shoots a beam that pierces any obstacle, and will go farther the more it is upgraded. The beam deals "..dmg.." damage, and will also deal bonus damage for each enemy and wall it penetrates."
if unidentified then
dmgtext = "typically deals 5 damage"
end
return "This wand shoots a beam that pierces any obstacle, and will go farther the more it is upgraded. The beam "..dmgtext..", and will also deal bonus damage for each enemy and wall it penetrates."
end,
zap = function(itemstack, user, pointed_thing)
@ -150,11 +161,14 @@ local wand_defs =
desc = "Flock",
_baseCharges = 1,
info = function(wand)
local amount = 2 + wand:get_meta():get_int("voxeldungeon:level")
local dmg = amount * 5
info = function(wand, unidentified)
local amounttext = "up to "..(2 + wand:get_meta():get_int("voxeldungeon:level")).." magic sheep"
return "A flick of this wand uses its remaining charge to summon a flock of up to "..amount.." magic sheep, creating a temporary impenetrable obstacle. After a period of time, these sheep will all simultanously explode. Its power is derived from the amount of charges it can use in a single zap."
if unidentified then
amounttext = "typically up to 2 magic sheep"
end
return "A flick of this wand uses its remaining charge to summon a flock of "..amounttext..", creating a temporary impenetrable obstacle. After a period of time, these sheep will all simultanously explode. Its power is derived from the amount of charges it can use in a single zap."
end,
zap = function(itemstack, user, pointed_thing)
@ -201,10 +215,16 @@ local wand_defs =
desc = "Magic Missile",
_baseCharges = 3,
info = function(wand)
info = function(wand, unidentified)
local dmg = 6 + wand:get_meta():get_int("voxeldungeon:level")
return "This fairly plain wand launches missiles of pure magical energy. While not as strong as other wands, it makes up for it somewhat with more available charges.\n \nEach bolt from this wand deals "..dmg.." damage, and has no additional effects."
local dmgtext = "deals "..(6 + wand:get_meta():get_int("voxeldungeon:level")).." damage"
if unidentified then
dmgtext = "typically deals 6 damage"
end
return "This fairly plain wand launches missiles of pure magical energy. While not as strong as other wands, it makes up for it somewhat with more available charges.\n \nEach bolt from this wand "..dmgtext..", and has no additional effects."
end,
zap = function(itemstack, user, pointed_thing)
@ -226,10 +246,14 @@ local wand_defs =
def = {
desc = "Prismatic Light",
info = function(wand)
local dmg = 3 + wand:get_meta():get_int("voxeldungeon:level") * 2
info = function(wand, unidentified)
local dmgtext = "deals "..(3 + wand:get_meta():get_int("voxeldungeon:level") * 2).." damage"
return "This wand shoots rays of light which cut through the thickest of darkness, revealing hidden areas and traps. The beam can blind enemies, and deals "..dmg.." damage. Demonic and undead foes will burn in the bright light of the wand, taking bonus damage."
if unidentified then
dmgtext = "typically deals 3 damage"
end
return "This wand shoots rays of light which cut through the thickest of darkness, revealing hidden areas and traps. The beam can blind enemies, and "..dmgtext..". Demonic and undead foes will burn in the bright light of the wand, taking bonus damage."
end,
zap = function(itemstack, user, pointed_thing)
@ -316,10 +340,15 @@ local wand_defs =
desc = "Vampirism",
_baseCharges = 1,
info = function(wand)
info = function(wand, unidentified)
local dmg = 4 + wand:get_meta():get_int("voxeldungeon:level")
local dmgtext = "deals "..dmg.." damage and will give you up to "..math.floor(dmg / 2).." HP."
return "This wand will allow you to steal life energy from living creatures to restore your own health. However, using it against undead creatures will just harm them.\n \nEach bolt from this wand deals "..dmg.." damage and will give you up to "..math.floor(dmg / 2).." HP."
if unidentified then
dmgtext = "typically deals 4 damage and will usually give you up to 2 HP."
end
return "This wand will allow you to steal life energy from living creatures to restore your own health. However, using it against undead creatures will just harm them.\n \nEach bolt from this wand "..dmgtext
end,
zap = function(itemstack, user, pointed_thing)
@ -363,17 +392,34 @@ function voxeldungeon.wands.fullRecharge(wand)
meta:set_int("voxeldungeon:charge", voxeldungeon.wands.getMaxCharge(wand))
end
function voxeldungeon.wands.isLevelKnown(wand)
return wand:get_meta():get_int("voxeldungeon:levelKnown") >= ZAPS_TO_KNOW
end
function voxeldungeon.wands.isIdentified(wand)
return voxeldungeon.wands.isLevelKnown(wand)
end
function voxeldungeon.wands.identify(wand)
wand:get_meta():set_int("voxeldungeon:levelKnown", ZAPS_TO_KNOW)
voxeldungeon.wands.updateDescription(wand)
end
function voxeldungeon.wands.updateDescription(wand)
local meta = wand:get_meta()
local level = meta:get_int("voxeldungeon:level")
local levelKnown = voxeldungeon.wands.isLevelKnown(wand)
local def = wand:get_definition()
local info = def._getInfo(wand)
local info = def._getInfo(wand, not levelKnown)
local charge = voxeldungeon.wands.getCurCharge(wand)
local maxCh = voxeldungeon.wands.getMaxCharge(wand)
local chargeString = " (?/?)"
if levelKnown then
chargeString = " ("..voxeldungeon.wands.getCurCharge(wand)..'/'..voxeldungeon.wands.getMaxCharge(wand)..")"
end
meta:set_string("description", voxeldungeon.utils.itemDescription(voxeldungeon.utils.itemShortDescription(wand).." ("..charge..'/'..maxCh..")\n \n"
meta:set_string("description", voxeldungeon.utils.itemDescription(voxeldungeon.utils.itemShortDescription(wand)..chargeString.."\n \n"
..info.."\n \nRight click while holding a wand to zap with it."))
end
@ -416,7 +462,7 @@ end)
local function register_wand(name, wood, def)--desc, info, wood, zap)
local function register_wand(name, wood, def)
local do_zap = function(itemstack, user, pointed_thing)
local charge = voxeldungeon.wands.getCurCharge(itemstack)
@ -425,6 +471,7 @@ local function register_wand(name, wood, def)--desc, info, wood, zap)
itemstack:add_wear(wear)
local meta = itemstack:get_meta()
local levelKnown = meta:get_int("voxeldungeon:levelKnown")
local old = meta:get_int("voxeldungeon:charge")
meta:set_int("voxeldungeon:charge", math.max(old - 1, 0))
voxeldungeon.wands.updateDescription(itemstack)
@ -432,6 +479,16 @@ local function register_wand(name, wood, def)--desc, info, wood, zap)
if old == voxeldungeon.wands.getMaxCharge(itemstack) then
meta:set_float("voxeldungeon:lasttime", timer)
end
if levelKnown < ZAPS_TO_KNOW then
levelKnown = levelKnown + 1
meta:set_int("voxeldungeon:levelKnown", levelKnown)
if levelKnown == ZAPS_TO_KNOW then
voxeldungeon.wands.updateDescription(itemstack)
voxeldungeon.glog.i("You are now familiar with your "..voxeldungeon.utils.itemShortDescription(itemstack)..".", user)
end
end
else
voxeldungeon.glog.w("The wand fizzles; it must be out of charges for now.", user)
end

View File

@ -21,11 +21,17 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
voxeldungeon.weapons = {} --global variable
local HITS_TO_KNOW = 20
local function getDamageOf(weapon)
local function getDamageOf(weapon, unIdentified)
local level = weapon:get_meta():get_int("voxeldungeon:level")
if unIdentified then
level = 0
end
local def = weapon:get_definition()
local tier = def._tier
local mult = def._damageMultiplier
@ -39,10 +45,24 @@ local function durabilityPerHitWith(weapon)
return 1 - level / (level + 2)
end
function voxeldungeon.weapons.isLevelKnown(weapon)
return weapon:get_meta():get_int("voxeldungeon:levelKnown") >= HITS_TO_KNOW
end
function voxeldungeon.weapons.isIdentified(weapon)
return voxeldungeon.weapons.isLevelKnown(weapon)
end
function voxeldungeon.weapons.identify(weapon)
weapon:get_meta():set_int("voxeldungeon:levelKnown", HITS_TO_KNOW)
voxeldungeon.weapons.updateDescription(weapon)
end
function voxeldungeon.weapons.updateDescription(weapon)
local meta = weapon:get_meta()
local level = meta:get_int("voxeldungeon:level")
local augment = meta:get_string("voxeldungeon:augment")
local levelKnown = voxeldungeon.weapons.isLevelKnown(weapon)
local def = weapon:get_definition()
local tier = def._tier
@ -50,8 +70,15 @@ function voxeldungeon.weapons.updateDescription(weapon)
local dly = def.tool_capabilities.full_punch_interval
local dur = def._durabilityMultiplier or 1
local damage = getDamageOf(weapon)
local strreq = voxeldungeon.tools.getStrengthRequirementOf(weapon)
local damage = getDamageOf(weapon, not levelKnown)
local strreq = voxeldungeon.tools.getStrengthRequirementOf(weapon, not levelKnown)
local statsDesc = "tier-"..tier.." weapon deals "..damage.." damage and requires "..strreq.." points of strength to wield properly."
if levelKnown then
statsDesc = "This "..statsDesc
else
statsDesc = "Typically, this "..statsDesc
end
local dlyString = ""
if dly > 1 then dlyString = "\n \nThis is a rather slow weapon."
@ -71,35 +98,45 @@ function voxeldungeon.weapons.updateDescription(weapon)
local strTip = "\n \nHaving excess strength with this weapon will let you deal bonus damage with it, "..
"while lacking strength will greatly reduce your attack speed."
meta:set_string("description", voxeldungeon.utils.itemDescription(voxeldungeon.utils.itemShortDescription(weapon).."\n \n"..info..
"\n \nThis tier-"..tier.." weapon deals "..damage.." damage and requires "..strreq..
" points of strength to wield properly."..dlyString..durString..augString..strTip))
meta:set_string("description", voxeldungeon.utils.itemDescription(voxeldungeon.utils.itemShortDescription(weapon).."\n \n"..info..
"\n \n"..statsDesc..dlyString..durString..augString..strTip))
end
function voxeldungeon.weapons.on_use(itemstack, user, pointed_thing)
if pointed_thing.type == "object" then
local target = pointed_thing.ref
local toolcap = itemstack:get_tool_capabilities()
local strdiff = voxeldungeon.playerhandler.getSTR(user) - voxeldungeon.tools.getStrengthRequirementOf(itemstack)
local augment = itemstack:get_meta():get_string("voxeldungeon:augment")
local def = itemstack:get_definition()
local wear = math.floor(65535 / (1000 / def._durabilityPerUse * def._durabilityMultiplier))
function voxeldungeon.weapons.on_use(itemstack, user, target, time_from_last_punch)
local toolcap = itemstack:get_tool_capabilities()
local strdiff = voxeldungeon.playerhandler.getSTR(user) - voxeldungeon.tools.getStrengthRequirementOf(itemstack)
toolcap.damage_groups = {fleshy = getDamageOf(itemstack) + math.floor(math.max(0, strdiff) / 2)}
toolcap.full_punch_interval = toolcap.full_punch_interval * math.max(1, -strdiff + 1)
local meta = itemstack:get_meta()
local augment = itemstack:get_meta():get_string("voxeldungeon:augment")
local levelKnown = meta:get_int("voxeldungeon:levelKnown")
if augment == "speed" then
toolcap.full_punch_interval = toolcap.full_punch_interval * 0.667
wear = voxeldungeon.utils.round(wear * 1.333)
elseif augment == "durability" then
toolcap.full_punch_interval = toolcap.full_punch_interval * 1.333
wear = voxeldungeon.utils.round(wear * 0.667)
end
local def = itemstack:get_definition()
local wear = math.floor(65535 / (1000 / def._durabilityPerUse * def._durabilityMultiplier))
itemstack:add_wear(wear)
toolcap.damage_groups = {fleshy = getDamageOf(itemstack) + math.floor(math.max(0, strdiff) / 2)}
toolcap.full_punch_interval = toolcap.full_punch_interval * math.max(1, -strdiff + 1)
return itemstack, toolcap
if augment == "speed" then
toolcap.full_punch_interval = toolcap.full_punch_interval * 0.667
wear = voxeldungeon.utils.round(wear * 1.333)
elseif augment == "durability" then
toolcap.full_punch_interval = toolcap.full_punch_interval * 1.333
wear = voxeldungeon.utils.round(wear * 0.667)
end
if levelKnown < HITS_TO_KNOW and toolcap.full_punch_interval <= time_from_last_punch then
levelKnown = levelKnown + 1
meta:set_int("voxeldungeon:levelKnown", levelKnown)
if levelKnown == HITS_TO_KNOW then
voxeldungeon.weapons.updateDescription(itemstack)
voxeldungeon.glog.i("You are now familiar with your "..voxeldungeon.utils.itemShortDescription(itemstack)..".", user)
end
end
itemstack:add_wear(wear)
return itemstack, toolcap
end
local function register_weapon(name, def) --desc, tier, info, damage, delay, durability, tooltype)