Compare commits
	
		
			1 Commits
		
	
	
		
			159cd8d506
			...
			unique_ids
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 767d3e5ef7 | 
							
								
								
									
										30
									
								
								.luacheckrc
									
									
									
									
									
								
							
							
						
						| @@ -1,30 +0,0 @@ | |||||||
| std = "lua51+minetest" |  | ||||||
| unused_args = false |  | ||||||
| allow_defined_top = true |  | ||||||
| max_line_length = 999 |  | ||||||
| max_comment_line_length = 999 |  | ||||||
|  |  | ||||||
| stds.minetest = { |  | ||||||
| 	read_globals = { |  | ||||||
| 		"minetest", |  | ||||||
| 		"vector", |  | ||||||
| 		"VoxelManip", |  | ||||||
| 		"VoxelArea", |  | ||||||
| 		"PseudoRandom", |  | ||||||
| 		"ItemStack", |  | ||||||
| 		"default", |  | ||||||
| 		table = { |  | ||||||
| 			fields = { |  | ||||||
| 				"copy", |  | ||||||
| 			}, |  | ||||||
| 		}, |  | ||||||
| 		"dump", |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| read_globals = { |  | ||||||
| 	"biome_lib", |  | ||||||
| 	"stairsplus", |  | ||||||
| 	"stairs", |  | ||||||
| 	"doors", |  | ||||||
| } |  | ||||||
							
								
								
									
										968
									
								
								LICENSE
									
									
									
									
									
								
							
							
						
						| @@ -3,618 +3,390 @@ Minetest mod moretrees | |||||||
|  |  | ||||||
| All source code: | All source code: | ||||||
| 	© 2013, Vanessa Ezekowitz <vanessaezekowitz@gmail.com> | 	© 2013, Vanessa Ezekowitz <vanessaezekowitz@gmail.com> | ||||||
| Date & cocos palm code (date_palm.lua, cocos_palm.lua) | 	Published under the terms and conditions of the WTFPL. | ||||||
| 	© 2016, Rogier <rogier777@gmail.com> | All sapling textures (textures/*_sapling.png): | ||||||
| All date & date palm textures, date-based food, cocos flower & green coconuts, |  | ||||||
| and all poplar textures: |  | ||||||
| 	© 2016, Rogier <rogier777@gmail.com> |  | ||||||
| 	- Three of the date palm textures are modifications of existing moretrees textures |  | ||||||
| 	- The green coconuts are a modification of the brown coconut |  | ||||||
| 	- The date cake batter is a modification of the acorn muffin batter |  | ||||||
| All other sapling textures (textures/*_sapling.png): |  | ||||||
| 	© 2013, Tim Huppertz <mitroman@naturalnet.de> | 	© 2013, Tim Huppertz <mitroman@naturalnet.de> | ||||||
|  | 	Published under the terms and conditions of CC-BY-SA-3.0 Unported. | ||||||
| All other textures: | All other textures: | ||||||
| 	© 2013, Vanessa Ezekowitz <vanessaezekowitz@gmail.com> | 	© 2013, Vanessa Ezekowitz <vanessaezekowitz@gmail.com> | ||||||
|  | 	Published under the terms and conditions of CC-BY-SA-3.0 Unported. | ||||||
|  |  | ||||||
| ############################################################################### | ------------------------------------------------------------------------------- | ||||||
|  |  | ||||||
| License for all code: LGPL 3.0 |             DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE | ||||||
| License for all media and all other assets:  CC-by-SA 4.0 |                     Version 2, December 2004 | ||||||
|  |  | ||||||
| ############################################################################### |  Copyright (C) 2004 Sam Hocevar <sam@hocevar.net> | ||||||
|  |  | ||||||
|                    GNU LESSER GENERAL PUBLIC LICENSE |  Everyone is permitted to copy and distribute verbatim or modified | ||||||
|                        Version 3, 29 June 2007 |  copies of this license document, and changing it is allowed as long | ||||||
|  |  as the name is changed. | ||||||
|  |  | ||||||
|  Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/> |             DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE | ||||||
|  Everyone is permitted to copy and distribute verbatim copies |    TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION | ||||||
|  of this license document, but changing it is not allowed. |  | ||||||
|  |  | ||||||
|  |   0. You just DO WHAT THE FUCK YOU WANT TO. | ||||||
|  |  | ||||||
|   This version of the GNU Lesser General Public License incorporates | This license is commonly known as "WTFPL". | ||||||
| the terms and conditions of version 3 of the GNU General Public |  | ||||||
| License, supplemented by the additional permissions listed below. |  | ||||||
|  |  | ||||||
|   0. Additional Definitions. | ------------------------------------------------------------------------------- | ||||||
|  |  | ||||||
|   As used herein, "this License" refers to version 3 of the GNU Lesser | Creative Commons Legal Code | ||||||
| General Public License, and the "GNU GPL" refers to version 3 of the GNU |  | ||||||
| General Public License. |  | ||||||
|  |  | ||||||
|   "The Library" refers to a covered work governed by this License, | Attribution-ShareAlike 3.0 Unported | ||||||
| other than an Application or a Combined Work as defined below. |  | ||||||
|  |  | ||||||
|   An "Application" is any work that makes use of an interface provided |     CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE | ||||||
| by the Library, but which is not otherwise based on the Library. |     LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN | ||||||
| Defining a subclass of a class defined by the Library is deemed a mode |     ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS | ||||||
| of using an interface provided by the Library. |     INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES | ||||||
|  |     REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR | ||||||
|  |     DAMAGES RESULTING FROM ITS USE. | ||||||
|  |  | ||||||
|   A "Combined Work" is a work produced by combining or linking an |  | ||||||
| Application with the Library.  The particular version of the Library |  | ||||||
| with which the Combined Work was made is also called the "Linked |  | ||||||
| Version". |  | ||||||
|  |  | ||||||
|   The "Minimal Corresponding Source" for a Combined Work means the |  | ||||||
| Corresponding Source for the Combined Work, excluding any source code |  | ||||||
| for portions of the Combined Work that, considered in isolation, are |  | ||||||
| based on the Application, and not on the Linked Version. |  | ||||||
|  |  | ||||||
|   The "Corresponding Application Code" for a Combined Work means the |  | ||||||
| object code and/or source code for the Application, including any data |  | ||||||
| and utility programs needed for reproducing the Combined Work from the |  | ||||||
| Application, but excluding the System Libraries of the Combined Work. |  | ||||||
|  |  | ||||||
|   1. Exception to Section 3 of the GNU GPL. |  | ||||||
|  |  | ||||||
|   You may convey a covered work under sections 3 and 4 of this License |  | ||||||
| without being bound by section 3 of the GNU GPL. |  | ||||||
|  |  | ||||||
|   2. Conveying Modified Versions. |  | ||||||
|  |  | ||||||
|   If you modify a copy of the Library, and, in your modifications, a |  | ||||||
| facility refers to a function or data to be supplied by an Application |  | ||||||
| that uses the facility (other than as an argument passed when the |  | ||||||
| facility is invoked), then you may convey a copy of the modified |  | ||||||
| version: |  | ||||||
|  |  | ||||||
|    a) under this License, provided that you make a good faith effort to |  | ||||||
|    ensure that, in the event an Application does not supply the |  | ||||||
|    function or data, the facility still operates, and performs |  | ||||||
|    whatever part of its purpose remains meaningful, or |  | ||||||
|  |  | ||||||
|    b) under the GNU GPL, with none of the additional permissions of |  | ||||||
|    this License applicable to that copy. |  | ||||||
|  |  | ||||||
|   3. Object Code Incorporating Material from Library Header Files. |  | ||||||
|  |  | ||||||
|   The object code form of an Application may incorporate material from |  | ||||||
| a header file that is part of the Library.  You may convey such object |  | ||||||
| code under terms of your choice, provided that, if the incorporated |  | ||||||
| material is not limited to numerical parameters, data structure |  | ||||||
| layouts and accessors, or small macros, inline functions and templates |  | ||||||
| (ten or fewer lines in length), you do both of the following: |  | ||||||
|  |  | ||||||
|    a) Give prominent notice with each copy of the object code that the |  | ||||||
|    Library is used in it and that the Library and its use are |  | ||||||
|    covered by this License. |  | ||||||
|  |  | ||||||
|    b) Accompany the object code with a copy of the GNU GPL and this license |  | ||||||
|    document. |  | ||||||
|  |  | ||||||
|   4. Combined Works. |  | ||||||
|  |  | ||||||
|   You may convey a Combined Work under terms of your choice that, |  | ||||||
| taken together, effectively do not restrict modification of the |  | ||||||
| portions of the Library contained in the Combined Work and reverse |  | ||||||
| engineering for debugging such modifications, if you also do each of |  | ||||||
| the following: |  | ||||||
|  |  | ||||||
|    a) Give prominent notice with each copy of the Combined Work that |  | ||||||
|    the Library is used in it and that the Library and its use are |  | ||||||
|    covered by this License. |  | ||||||
|  |  | ||||||
|    b) Accompany the Combined Work with a copy of the GNU GPL and this license |  | ||||||
|    document. |  | ||||||
|  |  | ||||||
|    c) For a Combined Work that displays copyright notices during |  | ||||||
|    execution, include the copyright notice for the Library among |  | ||||||
|    these notices, as well as a reference directing the user to the |  | ||||||
|    copies of the GNU GPL and this license document. |  | ||||||
|  |  | ||||||
|    d) Do one of the following: |  | ||||||
|  |  | ||||||
|        0) Convey the Minimal Corresponding Source under the terms of this |  | ||||||
|        License, and the Corresponding Application Code in a form |  | ||||||
|        suitable for, and under terms that permit, the user to |  | ||||||
|        recombine or relink the Application with a modified version of |  | ||||||
|        the Linked Version to produce a modified Combined Work, in the |  | ||||||
|        manner specified by section 6 of the GNU GPL for conveying |  | ||||||
|        Corresponding Source. |  | ||||||
|  |  | ||||||
|        1) Use a suitable shared library mechanism for linking with the |  | ||||||
|        Library.  A suitable mechanism is one that (a) uses at run time |  | ||||||
|        a copy of the Library already present on the user's computer |  | ||||||
|        system, and (b) will operate properly with a modified version |  | ||||||
|        of the Library that is interface-compatible with the Linked |  | ||||||
|        Version. |  | ||||||
|  |  | ||||||
|    e) Provide Installation Information, but only if you would otherwise |  | ||||||
|    be required to provide such information under section 6 of the |  | ||||||
|    GNU GPL, and only to the extent that such information is |  | ||||||
|    necessary to install and execute a modified version of the |  | ||||||
|    Combined Work produced by recombining or relinking the |  | ||||||
|    Application with a modified version of the Linked Version. (If |  | ||||||
|    you use option 4d0, the Installation Information must accompany |  | ||||||
|    the Minimal Corresponding Source and Corresponding Application |  | ||||||
|    Code. If you use option 4d1, you must provide the Installation |  | ||||||
|    Information in the manner specified by section 6 of the GNU GPL |  | ||||||
|    for conveying Corresponding Source.) |  | ||||||
|  |  | ||||||
|   5. Combined Libraries. |  | ||||||
|  |  | ||||||
|   You may place library facilities that are a work based on the |  | ||||||
| Library side by side in a single library together with other library |  | ||||||
| facilities that are not Applications and are not covered by this |  | ||||||
| License, and convey such a combined library under terms of your |  | ||||||
| choice, if you do both of the following: |  | ||||||
|  |  | ||||||
|    a) Accompany the combined library with a copy of the same work based |  | ||||||
|    on the Library, uncombined with any other library facilities, |  | ||||||
|    conveyed under the terms of this License. |  | ||||||
|  |  | ||||||
|    b) Give prominent notice with the combined library that part of it |  | ||||||
|    is a work based on the Library, and explaining where to find the |  | ||||||
|    accompanying uncombined form of the same work. |  | ||||||
|  |  | ||||||
|   6. Revised Versions of the GNU Lesser General Public License. |  | ||||||
|  |  | ||||||
|   The Free Software Foundation may publish revised and/or new versions |  | ||||||
| of the GNU Lesser General Public License from time to time. Such new |  | ||||||
| versions will be similar in spirit to the present version, but may |  | ||||||
| differ in detail to address new problems or concerns. |  | ||||||
|  |  | ||||||
|   Each version is given a distinguishing version number. If the |  | ||||||
| Library as you received it specifies that a certain numbered version |  | ||||||
| of the GNU Lesser General Public License "or any later version" |  | ||||||
| applies to it, you have the option of following the terms and |  | ||||||
| conditions either of that published version or of any later version |  | ||||||
| published by the Free Software Foundation. If the Library as you |  | ||||||
| received it does not specify a version number of the GNU Lesser |  | ||||||
| General Public License, you may choose any version of the GNU Lesser |  | ||||||
| General Public License ever published by the Free Software Foundation. |  | ||||||
|  |  | ||||||
|   If the Library as you received it specifies that a proxy can decide |  | ||||||
| whether future versions of the GNU Lesser General Public License shall |  | ||||||
| apply, that proxy's public statement of acceptance of any version is |  | ||||||
| permanent authorization for you to choose that version for the |  | ||||||
| Library. |  | ||||||
|  |  | ||||||
| ############################################################################### |  | ||||||
|  |  | ||||||
| Attribution-ShareAlike 4.0 International |  | ||||||
|  |  | ||||||
| ======================================================================= |  | ||||||
|  |  | ||||||
| Creative Commons Corporation ("Creative Commons") is not a law firm and |  | ||||||
| does not provide legal services or legal advice. Distribution of |  | ||||||
| Creative Commons public licenses does not create a lawyer-client or |  | ||||||
| other relationship. Creative Commons makes its licenses and related |  | ||||||
| information available on an "as-is" basis. Creative Commons gives no |  | ||||||
| warranties regarding its licenses, any material licensed under their |  | ||||||
| terms and conditions, or any related information. Creative Commons |  | ||||||
| disclaims all liability for damages resulting from their use to the |  | ||||||
| fullest extent possible. |  | ||||||
|  |  | ||||||
| Using Creative Commons Public Licenses |  | ||||||
|  |  | ||||||
| Creative Commons public licenses provide a standard set of terms and |  | ||||||
| conditions that creators and other rights holders may use to share |  | ||||||
| original works of authorship and other material subject to copyright |  | ||||||
| and certain other rights specified in the public license below. The |  | ||||||
| following considerations are for informational purposes only, are not |  | ||||||
| exhaustive, and do not form part of our licenses. |  | ||||||
|  |  | ||||||
|      Considerations for licensors: Our public licenses are |  | ||||||
|      intended for use by those authorized to give the public |  | ||||||
|      permission to use material in ways otherwise restricted by |  | ||||||
|      copyright and certain other rights. Our licenses are |  | ||||||
|      irrevocable. Licensors should read and understand the terms |  | ||||||
|      and conditions of the license they choose before applying it. |  | ||||||
|      Licensors should also secure all rights necessary before |  | ||||||
|      applying our licenses so that the public can reuse the |  | ||||||
|      material as expected. Licensors should clearly mark any |  | ||||||
|      material not subject to the license. This includes other CC- |  | ||||||
|      licensed material, or material used under an exception or |  | ||||||
|      limitation to copyright. More considerations for licensors: |  | ||||||
| 	wiki.creativecommons.org/Considerations_for_licensors |  | ||||||
|  |  | ||||||
|      Considerations for the public: By using one of our public |  | ||||||
|      licenses, a licensor grants the public permission to use the |  | ||||||
|      licensed material under specified terms and conditions. If |  | ||||||
|      the licensor's permission is not necessary for any reason--for |  | ||||||
|      example, because of any applicable exception or limitation to |  | ||||||
|      copyright--then that use is not regulated by the license. Our |  | ||||||
|      licenses grant only permissions under copyright and certain |  | ||||||
|      other rights that a licensor has authority to grant. Use of |  | ||||||
|      the licensed material may still be restricted for other |  | ||||||
|      reasons, including because others have copyright or other |  | ||||||
|      rights in the material. A licensor may make special requests, |  | ||||||
|      such as asking that all changes be marked or described. |  | ||||||
|      Although not required by our licenses, you are encouraged to |  | ||||||
|      respect those requests where reasonable. More considerations |  | ||||||
|      for the public:  |  | ||||||
| 	wiki.creativecommons.org/Considerations_for_licensees |  | ||||||
|  |  | ||||||
| ======================================================================= |  | ||||||
|  |  | ||||||
| Creative Commons Attribution-ShareAlike 4.0 International Public |  | ||||||
| License | License | ||||||
|  |  | ||||||
| By exercising the Licensed Rights (defined below), You accept and agree | THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE | ||||||
| to be bound by the terms and conditions of this Creative Commons | COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY | ||||||
| Attribution-ShareAlike 4.0 International Public License ("Public | COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS | ||||||
| License"). To the extent this Public License may be interpreted as a | AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. | ||||||
| contract, You are granted the Licensed Rights in consideration of Your |  | ||||||
| acceptance of these terms and conditions, and the Licensor grants You | BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE | ||||||
| such rights in consideration of benefits the Licensor receives from | TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY | ||||||
| making the Licensed Material available under these terms and | BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS | ||||||
| conditions. | CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND | ||||||
|  | CONDITIONS. | ||||||
|  |  | ||||||
| Section 1 -- Definitions. | 1. Definitions | ||||||
|  |  | ||||||
|   a. Adapted Material means material subject to Copyright and Similar |  a. "Adaptation" means a work based upon the Work, or upon the Work and | ||||||
|      Rights that is derived from or based upon the Licensed Material |     other pre-existing works, such as a translation, adaptation, | ||||||
|      and in which the Licensed Material is translated, altered, |     derivative work, arrangement of music or other alterations of a | ||||||
|      arranged, transformed, or otherwise modified in a manner requiring |     literary or artistic work, or phonogram or performance and includes | ||||||
|      permission under the Copyright and Similar Rights held by the |     cinematographic adaptations or any other form in which the Work may be | ||||||
|      Licensor. For purposes of this Public License, where the Licensed |     recast, transformed, or adapted including in any form recognizably | ||||||
|      Material is a musical work, performance, or sound recording, |     derived from the original, except that a work that constitutes a | ||||||
|      Adapted Material is always produced where the Licensed Material is |     Collection will not be considered an Adaptation for the purpose of | ||||||
|      synched in timed relation with a moving image. |     this License. For the avoidance of doubt, where the Work is a musical | ||||||
|  |     work, performance or phonogram, the synchronization of the Work in | ||||||
|   b. Adapter's License means the license You apply to Your Copyright |     timed-relation with a moving image ("synching") will be considered an | ||||||
|      and Similar Rights in Your contributions to Adapted Material in |     Adaptation for the purpose of this License. | ||||||
|      accordance with the terms and conditions of this Public License. |  b. "Collection" means a collection of literary or artistic works, such as | ||||||
|  |     encyclopedias and anthologies, or performances, phonograms or | ||||||
|   c. BY-SA Compatible License means a license listed at |     broadcasts, or other works or subject matter other than works listed | ||||||
|      creativecommons.org/compatiblelicenses, approved by Creative |     in Section 1(f) below, which, by reason of the selection and | ||||||
|      Commons as essentially the equivalent of this Public License. |     arrangement of their contents, constitute intellectual creations, in | ||||||
|  |     which the Work is included in its entirety in unmodified form along | ||||||
|   d. Copyright and Similar Rights means copyright and/or similar rights |     with one or more other contributions, each constituting separate and | ||||||
|      closely related to copyright including, without limitation, |     independent works in themselves, which together are assembled into a | ||||||
|      performance, broadcast, sound recording, and Sui Generis Database |     collective whole. A work that constitutes a Collection will not be | ||||||
|      Rights, without regard to how the rights are labeled or |     considered an Adaptation (as defined below) for the purposes of this | ||||||
|      categorized. For purposes of this Public License, the rights |     License. | ||||||
|      specified in Section 2(b)(1)-(2) are not Copyright and Similar |  c. "Creative Commons Compatible License" means a license that is listed | ||||||
|      Rights. |     at http://creativecommons.org/compatiblelicenses that has been | ||||||
|  |     approved by Creative Commons as being essentially equivalent to this | ||||||
|   e. Effective Technological Measures means those measures that, in the |     License, including, at a minimum, because that license: (i) contains | ||||||
|      absence of proper authority, may not be circumvented under laws |     terms that have the same purpose, meaning and effect as the License | ||||||
|      fulfilling obligations under Article 11 of the WIPO Copyright |     Elements of this License; and, (ii) explicitly permits the relicensing | ||||||
|      Treaty adopted on December 20, 1996, and/or similar international |     of adaptations of works made available under that license under this | ||||||
|      agreements. |     License or a Creative Commons jurisdiction license with the same | ||||||
|  |     License Elements as this License. | ||||||
|   f. Exceptions and Limitations means fair use, fair dealing, and/or |  d. "Distribute" means to make available to the public the original and | ||||||
|      any other exception or limitation to Copyright and Similar Rights |     copies of the Work or Adaptation, as appropriate, through sale or | ||||||
|      that applies to Your use of the Licensed Material. |     other transfer of ownership. | ||||||
|  |  e. "License Elements" means the following high-level license attributes | ||||||
|   g. License Elements means the license attributes listed in the name |     as selected by Licensor and indicated in the title of this License: | ||||||
|      of a Creative Commons Public License. The License Elements of this |     Attribution, ShareAlike. | ||||||
|      Public License are Attribution and ShareAlike. |  f. "Licensor" means the individual, individuals, entity or entities that | ||||||
|  |     offer(s) the Work under the terms of this License. | ||||||
|   h. Licensed Material means the artistic or literary work, database, |  g. "Original Author" means, in the case of a literary or artistic work, | ||||||
|      or other material to which the Licensor applied this Public |     the individual, individuals, entity or entities who created the Work | ||||||
|      License. |     or if no individual or entity can be identified, the publisher; and in | ||||||
|  |     addition (i) in the case of a performance the actors, singers, | ||||||
|   i. Licensed Rights means the rights granted to You subject to the |     musicians, dancers, and other persons who act, sing, deliver, declaim, | ||||||
|      terms and conditions of this Public License, which are limited to |     play in, interpret or otherwise perform literary or artistic works or | ||||||
|      all Copyright and Similar Rights that apply to Your use of the |     expressions of folklore; (ii) in the case of a phonogram the producer | ||||||
|      Licensed Material and that the Licensor has authority to license. |     being the person or legal entity who first fixes the sounds of a | ||||||
|  |     performance or other sounds; and, (iii) in the case of broadcasts, the | ||||||
|   j. Licensor means the individual(s) or entity(ies) granting rights |     organization that transmits the broadcast. | ||||||
|      under this Public License. |  h. "Work" means the literary and/or artistic work offered under the terms | ||||||
|  |     of this License including without limitation any production in the | ||||||
|   k. Share means to provide material to the public by any means or |     literary, scientific and artistic domain, whatever may be the mode or | ||||||
|      process that requires permission under the Licensed Rights, such |     form of its expression including digital form, such as a book, | ||||||
|      as reproduction, public display, public performance, distribution, |     pamphlet and other writing; a lecture, address, sermon or other work | ||||||
|      dissemination, communication, or importation, and to make material |     of the same nature; a dramatic or dramatico-musical work; a | ||||||
|      available to the public including in ways that members of the |     choreographic work or entertainment in dumb show; a musical | ||||||
|      public may access the material from a place and at a time |     composition with or without words; a cinematographic work to which are | ||||||
|      individually chosen by them. |     assimilated works expressed by a process analogous to cinematography; | ||||||
|  |     a work of drawing, painting, architecture, sculpture, engraving or | ||||||
|   l. Sui Generis Database Rights means rights other than copyright |     lithography; a photographic work to which are assimilated works | ||||||
|      resulting from Directive 96/9/EC of the European Parliament and of |     expressed by a process analogous to photography; a work of applied | ||||||
|      the Council of 11 March 1996 on the legal protection of databases, |     art; an illustration, map, plan, sketch or three-dimensional work | ||||||
|      as amended and/or succeeded, as well as other essentially |     relative to geography, topography, architecture or science; a | ||||||
|      equivalent rights anywhere in the world. |     performance; a broadcast; a phonogram; a compilation of data to the | ||||||
|  |     extent it is protected as a copyrightable work; or a work performed by | ||||||
|   m. You means the individual or entity exercising the Licensed Rights |     a variety or circus performer to the extent it is not otherwise | ||||||
|      under this Public License. Your has a corresponding meaning. |     considered a literary or artistic work. | ||||||
|  |  i. "You" means an individual or entity exercising rights under this | ||||||
|  |     License who has not previously violated the terms of this License with | ||||||
| Section 2 -- Scope. |     respect to the Work, or who has received express permission from the | ||||||
|  |     Licensor to exercise rights under this License despite a previous | ||||||
|   a. License grant. |     violation. | ||||||
|  |  j. "Publicly Perform" means to perform public recitations of the Work and | ||||||
|        1. Subject to the terms and conditions of this Public License, |     to communicate to the public those public recitations, by any means or | ||||||
|           the Licensor hereby grants You a worldwide, royalty-free, |     process, including by wire or wireless means or public digital | ||||||
|           non-sublicensable, non-exclusive, irrevocable license to |     performances; to make available to the public Works in such a way that | ||||||
|           exercise the Licensed Rights in the Licensed Material to: |     members of the public may access these Works from a place and at a | ||||||
|  |     place individually chosen by them; to perform the Work to the public | ||||||
|             a. reproduce and Share the Licensed Material, in whole or |     by any means or process and the communication to the public of the | ||||||
|                in part; and |     performances of the Work, including by public digital performance; to | ||||||
|  |     broadcast and rebroadcast the Work by any means including signs, | ||||||
|             b. produce, reproduce, and Share Adapted Material. |     sounds or images. | ||||||
|  |  k. "Reproduce" means to make copies of the Work by any means including | ||||||
|        2. Exceptions and Limitations. For the avoidance of doubt, where |     without limitation by sound or visual recordings and the right of | ||||||
|           Exceptions and Limitations apply to Your use, this Public |     fixation and reproducing fixations of the Work, including storage of a | ||||||
|           License does not apply, and You do not need to comply with |     protected performance or phonogram in digital form or other electronic | ||||||
|           its terms and conditions. |     medium. | ||||||
|  |  | ||||||
|        3. Term. The term of this Public License is specified in Section | 2. Fair Dealing Rights. Nothing in this License is intended to reduce, | ||||||
|           6(a). | limit, or restrict any uses free from copyright or rights arising from | ||||||
|  | limitations or exceptions that are provided for in connection with the | ||||||
|        4. Media and formats; technical modifications allowed. The | copyright protection under copyright law or other applicable laws. | ||||||
|           Licensor authorizes You to exercise the Licensed Rights in |  | ||||||
|           all media and formats whether now known or hereafter created, | 3. License Grant. Subject to the terms and conditions of this License, | ||||||
|           and to make technical modifications necessary to do so. The | Licensor hereby grants You a worldwide, royalty-free, non-exclusive, | ||||||
|           Licensor waives and/or agrees not to assert any right or | perpetual (for the duration of the applicable copyright) license to | ||||||
|           authority to forbid You from making technical modifications | exercise the rights in the Work as stated below: | ||||||
|           necessary to exercise the Licensed Rights, including |  | ||||||
|           technical modifications necessary to circumvent Effective |  a. to Reproduce the Work, to incorporate the Work into one or more | ||||||
|           Technological Measures. For purposes of this Public License, |     Collections, and to Reproduce the Work as incorporated in the | ||||||
|           simply making modifications authorized by this Section 2(a) |     Collections; | ||||||
|           (4) never produces Adapted Material. |  b. to create and Reproduce Adaptations provided that any such Adaptation, | ||||||
|  |     including any translation in any medium, takes reasonable steps to | ||||||
|        5. Downstream recipients. |     clearly label, demarcate or otherwise identify that changes were made | ||||||
|  |     to the original Work. For example, a translation could be marked "The | ||||||
|             a. Offer from the Licensor -- Licensed Material. Every |     original work was translated from English to Spanish," or a | ||||||
|                recipient of the Licensed Material automatically |     modification could indicate "The original work has been modified."; | ||||||
|                receives an offer from the Licensor to exercise the |  c. to Distribute and Publicly Perform the Work including as incorporated | ||||||
|                Licensed Rights under the terms and conditions of this |     in Collections; and, | ||||||
|                Public License. |  d. to Distribute and Publicly Perform Adaptations. | ||||||
|  |  e. For the avoidance of doubt: | ||||||
|             b. Additional offer from the Licensor -- Adapted Material. |  | ||||||
|                Every recipient of Adapted Material from You |      i. Non-waivable Compulsory License Schemes. In those jurisdictions in | ||||||
|                automatically receives an offer from the Licensor to |         which the right to collect royalties through any statutory or | ||||||
|                exercise the Licensed Rights in the Adapted Material |         compulsory licensing scheme cannot be waived, the Licensor | ||||||
|                under the conditions of the Adapter's License You apply. |         reserves the exclusive right to collect such royalties for any | ||||||
|  |         exercise by You of the rights granted under this License; | ||||||
|             c. No downstream restrictions. You may not offer or impose |     ii. Waivable Compulsory License Schemes. In those jurisdictions in | ||||||
|                any additional or different terms or conditions on, or |         which the right to collect royalties through any statutory or | ||||||
|                apply any Effective Technological Measures to, the |         compulsory licensing scheme can be waived, the Licensor waives the | ||||||
|                Licensed Material if doing so restricts exercise of the |         exclusive right to collect such royalties for any exercise by You | ||||||
|                Licensed Rights by any recipient of the Licensed |         of the rights granted under this License; and, | ||||||
|                Material. |    iii. Voluntary License Schemes. The Licensor waives the right to | ||||||
|  |         collect royalties, whether individually or, in the event that the | ||||||
|        6. No endorsement. Nothing in this Public License constitutes or |         Licensor is a member of a collecting society that administers | ||||||
|           may be construed as permission to assert or imply that You |         voluntary licensing schemes, via that society, from any exercise | ||||||
|           are, or that Your use of the Licensed Material is, connected |         by You of the rights granted under this License. | ||||||
|           with, or sponsored, endorsed, or granted official status by, |  | ||||||
|           the Licensor or others designated to receive attribution as | The above rights may be exercised in all media and formats whether now | ||||||
|           provided in Section 3(a)(1)(A)(i). | known or hereafter devised. The above rights include the right to make | ||||||
|  | such modifications as are technically necessary to exercise the rights in | ||||||
|   b. Other rights. | other media and formats. Subject to Section 8(f), all rights not expressly | ||||||
|  | granted by Licensor are hereby reserved. | ||||||
|        1. Moral rights, such as the right of integrity, are not |  | ||||||
|           licensed under this Public License, nor are publicity, | 4. Restrictions. The license granted in Section 3 above is expressly made | ||||||
|           privacy, and/or other similar personality rights; however, to | subject to and limited by the following restrictions: | ||||||
|           the extent possible, the Licensor waives and/or agrees not to |  | ||||||
|           assert any such rights held by the Licensor to the limited |  a. You may Distribute or Publicly Perform the Work only under the terms | ||||||
|           extent necessary to allow You to exercise the Licensed |     of this License. You must include a copy of, or the Uniform Resource | ||||||
|           Rights, but not otherwise. |     Identifier (URI) for, this License with every copy of the Work You | ||||||
|  |     Distribute or Publicly Perform. You may not offer or impose any terms | ||||||
|        2. Patent and trademark rights are not licensed under this |     on the Work that restrict the terms of this License or the ability of | ||||||
|           Public License. |     the recipient of the Work to exercise the rights granted to that | ||||||
|  |     recipient under the terms of the License. You may not sublicense the | ||||||
|        3. To the extent possible, the Licensor waives any right to |     Work. You must keep intact all notices that refer to this License and | ||||||
|           collect royalties from You for the exercise of the Licensed |     to the disclaimer of warranties with every copy of the Work You | ||||||
|           Rights, whether directly or through a collecting society |     Distribute or Publicly Perform. When You Distribute or Publicly | ||||||
|           under any voluntary or waivable statutory or compulsory |     Perform the Work, You may not impose any effective technological | ||||||
|           licensing scheme. In all other cases the Licensor expressly |     measures on the Work that restrict the ability of a recipient of the | ||||||
|           reserves any right to collect such royalties. |     Work from You to exercise the rights granted to that recipient under | ||||||
|  |     the terms of the License. This Section 4(a) applies to the Work as | ||||||
|  |     incorporated in a Collection, but this does not require the Collection | ||||||
| Section 3 -- License Conditions. |     apart from the Work itself to be made subject to the terms of this | ||||||
|  |     License. If You create a Collection, upon notice from any Licensor You | ||||||
| Your exercise of the Licensed Rights is expressly made subject to the |     must, to the extent practicable, remove from the Collection any credit | ||||||
| following conditions. |     as required by Section 4(c), as requested. If You create an | ||||||
|  |     Adaptation, upon notice from any Licensor You must, to the extent | ||||||
|   a. Attribution. |     practicable, remove from the Adaptation any credit as required by | ||||||
|  |     Section 4(c), as requested. | ||||||
|        1. If You Share the Licensed Material (including in modified |  b. You may Distribute or Publicly Perform an Adaptation only under the | ||||||
|           form), You must: |     terms of: (i) this License; (ii) a later version of this License with | ||||||
|  |     the same License Elements as this License; (iii) a Creative Commons | ||||||
|             a. retain the following if it is supplied by the Licensor |     jurisdiction license (either this or a later license version) that | ||||||
|                with the Licensed Material: |     contains the same License Elements as this License (e.g., | ||||||
|  |     Attribution-ShareAlike 3.0 US)); (iv) a Creative Commons Compatible | ||||||
|                  i. identification of the creator(s) of the Licensed |     License. If you license the Adaptation under one of the licenses | ||||||
|                     Material and any others designated to receive |     mentioned in (iv), you must comply with the terms of that license. If | ||||||
|                     attribution, in any reasonable manner requested by |     you license the Adaptation under the terms of any of the licenses | ||||||
|                     the Licensor (including by pseudonym if |     mentioned in (i), (ii) or (iii) (the "Applicable License"), you must | ||||||
|                     designated); |     comply with the terms of the Applicable License generally and the | ||||||
|  |     following provisions: (I) You must include a copy of, or the URI for, | ||||||
|                 ii. a copyright notice; |     the Applicable License with every copy of each Adaptation You | ||||||
|  |     Distribute or Publicly Perform; (II) You may not offer or impose any | ||||||
|                iii. a notice that refers to this Public License; |     terms on the Adaptation that restrict the terms of the Applicable | ||||||
|  |     License or the ability of the recipient of the Adaptation to exercise | ||||||
|                 iv. a notice that refers to the disclaimer of |     the rights granted to that recipient under the terms of the Applicable | ||||||
|                     warranties; |     License; (III) You must keep intact all notices that refer to the | ||||||
|  |     Applicable License and to the disclaimer of warranties with every copy | ||||||
|                  v. a URI or hyperlink to the Licensed Material to the |     of the Work as included in the Adaptation You Distribute or Publicly | ||||||
|                     extent reasonably practicable; |     Perform; (IV) when You Distribute or Publicly Perform the Adaptation, | ||||||
|  |     You may not impose any effective technological measures on the | ||||||
|             b. indicate if You modified the Licensed Material and |     Adaptation that restrict the ability of a recipient of the Adaptation | ||||||
|                retain an indication of any previous modifications; and |     from You to exercise the rights granted to that recipient under the | ||||||
|  |     terms of the Applicable License. This Section 4(b) applies to the | ||||||
|             c. indicate the Licensed Material is licensed under this |     Adaptation as incorporated in a Collection, but this does not require | ||||||
|                Public License, and include the text of, or the URI or |     the Collection apart from the Adaptation itself to be made subject to | ||||||
|                hyperlink to, this Public License. |     the terms of the Applicable License. | ||||||
|  |  c. If You Distribute, or Publicly Perform the Work or any Adaptations or | ||||||
|        2. You may satisfy the conditions in Section 3(a)(1) in any |     Collections, You must, unless a request has been made pursuant to | ||||||
|           reasonable manner based on the medium, means, and context in |     Section 4(a), keep intact all copyright notices for the Work and | ||||||
|           which You Share the Licensed Material. For example, it may be |     provide, reasonable to the medium or means You are utilizing: (i) the | ||||||
|           reasonable to satisfy the conditions by providing a URI or |     name of the Original Author (or pseudonym, if applicable) if supplied, | ||||||
|           hyperlink to a resource that includes the required |     and/or if the Original Author and/or Licensor designate another party | ||||||
|           information. |     or parties (e.g., a sponsor institute, publishing entity, journal) for | ||||||
|  |     attribution ("Attribution Parties") in Licensor's copyright notice, | ||||||
|        3. If requested by the Licensor, You must remove any of the |     terms of service or by other reasonable means, the name of such party | ||||||
|           information required by Section 3(a)(1)(A) to the extent |     or parties; (ii) the title of the Work if supplied; (iii) to the | ||||||
|           reasonably practicable. |     extent reasonably practicable, the URI, if any, that Licensor | ||||||
|  |     specifies to be associated with the Work, unless such URI does not | ||||||
|   b. ShareAlike. |     refer to the copyright notice or licensing information for the Work; | ||||||
|  |     and (iv) , consistent with Ssection 3(b), in the case of an | ||||||
|      In addition to the conditions in Section 3(a), if You Share |     Adaptation, a credit identifying the use of the Work in the Adaptation | ||||||
|      Adapted Material You produce, the following conditions also apply. |     (e.g., "French translation of the Work by Original Author," or | ||||||
|  |     "Screenplay based on original Work by Original Author"). The credit | ||||||
|        1. The Adapter's License You apply must be a Creative Commons |     required by this Section 4(c) may be implemented in any reasonable | ||||||
|           license with the same License Elements, this version or |     manner; provided, however, that in the case of a Adaptation or | ||||||
|           later, or a BY-SA Compatible License. |     Collection, at a minimum such credit will appear, if a credit for all | ||||||
|  |     contributing authors of the Adaptation or Collection appears, then as | ||||||
|        2. You must include the text of, or the URI or hyperlink to, the |     part of these credits and in a manner at least as prominent as the | ||||||
|           Adapter's License You apply. You may satisfy this condition |     credits for the other contributing authors. For the avoidance of | ||||||
|           in any reasonable manner based on the medium, means, and |     doubt, You may only use the credit required by this Section for the | ||||||
|           context in which You Share Adapted Material. |     purpose of attribution in the manner set out above and, by exercising | ||||||
|  |     Your rights under this License, You may not implicitly or explicitly | ||||||
|        3. You may not offer or impose any additional or different terms |     assert or imply any connection with, sponsorship or endorsement by the | ||||||
|           or conditions on, or apply any Effective Technological |     Original Author, Licensor and/or Attribution Parties, as appropriate, | ||||||
|           Measures to, Adapted Material that restrict exercise of the |     of You or Your use of the Work, without the separate, express prior | ||||||
|           rights granted under the Adapter's License You apply. |     written permission of the Original Author, Licensor and/or Attribution | ||||||
|  |     Parties. | ||||||
|  |  d. Except as otherwise agreed in writing by the Licensor or as may be | ||||||
| Section 4 -- Sui Generis Database Rights. |     otherwise permitted by applicable law, if You Reproduce, Distribute or | ||||||
|  |     Publicly Perform the Work either by itself or as part of any | ||||||
| Where the Licensed Rights include Sui Generis Database Rights that |     Adaptations or Collections, You must not distort, mutilate, modify or | ||||||
| apply to Your use of the Licensed Material: |     take other derogatory action in relation to the Work which would be | ||||||
|  |     prejudicial to the Original Author's honor or reputation. Licensor | ||||||
|   a. for the avoidance of doubt, Section 2(a)(1) grants You the right |     agrees that in those jurisdictions (e.g. Japan), in which any exercise | ||||||
|      to extract, reuse, reproduce, and Share all or a substantial |     of the right granted in Section 3(b) of this License (the right to | ||||||
|      portion of the contents of the database; |     make Adaptations) would be deemed to be a distortion, mutilation, | ||||||
|  |     modification or other derogatory action prejudicial to the Original | ||||||
|   b. if You include all or a substantial portion of the database |     Author's honor and reputation, the Licensor will waive or not assert, | ||||||
|      contents in a database in which You have Sui Generis Database |     as appropriate, this Section, to the fullest extent permitted by the | ||||||
|      Rights, then the database in which You have Sui Generis Database |     applicable national law, to enable You to reasonably exercise Your | ||||||
|      Rights (but not its individual contents) is Adapted Material, |     right under Section 3(b) of this License (right to make Adaptations) | ||||||
|  |     but not otherwise. | ||||||
|      including for purposes of Section 3(b); and |  | ||||||
|   c. You must comply with the conditions in Section 3(a) if You Share | 5. Representations, Warranties and Disclaimer | ||||||
|      all or a substantial portion of the contents of the database. |  | ||||||
|  | UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR | ||||||
| For the avoidance of doubt, this Section 4 supplements and does not | OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY | ||||||
| replace Your obligations under this Public License where the Licensed | KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, | ||||||
| Rights include other Copyright and Similar Rights. | INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, | ||||||
|  | FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF | ||||||
|  | LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, | ||||||
| Section 5 -- Disclaimer of Warranties and Limitation of Liability. | WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION | ||||||
|  | OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. | ||||||
|   a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE |  | ||||||
|      EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS | 6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE | ||||||
|      AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF | LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR | ||||||
|      ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, | ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES | ||||||
|      IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, | ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS | ||||||
|      WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR | BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. | ||||||
|      PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, |  | ||||||
|      ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT | 7. Termination | ||||||
|      KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT |  | ||||||
|      ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. |  a. This License and the rights granted hereunder will terminate | ||||||
|  |     automatically upon any breach by You of the terms of this License. | ||||||
|   b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE |     Individuals or entities who have received Adaptations or Collections | ||||||
|      TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, |     from You under this License, however, will not have their licenses | ||||||
|      NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, |     terminated provided such individuals or entities remain in full | ||||||
|      INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, |     compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will | ||||||
|      COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR |     survive any termination of this License. | ||||||
|      USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN |  b. Subject to the above terms and conditions, the license granted here is | ||||||
|      ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR |     perpetual (for the duration of the applicable copyright in the Work). | ||||||
|      DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR |     Notwithstanding the above, Licensor reserves the right to release the | ||||||
|      IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. |     Work under different license terms or to stop distributing the Work at | ||||||
|  |     any time; provided, however that any such election will not serve to | ||||||
|   c. The disclaimer of warranties and limitation of liability provided |     withdraw this License (or any other license that has been, or is | ||||||
|      above shall be interpreted in a manner that, to the extent |     required to be, granted under the terms of this License), and this | ||||||
|      possible, most closely approximates an absolute disclaimer and |     License will continue in full force and effect unless terminated as | ||||||
|      waiver of all liability. |     stated above. | ||||||
|  |  | ||||||
|  | 8. Miscellaneous | ||||||
| Section 6 -- Term and Termination. |  | ||||||
|  |  a. Each time You Distribute or Publicly Perform the Work or a Collection, | ||||||
|   a. This Public License applies for the term of the Copyright and |     the Licensor offers to the recipient a license to the Work on the same | ||||||
|      Similar Rights licensed here. However, if You fail to comply with |     terms and conditions as the license granted to You under this License. | ||||||
|      this Public License, then Your rights under this Public License |  b. Each time You Distribute or Publicly Perform an Adaptation, Licensor | ||||||
|      terminate automatically. |     offers to the recipient a license to the original Work on the same | ||||||
|  |     terms and conditions as the license granted to You under this License. | ||||||
|   b. Where Your right to use the Licensed Material has terminated under |  c. If any provision of this License is invalid or unenforceable under | ||||||
|      Section 6(a), it reinstates: |     applicable law, it shall not affect the validity or enforceability of | ||||||
|  |     the remainder of the terms of this License, and without further action | ||||||
|        1. automatically as of the date the violation is cured, provided |     by the parties to this agreement, such provision shall be reformed to | ||||||
|           it is cured within 30 days of Your discovery of the |     the minimum extent necessary to make such provision valid and | ||||||
|           violation; or |     enforceable. | ||||||
|  |  d. No term or provision of this License shall be deemed waived and no | ||||||
|        2. upon express reinstatement by the Licensor. |     breach consented to unless such waiver or consent shall be in writing | ||||||
|  |     and signed by the party to be charged with such waiver or consent. | ||||||
|      For the avoidance of doubt, this Section 6(b) does not affect any |  e. This License constitutes the entire agreement between the parties with | ||||||
|      right the Licensor may have to seek remedies for Your violations |     respect to the Work licensed here. There are no understandings, | ||||||
|      of this Public License. |     agreements or representations with respect to the Work not specified | ||||||
|  |     here. Licensor shall not be bound by any additional provisions that | ||||||
|   c. For the avoidance of doubt, the Licensor may also offer the |     may appear in any communication from You. This License may not be | ||||||
|      Licensed Material under separate terms or conditions or stop |     modified without the mutual written agreement of the Licensor and You. | ||||||
|      distributing the Licensed Material at any time; however, doing so |  f. The rights granted under, and the subject matter referenced, in this | ||||||
|      will not terminate this Public License. |     License were drafted utilizing the terminology of the Berne Convention | ||||||
|  |     for the Protection of Literary and Artistic Works (as amended on | ||||||
|   d. Sections 1, 5, 6, 7, and 8 survive termination of this Public |     September 28, 1979), the Rome Convention of 1961, the WIPO Copyright | ||||||
|      License. |     Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 | ||||||
|  |     and the Universal Copyright Convention (as revised on July 24, 1971). | ||||||
|  |     These rights and subject matter take effect in the relevant | ||||||
| Section 7 -- Other Terms and Conditions. |     jurisdiction in which the License terms are sought to be enforced | ||||||
|  |     according to the corresponding provisions of the implementation of | ||||||
|   a. The Licensor shall not be bound by any additional or different |     those treaty provisions in the applicable national law. If the | ||||||
|      terms or conditions communicated by You unless expressly agreed. |     standard suite of rights granted under applicable copyright law | ||||||
|  |     includes additional rights not granted under this License, such | ||||||
|   b. Any arrangements, understandings, or agreements regarding the |     additional rights are deemed to be included in the License; this | ||||||
|      Licensed Material not stated herein are separate from and |     License is not intended to restrict the license of any rights under | ||||||
|      independent of the terms and conditions of this Public License. |     applicable law. | ||||||
|  |  | ||||||
|  |  | ||||||
| Section 8 -- Interpretation. | Creative Commons Notice | ||||||
|  |  | ||||||
|   a. For the avoidance of doubt, this Public License does not, and |     Creative Commons is not a party to this License, and makes no warranty | ||||||
|      shall not be interpreted to, reduce, limit, restrict, or impose |     whatsoever in connection with the Work. Creative Commons will not be | ||||||
|      conditions on any use of the Licensed Material that could lawfully |     liable to You or any party on any legal theory for any damages | ||||||
|      be made without permission under this Public License. |     whatsoever, including without limitation any general, special, | ||||||
|  |     incidental or consequential damages arising in connection to this | ||||||
|   b. To the extent possible, if any provision of this Public License is |     license. Notwithstanding the foregoing two (2) sentences, if Creative | ||||||
|      deemed unenforceable, it shall be automatically reformed to the |     Commons has expressly identified itself as the Licensor hereunder, it | ||||||
|      minimum extent necessary to make it enforceable. If the provision |     shall have all rights and obligations of Licensor. | ||||||
|      cannot be reformed, it shall be severed from this Public License |  | ||||||
|      without affecting the enforceability of the remaining terms and |     Except for the limited purpose of indicating to the public that the | ||||||
|      conditions. |     Work is licensed under the CCPL, Creative Commons does not authorize | ||||||
|  |     the use by either party of the trademark "Creative Commons" or any | ||||||
|   c. No term or condition of this Public License will be waived and no |     related trademark or logo of Creative Commons without the prior | ||||||
|      failure to comply consented to unless expressly agreed to by the |     written consent of Creative Commons. Any permitted use will be in | ||||||
|      Licensor. |     compliance with Creative Commons' then-current trademark usage | ||||||
|  |     guidelines, as may be published on its website or otherwise made | ||||||
|   d. Nothing in this Public License constitutes or may be interpreted |     available upon request from time to time. For the avoidance of doubt, | ||||||
|      as a limitation upon, or waiver of, any privileges and immunities |     this trademark restriction does not form part of the License. | ||||||
|      that apply to the Licensor or You, including from the legal |  | ||||||
|      processes of any jurisdiction or authority. |     Creative Commons may be contacted at http://creativecommons.org/. | ||||||
|  |  | ||||||
|  |  | ||||||
| ======================================================================= |  | ||||||
|  |  | ||||||
| Creative Commons is not a party to its public |  | ||||||
| licenses. Notwithstanding, Creative Commons may elect to apply one of |  | ||||||
| its public licenses to material it publishes and in those instances |  | ||||||
| will be considered the “Licensor.” The text of the Creative Commons |  | ||||||
| public licenses is dedicated to the public domain under the CC0 Public |  | ||||||
| Domain Dedication. Except for the limited purpose of indicating that |  | ||||||
| material is shared under a Creative Commons public license or as |  | ||||||
| otherwise permitted by the Creative Commons policies published at |  | ||||||
| creativecommons.org/policies, Creative Commons does not authorize the |  | ||||||
| use of the trademark "Creative Commons" or any other trademark or logo |  | ||||||
| of Creative Commons without its prior written consent including, |  | ||||||
| without limitation, in connection with any unauthorized modifications |  | ||||||
| to any of its public licenses or any other arrangements, |  | ||||||
| understandings, or agreements concerning use of licensed material. For |  | ||||||
| the avoidance of doubt, this paragraph does not form part of the |  | ||||||
| public licenses. |  | ||||||
|  |  | ||||||
| Creative Commons may be contacted at creativecommons.org. |  | ||||||
|   | |||||||
| @@ -8,4 +8,4 @@ jungle trees mod, and big contributions by RealBadAngel. | |||||||
| Brought together into one mod and made L-systems compatible by Vanessa | Brought together into one mod and made L-systems compatible by Vanessa | ||||||
| Ezekowitz. | Ezekowitz. | ||||||
|  |  | ||||||
| Dependencies: <a href="https://forum.minetest.net/viewtopic.php?f=11&t=12999">biome_lib</a> and default | Dependencies: <a href="https://github.com/VanessaE/plantlife">plants_lib</a> and default | ||||||
|   | |||||||
							
								
								
									
										174
									
								
								biome_defs.lua
									
									
									
									
									
								
							
							
						
						| @@ -24,40 +24,6 @@ moretrees.palm_biome = { | |||||||
| 	max_count = 10, | 	max_count = 10, | ||||||
| } | } | ||||||
|  |  | ||||||
| moretrees.date_palm_biome = { |  | ||||||
| 	surface = "default:desert_sand", |  | ||||||
| 	avoid_nodes = moretrees.avoidnodes, |  | ||||||
| 	avoid_radius = 10, |  | ||||||
| 	seed_diff = 339, |  | ||||||
| 	min_elevation = -1, |  | ||||||
| 	max_elevation = 10, |  | ||||||
| 	near_nodes = {"default:water_source"}, |  | ||||||
| 	near_nodes_size = 20, |  | ||||||
| 	near_nodes_count = 100, |  | ||||||
| 	near_nodes_vertical = 20, |  | ||||||
| 	temp_min = -0.20, |  | ||||||
| 	humidity_max = 0.20, |  | ||||||
| 	rarity = 10, |  | ||||||
| 	max_count = 30, |  | ||||||
| } |  | ||||||
|  |  | ||||||
| moretrees.date_palm_biome_2 = { |  | ||||||
| 	surface = "default:desert_sand", |  | ||||||
| 	avoid_nodes = moretrees.avoidnodes, |  | ||||||
| 	avoid_radius = 10, |  | ||||||
| 	seed_diff = 340, |  | ||||||
| 	min_elevation = 11, |  | ||||||
| 	max_elevation = 30, |  | ||||||
| 	near_nodes = {"default:water_source"}, |  | ||||||
| 	near_nodes_size = 1, |  | ||||||
| 	near_nodes_count = 1, |  | ||||||
| 	near_nodes_vertical = 30, |  | ||||||
| 	temp_min = -0.20, |  | ||||||
| 	humidity_max = 0.20, |  | ||||||
| 	rarity = 10, |  | ||||||
| 	max_count = 30, |  | ||||||
| } |  | ||||||
|  |  | ||||||
| moretrees.apple_tree_biome = { | moretrees.apple_tree_biome = { | ||||||
| 	surface = "default:dirt_with_grass", | 	surface = "default:dirt_with_grass", | ||||||
| 	avoid_nodes = moretrees.avoidnodes, | 	avoid_nodes = moretrees.avoidnodes, | ||||||
| @@ -124,11 +90,20 @@ moretrees.willow_biome = { | |||||||
| 	max_count = 5, | 	max_count = 5, | ||||||
| } | } | ||||||
|  |  | ||||||
|  | moretrees.acacia_biome = { | ||||||
|  | 	surface = { "default:dirt_with_grass", "default:desert_sand" }, | ||||||
|  | 	avoid_nodes = moretrees.avoidnodes, | ||||||
|  | 	avoid_radius = 15, | ||||||
|  | 	seed_diff = 1, | ||||||
|  | 	rarity = 50, | ||||||
|  | 	max_count = 15, | ||||||
|  | 	plantlife_limit = -1, | ||||||
|  | 	humidity_min = 0.3, | ||||||
|  | 	humidity_max = 0, | ||||||
|  | } | ||||||
|  |  | ||||||
| moretrees.rubber_tree_biome = { | moretrees.rubber_tree_biome = { | ||||||
| 	surface = { | 	surface = "default:dirt_with_grass", | ||||||
| 		"default:dirt_with_grass", |  | ||||||
| 		"default:sand", |  | ||||||
| 	}, |  | ||||||
| 	avoid_nodes = moretrees.avoidnodes, | 	avoid_nodes = moretrees.avoidnodes, | ||||||
| 	avoid_radius = 10, | 	avoid_radius = 10, | ||||||
| 	seed_diff = 338, | 	seed_diff = 338, | ||||||
| @@ -143,24 +118,18 @@ moretrees.rubber_tree_biome = { | |||||||
| } | } | ||||||
|  |  | ||||||
| moretrees.jungletree_biome = { | moretrees.jungletree_biome = { | ||||||
| 	surface = { | 	surface = "default:dirt_with_grass", | ||||||
| 		"default:dirt", | 	avoid_nodes = moretrees.avoidnodes, | ||||||
| 		"default:dirt_with_grass", | 	avoid_radius = 5, | ||||||
| 		"woodsoils:dirt_with_leaves_1", |  | ||||||
| 		"woodsoils:grass_with_leaves_1", |  | ||||||
| 		"woodsoils:grass_with_leaves_2" |  | ||||||
| 	}, |  | ||||||
| 	avoid_nodes = {"moretrees:jungletree_trunk"}, |  | ||||||
| 	max_count = 12, |  | ||||||
| 	avoid_radius = 3, |  | ||||||
| 	rarity = 85, |  | ||||||
| 	seed_diff = 329, | 	seed_diff = 329, | ||||||
| 	min_elevation = 1, | 	min_elevation = -5, | ||||||
| 	near_nodes = {"default:jungletree"}, | 	max_elevation = 10, | ||||||
| 	near_nodes_size = 6, | 	temp_min = 0.25, | ||||||
| 	near_nodes_vertical = 2, | 	near_nodes = {"default:water_source"}, | ||||||
| 	near_nodes_count = 1, | 	near_nodes_size = 20, | ||||||
| 	plantlife_limit = -0.9, | 	near_nodes_count = 7, | ||||||
|  | 	rarity = 10, | ||||||
|  | 	max_count = 10, | ||||||
| } | } | ||||||
|  |  | ||||||
| moretrees.spruce_biome = { | moretrees.spruce_biome = { | ||||||
| @@ -175,12 +144,11 @@ moretrees.spruce_biome = { | |||||||
| 	max_count = 5, | 	max_count = 5, | ||||||
| } | } | ||||||
|  |  | ||||||
| moretrees.cedar_biome = { | moretrees.pine_biome = { | ||||||
| 	surface = "default:dirt_with_grass", | 	surface = "default:dirt_with_grass", | ||||||
| 	avoid_nodes = moretrees.avoidnodes, | 	avoid_nodes = moretrees.avoidnodes, | ||||||
| 	avoid_radius = 10, | 	avoid_radius = 10, | ||||||
| 	seed_diff = 336, | 	seed_diff = 336, | ||||||
| 	min_elevation = 0,  --Added to solve an issue where cedar trees would sometimes spawn deep underground |  | ||||||
| 	near_nodes = {"default:water_source"}, | 	near_nodes = {"default:water_source"}, | ||||||
| 	near_nodes_size = 15, | 	near_nodes_size = 15, | ||||||
| 	near_nodes_count = 5, | 	near_nodes_count = 5, | ||||||
| @@ -188,97 +156,6 @@ moretrees.cedar_biome = { | |||||||
| 	max_count = 10, | 	max_count = 10, | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| -- Poplar requires a lot of water. |  | ||||||
| moretrees.poplar_biome = { |  | ||||||
| 	surface = "default:dirt_with_grass", |  | ||||||
| 	avoid_nodes = moretrees.avoidnodes, |  | ||||||
| 	avoid_radius = 6, |  | ||||||
| 	seed_diff = 341, |  | ||||||
| 	min_elevation = 0, |  | ||||||
| 	max_elevation = 50, |  | ||||||
| 	near_nodes = {"default:water_source"}, |  | ||||||
| 	near_nodes_size = 15, |  | ||||||
| 	near_nodes_vertical = 5, |  | ||||||
| 	near_nodes_count = 1, |  | ||||||
| 	humidity_min = -0.7, |  | ||||||
| 	humidity_max = -1, |  | ||||||
| 	rarity = 50, |  | ||||||
| 	max_count = 15, |  | ||||||
| } |  | ||||||
|  |  | ||||||
| -- The humidity requirement it quite restrictive (apparently). |  | ||||||
| -- Spawn an occasional poplar elsewhere. |  | ||||||
| moretrees.poplar_biome_2 = { |  | ||||||
| 	surface = "default:dirt_with_grass", |  | ||||||
| 	avoid_nodes = moretrees.avoidnodes, |  | ||||||
| 	avoid_radius = 6, |  | ||||||
| 	seed_diff = 341, |  | ||||||
| 	min_elevation = 0, |  | ||||||
| 	max_elevation = 50, |  | ||||||
| 	near_nodes = {"default:water_source"}, |  | ||||||
| 	near_nodes_size = 15, |  | ||||||
| 	near_nodes_vertical = 4, |  | ||||||
| 	near_nodes_count = 10, |  | ||||||
| 	humidity_min = 0.1, |  | ||||||
| 	humidity_max = -0.6, |  | ||||||
| 	rarity = 50, |  | ||||||
| 	max_count = 1, |  | ||||||
| } |  | ||||||
|  |  | ||||||
| -- Subterranean lakes provide enough water for poplars to grow |  | ||||||
| moretrees.poplar_biome_3 = { |  | ||||||
| 	surface = "default:dirt_with_grass", |  | ||||||
| 	avoid_nodes = moretrees.avoidnodes, |  | ||||||
| 	avoid_radius = 6, |  | ||||||
| 	seed_diff = 342, |  | ||||||
| 	min_elevation = 0, |  | ||||||
| 	max_elevation = 50, |  | ||||||
| 	near_nodes = {"default:water_source"}, |  | ||||||
| 	near_nodes_size = 1, |  | ||||||
| 	near_nodes_vertical = 25, |  | ||||||
| 	near_nodes_count = 1, |  | ||||||
| 	humidity_min = -0.5, |  | ||||||
| 	humidity_max = -1, |  | ||||||
| 	rarity = 0, |  | ||||||
| 	max_count = 30, |  | ||||||
| } |  | ||||||
|  |  | ||||||
| moretrees.poplar_small_biome = { |  | ||||||
| 	surface = "default:dirt_with_grass", |  | ||||||
| 	avoid_nodes = moretrees.avoidnodes, |  | ||||||
| 	avoid_radius = 4, |  | ||||||
| 	seed_diff = 343, |  | ||||||
| 	min_elevation = 0, |  | ||||||
| 	max_elevation = 50, |  | ||||||
| 	near_nodes = {"default:water_source"}, |  | ||||||
| 	near_nodes_size = 10, |  | ||||||
| 	near_nodes_vertical = 5, |  | ||||||
| 	near_nodes_count = 1, |  | ||||||
| 	humidity_min = -0.7, |  | ||||||
| 	humidity_max = -1, |  | ||||||
| 	rarity = 50, |  | ||||||
| 	max_count = 10, |  | ||||||
| } |  | ||||||
|  |  | ||||||
| moretrees.poplar_small_biome_2 = { |  | ||||||
| 	surface = "default:dirt_with_grass", |  | ||||||
| 	avoid_nodes = moretrees.avoidnodes, |  | ||||||
| 	avoid_radius = 4, |  | ||||||
| 	seed_diff = 343, |  | ||||||
| 	min_elevation = 0, |  | ||||||
| 	max_elevation = 50, |  | ||||||
| 	near_nodes = {"default:water_source"}, |  | ||||||
| 	near_nodes_size = 10, |  | ||||||
| 	near_nodes_vertical = 4, |  | ||||||
| 	near_nodes_count = 5, |  | ||||||
| 	humidity_min = 0.1, |  | ||||||
| 	humidity_max = -0.6, |  | ||||||
| 	rarity = 50, |  | ||||||
| 	max_count = 3, |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  |  | ||||||
| moretrees.fir_biome = { | moretrees.fir_biome = { | ||||||
| 	surface = "default:dirt_with_grass", | 	surface = "default:dirt_with_grass", | ||||||
| 	avoid_nodes = moretrees.avoidnodes, | 	avoid_nodes = moretrees.avoidnodes, | ||||||
| @@ -303,3 +180,4 @@ moretrees.fir_biome_snow = { | |||||||
| 	delete_above = true, | 	delete_above = true, | ||||||
| 	spawn_replace_node = true | 	spawn_replace_node = true | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										335
									
								
								cocos_palm.lua
									
									
									
									
									
								
							
							
						
						| @@ -1,335 +0,0 @@ | |||||||
| -- © 2016, Rogier <rogier777@gmail.com> |  | ||||||
| -- Translation support |  | ||||||
| local S = minetest.get_translator("moretrees") |  | ||||||
|  |  | ||||||
| -- Some constants |  | ||||||
|  |  | ||||||
| local coconut_drop_ichance = 8 |  | ||||||
|  |  | ||||||
| -- Make the cocos palm fruit trunk a real trunk (it is generated as a fruit) |  | ||||||
| local trunk = minetest.registered_nodes["moretrees:palm_trunk"] |  | ||||||
| local ftrunk = {} |  | ||||||
| local gftrunk = {} |  | ||||||
| for k,v in pairs(trunk) do |  | ||||||
| 	ftrunk[k] = v |  | ||||||
| 	gftrunk[k] = v |  | ||||||
| end |  | ||||||
| ftrunk.tiles = {} |  | ||||||
| gftrunk.tiles = {} |  | ||||||
| for k,v in pairs(trunk.tiles) do |  | ||||||
| 	ftrunk.tiles[k] = v |  | ||||||
| 	gftrunk.tiles[k] = v |  | ||||||
| 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"} |  | ||||||
| 	) |  | ||||||
| 	for _,coconutpos in pairs(coconuts) do |  | ||||||
| 		-- minetest.dig_node(coconutpos) does not cause nearby coconuts to be dropped :-( ... |  | ||||||
| 		--minetest.dig_node(coconutpos) |  | ||||||
| 		local items = minetest.get_node_drops(minetest.get_node(coconutpos).name) |  | ||||||
| 		minetest.swap_node(coconutpos, biome_lib.air) |  | ||||||
| 		for _, itemname in pairs(items) do |  | ||||||
| 			minetest.add_item(coconutpos, itemname) |  | ||||||
| 		end |  | ||||||
| 	end |  | ||||||
| end |  | ||||||
| -- Make the different trunk types distinguishable (but barely) |  | ||||||
| ftrunk.tiles[1] = "moretrees_palm_trunk_top.png^[transformR90" |  | ||||||
| gftrunk.tiles[1] = "moretrees_palm_trunk_top.png^[transformR180" |  | ||||||
| gftrunk.description = gftrunk.description.." (gen)" |  | ||||||
| minetest.register_node("moretrees:palm_fruit_trunk", ftrunk) |  | ||||||
| minetest.register_node("moretrees:palm_fruit_trunk_gen", gftrunk) |  | ||||||
|  |  | ||||||
| local coconut_regrow_abm_spec = { |  | ||||||
| 	nodenames = { "moretrees:palm_fruit_trunk" }, |  | ||||||
| 	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" |  | ||||||
| 		) |  | ||||||
| 		-- 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 |  | ||||||
| 			-- Grow in area of 3x3 round trunk |  | ||||||
| 			local dx=math.floor(math.random(3)-2) |  | ||||||
| 			local dz=math.floor(math.random(3)-2) |  | ||||||
| 			local coconutpos = {x=pos.x+dx, y=pos.y, z=pos.z+dz} |  | ||||||
| 			local coconutnode = minetest.get_node(coconutpos) |  | ||||||
| 			if coconutnode.name == "air" then |  | ||||||
| 				minetest.swap_node(coconutpos, {name="moretrees:coconut_0"}) |  | ||||||
| 			end |  | ||||||
| 		end |  | ||||||
| 	end |  | ||||||
| } |  | ||||||
| if moretrees.coconuts_regrow then |  | ||||||
| 	minetest.register_abm(coconut_regrow_abm_spec) |  | ||||||
| end |  | ||||||
|  |  | ||||||
| -- Spawn initial coconuts |  | ||||||
|  |  | ||||||
| -- Spawn initial coconuts |  | ||||||
| -- (Instead of coconuts, a generated-palm fruit trunk is generated with the tree. This |  | ||||||
| --  ABM converts the trunk to a regular fruit trunk, and spawns some coconuts) |  | ||||||
| minetest.register_abm({ |  | ||||||
| 	nodenames = { "moretrees:palm_fruit_trunk_gen" }, |  | ||||||
| 	interval = 1, |  | ||||||
| 	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 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 count = 0 |  | ||||||
| 		for _, gen in pairs(genlist) do |  | ||||||
| 			minetest.swap_node(gen.pos, {name = "moretrees:coconut_3"}) |  | ||||||
| 			count = count + 1 |  | ||||||
| 			if count == 4 then |  | ||||||
| 				break |  | ||||||
| 			end |  | ||||||
| 		end |  | ||||||
| 	end, |  | ||||||
| }) |  | ||||||
|  |  | ||||||
| -- Register coconuts, and make them regrow |  | ||||||
|  |  | ||||||
| local coconut_growfn = function(pos, elapsed) |  | ||||||
| 	local node = minetest.get_node(pos) |  | ||||||
| 	local delay = moretrees.coconut_grow_interval |  | ||||||
| 	if not node then |  | ||||||
| 		return |  | ||||||
| 	elseif not moretrees.coconuts_regrow then |  | ||||||
| 		-- Regrowing has been turned off. Make coconust grow instantly |  | ||||||
| 		minetest.swap_node(pos, {name="moretrees:coconut_3"}) |  | ||||||
| 		return |  | ||||||
| 	elseif node.name == "moretrees:coconut_3" then |  | ||||||
| 		-- 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 |  | ||||||
| 				local items = minetest.get_node_drops(minetest.get_node(pos).name) |  | ||||||
| 				for _, itemname in pairs(items) do |  | ||||||
| 					minetest.add_item(pos, itemname) |  | ||||||
| 				end |  | ||||||
| 			end |  | ||||||
| 			minetest.swap_node(pos, biome_lib.air) |  | ||||||
| 		end |  | ||||||
| 	else |  | ||||||
| 		-- Grow coconuts to the next stage |  | ||||||
| 		local offset = string.len("moretrees:coconut_x") |  | ||||||
| 		local n = string.sub(node.name, offset) |  | ||||||
| 		minetest.swap_node(pos, {name=string.sub(node.name, 1, offset-1)..n+1}) |  | ||||||
| 	end |  | ||||||
| 	-- Don't catch up when elapsed time is large. Regular visits are needed for growth... |  | ||||||
| 	local timer = minetest.get_node_timer(pos) |  | ||||||
| 	timer:start(delay + math.random(moretrees.coconut_grow_interval)) |  | ||||||
| end |  | ||||||
|  |  | ||||||
| local coconut_starttimer = function(pos, elapsed) |  | ||||||
| 	local timer = minetest.get_node_timer(pos) |  | ||||||
| 	local base_interval = moretrees.coconut_grow_interval * 2 / 3 |  | ||||||
| 	timer:set(base_interval + math.random(base_interval), elapsed or 0) |  | ||||||
| end |  | ||||||
|  |  | ||||||
| for _,suffix in ipairs({"_0", "_1", "_2", "_3", ""}) do |  | ||||||
| 	local name |  | ||||||
| 	if suffix == "_0" then |  | ||||||
| 		name = S("Coconut Flower") |  | ||||||
| 	else |  | ||||||
| 		name = S("Coconut") |  | ||||||
| 	end |  | ||||||
| 	local drop = "" |  | ||||||
| 	local coco_group = 1 |  | ||||||
| 	local tile = "moretrees_coconut"..suffix..".png" |  | ||||||
| 	local timerfn = coconut_growfn |  | ||||||
| 	local constructfn = coconut_starttimer |  | ||||||
| 	if suffix == "_3" then |  | ||||||
| 		drop = "moretrees:coconut" |  | ||||||
| 		tile = "moretrees_coconut.png" |  | ||||||
| 	elseif suffix == "" then |  | ||||||
| 		drop = nil |  | ||||||
| 		coco_group = nil |  | ||||||
| 		timerfn = nil |  | ||||||
| 		constructfn = nil |  | ||||||
| 	end |  | ||||||
| 	local coconutdef = { |  | ||||||
| 		description = name, |  | ||||||
| 		tiles = {tile}, |  | ||||||
| 		drawtype = "plantlike", |  | ||||||
| 		paramtype = "light", |  | ||||||
| 		sunlight_propagates = true, |  | ||||||
| 		walkable = false, |  | ||||||
| 		groups = { fleshy=3, dig_immediate=3, flammable=2, moretrees_coconut=coco_group }, |  | ||||||
| 		inventory_image = tile.."^[transformR180", |  | ||||||
| 		wield_image = tile.."^[transformR180", |  | ||||||
| 		sounds = default.node_sound_defaults(), |  | ||||||
| 		drop = drop, |  | ||||||
| 		selection_box = { |  | ||||||
| 			type = "fixed", |  | ||||||
| 			fixed = {-0.3, -0.3, -0.3, 0.3, 0.3, 0.3} |  | ||||||
| 		}, |  | ||||||
| 		on_timer = timerfn, |  | ||||||
| 		on_construct = constructfn, |  | ||||||
|  |  | ||||||
| 	} |  | ||||||
| 	minetest.register_node("moretrees:coconut"..suffix, coconutdef) |  | ||||||
| end |  | ||||||
|  |  | ||||||
| -- convert exisiting cocos palms. This is a bit tricky... |  | ||||||
| -- Try to make sure that this is indeed a generated tree, and not manually-placed trunks and/or coconuts |  | ||||||
| if moretrees.coconuts_convert_existing_palms then |  | ||||||
| 	local spec = { |  | ||||||
| 		name = "moretrees:convert_existing_cocos_palms_to_regrow_coconuts", |  | ||||||
| 		nodenames = "moretrees:coconut", |  | ||||||
| 		action = function(pos, node, active_object_count, active_object_count_wider) |  | ||||||
| 			local trunks |  | ||||||
| 			local cvtrunks |  | ||||||
| 			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" |  | ||||||
| 			) |  | ||||||
| 			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" |  | ||||||
| 			) |  | ||||||
| 			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" |  | ||||||
| 			) |  | ||||||
| 			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" |  | ||||||
| 			) |  | ||||||
| 			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" |  | ||||||
| 			) |  | ||||||
| 			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" |  | ||||||
| 			) |  | ||||||
| 			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" |  | ||||||
| 			) |  | ||||||
| 			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" |  | ||||||
| 			) |  | ||||||
| 			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" |  | ||||||
| 			) |  | ||||||
| 			if #trunks ~= 0 then |  | ||||||
| 				return |  | ||||||
| 			end |  | ||||||
| 			-- Convert trunk and all coconuts nearby. Maybe convert 2 trunks, just in case... |  | ||||||
| 			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 |  | ||||||
| 			end |  | ||||||
| 		end, |  | ||||||
| 	} |  | ||||||
| 	if minetest.register_lbm then |  | ||||||
| 		minetest.register_lbm(spec) |  | ||||||
| 	else |  | ||||||
| 		spec.interval = 3691 |  | ||||||
| 		spec.chance = 10 |  | ||||||
| 		minetest.register_abm(spec) |  | ||||||
| 	end |  | ||||||
| end |  | ||||||
|  |  | ||||||
| -- If regrowing was previously disabled, but is enabled now, make sure timers are started for existing coconuts |  | ||||||
| if moretrees.coconuts_regrow then |  | ||||||
| 	local spec = { |  | ||||||
| 		name = "moretrees:restart_coconut_regrow_timer", |  | ||||||
| 		nodenames = "group:moretrees_coconut", |  | ||||||
| 		action = function(pos, node, active_object_count, active_object_count_wider) |  | ||||||
| 			local timer = minetest.get_node_timer(pos) |  | ||||||
| 			if not timer:is_started() then |  | ||||||
| 				coconut_starttimer(pos) |  | ||||||
| 			else |  | ||||||
| 				local timeout = timer:get_timeout() |  | ||||||
| 				local elapsed = timer:get_elapsed() |  | ||||||
| 				if timeout - elapsed > moretrees.coconut_grow_interval * 4/3 then |  | ||||||
| 					coconut_starttimer(pos, math.random(moretrees.coconut_grow_interval * 4/3)) |  | ||||||
| 				end |  | ||||||
| 			end |  | ||||||
| 		end, |  | ||||||
| 	} |  | ||||||
| 	if minetest.register_lbm then |  | ||||||
| 		minetest.register_lbm(spec) |  | ||||||
| 	else |  | ||||||
| 		spec.interval = 3659 |  | ||||||
| 		spec.chance = 10 |  | ||||||
| 		minetest.register_abm(spec) |  | ||||||
| 	end |  | ||||||
| end |  | ||||||
|  |  | ||||||
							
								
								
									
										168
									
								
								crafts.lua
									
									
									
									
									
								
							
							
						
						| @@ -1,8 +1,16 @@ | |||||||
| local S = minetest.get_translator("moretrees") | local S = moretrees.intllib | ||||||
|  |  | ||||||
| for i in ipairs(moretrees.treelist) do | for i in ipairs(moretrees.treelist) do | ||||||
| 	local treename = moretrees.treelist[i][1] | 	local treename = moretrees.treelist[i][1] | ||||||
|  |  | ||||||
|  | 	minetest.register_craft({ | ||||||
|  | 		output = "moretrees:"..treename.."_trunk 2", | ||||||
|  | 		recipe = { | ||||||
|  | 			{"moretrees:"..treename.."_trunk_sideways"}, | ||||||
|  | 			{"moretrees:"..treename.."_trunk_sideways"} | ||||||
|  | 		} | ||||||
|  | 	}) | ||||||
|  |  | ||||||
| 	minetest.register_craft({ | 	minetest.register_craft({ | ||||||
| 		type = "shapeless", | 		type = "shapeless", | ||||||
| 		output = "moretrees:"..treename.."_planks 4", | 		output = "moretrees:"..treename.."_planks 4", | ||||||
| @@ -11,6 +19,14 @@ for i in ipairs(moretrees.treelist) do | |||||||
| 		} | 		} | ||||||
| 	}) | 	}) | ||||||
|  |  | ||||||
|  | 	minetest.register_craft({ | ||||||
|  | 		type = "shapeless", | ||||||
|  | 		output = "moretrees:"..treename.."_planks 4", | ||||||
|  | 		recipe = { | ||||||
|  | 			"moretrees:"..treename.."_trunk_sideways" | ||||||
|  | 		} | ||||||
|  | 	}) | ||||||
|  |  | ||||||
| 	minetest.register_craft({ | 	minetest.register_craft({ | ||||||
| 		type = "fuel", | 		type = "fuel", | ||||||
| 		recipe = "moretrees:"..treename.."_sapling", | 		recipe = "moretrees:"..treename.."_sapling", | ||||||
| @@ -38,8 +54,7 @@ minetest.register_craftitem("moretrees:coconut_milk", { | |||||||
| 	description = S("Coconut Milk"), | 	description = S("Coconut Milk"), | ||||||
| 	inventory_image = "moretrees_coconut_milk_inv.png", | 	inventory_image = "moretrees_coconut_milk_inv.png", | ||||||
| 	wield_image = "moretrees_coconut_milk.png", | 	wield_image = "moretrees_coconut_milk.png", | ||||||
| 	on_use = minetest.item_eat(2, "vessels:drinking_glass"), | 	on_use = minetest.item_eat(2), | ||||||
| 	groups = {vessel = 1}, |  | ||||||
| }) | }) | ||||||
|  |  | ||||||
| minetest.register_craftitem("moretrees:raw_coconut", { | minetest.register_craftitem("moretrees:raw_coconut", { | ||||||
| @@ -48,35 +63,6 @@ minetest.register_craftitem("moretrees:raw_coconut", { | |||||||
| 	on_use = minetest.item_eat(4), | 	on_use = minetest.item_eat(4), | ||||||
| }) | }) | ||||||
|  |  | ||||||
| minetest.register_craftitem("moretrees:date", { |  | ||||||
| 	description = S("Date"), |  | ||||||
| 	inventory_image = "moretrees_date.png", |  | ||||||
| 	on_use = minetest.item_eat(1), |  | ||||||
| }) |  | ||||||
|  |  | ||||||
| minetest.register_craftitem("moretrees:date_nut_snack", { |  | ||||||
| 	description = S("Date & nut snack"), |  | ||||||
| 	inventory_image = "moretrees_date_nut_snack.png", |  | ||||||
| 	on_use = minetest.item_eat(4), |  | ||||||
| }) |  | ||||||
|  |  | ||||||
| minetest.register_craftitem("moretrees:date_nut_batter", { |  | ||||||
| 	description = S("Date-nut cake batter"), |  | ||||||
| 	inventory_image = "moretrees_date_nut_batter.png", |  | ||||||
| }) |  | ||||||
|  |  | ||||||
| minetest.register_craftitem("moretrees:date_nut_cake", { |  | ||||||
| 	description = S("Date-nut cake"), |  | ||||||
| 	inventory_image = "moretrees_date_nut_cake.png", |  | ||||||
| 	on_use = minetest.item_eat(32), |  | ||||||
| }) |  | ||||||
|  |  | ||||||
| minetest.register_craftitem("moretrees:date_nut_bar", { |  | ||||||
| 	description = S("Date-nut energy bar"), |  | ||||||
| 	inventory_image = "moretrees_date_nut_bar.png", |  | ||||||
| 	on_use = minetest.item_eat(4), |  | ||||||
| }) |  | ||||||
|  |  | ||||||
| minetest.register_craftitem("moretrees:acorn_muffin_batter", { | minetest.register_craftitem("moretrees:acorn_muffin_batter", { | ||||||
| 	description = S("Acorn Muffin batter"), | 	description = S("Acorn Muffin batter"), | ||||||
| 	inventory_image = "moretrees_acorn_muffin_batter.png", | 	inventory_image = "moretrees_acorn_muffin_batter.png", | ||||||
| @@ -94,9 +80,9 @@ minetest.register_craftitem("moretrees:spruce_nuts", { | |||||||
| 	on_use = minetest.item_eat(1), | 	on_use = minetest.item_eat(1), | ||||||
| }) | }) | ||||||
|  |  | ||||||
| minetest.register_craftitem("moretrees:cedar_nuts", { | minetest.register_craftitem("moretrees:pine_nuts", { | ||||||
| 	description = S("Roasted Cedar Cone Nuts"), | 	description = S("Roasted Pine Cone Nuts"), | ||||||
| 	inventory_image = "moretrees_cedar_nuts.png", | 	inventory_image = "moretrees_pine_nuts.png", | ||||||
| 	on_use = minetest.item_eat(1), | 	on_use = minetest.item_eat(1), | ||||||
| }) | }) | ||||||
|  |  | ||||||
| @@ -118,117 +104,11 @@ for i in ipairs(moretrees.cutting_tools) do | |||||||
| 		}, | 		}, | ||||||
| 		replacements = { | 		replacements = { | ||||||
| 			{ "moretrees:coconut", "moretrees:raw_coconut" }, | 			{ "moretrees:coconut", "moretrees:raw_coconut" }, | ||||||
|  | 			{ tool, tool } | ||||||
| 		} | 		} | ||||||
| 	}) | 	}) | ||||||
| end | 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", |  | ||||||
| 	recipe = { |  | ||||||
| 		"moretrees:date", |  | ||||||
| 		"moretrees:date", |  | ||||||
| 		"moretrees:date", |  | ||||||
| 		"moretrees:spruce_nuts", |  | ||||||
| 		"moretrees:cedar_nuts", |  | ||||||
| 		"moretrees:fir_nuts", |  | ||||||
| 	} |  | ||||||
| }) |  | ||||||
|  |  | ||||||
| -- The date-nut cake is an exceptional food item due to its highly |  | ||||||
| -- concentrated nature (32 food units). Because of that, it requires |  | ||||||
| -- many different ingredients, and, starting from the base ingredients |  | ||||||
| -- found or harvested in nature, it requires many steps to prepare. |  | ||||||
| local flour |  | ||||||
| if minetest.registered_nodes["farming:flour"] then |  | ||||||
| 	flour = "farming:flour" |  | ||||||
| else |  | ||||||
| 	flour = "moretrees:acorn_muffin_batter" |  | ||||||
| end |  | ||||||
| minetest.register_craft({ |  | ||||||
| 	type = "shapeless", |  | ||||||
| 	output = "moretrees:date_nut_batter", |  | ||||||
| 	recipe = { |  | ||||||
| 		"moretrees:date_nut_snack", |  | ||||||
| 		"moretrees:date_nut_snack", |  | ||||||
| 		"moretrees:date_nut_snack", |  | ||||||
| 		"moretrees:coconut_milk", |  | ||||||
| 		"moretrees:date_nut_snack", |  | ||||||
| 		"moretrees:raw_coconut", |  | ||||||
| 		"moretrees:coconut_milk", |  | ||||||
| 		flour, |  | ||||||
| 		"moretrees:raw_coconut", |  | ||||||
| 	}, |  | ||||||
| 	replacements = { |  | ||||||
| 		{ "moretrees:coconut_milk", "vessels:drinking_glass 2" } |  | ||||||
| 	} |  | ||||||
| }) |  | ||||||
|  |  | ||||||
| minetest.register_craft({ |  | ||||||
| 	type = "cooking", |  | ||||||
| 	output = "moretrees:date_nut_cake", |  | ||||||
| 	recipe = "moretrees:date_nut_batter", |  | ||||||
| }) |  | ||||||
|  |  | ||||||
| minetest.register_craft({ |  | ||||||
| 	type = "shapeless", |  | ||||||
| 	output = "moretrees:date_nut_bar 8", |  | ||||||
| 	recipe = {"moretrees:date_nut_cake"}, |  | ||||||
| }) |  | ||||||
|  |  | ||||||
| minetest.register_craft({ | minetest.register_craft({ | ||||||
| 	type = "shapeless", | 	type = "shapeless", | ||||||
| 	output = "moretrees:acorn_muffin_batter", | 	output = "moretrees:acorn_muffin_batter", | ||||||
| @@ -258,8 +138,8 @@ minetest.register_craft({ | |||||||
|  |  | ||||||
| minetest.register_craft({ | minetest.register_craft({ | ||||||
| 	type = "cooking", | 	type = "cooking", | ||||||
| 	output = "moretrees:cedar_nuts 4", | 	output = "moretrees:pine_nuts 4", | ||||||
| 	recipe = "moretrees:cedar_cone", | 	recipe = "moretrees:pine_cone", | ||||||
| }) | }) | ||||||
|  |  | ||||||
| minetest.register_craft({ | minetest.register_craft({ | ||||||
|   | |||||||
							
								
								
									
										762
									
								
								date_palm.lua
									
									
									
									
									
								
							
							
						
						| @@ -1,762 +0,0 @@ | |||||||
| -- Date palms. |  | ||||||
| -- |  | ||||||
| -- Date palms grow in hot and dry desert, but they require water. This makes them |  | ||||||
| -- a bit harder to find. If found in the middle of the desert, their presence |  | ||||||
| -- indicates a water source below the surface. |  | ||||||
| -- |  | ||||||
| -- As an additional feature (which can be disabled), dates automatically regrow after |  | ||||||
| -- harvesting (provided a male tree is sufficiently nearby). |  | ||||||
| -- If regrowing is enabled, then ripe dates will not hang forever. Most will disappear |  | ||||||
| -- (e.g. eaten by birds, ...), and a small fraction will drop as items. |  | ||||||
|  |  | ||||||
| -- © 2016, Rogier <rogier777@gmail.com> |  | ||||||
|  |  | ||||||
| local S = minetest.get_translator("moretrees") |  | ||||||
|  |  | ||||||
| -- Some constants |  | ||||||
|  |  | ||||||
| local dates_drop_ichance = 4 |  | ||||||
| local stems_drop_ichance = 4 |  | ||||||
| local flowers_wither_ichance = 3 |  | ||||||
|  |  | ||||||
| -- implementation |  | ||||||
|  |  | ||||||
| local dates_regrow_prob |  | ||||||
| if moretrees.dates_regrow_unpollinated_percent <= 0 then |  | ||||||
| 	dates_regrow_prob = 0 |  | ||||||
| elseif moretrees.dates_regrow_unpollinated_percent >= 100 then |  | ||||||
| 	dates_regrow_prob = 1 |  | ||||||
| else |  | ||||||
| 	dates_regrow_prob = 1 - math.pow(moretrees.dates_regrow_unpollinated_percent/100, 1/flowers_wither_ichance) |  | ||||||
| end |  | ||||||
|  |  | ||||||
| -- Make the date palm fruit trunk a real trunk (it is generated as a fruit) |  | ||||||
| local trunk = minetest.registered_nodes["moretrees:date_palm_trunk"] |  | ||||||
| local ftrunk = {} |  | ||||||
| local fftrunk = {} |  | ||||||
| local mftrunk = {} |  | ||||||
| for k,v in pairs(trunk) do |  | ||||||
| 	ftrunk[k] = v |  | ||||||
| end |  | ||||||
| ftrunk.tiles = {} |  | ||||||
| for k,v in pairs(trunk.tiles) do |  | ||||||
| 	ftrunk.tiles[k] = v |  | ||||||
| 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"} |  | ||||||
| 	) |  | ||||||
| 	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) |  | ||||||
| 		minetest.swap_node(datespos, biome_lib.air) |  | ||||||
| 		for _, itemname in pairs(items) do |  | ||||||
| 			minetest.add_item(datespos, itemname) |  | ||||||
| 		end |  | ||||||
| 	end |  | ||||||
| end |  | ||||||
| for k,v in pairs(ftrunk) do |  | ||||||
| 	mftrunk[k] = v |  | ||||||
| 	fftrunk[k] = v |  | ||||||
| end |  | ||||||
| fftrunk.tiles = {} |  | ||||||
| mftrunk.tiles = {} |  | ||||||
| for k,v in pairs(trunk.tiles) do |  | ||||||
| 	fftrunk.tiles[k] = v |  | ||||||
| 	mftrunk.tiles[k] = v |  | ||||||
| end |  | ||||||
| -- Make the different types of trunk distinguishable (but not too easily) |  | ||||||
| ftrunk.tiles[1] = "moretrees_date_palm_trunk_top.png^[transformR180" |  | ||||||
| ftrunk.description = ftrunk.description.." (gen)" |  | ||||||
| fftrunk.tiles[1] = "moretrees_date_palm_trunk_top.png^[transformR90" |  | ||||||
| mftrunk.tiles[1] = "moretrees_date_palm_trunk_top.png^[transformR-90" |  | ||||||
| minetest.register_node("moretrees:date_palm_fruit_trunk", ftrunk) |  | ||||||
| minetest.register_node("moretrees:date_palm_ffruit_trunk", fftrunk) |  | ||||||
| minetest.register_node("moretrees:date_palm_mfruit_trunk", mftrunk) |  | ||||||
|  |  | ||||||
| -- ABM to grow new date blossoms |  | ||||||
| local date_regrow_abm_spec = { |  | ||||||
| 	nodenames = { "moretrees:date_palm_ffruit_trunk", "moretrees:date_palm_mfruit_trunk" }, |  | ||||||
| 	interval = moretrees.dates_flower_interval, |  | ||||||
| 	chance = moretrees.dates_flower_chance, |  | ||||||
| 	action = function(pos, node, active_object_count, active_object_count_wider) |  | ||||||
| 		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") |  | ||||||
|  |  | ||||||
| 		-- New blossom interval increases exponentially with number of dates already hanging |  | ||||||
| 		-- In addition: if more dates are hanging, the chance of picking an empty spot decreases as well... |  | ||||||
| 		if math.random(2^#dates) <= 2 then |  | ||||||
| 			-- Grow in area of 5x5 round trunk; higher probability in 3x3 area close to trunk |  | ||||||
| 			local dx=math.floor((math.random(50)-18)/16) |  | ||||||
| 			local dz=math.floor((math.random(50)-18)/16) |  | ||||||
| 			local datepos = {x=pos.x+dx, y=pos.y, z=pos.z+dz} |  | ||||||
| 			local datenode = minetest.get_node(datepos) |  | ||||||
| 			if datenode.name == "air" then |  | ||||||
| 				if node.name == "moretrees:date_palm_ffruit_trunk" then |  | ||||||
| 					minetest.swap_node(datepos, {name="moretrees:dates_f0"}) |  | ||||||
| 				else |  | ||||||
| 					minetest.swap_node(datepos, {name="moretrees:dates_m0"}) |  | ||||||
| 				end |  | ||||||
| 			end |  | ||||||
| 		end |  | ||||||
| 	end |  | ||||||
| } |  | ||||||
| if moretrees.dates_regrow_pollinated or moretrees.dates_regrow_unpollinated_percent > 0 then |  | ||||||
| 	minetest.register_abm(date_regrow_abm_spec) |  | ||||||
| end |  | ||||||
|  |  | ||||||
| -- Choose male or female palm, and spawn initial dates |  | ||||||
| -- (Instead of dates, a dates fruit trunk is generated with the tree. This |  | ||||||
| --  ABM converts the trunk to a female or male fruit trunk, and spawns some |  | ||||||
| --  hanging dates) |  | ||||||
| minetest.register_abm({ |  | ||||||
| 	nodenames = { "moretrees:date_palm_fruit_trunk" }, |  | ||||||
| 	interval = 1, |  | ||||||
| 	chance = 1, |  | ||||||
| 	action = function(pos, node, active_object_count, active_object_count_wider) |  | ||||||
| 		local type |  | ||||||
| 		if math.random(100) <= moretrees.dates_female_percent then |  | ||||||
| 			type = "f" |  | ||||||
| 			minetest.swap_node(pos, {name="moretrees:date_palm_ffruit_trunk"}) |  | ||||||
| 		else |  | ||||||
| 			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" |  | ||||||
| 		) |  | ||||||
| 		for _,genpos in pairs(dates1) do |  | ||||||
| 			if math.random(100) <= 20 then |  | ||||||
| 				if type == "m" then |  | ||||||
| 					minetest.swap_node(genpos, {name = "moretrees:dates_n"}) |  | ||||||
| 				else |  | ||||||
| 					minetest.swap_node(genpos, {name = "moretrees:dates_f4"}) |  | ||||||
| 				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" |  | ||||||
| 		) |  | ||||||
| 		for _,genpos in pairs(dates2) do |  | ||||||
| 			if math.random(100) <= 5 then |  | ||||||
| 				if type == "m" then |  | ||||||
| 					minetest.swap_node(genpos, {name = "moretrees:dates_n"}) |  | ||||||
| 				else |  | ||||||
| 					minetest.swap_node(genpos, {name = "moretrees:dates_f4"}) |  | ||||||
| 				end |  | ||||||
| 			end |  | ||||||
| 		end |  | ||||||
| 	end, |  | ||||||
| }) |  | ||||||
|  |  | ||||||
| -- Dates growing functions. |  | ||||||
|  |  | ||||||
| -- This is a bit complex, as the purpose is to find male flowers at horizontal distances of over |  | ||||||
| -- 100 nodes. As searching such a large area is time consuming, this is optimized in four ways: |  | ||||||
| -- - The search result (the locations of male trees) is cached, so that it can be used again |  | ||||||
| -- - Only 1/9th of the desired area is searched at a time. A new search is only performed if no male |  | ||||||
| --   flowers are found in the previously searched parts. |  | ||||||
| -- - Search results are shared with other female palms nearby. |  | ||||||
| -- - If previous searches for male palms have consumed too much CPU time, the search is skipped |  | ||||||
| --   (This means no male palms will be found, and the pollination of the flowers affected will be |  | ||||||
| --   delayed. If this happens repeatedly, eventually, the female flowers will wither...) |  | ||||||
| -- A caching method was selected that is suited for the case where most date trees are long-lived, |  | ||||||
| -- and where the number of trees nearby is limited: |  | ||||||
| -- - Locations of male palms are stored as metadata for every female palm. This means that a player |  | ||||||
| --   visiting a remote area with some date palms will not cause extensive searches for male palms as |  | ||||||
| --   long overdue blossoming ABMs are triggered for every date palm. |  | ||||||
| -- - Even when male palms *are* cut down, a cache refill will only be performed if the cached results do not |  | ||||||
| --   contain a male palm with blossoms. |  | ||||||
| -- The method will probably perform suboptimally: |  | ||||||
| -- - If female palms are frequently chopped down and replanted. |  | ||||||
| --   Freshly grown palms will need to search for male palms again |  | ||||||
| --   (this is mitigated by the long blossoming interval, which increases the chance that search |  | ||||||
| --    results have already been shared) |  | ||||||
| -- - If an area contains a large number of male and female palms. |  | ||||||
| --   In this area, every female palm will have an almost identical list of male palm locations |  | ||||||
| --   as metadata. |  | ||||||
| -- - If all male palms within range of a number of female palms have been chopped down (with possibly |  | ||||||
| --   new ones planted). Although an attempt was made to share search results in this case as well, |  | ||||||
| --   a number of similar searches will unavoidably be performed by the different female palms. |  | ||||||
| -- - If no male palms are in range of a female palm. In that case, there will be frequent searches |  | ||||||
| --   for newly-grown male palms. |  | ||||||
|  |  | ||||||
| -- Search statistics - used to limit the search load. |  | ||||||
| local sect_search_stats = {}		-- Search statistics - server-wide |  | ||||||
| local function reset_sect_search_stats() |  | ||||||
| 	sect_search_stats.count = 0		-- # of searches |  | ||||||
| 	sect_search_stats.skip = 0		-- # of times skipped |  | ||||||
| 	sect_search_stats.sum = 0		-- total time spent |  | ||||||
| 	sect_search_stats.min = 999999999	-- min time spent |  | ||||||
| 	sect_search_stats.max = 0		-- max time spent |  | ||||||
| end |  | ||||||
| reset_sect_search_stats() |  | ||||||
| sect_search_stats.last_us = 0			-- last time a search was done (microseconds, max: 2^32) |  | ||||||
| sect_search_stats.last_s = 0			-- last time a search was done (system time in seconds) |  | ||||||
|  |  | ||||||
| -- Find male trunks in one section (=1/9 th) of the searchable area. |  | ||||||
| -- sect is -4 to 4, where 0 is the center section |  | ||||||
| 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 = minetest.get_us_time() |  | ||||||
| 	local t0s = os.time() |  | ||||||
|  |  | ||||||
| 	-- Compute elapsed time since last search. |  | ||||||
| 	-- Unfortunately, the time value wraps after about 71 minutes (2^32 microseconds), |  | ||||||
| 	-- so it must be corrected to obtain the actual elapsed time. |  | ||||||
| 	if t0us < sect_search_stats.last_us then |  | ||||||
| 		-- Correct a simple wraparound. |  | ||||||
| 		-- This is not sufficient, as the time value may have wrapped more than once... |  | ||||||
| 		sect_search_stats.last_us = sect_search_stats.last_us - 2^32 |  | ||||||
| 	end |  | ||||||
| 	if t0s - sect_search_stats.last_s > 2^32/1000000 then |  | ||||||
| 		-- One additional correction is enough for our purposes. |  | ||||||
| 		-- For exact results, more corrections may be needed though... |  | ||||||
| 		-- (and even not applying this correction at all would still only yield |  | ||||||
| 		--  a minimal risk of a non-serious miscalculation...) |  | ||||||
| 		sect_search_stats.last_us = sect_search_stats.last_us - 2^32 |  | ||||||
| 	end |  | ||||||
|  |  | ||||||
| 	-- Skip the search if it is consuming too much CPU time |  | ||||||
| 	if sect_search_stats.count > 0 and moretrees.dates_blossom_search_iload > 0 |  | ||||||
| 			and sect_search_stats.sum / sect_search_stats.count > moretrees.dates_blossom_search_time_treshold |  | ||||||
| 			and t0us - sect_search_stats.last_us < moretrees.dates_blossom_search_iload * (sect_search_stats.sum / sect_search_stats.count) then |  | ||||||
| 		sect_search_stats.skip = sect_search_stats.skip + 1 |  | ||||||
| 		return nil |  | ||||||
| 	end |  | ||||||
|  |  | ||||||
| 	local basevec = { x = ftpos.x + 2 * sect.x * sect_hr, |  | ||||||
| 			  y = ftpos.y, |  | ||||||
| 			  z = ftpos.z + 2 * sect.z * sect_hr} |  | ||||||
| 	-- find_nodes_in_area is limited to 82^3, make sure to not overrun it |  | ||||||
| 	local sizevec = { x = sect_hr, y = sect_vr, z = sect_hr } |  | ||||||
| 	if sect_hr * sect_hr * sect_vr > 41^3 then |  | ||||||
| 		sizevec = vector.apply(sizevec, function(a) return math.min(a, 41) end) |  | ||||||
| 	end |  | ||||||
|  |  | ||||||
| 	local all_palms = minetest.find_nodes_in_area( |  | ||||||
| 				vector.subtract(basevec, sizevec), |  | ||||||
| 				vector.add(basevec, sizevec), |  | ||||||
| 				{"moretrees:date_palm_mfruit_trunk", "moretrees:date_palm_ffruit_trunk"}) |  | ||||||
|  |  | ||||||
| 	-- Collect different palms in separate lists. |  | ||||||
| 	local female_palms = {} |  | ||||||
| 	local male_palms = {} |  | ||||||
| 	local all_male_palms = {} |  | ||||||
| 	for _, pos in pairs(all_palms) do |  | ||||||
| 		if pos.x ~= ftpos.x or pos.y ~= ftpos.y or pos.z ~= ftpos.z then |  | ||||||
| 			local node = minetest.get_node(pos) |  | ||||||
| 			if node and node.name == "moretrees:date_palm_ffruit_trunk" then |  | ||||||
| 				table.insert(female_palms,pos) |  | ||||||
| 			elseif node then |  | ||||||
| 				table.insert(all_male_palms,pos) |  | ||||||
| 				-- In sector 0, all palms are of interest. |  | ||||||
| 				-- In other sectors, forget about palms that are too far away. |  | ||||||
| 				if sect == 0 then |  | ||||||
| 					table.insert(male_palms,pos) |  | ||||||
| 				else |  | ||||||
| 					local ssq = 0 |  | ||||||
| 					for _, c in pairs({"x", "z"}) do |  | ||||||
| 						local dc = pos[c] - ftpos[c] |  | ||||||
| 						ssq = ssq + dc * dc |  | ||||||
| 					end |  | ||||||
| 					if math.sqrt(ssq) <= r then |  | ||||||
| 						table.insert(male_palms,pos) |  | ||||||
| 					end |  | ||||||
| 				end |  | ||||||
| 			end |  | ||||||
| 		end |  | ||||||
| 	end |  | ||||||
|  |  | ||||||
| 	-- Update search statistics |  | ||||||
| 	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) |  | ||||||
| 		t0us = t0us - 2^32 |  | ||||||
| 	end |  | ||||||
| 	sect_search_stats.last_us = t0us |  | ||||||
| 	sect_search_stats.last_s = t0s |  | ||||||
| 	sect_search_stats.count = sect_search_stats.count + 1 |  | ||||||
| 	sect_search_stats.sum = sect_search_stats.sum + t1us-t0us |  | ||||||
| 	if t1us - t0us < sect_search_stats.min then |  | ||||||
| 		sect_search_stats.min = t1us - t0us |  | ||||||
| 	end |  | ||||||
| 	if t1us - t0us > sect_search_stats.max then |  | ||||||
| 		sect_search_stats.max = t1us - t0us |  | ||||||
| 	end |  | ||||||
|  |  | ||||||
| 	return male_palms, female_palms, all_male_palms |  | ||||||
| end |  | ||||||
|  |  | ||||||
| local function dates_print_search_stats(log) |  | ||||||
| 	local stats |  | ||||||
| 	if sect_search_stats.count > 0 then |  | ||||||
| 		stats = string.format("Male date tree searching stats: searches: %d/%d:  average: %d µs  (%d..%d)", |  | ||||||
| 			sect_search_stats.count, sect_search_stats.count + sect_search_stats.skip, |  | ||||||
| 			sect_search_stats.sum/sect_search_stats.count, sect_search_stats.min, sect_search_stats.max) |  | ||||||
| 	else |  | ||||||
| 		stats = string.format("Male date tree searching stats: searches: 0/0:  average: (no searches yet)") |  | ||||||
| 	end |  | ||||||
| 	if log then |  | ||||||
| 		minetest.log("action", "[moretrees] " .. stats) |  | ||||||
| 	end |  | ||||||
| 	return true, stats |  | ||||||
| end |  | ||||||
|  |  | ||||||
| minetest.register_chatcommand("dates_stats", { |  | ||||||
| 	description = "Print male date palm search statistics", |  | ||||||
| 	params = "|chat|log|reset", |  | ||||||
| 	privs = { server = true }, |  | ||||||
| 	func = function(name, param) |  | ||||||
| 		param = string.lower(param:gsub("%s+", "")) |  | ||||||
| 		if param == "" or param == "chat" then |  | ||||||
| 			return dates_print_search_stats(false) |  | ||||||
| 		elseif param == "log" then |  | ||||||
| 			return dates_print_search_stats(true) |  | ||||||
| 		elseif param == "reset" then |  | ||||||
| 			reset_sect_search_stats() |  | ||||||
| 			return true |  | ||||||
| 		else |  | ||||||
| 			return false, "Invalid subcommand; expected: '' or 'chat' or 'log' or 'reset'" |  | ||||||
| 		end |  | ||||||
| 	end, |  | ||||||
| }) |  | ||||||
|  |  | ||||||
| -- Find the female trunk near the female flowers to be pollinated |  | ||||||
| local function find_female_trunk(fbpos) |  | ||||||
| 	local trunks = minetest.find_nodes_in_area({x=fbpos.x-2, y=fbpos.y, z=fbpos.z-2}, |  | ||||||
| 						{x=fbpos.x+2, y=fbpos.y, z=fbpos.z+2}, |  | ||||||
| 						"moretrees:date_palm_ffruit_trunk") |  | ||||||
| 	local ftpos |  | ||||||
| 	local d = 99 |  | ||||||
| 	for x, pos in pairs(trunks) do |  | ||||||
| 		local ssq = 0 |  | ||||||
| 		for _, c in pairs({"x", "z"}) do |  | ||||||
| 			local dc = pos[c] - fbpos[c] |  | ||||||
| 			ssq = ssq + dc * dc |  | ||||||
| 		end |  | ||||||
| 		if math.sqrt(ssq) < d then |  | ||||||
| 			ftpos = pos |  | ||||||
| 			d = math.sqrt(ssq) |  | ||||||
| 		end |  | ||||||
| 	end |  | ||||||
| 	return ftpos |  | ||||||
| end |  | ||||||
|  |  | ||||||
| -- Find male blossom near a male trunk, |  | ||||||
| -- the male blossom must be in range of a specific female blossom as well |  | ||||||
| local function find_male_blossom_near_trunk(fbpos, mtpos) |  | ||||||
| 	local r = moretrees.dates_pollination_distance |  | ||||||
| 	local blossoms = minetest.find_nodes_in_area({x=mtpos.x-2, y=mtpos.y, z=mtpos.z-2}, |  | ||||||
| 						{x=mtpos.x+2, y=mtpos.y, z=mtpos.z+2}, |  | ||||||
| 						"moretrees:dates_m0") |  | ||||||
| 	for x, mbpos in pairs(blossoms) do |  | ||||||
| 		local ssq = 0 |  | ||||||
| 		for _, c in pairs({"x", "z"}) do |  | ||||||
| 			local dc = mbpos[c] - fbpos[c] |  | ||||||
| 			ssq = ssq + dc * dc |  | ||||||
| 		end |  | ||||||
| 		if math.sqrt(ssq) <= r then |  | ||||||
| 			return mbpos |  | ||||||
| 		end |  | ||||||
| 	end |  | ||||||
|  |  | ||||||
| end |  | ||||||
|  |  | ||||||
| -- Find a male blossom in range of a specific female blossom, |  | ||||||
| -- using a nested list of male blossom positions |  | ||||||
| local function find_male_blossom_in_mpalms(ftpos, fbpos, mpalms) |  | ||||||
| 	-- Process the elements of mpalms.sect (index -4 .. 4) in random order |  | ||||||
| 	-- First, compute the order in which the sectors will be searched |  | ||||||
| 	local sect_index = {} |  | ||||||
| 	local sect_rnd = {} |  | ||||||
| 	for i = -4,4 do |  | ||||||
| 		local n = math.random(1023) |  | ||||||
| 		sect_index[n] =  i |  | ||||||
| 		table.insert(sect_rnd, n) |  | ||||||
| 	end |  | ||||||
| 	table.sort(sect_rnd) |  | ||||||
|  |  | ||||||
| 	-- Search the sectors |  | ||||||
| 	local sect_old = 0 |  | ||||||
| 	local sect_time = minetest.get_gametime() |  | ||||||
| 	for _, n in pairs(sect_rnd) do |  | ||||||
| 		-- Record the oldest sector, so that it can be searched if no male |  | ||||||
| 		-- blossoms were found |  | ||||||
| 		if not mpalms.sect_time[sect_index[n]] then |  | ||||||
| 			sect_old = sect_index[n] |  | ||||||
| 			sect_time = 0 |  | ||||||
| 		elseif mpalms.sect_time[sect_index[n]] < sect_time then |  | ||||||
| 			sect_old = sect_index[n] |  | ||||||
| 			sect_time = mpalms.sect_time[sect_index[n]] |  | ||||||
| 		end |  | ||||||
| 		if mpalms.sect[sect_index[n]] and #mpalms.sect[sect_index[n]] then |  | ||||||
| 			for px, mtpos in pairs(mpalms.sect[sect_index[n]]) do |  | ||||||
| 				local node = minetest.get_node(mtpos) |  | ||||||
| 				if node and node.name == "moretrees:date_palm_mfruit_trunk" then |  | ||||||
| 					local mbpos = find_male_blossom_near_trunk(fbpos, mtpos) |  | ||||||
| 					if mbpos then |  | ||||||
| 						return mbpos |  | ||||||
| 					end |  | ||||||
| 				elseif node and node.name ~= "ignore" then |  | ||||||
| 					-- no more male trunk here. |  | ||||||
| 					mpalms.sect[sect_index[n]][px] = nil |  | ||||||
| 				end |  | ||||||
| 			end |  | ||||||
| 		end |  | ||||||
| 	end |  | ||||||
| 	return nil, sect_old |  | ||||||
| end |  | ||||||
|  |  | ||||||
| -- Find a male blossom in range of a specific female blossom, |  | ||||||
| -- using the cache associated with the given female trunk |  | ||||||
| -- If necessary, recompute part of the cache |  | ||||||
| local last_search_result = {} |  | ||||||
| local function find_male_blossom_with_ftrunk(fbpos,ftpos) |  | ||||||
| 	local meta = minetest.get_meta(ftpos) |  | ||||||
| 	local mpalms |  | ||||||
| 	local cache_changed = true |  | ||||||
|  |  | ||||||
| 	-- Load cache. If distance has changed, start with empty cache instead. |  | ||||||
| 	local mpalms_dist = meta:get_int("male_palms_dist") |  | ||||||
| 	if mpalms_dist and mpalms_dist == moretrees.dates_pollination_distance then |  | ||||||
| 		mpalms = meta:get_string("male_palms") |  | ||||||
| 		if mpalms and mpalms ~= "" then |  | ||||||
| 			mpalms = minetest.deserialize(mpalms) |  | ||||||
| 			cache_changed = false |  | ||||||
| 		end |  | ||||||
| 	end |  | ||||||
| 	if not mpalms or not mpalms.sect then |  | ||||||
| 		mpalms = {} |  | ||||||
| 		mpalms.sect = {} |  | ||||||
| 		mpalms.sect_time = {} |  | ||||||
| 		meta:set_int("male_palms_dist", moretrees.dates_pollination_distance) |  | ||||||
| 		cache_changed = true |  | ||||||
| 	end |  | ||||||
| 	local fpalms_list |  | ||||||
| 	local all_mpalms_list |  | ||||||
| 	local sector0_searched = false |  | ||||||
|  |  | ||||||
| 	-- Always make sure that sector 0 is cached |  | ||||||
| 	if not mpalms.sect[0] then |  | ||||||
| 		mpalms.sect[0], fpalms_list, all_mpalms_list = find_fruit_trunks_near(ftpos, {x = 0, z = 0}) |  | ||||||
| 		mpalms.sect_time[0] = minetest.get_gametime() |  | ||||||
| 		sector0_searched = true |  | ||||||
| 		cache_changed = true |  | ||||||
| 		last_search_result.female = fpalms_list |  | ||||||
| 		last_search_result.male = all_mpalms_list |  | ||||||
| 	end |  | ||||||
|  |  | ||||||
| 	-- Find male palms |  | ||||||
| 	local mbpos, sect_old = find_male_blossom_in_mpalms(ftpos, fbpos, mpalms) |  | ||||||
|  |  | ||||||
| 	-- If not found, (re)generate the cache for an additional sector. But don't search it yet (for performance reasons) |  | ||||||
| 	-- (Use the globally cached results if possible) |  | ||||||
| 	if not mbpos and not sector0_searched then |  | ||||||
| 		if not mpalms.sect_time[0] or mpalms.sect_time[0] == 0 or math.random(3) == 1 then |  | ||||||
| 			-- Higher probability of re-searching the center sector |  | ||||||
| 			sect_old = 0 |  | ||||||
| 		end |  | ||||||
| 		-- Use globally cached result if possible |  | ||||||
| 		mpalms.sect[sect_old] = nil |  | ||||||
| 		if sect_old == 0 and mpalms.sect_time[0] and mpalms.sect_time[0] > 0 |  | ||||||
| 				and last_search_result.male and #last_search_result.male then |  | ||||||
| 			for _, pos in pairs(last_search_result.female) do |  | ||||||
| 				if pos.x == ftpos.x and pos.y == ftpos.y and pos.z == ftpos.z then |  | ||||||
| 					mpalms.sect[sect_old] = last_search_result.male |  | ||||||
| 					-- Next time, don't use the cached result |  | ||||||
| 					mpalms.sect_time[sect_old] = nil |  | ||||||
| 					cache_changed = true |  | ||||||
| 				end |  | ||||||
| 			end |  | ||||||
| 		end |  | ||||||
| 		-- Else do a new search |  | ||||||
| 		if not mpalms.sect[sect_old] then |  | ||||||
| 			mpalms.sect[sect_old], fpalms_list, all_mpalms_list = find_fruit_trunks_near(ftpos, {x = (sect_old + 4) % 3 - 1, z = (sect_old + 4) / 3 - 1}) |  | ||||||
| 			cache_changed = true |  | ||||||
| 			if sect_old == 0 then |  | ||||||
| 				-- Save the results if it is sector 0 |  | ||||||
| 				-- (chance of reusing results from another sector are smaller) |  | ||||||
| 				last_search_result.female = fpalms_list |  | ||||||
| 				last_search_result.male = all_mpalms_list |  | ||||||
| 			end |  | ||||||
| 			if mpalms.sect[sect_old] then |  | ||||||
| 				mpalms.sect_time[sect_old] = minetest.get_gametime() |  | ||||||
| 			else |  | ||||||
| 				mpalms.sect_time[sect_old] = nil |  | ||||||
| 			end |  | ||||||
| 		end |  | ||||||
| 	end |  | ||||||
|  |  | ||||||
| 	-- Share search results with other female trunks in the same area |  | ||||||
| 	-- Note that the list of female trunks doesn't (shouldn't :-) contain the current female trunk. |  | ||||||
| 	if fpalms_list and #fpalms_list and #all_mpalms_list then |  | ||||||
| 		local all_mpalms = {} |  | ||||||
| 		all_mpalms.sect = {} |  | ||||||
| 		all_mpalms.sect_time = {} |  | ||||||
| 		all_mpalms.sect[0] = all_mpalms_list |  | ||||||
| 		-- Don't set sect_time[0], so that the cached sector will be re-searched soon (if necessary) |  | ||||||
| 		local all_mpalms_serialized = minetest.serialize(all_mpalms) |  | ||||||
| 		for _, pos in pairs(fpalms_list) do |  | ||||||
| 			local fmeta = minetest.get_meta(pos) |  | ||||||
| 			local fdist = fmeta:get_int("male_palms_dist") |  | ||||||
| 			if not fdist or fdist ~= moretrees.dates_pollination_distance then |  | ||||||
| 				fmeta:set_string("male_palms", all_mpalms_serialized) |  | ||||||
| 				fmeta:set_int("male_palms_dist", moretrees.dates_pollination_distance) |  | ||||||
| 			end |  | ||||||
| 		end |  | ||||||
| 	end |  | ||||||
|  |  | ||||||
| 	-- Save cache. |  | ||||||
| 	if cache_changed then |  | ||||||
| 		meta:set_string("male_palms", minetest.serialize(mpalms)) |  | ||||||
| 	end |  | ||||||
|  |  | ||||||
| 	return mbpos |  | ||||||
| end |  | ||||||
|  |  | ||||||
| -- Find a male blossom in range of a specific female blossom |  | ||||||
| local function find_male_blossom(fbpos) |  | ||||||
| 	local ftpos = find_female_trunk(fbpos) |  | ||||||
| 	if ftpos then |  | ||||||
| 		return find_male_blossom_with_ftrunk(fbpos, ftpos) |  | ||||||
| 	end |  | ||||||
| 	return nil |  | ||||||
| end |  | ||||||
|  |  | ||||||
| -- Growing function for dates |  | ||||||
| local dates_growfn = function(pos, elapsed) |  | ||||||
| 	local node = minetest.get_node(pos) |  | ||||||
| 	local delay = moretrees.dates_grow_interval |  | ||||||
| 	local action |  | ||||||
| 	if not node then |  | ||||||
| 		return |  | ||||||
| 	elseif not moretrees.dates_regrow_pollinated and dates_regrow_prob == 0 then |  | ||||||
| 		-- Regrowing of dates is disabled. |  | ||||||
| 		if string.find(node.name, "moretrees:dates_f") then |  | ||||||
| 			minetest.swap_node(pos, {name="moretrees:dates_f4"}) |  | ||||||
| 		elseif string.find(node.name, "moretrees:dates_m") then |  | ||||||
| 			minetest.swap_node(pos, {name="moretrees:dates_n"}) |  | ||||||
| 		else |  | ||||||
| 			minetest.swap_node(pos, biome_lib.air) |  | ||||||
| 		end |  | ||||||
| 		return |  | ||||||
| 	elseif node.name == "moretrees:dates_f0" and math.random(100) <= 100 * dates_regrow_prob then |  | ||||||
| 		-- Dates grow unpollinated |  | ||||||
| 		minetest.swap_node(pos, {name="moretrees:dates_f1"}) |  | ||||||
| 		action = "nopollinate" |  | ||||||
| 	elseif node.name == "moretrees:dates_f0" and moretrees.dates_regrow_pollinated and find_male_blossom(pos) then |  | ||||||
| 		-- Pollinate flowers |  | ||||||
| 		minetest.swap_node(pos, {name="moretrees:dates_f1"}) |  | ||||||
| 		action = "pollinate" |  | ||||||
| 	elseif string.match(node.name, "0$") then |  | ||||||
| 		-- Make female unpollinated and male flowers last a bit longer |  | ||||||
| 		if math.random(flowers_wither_ichance) == 1 then |  | ||||||
| 			if node.name == "moretrees:dates_f0" then |  | ||||||
| 				minetest.swap_node(pos, {name="moretrees:dates_fn"}) |  | ||||||
| 			else |  | ||||||
| 				minetest.swap_node(pos, {name="moretrees:dates_n"}) |  | ||||||
| 			end |  | ||||||
| 			action = "wither" |  | ||||||
| 		else |  | ||||||
| 			action = "nowither" |  | ||||||
| 		end |  | ||||||
| 	elseif node.name == "moretrees:dates_f4" then |  | ||||||
| 		-- Remove dates, and optionally drop them as items |  | ||||||
| 		if math.random(dates_drop_ichance) == 1 then |  | ||||||
| 			if moretrees.dates_item_drop_ichance > 0 and math.random(moretrees.dates_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) |  | ||||||
| 				end |  | ||||||
| 			end |  | ||||||
| 			minetest.swap_node(pos, {name="moretrees:dates_n"}) |  | ||||||
| 			action = "drop" |  | ||||||
| 		else |  | ||||||
| 			action = "nodrop" |  | ||||||
| 		end |  | ||||||
| 	elseif string.match(node.name, "n$") then |  | ||||||
| 		-- Remove stems. |  | ||||||
| 		if math.random(stems_drop_ichance) == 1 then |  | ||||||
| 			minetest.swap_node(pos, biome_lib.air) |  | ||||||
| 			return "stemdrop" |  | ||||||
| 		end |  | ||||||
| 		action = "nostemdrop" |  | ||||||
| 	else |  | ||||||
| 		-- Grow dates |  | ||||||
| 		local offset = 18 |  | ||||||
| 		local n = string.sub(node.name, offset) |  | ||||||
| 		minetest.swap_node(pos, {name=string.sub(node.name, 1, offset-1)..n+1}) |  | ||||||
| 		action = "grow" |  | ||||||
| 	end |  | ||||||
| 	-- Don't catch up when elapsed time is large. Regular visits are needed for growth... |  | ||||||
| 	local timer = minetest.get_node_timer(pos) |  | ||||||
| 	timer:start(delay + math.random(moretrees.dates_grow_interval)) |  | ||||||
| 	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 = minetest.get_us_time() |  | ||||||
| 	local action = dates_growfn(pos, elapsed) |  | ||||||
| 	local t1 = minetest.get_us_time() |  | ||||||
| 	if t1 < t0 then |  | ||||||
| 		t1 = t1 + 2^32 |  | ||||||
| 	end |  | ||||||
| 	stat.count = stat.count + 1 |  | ||||||
| 	if not stat[action] then |  | ||||||
| 		stat[action] = {} |  | ||||||
| 		stat[action].count = 0 |  | ||||||
| 		stat[action].sum = 0 |  | ||||||
| 		stat[action].min = 9999999999 |  | ||||||
| 		stat[action].max = 0 |  | ||||||
| 	end |  | ||||||
| 	stat[action].count = stat[action].count + 1 |  | ||||||
| 	stat[action].sum = stat[action].sum + t1-t0 |  | ||||||
| 	if t1-t0 < stat[action].min then |  | ||||||
| 		stat[action].min = t1-t0 |  | ||||||
| 	end |  | ||||||
| 	if t1-t0 > stat[action].max then |  | ||||||
| 		stat[action].max = t1-t0 |  | ||||||
| 	end |  | ||||||
|  |  | ||||||
| 	if stat.count % 10 == 0 then |  | ||||||
| 		io.write(".") |  | ||||||
| 		io.flush() |  | ||||||
| 	end |  | ||||||
| 	if stat.count % 100 == 0 then |  | ||||||
| 		print(string.format("Date grow statistics %5d:", stat.count)) |  | ||||||
| 		local sum = 0 |  | ||||||
| 		local count = 0 |  | ||||||
| 		if sect_search_stats.count > 0 and stat.pollinate and stat.pollinate.count > 0 then |  | ||||||
| 			print(string.format("\t%-12s: %6d (%4.1f%%): %6dus (%d..%d)", |  | ||||||
| 				"search", sect_search_stats.count, |  | ||||||
| 				100*sect_search_stats.count/stat.pollinate.count, |  | ||||||
| 				sect_search_stats.sum/sect_search_stats.count, |  | ||||||
| 				sect_search_stats.min, sect_search_stats.max)) |  | ||||||
| 		else |  | ||||||
| 			print(string.format("\t%-12s: %6d (%4.1f%%): %6dus (%d..%d)", |  | ||||||
| 				"search", sect_search_stats.count, |  | ||||||
| 				0, 0, 0, 0)) |  | ||||||
| 		end |  | ||||||
| 		for action,data in pairs(stat) do |  | ||||||
| 			if action ~= "count" then |  | ||||||
| 				count = count + data.count |  | ||||||
| 				sum = sum + data.sum |  | ||||||
| 				print(string.format("\t%-12s: %6d (%4.1f%%): %6dus (%d..%d)", |  | ||||||
| 					action, data.count, |  | ||||||
| 					100*data.count/stat.count, data.sum/data.count, |  | ||||||
| 					data.min, data.max)) |  | ||||||
| 			end |  | ||||||
| 		end |  | ||||||
| 		print(string.format("\t%-12s: %6d ( 100%%): %6dus", |  | ||||||
| 			"TOTAL", count, sum/count)) |  | ||||||
| 	end |  | ||||||
| end |  | ||||||
| --]] |  | ||||||
|  |  | ||||||
| -- Register dates |  | ||||||
|  |  | ||||||
| local dates_starttimer = function(pos, elapsed) |  | ||||||
| 	local timer = minetest.get_node_timer(pos) |  | ||||||
| 	local base_interval = moretrees.dates_grow_interval * 2 / 3 |  | ||||||
| 	timer:set(base_interval + math.random(base_interval), elapsed or 0) |  | ||||||
| end |  | ||||||
|  |  | ||||||
| local dates_drop = { |  | ||||||
| 	items = { |  | ||||||
| 		{items = { "moretrees:date" }}, |  | ||||||
| 		{items = { "moretrees:date" }}, |  | ||||||
| 		{items = { "moretrees:date" }}, |  | ||||||
| 		{items = { "moretrees:date" }}, |  | ||||||
| 		{items = { "moretrees:date" }, rarity = 2 }, |  | ||||||
| 		{items = { "moretrees:date" }, rarity = 2 }, |  | ||||||
| 		{items = { "moretrees:date" }, rarity = 2 }, |  | ||||||
| 		{items = { "moretrees:date" }, rarity = 2 }, |  | ||||||
| 		{items = { "moretrees:date" }, rarity = 5 }, |  | ||||||
| 		{items = { "moretrees:date" }, rarity = 5 }, |  | ||||||
| 		{items = { "moretrees:date" }, rarity = 5 }, |  | ||||||
| 		{items = { "moretrees:date" }, rarity = 5 }, |  | ||||||
| 		{items = { "moretrees:date" }, rarity = 20 }, |  | ||||||
| 		{items = { "moretrees:date" }, rarity = 20 }, |  | ||||||
| 		{items = { "moretrees:date" }, rarity = 20 }, |  | ||||||
| 		{items = { "moretrees:date" }, rarity = 20 }, |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| for _,suffix in ipairs({"f0", "f1", "f2", "f3", "f4", "m0", "fn", "n"}) do |  | ||||||
| 	local name |  | ||||||
| 	if suffix == "f0" or suffix == "m0" then |  | ||||||
| 		name = S("Date Flowers") |  | ||||||
| 	elseif suffix == "n" or suffix == "fn" then |  | ||||||
| 		name = S("Date Stem") |  | ||||||
| 	else |  | ||||||
| 		name = S("Dates") |  | ||||||
| 	end |  | ||||||
| 	local dropfn = suffix == "f4" and dates_drop or "" |  | ||||||
| 	local datedef = { |  | ||||||
| 		description = name, |  | ||||||
| 		tiles = {"moretrees_dates_"..suffix..".png"}, |  | ||||||
| 		visual_scale = 2, |  | ||||||
| 		drawtype = "plantlike", |  | ||||||
| 		paramtype = "light", |  | ||||||
| 		sunlight_propagates = true, |  | ||||||
| 		walkable = false, |  | ||||||
| 		groups = { fleshy=3, dig_immediate=3, flammable=2, moretrees_dates=1 }, |  | ||||||
| 		inventory_image = "moretrees_dates_"..suffix..".png^[transformR0", |  | ||||||
| 		wield_image = "moretrees_dates_"..suffix..".png^[transformR90", |  | ||||||
| 		sounds = default.node_sound_defaults(), |  | ||||||
| 		drop = dropfn, |  | ||||||
| 		selection_box = { |  | ||||||
| 			type = "fixed", |  | ||||||
| 			fixed = {-0.3, -0.3, -0.3, 0.3, 3.5, 0.3} |  | ||||||
| 		}, |  | ||||||
| 		on_timer = dates_growfn, |  | ||||||
| 		on_construct = (moretrees.dates_regrow_pollinated or moretrees.dates_regrow_unpollinated_percent > 0) |  | ||||||
| 				and dates_starttimer, |  | ||||||
|  |  | ||||||
| 	} |  | ||||||
| 	minetest.register_node("moretrees:dates_"..suffix, datedef) |  | ||||||
| end |  | ||||||
|  |  | ||||||
| -- If regrowing was previously disabled, but is enabled now, make sure timers are started for existing dates |  | ||||||
| if moretrees.dates_regrow_pollinated or moretrees.dates_regrow_unpollinated_percent > 0 then |  | ||||||
| 	local spec = { |  | ||||||
| 		name = "moretrees:restart_dates_regrow_timer", |  | ||||||
| 		nodenames = "group:moretrees_dates", |  | ||||||
| 		action = function(pos, node, active_object_count, active_object_count_wider) |  | ||||||
| 			local timer = minetest.get_node_timer(pos) |  | ||||||
| 			if not timer:is_started() then |  | ||||||
| 				dates_starttimer(pos) |  | ||||||
| 			else |  | ||||||
| 				local timeout = timer:get_timeout() |  | ||||||
| 				local elapsed = timer:get_elapsed() |  | ||||||
| 				if timeout - elapsed > moretrees.dates_grow_interval * 4/3 then |  | ||||||
| 					dates_starttimer(pos, math.random(moretrees.dates_grow_interval * 4/3)) |  | ||||||
| 				end |  | ||||||
| 			end |  | ||||||
| 		end, |  | ||||||
| 	} |  | ||||||
| 	if minetest.register_lbm then |  | ||||||
| 		minetest.register_lbm(spec) |  | ||||||
| 	else |  | ||||||
| 		spec.interval = 3557 |  | ||||||
| 		spec.chance = 10 |  | ||||||
| 		minetest.register_abm(spec) |  | ||||||
| 	end |  | ||||||
| end |  | ||||||
|  |  | ||||||
| @@ -6,56 +6,68 @@ moretrees.enable_apple_tree		= true | |||||||
| moretrees.enable_oak			= true | moretrees.enable_oak			= true | ||||||
| moretrees.enable_sequoia		= true | moretrees.enable_sequoia		= true | ||||||
| moretrees.enable_palm			= true | moretrees.enable_palm			= true | ||||||
| moretrees.enable_date_palm		= true | moretrees.enable_pine			= true | ||||||
| moretrees.enable_cedar			= true |  | ||||||
| moretrees.enable_rubber_tree	= true | moretrees.enable_rubber_tree	= true | ||||||
| moretrees.enable_willow			= true | moretrees.enable_willow			= true | ||||||
|  | moretrees.enable_acacia			= true | ||||||
| moretrees.enable_birch			= true | moretrees.enable_birch			= true | ||||||
| moretrees.enable_spruce			= true | moretrees.enable_spruce			= true | ||||||
| moretrees.enable_jungle_tree	= true | moretrees.enable_jungle_tree	= true | ||||||
| moretrees.enable_fir			= true | moretrees.enable_fir			= true | ||||||
| moretrees.enable_poplar			= true |  | ||||||
| moretrees.enable_beech			= false | moretrees.enable_beech			= false | ||||||
|  |  | ||||||
| -- set this to true to make moretrees spawn saplings at mapgen time instead | -- set this to true to make moretrees spawn saplings at mapgen time instead | ||||||
| -- of fully-grown trees, which will grow into full trees after a very short | -- of fully-grown trees, which will grow into full trees very quickly.  With | ||||||
| -- delay.  This reduces mapgen lag in some situations, and fixes situations | -- older versions of plants_lib, doing this will reduce mapgen lag. | ||||||
| -- where the mapgen conflicts with the tree generator. |  | ||||||
|  |  | ||||||
| moretrees.spawn_saplings		= true | moretrees.spawn_saplings		= false | ||||||
|  |  | ||||||
| -- Set this to true to allow defining stairs/slabs/etc.  If Moreblocks is | -- Set this to true to allow usage of the stairsplus mod in moreblocks | ||||||
| -- installed, this will use that mod's Stairs Plus component.  Otherwise, it |  | ||||||
| -- will use the default stairs mod in minetest_game, if present |  | ||||||
|  |  | ||||||
| moretrees.enable_stairs			= true | moretrees.enable_stairsplus		= true | ||||||
|  |  | ||||||
| -- If this variable is set to true, register fences for moretrees wood | -- Set this to true if you want the plantlike drawtype for leaves, which  | ||||||
|  |  | ||||||
| moretrees.enable_fences         = false |  | ||||||
|  |  | ||||||
| -- Set this to true if you want the plantlike drawtype for leaves, which |  | ||||||
| -- improves some peoples' framerates without resorting to making leaf nodes opaque. | -- improves some peoples' framerates without resorting to making leaf nodes opaque. | ||||||
| -- Affects default leaves and default jungle leaves also. | -- Affects default leaves and default jungle leaves also. | ||||||
|  |  | ||||||
| moretrees.plantlike_leaves		= false | moretrees.plantlike_leaves		= false | ||||||
|  |  | ||||||
|  | -- Set this to true to enable leaf decay of all trees except the default ones. | ||||||
|  |  | ||||||
|  | moretrees.enable_leafdecay		= true | ||||||
|  |  | ||||||
|  | -- Enable this one if you want this mod's leafdecay code to affect the old | ||||||
|  | -- default trees too; this setting is independent of the one above.  You'll | ||||||
|  | -- want to manually disable the default leafdecay code in minetest_game if | ||||||
|  | -- you enable this, otherwise you'll have two sets of leaf decay code running | ||||||
|  | -- at the same time, which will just waste CPU for no benefit. | ||||||
|  |  | ||||||
|  | moretrees.enable_default_leafdecay	= true | ||||||
|  |  | ||||||
|  | -- Enable this one for default *jungle* leaves | ||||||
|  |  | ||||||
|  | moretrees.enable_default_jungle_leafdecay	= true | ||||||
|  |  | ||||||
| -- Enable this if you want moretrees to redefine default apples so that they | -- Enable this if you want moretrees to redefine default apples so that they | ||||||
| -- fall when leaves decay/are dug. | -- fall when leaves decay/are dug. | ||||||
|  |  | ||||||
| moretrees.enable_redefine_apple		= true | moretrees.enable_redefine_apple		= true | ||||||
|  |  | ||||||
| -- Set this to true to enable leaf decay of all trees except the default ones. | -- various settings to configure default and default-jungle leaf decay. | ||||||
|  |  | ||||||
| moretrees.enable_leafdecay		= true |  | ||||||
|  |  | ||||||
| -- various related settings to configure leaf decay. |  | ||||||
|  |  | ||||||
| moretrees.leafdecay_delay		= 2 | moretrees.leafdecay_delay		= 2 | ||||||
| moretrees.leafdecay_chance		= 5 | moretrees.leafdecay_chance		= 100 | ||||||
| moretrees.leafdecay_radius		= 5 | moretrees.leafdecay_radius		= 5 | ||||||
| moretrees.palm_leafdecay_radius		= 10 |  | ||||||
| moretrees.date_palm_leafdecay_radius	= 14 | moretrees.default_jungle_leafdecay_delay = 2 | ||||||
|  | moretrees.default_jungle_leafdecay_chance = 100 | ||||||
|  | moretrees.default_jungle_leafdecay_radius = 5 | ||||||
|  |  | ||||||
|  | moretrees.palm_leafdecay_radius		= 15 | ||||||
|  |  | ||||||
|  | moretrees.default_leafdecay_delay	= 3 | ||||||
|  | moretrees.default_leafdecay_chance	= 50 | ||||||
|  | moretrees.default_leafdecay_radius	= 4 | ||||||
|  |  | ||||||
| -- Change these settings if you want default trees to be gradually cut down | -- Change these settings if you want default trees to be gradually cut down | ||||||
| -- above the elevation where firs normally generate. | -- above the elevation where firs normally generate. | ||||||
| @@ -64,71 +76,10 @@ moretrees.firs_remove_default_trees	= false | |||||||
| moretrees.firs_remove_interval		= 2 | moretrees.firs_remove_interval		= 2 | ||||||
| moretrees.firs_remove_chance		= 150 | moretrees.firs_remove_chance		= 150 | ||||||
|  |  | ||||||
| -- Cocos palm settings |  | ||||||
|  |  | ||||||
| moretrees.coconuts_regrow		= true |  | ||||||
| moretrees.coconuts_convert_existing_palms = true	-- Converting existing palm trees will make coconuts regrow on them as well |  | ||||||
| 							-- Else, they will only regrow on newly-spawned palms |  | ||||||
| 							-- However, conversion is not an exact science, and although an attempt is |  | ||||||
| 							-- made to detect whether a trunk belongs to an actual palm, some coconut trunks |  | ||||||
| 							-- and some coconuts may be incorrectly converted. |  | ||||||
| moretrees.coconut_flower_interval	= 59 |  | ||||||
| moretrees.coconut_flower_chance		= 67 |  | ||||||
| moretrees.coconut_grow_interval		= 2 * moretrees.coconut_flower_interval * moretrees.coconut_flower_chance |  | ||||||
| 							-- Actual interval will randomly vary between 67% and 133% of this value |  | ||||||
| 							-- 2 * 59 * 67 ~ 2 hours. So flowers become coconuts in about 6 hours |  | ||||||
| moretrees.coconut_item_drop_ichance	= 10 		-- inverse probability of ripe coconuts dropping as items (instead of disappearing) |  | ||||||
|  |  | ||||||
| -- Date palm settings |  | ||||||
|  |  | ||||||
| -- Suggested configuration alternatives: |  | ||||||
| -- - Dates grow only when pollinated: |  | ||||||
| --   - Set dates_regrow_pollinated to true |  | ||||||
| --   - Set dates_regrow_unpollinated_percent to 0 |  | ||||||
| -- - Dates grow without pollination. Pollination disabled: |  | ||||||
| --   - Set dates_regrow_pollinated to false |  | ||||||
| --   - Set dates_regrow_unpollinated_percent to some larger positive value, e.g. 95 |  | ||||||
| -- - Dates grow, but more and faster if male flowers are nearby |  | ||||||
| --   - Set dates_regrow_pollinated to true |  | ||||||
| --   - Set dates_regrow_unpollinated_percent to some small positive value, e.g. 33 |  | ||||||
| --   - Optional but recommended: Reduce the pollination distance, e.g. to 30 |  | ||||||
|  |  | ||||||
| -- Note that it should not be necessary to disable pollination for performance |  | ||||||
| -- reasons. A lot of effort has gone into ensuring that date growing will not cause lag. |  | ||||||
| -- |  | ||||||
| -- If lag is suspected, use the chat command '/dates_stats' to obtain the male dates |  | ||||||
| -- search time, as well as the counts of total number of searches requested and the |  | ||||||
| -- number of searches actually performed. |  | ||||||
|  |  | ||||||
| moretrees.dates_regrow_pollinated	= true		-- Enable pollination. If enabled, male trees are required for dates to grow. |  | ||||||
| 							-- If disabled, dates_regrow_unpollinated_percent must be non-zero for dates to regrow. |  | ||||||
| moretrees.dates_regrow_unpollinated_percent	= 0	-- Percentage of female dates becoming dates without being pollinated. |  | ||||||
| 							-- If 0, dates_regrow_pollinated must be enabled for dates to grow. |  | ||||||
| moretrees.dates_female_percent		= 57		-- Ratio of female to male trees - tune this to improve # of generated trees that actually bear fruit |  | ||||||
| 							-- ~57% gives near optimal results for groups of 3 random trees, while it is only slightly suboptimal |  | ||||||
| 							-- for groups of 2 and 4 random trees (~2% less fruit than optimal). |  | ||||||
| 							-- Optimal values per group size: 2: 50%, 3: 57.78%, 4: 63%, 5: 66.9%, 6: 69.9%, [...], 12: 79.8% |  | ||||||
| 							-- So 57% is optimal for small groups of trees. As larger groups have more female palms anyway, a |  | ||||||
| 							-- less than optimal proportion of female to male trees is not a problem. |  | ||||||
| moretrees.dates_pollination_distance	= 120 |  | ||||||
| moretrees.dates_blossom_search_time_treshold = 1000	-- If average male blossom search time (in microseconds) exceeds this, start limiting the search load. |  | ||||||
| moretrees.dates_blossom_search_iload = 10		-- Inverse fraction of CPU time that male blossom searching search may consume. |  | ||||||
| 							-- As searching a large area (radius: dates_pollination_distance/3 per attempt) can cause lag, |  | ||||||
| 							-- this limits the search frequency server-wide so that the impact on server lag is minimised |  | ||||||
| 							-- For personal servers, this can be set lower, or even to 1 or 0 (0 disables load limiting). |  | ||||||
| 							-- Obtain the current average search time using /dates_stats |  | ||||||
| moretrees.dates_flower_interval		= 59 |  | ||||||
| moretrees.dates_flower_chance		= 181 |  | ||||||
| moretrees.dates_grow_interval		= 2 * moretrees.dates_flower_interval * moretrees.dates_flower_chance |  | ||||||
| 							-- As date palms have a high yield, don't grow dates too fast |  | ||||||
| 							-- The actual interval will vary randomly between 67% and 133% of this value. |  | ||||||
| 							-- 2 * 59 * 181 ~ 6 hours. So by default flowers become dates in about one (human) day. |  | ||||||
| moretrees.dates_item_drop_ichance	= 10 		-- inverse probability of ripe dates dropping as items (instead of disappearing) |  | ||||||
|  |  | ||||||
| -- Sapling settings | -- Sapling settings | ||||||
|  |  | ||||||
| moretrees.sapling_interval		= 100 | moretrees.sapling_interval		= 500 | ||||||
| moretrees.sapling_chance		= 5 | moretrees.sapling_chance		= 20 | ||||||
|  |  | ||||||
| -- If this variable is set to true, drop leaves out as entities during leaf | -- If this variable is set to true, drop leaves out as entities during leaf | ||||||
| -- decay, rather than just disappearing them. | -- decay, rather than just disappearing them. | ||||||
|   | |||||||
							
								
								
									
										5
									
								
								depends.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,5 @@ | |||||||
|  | default | ||||||
|  | plants_lib | ||||||
|  | moreblocks? | ||||||
|  | intllib? | ||||||
|  |  | ||||||
							
								
								
									
										179
									
								
								init.lua
									
									
									
									
									
								
							
							
						
						| @@ -2,54 +2,22 @@ | |||||||
| -- | -- | ||||||
| -- This mod adds more types of trees to the game | -- This mod adds more types of trees to the game | ||||||
| -- | -- | ||||||
| -- Some of the node definitions and textures came from cisoun's conifers mod | -- Some of the node definitions and textures came from cisoun's conifers mod  | ||||||
| -- and bas080's jungle trees mod. | -- and bas080's jungle trees mod. | ||||||
| -- | -- | ||||||
| -- Brought together into one mod and made L-systems compatible by Vanessa | -- Brought together into one mod and made L-systems compatible by Vanessa | ||||||
| -- Ezekowitz. | -- Ezekowitz. | ||||||
| -- | -- | ||||||
| -- Firs and Jungle tree axioms/rules by Vanessa Dannenberg, with the | -- Firs and Jungle tree axioms/rules by Vanessa Ezekowitz, with the  | ||||||
| -- latter having been tweaked by RealBadAngel, most other axioms/rules written | -- latter having been tweaked by RealBadAngel, most other axioms/rules written | ||||||
| -- by RealBadAngel. | -- by RealBadAngel. | ||||||
| -- | -- | ||||||
|  | -- License: WTFPL for all parts (code and textures, including those copied | ||||||
|  | -- from the jungletree and conifers mods) except the default jungle tree trunk | ||||||
|  | -- texture, which is CC-By-SA. | ||||||
|  |  | ||||||
| moretrees = {} | moretrees = {} | ||||||
|  |  | ||||||
| minetest.override_item("default:sapling", { |  | ||||||
| 	description = "Sapling" |  | ||||||
| }) |  | ||||||
|  |  | ||||||
| minetest.override_item("default:tree", { |  | ||||||
| 	description = "Tree" |  | ||||||
| }) |  | ||||||
|  |  | ||||||
| minetest.override_item("default:wood", { |  | ||||||
| 	description = "Wooden Planks" |  | ||||||
| }) |  | ||||||
|  |  | ||||||
| minetest.override_item("default:leaves", { |  | ||||||
| 	description = "Leaves" |  | ||||||
| }) |  | ||||||
|  |  | ||||||
| minetest.override_item("default:fence_wood", { |  | ||||||
| 	description = "Wooden Fence" |  | ||||||
| }) |  | ||||||
|  |  | ||||||
| minetest.override_item("default:fence_rail_wood", { |  | ||||||
| 	description = "Wooden Fence Rail" |  | ||||||
| }) |  | ||||||
|  |  | ||||||
| if minetest.get_modpath("doors") then |  | ||||||
| 	minetest.override_item("doors:gate_wood_closed", { |  | ||||||
| 		description = "Wooden Fence Gate" |  | ||||||
| 	}) |  | ||||||
|  |  | ||||||
| 	minetest.override_item("doors:gate_wood_open", { |  | ||||||
| 		description = "Wooden Fence Gate" |  | ||||||
| 	}) |  | ||||||
| end |  | ||||||
|  |  | ||||||
|  |  | ||||||
| -- Read the default config file (and if necessary, copy it to the world folder). | -- Read the default config file (and if necessary, copy it to the world folder). | ||||||
|  |  | ||||||
| local worldpath=minetest.get_worldpath() | local worldpath=minetest.get_worldpath() | ||||||
| @@ -57,16 +25,36 @@ local modpath=minetest.get_modpath("moretrees") | |||||||
|  |  | ||||||
| dofile(modpath.."/default_settings.txt") | dofile(modpath.."/default_settings.txt") | ||||||
|  |  | ||||||
| if io.open(worldpath.."/moretrees_settings.txt","r") then | if io.open(worldpath.."/moretrees_settings.txt","r") == nil then | ||||||
| 	io.close() |  | ||||||
|  | 	io.input(modpath.."/default_settings.txt") | ||||||
|  | 	io.output(worldpath.."/moretrees_settings.txt") | ||||||
|  |  | ||||||
|  | 	local size = 2^13      -- good buffer size (8K) | ||||||
|  | 	while true do | ||||||
|  | 		local block = io.read(size) | ||||||
|  | 		if not block then | ||||||
|  | 			io.close() | ||||||
|  | 			break | ||||||
|  | 		end | ||||||
|  | 		io.write(block) | ||||||
|  | 	end | ||||||
|  | else | ||||||
| 	dofile(worldpath.."/moretrees_settings.txt") | 	dofile(worldpath.."/moretrees_settings.txt") | ||||||
| end | 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 | -- infinite stacks checking | ||||||
|  |  | ||||||
| if minetest.get_modpath("unified_inventory") or not | if minetest.get_modpath("unified_inventory") or not minetest.setting_getbool("creative_mode") then | ||||||
| 		minetest.settings:get_bool("creative_mode") then |  | ||||||
| 	moretrees.expect_infinite_stacks = false | 	moretrees.expect_infinite_stacks = false | ||||||
| else | else | ||||||
| 	moretrees.expect_infinite_stacks = true | 	moretrees.expect_infinite_stacks = true | ||||||
| @@ -88,11 +76,10 @@ moretrees.cutting_tools = { | |||||||
|  |  | ||||||
| dofile(modpath.."/tree_models.lua") | dofile(modpath.."/tree_models.lua") | ||||||
| dofile(modpath.."/node_defs.lua") | dofile(modpath.."/node_defs.lua") | ||||||
| dofile(modpath.."/date_palm.lua") |  | ||||||
| dofile(modpath.."/cocos_palm.lua") |  | ||||||
| dofile(modpath.."/biome_defs.lua") | dofile(modpath.."/biome_defs.lua") | ||||||
| dofile(modpath.."/saplings.lua") | dofile(modpath.."/saplings.lua") | ||||||
| dofile(modpath.."/crafts.lua") | dofile(modpath.."/crafts.lua") | ||||||
|  | dofile(modpath.."/leafdecay.lua") | ||||||
|  |  | ||||||
| -- tree spawning setup | -- tree spawning setup | ||||||
|  |  | ||||||
| @@ -102,104 +89,92 @@ if moretrees.spawn_saplings then | |||||||
| 	moretrees.spawn_oak_object = "moretrees:oak_sapling_ongen" | 	moretrees.spawn_oak_object = "moretrees:oak_sapling_ongen" | ||||||
| 	moretrees.spawn_sequoia_object = "moretrees:sequoia_sapling_ongen" | 	moretrees.spawn_sequoia_object = "moretrees:sequoia_sapling_ongen" | ||||||
| 	moretrees.spawn_palm_object = "moretrees:palm_sapling_ongen" | 	moretrees.spawn_palm_object = "moretrees:palm_sapling_ongen" | ||||||
| 	moretrees.spawn_date_palm_object = "moretrees:date_palm_sapling_ongen" | 	moretrees.spawn_pine_object = "moretrees:pine_sapling_ongen" | ||||||
| 	moretrees.spawn_cedar_object = "moretrees:cedar_sapling_ongen" |  | ||||||
| 	moretrees.spawn_rubber_tree_object = "moretrees:rubber_tree_sapling_ongen" | 	moretrees.spawn_rubber_tree_object = "moretrees:rubber_tree_sapling_ongen" | ||||||
| 	moretrees.spawn_willow_object = "moretrees:willow_sapling_ongen" | 	moretrees.spawn_willow_object = "moretrees:willow_sapling_ongen" | ||||||
|  | 	moretrees.spawn_acacia_object = "moretrees:acacia_sapling_ongen" | ||||||
| 	moretrees.spawn_birch_object = "moretrees:birch_sapling_ongen" | 	moretrees.spawn_birch_object = "moretrees:birch_sapling_ongen" | ||||||
| 	moretrees.spawn_spruce_object = "moretrees:spruce_sapling_ongen" | 	moretrees.spawn_spruce_object = "moretrees:spruce_sapling_ongen" | ||||||
| 	moretrees.spawn_jungletree_object = "moretrees:jungletree_sapling_ongen" | 	moretrees.spawn_jungletree_object = "moretrees:jungletree_sapling_ongen" | ||||||
| 	moretrees.spawn_fir_object = "moretrees:fir_sapling_ongen" | 	moretrees.spawn_fir_object = "moretrees:fir_sapling_ongen" | ||||||
| 	moretrees.spawn_fir_snow_object = "snow:sapling_pine" | 	moretrees.spawn_fir_snow_object = "snow:sapling_pine" | ||||||
| 	moretrees.spawn_poplar_object = "moretrees:poplar_sapling_ongen" |  | ||||||
| 	moretrees.spawn_poplar_small_object = "moretrees:poplar_small_sapling_ongen" |  | ||||||
| else | else | ||||||
| 	moretrees.spawn_beech_object = moretrees.beech_model | 	moretrees.spawn_beech_object = moretrees.beech_model | ||||||
| 	moretrees.spawn_apple_tree_object = moretrees.apple_tree_model | 	moretrees.spawn_apple_tree_object = moretrees.apple_tree_model | ||||||
| 	moretrees.spawn_oak_object = moretrees.oak_model | 	moretrees.spawn_oak_object = moretrees.oak_model | ||||||
| 	moretrees.spawn_sequoia_object = moretrees.sequoia_model | 	moretrees.spawn_sequoia_object = moretrees.sequoia_model | ||||||
| 	moretrees.spawn_palm_object = moretrees.palm_model | 	moretrees.spawn_palm_object = moretrees.palm_model | ||||||
| 	moretrees.spawn_date_palm_object = moretrees.date_palm_model | 	moretrees.spawn_pine_object = moretrees.pine_model | ||||||
| 	moretrees.spawn_cedar_object = moretrees.cedar_model |  | ||||||
| 	moretrees.spawn_rubber_tree_object = moretrees.rubber_tree_model | 	moretrees.spawn_rubber_tree_object = moretrees.rubber_tree_model | ||||||
| 	moretrees.spawn_willow_object = moretrees.willow_model | 	moretrees.spawn_willow_object = moretrees.willow_model | ||||||
| 	moretrees.spawn_birch_object = "moretrees.grow_birch" | 	moretrees.spawn_acacia_object = moretrees.acacia_model | ||||||
| 	moretrees.spawn_spruce_object = "moretrees.grow_spruce" | 	moretrees.spawn_birch_object = "moretrees:grow_birch" | ||||||
| 	moretrees.spawn_jungletree_object = "moretrees.grow_jungletree" | 	moretrees.spawn_spruce_object = "moretrees:grow_spruce" | ||||||
| 	moretrees.spawn_fir_object = "moretrees.grow_fir" | 	moretrees.spawn_jungletree_object = "moretrees:grow_jungletree" | ||||||
| 	moretrees.spawn_fir_snow_object = "moretrees.grow_fir_snow" | 	moretrees.spawn_fir_object = "moretrees:grow_fir" | ||||||
| 	moretrees.spawn_poplar_object = moretrees.poplar_model | 	moretrees.spawn_fir_snow_object = "moretrees:grow_fir_snow" | ||||||
| 	moretrees.spawn_poplar_small_object = moretrees.poplar_small_model |  | ||||||
| end | end | ||||||
|  |  | ||||||
|  |  | ||||||
| if moretrees.enable_beech then | if moretrees.enable_beech then | ||||||
| 	biome_lib:register_generate_plant(moretrees.beech_biome, moretrees.spawn_beech_object) | 	plantslib:register_generate_plant(moretrees.beech_biome, moretrees.spawn_beech_object) | ||||||
| end | end | ||||||
|  |  | ||||||
| if moretrees.enable_apple_tree then | if moretrees.enable_apple_tree then | ||||||
| 	biome_lib:register_generate_plant(moretrees.apple_tree_biome, moretrees.spawn_apple_tree_object) | 	plantslib:register_generate_plant(moretrees.apple_tree_biome, moretrees.spawn_apple_tree_object) | ||||||
| end | end | ||||||
|  |  | ||||||
| if moretrees.enable_oak then | if moretrees.enable_oak then | ||||||
| 	biome_lib:register_generate_plant(moretrees.oak_biome, moretrees.spawn_oak_object) | 	plantslib:register_generate_plant(moretrees.oak_biome, moretrees.spawn_oak_object) | ||||||
| end | end | ||||||
|  |  | ||||||
| if moretrees.enable_sequoia then | if moretrees.enable_sequoia then | ||||||
| 	biome_lib:register_generate_plant(moretrees.sequoia_biome, moretrees.spawn_sequoia_object) | 	plantslib:register_generate_plant(moretrees.sequoia_biome, moretrees.spawn_sequoia_object) | ||||||
| end | end | ||||||
|  |  | ||||||
| if moretrees.enable_palm then | if moretrees.enable_palm then | ||||||
| 	biome_lib:register_generate_plant(moretrees.palm_biome, moretrees.spawn_palm_object) | 	plantslib:register_generate_plant(moretrees.palm_biome, moretrees.spawn_palm_object) | ||||||
| end | end | ||||||
|  |  | ||||||
| if moretrees.enable_date_palm then | if moretrees.enable_pine then | ||||||
| 	biome_lib:register_generate_plant(moretrees.date_palm_biome, moretrees.spawn_date_palm_object) | 	plantslib:register_generate_plant(moretrees.pine_biome, moretrees.spawn_pine_object) | ||||||
| 	biome_lib:register_generate_plant(moretrees.date_palm_biome_2, moretrees.spawn_date_palm_object) |  | ||||||
| end |  | ||||||
|  |  | ||||||
| if moretrees.enable_cedar then |  | ||||||
| 	biome_lib:register_generate_plant(moretrees.cedar_biome, moretrees.spawn_cedar_object) |  | ||||||
| end | end | ||||||
|  |  | ||||||
| if moretrees.enable_rubber_tree then | if moretrees.enable_rubber_tree then | ||||||
| 	biome_lib:register_generate_plant(moretrees.rubber_tree_biome, moretrees.spawn_rubber_tree_object) | 	plantslib:register_generate_plant(moretrees.rubber_tree_biome, moretrees.spawn_rubber_tree_object) | ||||||
| end | end | ||||||
|  |  | ||||||
| if moretrees.enable_willow then | if moretrees.enable_willow then | ||||||
| 	biome_lib:register_generate_plant(moretrees.willow_biome, moretrees.spawn_willow_object) | 	plantslib:register_generate_plant(moretrees.willow_biome, moretrees.spawn_willow_object) | ||||||
|  | end | ||||||
|  |  | ||||||
|  | if moretrees.enable_acacia then | ||||||
|  | 	plantslib:register_generate_plant(moretrees.acacia_biome, moretrees.spawn_acacia_object) | ||||||
| end | end | ||||||
|  |  | ||||||
| if moretrees.enable_birch then | if moretrees.enable_birch then | ||||||
| 	biome_lib:register_generate_plant(moretrees.birch_biome, moretrees.spawn_birch_object) | 	plantslib:register_generate_plant(moretrees.birch_biome, moretrees.spawn_birch_object) | ||||||
| end | end | ||||||
|  |  | ||||||
| if moretrees.enable_spruce then | if moretrees.enable_spruce then | ||||||
| 	biome_lib:register_generate_plant(moretrees.spruce_biome, moretrees.spawn_spruce_object) | 	plantslib:register_generate_plant(moretrees.spruce_biome, moretrees.spawn_spruce_object) | ||||||
| end | end | ||||||
|  |  | ||||||
| if moretrees.enable_jungle_tree then | if moretrees.enable_jungle_tree then | ||||||
| 	biome_lib:register_generate_plant(moretrees.jungletree_biome, moretrees.spawn_jungletree_object) | 	plantslib:register_generate_plant(moretrees.jungletree_biome, moretrees.spawn_jungletree_object) | ||||||
| end | end | ||||||
|  |  | ||||||
| if moretrees.enable_fir then | if moretrees.enable_fir then | ||||||
| 	biome_lib:register_generate_plant(moretrees.fir_biome, moretrees.spawn_fir_object) | 	plantslib:register_generate_plant(moretrees.fir_biome, moretrees.spawn_fir_object) | ||||||
| 	if minetest.get_modpath("snow") then | 	if minetest.get_modpath("snow") then | ||||||
| 		biome_lib:register_generate_plant(moretrees.fir_biome_snow, moretrees.spawn_fir_snow_object) | 		plantslib:register_generate_plant(moretrees.fir_biome_snow, moretrees.spawn_fir_snow_object) | ||||||
| 	end | 	end | ||||||
| end | end | ||||||
|  |  | ||||||
| if moretrees.enable_poplar then |  | ||||||
| 	biome_lib:register_generate_plant(moretrees.poplar_biome, moretrees.spawn_poplar_object) |  | ||||||
| 	biome_lib:register_generate_plant(moretrees.poplar_biome_2, moretrees.spawn_poplar_object) |  | ||||||
| 	biome_lib:register_generate_plant(moretrees.poplar_biome_3, moretrees.spawn_poplar_object) |  | ||||||
| 	biome_lib:register_generate_plant(moretrees.poplar_small_biome, moretrees.spawn_poplar_small_object) |  | ||||||
| 	biome_lib:register_generate_plant(moretrees.poplar_small_biome_2, moretrees.spawn_poplar_small_object) |  | ||||||
| end |  | ||||||
|  |  | ||||||
| -- Code to spawn a birch tree | -- Code to spawn a birch tree | ||||||
|  |  | ||||||
| function moretrees.grow_birch(pos) | function moretrees:grow_birch(pos) | ||||||
| 	minetest.swap_node(pos, biome_lib.air) | 	minetest.remove_node(pos) | ||||||
| 	if math.random(1,2) == 1 then | 	if math.random(1,2) == 1 then | ||||||
| 		minetest.spawn_tree(pos, moretrees.birch_model1) | 		minetest.spawn_tree(pos, moretrees.birch_model1) | ||||||
| 	else | 	else | ||||||
| @@ -209,8 +184,8 @@ end | |||||||
|  |  | ||||||
| -- Code to spawn a spruce tree | -- Code to spawn a spruce tree | ||||||
|  |  | ||||||
| function moretrees.grow_spruce(pos) | function moretrees:grow_spruce(pos) | ||||||
| 	minetest.swap_node(pos, biome_lib.air) | 	minetest.remove_node(pos) | ||||||
| 	if math.random(1,2) == 1 then | 	if math.random(1,2) == 1 then | ||||||
| 		minetest.spawn_tree(pos, moretrees.spruce_model1) | 		minetest.spawn_tree(pos, moretrees.spruce_model1) | ||||||
| 	else | 	else | ||||||
| @@ -234,12 +209,12 @@ moretrees.ct_rules_b1 = "[-FBf][+FBf]" | |||||||
| moretrees.ct_rules_a2 = "FF[FF][&&-FBF][&&+FBF][&&---FBF][&&+++FBF]F/A" | moretrees.ct_rules_a2 = "FF[FF][&&-FBF][&&+FBF][&&---FBF][&&+++FBF]F/A" | ||||||
| moretrees.ct_rules_b2 = "[-fB][+fB]" | moretrees.ct_rules_b2 = "[-fB][+fB]" | ||||||
|  |  | ||||||
| function moretrees.grow_jungletree(pos) | function moretrees:grow_jungletree(pos) | ||||||
| 	local r1 = math.random(2) | 	local r1 = math.random(2) | ||||||
| 	local r2 = math.random(3) | 	local r2 = math.random(3) | ||||||
| 	if r1 == 1 then | 	if r1 == 1 then | ||||||
| 		moretrees.jungletree_model.leaves2 = "moretrees:jungletree_leaves_red" | 		moretrees.jungletree_model.leaves2 = "moretrees:jungletree_leaves_red" | ||||||
| 	else | 	else  | ||||||
| 		moretrees.jungletree_model.leaves2 = "moretrees:jungletree_leaves_yellow" | 		moretrees.jungletree_model.leaves2 = "moretrees:jungletree_leaves_yellow" | ||||||
| 	end | 	end | ||||||
| 	moretrees.jungletree_model.leaves2_chance = math.random(25, 75) | 	moretrees.jungletree_model.leaves2_chance = math.random(25, 75) | ||||||
| @@ -264,17 +239,19 @@ function moretrees.grow_jungletree(pos) | |||||||
| 		moretrees.jungletree_model.rules_b = moretrees.jt_rules_b2 | 		moretrees.jungletree_model.rules_b = moretrees.jt_rules_b2 | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
| 	minetest.swap_node(pos, biome_lib.air) | 	moretrees.jungletree_model.enable_unique_ids = true | ||||||
|  |  | ||||||
|  | 	minetest.remove_node(pos) | ||||||
| 	local leaves = minetest.find_nodes_in_area({x = pos.x-1, y = pos.y, z = pos.z-1}, {x = pos.x+1, y = pos.y+10, z = pos.z+1}, "default:leaves") | 	local leaves = minetest.find_nodes_in_area({x = pos.x-1, y = pos.y, z = pos.z-1}, {x = pos.x+1, y = pos.y+10, z = pos.z+1}, "default:leaves") | ||||||
| 	for leaf in ipairs(leaves) do | 	for leaf in ipairs(leaves) do | ||||||
| 			minetest.swap_node(leaves[leaf], biome_lib.air) | 			minetest.remove_node(leaves[leaf]) | ||||||
| 	end | 	end | ||||||
| 	minetest.spawn_tree(pos, moretrees.jungletree_model) | 	minetest.spawn_tree(pos, moretrees.jungletree_model) | ||||||
| end | end | ||||||
|  |  | ||||||
| -- code to spawn fir trees | -- code to spawn fir trees | ||||||
|  |  | ||||||
| function moretrees.grow_fir(pos) | function moretrees:grow_fir(pos) | ||||||
| 	if math.random(2) == 1 then | 	if math.random(2) == 1 then | ||||||
| 		moretrees.fir_model.leaves="moretrees:fir_leaves" | 		moretrees.fir_model.leaves="moretrees:fir_leaves" | ||||||
| 	else | 	else | ||||||
| @@ -288,20 +265,21 @@ function moretrees.grow_fir(pos) | |||||||
| 		moretrees.fir_model.rules_b = moretrees.ct_rules_b2 | 		moretrees.fir_model.rules_b = moretrees.ct_rules_b2 | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
|  | 	moretrees.fir_model.enable_unique_ids = true | ||||||
| 	moretrees.fir_model.iterations = 7 | 	moretrees.fir_model.iterations = 7 | ||||||
| 	moretrees.fir_model.random_level = 5 | 	moretrees.fir_model.random_level = 5 | ||||||
|  |  | ||||||
| 	minetest.swap_node(pos, biome_lib.air) | 	minetest.remove_node(pos) | ||||||
| 	local leaves = minetest.find_nodes_in_area({x = pos.x, y = pos.y, z = pos.z}, {x = pos.x, y = pos.y+5, z = pos.z}, "default:leaves") | 	local leaves = minetest.find_nodes_in_area({x = pos.x, y = pos.y, z = pos.z}, {x = pos.x, y = pos.y+5, z = pos.z}, "default:leaves") | ||||||
| 	for leaf in ipairs(leaves) do | 	for leaf in ipairs(leaves) do | ||||||
| 		minetest.swap_node(leaves[leaf], biome_lib.air) | 			minetest.remove_node(leaves[leaf]) | ||||||
| 	end | 	end | ||||||
| 	minetest.spawn_tree(pos,moretrees.fir_model) | 	minetest.spawn_tree(pos,moretrees.fir_model) | ||||||
| end | end | ||||||
|  |  | ||||||
| -- same thing, but a smaller version that grows only in snow biomes | -- same thing, but a smaller version that grows only in snow biomes | ||||||
|  |  | ||||||
| function moretrees.grow_fir_snow(pos) | function moretrees:grow_fir_snow(pos) | ||||||
| 	if math.random(2) == 1 then | 	if math.random(2) == 1 then | ||||||
| 		moretrees.fir_model.leaves="moretrees:fir_leaves" | 		moretrees.fir_model.leaves="moretrees:fir_leaves" | ||||||
| 	else | 	else | ||||||
| @@ -315,15 +293,20 @@ function moretrees.grow_fir_snow(pos) | |||||||
| 		moretrees.fir_model.rules_b = moretrees.ct_rules_b2 | 		moretrees.fir_model.rules_b = moretrees.ct_rules_b2 | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
|  | 	moretrees.fir_model.enable_unique_ids = true | ||||||
| 	moretrees.fir_model.iterations = 2 | 	moretrees.fir_model.iterations = 2 | ||||||
| 	moretrees.fir_model.random_level = 2 | 	moretrees.fir_model.random_level = 2 | ||||||
|  |  | ||||||
| 	minetest.swap_node(pos, biome_lib.air) | 	minetest.remove_node(pos) | ||||||
| 	local leaves = minetest.find_nodes_in_area({x = pos.x, y = pos.y, z = pos.z}, {x = pos.x, y = pos.y+5, z = pos.z}, "default:leaves") | 	local leaves = minetest.find_nodes_in_area({x = pos.x, y = pos.y, z = pos.z}, {x = pos.x, y = pos.y+5, z = pos.z}, "default:leaves") | ||||||
| 	for leaf in ipairs(leaves) do | 	for leaf in ipairs(leaves) do | ||||||
| 			minetest.swap_node(leaves[leaf], biome_lib.air) | 			minetest.remove_node(leaves[leaf]) | ||||||
| 	end | 	end | ||||||
| 	minetest.spawn_tree(pos,moretrees.fir_model) | 	minetest.spawn_tree(pos,moretrees.fir_model) | ||||||
| end | end | ||||||
|  |  | ||||||
| print("[Moretrees] Loaded (2013-02-11)") | minetest.register_on_punchnode(function(pos, node, puncher, pointed_thing) | ||||||
|  | 	print(dump(node.name)..": param1 = "..dump(node.param1)..", param2 = "..dump(node.param2)) | ||||||
|  | end) | ||||||
|  |  | ||||||
|  | print(S("[Moretrees] Loaded (2013-02-11)")) | ||||||
|   | |||||||
							
								
								
									
										117
									
								
								leafdecay.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,117 @@ | |||||||
|  | -- leaf decay | ||||||
|  |  | ||||||
|  | -- this function is based on the default leafdecay code | ||||||
|  | local process_drops = function(pos, name) | ||||||
|  | 	local drops = minetest.get_node_drops(name) | ||||||
|  | 	for _,dropitem in ipairs(drops) do | ||||||
|  | 		if dropitem ~= name | ||||||
|  | 		  or (string.find(name, "leaves") and moretrees.decay_leaves_as_items) then | ||||||
|  | 			local newpos = { | ||||||
|  | 						x=pos.x + math.random() - 0.5, | ||||||
|  | 						y=pos.y + math.random() - 0.5, | ||||||
|  | 						z=pos.z + math.random() - 0.5 | ||||||
|  | 					} | ||||||
|  | 			minetest.add_item(newpos, dropitem) | ||||||
|  | 		end | ||||||
|  | 	end | ||||||
|  | end | ||||||
|  |  | ||||||
|  | if moretrees.enable_leafdecay then | ||||||
|  | 	for i in ipairs(moretrees.treelist) do | ||||||
|  | 		local treename = moretrees.treelist[i][1] | ||||||
|  | 		if treename ~= "jungletree" and treename ~= "fir" and treename ~= "palm" then | ||||||
|  | 			minetest.register_abm({ | ||||||
|  | 				nodenames = "moretrees:"..treename.."_leaves", | ||||||
|  | 				interval = moretrees.leafdecay_delay, | ||||||
|  | 				chance = moretrees.leafdecay_chance, | ||||||
|  | 				action = function(pos, node, active_object_count, active_object_count_wider) | ||||||
|  | 					if minetest.find_node_near(pos, moretrees.leafdecay_radius, { "ignore", "moretrees:"..treename.."_trunk" }) then return end | ||||||
|  | 					process_drops(pos, node.name) | ||||||
|  | 					minetest.remove_node(pos) | ||||||
|  | 					nodeupdate(pos) | ||||||
|  | 				end | ||||||
|  | 			}) | ||||||
|  | 		end | ||||||
|  | 	end | ||||||
|  |  | ||||||
|  | 	minetest.register_abm({ | ||||||
|  | 		nodenames = {"moretrees:jungletree_leaves_red","moretrees:jungletree_leaves_green","moretrees:jungletree_leaves_yellow"}, | ||||||
|  | 		interval = moretrees.leafdecay_delay, | ||||||
|  | 		chance = moretrees.leafdecay_chance, | ||||||
|  | 		action = function(pos, node, active_object_count, active_object_count_wider) | ||||||
|  | 			if minetest.find_node_near(pos, moretrees.leafdecay_radius, {"ignore", "default:jungletree", "moretrees:jungletree_trunk"}) then return end | ||||||
|  | 			process_drops(pos, node.name) | ||||||
|  | 			minetest.remove_node(pos) | ||||||
|  | 			nodeupdate(pos) | ||||||
|  | 		end | ||||||
|  | 	}) | ||||||
|  |  | ||||||
|  | 	minetest.register_abm({ | ||||||
|  | 		nodenames = {"moretrees:fir_leaves", "moretrees:fir_leaves_bright"}, | ||||||
|  | 		interval = moretrees.leafdecay_delay, | ||||||
|  | 		chance = moretrees.leafdecay_chance, | ||||||
|  | 		action = function(pos, node, active_object_count, active_object_count_wider) | ||||||
|  | 			if minetest.find_node_near(pos, moretrees.leafdecay_radius, { "ignore", "moretrees:fir_trunk" }) then return end | ||||||
|  | 			process_drops(pos, node.name) | ||||||
|  | 			minetest.remove_node(pos) | ||||||
|  | 			nodeupdate(pos) | ||||||
|  | 		end | ||||||
|  | 	}) | ||||||
|  |  | ||||||
|  | 	minetest.register_abm({ | ||||||
|  | 		nodenames = "moretrees:palm_leaves", | ||||||
|  | 		interval = moretrees.leafdecay_delay, | ||||||
|  | 		chance = moretrees.leafdecay_chance, | ||||||
|  | 		action = function(pos, node, active_object_count, active_object_count_wider) | ||||||
|  | 			if minetest.find_node_near(pos, moretrees.palm_leafdecay_radius, { "ignore", "moretrees:palm_trunk" }) then return end | ||||||
|  | 			process_drops(pos, node.name) | ||||||
|  | 			minetest.remove_node(pos) | ||||||
|  | 			nodeupdate(pos) | ||||||
|  | 		end | ||||||
|  | 	}) | ||||||
|  | end | ||||||
|  |  | ||||||
|  | if moretrees.enable_default_leafdecay then | ||||||
|  |  | ||||||
|  | 	minetest.register_abm({ | ||||||
|  | 		nodenames = "default:leaves", | ||||||
|  | 		interval = moretrees.default_leafdecay_delay, | ||||||
|  | 		chance = moretrees.default_leafdecay_chance, | ||||||
|  | 		action = function(pos, node, active_object_count, active_object_count_wider) | ||||||
|  | 			if minetest.find_node_near(pos, moretrees.default_leafdecay_radius, { "ignore", "default:tree" }) then return end | ||||||
|  | 			process_drops(pos, node.name) | ||||||
|  | 			minetest.remove_node(pos) | ||||||
|  | 			nodeupdate(pos) | ||||||
|  | 		end | ||||||
|  | 	})	 | ||||||
|  | end | ||||||
|  |  | ||||||
|  | -- Decay apple tree blossoms from nature_classic mod  | ||||||
|  | if minetest.get_modpath("nature_classic") then | ||||||
|  | 	minetest.register_abm({ | ||||||
|  | 		nodenames = "moretrees:apple_blossoms", | ||||||
|  | 		interval = moretrees.default_leafdecay_delay, | ||||||
|  | 		chance = moretrees.default_leafdecay_chance, | ||||||
|  | 		action = function(pos, node, active_object_count, active_object_count_wider) | ||||||
|  | 		if minetest.find_node_near(pos, moretrees.leafdecay_radius, { "ignore", "moretrees:apple_tree_trunk" }) then return end | ||||||
|  | 			process_drops(pos, "moretrees:apple_tree_leaves") | ||||||
|  | 			minetest.remove_node(pos) | ||||||
|  | 			nodeupdate(pos) | ||||||
|  | 		end | ||||||
|  | 	}) | ||||||
|  | end | ||||||
|  |  | ||||||
|  | if moretrees.enable_default_jungle_leafdecay then | ||||||
|  | 	minetest.register_abm({ | ||||||
|  | 		nodenames = "default:jungleleaves", | ||||||
|  | 		interval = moretrees.default_jungle_leafdecay_delay, | ||||||
|  | 		chance = moretrees.default_jungle_leafdecay_chance, | ||||||
|  | 		action = function(pos, node, active_object_count, active_object_count_wider) | ||||||
|  | 			if minetest.find_node_near(pos, moretrees.default_jungle_leafdecay_radius, { "ignore", "default:jungletree" }) then return end | ||||||
|  | 			process_drops(pos, node.name) | ||||||
|  | 			minetest.remove_node(pos) | ||||||
|  | 			nodeupdate(pos) | ||||||
|  | 		end | ||||||
|  | 	})	 | ||||||
|  | end | ||||||
|  |  | ||||||
							
								
								
									
										74
									
								
								locale/de.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,74 @@ | |||||||
|  | # 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 (Green) = Tropenbaumlaub (gruen) | ||||||
|  | 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) | ||||||
| @@ -1,211 +0,0 @@ | |||||||
| # textdomain: moretrees |  | ||||||
| # Translation by Xanthin and heavygale |  | ||||||
|  |  | ||||||
|  |  | ||||||
| ### cocos_palm.lua ### |  | ||||||
|  |  | ||||||
| Coconut=Kokosnuss |  | ||||||
| Coconut Flower=Kokosnussblüte |  | ||||||
|  |  | ||||||
| ### crafts.lua ### |  | ||||||
|  |  | ||||||
| Acorn Muffin=Eichelmuffin |  | ||||||
| Acorn Muffin batter=Eichelmuffinteig |  | ||||||
| Coconut Milk=Kokosnussmilch |  | ||||||
| Date=Dattel |  | ||||||
| Date & nut snack=Dattel & Nuss-Snack |  | ||||||
| Date-nut cake=Dattelnusskuchen |  | ||||||
| Date-nut cake batter=Dattelnuss-Kuchenteig |  | ||||||
| Date-nut energy bar=Dattelnuss-Energieriegel |  | ||||||
| Raw Coconut=Kokosnussfleisch |  | ||||||
| Roasted Cedar Cone Nuts=Geröstete Zedernzapfenkerne |  | ||||||
| Roasted Fir Cone Nuts=Geroestete Tannenzapfenkerne |  | ||||||
| Roasted Spruce Cone Nuts=Geroestete Fichtenzapfenkerne |  | ||||||
|  |  | ||||||
| ### date_palm.lua ### |  | ||||||
|  |  | ||||||
| Date Flowers=Dattelblüten |  | ||||||
| Date Stem=Dattelstamm |  | ||||||
| Dates=Datteln |  | ||||||
|  |  | ||||||
| ### node_defs.lua ### |  | ||||||
|  |  | ||||||
| @1 (fast growth)=@1 (schnelles Wachstum) |  | ||||||
| Acorn=Eichel |  | ||||||
| Apple Tree=Apfelbaum |  | ||||||
| Apple Tree Fence=Apfelbaum-Zaun |  | ||||||
| Apple Tree Fence Gate=Apfelbaum-Tor |  | ||||||
| Apple Tree Fence Rail=Apfelbaum-Schiene |  | ||||||
| Apple Tree Leaves=Apfelbaumlaub |  | ||||||
| Apple Tree Planks=Apfelbaumbretter |  | ||||||
| Apple Tree Planks Slab=Apfelbaumplatte |  | ||||||
| Apple Tree Planks Stair=Apfelbaumstufe |  | ||||||
| Apple Tree Sapling=Apfelbaumsetzling |  | ||||||
| Apple Tree Trunk=Apfelbaumstamm |  | ||||||
| Apple Tree Trunk Slab=Apfelbaumstammplatte |  | ||||||
| Apple Tree Trunk Stair=Apfelbaumstammstufe |  | ||||||
| Beech Tree=Buche |  | ||||||
| Beech Tree Fence=Buchenholz-Zaun |  | ||||||
| Beech Tree Fence Gate=Buchenholz-Tor |  | ||||||
| Beech Tree Fence Rail=Buchenholz-Schiene |  | ||||||
| Beech Tree Leaves=Buchenlaub |  | ||||||
| Beech Tree Planks=Buchenholzbretter |  | ||||||
| Beech Tree Planks Slab=Buchenholzplatte |  | ||||||
| Beech Tree Planks Stair=Buchenholzstufe  |  | ||||||
| Beech Tree Sapling=Buchesetzling |  | ||||||
| Beech Tree Trunk=Buchenstamm |  | ||||||
| Beech Tree Trunk Slab=Buchenstammplatte |  | ||||||
| Beech Tree Trunk Stair=Buchenstammstufe |  | ||||||
| Birch Tree=Birke |  | ||||||
| Birch Tree Fence=Birkenholz-Zaun |  | ||||||
| Birch Tree Fence Gate=Birkenholz-Tor |  | ||||||
| Birch Tree Fence Rail=Birkenholz-Schiene |  | ||||||
| Birch Tree Leaves=Birkenlaub |  | ||||||
| Birch Tree Planks=Birkebretter |  | ||||||
| Birch Tree Planks Slab=Birkenholzplatte |  | ||||||
| Birch Tree Planks Stair=Birkeholzstufe |  | ||||||
| Birch Tree Sapling=Birkensetzling |  | ||||||
| Birch Tree Trunk=Birkenstamm |  | ||||||
| Birch Tree Trunk Slab=Birkenstammplatte |  | ||||||
| Birch Tree Trunk Stair=Birkenstammstufe |  | ||||||
| Cedar Cone=Zedernzapfen |  | ||||||
| Cedar Tree=Zeder |  | ||||||
| Cedar Tree Fence=Zedernholz-Zaun |  | ||||||
| Cedar Tree Fence Gate=Zedernholz-Tor |  | ||||||
| Cedar Tree Fence Rail=Zedernholz-Schiene |  | ||||||
| Cedar Tree Leaves=Zederblätter |  | ||||||
| Cedar Tree Planks=Zedernholzbretter |  | ||||||
| Cedar Tree Planks Slab=Zedernholzplatte |  | ||||||
| Cedar Tree Planks Stair=Zedernholzstufe |  | ||||||
| Cedar Tree Sapling=Zedersetzling |  | ||||||
| Cedar Tree Trunk=Zederstamm |  | ||||||
| Cedar Tree Trunk Slab=Zederstammplatte |  | ||||||
| Cedar Tree Trunk Stair=Zederstamm Stufe |  | ||||||
| Date Palm Tree=Dattelpalme |  | ||||||
| Date Palm Tree Fence=Dattelpalmen-Zaun |  | ||||||
| Date Palm Tree Fence Gate=Dattelpalmen-Tor |  | ||||||
| Date Palm Tree Fence Rail=Dattelpalmen-Schiene |  | ||||||
| Date Palm Tree Leaves=Dattelpalmenblätter |  | ||||||
| Date Palm Tree Planks=Dattelpalmenbretter |  | ||||||
| Date Palm Tree Planks Slab=Dattelpalmenplatte |  | ||||||
| Date Palm Tree Planks Stair=Dattelpalmenstufe |  | ||||||
| Date Palm Tree Sapling=Dattelpalmensetzling |  | ||||||
| Date Palm Tree Trunk=Dattelpalmenstamm |  | ||||||
| Date Palm Tree Trunk Slab=Dattelpalmenstammplatte |  | ||||||
| Date Palm Tree Trunk Stair=Dattelpalmenstammstufe |  | ||||||
| Douglas Fir=Douglasie |  | ||||||
| Douglas Fir Fence=Douglasien-Zaun |  | ||||||
| Douglas Fir Fence Gate=Douglasien-Tor |  | ||||||
| Douglas Fir Fence Rail=Douglasien-Schiene |  | ||||||
| Douglas Fir Leaves=Douglasiennadeln |  | ||||||
| Douglas Fir Leaves (Bright)=Douglasiennadeln (breit) |  | ||||||
| Douglas Fir Planks=Douglasienbretter |  | ||||||
| Douglas Fir Planks Slab=Douglasienplatte |  | ||||||
| Douglas Fir Planks Stair=Douglasienstufe |  | ||||||
| Douglas Fir Sapling=Douglasiensetzling |  | ||||||
| Douglas Fir Trunk=Douglasienstamm |  | ||||||
| Douglas Fir Trunk Slab=Douglasienstammplatte |  | ||||||
| Douglas Fir Trunk Stair=Douglasienstammstufe |  | ||||||
| Fir Cone=Tannenzapfen |  | ||||||
| Giant Sequoia=Riesenmammutbaum |  | ||||||
| Giant Sequoia Fence=Riesenmammutbaum-Zaun |  | ||||||
| Giant Sequoia Fence Gate=Riesenmammutbaum-Tor |  | ||||||
| Giant Sequoia Fence Rail=Riesenmammutbaum-Schiene |  | ||||||
| Giant Sequoia Leaves=Riesenmammutbaumlaub |  | ||||||
| Giant Sequoia Planks=Riesenmammutbaumbretter |  | ||||||
| Giant Sequoia Planks Slab=Riesenmammutbaumplatte |  | ||||||
| Giant Sequoia Planks Stair=Riesenmammutbaumstufe |  | ||||||
| Giant Sequoia Sapling=Riesenmammutbaumsetzling |  | ||||||
| Giant Sequoia Trunk=Riesenmammutbaumstamm |  | ||||||
| Giant Sequoia Trunk Slab=Riesenmammutbaumstammplatte |  | ||||||
| Giant Sequoia Trunk Stair=Riesenmammutbaumstammstufe |  | ||||||
| Jungle Tree=Tropenbaum |  | ||||||
| Jungle Tree Fence=Tropenbaum-Zaun |  | ||||||
| Jungle Tree Fence Gate=Tropenbaum-Tor |  | ||||||
| Jungle Tree Fence Rail=Tropenbaum-Schiene |  | ||||||
| Jungle Tree Leaves=Tropenbaumlaub |  | ||||||
| Jungle Tree Leaves (@1)=Tropenbaumlaub (@1) |  | ||||||
| Jungle Tree Planks=Tropenholzbretter |  | ||||||
| Jungle Tree Planks Slab=Tropenholzplatte |  | ||||||
| Jungle Tree Planks Stair=Tropenholzstufe |  | ||||||
| Jungle Tree Sapling=Tropenbaumsetzling |  | ||||||
| Jungle Tree Trunk=Tropenbaumstamm |  | ||||||
| Jungle Tree Trunk Slab=Tropenbaumstammplatte |  | ||||||
| Jungle Tree Trunk Stair=Tropenbaumstammstufe |  | ||||||
| Oak Tree=Eiche |  | ||||||
| Oak Tree Fence=Eichenholz-Zaun |  | ||||||
| Oak Tree Fence Gate=Eichenholz-Tor |  | ||||||
| Oak Tree Fence Rail=Eichenholz-Schiene |  | ||||||
| Oak Tree Leaves=Eichenlaub |  | ||||||
| Oak Tree Planks=Eichenbretter |  | ||||||
| Oak Tree Planks Slab=Eichenholzplatte |  | ||||||
| Oak Tree Planks Stair=Eichenholzstufe |  | ||||||
| Oak Tree Sapling=Eichensetzling |  | ||||||
| Oak Tree Trunk=Eichenstamm |  | ||||||
| Oak Tree Trunk Slab=Eichenstammplatte |  | ||||||
| Oak Tree Trunk Stair=Eichenstammstufe |  | ||||||
| Palm Tree=Palme |  | ||||||
| Palm Tree Fence=Plamenholz-Zaun |  | ||||||
| Palm Tree Fence Gate=Plamenholz-Tor |  | ||||||
| Palm Tree Fence Rail=Plamenholz-Schiene |  | ||||||
| Palm Tree Leaves=Palmenlaub |  | ||||||
| Palm Tree Planks=Palmenbretter |  | ||||||
| Palm Tree Planks Slab=Plamenholzplatte |  | ||||||
| Palm Tree Planks Stair=Plamenholzstufe |  | ||||||
| Palm Tree Sapling=Palmensetzling |  | ||||||
| Palm Tree Trunk=Palmenstamm |  | ||||||
| Palm Tree Trunk Slab=Palmenstammplatte |  | ||||||
| Palm Tree Trunk Stair=Palmenstammstufe |  | ||||||
| Poplar Tree=Pappel |  | ||||||
| Poplar Tree Fence=Pappelholz-Zaun |  | ||||||
| Poplar Tree Fence Gate=Pappelholz-Tor |  | ||||||
| Poplar Tree Fence Rail=Pappelholz-Schiene |  | ||||||
| Poplar Tree Leaves=Pappelblätter |  | ||||||
| Poplar Tree Planks=Pappelholzbretter |  | ||||||
| Poplar Tree Planks Slab=Pappelholzsplatte |  | ||||||
| Poplar Tree Planks Stair=Pappelholzstufe |  | ||||||
| Poplar Tree Sapling=Pappelsetzling |  | ||||||
| Poplar Tree Trunk=Pappelstamm |  | ||||||
| Poplar Tree Trunk Slab=Pappelstammplatte |  | ||||||
| Poplar Tree Trunk Stair=Pappelstammstufe |  | ||||||
| Red=rot |  | ||||||
| Rubber Tree=Gummibaum |  | ||||||
| Rubber Tree Fence=Gummibaum-Zaun |  | ||||||
| Rubber Tree Fence Gate=Gummibaum-Tor |  | ||||||
| Rubber Tree Fence Rail=Gummibaum-Schiene |  | ||||||
| Rubber Tree Leaves=Gummibaumlaub |  | ||||||
| Rubber Tree Planks=Gummibaumbretter |  | ||||||
| Rubber Tree Planks Slab=Gummibaumplatte |  | ||||||
| Rubber Tree Planks Stair=Gummibaumstufe |  | ||||||
| Rubber Tree Sapling=Gummibaumsetzling |  | ||||||
| Rubber Tree Trunk=Gummibaumstamm |  | ||||||
| Rubber Tree Trunk (Empty)=Gummibaumstamm (leer) |  | ||||||
| Rubber Tree Trunk Slab=Gummibaumstammplatte |  | ||||||
| Rubber Tree Trunk Stair=Gummibaumstammstufe |  | ||||||
| Small poplar Tree Sapling=Kleiner Pappelsetzling |  | ||||||
| Spruce Cone=Fichtenzapfen |  | ||||||
| Spruce Tree=Fichte |  | ||||||
| Spruce Tree Fence=Fichtenholz-Zaun |  | ||||||
| Spruce Tree Fence Gate=Fichtenholz-Zaun |  | ||||||
| Spruce Tree Fence Rail=Fichtenholz-Schiene |  | ||||||
| Spruce Tree Leaves=Fichtennadeln |  | ||||||
| Spruce Tree Planks=Fichtenbretter |  | ||||||
| Spruce Tree Planks Slab=Fichtenholzplatte |  | ||||||
| Spruce Tree Planks Stair=Fichtenholzstufe |  | ||||||
| Spruce Tree Sapling=Fichtensetzling |  | ||||||
| Spruce Tree Trunk=Fichtenstamm |  | ||||||
| Spruce Tree Trunk Slab=Fichtenstammplatte |  | ||||||
| Spruce Tree Trunk Stair=Fichtenstammstufe |  | ||||||
| Willow Tree=Weide |  | ||||||
| Willow Tree Fence=Weidenholz-Zaun |  | ||||||
| Willow Tree Fence Gate=Weidenholz-Tor |  | ||||||
| Willow Tree Fence Rail=Weidenholz-Schiene |  | ||||||
| Willow Tree Leaves=Weidenlaub |  | ||||||
| Willow Tree Planks=Weidenbretter |  | ||||||
| Willow Tree Planks Slab=Weidenholzplatte |  | ||||||
| Willow Tree Planks Stair=Weidenholzstufe |  | ||||||
| Willow Tree Sapling=Weidensetzling |  | ||||||
| Willow Tree Trunk=Weidenstamm |  | ||||||
| Willow Tree Trunk Slab=Weidenstammplatte |  | ||||||
| Willow Tree Trunk Stair=Weidenstammstufe |  | ||||||
| Yellow=gelb |  | ||||||
| @@ -1,211 +0,0 @@ | |||||||
| # 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 |  | ||||||
| @@ -1,211 +0,0 @@ | |||||||
| # 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 |  | ||||||
| @@ -1,210 +1,74 @@ | |||||||
| # textdomain: moretrees | # Template | ||||||
|  |  | ||||||
|  |  | ||||||
| ### cocos_palm.lua ### |  | ||||||
|  |  | ||||||
| Coconut= |  | ||||||
| Coconut Flower= |  | ||||||
|  |  | ||||||
| ### crafts.lua ### | ### crafts.lua ### | ||||||
|  | Coconut Milk =  | ||||||
| Acorn Muffin= | Raw Coconut =  | ||||||
| Acorn Muffin batter= | Acorn Muffin batter =  | ||||||
| Coconut Milk= | Acorn Muffin =  | ||||||
| Date= | Roasted Spruce Cone Nuts =  | ||||||
| Date & nut snack= | Roasted Pine Cone Nuts =  | ||||||
| Date-nut cake= | Roasted Fir Cone Nuts =  | ||||||
| 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 ### | ### 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 =  | ||||||
|  |  | ||||||
| @1 (fast growth)= | Acorn =  | ||||||
| Acorn= | Coconut =  | ||||||
| Apple Tree= | Spruce Cone =  | ||||||
| Apple Tree Fence= | Pine Cone =  | ||||||
| Apple Tree Fence Gate= | Fir Cone =  | ||||||
| Apple Tree Fence Rail= | Jungle Sapling =  | ||||||
| Apple Tree Leaves= | Jungle Tree Leaves (Green) =  | ||||||
| Apple Tree Planks= | Jungle Tree Leaves (Yellow) =  | ||||||
| Apple Tree Planks Slab= | Jungle Tree Leaves (Red) =  | ||||||
| Apple Tree Planks Stair= | Douglas Fir Leaves (Bright) =  | ||||||
| Apple Tree Sapling= | Rubber Tree Trunk (Empty) =  | ||||||
| Apple Tree Trunk= |  | ||||||
| Apple Tree Trunk Slab= | [Moretrees] Loaded (2013-02-11) =  | ||||||
| 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= |  | ||||||
|   | |||||||
							
								
								
									
										4
									
								
								mod.conf
									
									
									
									
									
								
							
							
						
						| @@ -1,4 +0,0 @@ | |||||||
| name = moretrees |  | ||||||
| depends = default, biome_lib, vessels |  | ||||||
| optional_depends = doors, stairs, moreblocks, farming |  | ||||||
| min_minetest_version = 5.2.0 |  | ||||||
							
								
								
									
										700
									
								
								node_defs.lua
									
									
									
									
									
								
							
							
						
						| @@ -1,343 +1,165 @@ | |||||||
| local S = minetest.get_translator("moretrees") | local S = moretrees.intllib | ||||||
|  |  | ||||||
| moretrees.avoidnodes = {} | moretrees.avoidnodes = {} | ||||||
|  | 	 | ||||||
| moretrees.treelist = { | moretrees.treelist = { | ||||||
| 	{"beech",        S("Beech Tree")}, | 	{"beech",		"Beech Tree"}, | ||||||
| 	{"apple_tree",   S("Apple Tree")}, | 	{"apple_tree",	"Apple Tree"}, | ||||||
| 	{"oak",          S("Oak Tree"),       "acorn",                 S("Acorn"), {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 0.8 }, | 	{"oak",			"Oak Tree",			"acorn",		"Acorn",		{-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 0.8 }, | ||||||
| 	{"sequoia",      S("Giant Sequoia")}, | 	{"sequoia",		"Giant Sequoia"}, | ||||||
| 	{"birch",        S("Birch Tree")}, | 	{"birch",		"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 }, | 	{"palm",		"Palm Tree",		"coconut",		"Coconut",		{-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",		"Spruce Tree",		"spruce_cone",	"Spruce Cone",	{-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 0.8 }, | ||||||
| 	{"spruce",       S("Spruce Tree"),    "spruce_cone",           S("Spruce Cone"), {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 0.8 }, | 	{"pine",		"Pine Tree",		"pine_cone",	"Pine 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 }, | 	{"willow",		"Willow Tree"}, | ||||||
| 	{"poplar",       S("Poplar Tree")}, | 	{"acacia",		"Acacia Tree"}, | ||||||
| 	{"poplar_small", S("Poplar Tree")}, | 	{"rubber_tree",	"Rubber Tree"}, | ||||||
| 	{"willow",       S("Willow Tree")}, | 	{"jungletree",	"Jungle Tree"}, | ||||||
| 	{"rubber_tree",  S("Rubber Tree")}, | 	{"fir",			"Douglas Fir",		"fir_cone",		"Fir Cone",		{-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 0.8 }, | ||||||
| 	{"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"  }, |  | ||||||
| } | } | ||||||
|  |  | ||||||
| moretrees.treedesc = { | local dirs1 = { 21, 20, 23, 22, 21 } | ||||||
| 	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 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_new_leaves_drawtype = "allfaces_optional" | ||||||
| local moretrees_plantlike_leaves_visual_scale = 1 | local moretrees_plantlike_leaves_visual_scale = 1 | ||||||
| local moretrees_new_leaves_waving = 1 |  | ||||||
|  |  | ||||||
| if moretrees.plantlike_leaves then | if moretrees.plantlike_leaves then  | ||||||
| 	moretrees_new_leaves_drawtype = "plantlike" | 	moretrees_new_leaves_drawtype = "plantlike" | ||||||
| 	moretrees_plantlike_leaves_visual_scale = math.sqrt(2) | 	moretrees_plantlike_leaves_visual_scale = 1.189 | ||||||
| end | end | ||||||
|  |  | ||||||
| -- redefine default leaves to handle plantlike and/or leaf decay options | -- redefine default leaves to handle plantlike and/or leaf decay options | ||||||
|  |  | ||||||
|  | if moretrees.enable_default_leafdecay then | ||||||
|  | 	minetest.override_item("default:leaves", { | ||||||
|  | 		groups = { snappy = 3, flammable = 2, leaves = 1 } | ||||||
|  | 	}) | ||||||
|  | end | ||||||
| if moretrees.plantlike_leaves then | if moretrees.plantlike_leaves then | ||||||
| 	minetest.override_item("default:leaves", { | 	minetest.override_item("default:leaves", { | ||||||
| 		inventory_image = minetest.inventorycube("default_leaves.png"), | 		inventory_image = minetest.inventorycube("default_leaves.png"), | ||||||
| 		drawtype = "plantlike", | 		drawtype = "plantlike", | ||||||
| 		visual_scale = math.sqrt(2) | 		visual_scale = 1.189 | ||||||
|  | 	}) | ||||||
|  | else | ||||||
|  | 	minetest.override_item("default:leaves", { | ||||||
|  | 		waving = 1 | ||||||
| 	}) | 	}) | ||||||
| end | end | ||||||
|  |  | ||||||
| -- redefine default jungle leaves for same | -- redefine default jungle leaves for same | ||||||
|  |  | ||||||
|  | if moretrees.enable_default_leafdecay then | ||||||
|  | 	minetest.override_item("default:jungleleaves", { | ||||||
|  | 		groups = { snappy = 3, flammable = 2, leaves = 1 } | ||||||
|  | 	}) | ||||||
|  | end | ||||||
| if moretrees.plantlike_leaves then | if moretrees.plantlike_leaves then | ||||||
| 	minetest.override_item("default:jungleleaves", { | 	minetest.override_item("default:jungleleaves", { | ||||||
| 		inventory_image = minetest.inventorycube("default_jungleleaves.png"), | 		inventory_image = minetest.inventorycube("default_jungleleaves.png"), | ||||||
| 		drawtype = "plantlike", | 		drawtype = "plantlike", | ||||||
| 		visual_scale = math.sqrt(2) | 		visual_scale = 1.189 | ||||||
|  | 	}) | ||||||
|  | else | ||||||
|  | 	minetest.override_item("default:jungleleaves", { | ||||||
|  | 		waving = 1 | ||||||
| 	}) | 	}) | ||||||
| end | end | ||||||
|  |  | ||||||
| for i in ipairs(moretrees.treelist) do | for i in ipairs(moretrees.treelist) do | ||||||
| 	local treename = moretrees.treelist[i][1] | 	local treename = moretrees.treelist[i][1] | ||||||
|  | 	local treedesc = moretrees.treelist[i][2] | ||||||
| 	local fruit = moretrees.treelist[i][3] | 	local fruit = moretrees.treelist[i][3] | ||||||
| 	local fruitdesc = moretrees.treelist[i][4] | 	local fruitdesc = moretrees.treelist[i][4] | ||||||
| 	local selbox = moretrees.treelist[i][5] | 	local selbox = moretrees.treelist[i][5] | ||||||
| 	local vscale = moretrees.treelist[i][6] | 	local vscale = moretrees.treelist[i][6] | ||||||
|  |  | ||||||
| 	local saptex = moretrees.treelist[i][7] | 	if treename ~= "jungletree" then -- the default game provides jungle tree trunk/planks nodes. | ||||||
|  |  | ||||||
| 	-- player will get a sapling with 1/100 chance |  | ||||||
| 	-- player will get leaves only if he/she gets no saplings, |  | ||||||
| 	-- this is because max_items is 1 |  | ||||||
|  |  | ||||||
| 	local droprarity = 100 |  | ||||||
| 	local decay = moretrees.leafdecay_radius |  | ||||||
|  |  | ||||||
| 	if treename == "palm" then |  | ||||||
| 		droprarity = 20 |  | ||||||
| 		decay = moretrees.palm_leafdecay_radius |  | ||||||
| 	elseif treename == "date_palm" then |  | ||||||
| 		decay = moretrees.date_palm_leafdecay_radius |  | ||||||
| 	end |  | ||||||
|  |  | ||||||
| 	if treename ~= "jungletree"  -- the default game provides jungle tree and pine trunk/planks nodes. |  | ||||||
| 		and treename ~= "poplar_small" |  | ||||||
| 		and treename ~= "pine" then |  | ||||||
|  |  | ||||||
| 		saptex = "moretrees_"..treename.."_sapling.png" |  | ||||||
|  |  | ||||||
| 		minetest.register_node("moretrees:"..treename.."_trunk", { | 		minetest.register_node("moretrees:"..treename.."_trunk", { | ||||||
| 			description = moretrees.treedesc[treename].trunk, | 			description = S(treedesc.." Trunk"), | ||||||
| 			tiles = { | 			tiles = { | ||||||
| 				"moretrees_"..treename.."_trunk_top.png", | 				"moretrees_"..treename.."_trunk_top.png", | ||||||
| 				"moretrees_"..treename.."_trunk_top.png", | 				"moretrees_"..treename.."_trunk_top.png", | ||||||
| 				"moretrees_"..treename.."_trunk.png" | 				"moretrees_"..treename.."_trunk.png" | ||||||
| 			}, | 			}, | ||||||
| 			paramtype2 = "facedir", | 			paramtype2 = "facedir", | ||||||
| 			is_ground_content = false, | 			is_ground_content = true, | ||||||
| 			groups = {tree=1,snappy=1,choppy=2,oddly_breakable_by_hand=1,flammable=2}, | 			groups = {tree=1,snappy=1,choppy=2,oddly_breakable_by_hand=1,flammable=2}, | ||||||
| 			sounds = default.node_sound_wood_defaults(), | 			sounds = default.node_sound_wood_defaults(), | ||||||
| 			on_place = minetest.rotate_node, | 			on_place = minetest.rotate_node, | ||||||
| 		}) | 		}) | ||||||
|  |  | ||||||
| 		minetest.register_node("moretrees:"..treename.."_planks", { | 		minetest.register_node("moretrees:"..treename.."_planks", { | ||||||
| 			description = moretrees.treedesc[treename].planks, | 			description = S(treedesc.." Planks"), | ||||||
| 			tiles = {"moretrees_"..treename.."_wood.png"}, | 			tiles = {"moretrees_"..treename.."_wood.png"}, | ||||||
| 			is_ground_content = false, | 			is_ground_content = true, | ||||||
| 			groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1}, | 			groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1}, | ||||||
| 			sounds = default.node_sound_wood_defaults(), | 			sounds = default.node_sound_wood_defaults(), | ||||||
| 		}) | 		}) | ||||||
|  |  | ||||||
| 		minetest.register_node("moretrees:"..treename.."_sapling", { | 		minetest.register_node("moretrees:"..treename.."_sapling", { | ||||||
| 			description = moretrees.treedesc[treename].sapling, | 			description = S(treedesc.." Sapling"), | ||||||
| 			drawtype = "plantlike", | 			drawtype = "plantlike", | ||||||
| 			tiles = {saptex}, | 			tiles = {"moretrees_"..treename.."_sapling.png"}, | ||||||
| 			inventory_image = saptex, | 			inventory_image = "moretrees_"..treename.."_sapling.png", | ||||||
| 			paramtype = "light", | 			paramtype = "light", | ||||||
| 			paramtype2 = "waving", |  | ||||||
| 			walkable = false, | 			walkable = false, | ||||||
| 			is_ground_content = true, |  | ||||||
| 			selection_box = { | 			selection_box = { | ||||||
| 				type = "fixed", | 				type = "fixed", | ||||||
| 				fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3} | 				fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3} | ||||||
| 			}, | 			}, | ||||||
| 			groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,sapling=1}, | 			groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,sapling=1}, | ||||||
| 			sounds = default.node_sound_defaults(), | 			sounds = default.node_sound_defaults(), | ||||||
| 			on_place = function(itemstack, placer, pointed_thing) | 		}) | ||||||
| 				itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, | 	 | ||||||
| 					"moretrees:" ..treename.. "_sapling", | 		minetest.register_node("moretrees:"..treename.."_sapling_ongen", { | ||||||
| 					-- minp, maxp to be checked, relative to sapling pos | 			description = S(treedesc.." Sapling"), | ||||||
| 					-- minp_relative.y = 1 because sapling pos has been checked | 			drawtype = "plantlike", | ||||||
| 					{x = -3, y = 1, z = -3}, | 			tiles = {"moretrees_"..treename.."_sapling.png"}, | ||||||
| 					{x = 3, y = 6, z = 3}, | 			inventory_image = "moretrees_"..treename.."_sapling.png", | ||||||
| 					-- maximum interval of interior volume check | 			paramtype = "light", | ||||||
| 					4) | 			walkable = false, | ||||||
|  | 			selection_box = { | ||||||
| 				return itemstack | 				type = "fixed", | ||||||
| 			end, | 				fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3} | ||||||
|  | 			}, | ||||||
|  | 			groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,not_in_creative_inventory=1,sapling=1}, | ||||||
|  | 			sounds = default.node_sound_defaults(), | ||||||
|  | 			drop = "moretrees:"..treename.."_sapling" | ||||||
| 		}) | 		}) | ||||||
|  |  | ||||||
|  | 		-- player will get a sapling with 1/100 chance | ||||||
|  | 		-- player will get leaves only if he/she gets no saplings, | ||||||
|  | 		-- this is because max_items is 1 | ||||||
|  |  | ||||||
|  |  | ||||||
|  | 		local droprarity = 100 | ||||||
|  |  | ||||||
|  | 		if treename == "palm" then | ||||||
|  | 			droprarity = 20 | ||||||
|  | 		end | ||||||
|  |  | ||||||
| 		local moretrees_leaves_inventory_image = nil | 		local moretrees_leaves_inventory_image = nil | ||||||
|  | 		local moretrees_new_leaves_waving = nil | ||||||
|  |  | ||||||
| 		if moretrees.plantlike_leaves then | 		if moretrees.plantlike_leaves then | ||||||
| 			moretrees_leaves_inventory_image = minetest.inventorycube("moretrees_"..treename.."_leaves.png") | 			moretrees_leaves_inventory_image = minetest.inventorycube("moretrees_"..treename.."_leaves.png") | ||||||
|  | 		else | ||||||
|  | 			moretrees_new_leaves_waving = 1 | ||||||
| 		end | 		end | ||||||
|  |  | ||||||
| 		minetest.register_node("moretrees:"..treename.."_leaves", { | 		minetest.register_node("moretrees:"..treename.."_leaves", { | ||||||
| 			description = moretrees.treedesc[treename].leaves, | 			description = S(treedesc.." Leaves"), | ||||||
| 			drawtype = moretrees_new_leaves_drawtype, | 			drawtype = moretrees_new_leaves_drawtype, | ||||||
| 			waving = moretrees_new_leaves_waving, | 			waving = moretrees_new_leaves_waving, | ||||||
| 			visual_scale = moretrees_plantlike_leaves_visual_scale, | 			visual_scale = moretrees_plantlike_leaves_visual_scale, | ||||||
| 			tiles = { "moretrees_"..treename.."_leaves.png" }, | 			tiles = { "moretrees_"..treename.."_leaves.png" }, | ||||||
| 			inventory_image = moretrees_leaves_inventory_image, | 			inventory_image = moretrees_leaves_inventory_image, | ||||||
| 			paramtype = "light", | 			paramtype = "light", | ||||||
| 			is_ground_content = false, | 			groups = {snappy=3, flammable=2, leaves=1, moretrees_leaves=1}, | ||||||
| 			groups = {snappy = 3, flammable = 2, leaves = 1, moretrees_leaves = 1, leafdecay = 1}, |  | ||||||
| 			sounds = default.node_sound_leaves_defaults(), | 			sounds = default.node_sound_leaves_defaults(), | ||||||
|  |  | ||||||
| 			drop = { | 			drop = { | ||||||
| @@ -349,171 +171,66 @@ for i in ipairs(moretrees.treelist) do | |||||||
| 			}, | 			}, | ||||||
| 		}) | 		}) | ||||||
|  |  | ||||||
| 		if moretrees.enable_stairs then | 		if minetest.get_modpath("moreblocks") and moretrees.enable_stairsplus then | ||||||
| 			if minetest.get_modpath("moreblocks") then |  | ||||||
|  |  | ||||||
| 	--			stairsplus:register_all(modname, subname, recipeitem, {fields}) | --			stairsplus:register_all(modname, subname, recipeitem, {fields}) | ||||||
|  |  | ||||||
| 				stairsplus:register_all( | 			stairsplus:register_all( | ||||||
| 					"moretrees", | 				"moretrees", | ||||||
| 					treename.."_trunk", | 				treename.."_trunk", | ||||||
| 					"moretrees:"..treename.."_trunk", | 				"moretrees:"..treename.."_trunk",  | ||||||
| 					{ | 				{ | ||||||
| 						groups = { snappy=1, choppy=2, oddly_breakable_by_hand=1, flammable=2, not_in_creative_inventory=1 }, | 					groups = { snappy=1, choppy=2, oddly_breakable_by_hand=1, flammable=2, not_in_creative_inventory=1 }, | ||||||
| 						tiles =	{ | 					tiles =	{ | ||||||
| 							"moretrees_"..treename.."_trunk_top.png", | 						"moretrees_"..treename.."_trunk_top.png", | ||||||
| 							"moretrees_"..treename.."_trunk_top.png", |  | ||||||
| 							"moretrees_"..treename.."_trunk.png" |  | ||||||
| 						}, |  | ||||||
| 						description = moretrees.treedesc[treename].trunk, |  | ||||||
| 						drop = treename.."_trunk", |  | ||||||
| 					} |  | ||||||
| 				) |  | ||||||
|  |  | ||||||
| 				stairsplus:register_all( |  | ||||||
| 					"moretrees", |  | ||||||
| 					treename.."_planks", |  | ||||||
| 					"moretrees:"..treename.."_planks", |  | ||||||
| 					{ |  | ||||||
| 						groups = { snappy=1, choppy=2, oddly_breakable_by_hand=2, flammable=3, not_in_creative_inventory=1 }, |  | ||||||
| 						tiles = { "moretrees_"..treename.."_wood.png" }, |  | ||||||
| 						description = moretrees.treedesc[treename].planks, |  | ||||||
| 						drop = treename.."_planks", |  | ||||||
| 					} |  | ||||||
| 				) |  | ||||||
| 			elseif minetest.get_modpath("stairs") then |  | ||||||
| 				stairs.register_stair_and_slab( |  | ||||||
| 					"moretrees_"..treename.."_trunk", |  | ||||||
| 					"moretrees:"..treename.."_trunk", |  | ||||||
| 					{ snappy=1, choppy=2, oddly_breakable_by_hand=1, flammable=2 }, |  | ||||||
| 					{	"moretrees_"..treename.."_trunk_top.png", |  | ||||||
| 						"moretrees_"..treename.."_trunk_top.png", | 						"moretrees_"..treename.."_trunk_top.png", | ||||||
| 						"moretrees_"..treename.."_trunk.png" | 						"moretrees_"..treename.."_trunk.png" | ||||||
| 					}, | 					}, | ||||||
| 					moretrees.treedesc[treename].trunk_stair, | 					description = S(treedesc.." Trunk"), | ||||||
| 					moretrees.treedesc[treename].trunk_slab, | 					drop = treename.."_trunk", | ||||||
| 					default.node_sound_wood_defaults() | 				} | ||||||
| 				) | 			) | ||||||
|  |  | ||||||
| 				stairs.register_stair_and_slab( | 			stairsplus:register_all( | ||||||
| 					"moretrees_"..treename.."_planks", | 				"moretrees", | ||||||
| 					"moretrees:"..treename.."_planks", | 				treename.."_planks", | ||||||
| 					{ snappy=1, choppy=2, oddly_breakable_by_hand=2, flammable=3 }, | 				"moretrees:"..treename.."_planks", | ||||||
| 					{ "moretrees_"..treename.."_wood.png" }, | 				{ | ||||||
| 					moretrees.treedesc[treename].planks_stair, |  					groups = { snappy=1, choppy=2, oddly_breakable_by_hand=2, flammable=3, not_in_creative_inventory=1 }, | ||||||
| 					moretrees.treedesc[treename].planks_slab, | 					tiles = { "moretrees_"..treename.."_wood.png" }, | ||||||
| 					default.node_sound_wood_defaults() | 					description = S(treedesc.." Planks"), | ||||||
| 				) | 					drop = treename.."_planks", | ||||||
|  | 				} | ||||||
| 			end | 			) | ||||||
| 		end |  | ||||||
|  |  | ||||||
| 		if moretrees.enable_fences then |  | ||||||
| 			local planks_name = "moretrees:" .. treename .. "_planks" |  | ||||||
| 			local planks_tile = "moretrees_" .. treename .. "_wood.png" |  | ||||||
| 			default.register_fence("moretrees:" .. treename .. "_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", |  | ||||||
| 				wield_image = "default_fence_overlay.png^" .. planks_tile .. |  | ||||||
| 										"^default_fence_overlay.png^[makealpha:255,126,126", |  | ||||||
| 				material = planks_name, |  | ||||||
| 				groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, |  | ||||||
| 				sounds = default.node_sound_wood_defaults() |  | ||||||
| 			}) |  | ||||||
| 			default.register_fence_rail("moretrees:" .. treename .. "_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", |  | ||||||
| 				wield_image = "default_fence_rail_overlay.png^" .. planks_tile .. |  | ||||||
| 										"^default_fence_rail_overlay.png^[makealpha:255,126,126", |  | ||||||
| 				material = planks_name, |  | ||||||
| 				groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, |  | ||||||
| 				sounds = default.node_sound_wood_defaults() |  | ||||||
| 			}) |  | ||||||
| 			if minetest.global_exists("doors") then |  | ||||||
| 				doors.register_fencegate("moretrees:" .. treename .. "_gate", { |  | ||||||
| 					description = moretrees.treedesc[treename].fence_gate, |  | ||||||
| 					texture = planks_tile, |  | ||||||
| 					material = planks_name, |  | ||||||
| 					groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2} |  | ||||||
| 				}) |  | ||||||
| 			end |  | ||||||
| 		end | 		end | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
| 	minetest.register_node("moretrees:"..treename.."_sapling_ongen", { |  | ||||||
| 		description = S("@1 (fast growth)", moretrees.treedesc[treename].sapling), |  | ||||||
| 		drawtype = "plantlike", |  | ||||||
| 		tiles = {saptex}, |  | ||||||
| 		inventory_image = saptex, |  | ||||||
| 		paramtype = "light", |  | ||||||
| 		paramtype2 = "waving", |  | ||||||
| 		walkable = false, |  | ||||||
| 		is_ground_content = true, |  | ||||||
| 		selection_box = { |  | ||||||
| 			type = "fixed", |  | ||||||
| 			fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3} |  | ||||||
| 		}, |  | ||||||
| 		groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,sapling=1}, |  | ||||||
| 		sounds = default.node_sound_defaults(), |  | ||||||
| 		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 | 	if fruit then | ||||||
| 		fruitname = "moretrees:"..fruit | 		minetest.register_node("moretrees:"..fruit, { | ||||||
| 		minetest.register_node(fruitname, { | 			description = S(fruitdesc), | ||||||
| 			description = fruitdesc, |  | ||||||
| 			drawtype = "plantlike", | 			drawtype = "plantlike", | ||||||
| 			tiles = { "moretrees_"..fruit..".png" }, | 			tiles = { "moretrees_"..fruit..".png" }, | ||||||
| 			inventory_image = "moretrees_"..fruit..".png^[transformR180", | 			inventory_image = "moretrees_"..fruit..".png^[transformR180", | ||||||
| 			wield_image = "moretrees_"..fruit..".png^[transformR180", | 			wield_image = "moretrees_"..fruit..".png^[transformR180", | ||||||
| 			visual_scale = vscale, | 			visual_scale = vscale, | ||||||
| 			paramtype = "light", |  | ||||||
| 			sunlight_propagates = true, |  | ||||||
| 			is_ground_content = false, |  | ||||||
| 			walkable = false, | 			walkable = false, | ||||||
|  | 			paramtype = "light", | ||||||
| 			selection_box = { | 			selection_box = { | ||||||
| 				type = "fixed", | 				type = "fixed", | ||||||
| 					fixed = selbox | 					fixed = selbox | ||||||
| 				}, | 				}, | ||||||
| 			groups = {fleshy=3,dig_immediate=3,flammable=2, attached_node=1, leafdecay = 1, leafdecay_drop = 1}, | 			groups = {fleshy=3,dig_immediate=3,flammable=2, attached_node=1}, | ||||||
| 			sounds = default.node_sound_defaults(), | 			sounds = default.node_sound_defaults(), | ||||||
| 		}) | 		}) | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
| 	if treename ~= "jungletree" |  | ||||||
| 		and treename ~= "poplar_small" |  | ||||||
| 		and treename ~= "pine" then |  | ||||||
| 			default.register_leafdecay({ |  | ||||||
| 				trunks = { "moretrees:"..treename.."_trunk" }, |  | ||||||
| 				leaves = { "moretrees:"..treename.."_leaves", fruitname }, |  | ||||||
| 				radius = decay, |  | ||||||
| 			}) |  | ||||||
| 	end |  | ||||||
|  |  | ||||||
| 	minetest.register_abm({ | 	minetest.register_abm({ | ||||||
| 		nodenames = { "moretrees:"..treename.."_trunk_sideways" }, | 		nodenames = { "moretrees:"..treename.."_trunk_sideways" }, | ||||||
| 		interval = 1, | 		interval = 1, | ||||||
| 		chance = 1, | 		chance = 1, | ||||||
| 		action = function(pos, node, active_object_count, active_object_count_wider) | 		action = function(pos, node, active_object_count, active_object_count_wider) | ||||||
| 			local fdir = node.param2 or 0 | 			local fdir = node.param2 or 0 | ||||||
| 				local nfdir = dirs2[fdir+1] | 				nfdir = dirs2[fdir+1] | ||||||
| 			minetest.add_node(pos, {name = "moretrees:"..treename.."_trunk", param2 = nfdir}) | 			minetest.add_node(pos, {name = "moretrees:"..treename.."_trunk", param2 = nfdir}) | ||||||
| 		end, | 		end, | ||||||
| 	}) | 	}) | ||||||
| @@ -521,77 +238,74 @@ for i in ipairs(moretrees.treelist) do | |||||||
| 	table.insert(moretrees.avoidnodes, "moretrees:"..treename.."_trunk") | 	table.insert(moretrees.avoidnodes, "moretrees:"..treename.."_trunk") | ||||||
|  |  | ||||||
| 	if moretrees.spawn_saplings then | 	if moretrees.spawn_saplings then | ||||||
| 			table.insert(moretrees.avoidnodes, "moretrees:"..treename.."_sapling") | 		table.insert(moretrees.avoidnodes, "moretrees:"..treename.."_sapling") | ||||||
| 			table.insert(moretrees.avoidnodes, "moretrees:"..treename.."_sapling_ongen") | 		table.insert(moretrees.avoidnodes, "moretrees:"..treename.."_sapling_ongen") | ||||||
| 	end | 	end | ||||||
| end | end | ||||||
|  |  | ||||||
| -- Add small poplar saplings |  | ||||||
|  |  | ||||||
| local poplar_sapling = minetest.registered_nodes["moretrees:poplar_sapling"] |  | ||||||
| local poplar_sapling_ongen = minetest.registered_nodes["moretrees:poplar_sapling_ongen"] |  | ||||||
| local poplar_small_sapling = {} |  | ||||||
| local poplar_small_sapling_ongen = {} |  | ||||||
| for k,v in pairs(poplar_sapling) do |  | ||||||
| 	poplar_small_sapling[k] = v |  | ||||||
| end |  | ||||||
| for k,v in pairs(poplar_sapling_ongen) do |  | ||||||
| 	poplar_small_sapling_ongen[k] = v |  | ||||||
| end |  | ||||||
| poplar_small_sapling.tiles = {"moretrees_poplar_small_sapling.png"} |  | ||||||
| poplar_small_sapling.inventory_image = "moretrees_poplar_small_sapling.png" |  | ||||||
| poplar_small_sapling.is_ground_content = true |  | ||||||
| poplar_small_sapling_ongen.tiles_ongen = {"moretrees_poplar_small_sapling.png"} |  | ||||||
| poplar_small_sapling_ongen.inventory_image_ongen = "moretrees_poplar_small_sapling.png" |  | ||||||
| poplar_small_sapling_ongen.drop = "moretrees:poplar_small_sapling" |  | ||||||
| poplar_small_sapling_ongen.is_ground_content = true |  | ||||||
|  |  | ||||||
| minetest.register_node("moretrees:poplar_small_sapling", poplar_small_sapling) |  | ||||||
| minetest.register_node("moretrees:poplar_small_sapling_ongen", poplar_small_sapling_ongen) |  | ||||||
| if moretrees.spawn_saplings then |  | ||||||
| 	table.insert(moretrees.avoidnodes, "moretrees:poplar_sapling") |  | ||||||
| 	table.insert(moretrees.avoidnodes, "moretrees:poplar_small_sapling_ongen") |  | ||||||
| end |  | ||||||
|  |  | ||||||
| local poplar_leaves_drop = minetest.registered_nodes["moretrees:poplar_leaves"].drop |  | ||||||
| minetest.override_item("moretrees:poplar_leaves", { |  | ||||||
| 	drop = { |  | ||||||
| 		max_items = poplar_leaves_drop.maxitems, |  | ||||||
| 		items = { |  | ||||||
| 			{items = {"moretrees:poplar_sapling"}, rarity = 1.33 * poplar_leaves_drop.items[1].rarity }, |  | ||||||
| 			{items = {"moretrees:poplar_small_sapling"}, rarity = 1.33 * poplar_leaves_drop.items[1].rarity }, |  | ||||||
| 			{items = {"moretrees:poplar_leaves"} } |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| }) |  | ||||||
|  |  | ||||||
| -- Extra nodes for jungle trees: | -- Extra nodes for jungle trees: | ||||||
|  |  | ||||||
| local jungleleaves = {"yellow","red"} | minetest.register_node("moretrees:jungletree_sapling", { | ||||||
| local jungleleavesnames = {S("Yellow"), S("Red")} | 	description = S("Jungle Sapling"), | ||||||
| for color = 1, #jungleleaves do | 	drawtype = "plantlike", | ||||||
|  | 	visual_scale = 1.0, | ||||||
|  | 	tiles = {"default_junglesapling.png"}, | ||||||
|  | 	inventory_image = "default_junglesapling.png", | ||||||
|  | 	wield_image = "default_junglesapling.png", | ||||||
|  | 	paramtype = "light", | ||||||
|  | 	walkable = false, | ||||||
|  | 	selection_box = { | ||||||
|  | 		type = "fixed", | ||||||
|  | 		fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3} | ||||||
|  | 	}, | ||||||
|  | 	groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,sapling=1}, | ||||||
|  | 	sounds = default.node_sound_leaves_defaults(), | ||||||
|  | }) | ||||||
|  |  | ||||||
|  | minetest.register_node("moretrees:jungletree_sapling_ongen", { | ||||||
|  | 	description = S("Jungle Sapling"), | ||||||
|  | 	drawtype = "plantlike", | ||||||
|  | 	visual_scale = 1.0, | ||||||
|  | 	tiles = {"default_junglesapling.png"}, | ||||||
|  | 	inventory_image = "default_junglesapling.png", | ||||||
|  | 	wield_image = "default_junglesapling.png", | ||||||
|  | 	paramtype = "light", | ||||||
|  | 	walkable = false, | ||||||
|  | 	selection_box = { | ||||||
|  | 		type = "fixed", | ||||||
|  | 		fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3} | ||||||
|  | 	}, | ||||||
|  | 	groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,not_in_creative_inventory=1,sapling=1}, | ||||||
|  | 	sounds = default.node_sound_leaves_defaults(), | ||||||
|  | 	drop = "moretrees:jungletree_sapling" | ||||||
|  | }) | ||||||
|  |  | ||||||
|  | local jungleleaves = {"green","yellow","red"} | ||||||
|  | local jungleleavesnames = {"Green", "Yellow", "Red"} | ||||||
|  | for color = 1, 3 do | ||||||
| 	local leave_name = "moretrees:jungletree_leaves_"..jungleleaves[color] | 	local leave_name = "moretrees:jungletree_leaves_"..jungleleaves[color] | ||||||
|  |  | ||||||
| 	local moretrees_leaves_inventory_image = nil | 	local moretrees_leaves_inventory_image = nil | ||||||
|  |  | ||||||
| 	if moretrees.plantlike_leaves then | 	if moretrees.plantlike_leaves then | ||||||
| 		moretrees_leaves_inventory_image = minetest.inventorycube("moretrees_jungletree_leaves_"..jungleleaves[color]..".png") | 		moretrees_leaves_inventory_image = minetest.inventorycube("moretrees_jungletree_leaves_"..jungleleaves[color]..".png") | ||||||
|  | 	else | ||||||
|  | 		moretrees_new_leaves_waving = 1 | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
| 	minetest.register_node(leave_name, { | 	minetest.register_node(leave_name, { | ||||||
| 		description = S("Jungle Tree Leaves (@1)", jungleleavesnames[color]), | 		description = S("Jungle Tree Leaves ("..jungleleavesnames[color]..")"), | ||||||
| 		drawtype = moretrees_new_leaves_drawtype, | 		drawtype = moretrees_new_leaves_drawtype, | ||||||
| 		waving = moretrees_new_leaves_waving, | 		waving = moretrees_new_leaves_waving, | ||||||
| 		visual_scale = moretrees_plantlike_leaves_visual_scale, | 		visual_scale = moretrees_plantlike_leaves_visual_scale, | ||||||
| 		tiles = {"moretrees_jungletree_leaves_"..jungleleaves[color]..".png"}, | 		tiles = {"moretrees_jungletree_leaves_"..jungleleaves[color]..".png"}, | ||||||
| 		inventory_image = moretrees_leaves_inventory_image, | 		inventory_image = moretrees_leaves_inventory_image, | ||||||
| 		paramtype = "light", | 		paramtype = "light", | ||||||
| 		is_ground_content = false, | 		groups = {snappy=3, flammable=2, leaves=1, moretrees_leaves=1}, | ||||||
| 		groups = {snappy = 3, flammable = 2, leaves = 1, moretrees_leaves = 1, leafdecay = 3 }, |  | ||||||
| 		drop = { | 		drop = { | ||||||
| 			max_items = 1, | 			max_items = 1, | ||||||
| 			items = { | 			items = { | ||||||
| 				{items = {"default:junglesapling"}, rarity = 100 }, | 				{items = {'moretrees:jungletree_sapling'}, rarity = 100 }, | ||||||
| 				{items = {"moretrees:jungletree_leaves_"..jungleleaves[color]} } | 				{items = {"moretrees:jungletree_leaves_"..jungleleaves[color]} } | ||||||
| 			} | 			} | ||||||
| 		}, | 		}, | ||||||
| @@ -599,20 +313,6 @@ for color = 1, #jungleleaves do | |||||||
| 	}) | 	}) | ||||||
| end | end | ||||||
|  |  | ||||||
| -- To get Moretrees to generate its own jungle trees among the default mapgen |  | ||||||
| -- we need our own copy of that node, which moretrees will match against. |  | ||||||
|  |  | ||||||
| local jungle_tree = table.copy(minetest.registered_nodes["default:jungletree"]) |  | ||||||
| jungle_tree.drop = jungle_tree.drop or { items = {} } |  | ||||||
| table.insert(jungle_tree.drop.items, { items = {"default:jungletree"}}) |  | ||||||
| minetest.register_node("moretrees:jungletree_trunk", jungle_tree) |  | ||||||
|  |  | ||||||
| default.register_leafdecay({ |  | ||||||
| 	trunks = { "default:jungletree", "moretrees:jungletree_trunk" }, |  | ||||||
| 	leaves = { "default:jungleleaves", "moretrees:jungletree_leaves_yellow", "moretrees:jungletree_leaves_red" }, |  | ||||||
| 	radius = moretrees.leafdecay_radius, |  | ||||||
| }) |  | ||||||
|  |  | ||||||
| -- Extra needles for firs | -- Extra needles for firs | ||||||
|  |  | ||||||
| local moretrees_leaves_inventory_image = nil | local moretrees_leaves_inventory_image = nil | ||||||
| @@ -629,8 +329,7 @@ minetest.register_node("moretrees:fir_leaves_bright", { | |||||||
| 	tiles = { "moretrees_fir_leaves_bright.png" }, | 	tiles = { "moretrees_fir_leaves_bright.png" }, | ||||||
| 	inventory_image = moretrees_leaves_inventory_image, | 	inventory_image = moretrees_leaves_inventory_image, | ||||||
| 	paramtype = "light", | 	paramtype = "light", | ||||||
| 	is_ground_content = false, | 	groups = {snappy=3, flammable=2, leaves=1, moretrees_leaves=1 }, | ||||||
| 	groups = {snappy = 3, flammable = 2, leaves = 1, moretrees_leaves = 1, leafdecay = 3 }, |  | ||||||
| 	drop = { | 	drop = { | ||||||
| 		max_items = 1, | 		max_items = 1, | ||||||
| 		items = { | 		items = { | ||||||
| @@ -641,29 +340,22 @@ minetest.register_node("moretrees:fir_leaves_bright", { | |||||||
| 	sounds = default.node_sound_leaves_defaults() | 	sounds = default.node_sound_leaves_defaults() | ||||||
| }) | }) | ||||||
|  |  | ||||||
| default.register_leafdecay({ |  | ||||||
| 	trunks = { "moretrees:fir_trunk" }, |  | ||||||
| 	leaves = { "moretrees:fir_leaves", "moretrees:fir_leaves_bright" }, |  | ||||||
| 	radius = moretrees.leafdecay_radius, |  | ||||||
| }) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| if moretrees.enable_redefine_apple then | if moretrees.enable_redefine_apple then | ||||||
| 	local appledef = table.copy(minetest.registered_nodes["default:apple"]) | 	minetest.override_item("default:apple", | ||||||
| 	appledef.groups.attached_node = 1 | 		{groups = { fleshy=3, dig_immediate=3, flammable=2, leafdecay=3, leafdecay_drop=1, attached_node = 1} | ||||||
| 	minetest.register_node(":default:apple", appledef) | 	}) | ||||||
| end | end | ||||||
|  |  | ||||||
| table.insert(moretrees.avoidnodes, "default:jungletree") | table.insert(moretrees.avoidnodes, "default:jungletree") | ||||||
| table.insert(moretrees.avoidnodes, "default:pine_tree") | table.insert(moretrees.avoidnodes, "moretrees:jungletree_trunk") | ||||||
| table.insert(moretrees.avoidnodes, "default:acacia_tree") |  | ||||||
| table.insert(moretrees.avoidnodes, "moretrees:fir_trunk") | table.insert(moretrees.avoidnodes, "moretrees:fir_trunk") | ||||||
| table.insert(moretrees.avoidnodes, "default:tree") | table.insert(moretrees.avoidnodes, "default:tree") | ||||||
|  |  | ||||||
| if moretrees.spawn_saplings then | if moretrees.spawn_saplings then | ||||||
| 	table.insert(moretrees.avoidnodes, "snow:sapling_pine") | 	table.insert(moretrees.avoidnodes, "snow:sapling_pine") | ||||||
| 	table.insert(moretrees.avoidnodes, "default:junglesapling") | 	table.insert(moretrees.avoidnodes, "default:junglesapling") | ||||||
| 	table.insert(moretrees.avoidnodes, "default:pine_sapling") | 	table.insert(moretrees.avoidnodes, "moretrees:jungle_tree_sapling") | ||||||
|  | 	table.insert(moretrees.avoidnodes, "moretrees:jungle_tree_sapling_ongen") | ||||||
| end | end | ||||||
|  |  | ||||||
| -- "empty" (tapped) rubber tree nodes | -- "empty" (tapped) rubber tree nodes | ||||||
| @@ -675,10 +367,10 @@ minetest.register_node("moretrees:rubber_tree_trunk_empty", { | |||||||
| 		"moretrees_rubber_tree_trunk_top.png", | 		"moretrees_rubber_tree_trunk_top.png", | ||||||
| 		"moretrees_rubber_tree_trunk_empty.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}, | 	groups = {tree=1,snappy=1,choppy=2,oddly_breakable_by_hand=1,flammable=2}, | ||||||
| 	sounds = default.node_sound_wood_defaults(), | 	sounds = default.node_sound_wood_defaults(), | ||||||
| 	paramtype2 = "facedir", | 	paramtype2 = "facedir", | ||||||
| 	is_ground_content = false, |  | ||||||
| 	on_place = minetest.rotate_node, | 	on_place = minetest.rotate_node, | ||||||
| }) | }) | ||||||
|  |  | ||||||
| @@ -688,53 +380,43 @@ minetest.register_abm({ | |||||||
| 	chance = 1, | 	chance = 1, | ||||||
| 	action = function(pos, node, active_object_count, active_object_count_wider) | 	action = function(pos, node, active_object_count, active_object_count_wider) | ||||||
| 		local fdir = node.param2 or 0 | 		local fdir = node.param2 or 0 | ||||||
| 			local nfdir = dirs2[fdir+1] | 			nfdir = dirs2[fdir+1] | ||||||
| 		minetest.add_node(pos, {name = "moretrees:rubber_tree_trunk_empty", param2 = nfdir}) | 		minetest.add_node(pos, {name = "moretrees:rubber_tree_trunk_empty", param2 = nfdir}) | ||||||
| 	end, | 	end, | ||||||
| }) | }) | ||||||
|  |  | ||||||
| -- For compatibility with old nodes, recently-changed nodes, and default nodes | -- For compatibility with old nodes and recently-changed nodes. | ||||||
|  |  | ||||||
| minetest.register_alias("technic:rubber_tree_full",				"moretrees:rubber_tree_trunk") | minetest.register_alias("technic:rubber_tree_full",      "moretrees:rubber_tree_trunk") | ||||||
| minetest.register_alias("farming_plus:rubber_tree_full",		"moretrees:rubber_tree_trunk") | minetest.register_alias("farming_plus:rubber_tree_full", "moretrees:rubber_tree_trunk") | ||||||
| minetest.register_alias("farming:rubber_tree_full",				"moretrees:rubber_tree_trunk") | minetest.register_alias("farming:rubber_tree_full", "moretrees:rubber_tree_trunk") | ||||||
|  |  | ||||||
| minetest.register_alias("technic:rubber_leaves",				"moretrees:rubber_tree_leaves") | minetest.register_alias("technic:rubber_leaves",      "moretrees:rubber_tree_leaves") | ||||||
| minetest.register_alias("farming_plus:rubber_leaves",			"moretrees:rubber_tree_leaves") | minetest.register_alias("farming_plus:rubber_leaves", "moretrees:rubber_tree_leaves") | ||||||
| minetest.register_alias("farming:rubber_leaves",				"moretrees:rubber_tree_leaves") | minetest.register_alias("farming:rubber_leaves", "moretrees:rubber_tree_leaves") | ||||||
|  |  | ||||||
| minetest.register_alias("technic:rubber_tree_sapling",			"moretrees:rubber_tree_sapling") | minetest.register_alias("technic:rubber_tree_sapling", "moretrees:rubber_tree_sapling") | ||||||
| minetest.register_alias("farming_plus:rubber_sapling",			"moretrees:rubber_tree_sapling") | minetest.register_alias("farming_plus:rubber_sapling", "moretrees:rubber_tree_sapling") | ||||||
| minetest.register_alias("farming:rubber_sapling",				"moretrees:rubber_tree_sapling") | minetest.register_alias("farming:rubber_sapling", "moretrees:rubber_tree_sapling") | ||||||
|  |  | ||||||
| minetest.register_alias("moretrees:conifer_trunk",				"moretrees:fir_trunk") | minetest.register_alias("default:junglesapling","moretrees:jungletree_sapling") | ||||||
| minetest.register_alias("moretrees:conifer_trunk_sideways",		"moretrees:fir_trunk_sideways") | minetest.register_alias("moretrees:jungletree_trunk_sideways", "moreblocks:horizontal_jungle_tree") | ||||||
| minetest.register_alias("moretrees:conifer_leaves",				"moretrees:fir_leaves") | minetest.register_alias("moretrees:jungletree_trunk", "default:jungletree") | ||||||
| minetest.register_alias("moretrees:conifer_leaves_bright",		"moretrees:fir_leaves_bright") | minetest.register_alias("moretrees:jungletree_planks", "default:junglewood") | ||||||
| minetest.register_alias("moretrees:conifer_sapling",			"moretrees:fir_sapling") |  | ||||||
|  |  | ||||||
| minetest.register_alias("conifers:trunk",						"moretrees:fir_trunk") | minetest.register_alias("jungletree:leaves_green", "moretrees:jungletree_leaves_green") | ||||||
| minetest.register_alias("conifers:trunk_reversed",				"moretrees:fir_trunk_sideways") | minetest.register_alias("jungletree:leaves_red", "moretrees:jungletree_leaves_red") | ||||||
| minetest.register_alias("conifers:leaves",						"moretrees:fir_leaves") | minetest.register_alias("jungletree:leaves_yellow", "moretrees:jungletree_leaves_yellow") | ||||||
| minetest.register_alias("conifers:leaves_special",				"moretrees:fir_leaves_bright") |  | ||||||
| minetest.register_alias("conifers:sapling",						"moretrees:fir_sapling") |  | ||||||
|  |  | ||||||
| minetest.register_alias("moretrees:jungletree_sapling",			"default:junglesapling") | minetest.register_alias("moretrees:conifer_trunk", "moretrees:fir_trunk") | ||||||
| minetest.register_alias("moretrees:jungletree_trunk_sideways",	"moreblocks:horizontal_jungle_tree") | minetest.register_alias("moretrees:conifer_trunk_sideways", "moretrees:fir_trunk_sideways") | ||||||
| minetest.register_alias("moretrees:jungletree_planks",			"default:junglewood") | minetest.register_alias("moretrees:conifer_leaves", "moretrees:fir_leaves") | ||||||
| minetest.register_alias("moretrees:jungletree_leaves_green",	"default:jungleleaves") | minetest.register_alias("moretrees:conifer_leaves_bright", "moretrees:fir_leaves_bright") | ||||||
|  | minetest.register_alias("moretrees:conifer_sapling", "moretrees:fir_sapling") | ||||||
|  |  | ||||||
| minetest.register_alias("moretrees:acacia_trunk",				"default:acacia_tree") | minetest.register_alias("conifers:trunk", "moretrees:fir_trunk") | ||||||
| minetest.register_alias("moretrees:acacia_planks",				"default:acacia_wood") | minetest.register_alias("conifers:trunk_reversed", "moretrees:fir_trunk_sideways") | ||||||
| minetest.register_alias("moretrees:acacia_sapling",				"default:acacia_sapling") | minetest.register_alias("conifers:leaves", "moretrees:fir_leaves") | ||||||
| minetest.register_alias("moretrees:acacia_leaves",				"default:acacia_leaves") | minetest.register_alias("conifers:leaves_special", "moretrees:fir_leaves_bright") | ||||||
|  | minetest.register_alias("conifers:sapling", "moretrees:fir_sapling") | ||||||
|  |  | ||||||
| minetest.register_alias("moretrees:pine_trunk",					"moretrees:cedar_trunk") |  | ||||||
| minetest.register_alias("moretrees:pine_planks",				"moretrees:cedar_planks") |  | ||||||
| minetest.register_alias("moretrees:pine_sapling",				"moretrees:cedar_sapling") |  | ||||||
| minetest.register_alias("moretrees:pine_leaves",				"moretrees:cedar_leaves") |  | ||||||
| minetest.register_alias("moretrees:pine_cone",					"moretrees:cedar_cone") |  | ||||||
| minetest.register_alias("moretrees:pine_nuts",					"moretrees:cedar_nuts") |  | ||||||
| minetest.register_alias("moretrees:pine_sapling_ongen",			"moretrees:cedar_sapling_ongen") |  | ||||||
|  |  | ||||||
| minetest.register_alias("moretrees:dates",					"moretrees:dates_f4") |  | ||||||
|   | |||||||
							
								
								
									
										165
									
								
								saplings.lua
									
									
									
									
									
								
							
							
						
						| @@ -1,90 +1,93 @@ | |||||||
| -- sapling growth | -- sapling growth | ||||||
| -- these tables only affect hand-placed saplings |  | ||||||
| -- mapgen-placed always use their biome def settings, which are much more |  | ||||||
| -- limited, in the interest of speed. |  | ||||||
|  |  | ||||||
| local dirt_surfaces = { |  | ||||||
| 	set = true, |  | ||||||
| 	["default:dirt"] = true, |  | ||||||
| 	["default:dirt_with_snow"] = true, |  | ||||||
| 	["default:dry_dirt"] = true, |  | ||||||
| 	["default:dry_dirt_with_dry_grass"] = true, |  | ||||||
| 	["default:dirt_with_grass"] = true, |  | ||||||
| 	["default:dirt_with_dry_grass"] = true, |  | ||||||
| 	["default:dirt_with_coniferous_litter"] = true, |  | ||||||
| 	["default:dirt_with_rainforest_litter"] = true, |  | ||||||
| 	["woodsoils:dirt_with_leaves_1"] = true, |  | ||||||
| 	["woodsoils:dirt_with_leaves_2"] = true, |  | ||||||
| 	["woodsoils:grass_with_leaves_1"] = true, |  | ||||||
| 	["woodsoils:grass_with_leaves_2"] = true, |  | ||||||
| 	["meditteranean_biome:dirt_with_mediterranean_grass"] = true |  | ||||||
| } |  | ||||||
|  |  | ||||||
| local conifer_surfaces =  { |  | ||||||
| 	set = true, |  | ||||||
| 	["default:dirt"] = true, |  | ||||||
| 	["default:dirt_with_grass"] = true, |  | ||||||
| 	["default:dirt_with_dry_grass"] = true, |  | ||||||
| 	["default:dirt_with_coniferous_litter"] = true, |  | ||||||
| 	["default:dirt_with_rainforest_litter"] = true, |  | ||||||
| 	["woodsoils:dirt_with_leaves_1"] = true, |  | ||||||
| 	["woodsoils:dirt_with_leaves_2"] = true, |  | ||||||
| 	["woodsoils:grass_with_leaves_1"] = true, |  | ||||||
| 	["woodsoils:grass_with_leaves_2"] = true, |  | ||||||
| 	["default:dirt_with_snow"] = true, |  | ||||||
| 	["meditteranean_biome:dirt_with_mediterranean_grass"] = true |  | ||||||
| } |  | ||||||
|  |  | ||||||
| local sand_surfaces = { |  | ||||||
| 	set = true, |  | ||||||
| 	["default:sand"] = true, |  | ||||||
| 	["default:desert_sand"] = true, |  | ||||||
| 	["cottages:loam"] = true, |  | ||||||
| 	["darkage:mud"] = true, |  | ||||||
| 	-- note, no silver sand here. |  | ||||||
| 	-- too cold for a palm, too... well... sandy for anything else. |  | ||||||
| } |  | ||||||
|  |  | ||||||
| for i in ipairs(moretrees.treelist) do | for i in ipairs(moretrees.treelist) do | ||||||
| 	local treename = moretrees.treelist[i][1] | 	local treename = moretrees.treelist[i][1] | ||||||
| 	local tree_model = treename.."_model" | 	local tree_model = treename.."_model" | ||||||
| 	local tree_biome = treename.."_biome" | 	local tree_biome = treename.."_biome" | ||||||
| 	local surfaces |  | ||||||
| 	local grow_function = moretrees[tree_model] |  | ||||||
|  |  | ||||||
| 	if treename == "spruce" | 	if treename ~= "birch" and treename ~= "spruce" and treename ~= "fir" and treename ~= "jungletree" then | ||||||
| 	  or treename == "fir" |  | ||||||
| 	  or treename == "cedar" | 		plantslib:dbg(dump(moretrees[tree_biome].surface)) | ||||||
| 	  or treename == "pine" then | 		plantslib:grow_plants({ | ||||||
| 		surfaces = conifer_surfaces | 			grow_delay = moretrees.sapling_interval, | ||||||
| 	elseif string.find(treename, "palm") then | 			grow_chance = moretrees.sapling_chance, | ||||||
| 		surfaces = sand_surfaces | 			grow_plant = "moretrees:"..treename.."_sapling", | ||||||
| 	else | 			grow_nodes = moretrees[tree_biome].surface, | ||||||
| 		surfaces = dirt_surfaces | 			grow_function = moretrees[tree_model], | ||||||
|  | 		}) | ||||||
|  |  | ||||||
|  | 		plantslib:grow_plants({ | ||||||
|  | 			grow_delay = 2, | ||||||
|  | 			grow_chance = 30, | ||||||
|  | 			grow_plant = "moretrees:"..treename.."_sapling_ongen", | ||||||
|  | 			grow_nodes = moretrees[tree_biome].surface, | ||||||
|  | 			grow_function = moretrees[tree_model], | ||||||
|  | 		}) | ||||||
|  |  | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
| 	if treename == "spruce" |  | ||||||
| 	  or treename == "fir" |  | ||||||
| 	  or treename == "birch" |  | ||||||
| 	  or treename == "jungletree" then |  | ||||||
| 		grow_function = "moretrees.grow_"..treename |  | ||||||
| 	end |  | ||||||
|  |  | ||||||
| 	biome_lib.dbg(dump(moretrees[tree_biome].surface), 4) |  | ||||||
|  |  | ||||||
| 	biome_lib:grow_plants({ |  | ||||||
| 		grow_delay = moretrees.sapling_interval, |  | ||||||
| 		grow_chance = moretrees.sapling_chance, |  | ||||||
| 		grow_plant = "moretrees:"..treename.."_sapling", |  | ||||||
| 		grow_nodes = surfaces, |  | ||||||
| 		grow_function = grow_function, |  | ||||||
| 	}) |  | ||||||
|  |  | ||||||
| 	biome_lib:grow_plants({ |  | ||||||
| 		grow_delay = 2, |  | ||||||
| 		grow_chance = 1, |  | ||||||
| 		grow_plant = "moretrees:"..treename.."_sapling_ongen", |  | ||||||
| 		grow_nodes = surfaces, |  | ||||||
| 		grow_function = grow_function, |  | ||||||
| 	}) |  | ||||||
| end | end | ||||||
|  |  | ||||||
|  | plantslib:grow_plants({ | ||||||
|  | 	grow_delay = moretrees.sapling_interval, | ||||||
|  | 	grow_chance = moretrees.sapling_chance, | ||||||
|  | 	grow_plant = "moretrees:birch_sapling", | ||||||
|  | 	grow_nodes = moretrees.birch_biome.surface, | ||||||
|  | 	grow_function = "moretrees:grow_birch" | ||||||
|  | }) | ||||||
|  |  | ||||||
|  | plantslib:grow_plants({ | ||||||
|  | 	grow_delay = 2, | ||||||
|  | 	grow_chance = 30, | ||||||
|  | 	grow_plant = "moretrees:birch_sapling_ongen", | ||||||
|  | 	grow_nodes = moretrees.birch_biome.surface, | ||||||
|  | 	grow_function = "moretrees:grow_birch" | ||||||
|  | }) | ||||||
|  |  | ||||||
|  | plantslib:grow_plants({ | ||||||
|  | 	grow_delay = moretrees.sapling_interval, | ||||||
|  | 	grow_chance = moretrees.sapling_chance, | ||||||
|  | 	grow_plant = "moretrees:spruce_sapling", | ||||||
|  | 	grow_nodes = moretrees.spruce_biome.surface, | ||||||
|  | 	grow_function = "moretrees:grow_spruce" | ||||||
|  | }) | ||||||
|  |  | ||||||
|  | plantslib:grow_plants({ | ||||||
|  | 	grow_delay = 2, | ||||||
|  | 	grow_chance = 30, | ||||||
|  | 	grow_plant = "moretrees:spruce_sapling_ongen", | ||||||
|  | 	grow_nodes = moretrees.spruce_biome.surface, | ||||||
|  | 	grow_function = "moretrees:grow_spruce" | ||||||
|  | }) | ||||||
|  |  | ||||||
|  | plantslib:grow_plants({ | ||||||
|  | 	grow_delay = moretrees.sapling_interval, | ||||||
|  | 	grow_chance = moretrees.sapling_chance, | ||||||
|  | 	grow_plant = "moretrees:fir_sapling", | ||||||
|  | 	grow_nodes = moretrees.fir_biome.surface, | ||||||
|  | 	grow_function = "moretrees:grow_fir" | ||||||
|  | }) | ||||||
|  |  | ||||||
|  | plantslib:grow_plants({ | ||||||
|  | 	grow_delay = 2, | ||||||
|  | 	grow_chance = 30, | ||||||
|  | 	grow_plant = "moretrees:fir_sapling_ongen", | ||||||
|  | 	grow_nodes = moretrees.fir_biome.surface, | ||||||
|  | 	grow_function = "moretrees:grow_fir" | ||||||
|  | }) | ||||||
|  |  | ||||||
|  | plantslib:grow_plants({ | ||||||
|  | 	grow_delay = moretrees.sapling_interval, | ||||||
|  | 	grow_chance = moretrees.sapling_chance, | ||||||
|  | 	grow_plant = "moretrees:jungletree_sapling", | ||||||
|  | 	grow_nodes = moretrees.jungletree_biome.surface, | ||||||
|  | 	grow_function = "moretrees:grow_jungletree" | ||||||
|  | }) | ||||||
|  |  | ||||||
|  | plantslib:grow_plants({ | ||||||
|  | 	grow_delay = 2, | ||||||
|  | 	grow_chance = 30, | ||||||
|  | 	grow_plant = "moretrees:jungletree_sapling_ongen", | ||||||
|  | 	grow_nodes = moretrees.jungletree_biome.surface, | ||||||
|  | 	grow_function = "moretrees:grow_jungletree" | ||||||
|  | }) | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										168
									
								
								screenshot.lua
									
									
									
									
									
								
							
							
						
						| @@ -1,168 +0,0 @@ | |||||||
| -- Usage: |  | ||||||
| -- - Create a new world |  | ||||||
| -- - Set world mapgen: v6 |  | ||||||
| -- - Set world seed: 2625051331357512570 |  | ||||||
| -- - Enable the moretrees mod |  | ||||||
| -- - Edit the moretrees source |  | ||||||
| --   - Disable all trees in default_settings.lua |  | ||||||
| --   - Recommended: make saplings grow fast in default_settings.lua: |  | ||||||
| --     sapling_interval = 5 |  | ||||||
| --     sapling_chance = 1 |  | ||||||
| --   - Apply the patch below to moretrees |  | ||||||
| --     (so that jungle trees are always large, and differently-colored): |  | ||||||
| --     use 'git apply --ignore-space-change' |  | ||||||
| --   - Make sure this file (you are reading) will be loaded when minetest starts ! |  | ||||||
| --     (e.g. add 'dofile(modpath.."/screenshot.lua")' to init.lua) |  | ||||||
| -- - Start minetest |  | ||||||
| -- - Goto 700,y,-280 (approximately) |  | ||||||
| -- - Make sure the world is loaded between x = 650 .. 780 and z = -350 .. -180 |  | ||||||
| -- - Give the chat command '/make-scene' |  | ||||||
| -- - Wait & walk/fly around until all trees have grown |  | ||||||
| -- - goto the platform at 780, 30, -277 |  | ||||||
| -- - Set the viewing range to 300, with fog enabled |  | ||||||
| -- - Take a screenshot. |  | ||||||
|  |  | ||||||
| -- Patch to apply to moretrees |  | ||||||
| --[[ |  | ||||||
| diff --git a/init.lua b/init.lua |  | ||||||
| index 8189ffd..afd4644 100644 |  | ||||||
| --- a/init.lua |  | ||||||
| +++ b/init.lua |  | ||||||
| @@ -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) |  | ||||||
|         local r2 = math.random(3) |  | ||||||
| +       r1 = jleaves |  | ||||||
| +       jleaves = jleaves % 2 + 1 |  | ||||||
|         if r1 == 1 then |  | ||||||
|                 moretrees.jungletree_model.leaves2 = "moretrees:jungletree_leaves_red" |  | ||||||
|         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" |  | ||||||
|                 moretrees.jungletree_model.iterations = 2 |  | ||||||
| ]] |  | ||||||
|  |  | ||||||
|  |  | ||||||
| minetest.register_chatcommand("make-scene", { |  | ||||||
| 	func = function() |  | ||||||
| 		minetest.place_node({x=780, y=30, z=-277}, {name="default:obsidian"}) |  | ||||||
| 		minetest.place_node({x=780, y=30, z=-278}, {name="default:obsidian"}) |  | ||||||
| 		minetest.place_node({x=781, y=30, z=-277}, {name="default:obsidian"}) |  | ||||||
| 		minetest.place_node({x=781, y=30, z=-278}, {name="default:obsidian"}) |  | ||||||
| 		minetest.place_node({x=781, y=30, z=-276}, {name="default:obsidian"}) |  | ||||||
| 		minetest.place_node({x=780, y=30, z=-276}, {name="default:obsidian"}) |  | ||||||
|  |  | ||||||
| 		for z = -360, -300 do |  | ||||||
| 			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"}) |  | ||||||
| 				end |  | ||||||
| 				for y = 23, 25 + dy do |  | ||||||
| 					minetest.place_node({x=x, y=y, z=z}, {name="default:desert_sand"}) |  | ||||||
| 				end |  | ||||||
| 				dy = 0 |  | ||||||
| 			end |  | ||||||
| 		end |  | ||||||
|  |  | ||||||
| 		minetest.place_node({x=717, y=2, z=-298}, {name = "moretrees:palm_sapling"}) |  | ||||||
| 		minetest.place_node({x=713, y=2, z=-302}, {name = "moretrees:palm_sapling"}) |  | ||||||
| 		minetest.place_node({x=713, y=2, z=-307}, {name = "moretrees:palm_sapling"}) |  | ||||||
| 		minetest.place_node({x=717, y=2, z=-318}, {name = "moretrees:palm_sapling"}) |  | ||||||
| 		minetest.place_node({x=723, y=2, z=-320}, {name = "moretrees:palm_sapling"}) |  | ||||||
|  |  | ||||||
| 		minetest.place_node({x=645, y=26, z=-314}, {name="moretrees:date_palm_sapling"}) |  | ||||||
| 		minetest.place_node({x=653, y=26, z=-322}, {name="moretrees:date_palm_sapling"}) |  | ||||||
| 		minetest.place_node({x=649, y=26, z=-334}, {name="moretrees:date_palm_sapling"}) |  | ||||||
| 		minetest.place_node({x=662, y=26, z=-342}, {name="moretrees:date_palm_sapling"}) |  | ||||||
|  |  | ||||||
| 		minetest.place_node({x=672, y=5, z=-305}, {name="moretrees:oak_sapling"}) |  | ||||||
| 		minetest.place_node({x=690, y=6, z=-322}, {name="moretrees:oak_sapling"}) |  | ||||||
| 		minetest.place_node({x=695, y=7, z=-335}, {name="moretrees:oak_sapling"}) |  | ||||||
| 		minetest.place_node({x=699, y=4, z=-301}, {name="moretrees:oak_sapling"}) |  | ||||||
|  |  | ||||||
| 		minetest.place_node({x=751, y=5, z=-254}, {name="moretrees:apple_tree_sapling"}) |  | ||||||
| 		minetest.place_node({x=729, y=3, z=-275}, {name="moretrees:apple_tree_sapling"}) |  | ||||||
| 		minetest.place_node({x=747, y=4, z=-270}, {name="moretrees:apple_tree_sapling"}) |  | ||||||
|  |  | ||||||
| 		minetest.place_node({x=671, y=5, z=-283}, {name="default:junglesapling"}) |  | ||||||
| 		minetest.place_node({x=680, y=4, z=-287}, {name="default:junglesapling"}) |  | ||||||
| 		minetest.place_node({x=702, y=4, z=-288}, {name="default:junglesapling"}) |  | ||||||
|  |  | ||||||
| 		minetest.place_node({x=646, y=12, z=-199}, {name="moretrees:spruce_sapling"}) |  | ||||||
| 		minetest.place_node({x=644, y=14, z=-177}, {name="moretrees:spruce_sapling"}) |  | ||||||
| 		minetest.place_node({x=678, y=9, z=-211}, {name="moretrees:spruce_sapling"}) |  | ||||||
| 		minetest.place_node({x=663, y=10, z=-215}, {name="moretrees:spruce_sapling"}) |  | ||||||
|  |  | ||||||
| 		minetest.place_node({x=637, y=3, z=-263}, {name="moretrees:sequoia_sapling"}) |  | ||||||
| 		minetest.place_node({x=625, y=3, z=-250}, {name="moretrees:sequoia_sapling"}) |  | ||||||
| 		minetest.place_node({x=616, y=3, z=-233}, {name="moretrees:sequoia_sapling"}) |  | ||||||
| 		minetest.place_node({x=635, y=3, z=-276}, {name="moretrees:sequoia_sapling"}) |  | ||||||
| 		minetest.place_node({x=681, y=11, z=-260}, {name="moretrees:sequoia_sapling"}) |  | ||||||
| 		minetest.place_node({x=682, y=10, z=-247}, {name="moretrees:sequoia_sapling"}) |  | ||||||
|  |  | ||||||
| 		minetest.place_node({x=737, y=7, z=-195}, {name="moretrees:cedar_sapling"}) |  | ||||||
| 		minetest.place_node({x=720, y=8, z=-189}, {name="moretrees:cedar_sapling"}) |  | ||||||
| 		minetest.place_node({x=704, y=7, z=-187}, {name="moretrees:cedar_sapling"}) |  | ||||||
|  |  | ||||||
| 		minetest.place_node({x=731, y=2, z=-227}, {name="moretrees:poplar_sapling"}) |  | ||||||
| 		minetest.place_node({x=721, y=2, z=-233}, {name="moretrees:poplar_sapling"}) |  | ||||||
| 		minetest.place_node({x=712, y=1, z=-237}, {name="moretrees:poplar_sapling"}) |  | ||||||
| 		minetest.place_node({x=743, y=3, z=-228}, {name="moretrees:poplar_small_sapling"}) |  | ||||||
| 		minetest.place_node({x=750, y=3, z=-230}, {name="moretrees:poplar_small_sapling"}) |  | ||||||
| 		minetest.place_node({x=731, y=5, z=-233}, {name="moretrees:poplar_small_sapling"}) |  | ||||||
|  |  | ||||||
| 		minetest.place_node({x=702, y=2, z=-274}, {name="moretrees:birch_sapling"}) |  | ||||||
| 		minetest.place_node({x=697, y=2, z=-271}, {name="moretrees:birch_sapling"}) |  | ||||||
| 		minetest.place_node({x=696, y=2, z=-264}, {name="moretrees:birch_sapling"}) |  | ||||||
| 		minetest.place_node({x=710, y=2, z=-265}, {name="moretrees:birch_sapling"}) |  | ||||||
|  |  | ||||||
| 		minetest.place_node({x=707, y=8, z=-247}, {name="moretrees:fir_sapling"}) |  | ||||||
| 		minetest.place_node({x=699, y=10, z=-254}, {name="moretrees:fir_sapling"}) |  | ||||||
| 		minetest.place_node({x=729, y=5, z=-261}, {name="moretrees:fir_sapling"}) |  | ||||||
| 		minetest.place_node({x=732, y=5, z=-252}, {name="moretrees:fir_sapling"}) |  | ||||||
| 		minetest.place_node({x=741, y=4, z=-262}, {name="moretrees:fir_sapling"}) |  | ||||||
|  |  | ||||||
| 		minetest.place_node({x=751, y=2, z=-286}, {name="moretrees:willow_sapling"}) |  | ||||||
|  |  | ||||||
| 		minetest.place_node({x=760, y=5, z=-223}, {name="moretrees:rubber_tree_sapling"}) |  | ||||||
| 		minetest.place_node({x=762, y=5, z=-230}, {name="moretrees:rubber_tree_sapling"}) |  | ||||||
| 		minetest.place_node({x=766, y=5, z=-243}, {name="moretrees:rubber_tree_sapling"}) |  | ||||||
| 		minetest.place_node({x=764, y=6, z=-252}, {name="moretrees:rubber_tree_sapling"}) |  | ||||||
| 	end |  | ||||||
| }) |  | ||||||
|  |  | ||||||
| --[[ |  | ||||||
| The following is a search/replace command suitable for vi (/vim) or sed, to convert minetest log |  | ||||||
| messages to equivalent lua commands: |  | ||||||
|  |  | ||||||
| s/.*\(\(moretrees\|default\)[^ ]*\) at (\([-0-9]\+\),\([-0-9]\+\),\([-0-9]\+\)).*/\t\tminetest.place_node({x=\3, y=\4, z=\5}, {name="\1"})/ |  | ||||||
|  |  | ||||||
| E.g. a minetest log line of the following kind: |  | ||||||
| 		2016-07-03 11:30:50: ACTION[Server]: singleplayer places node moretrees:rubber_tree_sapling at  (760,5,-223) |  | ||||||
| Becomes: |  | ||||||
| 		minetest.place_node({x=760, y=5, z=-223}, {name="moretrees:rubber_tree_sapling"}) |  | ||||||
| (Except that the example log line above has an extra space added, so it won't be converted) |  | ||||||
|  |  | ||||||
| vi/vim users: Add the minetest log lines to this file, then enter the following command, with |  | ||||||
| <expression> replaced with the search/replace expression above. |  | ||||||
| 	:%<expression> |  | ||||||
|  |  | ||||||
| sed users: Add the minetest log lines to this file, then execute the following command at the shell |  | ||||||
| prompt with <expression> replaced by the search/replace expression above. Don't forget the |  | ||||||
| single-quotes. |  | ||||||
| 	sed '<expression>' < screenshot.lua > screenshot-new.lua |  | ||||||
|  |  | ||||||
| Windows users: You're probably out of luck. And the effort of doing such a thing is probably |  | ||||||
| larger anyway than the effort of copying an existing line and typing things manually. |  | ||||||
| ]] |  | ||||||
|  |  | ||||||
							
								
								
									
										
											BIN
										
									
								
								screenshot.png
									
									
									
									
									
								
							
							
						
						| Before Width: | Height: | Size: 101 KiB | 
							
								
								
									
										
											BIN
										
									
								
								textures/moretrees_acacia_leaves.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 150 B | 
							
								
								
									
										
											BIN
										
									
								
								textures/moretrees_acacia_sapling.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 205 B | 
							
								
								
									
										
											BIN
										
									
								
								textures/moretrees_acacia_trunk.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 599 B | 
							
								
								
									
										
											BIN
										
									
								
								textures/moretrees_acacia_trunk_top.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 651 B | 
							
								
								
									
										
											BIN
										
									
								
								textures/moretrees_acacia_wood.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 175 B | 
| Before Width: | Height: | Size: 877 B | 
| Before Width: | Height: | Size: 429 B | 
| Before Width: | Height: | Size: 1009 B | 
| Before Width: | Height: | Size: 2.1 KiB | 
| Before Width: | Height: | Size: 685 B | 
| Before Width: | Height: | Size: 608 B | 
| Before Width: | Height: | Size: 695 B | 
| Before Width: | Height: | Size: 450 B | 
| Before Width: | Height: | Size: 757 B | 
| Before Width: | Height: | Size: 261 B | 
| Before Width: | Height: | Size: 1.2 KiB | 
| Before Width: | Height: | Size: 673 B | 
| Before Width: | Height: | Size: 735 B | 
| Before Width: | Height: | Size: 9.2 KiB | 
| Before Width: | Height: | Size: 3.8 KiB | 
| Before Width: | Height: | Size: 4.0 KiB | 
| Before Width: | Height: | Size: 8.9 KiB | 
| Before Width: | Height: | Size: 8.1 KiB | 
| Before Width: | Height: | Size: 9.0 KiB | 
| Before Width: | Height: | Size: 2.5 KiB | 
| Before Width: | Height: | Size: 4.0 KiB | 
| Before Width: | Height: | Size: 2.1 KiB | 
| Before Width: | Height: | Size: 315 B After Width: | Height: | Size: 315 B | 
| Before Width: | Height: | Size: 205 B After Width: | Height: | Size: 205 B | 
| Before Width: | Height: | Size: 369 B After Width: | Height: | Size: 369 B | 
| Before Width: | Height: | Size: 202 B After Width: | Height: | Size: 202 B | 
| Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 1.0 KiB | 
| Before Width: | Height: | Size: 451 B After Width: | Height: | Size: 451 B | 
| Before Width: | Height: | Size: 648 B After Width: | Height: | Size: 648 B | 
| Before Width: | Height: | Size: 563 B | 
| Before Width: | Height: | Size: 447 B | 
| Before Width: | Height: | Size: 347 B | 
| Before Width: | Height: | Size: 1.2 KiB | 
| Before Width: | Height: | Size: 980 B | 
| Before Width: | Height: | Size: 751 B | 
| Before Width: | Height: | Size: 726 B | 
| @@ -1,24 +1,23 @@ | |||||||
|  |  | ||||||
| 				Elevation		Temperature		Nearness to		Nearby	What nodes			Perlin		Avoid | 		Elevation	Temperature	Nearness to	Nearby	What nodes		Perlin		Avoid | ||||||
| Tree type		   (m)			(approx., °C)	some node		water	to spawn on			seed diff	radius | Tree type	   (m)		(approx., °C)	some node	water	to spawn on		seed diff	radius | ||||||
| -------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | ||||||
| jungle tree		- 5 to +10		 above +15		water, 20		 10		dirt_with_grass		329			 5 | jungle tree	- 5 to +10	 above +15	water, 20	  10	dirt_with_grass		329		 5 | ||||||
| fir				 above +25		-20 to +10		  n/a			n/a		dirt_with_grass		359			 8 | fir		 above +25	-20 to +10	  n/a		n/a	dirt_with_grass		359		 8 | ||||||
| firs on snow	 above +15		-20 to +10		  n/a			n/a		snow:snow			359			 8 | firs on snow	 above +15	-20 to +10	  n/a		n/a	snow:snow		359		 8 | ||||||
| palm			- 1 to + 1		+15 to +32		water, 15		 10		sand				330			 5 | palm		- 1 to + 1	+15 to +32	water, 15	  10	sand			330		 5 | ||||||
| date palm		- 1 to +10		 above +39		water, 20h,20v	100		desert_sand			339			10 | apple		+ 1 to +10	+23 to +32	  n/a		n/a	dirt_with grass		331		15 | ||||||
| date palm		+11 to +30		 above +39		water, 1h,30v	  1		desert_sand			340			10 | oak		  0 to +10	+ 4 to +16	  n/a		n/a	dirt_with grass		332		15 | ||||||
| apple			+ 1 to +10		+23 to +32		  n/a			n/a		dirt_with grass		331			15 | sequoia		  0 to +10	-30 to +50	  n/a		n/a	dirt_with grass		333		10 | ||||||
| oak				  0 to +10		+ 4 to +16		  n/a			n/a		dirt_with grass		332			15 | birch		+10 to +15	-20 to +10	  n/a		n/a	dirt_with grass		334		 5 | ||||||
| sequoia			  0 to +10		-30 to +50		  n/a			n/a		dirt_with grass		333			10 | spruce		 above +20	-20 to +10	  n/a		n/a	dirt_with grass		335		10 | ||||||
| birch			+10 to +15		-20 to +10		  n/a			n/a		dirt_with grass		334			 5 | pine		    n/a		    n/a		water, 15	   5	dirt_with grass		336		10 | ||||||
| spruce			 above +20		-20 to +10		  n/a			n/a		dirt_with grass		335			10 | willow		- 5 to + 5	    n/a		water, 15	   5	dirt_with grass		337		20 | ||||||
| cedar			    n/a			    n/a			water, 15		  5		dirt_with grass		336			10 | acacia		    n/a		    n/a		  n/a		n/a	dirt_with_grass, | ||||||
| willow			- 5 to + 5		    n/a			water, 15		  5		dirt_with grass		337			20 | 									desert_sand		n/a		15 | ||||||
| rubber			- 5 to + 5		 above +32		water, 15		 10		dirt_with_grass		338			20 | rubber		- 5 to + 5	 above +32	water, 15	  10	dirt_with_grass		338		20 | ||||||
| poplar			    n/a			-10 to +26		water, 15h,5v	  1		dirt_with_grass		341,342,343	10 |  | ||||||
|  |  | ||||||
| beech			    n/a			    n/a			  n/a			n/a		dirt_with_grass		2			10 | beech		    n/a		    n/a		  n/a		n/a	dirt_with_grass		2		10 | ||||||
|  |  | ||||||
|  |  | ||||||
| Notes: | Notes: | ||||||
| @@ -27,8 +26,9 @@ Notes: | |||||||
| Beech trees are meant to replace default trees, but are themselves disabled by default.  They grow in the same areas | Beech trees are meant to replace default trees, but are themselves disabled by default.  They grow in the same areas | ||||||
| as the default ones do, and under the same conditions. | as the default ones do, and under the same conditions. | ||||||
|  |  | ||||||
|  | Acacia trees depend on humidity as their primary control, and they don't use the fertile ground option. They grow near | ||||||
|  | the edges of a desert biome, occasionally into the grass beyond, and anywhere else on desert sand or dirt with grass, | ||||||
|  | where the humidity is low (but not bone dry). | ||||||
|  |  | ||||||
| Fir trees appear in a snow biome only with older versions of SPlizard's Snow Biomes mod.  In more recent versions, | Fir trees appear in a snow biome only with older versions of SPlizard's Snow Biomes mod.  In more recent versions, | ||||||
| these trees will not grow, due to an engine bug. | these trees will not grow, due to an engine bug. | ||||||
|  |  | ||||||
| Cedar trees replace, and are identical to, the original pine trees, as the minetest default game now has (a completely |  | ||||||
| different type of) pine trees. |  | ||||||
|   | |||||||
							
								
								
									
										146
									
								
								tree_models.lua
									
									
									
									
									
								
							
							
						
						| @@ -10,7 +10,8 @@ moretrees.beech_model={ | |||||||
| 	iterations=2, | 	iterations=2, | ||||||
| 	random_level=0, | 	random_level=0, | ||||||
| 	trunk_type="single", | 	trunk_type="single", | ||||||
| 	thin_branches=true | 	thin_branches=true, | ||||||
|  | 	enable_unique_ids = true, | ||||||
| } | } | ||||||
|  |  | ||||||
| moretrees.apple_tree_model={ | moretrees.apple_tree_model={ | ||||||
| @@ -26,6 +27,7 @@ moretrees.apple_tree_model={ | |||||||
| 	thin_branches=true, | 	thin_branches=true, | ||||||
| 	fruit="default:apple", | 	fruit="default:apple", | ||||||
| 	fruit_chance=15, | 	fruit_chance=15, | ||||||
|  | 	enable_unique_ids = true, | ||||||
| } | } | ||||||
|  |  | ||||||
| moretrees.oak_model={ | moretrees.oak_model={ | ||||||
| @@ -41,36 +43,7 @@ moretrees.oak_model={ | |||||||
| 	thin_branches=false, | 	thin_branches=false, | ||||||
| 	fruit="moretrees:acorn", | 	fruit="moretrees:acorn", | ||||||
| 	fruit_chance=3, | 	fruit_chance=3, | ||||||
| } | 	enable_unique_ids = true, | ||||||
|  |  | ||||||
| moretrees.poplar_model={ |  | ||||||
| 	axiom="TTTaaBCCCCCCCCCCCcccBBB[[f]&&G++f++Gf++Gf++Gf++G--]G[[f]&&G++f++Gf++Gf++Gf++G--]Gff", |  | ||||||
| 	rules_a="T", |  | ||||||
| 	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="moretrees:poplar_trunk", |  | ||||||
| 	leaves="moretrees:poplar_leaves", |  | ||||||
| 	angle=45, |  | ||||||
| 	iterations=0, |  | ||||||
| 	random_level=0, |  | ||||||
| 	trunk_type="single", |  | ||||||
| 	thin_branches=false, |  | ||||||
| } |  | ||||||
|  |  | ||||||
| moretrees.poplar_small_model={ |  | ||||||
| 	axiom="TT[T]BCCCCccBBff", |  | ||||||
| 	rules_a="T", |  | ||||||
| 	rules_b="[[f]&&G++f++Gf++Gf++Gf++G--]G", |  | ||||||
| 	rules_c="[[T]&&G++f++[d]Gf++[d]Gf++[d]Gf++[d]G--]G", |  | ||||||
| 	rules_d="f", |  | ||||||
| 	trunk="moretrees:poplar_trunk", |  | ||||||
| 	leaves="moretrees:poplar_leaves", |  | ||||||
| 	angle=45, |  | ||||||
| 	iterations=0, |  | ||||||
| 	random_level=0, |  | ||||||
| 	trunk_type="single", |  | ||||||
| 	thin_branches=false, |  | ||||||
| } | } | ||||||
|  |  | ||||||
| moretrees.sequoia_model={ | moretrees.sequoia_model={ | ||||||
| @@ -85,7 +58,8 @@ moretrees.sequoia_model={ | |||||||
| 	iterations=2, | 	iterations=2, | ||||||
| 	random_level=0, | 	random_level=0, | ||||||
| 	trunk_type="crossed", | 	trunk_type="crossed", | ||||||
| 	thin_branches=true | 	thin_branches=true, | ||||||
|  | 	enable_unique_ids = true, | ||||||
| } | } | ||||||
|  |  | ||||||
| moretrees.birch_model1={ | moretrees.birch_model1={ | ||||||
| @@ -100,7 +74,8 @@ moretrees.birch_model1={ | |||||||
| 	iterations=2, | 	iterations=2, | ||||||
| 	random_level=0, | 	random_level=0, | ||||||
| 	trunk_type="single", | 	trunk_type="single", | ||||||
| 	thin_branches=true | 	thin_branches=true, | ||||||
|  | 	enable_unique_ids = true, | ||||||
| } | } | ||||||
|  |  | ||||||
| moretrees.birch_model2={ | moretrees.birch_model2={ | ||||||
| @@ -115,16 +90,12 @@ moretrees.birch_model2={ | |||||||
| 	iterations=2, | 	iterations=2, | ||||||
| 	random_level=0, | 	random_level=0, | ||||||
| 	trunk_type="single", | 	trunk_type="single", | ||||||
| 	thin_branches=true | 	thin_branches=true, | ||||||
|  | 	enable_unique_ids = true, | ||||||
| } | } | ||||||
|  |  | ||||||
| -- Coconuts can't be generated as fruit, because there is no support for the |  | ||||||
| -- special fruit trunks that allow coconuts to regrow at the correct position |  | ||||||
| -- in the tree. |  | ||||||
| -- So, a placeholder fruit trunk is spawned. An ABM will convert it to the final |  | ||||||
| -- fruit trunk, and generate the actual coconuts. |  | ||||||
| moretrees.palm_model={ | moretrees.palm_model={ | ||||||
| 	axiom="FFcccccc&FFFFFdddRA//A//A//A//A//A", | 	axiom="FFcccccc&FFFFFddd[^&&&GR][^///&&&GR][^//////&&&GR][^***&&&GR]FA//A//A//A//A//A", | ||||||
| 	rules_a="[&fb&bbb[++f--&ffff&ff][--f++&ffff&ff]&ffff&bbbb&b]", | 	rules_a="[&fb&bbb[++f--&ffff&ff][--f++&ffff&ff]&ffff&bbbb&b]", | ||||||
| 	rules_b="f", | 	rules_b="f", | ||||||
| 	rules_c="/", | 	rules_c="/", | ||||||
| @@ -136,33 +107,9 @@ moretrees.palm_model={ | |||||||
| 	random_level=0, | 	random_level=0, | ||||||
| 	trunk_type="single", | 	trunk_type="single", | ||||||
| 	thin_branches=true, | 	thin_branches=true, | ||||||
| 	fruit="moretrees:palm_fruit_trunk_gen", | 	fruit="moretrees:coconut", | ||||||
| 	fruit_chance=0 | 	fruit_chance=0, | ||||||
| } | 	enable_unique_ids = true, | ||||||
|  |  | ||||||
| -- Dates can't be generated as fruit, because there is no support for the |  | ||||||
| -- special (male and female) fruit trunks that allow dates to regrow at the |  | ||||||
| -- correct position in the tree. |  | ||||||
| -- So, a generic fruit trunk is spawned. An ABM will convert it to a male |  | ||||||
| -- or female fruit trunk, and generate the actual dates. |  | ||||||
| moretrees.date_palm_model={ |  | ||||||
| 	axiom="TTTTddddddddddccccccccccRT[TTT]".. |  | ||||||
| 		"ccccc[&&a]ccccc[&&a]ccccc[&&a]ccccc[&&a]ccccc[&&a]ccccc[&&a]".. |  | ||||||
| 		"GGccccc[&a]ccccc[&a]ccccc[&a]ccccc[&a]ccccc[&a]ccccc[&a]".. |  | ||||||
| 		"GGccccc[a]ccccc[a]ccccc[a]ccccc[a]ccccc[a]ccccc[a]", |  | ||||||
| 	rules_a="Gffb&bbb[++f--&ffff&ff][--f++&ffff&ff]&ff&ff&bb&bb&bb", |  | ||||||
| 	rules_b="f", |  | ||||||
| 	rules_c="/", |  | ||||||
| 	rules_d="F", |  | ||||||
| 	trunk="moretrees:date_palm_trunk", |  | ||||||
| 	leaves="moretrees:date_palm_leaves", |  | ||||||
| 	angle=18, |  | ||||||
| 	iterations=1, |  | ||||||
| 	random_level=0, |  | ||||||
| 	trunk_type="single", |  | ||||||
| 	thin_branches=false, |  | ||||||
| 	fruit="moretrees:date_palm_fruit_trunk", |  | ||||||
| 	fruit_chance=0 |  | ||||||
| } | } | ||||||
|  |  | ||||||
| moretrees.spruce_model1={ | moretrees.spruce_model1={ | ||||||
| @@ -179,7 +126,8 @@ moretrees.spruce_model1={ | |||||||
| 	trunk_type="crossed", | 	trunk_type="crossed", | ||||||
| 	thin_branches=true, | 	thin_branches=true, | ||||||
| 	fruit="moretrees:spruce_cone", | 	fruit="moretrees:spruce_cone", | ||||||
| 	fruit_chance=8 | 	fruit_chance=8, | ||||||
|  | 	enable_unique_ids = true, | ||||||
| } | } | ||||||
|  |  | ||||||
| moretrees.spruce_model2={ | moretrees.spruce_model2={ | ||||||
| @@ -195,24 +143,26 @@ moretrees.spruce_model2={ | |||||||
| 	trunk_type="crossed", | 	trunk_type="crossed", | ||||||
| 	thin_branches=true, | 	thin_branches=true, | ||||||
| 	fruit="moretrees:spruce_cone", | 	fruit="moretrees:spruce_cone", | ||||||
| 	fruit_chance=8 | 	fruit_chance=8, | ||||||
|  | 	enable_unique_ids = true, | ||||||
| } | } | ||||||
|  |  | ||||||
| moretrees.cedar_model={ | moretrees.pine_model={ | ||||||
| 	axiom="FFFFFcccdddB///cFdFB////cFdFB///cFdFB///cFdFA///cFdFA///cFdFB[FF]f", | 	axiom="FFFFFcccdddB///cFdFB////cFdFB///cFdFB///cFdFA///cFdFA///cFdFB[FF]f", | ||||||
| 	rules_a="[&&&TTTT[++^TFdd][--&TFd]//Tdd[+^Fd][--&Fdd]]", | 	rules_a="[&&&TTTT[++^TFdd][--&TFd]//Tdd[+^Fd][--&Fdd]]", | ||||||
| 	rules_b="[&&&TTT[++^Fdd][--&Fdd]//dd[+^d][--&Fd]]", | 	rules_b="[&&&TTT[++^Fdd][--&Fdd]//dd[+^d][--&Fd]]", | ||||||
| 	rules_c="/", | 	rules_c="/", | ||||||
| 	rules_d="F", | 	rules_d="F", | ||||||
| 	trunk="moretrees:cedar_trunk", | 	trunk="moretrees:pine_trunk", | ||||||
| 	leaves="moretrees:cedar_leaves", | 	leaves="moretrees:pine_leaves", | ||||||
| 	angle=30, | 	angle=30, | ||||||
| 	iterations=2, | 	iterations=2, | ||||||
| 	random_level=0, | 	random_level=0, | ||||||
| 	trunk_type="single", | 	trunk_type="single", | ||||||
| 	thin_branches=true, | 	thin_branches=true, | ||||||
| 	fruit="moretrees:cedar_cone", | 	fruit="moretrees:pine_cone", | ||||||
| 	fruit_chance=8 | 	fruit_chance=8, | ||||||
|  | 	enable_unique_ids = true, | ||||||
| } | } | ||||||
|  |  | ||||||
| moretrees.willow_model={ | moretrees.willow_model={ | ||||||
| @@ -226,7 +176,40 @@ moretrees.willow_model={ | |||||||
| 	iterations=2, | 	iterations=2, | ||||||
| 	random_level=0, | 	random_level=0, | ||||||
| 	trunk_type="crossed", | 	trunk_type="crossed", | ||||||
| 	thin_branches=true | 	thin_branches=true, | ||||||
|  | 	enable_unique_ids = true, | ||||||
|  | } | ||||||
|  |  | ||||||
|  | moretrees.acacia_model={ | ||||||
|  | 	axiom="FFFFFFccccA", | ||||||
|  | 	rules_a = "[B]//[B]//[B]//[B]", | ||||||
|  | 	rules_b = "&TTTT&TT^^G&&----GGGGGG++GGG++"	-- line up with the "canvas" edge | ||||||
|  | 			.."fffffffGG++G++"					-- first layer, drawn in a zig-zag raster pattern | ||||||
|  | 			.."Gffffffff--G--" | ||||||
|  | 			.."ffffffffG++G++" | ||||||
|  | 			.."fffffffff--G--" | ||||||
|  | 			.."fffffffff++G++" | ||||||
|  | 			.."fffffffff--G--" | ||||||
|  | 			.."ffffffffG++G++" | ||||||
|  | 			.."Gffffffff--G--" | ||||||
|  | 			.."fffffffGG" | ||||||
|  | 			.."^^G&&----GGGGGGG++GGGGGG++"		-- re-align to second layer canvas edge | ||||||
|  | 			.."ffffGGG++G++"					-- second layer | ||||||
|  | 			.."GGfffff--G--" | ||||||
|  | 			.."ffffffG++G++" | ||||||
|  | 			.."fffffff--G--" | ||||||
|  | 			.."ffffffG++G++" | ||||||
|  | 			.."GGfffff--G--" | ||||||
|  | 			.."ffffGGG", | ||||||
|  | 	rules_c = "/", | ||||||
|  | 	trunk="moretrees:acacia_trunk", | ||||||
|  | 	leaves="moretrees:acacia_leaves", | ||||||
|  | 	angle=45, | ||||||
|  | 	iterations=3, | ||||||
|  | 	random_level=0, | ||||||
|  | 	trunk_type="single", | ||||||
|  | 	thin_branches=true, | ||||||
|  | 	enable_unique_ids = true, | ||||||
| } | } | ||||||
|  |  | ||||||
| moretrees.rubber_tree_model={ | moretrees.rubber_tree_model={ | ||||||
| @@ -239,15 +222,16 @@ moretrees.rubber_tree_model={ | |||||||
| 	iterations=3, | 	iterations=3, | ||||||
| 	random_level=1, | 	random_level=1, | ||||||
| 	trunk_type="double", | 	trunk_type="double", | ||||||
| 	thin_branches=true | 	thin_branches=true, | ||||||
|  | 	enable_unique_ids = true, | ||||||
| } | } | ||||||
|  |  | ||||||
| moretrees.jungletree_model={ | moretrees.jungletree_model={ | ||||||
| 	axiom=nil, | 	axiom=nil, | ||||||
| 	rules_a=nil, | 	rules_a=nil, | ||||||
| 	rules_b=nil, | 	rules_b=nil, | ||||||
| 	trunk="moretrees:jungletree_trunk", | 	trunk="default:jungletree", | ||||||
| 	leaves="default:jungleleaves", | 	leaves="moretrees:jungletree_leaves_green", | ||||||
| 	leaves2=nil, | 	leaves2=nil, | ||||||
| 	leaves2_chance=nil, | 	leaves2_chance=nil, | ||||||
| 	angle=45, | 	angle=45, | ||||||
| @@ -256,7 +240,8 @@ moretrees.jungletree_model={ | |||||||
| 	trunk_type=nil, | 	trunk_type=nil, | ||||||
| 	thin_branches=true, | 	thin_branches=true, | ||||||
| 	fruit_chance=15, | 	fruit_chance=15, | ||||||
| 	fruit="vines:vine" | 	fruit="vines:vine", | ||||||
|  | 	enable_unique_ids = true, | ||||||
| } | } | ||||||
|  |  | ||||||
| moretrees.fir_model={ | moretrees.fir_model={ | ||||||
| @@ -271,5 +256,6 @@ moretrees.fir_model={ | |||||||
| 	trunk_type="single", | 	trunk_type="single", | ||||||
| 	thin_branches=true, | 	thin_branches=true, | ||||||
| 	fruit="moretrees:fir_cone", | 	fruit="moretrees:fir_cone", | ||||||
| 	fruit_chance=8 | 	fruit_chance=8, | ||||||
|  | 	enable_unique_ids = true, | ||||||
| } | } | ||||||
|   | |||||||