Compare commits
	
		
			84 Commits
		
	
	
		
			unique_ids
			...
			2021-04-14
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 62cab1b1d9 | ||
|  | 20770027a6 | ||
|  | 06aaee3187 | ||
|  | 8c0a83dacb | ||
|  | 24bb114a11 | ||
|  | c559ea3aef | ||
|  | 3212fae8cf | ||
|  | ea92403fa3 | ||
|  | dd36f8b63e | ||
|  | dc93bb5f16 | ||
|  | e72c539cdc | ||
|  | 66fd6724c5 | ||
|  | fa83e1b262 | ||
|  | f94f1bea26 | ||
|  | 09f08b50bc | ||
|  | d335eceecc | ||
|  | 89bffdecaf | ||
|  | 6fd3729669 | ||
|  | 25250e6eea | ||
|  | 9bc0bc1b68 | ||
|  | d097fd6044 | ||
|  | 216acdc6b1 | ||
|  | dde035cb5e | ||
|  | acb534d8d0 | ||
|  | f45ffc09bf | ||
|  | e912fba6c8 | ||
|  | 7161cfbdee | ||
|  | a27af10d2e | ||
|  | e474194daf | ||
|  | d521e34758 | ||
|  | 109b2009fb | ||
|  | 90a2d33707 | ||
|  | 61d1c54faf | ||
|  | 4e8cfdcd8c | ||
|  | f08f2d46f8 | ||
|  | 324155f805 | ||
|  | e5524c007d | ||
|  | ae53dc2e9b | ||
|  | ba2cd3d9b8 | ||
|  | af6d08414b | ||
|  | 1c0e3c7215 | ||
|  | aac8386b5a | ||
|  | c9add9b24d | ||
|  | f9d12a9def | ||
|  | 82744f4a96 | ||
|  | e5d30fed3d | ||
|  | 4e4636d6fe | ||
|  | 922058700d | ||
|  | cccfb1953b | ||
|  | f3a740f07e | ||
|  | 37e39a9ba7 | ||
|  | 3d7bcca134 | ||
|  | 2967c107d8 | ||
|  | f83f167d18 | ||
|  | 471a11f92d | ||
|  | b00d4f4a18 | ||
|  | 5735554d6a | ||
|  | 23ac37fc4c | ||
|  | d72574d288 | ||
|  | 8aa4888dee | ||
|  | 9028366407 | ||
|  | 9dd610e0e6 | ||
|  | 75e8027bf7 | ||
|  | c87a169fdd | ||
|  | afab0692df | ||
|  | 9ced339ce5 | ||
|  | 47980f5c86 | ||
|  | cd9926f9e5 | ||
|  | ee5bc1dfb3 | ||
|  | 62eb522948 | ||
|  | 8e0eeb5747 | ||
|  | fa3c3c6004 | ||
|  | 0c596f332e | ||
|  | 1cd2216731 | ||
|  | 2aad14a883 | ||
|  | f59fd56257 | ||
|  | 6694b8da61 | ||
|  | 2ae8a32aa3 | ||
|  | 7a105a0841 | ||
|  | 10ce68961f | ||
|  | ba170ee66e | ||
|  | 8276d82bac | ||
|  | ad0cbbc0fa | ||
|  | adecd4b1ea | 
							
								
								
									
										30
									
								
								.luacheckrc
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,30 @@ | |||||||
|  | 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", | ||||||
|  | } | ||||||
							
								
								
									
										940
									
								
								LICENSE
									
									
									
									
									
								
							
							
						
						| @@ -3,390 +3,618 @@ Minetest mod moretrees | |||||||
|  |  | ||||||
| All source code: | All source code: | ||||||
| 	© 2013, Vanessa Ezekowitz <vanessaezekowitz@gmail.com> | 	© 2013, Vanessa Ezekowitz <vanessaezekowitz@gmail.com> | ||||||
| 	Published under the terms and conditions of the WTFPL. | Date & cocos palm code (date_palm.lua, cocos_palm.lua) | ||||||
| All sapling textures (textures/*_sapling.png): | 	© 2016, Rogier <rogier777@gmail.com> | ||||||
|  | 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. |  | ||||||
|  |  | ||||||
| ------------------------------------------------------------------------------- | ############################################################################### | ||||||
|  |  | ||||||
|             DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE | License for all code: LGPL 3.0 | ||||||
|                     Version 2, December 2004 | License for all media and all other assets:  CC-by-SA 4.0 | ||||||
|  |  | ||||||
|  Copyright (C) 2004 Sam Hocevar <sam@hocevar.net> | ############################################################################### | ||||||
|  |  | ||||||
|  Everyone is permitted to copy and distribute verbatim or modified |                    GNU LESSER GENERAL PUBLIC LICENSE | ||||||
|  copies of this license document, and changing it is allowed as long |                        Version 3, 29 June 2007 | ||||||
|  as the name is changed. |  | ||||||
|  |  | ||||||
|             DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE |  Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/> | ||||||
|    TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION |  Everyone is permitted to copy and distribute verbatim copies | ||||||
|  |  of this license document, but changing it is not allowed. | ||||||
|  |  | ||||||
|   0. You just DO WHAT THE FUCK YOU WANT TO. |  | ||||||
|  |  | ||||||
| This license is commonly known as "WTFPL". |   This version of the GNU Lesser General Public License incorporates | ||||||
|  | the terms and conditions of version 3 of the GNU General Public | ||||||
|  | License, supplemented by the additional permissions listed below. | ||||||
|  |  | ||||||
| ------------------------------------------------------------------------------- |   0. Additional Definitions. | ||||||
|  |  | ||||||
| Creative Commons Legal Code |   As used herein, "this License" refers to version 3 of the GNU Lesser | ||||||
|  | General Public License, and the "GNU GPL" refers to version 3 of the GNU | ||||||
|  | General Public License. | ||||||
|  |  | ||||||
| Attribution-ShareAlike 3.0 Unported |   "The Library" refers to a covered work governed by this License, | ||||||
|  | other than an Application or a Combined Work as defined below. | ||||||
|  |  | ||||||
|     CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE |   An "Application" is any work that makes use of an interface provided | ||||||
|     LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN | by the Library, but which is not otherwise based on the Library. | ||||||
|     ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS | Defining a subclass of a class defined by the Library is deemed a mode | ||||||
|     INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES | of using an interface provided by the Library. | ||||||
|     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 | ||||||
|  |  | ||||||
| THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE | By exercising the Licensed Rights (defined below), You accept and agree | ||||||
| COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY | to be bound by the terms and conditions of this Creative Commons | ||||||
| COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS | Attribution-ShareAlike 4.0 International Public License ("Public | ||||||
| AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. | License"). To the extent this Public License may be interpreted as a | ||||||
|  | contract, You are granted the Licensed Rights in consideration of Your | ||||||
|  | acceptance of these terms and conditions, and the Licensor grants You | ||||||
|  | such rights in consideration of benefits the Licensor receives from | ||||||
|  | making the Licensed Material available under these terms and | ||||||
|  | conditions. | ||||||
|  |  | ||||||
| BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE |  | ||||||
| TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY |  | ||||||
| BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS |  | ||||||
| CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND |  | ||||||
| CONDITIONS. |  | ||||||
|  |  | ||||||
| 1. Definitions | Section 1 -- Definitions. | ||||||
|  |  | ||||||
|  a. "Adaptation" means a work based upon the Work, or upon the Work and |   a. Adapted Material means material subject to Copyright and Similar | ||||||
|     other pre-existing works, such as a translation, adaptation, |      Rights that is derived from or based upon the Licensed Material | ||||||
|     derivative work, arrangement of music or other alterations of a |      and in which the Licensed Material is translated, altered, | ||||||
|     literary or artistic work, or phonogram or performance and includes |      arranged, transformed, or otherwise modified in a manner requiring | ||||||
|     cinematographic adaptations or any other form in which the Work may be |      permission under the Copyright and Similar Rights held by the | ||||||
|     recast, transformed, or adapted including in any form recognizably |      Licensor. For purposes of this Public License, where the Licensed | ||||||
|     derived from the original, except that a work that constitutes a |      Material is a musical work, performance, or sound recording, | ||||||
|     Collection will not be considered an Adaptation for the purpose of |      Adapted Material is always produced where the Licensed Material is | ||||||
|     this License. For the avoidance of doubt, where the Work is a musical |      synched in timed relation with a moving image. | ||||||
|     work, performance or phonogram, the synchronization of the Work in |  | ||||||
|     timed-relation with a moving image ("synching") will be considered an |   b. Adapter's License means the license You apply to Your Copyright | ||||||
|     Adaptation for the purpose of this License. |      and Similar Rights in Your contributions to Adapted Material in | ||||||
|  b. "Collection" means a collection of literary or artistic works, such as |      accordance with the terms and conditions of this Public License. | ||||||
|     encyclopedias and anthologies, or performances, phonograms or |  | ||||||
|     broadcasts, or other works or subject matter other than works listed |   c. BY-SA Compatible License means a license listed at | ||||||
|     in Section 1(f) below, which, by reason of the selection and |      creativecommons.org/compatiblelicenses, approved by Creative | ||||||
|     arrangement of their contents, constitute intellectual creations, in |      Commons as essentially the equivalent of this Public License. | ||||||
|     which the Work is included in its entirety in unmodified form along |  | ||||||
|     with one or more other contributions, each constituting separate and |   d. Copyright and Similar Rights means copyright and/or similar rights | ||||||
|     independent works in themselves, which together are assembled into a |      closely related to copyright including, without limitation, | ||||||
|     collective whole. A work that constitutes a Collection will not be |      performance, broadcast, sound recording, and Sui Generis Database | ||||||
|     considered an Adaptation (as defined below) for the purposes of this |      Rights, without regard to how the rights are labeled or | ||||||
|  |      categorized. For purposes of this Public License, the rights | ||||||
|  |      specified in Section 2(b)(1)-(2) are not Copyright and Similar | ||||||
|  |      Rights. | ||||||
|  |  | ||||||
|  |   e. Effective Technological Measures means those measures that, in the | ||||||
|  |      absence of proper authority, may not be circumvented under laws | ||||||
|  |      fulfilling obligations under Article 11 of the WIPO Copyright | ||||||
|  |      Treaty adopted on December 20, 1996, and/or similar international | ||||||
|  |      agreements. | ||||||
|  |  | ||||||
|  |   f. Exceptions and Limitations means fair use, fair dealing, and/or | ||||||
|  |      any other exception or limitation to Copyright and Similar Rights | ||||||
|  |      that applies to Your use of the Licensed Material. | ||||||
|  |  | ||||||
|  |   g. License Elements means the license attributes listed in the name | ||||||
|  |      of a Creative Commons Public License. The License Elements of this | ||||||
|  |      Public License are Attribution and ShareAlike. | ||||||
|  |  | ||||||
|  |   h. Licensed Material means the artistic or literary work, database, | ||||||
|  |      or other material to which the Licensor applied this Public | ||||||
|      License. |      License. | ||||||
|  c. "Creative Commons Compatible License" means a license that is listed |  | ||||||
|     at http://creativecommons.org/compatiblelicenses that has been |  | ||||||
|     approved by Creative Commons as being essentially equivalent to this |  | ||||||
|     License, including, at a minimum, because that license: (i) contains |  | ||||||
|     terms that have the same purpose, meaning and effect as the License |  | ||||||
|     Elements of this License; and, (ii) explicitly permits the relicensing |  | ||||||
|     of adaptations of works made available under that license under this |  | ||||||
|     License or a Creative Commons jurisdiction license with the same |  | ||||||
|     License Elements as this License. |  | ||||||
|  d. "Distribute" means to make available to the public the original and |  | ||||||
|     copies of the Work or Adaptation, as appropriate, through sale or |  | ||||||
|     other transfer of ownership. |  | ||||||
|  e. "License Elements" means the following high-level license attributes |  | ||||||
|     as selected by Licensor and indicated in the title of this License: |  | ||||||
|     Attribution, ShareAlike. |  | ||||||
|  f. "Licensor" means the individual, individuals, entity or entities that |  | ||||||
|     offer(s) the Work under the terms of this License. |  | ||||||
|  g. "Original Author" means, in the case of a literary or artistic work, |  | ||||||
|     the individual, individuals, entity or entities who created the Work |  | ||||||
|     or if no individual or entity can be identified, the publisher; and in |  | ||||||
|     addition (i) in the case of a performance the actors, singers, |  | ||||||
|     musicians, dancers, and other persons who act, sing, deliver, declaim, |  | ||||||
|     play in, interpret or otherwise perform literary or artistic works or |  | ||||||
|     expressions of folklore; (ii) in the case of a phonogram the producer |  | ||||||
|     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 |  | ||||||
|     organization that transmits the broadcast. |  | ||||||
|  h. "Work" means the literary and/or artistic work offered under the terms |  | ||||||
|     of this License including without limitation any production in the |  | ||||||
|     literary, scientific and artistic domain, whatever may be the mode or |  | ||||||
|     form of its expression including digital form, such as a book, |  | ||||||
|     pamphlet and other writing; a lecture, address, sermon or other work |  | ||||||
|     of the same nature; a dramatic or dramatico-musical work; a |  | ||||||
|     choreographic work or entertainment in dumb show; a musical |  | ||||||
|     composition with or without words; a cinematographic work to which are |  | ||||||
|     assimilated works expressed by a process analogous to cinematography; |  | ||||||
|     a work of drawing, painting, architecture, sculpture, engraving or |  | ||||||
|     lithography; a photographic work to which are assimilated works |  | ||||||
|     expressed by a process analogous to photography; a work of applied |  | ||||||
|     art; an illustration, map, plan, sketch or three-dimensional work |  | ||||||
|     relative to geography, topography, architecture or science; a |  | ||||||
|     performance; a broadcast; a phonogram; a compilation of data to the |  | ||||||
|     extent it is protected as a copyrightable work; or a work performed by |  | ||||||
|     a variety or circus performer to the extent it is not otherwise |  | ||||||
|     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 |  | ||||||
|     respect to the Work, or who has received express permission from the |  | ||||||
|     Licensor to exercise rights under this License despite a previous |  | ||||||
|     violation. |  | ||||||
|  j. "Publicly Perform" means to perform public recitations of the Work and |  | ||||||
|     to communicate to the public those public recitations, by any means or |  | ||||||
|     process, including by wire or wireless means or public digital |  | ||||||
|     performances; to make available to the public Works in such a way that |  | ||||||
|     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 |  | ||||||
|     by any means or process and the communication to the public of the |  | ||||||
|     performances of the Work, including by public digital performance; to |  | ||||||
|     broadcast and rebroadcast the Work by any means including signs, |  | ||||||
|     sounds or images. |  | ||||||
|  k. "Reproduce" means to make copies of the Work by any means including |  | ||||||
|     without limitation by sound or visual recordings and the right of |  | ||||||
|     fixation and reproducing fixations of the Work, including storage of a |  | ||||||
|     protected performance or phonogram in digital form or other electronic |  | ||||||
|     medium. |  | ||||||
|  |  | ||||||
| 2. Fair Dealing Rights. Nothing in this License is intended to reduce, |   i. Licensed Rights means the rights granted to You subject to the | ||||||
| limit, or restrict any uses free from copyright or rights arising from |      terms and conditions of this Public License, which are limited to | ||||||
| limitations or exceptions that are provided for in connection with the |      all Copyright and Similar Rights that apply to Your use of the | ||||||
| copyright protection under copyright law or other applicable laws. |      Licensed Material and that the Licensor has authority to license. | ||||||
|  |  | ||||||
| 3. License Grant. Subject to the terms and conditions of this License, |   j. Licensor means the individual(s) or entity(ies) granting rights | ||||||
| Licensor hereby grants You a worldwide, royalty-free, non-exclusive, |      under this Public License. | ||||||
| perpetual (for the duration of the applicable copyright) license to |  | ||||||
| exercise the rights in the Work as stated below: |  | ||||||
|  |  | ||||||
|  a. to Reproduce the Work, to incorporate the Work into one or more |   k. Share means to provide material to the public by any means or | ||||||
|     Collections, and to Reproduce the Work as incorporated in the |      process that requires permission under the Licensed Rights, such | ||||||
|     Collections; |      as reproduction, public display, public performance, distribution, | ||||||
|  b. to create and Reproduce Adaptations provided that any such Adaptation, |      dissemination, communication, or importation, and to make material | ||||||
|     including any translation in any medium, takes reasonable steps to |      available to the public including in ways that members of the | ||||||
|     clearly label, demarcate or otherwise identify that changes were made |      public may access the material from a place and at a time | ||||||
|     to the original Work. For example, a translation could be marked "The |      individually chosen by them. | ||||||
|     original work was translated from English to Spanish," or a |  | ||||||
|     modification could indicate "The original work has been modified."; |  | ||||||
|  c. to Distribute and Publicly Perform the Work including as incorporated |  | ||||||
|     in Collections; and, |  | ||||||
|  d. to Distribute and Publicly Perform Adaptations. |  | ||||||
|  e. For the avoidance of doubt: |  | ||||||
|  |  | ||||||
|      i. Non-waivable Compulsory License Schemes. In those jurisdictions in |   l. Sui Generis Database Rights means rights other than copyright | ||||||
|         which the right to collect royalties through any statutory or |      resulting from Directive 96/9/EC of the European Parliament and of | ||||||
|         compulsory licensing scheme cannot be waived, the Licensor |      the Council of 11 March 1996 on the legal protection of databases, | ||||||
|         reserves the exclusive right to collect such royalties for any |      as amended and/or succeeded, as well as other essentially | ||||||
|         exercise by You of the rights granted under this License; |      equivalent rights anywhere in the world. | ||||||
|     ii. Waivable Compulsory License Schemes. In those jurisdictions in |  | ||||||
|         which the right to collect royalties through any statutory or |  | ||||||
|         compulsory licensing scheme can be waived, the Licensor waives the |  | ||||||
|         exclusive right to collect such royalties for any exercise by You |  | ||||||
|         of the rights granted under this License; and, |  | ||||||
|    iii. Voluntary License Schemes. The Licensor waives the right to |  | ||||||
|         collect royalties, whether individually or, in the event that the |  | ||||||
|         Licensor is a member of a collecting society that administers |  | ||||||
|         voluntary licensing schemes, via that society, from any exercise |  | ||||||
|         by You of the rights granted under this License. |  | ||||||
|  |  | ||||||
| The above rights may be exercised in all media and formats whether now |   m. You means the individual or entity exercising the Licensed Rights | ||||||
| known or hereafter devised. The above rights include the right to make |      under this Public License. Your has a corresponding meaning. | ||||||
| such modifications as are technically necessary to exercise the rights in |  | ||||||
| other media and formats. Subject to Section 8(f), all rights not expressly |  | ||||||
| granted by Licensor are hereby reserved. |  | ||||||
|  |  | ||||||
| 4. Restrictions. The license granted in Section 3 above is expressly made |  | ||||||
| subject to and limited by the following restrictions: |  | ||||||
|  |  | ||||||
|  a. You may Distribute or Publicly Perform the Work only under the terms |  | ||||||
|     of this License. You must include a copy of, or the Uniform Resource |  | ||||||
|     Identifier (URI) for, this License with every copy of the Work You |  | ||||||
|     Distribute or Publicly Perform. You may not offer or impose any terms |  | ||||||
|     on the Work that restrict the terms of this License or the ability of |  | ||||||
|     the recipient of the Work to exercise the rights granted to that |  | ||||||
|     recipient under the terms of the License. You may not sublicense the |  | ||||||
|     Work. You must keep intact all notices that refer to this License and |  | ||||||
|     to the disclaimer of warranties with every copy of the Work You |  | ||||||
|     Distribute or Publicly Perform. When You Distribute or Publicly |  | ||||||
|     Perform the Work, You may not impose any effective technological |  | ||||||
|     measures on the Work that restrict the ability of a recipient of the |  | ||||||
|     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 |  | ||||||
|     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 |  | ||||||
|     must, to the extent practicable, remove from the Collection any credit |  | ||||||
|     as required by Section 4(c), as requested. If You create an |  | ||||||
|     Adaptation, upon notice from any Licensor You must, to the extent |  | ||||||
|     practicable, remove from the Adaptation any credit as required by |  | ||||||
|     Section 4(c), as requested. |  | ||||||
|  b. You may Distribute or Publicly Perform an Adaptation only under the |  | ||||||
|     terms of: (i) this License; (ii) a later version of this License with |  | ||||||
|     the same License Elements as this License; (iii) a Creative Commons |  | ||||||
|     jurisdiction license (either this or a later license version) that |  | ||||||
|     contains the same License Elements as this License (e.g., |  | ||||||
|     Attribution-ShareAlike 3.0 US)); (iv) a Creative Commons Compatible |  | ||||||
|     License. If you license the Adaptation under one of the licenses |  | ||||||
|     mentioned in (iv), you must comply with the terms of that license. If |  | ||||||
|     you license the Adaptation under the terms of any of the licenses |  | ||||||
|     mentioned in (i), (ii) or (iii) (the "Applicable License"), you must |  | ||||||
|     comply with the terms of the Applicable License generally and the |  | ||||||
|     following provisions: (I) You must include a copy of, or the URI for, |  | ||||||
|     the Applicable License with every copy of each Adaptation You |  | ||||||
|     Distribute or Publicly Perform; (II) You may not offer or impose any |  | ||||||
|     terms on the Adaptation that restrict the terms of the Applicable |  | ||||||
|     License or the ability of the recipient of the Adaptation to exercise |  | ||||||
|     the rights granted to that recipient under the terms of the Applicable |  | ||||||
|     License; (III) You must keep intact all notices that refer to the |  | ||||||
|     Applicable License and to the disclaimer of warranties with every copy |  | ||||||
|     of the Work as included in the Adaptation You Distribute or Publicly |  | ||||||
|     Perform; (IV) when You Distribute or Publicly Perform the Adaptation, |  | ||||||
|     You may not impose any effective technological measures on the |  | ||||||
|     Adaptation that restrict the ability of a recipient of the Adaptation |  | ||||||
|     from You to exercise the rights granted to that recipient under the |  | ||||||
|     terms of the Applicable License. This Section 4(b) applies to the |  | ||||||
|     Adaptation as incorporated in a Collection, but this does not require |  | ||||||
|     the Collection apart from the Adaptation itself to be made subject to |  | ||||||
|     the terms of the Applicable License. |  | ||||||
|  c. If You Distribute, or Publicly Perform the Work or any Adaptations or |  | ||||||
|     Collections, You must, unless a request has been made pursuant to |  | ||||||
|     Section 4(a), keep intact all copyright notices for the Work and |  | ||||||
|     provide, reasonable to the medium or means You are utilizing: (i) the |  | ||||||
|     name of the Original Author (or pseudonym, if applicable) if supplied, |  | ||||||
|     and/or if the Original Author and/or Licensor designate another party |  | ||||||
|     or parties (e.g., a sponsor institute, publishing entity, journal) for |  | ||||||
|     attribution ("Attribution Parties") in Licensor's copyright notice, |  | ||||||
|     terms of service or by other reasonable means, the name of such party |  | ||||||
|     or parties; (ii) the title of the Work if supplied; (iii) to the |  | ||||||
|     extent reasonably practicable, the URI, if any, that Licensor |  | ||||||
|     specifies to be associated with the Work, unless such URI does not |  | ||||||
|     refer to the copyright notice or licensing information for the Work; |  | ||||||
|     and (iv) , consistent with Ssection 3(b), in the case of an |  | ||||||
|     Adaptation, a credit identifying the use of the Work in the Adaptation |  | ||||||
|     (e.g., "French translation of the Work by Original Author," or |  | ||||||
|     "Screenplay based on original Work by Original Author"). The credit |  | ||||||
|     required by this Section 4(c) may be implemented in any reasonable |  | ||||||
|     manner; provided, however, that in the case of a Adaptation or |  | ||||||
|     Collection, at a minimum such credit will appear, if a credit for all |  | ||||||
|     contributing authors of the Adaptation or Collection appears, then as |  | ||||||
|     part of these credits and in a manner at least as prominent as the |  | ||||||
|     credits for the other contributing authors. For the avoidance of |  | ||||||
|     doubt, You may only use the credit required by this Section for the |  | ||||||
|     purpose of attribution in the manner set out above and, by exercising |  | ||||||
|     Your rights under this License, You may not implicitly or explicitly |  | ||||||
|     assert or imply any connection with, sponsorship or endorsement by the |  | ||||||
|     Original Author, Licensor and/or Attribution Parties, as appropriate, |  | ||||||
|     of You or Your use of the Work, without the separate, express prior |  | ||||||
|     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 |  | ||||||
|     otherwise permitted by applicable law, if You Reproduce, Distribute or |  | ||||||
|     Publicly Perform the Work either by itself or as part of any |  | ||||||
|     Adaptations or Collections, You must not distort, mutilate, modify or |  | ||||||
|     take other derogatory action in relation to the Work which would be |  | ||||||
|     prejudicial to the Original Author's honor or reputation. Licensor |  | ||||||
|     agrees that in those jurisdictions (e.g. Japan), in which any exercise |  | ||||||
|     of the right granted in Section 3(b) of this License (the right to |  | ||||||
|     make Adaptations) would be deemed to be a distortion, mutilation, |  | ||||||
|     modification or other derogatory action prejudicial to the Original |  | ||||||
|     Author's honor and reputation, the Licensor will waive or not assert, |  | ||||||
|     as appropriate, this Section, to the fullest extent permitted by the |  | ||||||
|     applicable national law, to enable You to reasonably exercise Your |  | ||||||
|     right under Section 3(b) of this License (right to make Adaptations) |  | ||||||
|     but not otherwise. |  | ||||||
|  |  | ||||||
| 5. Representations, Warranties and Disclaimer |  | ||||||
|  |  | ||||||
| UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR |  | ||||||
| OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY |  | ||||||
| KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, |  | ||||||
| INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, |  | ||||||
| FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF |  | ||||||
| LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, |  | ||||||
| WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION |  | ||||||
| OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. |  | ||||||
|  |  | ||||||
| 6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE |  | ||||||
| LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR |  | ||||||
| ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES |  | ||||||
| ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS |  | ||||||
| BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. |  | ||||||
|  |  | ||||||
| 7. Termination |  | ||||||
|  |  | ||||||
|  a. This License and the rights granted hereunder will terminate |  | ||||||
|     automatically upon any breach by You of the terms of this License. |  | ||||||
|     Individuals or entities who have received Adaptations or Collections |  | ||||||
|     from You under this License, however, will not have their licenses |  | ||||||
|     terminated provided such individuals or entities remain in full |  | ||||||
|     compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will |  | ||||||
|     survive any termination of this License. |  | ||||||
|  b. Subject to the above terms and conditions, the license granted here is |  | ||||||
|     perpetual (for the duration of the applicable copyright in the Work). |  | ||||||
|     Notwithstanding the above, Licensor reserves the right to release the |  | ||||||
|     Work under different license terms or to stop distributing the Work at |  | ||||||
|     any time; provided, however that any such election will not serve to |  | ||||||
|     withdraw this License (or any other license that has been, or is |  | ||||||
|     required to be, granted under the terms of this License), and this |  | ||||||
|     License will continue in full force and effect unless terminated as |  | ||||||
|     stated above. |  | ||||||
|  |  | ||||||
| 8. Miscellaneous |  | ||||||
|  |  | ||||||
|  a. Each time You Distribute or Publicly Perform the Work or a Collection, |  | ||||||
|     the Licensor offers to the recipient a license to the Work on the same |  | ||||||
|     terms and conditions as the license granted to You under this License. |  | ||||||
|  b. Each time You Distribute or Publicly Perform an Adaptation, Licensor |  | ||||||
|     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. |  | ||||||
|  c. If any provision of this License is invalid or unenforceable under |  | ||||||
|     applicable law, it shall not affect the validity or enforceability of |  | ||||||
|     the remainder of the terms of this License, and without further action |  | ||||||
|     by the parties to this agreement, such provision shall be reformed to |  | ||||||
|     the minimum extent necessary to make such provision valid and |  | ||||||
|     enforceable. |  | ||||||
|  d. No term or provision of this License shall be deemed waived and no |  | ||||||
|     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. |  | ||||||
|  e. This License constitutes the entire agreement between the parties with |  | ||||||
|     respect to the Work licensed here. There are no understandings, |  | ||||||
|     agreements or representations with respect to the Work not specified |  | ||||||
|     here. Licensor shall not be bound by any additional provisions that |  | ||||||
|     may appear in any communication from You. This License may not be |  | ||||||
|     modified without the mutual written agreement of the Licensor and You. |  | ||||||
|  f. The rights granted under, and the subject matter referenced, in this |  | ||||||
|     License were drafted utilizing the terminology of the Berne Convention |  | ||||||
|     for the Protection of Literary and Artistic Works (as amended on |  | ||||||
|     September 28, 1979), the Rome Convention of 1961, the WIPO Copyright |  | ||||||
|     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 |  | ||||||
|     jurisdiction in which the License terms are sought to be enforced |  | ||||||
|     according to the corresponding provisions of the implementation of |  | ||||||
|     those treaty provisions in the applicable national law. If the |  | ||||||
|     standard suite of rights granted under applicable copyright law |  | ||||||
|     includes additional rights not granted under this License, such |  | ||||||
|     additional rights are deemed to be included in the License; this |  | ||||||
|     License is not intended to restrict the license of any rights under |  | ||||||
|     applicable law. |  | ||||||
|  |  | ||||||
|  |  | ||||||
| Creative Commons Notice | Section 2 -- Scope. | ||||||
|  |  | ||||||
|     Creative Commons is not a party to this License, and makes no warranty |   a. License grant. | ||||||
|     whatsoever in connection with the Work. Creative Commons will not be |  | ||||||
|     liable to You or any party on any legal theory for any damages |  | ||||||
|     whatsoever, including without limitation any general, special, |  | ||||||
|     incidental or consequential damages arising in connection to this |  | ||||||
|     license. Notwithstanding the foregoing two (2) sentences, if Creative |  | ||||||
|     Commons has expressly identified itself as the Licensor hereunder, it |  | ||||||
|     shall have all rights and obligations of Licensor. |  | ||||||
|  |  | ||||||
|     Except for the limited purpose of indicating to the public that the |        1. Subject to the terms and conditions of this Public License, | ||||||
|     Work is licensed under the CCPL, Creative Commons does not authorize |           the Licensor hereby grants You a worldwide, royalty-free, | ||||||
|     the use by either party of the trademark "Creative Commons" or any |           non-sublicensable, non-exclusive, irrevocable license to | ||||||
|     related trademark or logo of Creative Commons without the prior |           exercise the Licensed Rights in the Licensed Material to: | ||||||
|     written consent of Creative Commons. Any permitted use will be in |  | ||||||
|     compliance with Creative Commons' then-current trademark usage |  | ||||||
|     guidelines, as may be published on its website or otherwise made |  | ||||||
|     available upon request from time to time. For the avoidance of doubt, |  | ||||||
|     this trademark restriction does not form part of the License. |  | ||||||
|  |  | ||||||
|     Creative Commons may be contacted at http://creativecommons.org/. |             a. reproduce and Share the Licensed Material, in whole or | ||||||
|  |                in part; and | ||||||
|  |  | ||||||
|  |             b. produce, reproduce, and Share Adapted Material. | ||||||
|  |  | ||||||
|  |        2. Exceptions and Limitations. For the avoidance of doubt, where | ||||||
|  |           Exceptions and Limitations apply to Your use, this Public | ||||||
|  |           License does not apply, and You do not need to comply with | ||||||
|  |           its terms and conditions. | ||||||
|  |  | ||||||
|  |        3. Term. The term of this Public License is specified in Section | ||||||
|  |           6(a). | ||||||
|  |  | ||||||
|  |        4. Media and formats; technical modifications allowed. The | ||||||
|  |           Licensor authorizes You to exercise the Licensed Rights in | ||||||
|  |           all media and formats whether now known or hereafter created, | ||||||
|  |           and to make technical modifications necessary to do so. The | ||||||
|  |           Licensor waives and/or agrees not to assert any right or | ||||||
|  |           authority to forbid You from making technical modifications | ||||||
|  |           necessary to exercise the Licensed Rights, including | ||||||
|  |           technical modifications necessary to circumvent Effective | ||||||
|  |           Technological Measures. For purposes of this Public License, | ||||||
|  |           simply making modifications authorized by this Section 2(a) | ||||||
|  |           (4) never produces Adapted Material. | ||||||
|  |  | ||||||
|  |        5. Downstream recipients. | ||||||
|  |  | ||||||
|  |             a. Offer from the Licensor -- Licensed Material. Every | ||||||
|  |                recipient of the Licensed Material automatically | ||||||
|  |                receives an offer from the Licensor to exercise the | ||||||
|  |                Licensed Rights under the terms and conditions of this | ||||||
|  |                Public License. | ||||||
|  |  | ||||||
|  |             b. Additional offer from the Licensor -- Adapted Material. | ||||||
|  |                Every recipient of Adapted Material from You | ||||||
|  |                automatically receives an offer from the Licensor to | ||||||
|  |                exercise the Licensed Rights in the Adapted Material | ||||||
|  |                under the conditions of the Adapter's License You apply. | ||||||
|  |  | ||||||
|  |             c. No downstream restrictions. You may not offer or impose | ||||||
|  |                any additional or different terms or conditions on, or | ||||||
|  |                apply any Effective Technological Measures to, the | ||||||
|  |                Licensed Material if doing so restricts exercise of the | ||||||
|  |                Licensed Rights by any recipient of the Licensed | ||||||
|  |                Material. | ||||||
|  |  | ||||||
|  |        6. No endorsement. Nothing in this Public License constitutes or | ||||||
|  |           may be construed as permission to assert or imply that You | ||||||
|  |           are, or that Your use of the Licensed Material is, connected | ||||||
|  |           with, or sponsored, endorsed, or granted official status by, | ||||||
|  |           the Licensor or others designated to receive attribution as | ||||||
|  |           provided in Section 3(a)(1)(A)(i). | ||||||
|  |  | ||||||
|  |   b. Other rights. | ||||||
|  |  | ||||||
|  |        1. Moral rights, such as the right of integrity, are not | ||||||
|  |           licensed under this Public License, nor are publicity, | ||||||
|  |           privacy, and/or other similar personality rights; however, to | ||||||
|  |           the extent possible, the Licensor waives and/or agrees not to | ||||||
|  |           assert any such rights held by the Licensor to the limited | ||||||
|  |           extent necessary to allow You to exercise the Licensed | ||||||
|  |           Rights, but not otherwise. | ||||||
|  |  | ||||||
|  |        2. Patent and trademark rights are not licensed under this | ||||||
|  |           Public License. | ||||||
|  |  | ||||||
|  |        3. To the extent possible, the Licensor waives any right to | ||||||
|  |           collect royalties from You for the exercise of the Licensed | ||||||
|  |           Rights, whether directly or through a collecting society | ||||||
|  |           under any voluntary or waivable statutory or compulsory | ||||||
|  |           licensing scheme. In all other cases the Licensor expressly | ||||||
|  |           reserves any right to collect such royalties. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Section 3 -- License Conditions. | ||||||
|  |  | ||||||
|  | Your exercise of the Licensed Rights is expressly made subject to the | ||||||
|  | following conditions. | ||||||
|  |  | ||||||
|  |   a. Attribution. | ||||||
|  |  | ||||||
|  |        1. If You Share the Licensed Material (including in modified | ||||||
|  |           form), You must: | ||||||
|  |  | ||||||
|  |             a. retain the following if it is supplied by the Licensor | ||||||
|  |                with the Licensed Material: | ||||||
|  |  | ||||||
|  |                  i. identification of the creator(s) of the Licensed | ||||||
|  |                     Material and any others designated to receive | ||||||
|  |                     attribution, in any reasonable manner requested by | ||||||
|  |                     the Licensor (including by pseudonym if | ||||||
|  |                     designated); | ||||||
|  |  | ||||||
|  |                 ii. a copyright notice; | ||||||
|  |  | ||||||
|  |                iii. a notice that refers to this Public License; | ||||||
|  |  | ||||||
|  |                 iv. a notice that refers to the disclaimer of | ||||||
|  |                     warranties; | ||||||
|  |  | ||||||
|  |                  v. a URI or hyperlink to the Licensed Material to the | ||||||
|  |                     extent reasonably practicable; | ||||||
|  |  | ||||||
|  |             b. indicate if You modified the Licensed Material and | ||||||
|  |                retain an indication of any previous modifications; and | ||||||
|  |  | ||||||
|  |             c. indicate the Licensed Material is licensed under this | ||||||
|  |                Public License, and include the text of, or the URI or | ||||||
|  |                hyperlink to, this Public License. | ||||||
|  |  | ||||||
|  |        2. You may satisfy the conditions in Section 3(a)(1) in any | ||||||
|  |           reasonable manner based on the medium, means, and context in | ||||||
|  |           which You Share the Licensed Material. For example, it may be | ||||||
|  |           reasonable to satisfy the conditions by providing a URI or | ||||||
|  |           hyperlink to a resource that includes the required | ||||||
|  |           information. | ||||||
|  |  | ||||||
|  |        3. If requested by the Licensor, You must remove any of the | ||||||
|  |           information required by Section 3(a)(1)(A) to the extent | ||||||
|  |           reasonably practicable. | ||||||
|  |  | ||||||
|  |   b. ShareAlike. | ||||||
|  |  | ||||||
|  |      In addition to the conditions in Section 3(a), if You Share | ||||||
|  |      Adapted Material You produce, the following conditions also apply. | ||||||
|  |  | ||||||
|  |        1. The Adapter's License You apply must be a Creative Commons | ||||||
|  |           license with the same License Elements, this version or | ||||||
|  |           later, or a BY-SA Compatible License. | ||||||
|  |  | ||||||
|  |        2. You must include the text of, or the URI or hyperlink to, the | ||||||
|  |           Adapter's License You apply. You may satisfy this condition | ||||||
|  |           in any reasonable manner based on the medium, means, and | ||||||
|  |           context in which You Share Adapted Material. | ||||||
|  |  | ||||||
|  |        3. You may not offer or impose any additional or different terms | ||||||
|  |           or conditions on, or apply any Effective Technological | ||||||
|  |           Measures to, Adapted Material that restrict exercise of the | ||||||
|  |           rights granted under the Adapter's License You apply. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Section 4 -- Sui Generis Database Rights. | ||||||
|  |  | ||||||
|  | Where the Licensed Rights include Sui Generis Database Rights that | ||||||
|  | apply to Your use of the Licensed Material: | ||||||
|  |  | ||||||
|  |   a. for the avoidance of doubt, Section 2(a)(1) grants You the right | ||||||
|  |      to extract, reuse, reproduce, and Share all or a substantial | ||||||
|  |      portion of the contents of the database; | ||||||
|  |  | ||||||
|  |   b. if You include all or a substantial portion of the database | ||||||
|  |      contents in a database in which You have Sui Generis Database | ||||||
|  |      Rights, then the database in which You have Sui Generis Database | ||||||
|  |      Rights (but not its individual contents) is Adapted Material, | ||||||
|  |  | ||||||
|  |      including for purposes of Section 3(b); and | ||||||
|  |   c. You must comply with the conditions in Section 3(a) if You Share | ||||||
|  |      all or a substantial portion of the contents of the database. | ||||||
|  |  | ||||||
|  | For the avoidance of doubt, this Section 4 supplements and does not | ||||||
|  | replace Your obligations under this Public License where the Licensed | ||||||
|  | Rights include other Copyright and Similar Rights. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Section 5 -- Disclaimer of Warranties and Limitation of Liability. | ||||||
|  |  | ||||||
|  |   a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE | ||||||
|  |      EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS | ||||||
|  |      AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF | ||||||
|  |      ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, | ||||||
|  |      IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, | ||||||
|  |      WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR | ||||||
|  |      PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, | ||||||
|  |      ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT | ||||||
|  |      KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT | ||||||
|  |      ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. | ||||||
|  |  | ||||||
|  |   b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE | ||||||
|  |      TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, | ||||||
|  |      NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, | ||||||
|  |      INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, | ||||||
|  |      COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR | ||||||
|  |      USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN | ||||||
|  |      ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR | ||||||
|  |      DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR | ||||||
|  |      IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. | ||||||
|  |  | ||||||
|  |   c. The disclaimer of warranties and limitation of liability provided | ||||||
|  |      above shall be interpreted in a manner that, to the extent | ||||||
|  |      possible, most closely approximates an absolute disclaimer and | ||||||
|  |      waiver of all liability. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Section 6 -- Term and Termination. | ||||||
|  |  | ||||||
|  |   a. This Public License applies for the term of the Copyright and | ||||||
|  |      Similar Rights licensed here. However, if You fail to comply with | ||||||
|  |      this Public License, then Your rights under this Public License | ||||||
|  |      terminate automatically. | ||||||
|  |  | ||||||
|  |   b. Where Your right to use the Licensed Material has terminated under | ||||||
|  |      Section 6(a), it reinstates: | ||||||
|  |  | ||||||
|  |        1. automatically as of the date the violation is cured, provided | ||||||
|  |           it is cured within 30 days of Your discovery of the | ||||||
|  |           violation; or | ||||||
|  |  | ||||||
|  |        2. upon express reinstatement by the Licensor. | ||||||
|  |  | ||||||
|  |      For the avoidance of doubt, this Section 6(b) does not affect any | ||||||
|  |      right the Licensor may have to seek remedies for Your violations | ||||||
|  |      of this Public License. | ||||||
|  |  | ||||||
|  |   c. For the avoidance of doubt, the Licensor may also offer the | ||||||
|  |      Licensed Material under separate terms or conditions or stop | ||||||
|  |      distributing the Licensed Material at any time; however, doing so | ||||||
|  |      will not terminate this Public License. | ||||||
|  |  | ||||||
|  |   d. Sections 1, 5, 6, 7, and 8 survive termination of this Public | ||||||
|  |      License. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Section 7 -- Other Terms and Conditions. | ||||||
|  |  | ||||||
|  |   a. The Licensor shall not be bound by any additional or different | ||||||
|  |      terms or conditions communicated by You unless expressly agreed. | ||||||
|  |  | ||||||
|  |   b. Any arrangements, understandings, or agreements regarding the | ||||||
|  |      Licensed Material not stated herein are separate from and | ||||||
|  |      independent of the terms and conditions of this Public License. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Section 8 -- Interpretation. | ||||||
|  |  | ||||||
|  |   a. For the avoidance of doubt, this Public License does not, and | ||||||
|  |      shall not be interpreted to, reduce, limit, restrict, or impose | ||||||
|  |      conditions on any use of the Licensed Material that could lawfully | ||||||
|  |      be made without permission under this Public License. | ||||||
|  |  | ||||||
|  |   b. To the extent possible, if any provision of this Public License is | ||||||
|  |      deemed unenforceable, it shall be automatically reformed to the | ||||||
|  |      minimum extent necessary to make it enforceable. If the provision | ||||||
|  |      cannot be reformed, it shall be severed from this Public License | ||||||
|  |      without affecting the enforceability of the remaining terms and | ||||||
|  |      conditions. | ||||||
|  |  | ||||||
|  |   c. No term or condition of this Public License will be waived and no | ||||||
|  |      failure to comply consented to unless expressly agreed to by the | ||||||
|  |      Licensor. | ||||||
|  |  | ||||||
|  |   d. Nothing in this Public License constitutes or may be interpreted | ||||||
|  |      as a limitation upon, or waiver of, any privileges and immunities | ||||||
|  |      that apply to the Licensor or You, including from the legal | ||||||
|  |      processes of any jurisdiction or authority. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ======================================================================= | ||||||
|  |  | ||||||
|  | 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://github.com/VanessaE/plantlife">plants_lib</a> and default | Dependencies: <a href="https://forum.minetest.net/viewtopic.php?f=11&t=12999">biome_lib</a> and default | ||||||
|   | |||||||
							
								
								
									
										169
									
								
								biome_defs.lua
									
									
									
									
									
								
							
							
						
						| @@ -24,6 +24,40 @@ 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, | ||||||
| @@ -90,18 +124,6 @@ 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 = "default:dirt_with_grass", | 	surface = "default:dirt_with_grass", | ||||||
| 	avoid_nodes = moretrees.avoidnodes, | 	avoid_nodes = moretrees.avoidnodes, | ||||||
| @@ -118,18 +140,24 @@ moretrees.rubber_tree_biome = { | |||||||
| } | } | ||||||
|  |  | ||||||
| moretrees.jungletree_biome = { | moretrees.jungletree_biome = { | ||||||
| 	surface = "default:dirt_with_grass", | 	surface = { | ||||||
| 	avoid_nodes = moretrees.avoidnodes, | 		"default:dirt", | ||||||
| 	avoid_radius = 5, | 		"default:dirt_with_grass", | ||||||
|  | 		"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 = -5, | 	min_elevation = 1, | ||||||
| 	max_elevation = 10, | 	near_nodes = {"default:jungletree"}, | ||||||
| 	temp_min = 0.25, | 	near_nodes_size = 6, | ||||||
| 	near_nodes = {"default:water_source"}, | 	near_nodes_vertical = 2, | ||||||
| 	near_nodes_size = 20, | 	near_nodes_count = 1, | ||||||
| 	near_nodes_count = 7, | 	plantlife_limit = -0.9, | ||||||
| 	rarity = 10, |  | ||||||
| 	max_count = 10, |  | ||||||
| } | } | ||||||
|  |  | ||||||
| moretrees.spruce_biome = { | moretrees.spruce_biome = { | ||||||
| @@ -144,11 +172,12 @@ moretrees.spruce_biome = { | |||||||
| 	max_count = 5, | 	max_count = 5, | ||||||
| } | } | ||||||
|  |  | ||||||
| moretrees.pine_biome = { | moretrees.cedar_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, | ||||||
| @@ -156,6 +185,97 @@ moretrees.pine_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, | ||||||
| @@ -180,4 +300,3 @@ moretrees.fir_biome_snow = { | |||||||
| 	delete_above = true, | 	delete_above = true, | ||||||
| 	spawn_replace_node = true | 	spawn_replace_node = true | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										335
									
								
								cocos_palm.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,335 @@ | |||||||
|  | -- © 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,16 +1,8 @@ | |||||||
| local S = moretrees.intllib | local S = minetest.get_translator("moretrees") | ||||||
|  |  | ||||||
| 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", | ||||||
| @@ -19,14 +11,6 @@ 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", | ||||||
| @@ -54,7 +38,8 @@ 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), | 	on_use = minetest.item_eat(2, "vessels:drinking_glass"), | ||||||
|  | 	groups = {vessel = 1}, | ||||||
| }) | }) | ||||||
|  |  | ||||||
| minetest.register_craftitem("moretrees:raw_coconut", { | minetest.register_craftitem("moretrees:raw_coconut", { | ||||||
| @@ -63,6 +48,35 @@ 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", | ||||||
| @@ -80,9 +94,9 @@ minetest.register_craftitem("moretrees:spruce_nuts", { | |||||||
| 	on_use = minetest.item_eat(1), | 	on_use = minetest.item_eat(1), | ||||||
| }) | }) | ||||||
|  |  | ||||||
| minetest.register_craftitem("moretrees:pine_nuts", { | minetest.register_craftitem("moretrees:cedar_nuts", { | ||||||
| 	description = S("Roasted Pine Cone Nuts"), | 	description = S("Roasted Cedar Cone Nuts"), | ||||||
| 	inventory_image = "moretrees_pine_nuts.png", | 	inventory_image = "moretrees_cedar_nuts.png", | ||||||
| 	on_use = minetest.item_eat(1), | 	on_use = minetest.item_eat(1), | ||||||
| }) | }) | ||||||
|  |  | ||||||
| @@ -104,11 +118,117 @@ 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", | ||||||
| @@ -138,8 +258,8 @@ minetest.register_craft({ | |||||||
|  |  | ||||||
| minetest.register_craft({ | minetest.register_craft({ | ||||||
| 	type = "cooking", | 	type = "cooking", | ||||||
| 	output = "moretrees:pine_nuts 4", | 	output = "moretrees:cedar_nuts 4", | ||||||
| 	recipe = "moretrees:pine_cone", | 	recipe = "moretrees:cedar_cone", | ||||||
| }) | }) | ||||||
|  |  | ||||||
| minetest.register_craft({ | minetest.register_craft({ | ||||||
|   | |||||||
							
								
								
									
										762
									
								
								date_palm.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,762 @@ | |||||||
|  | -- 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,25 +6,33 @@ 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_pine			= true | moretrees.enable_date_palm		= 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 very quickly.  With | -- of fully-grown trees, which will grow into full trees after a very short | ||||||
| -- older versions of plants_lib, doing this will reduce mapgen lag. | -- delay.  This reduces mapgen lag in some situations, and fixes situations | ||||||
|  | -- where the mapgen conflicts with the tree generator. | ||||||
|  |  | ||||||
| moretrees.spawn_saplings		= false | moretrees.spawn_saplings		= true | ||||||
|  |  | ||||||
| -- Set this to true to allow usage of the stairsplus mod in moreblocks | -- Set this to true to allow defining stairs/slabs/etc.  If Moreblocks is | ||||||
|  | -- 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_stairsplus		= true | moretrees.enable_stairs			= true | ||||||
|  |  | ||||||
|  | -- If this variable is set to true, register fences for moretrees wood | ||||||
|  |  | ||||||
|  | moretrees.enable_fences         = false | ||||||
|  |  | ||||||
| -- Set this to true if you want the plantlike drawtype for leaves, which | -- 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. | ||||||
| @@ -32,42 +40,21 @@ moretrees.enable_stairsplus		= true | |||||||
|  |  | ||||||
| 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 | ||||||
|  |  | ||||||
| -- various settings to configure default and default-jungle leaf decay. | -- Set this to true to enable leaf decay of all trees except the default ones. | ||||||
|  |  | ||||||
|  | moretrees.enable_leafdecay		= true | ||||||
|  |  | ||||||
|  | -- various related settings to configure leaf decay. | ||||||
|  |  | ||||||
| moretrees.leafdecay_delay		= 2 | moretrees.leafdecay_delay		= 2 | ||||||
| moretrees.leafdecay_chance		= 100 | moretrees.leafdecay_chance		= 5 | ||||||
| moretrees.leafdecay_radius		= 5 | moretrees.leafdecay_radius		= 5 | ||||||
|  | moretrees.palm_leafdecay_radius		= 10 | ||||||
| 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. | ||||||
| @@ -76,10 +63,71 @@ 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		= 500 | moretrees.sapling_interval		= 100 | ||||||
| moretrees.sapling_chance		= 20 | moretrees.sapling_chance		= 5 | ||||||
|  |  | ||||||
| -- 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. | ||||||
|   | |||||||
| @@ -1,5 +0,0 @@ | |||||||
| default |  | ||||||
| plants_lib |  | ||||||
| moreblocks? |  | ||||||
| intllib? |  | ||||||
|  |  | ||||||
							
								
								
									
										173
									
								
								init.lua
									
									
									
									
									
								
							
							
						
						| @@ -8,16 +8,48 @@ | |||||||
| -- 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 Ezekowitz, with the  | -- Firs and Jungle tree axioms/rules by Vanessa Dannenberg, 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() | ||||||
| @@ -25,36 +57,16 @@ local modpath=minetest.get_modpath("moretrees") | |||||||
|  |  | ||||||
| dofile(modpath.."/default_settings.txt") | dofile(modpath.."/default_settings.txt") | ||||||
|  |  | ||||||
| if io.open(worldpath.."/moretrees_settings.txt","r") == nil then | if io.open(worldpath.."/moretrees_settings.txt","r") then | ||||||
|  |  | ||||||
| 	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() | 	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 minetest.setting_getbool("creative_mode") then | if minetest.get_modpath("unified_inventory") or not | ||||||
|  | 		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 | ||||||
| @@ -76,10 +88,11 @@ 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 | ||||||
|  |  | ||||||
| @@ -89,92 +102,104 @@ 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_pine_object = "moretrees:pine_sapling_ongen" | 	moretrees.spawn_date_palm_object = "moretrees:date_palm_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_pine_object = moretrees.pine_model | 	moretrees.spawn_date_palm_object = moretrees.date_palm_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_acacia_object = moretrees.acacia_model | 	moretrees.spawn_birch_object = "moretrees.grow_birch" | ||||||
| 	moretrees.spawn_birch_object = "moretrees:grow_birch" | 	moretrees.spawn_spruce_object = "moretrees.grow_spruce" | ||||||
| 	moretrees.spawn_spruce_object = "moretrees:grow_spruce" | 	moretrees.spawn_jungletree_object = "moretrees.grow_jungletree" | ||||||
| 	moretrees.spawn_jungletree_object = "moretrees:grow_jungletree" | 	moretrees.spawn_fir_object = "moretrees.grow_fir" | ||||||
| 	moretrees.spawn_fir_object = "moretrees:grow_fir" | 	moretrees.spawn_fir_snow_object = "moretrees.grow_fir_snow" | ||||||
| 	moretrees.spawn_fir_snow_object = "moretrees:grow_fir_snow" | 	moretrees.spawn_poplar_object = moretrees.poplar_model | ||||||
|  | 	moretrees.spawn_poplar_small_object = moretrees.poplar_small_model | ||||||
| end | end | ||||||
|  |  | ||||||
|  |  | ||||||
| if moretrees.enable_beech then | if moretrees.enable_beech then | ||||||
| 	plantslib:register_generate_plant(moretrees.beech_biome, moretrees.spawn_beech_object) | 	biome_lib:register_generate_plant(moretrees.beech_biome, moretrees.spawn_beech_object) | ||||||
| end | end | ||||||
|  |  | ||||||
| if moretrees.enable_apple_tree then | if moretrees.enable_apple_tree then | ||||||
| 	plantslib:register_generate_plant(moretrees.apple_tree_biome, moretrees.spawn_apple_tree_object) | 	biome_lib:register_generate_plant(moretrees.apple_tree_biome, moretrees.spawn_apple_tree_object) | ||||||
| end | end | ||||||
|  |  | ||||||
| if moretrees.enable_oak then | if moretrees.enable_oak then | ||||||
| 	plantslib:register_generate_plant(moretrees.oak_biome, moretrees.spawn_oak_object) | 	biome_lib:register_generate_plant(moretrees.oak_biome, moretrees.spawn_oak_object) | ||||||
| end | end | ||||||
|  |  | ||||||
| if moretrees.enable_sequoia then | if moretrees.enable_sequoia then | ||||||
| 	plantslib:register_generate_plant(moretrees.sequoia_biome, moretrees.spawn_sequoia_object) | 	biome_lib:register_generate_plant(moretrees.sequoia_biome, moretrees.spawn_sequoia_object) | ||||||
| end | end | ||||||
|  |  | ||||||
| if moretrees.enable_palm then | if moretrees.enable_palm then | ||||||
| 	plantslib:register_generate_plant(moretrees.palm_biome, moretrees.spawn_palm_object) | 	biome_lib:register_generate_plant(moretrees.palm_biome, moretrees.spawn_palm_object) | ||||||
| end | end | ||||||
|  |  | ||||||
| if moretrees.enable_pine then | if moretrees.enable_date_palm then | ||||||
| 	plantslib:register_generate_plant(moretrees.pine_biome, moretrees.spawn_pine_object) | 	biome_lib:register_generate_plant(moretrees.date_palm_biome, moretrees.spawn_date_palm_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 | ||||||
| 	plantslib:register_generate_plant(moretrees.rubber_tree_biome, moretrees.spawn_rubber_tree_object) | 	biome_lib:register_generate_plant(moretrees.rubber_tree_biome, moretrees.spawn_rubber_tree_object) | ||||||
| end | end | ||||||
|  |  | ||||||
| if moretrees.enable_willow then | if moretrees.enable_willow then | ||||||
| 	plantslib:register_generate_plant(moretrees.willow_biome, moretrees.spawn_willow_object) | 	biome_lib: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 | ||||||
| 	plantslib:register_generate_plant(moretrees.birch_biome, moretrees.spawn_birch_object) | 	biome_lib:register_generate_plant(moretrees.birch_biome, moretrees.spawn_birch_object) | ||||||
| end | end | ||||||
|  |  | ||||||
| if moretrees.enable_spruce then | if moretrees.enable_spruce then | ||||||
| 	plantslib:register_generate_plant(moretrees.spruce_biome, moretrees.spawn_spruce_object) | 	biome_lib:register_generate_plant(moretrees.spruce_biome, moretrees.spawn_spruce_object) | ||||||
| end | end | ||||||
|  |  | ||||||
| if moretrees.enable_jungle_tree then | if moretrees.enable_jungle_tree then | ||||||
| 	plantslib:register_generate_plant(moretrees.jungletree_biome, moretrees.spawn_jungletree_object) | 	biome_lib:register_generate_plant(moretrees.jungletree_biome, moretrees.spawn_jungletree_object) | ||||||
| end | end | ||||||
|  |  | ||||||
| if moretrees.enable_fir then | if moretrees.enable_fir then | ||||||
| 	plantslib:register_generate_plant(moretrees.fir_biome, moretrees.spawn_fir_object) | 	biome_lib:register_generate_plant(moretrees.fir_biome, moretrees.spawn_fir_object) | ||||||
| 	if minetest.get_modpath("snow") then | 	if minetest.get_modpath("snow") then | ||||||
| 		plantslib:register_generate_plant(moretrees.fir_biome_snow, moretrees.spawn_fir_snow_object) | 		biome_lib: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.remove_node(pos) | 	minetest.swap_node(pos, biome_lib.air) | ||||||
| 	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 | ||||||
| @@ -184,8 +209,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.remove_node(pos) | 	minetest.swap_node(pos, biome_lib.air) | ||||||
| 	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 | ||||||
| @@ -209,7 +234,7 @@ 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 | ||||||
| @@ -239,19 +264,17 @@ 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 | ||||||
|  |  | ||||||
| 	moretrees.jungletree_model.enable_unique_ids = true | 	minetest.swap_node(pos, biome_lib.air) | ||||||
|  |  | ||||||
| 	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.remove_node(leaves[leaf]) | 			minetest.swap_node(leaves[leaf], biome_lib.air) | ||||||
| 	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 | ||||||
| @@ -265,21 +288,20 @@ 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.remove_node(pos) | 	minetest.swap_node(pos, biome_lib.air) | ||||||
| 	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.remove_node(leaves[leaf]) | 		minetest.swap_node(leaves[leaf], biome_lib.air) | ||||||
| 	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 | ||||||
| @@ -293,20 +315,15 @@ 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.remove_node(pos) | 	minetest.swap_node(pos, biome_lib.air) | ||||||
| 	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.remove_node(leaves[leaf]) | 			minetest.swap_node(leaves[leaf], biome_lib.air) | ||||||
| 	end | 	end | ||||||
| 	minetest.spawn_tree(pos,moretrees.fir_model) | 	minetest.spawn_tree(pos,moretrees.fir_model) | ||||||
| end | end | ||||||
|  |  | ||||||
| minetest.register_on_punchnode(function(pos, node, puncher, pointed_thing) | print("[Moretrees] Loaded (2013-02-11)") | ||||||
| 	print(dump(node.name)..": param1 = "..dump(node.param1)..", param2 = "..dump(node.param2)) |  | ||||||
| end) |  | ||||||
|  |  | ||||||
| print(S("[Moretrees] Loaded (2013-02-11)")) |  | ||||||
|   | |||||||
							
								
								
									
										117
									
								
								leafdecay.lua
									
									
									
									
									
								
							
							
						
						| @@ -1,117 +0,0 @@ | |||||||
| -- 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 |  | ||||||
|  |  | ||||||
| @@ -1,74 +0,0 @@ | |||||||
| # Translation by Xanthin |  | ||||||
|  |  | ||||||
| ### crafts.lua ### |  | ||||||
| Coconut Milk = Kokosnussmilch |  | ||||||
| Raw Coconut = Kokosnussfleisch |  | ||||||
| Acorn Muffin batter = Eichelmuffinteig |  | ||||||
| Acorn Muffin = Eichelmuffin |  | ||||||
| Roasted Spruce Cone Nuts = Geroestete Fichtenzapfen |  | ||||||
| Roasted Pine Cone Nuts = Geroestete Kiefernzapfen |  | ||||||
| Roasted Fir Cone Nuts = Geroestete Tannenzapfen |  | ||||||
|  |  | ||||||
| ### node_defs.lua ### |  | ||||||
| Beech Tree Trunk = Buchenstamm |  | ||||||
| Apple Tree Trunk = Apfelbaumstamm |  | ||||||
| Oak Tree Trunk = Eichenstamm |  | ||||||
| Giant Sequoia Trunk = Riesenmammutbaumstamm |  | ||||||
| Birch Tree Trunk = Birkenstamm |  | ||||||
| Palm Tree Trunk = Palmenstamm |  | ||||||
| Spruce Tree Trunk = Fichtenstamm |  | ||||||
| Pine Tree Trunk = Kiefernstamm |  | ||||||
| Willow Tree Trunk = Weidenstamm |  | ||||||
| Rubber Tree Trunk = Gummibaumstamm |  | ||||||
| Jungle Tree Trunk = Tropenbaumstamm |  | ||||||
| Douglas Fir Trunk = Douglasienstamm |  | ||||||
| Beech Tree Planks = Buchebretter |  | ||||||
| Apple Tree Planks = Apfelbaumbretter |  | ||||||
| Oak Tree Planks = Eichenbretter |  | ||||||
| Giant Sequoia Planks = Riesenmammutbaumbretter |  | ||||||
| Birch Tree Planks = Birkebretter |  | ||||||
| Palm Tree Planks = Palmenbretter |  | ||||||
| Spruce Tree Planks = Fichtenbretter |  | ||||||
| Pine Tree Planks = Kiefernbretter |  | ||||||
| Willow Tree Planks = Weidenbretter |  | ||||||
| Rubber Tree Planks = Gummibaumbretter |  | ||||||
| Jungle Tree Planks = Tropenholzbretter |  | ||||||
| Douglas Fir Planks = Douglasienbretter |  | ||||||
| Beech Tree Sapling = Buchesetzling |  | ||||||
| Apple Tree Sapling = Apfelbaumsetzling |  | ||||||
| Oak Tree Sapling = Eichensetzling |  | ||||||
| Giant Sequoia Sapling = Riesenmammutbaumsetzling |  | ||||||
| Birch Tree Sapling = Birkensetzling |  | ||||||
| Palm Tree Sapling = Palmensetzling |  | ||||||
| Spruce Tree Sapling = Fichtensetzling |  | ||||||
| Pine Tree Sapling = Kiefernsetzling |  | ||||||
| Willow Tree Sapling = Weidensetzling |  | ||||||
| Rubber Tree Sapling = Gummibaumsetzling |  | ||||||
| Jungle Tree Sapling = Tropenbaumsetzling |  | ||||||
| Douglas Fir Sapling = Douglasiensetzling |  | ||||||
| Beech Tree Leaves = Buchenlaub |  | ||||||
| Apple Tree Leaves = Apfelbaumlaub |  | ||||||
| Oak Tree Leaves = Eichenlaub |  | ||||||
| Giant Sequoia Leaves = Riesenmammutbaumlaub |  | ||||||
| Birch Tree Leaves = Birkenlaub |  | ||||||
| Palm Tree Leaves = Palmenlaub |  | ||||||
| Spruce Tree Leaves = Fichtennadeln |  | ||||||
| Pine Tree Leaves = Kiefernnadeln |  | ||||||
| Willow Tree Leaves = Weidenlaub |  | ||||||
| Rubber Tree Leaves = Gummibaumlaub |  | ||||||
| Jungle Tree Leaves = Tropenbaumlaub |  | ||||||
| Douglas Fir Leaves = Douglasiennadeln |  | ||||||
|  |  | ||||||
| Acorn = Eichel |  | ||||||
| Coconut = Kokosnuss |  | ||||||
| Spruce Cone = Fichtenzapfen |  | ||||||
| Pine Cone = Kiefernzapfen |  | ||||||
| Fir Cone = Tannenzapfen |  | ||||||
| Jungle Sapling = Tropenbaumsetzling |  | ||||||
| Jungle Tree Leaves (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) |  | ||||||
							
								
								
									
										211
									
								
								locale/moretrees.de.tr
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,211 @@ | |||||||
|  | # 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 | ||||||
							
								
								
									
										211
									
								
								locale/moretrees.es.tr
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,211 @@ | |||||||
|  | # textdomain: moretrees | ||||||
|  | # Translation by Carlos Barraza | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ### cocos_palm.lua ### | ||||||
|  |  | ||||||
|  | Coconut=Coco | ||||||
|  | Coconut Flower= | ||||||
|  |  | ||||||
|  | ### crafts.lua ### | ||||||
|  |  | ||||||
|  | Acorn Muffin=Mollete de Bellota | ||||||
|  | Acorn Muffin batter= Masa de Mollete de Bellota | ||||||
|  | Coconut Milk=Leche de Coco | ||||||
|  | Date=Datilera | ||||||
|  | Date & nut snack=Datilera y Nueces | ||||||
|  | Date-nut cake=Pastel de Datilera | ||||||
|  | Date-nut cake batter=Pasta de torta de Datilera | ||||||
|  | Date-nut energy bar=Barra energetica de Datilera | ||||||
|  | Raw Coconut=Coco crudo | ||||||
|  | Roasted Cedar Cone Nuts=Coco de Alamo Tostado | ||||||
|  | Roasted Fir Cone Nuts=Cono de Abeto Tostado | ||||||
|  | Roasted Spruce Cone Nuts=Cono de Picea Tostado | ||||||
|  |  | ||||||
|  | ### date_palm.lua ### | ||||||
|  |  | ||||||
|  | Date Flowers=Flores de Datilera | ||||||
|  | Date Stem=Tallo de Datilera | ||||||
|  | Dates=Datilera | ||||||
|  |  | ||||||
|  | ### node_defs.lua ### | ||||||
|  |  | ||||||
|  | @1 (fast growth)= | ||||||
|  | Acorn=Bellota | ||||||
|  | Apple Tree= | ||||||
|  | Apple Tree Fence= | ||||||
|  | Apple Tree Fence Gate= | ||||||
|  | Apple Tree Fence Rail= | ||||||
|  | Apple Tree Leaves=Hojas de Arbol de Manzana | ||||||
|  | Apple Tree Planks=Madera de Arbol de Manzana | ||||||
|  | Apple Tree Planks Slab= | ||||||
|  | Apple Tree Planks Stair= | ||||||
|  | Apple Tree Sapling=Retoño de Arbol de Manzana | ||||||
|  | Apple Tree Trunk=Tronco de Arbol de Manzana | ||||||
|  | Apple Tree Trunk Slab= | ||||||
|  | Apple Tree Trunk Stair= | ||||||
|  | Beech Tree= | ||||||
|  | Beech Tree Fence= | ||||||
|  | Beech Tree Fence Gate= | ||||||
|  | Beech Tree Fence Rail= | ||||||
|  | Beech Tree Leaves=Hojas de Arbol de Haya | ||||||
|  | Beech Tree Planks=Madera de Arbol de Haya | ||||||
|  | Beech Tree Planks Slab= | ||||||
|  | Beech Tree Planks Stair= | ||||||
|  | Beech Tree Sapling=Retoño de Arbol de Haya | ||||||
|  | Beech Tree Trunk=Tronco de Arbol de Haya | ||||||
|  | Beech Tree Trunk Slab= | ||||||
|  | Beech Tree Trunk Stair= | ||||||
|  | Birch Tree= | ||||||
|  | Birch Tree Fence= | ||||||
|  | Birch Tree Fence Gate= | ||||||
|  | Birch Tree Fence Rail= | ||||||
|  | Birch Tree Leaves=Hojas de Arbol de Abedul | ||||||
|  | Birch Tree Planks=Madera de Arbol de Abedul | ||||||
|  | Birch Tree Planks Slab= | ||||||
|  | Birch Tree Planks Stair= | ||||||
|  | Birch Tree Sapling=Retoño de Arbol de Abedul | ||||||
|  | Birch Tree Trunk=Tronco de Arbol de Abedul | ||||||
|  | Birch Tree Trunk Slab= | ||||||
|  | Birch Tree Trunk Stair= | ||||||
|  | Cedar Cone=Coco de Alamo | ||||||
|  | Cedar Tree= | ||||||
|  | Cedar Tree Fence= | ||||||
|  | Cedar Tree Fence Gate= | ||||||
|  | Cedar Tree Fence Rail= | ||||||
|  | Cedar Tree Leaves=Hojas de Arbol de Cedro | ||||||
|  | Cedar Tree Planks=Madera de Arbol de Cedro | ||||||
|  | Cedar Tree Planks Slab= | ||||||
|  | Cedar Tree Planks Stair= | ||||||
|  | Cedar Tree Sapling=Retoño de Arbol de Cedro | ||||||
|  | Cedar Tree Trunk=Tronco de Arbol de Cedro | ||||||
|  | Cedar Tree Trunk Slab= | ||||||
|  | Cedar Tree Trunk Stair= | ||||||
|  | Date Palm Tree= | ||||||
|  | Date Palm Tree Fence= | ||||||
|  | Date Palm Tree Fence Gate= | ||||||
|  | Date Palm Tree Fence Rail= | ||||||
|  | Date Palm Tree Leaves= | ||||||
|  | Date Palm Tree Planks=Madera de Palmera Datilera | ||||||
|  | Date Palm Tree Planks Slab= | ||||||
|  | Date Palm Tree Planks Stair= | ||||||
|  | Date Palm Tree Sapling= | ||||||
|  | Date Palm Tree Trunk=Tronco de Palmera Datilera | ||||||
|  | Date Palm Tree Trunk Slab= | ||||||
|  | Date Palm Tree Trunk Stair= | ||||||
|  | Douglas Fir= | ||||||
|  | Douglas Fir Fence= | ||||||
|  | Douglas Fir Fence Gate= | ||||||
|  | Douglas Fir Fence Rail= | ||||||
|  | Douglas Fir Leaves=Hojas de Arbol de Abeto de Douglas | ||||||
|  | Douglas Fir Leaves (Bright)=Hojas de Arbol de Abeto de Douglas (Brillante) | ||||||
|  | Douglas Fir Planks=Madera de Arbol de Abeto de Douglas | ||||||
|  | Douglas Fir Planks Slab= | ||||||
|  | Douglas Fir Planks Stair= | ||||||
|  | Douglas Fir Sapling=Retoño de Arbol de Abeto de Douglas | ||||||
|  | Douglas Fir Trunk=Tronco de Arbol de Abeto de Douglas | ||||||
|  | Douglas Fir Trunk Slab= | ||||||
|  | Douglas Fir Trunk Stair= | ||||||
|  | Fir Cone=Coco de Abeto | ||||||
|  | Giant Sequoia= | ||||||
|  | Giant Sequoia Fence= | ||||||
|  | Giant Sequoia Fence Gate= | ||||||
|  | Giant Sequoia Fence Rail= | ||||||
|  | Giant Sequoia Leaves=Hojas de Sequoia Gigante | ||||||
|  | Giant Sequoia Planks=Madera de Sequoia Gigante | ||||||
|  | Giant Sequoia Planks Slab= | ||||||
|  | Giant Sequoia Planks Stair= | ||||||
|  | Giant Sequoia Sapling=Retoño de Arbol de Sequoia Gigante | ||||||
|  | Giant Sequoia Trunk=Tronco de Sequoia Gigante | ||||||
|  | Giant Sequoia Trunk Slab= | ||||||
|  | Giant Sequoia Trunk Stair= | ||||||
|  | Jungle Tree=Tronco de Arbol de Arbol de la Selva | ||||||
|  | Jungle Tree Fence= | ||||||
|  | Jungle Tree Fence Gate= | ||||||
|  | Jungle Tree Fence Rail= | ||||||
|  | Jungle Tree Leaves=Hojas de Arbol de la Selva | ||||||
|  | Jungle Tree Leaves (@1)=Hojas de Arbol de la Selva (@1) | ||||||
|  | Jungle Tree Planks= | ||||||
|  | Jungle Tree Planks Slab= | ||||||
|  | Jungle Tree Planks Stair= | ||||||
|  | Jungle Tree Sapling= | ||||||
|  | Jungle Tree Trunk= | ||||||
|  | Jungle Tree Trunk Slab= | ||||||
|  | Jungle Tree Trunk Stair= | ||||||
|  | Oak Tree= | ||||||
|  | Oak Tree Fence= | ||||||
|  | Oak Tree Fence Gate= | ||||||
|  | Oak Tree Fence Rail= | ||||||
|  | Oak Tree Leaves=Hojas de Arbol de Roble | ||||||
|  | Oak Tree Planks=Madera de Arbol de Roble | ||||||
|  | Oak Tree Planks Slab= | ||||||
|  | Oak Tree Planks Stair= | ||||||
|  | Oak Tree Sapling=Retoño de Arbol de Roble | ||||||
|  | Oak Tree Trunk=Tronco de Arbol de Roble | ||||||
|  | Oak Tree Trunk Slab= | ||||||
|  | Oak Tree Trunk Stair= | ||||||
|  | Palm Tree= | ||||||
|  | Palm Tree Fence= | ||||||
|  | Palm Tree Fence Gate= | ||||||
|  | Palm Tree Fence Rail= | ||||||
|  | Palm Tree Leaves=Hojas de Palmera | ||||||
|  | Palm Tree Planks=Madera de Palmera | ||||||
|  | Palm Tree Planks Slab= | ||||||
|  | Palm Tree Planks Stair= | ||||||
|  | Palm Tree Sapling=Retoño de Palmera | ||||||
|  | Palm Tree Trunk=Tronco de Palmera | ||||||
|  | Palm Tree Trunk Slab= | ||||||
|  | Palm Tree Trunk Stair= | ||||||
|  | Poplar Tree= | ||||||
|  | Poplar Tree Fence= | ||||||
|  | Poplar Tree Fence Gate= | ||||||
|  | Poplar Tree Fence Rail= | ||||||
|  | Poplar Tree Leaves=Hojas de Arbol de Alamo | ||||||
|  | Poplar Tree Planks=Madera de Arbol de Alamo | ||||||
|  | Poplar Tree Planks Slab= | ||||||
|  | Poplar Tree Planks Stair= | ||||||
|  | Poplar Tree Sapling=Retoño de Arbol de Alamo | ||||||
|  | Poplar Tree Trunk=Tronco de Arbol de Alamo | ||||||
|  | Poplar Tree Trunk Slab= | ||||||
|  | Poplar Tree Trunk Stair= | ||||||
|  | Red=Roja | ||||||
|  | Rubber Tree= | ||||||
|  | Rubber Tree Fence= | ||||||
|  | Rubber Tree Fence Gate= | ||||||
|  | Rubber Tree Fence Rail= | ||||||
|  | Rubber Tree Leaves=Hojas de Arbol de Arbol de Goma | ||||||
|  | Rubber Tree Planks=Madera de Arbol de Arbol de Goma | ||||||
|  | Rubber Tree Planks Slab= | ||||||
|  | Rubber Tree Planks Stair= | ||||||
|  | Rubber Tree Sapling=Retoño de Arbol de Arbol de Goma | ||||||
|  | Rubber Tree Trunk=Tronco de Arbol de Arbol de Goma | ||||||
|  | Rubber Tree Trunk (Empty)=Tronco de Arbol de Goma (Vacio) | ||||||
|  | Rubber Tree Trunk Slab= | ||||||
|  | Rubber Tree Trunk Stair= | ||||||
|  | Small poplar Tree Sapling= | ||||||
|  | Spruce Cone=Coco de Picea | ||||||
|  | Spruce Tree= | ||||||
|  | Spruce Tree Fence= | ||||||
|  | Spruce Tree Fence Gate= | ||||||
|  | Spruce Tree Fence Rail= | ||||||
|  | Spruce Tree Leaves=Hojas de Arbol de Abeto | ||||||
|  | Spruce Tree Planks=Madera de Arbol de Abeto | ||||||
|  | Spruce Tree Planks Slab= | ||||||
|  | Spruce Tree Planks Stair= | ||||||
|  | Spruce Tree Sapling=Retoño de Arbol de Abeto | ||||||
|  | Spruce Tree Trunk=Tronco de Arbol de Abeto | ||||||
|  | Spruce Tree Trunk Slab= | ||||||
|  | Spruce Tree Trunk Stair= | ||||||
|  | Willow Tree= | ||||||
|  | Willow Tree Fence= | ||||||
|  | Willow Tree Fence Gate= | ||||||
|  | Willow Tree Fence Rail= | ||||||
|  | Willow Tree Leaves=Hojas de Arbol de Sauce | ||||||
|  | Willow Tree Planks=Madera de Arbol de Sauce | ||||||
|  | Willow Tree Planks Slab= | ||||||
|  | Willow Tree Planks Stair= | ||||||
|  | Willow Tree Sapling=Retoño de Arbol de Sauce | ||||||
|  | Willow Tree Trunk=Tronco de Arbol de Sauce | ||||||
|  | Willow Tree Trunk Slab= | ||||||
|  | Willow Tree Trunk Stair= | ||||||
|  | Yellow=Amarilla | ||||||
							
								
								
									
										211
									
								
								locale/moretrees.fr.tr
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,211 @@ | |||||||
|  | # textdomain: moretrees | ||||||
|  | # Translation by Yoan31 and Louis Royer | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ### cocos_palm.lua ### | ||||||
|  |  | ||||||
|  | Coconut=Noix de coco | ||||||
|  | Coconut Flower=Fleur de coco | ||||||
|  |  | ||||||
|  | ### crafts.lua ### | ||||||
|  |  | ||||||
|  | Acorn Muffin=Muffins au gland | ||||||
|  | Acorn Muffin batter=Pate à muffins au Gland | ||||||
|  | Coconut Milk=Lait de coco | ||||||
|  | Date=Datte | ||||||
|  | Date & nut snack=Collation aux dattes et aux noix | ||||||
|  | Date-nut cake=Gâteau datte-noix | ||||||
|  | Date-nut cake batter=Pâte à gâteau datte-noix | ||||||
|  | Date-nut energy bar=Barre énergétique datte-noix | ||||||
|  | Raw Coconut=Noix de coco crue | ||||||
|  | Roasted Cedar Cone Nuts=Noix de pomme de pin roties | ||||||
|  | Roasted Fir Cone Nuts=Noix de cône de sapin roties | ||||||
|  | Roasted Spruce Cone Nuts=Noix de cône de sapin roties | ||||||
|  |  | ||||||
|  | ### date_palm.lua ### | ||||||
|  |  | ||||||
|  | Date Flowers=Fleurs de datte | ||||||
|  | Date Stem=Tige de datte | ||||||
|  | Dates=Dattes | ||||||
|  |  | ||||||
|  | ### node_defs.lua ### | ||||||
|  |  | ||||||
|  | @1 (fast growth)=@1 (croissance rapide) | ||||||
|  | Acorn=Gland | ||||||
|  | Apple Tree=Pommier | ||||||
|  | Apple Tree Fence=Barrière en bois de pommier | ||||||
|  | Apple Tree Fence Gate=Porte de clôture en bois de pommier | ||||||
|  | Apple Tree Fence Rail=Clôture en bois de pommier | ||||||
|  | Apple Tree Leaves=Feuilles de pommier | ||||||
|  | Apple Tree Planks=Planches de pommier | ||||||
|  | Apple Tree Planks Slab=Dalle en bois de pommier | ||||||
|  | Apple Tree Planks Stair=Escaliers en bois de pommier | ||||||
|  | Apple Tree Sapling=Pousse d'arbre de pommier | ||||||
|  | Apple Tree Trunk=Tronc d'arbre de pommier | ||||||
|  | Apple Tree Trunk Slab=Dalle en tronc de pommier | ||||||
|  | Apple Tree Trunk Stair=Escalier en tronc de pommier | ||||||
|  | Beech Tree=Hêtre | ||||||
|  | Beech Tree Fence=Barrière en bois de hêtre | ||||||
|  | Beech Tree Fence Gate=Porte de clôture en bois de hêtre | ||||||
|  | Beech Tree Fence Rail=Clôture en bois de hêtre | ||||||
|  | Beech Tree Leaves=Feuilles de hêtre | ||||||
|  | Beech Tree Planks=Planches de hêtre | ||||||
|  | Beech Tree Planks Slab=Dalle en bois de hêtre | ||||||
|  | Beech Tree Planks Stair=Escalier en bois de hêtre | ||||||
|  | Beech Tree Sapling=Pousse d'arbre de hêtre | ||||||
|  | Beech Tree Trunk=Tronc d'arbre de hêtre | ||||||
|  | Beech Tree Trunk Slab=Dalle en tronc de hêtre | ||||||
|  | Beech Tree Trunk Stair=Escalier en tronc de hêtre | ||||||
|  | Birch Tree=Bouleau | ||||||
|  | Birch Tree Fence=Barrière en bois de bouleau | ||||||
|  | Birch Tree Fence Gate=Porte de clôture en bois de bouleau | ||||||
|  | Birch Tree Fence Rail=Clôture en bois de bouleau | ||||||
|  | Birch Tree Leaves=Feuilles de bouleau | ||||||
|  | Birch Tree Planks=Planches d'arbre de bouleau | ||||||
|  | Birch Tree Planks Slab=Dalle en bois de bouleau | ||||||
|  | Birch Tree Planks Stair=Escalier en bois de bouleau | ||||||
|  | Birch Tree Sapling=Pousse d'arbre de bouleau | ||||||
|  | Birch Tree Trunk=Tronc d'arbre de bouleau | ||||||
|  | Birch Tree Trunk Slab=Dalle en tronc de bouleau | ||||||
|  | Birch Tree Trunk Stair=Escalier en tronc de bouleau | ||||||
|  | Cedar Cone=Pomme de pin | ||||||
|  | Cedar Tree=Pin | ||||||
|  | Cedar Tree Fence=Barrière en bois de pin | ||||||
|  | Cedar Tree Fence Gate=Porte de clôture en bois de pin | ||||||
|  | Cedar Tree Fence Rail=Clôture en bois de pin | ||||||
|  | Cedar Tree Leaves=Feuilles de pin | ||||||
|  | Cedar Tree Planks=Planches d'arbre de pin | ||||||
|  | Cedar Tree Planks Slab=Dalle en bois de pin | ||||||
|  | Cedar Tree Planks Stair=Escalier en bois de pin | ||||||
|  | Cedar Tree Sapling=Pousse d'arbre de pin | ||||||
|  | Cedar Tree Trunk=Tronc d'arbre de pin | ||||||
|  | Cedar Tree Trunk Slab=Dalle en tronc de pin | ||||||
|  | Cedar Tree Trunk Stair=Escalier en tronc de pin | ||||||
|  | Date Palm Tree=Dattier | ||||||
|  | Date Palm Tree Fence=Barrière en bois de dattier | ||||||
|  | Date Palm Tree Fence Gate=Porte de clôture en bois de dattier | ||||||
|  | Date Palm Tree Fence Rail=Clôture en bois de dattier | ||||||
|  | Date Palm Tree Leaves=Feuille de dattier | ||||||
|  | Date Palm Tree Planks=Planches de dattier | ||||||
|  | Date Palm Tree Planks Slab=Dalle en bois de dattier | ||||||
|  | Date Palm Tree Planks Stair=Escalier en bois de dattier | ||||||
|  | Date Palm Tree Sapling=Pousse de dattier | ||||||
|  | Date Palm Tree Trunk=Tronc de dattier | ||||||
|  | Date Palm Tree Trunk Slab=Dalle en tronc de dattier | ||||||
|  | Date Palm Tree Trunk Stair=Escalier en tronc de dattier | ||||||
|  | Douglas Fir=Sapin de Douglas | ||||||
|  | Douglas Fir Fence=Barrière en bois de sapin de Douglas | ||||||
|  | Douglas Fir Fence Gate=Porte de clôture en bois de sapin de Douglas | ||||||
|  | Douglas Fir Fence Rail=Clôture en bois de sapin de Douglas | ||||||
|  | Douglas Fir Leaves=Feuilles de sapin de Douglas | ||||||
|  | Douglas Fir Leaves (Bright)=Feuille de sapin de Douglas (brillant) | ||||||
|  | Douglas Fir Planks=Planches de sapin de Douglas | ||||||
|  | Douglas Fir Planks Slab=Dalle en bois de sapin de Douglas | ||||||
|  | Douglas Fir Planks Stair=Escalier en bois de sapin de Douglas | ||||||
|  | Douglas Fir Sapling=Pousse de sapin de Douglas | ||||||
|  | Douglas Fir Trunk=Tronc de sapin de Douglas | ||||||
|  | Douglas Fir Trunk Slab=Dalle en tronc de sapin de Douglas | ||||||
|  | Douglas Fir Trunk Stair=Escalier en tronc de sapin de Douglas | ||||||
|  | Fir Cone=Pomme de sapin | ||||||
|  | Giant Sequoia=Séquoia géant | ||||||
|  | Giant Sequoia Fence=Barrière en bois de séquoia géant | ||||||
|  | Giant Sequoia Fence Gate=Porte de clôture en bois de séquoia géant | ||||||
|  | Giant Sequoia Fence Rail=Clôture en bois de séquoia géant | ||||||
|  | Giant Sequoia Leaves=Feuilles de séquoia géant | ||||||
|  | Giant Sequoia Planks=Planches de séquoia géant | ||||||
|  | Giant Sequoia Planks Slab=Dalle en bois de séquoia géant | ||||||
|  | Giant Sequoia Planks Stair=Escalier en bois de séquoia géant | ||||||
|  | Giant Sequoia Sapling=Pousse de séquoia géant | ||||||
|  | Giant Sequoia Trunk=Tronc de séquoia géant | ||||||
|  | Giant Sequoia Trunk Slab=Dalle en tronc de séquoia géant | ||||||
|  | Giant Sequoia Trunk Stair=Escalier en tronc de séquoia géant | ||||||
|  | Jungle Tree=Arbre de la jungle | ||||||
|  | Jungle Tree Fence=Barrière en bois d'arbre de la jungle | ||||||
|  | Jungle Tree Fence Gate=Porte de clôture en bois d'arbre de la jungle | ||||||
|  | Jungle Tree Fence Rail=Clôture en bois d'arbre de la jungle | ||||||
|  | Jungle Tree Leaves=Feuilles d'arbre de la jungle | ||||||
|  | Jungle Tree Leaves (@1)=Feuilles d'arbre de la jungle (@1) | ||||||
|  | Jungle Tree Planks=Planches d'arbre de la jungle | ||||||
|  | Jungle Tree Planks Slab=Dalle en bois d'arbre de la jungle | ||||||
|  | Jungle Tree Planks Stair=Escalier en bois d'arbre de la jungle | ||||||
|  | Jungle Tree Sapling=Pousse d'arbre de la jungle | ||||||
|  | Jungle Tree Trunk=Tronc d'arbre de la jungle | ||||||
|  | Jungle Tree Trunk Slab=Dalle en tronc d'arbre de la jungle | ||||||
|  | Jungle Tree Trunk Stair=Escalier en tronc d'arbre de la jungle | ||||||
|  | Oak Tree=Chêne | ||||||
|  | Oak Tree Fence=Barrière en bois de chêne | ||||||
|  | Oak Tree Fence Gate=Porte de clôture en bois de chêne | ||||||
|  | Oak Tree Fence Rail=Clôture en bois de chêne | ||||||
|  | Oak Tree Leaves=Feuilles de chêne | ||||||
|  | Oak Tree Planks=Planches de chêne | ||||||
|  | Oak Tree Planks Slab=Dalle en bois de chêne | ||||||
|  | Oak Tree Planks Stair=Escalier en bois de chêne | ||||||
|  | Oak Tree Sapling=Pousse d'arbre de chêne | ||||||
|  | Oak Tree Trunk=Tronc d'arbre de chêne | ||||||
|  | Oak Tree Trunk Slab=Dalle en tronc de chêne | ||||||
|  | Oak Tree Trunk Stair=Escalier en tronc de chêne | ||||||
|  | Palm Tree=Palmier | ||||||
|  | Palm Tree Fence=Barrière en bois de palmier | ||||||
|  | Palm Tree Fence Gate=Porte de clôture en bois de palmier | ||||||
|  | Palm Tree Fence Rail=Clôture en bois de palmier | ||||||
|  | Palm Tree Leaves=Feuilles de palmier | ||||||
|  | Palm Tree Planks=Planches de palmier | ||||||
|  | Palm Tree Planks Slab=Dalle en bois de palmier | ||||||
|  | Palm Tree Planks Stair=Escalier en bois de palmier | ||||||
|  | Palm Tree Sapling=Pousse d'arbre de palmier | ||||||
|  | Palm Tree Trunk=Tronc d'arbre de palmier | ||||||
|  | Palm Tree Trunk Slab=Dalle en tronc de palmier | ||||||
|  | Palm Tree Trunk Stair=Escalier en tronc de palmier | ||||||
|  | Poplar Tree=Peuplier | ||||||
|  | Poplar Tree Fence=Barrière en bois de peuplier | ||||||
|  | Poplar Tree Fence Gate=Porte de clôture en bois de peuplier | ||||||
|  | Poplar Tree Fence Rail=Clôture en bois de peuplier | ||||||
|  | Poplar Tree Leaves=Feuilles de peuplier | ||||||
|  | Poplar Tree Planks=Plances de peuplier | ||||||
|  | Poplar Tree Planks Slab=Dalle en bois de peuplier | ||||||
|  | Poplar Tree Planks Stair=Escalier en bois de peuplier | ||||||
|  | Poplar Tree Sapling=Pousse de peuplier | ||||||
|  | Poplar Tree Trunk=Tronc de peuplier | ||||||
|  | Poplar Tree Trunk Slab=Dalle en tronc de peuplier | ||||||
|  | Poplar Tree Trunk Stair=Escalier en tronc de peuplier | ||||||
|  | Red=rouge | ||||||
|  | Rubber Tree=Arbre à caoutchouc | ||||||
|  | Rubber Tree Fence=Barrière en bois d'arbre à caoutchouc | ||||||
|  | Rubber Tree Fence Gate=Porte de clôture en bois d'arbre à caoutchouc | ||||||
|  | Rubber Tree Fence Rail=Clôture en bois d'arbre à caoutchouc | ||||||
|  | Rubber Tree Leaves=Feuilles d'arbre à caoutchouc | ||||||
|  | Rubber Tree Planks=Planches d'arbre à caoutchouc | ||||||
|  | Rubber Tree Planks Slab=Dalle en bois d'arbre à caoutchouc | ||||||
|  | Rubber Tree Planks Stair=Escalier en bois d'arbre à caoutchouc | ||||||
|  | Rubber Tree Sapling=Pousse d'arbre à caoutchouc | ||||||
|  | Rubber Tree Trunk=Tronc d'arbre a caoutchouc | ||||||
|  | Rubber Tree Trunk (Empty)=Tronc d'arbre à caoutchouc (vide) | ||||||
|  | Rubber Tree Trunk Slab=Dalle en tronc d'arbre à caoutchouc | ||||||
|  | Rubber Tree Trunk Stair=Escalier en tronc d'arbre à caoutchouc | ||||||
|  | Small poplar Tree Sapling=Pousse de petit peuplier | ||||||
|  | Spruce Cone=Cône de sapin | ||||||
|  | Spruce Tree=Épicéa | ||||||
|  | Spruce Tree Fence=Barrière en bois d'épicéa | ||||||
|  | Spruce Tree Fence Gate=Porte de clôture en bois d'épicéa | ||||||
|  | Spruce Tree Fence Rail=Clôture en bois d'épicéa | ||||||
|  | Spruce Tree Leaves=Feuilles d'épicéa | ||||||
|  | Spruce Tree Planks=Planches d'arbre d'épicéa | ||||||
|  | Spruce Tree Planks Slab=Dalle en bois d'épicéa | ||||||
|  | Spruce Tree Planks Stair=Escalier en bois d'épicéa | ||||||
|  | Spruce Tree Sapling=Pousse d'arbre d'épicéa | ||||||
|  | Spruce Tree Trunk=Tronc d'arbre d'épicéa | ||||||
|  | Spruce Tree Trunk Slab=Dalle en tronc d'épicéa | ||||||
|  | Spruce Tree Trunk Stair=Escalier en tronc d'épicéa | ||||||
|  | Willow Tree=Saule | ||||||
|  | Willow Tree Fence=Barrière en bois de saule | ||||||
|  | Willow Tree Fence Gate=Porte de clôture en bois de saule | ||||||
|  | Willow Tree Fence Rail=Clôture en bois de saule | ||||||
|  | Willow Tree Leaves=Feuilles de saule | ||||||
|  | Willow Tree Planks=Planches de saule | ||||||
|  | Willow Tree Planks Slab=Dalle en bois de saule | ||||||
|  | Willow Tree Planks Stair=Escalier en bois de saule | ||||||
|  | Willow Tree Sapling=Pousse de saule | ||||||
|  | Willow Tree Trunk=Tronc d'arbre de saule | ||||||
|  | Willow Tree Trunk Slab=Dalle en tronc de saule | ||||||
|  | Willow Tree Trunk Stair=Escalier en tronc de saule | ||||||
|  | Yellow=jaune | ||||||
| @@ -1,74 +1,210 @@ | |||||||
| # Template | # textdomain: moretrees | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ### cocos_palm.lua ### | ||||||
|  |  | ||||||
|  | Coconut= | ||||||
|  | Coconut Flower= | ||||||
|  |  | ||||||
| ### crafts.lua ### | ### crafts.lua ### | ||||||
| Coconut Milk =  |  | ||||||
| Raw Coconut =  | Acorn Muffin= | ||||||
| Acorn Muffin batter =  | Acorn Muffin batter= | ||||||
| Acorn Muffin =  | Coconut Milk= | ||||||
| Roasted Spruce Cone Nuts =  | Date= | ||||||
| Roasted Pine Cone Nuts =  | Date & nut snack= | ||||||
| Roasted Fir Cone Nuts =  | Date-nut cake= | ||||||
|  | Date-nut cake batter= | ||||||
|  | Date-nut energy bar= | ||||||
|  | Raw Coconut= | ||||||
|  | Roasted Cedar Cone Nuts= | ||||||
|  | Roasted Fir Cone Nuts= | ||||||
|  | Roasted Spruce Cone Nuts= | ||||||
|  |  | ||||||
|  | ### date_palm.lua ### | ||||||
|  |  | ||||||
|  | Date Flowers= | ||||||
|  | Date Stem= | ||||||
|  | Dates= | ||||||
|  |  | ||||||
| ### node_defs.lua ### | ### node_defs.lua ### | ||||||
| Beech Tree Trunk =  |  | ||||||
| Apple Tree Trunk =  |  | ||||||
| Oak Tree Trunk =  |  | ||||||
| Giant Sequoia Trunk =  |  | ||||||
| Birch Tree Trunk =  |  | ||||||
| Palm Tree Trunk =  |  | ||||||
| Spruce Tree Trunk =  |  | ||||||
| Pine Tree Trunk =  |  | ||||||
| Willow Tree Trunk =  |  | ||||||
| Rubber Tree Trunk =  |  | ||||||
| Jungle Tree Trunk =  |  | ||||||
| Douglas Fir Trunk =  |  | ||||||
| Beech Tree Planks =  |  | ||||||
| Apple Tree Planks =  |  | ||||||
| Oak Tree Planks =  |  | ||||||
| Giant Sequoia Planks =  |  | ||||||
| Birch Tree Planks =  |  | ||||||
| Palm Tree Planks =  |  | ||||||
| Spruce Tree Planks =  |  | ||||||
| Pine Tree Planks =  |  | ||||||
| Willow Tree Planks =  |  | ||||||
| Rubber Tree Planks =  |  | ||||||
| Jungle Tree Planks =  |  | ||||||
| Douglas Fir Planks =  |  | ||||||
| Beech Tree Sapling =  |  | ||||||
| Apple Tree Sapling =  |  | ||||||
| Oak Tree Sapling =  |  | ||||||
| Giant Sequoia Sapling =  |  | ||||||
| Birch Tree Sapling =  |  | ||||||
| Palm Tree Sapling =  |  | ||||||
| Spruce Tree Sapling =  |  | ||||||
| Pine Tree Sapling =  |  | ||||||
| Willow Tree Sapling =  |  | ||||||
| Rubber Tree Sapling =  |  | ||||||
| Jungle Tree Sapling =  |  | ||||||
| Douglas Fir Sapling =  |  | ||||||
| Beech Tree Leaves =  |  | ||||||
| Apple Tree Leaves =  |  | ||||||
| Oak Tree Leaves =  |  | ||||||
| Giant Sequoia Leaves =  |  | ||||||
| Birch Tree Leaves =  |  | ||||||
| Palm Tree Leaves =  |  | ||||||
| Spruce Tree Leaves =  |  | ||||||
| Pine Tree Leaves =  |  | ||||||
| Willow Tree Leaves =  |  | ||||||
| Rubber Tree Leaves =  |  | ||||||
| Jungle Tree Leaves =  |  | ||||||
| Douglas Fir Leaves =  |  | ||||||
|  |  | ||||||
| Acorn =  | @1 (fast growth)= | ||||||
| Coconut =  | Acorn= | ||||||
| Spruce Cone =  | Apple Tree= | ||||||
| Pine Cone =  | Apple Tree Fence= | ||||||
| Fir Cone =  | Apple Tree Fence Gate= | ||||||
| Jungle Sapling =  | Apple Tree Fence Rail= | ||||||
| Jungle Tree Leaves (Green) =  | Apple Tree Leaves= | ||||||
| Jungle Tree Leaves (Yellow) =  | Apple Tree Planks= | ||||||
| Jungle Tree Leaves (Red) =  | Apple Tree Planks Slab= | ||||||
| Douglas Fir Leaves (Bright) =  | Apple Tree Planks Stair= | ||||||
| Rubber Tree Trunk (Empty) =  | Apple Tree Sapling= | ||||||
|  | Apple Tree Trunk= | ||||||
| [Moretrees] Loaded (2013-02-11) =  | Apple Tree Trunk Slab= | ||||||
|  | Apple Tree Trunk Stair= | ||||||
|  | Beech Tree= | ||||||
|  | Beech Tree Fence= | ||||||
|  | Beech Tree Fence Gate= | ||||||
|  | Beech Tree Fence Rail= | ||||||
|  | Beech Tree Leaves= | ||||||
|  | Beech Tree Planks= | ||||||
|  | Beech Tree Planks Slab= | ||||||
|  | Beech Tree Planks Stair= | ||||||
|  | Beech Tree Sapling= | ||||||
|  | Beech Tree Trunk= | ||||||
|  | Beech Tree Trunk Slab= | ||||||
|  | Beech Tree Trunk Stair= | ||||||
|  | Birch Tree= | ||||||
|  | Birch Tree Fence= | ||||||
|  | Birch Tree Fence Gate= | ||||||
|  | Birch Tree Fence Rail= | ||||||
|  | Birch Tree Leaves= | ||||||
|  | Birch Tree Planks= | ||||||
|  | Birch Tree Planks Slab= | ||||||
|  | Birch Tree Planks Stair= | ||||||
|  | Birch Tree Sapling= | ||||||
|  | Birch Tree Trunk= | ||||||
|  | Birch Tree Trunk Slab= | ||||||
|  | Birch Tree Trunk Stair= | ||||||
|  | Cedar Cone= | ||||||
|  | Cedar Tree= | ||||||
|  | Cedar Tree Fence= | ||||||
|  | Cedar Tree Fence Gate= | ||||||
|  | Cedar Tree Fence Rail= | ||||||
|  | Cedar Tree Leaves= | ||||||
|  | Cedar Tree Planks= | ||||||
|  | Cedar Tree Planks Slab= | ||||||
|  | Cedar Tree Planks Stair= | ||||||
|  | Cedar Tree Sapling= | ||||||
|  | Cedar Tree Trunk= | ||||||
|  | Cedar Tree Trunk Slab= | ||||||
|  | Cedar Tree Trunk Stair= | ||||||
|  | Date Palm Tree= | ||||||
|  | Date Palm Tree Fence= | ||||||
|  | Date Palm Tree Fence Gate= | ||||||
|  | Date Palm Tree Fence Rail= | ||||||
|  | Date Palm Tree Leaves= | ||||||
|  | Date Palm Tree Planks= | ||||||
|  | Date Palm Tree Planks Slab= | ||||||
|  | Date Palm Tree Planks Stair= | ||||||
|  | Date Palm Tree Sapling= | ||||||
|  | Date Palm Tree Trunk= | ||||||
|  | Date Palm Tree Trunk Slab= | ||||||
|  | Date Palm Tree Trunk Stair= | ||||||
|  | Douglas Fir= | ||||||
|  | Douglas Fir Fence= | ||||||
|  | Douglas Fir Fence Gate= | ||||||
|  | Douglas Fir Fence Rail= | ||||||
|  | Douglas Fir Leaves= | ||||||
|  | Douglas Fir Leaves (Bright)= | ||||||
|  | Douglas Fir Planks= | ||||||
|  | Douglas Fir Planks Slab= | ||||||
|  | Douglas Fir Planks Stair= | ||||||
|  | Douglas Fir Sapling= | ||||||
|  | Douglas Fir Trunk= | ||||||
|  | Douglas Fir Trunk Slab= | ||||||
|  | Douglas Fir Trunk Stair= | ||||||
|  | Fir Cone= | ||||||
|  | Giant Sequoia= | ||||||
|  | Giant Sequoia Fence= | ||||||
|  | Giant Sequoia Fence Gate= | ||||||
|  | Giant Sequoia Fence Rail= | ||||||
|  | Giant Sequoia Leaves= | ||||||
|  | Giant Sequoia Planks= | ||||||
|  | Giant Sequoia Planks Slab= | ||||||
|  | Giant Sequoia Planks Stair= | ||||||
|  | Giant Sequoia Sapling= | ||||||
|  | Giant Sequoia Trunk= | ||||||
|  | Giant Sequoia Trunk Slab= | ||||||
|  | Giant Sequoia Trunk Stair= | ||||||
|  | Jungle Tree= | ||||||
|  | Jungle Tree Fence= | ||||||
|  | Jungle Tree Fence Gate= | ||||||
|  | Jungle Tree Fence Rail= | ||||||
|  | Jungle Tree Leaves= | ||||||
|  | Jungle Tree Leaves (@1)= | ||||||
|  | Jungle Tree Planks= | ||||||
|  | Jungle Tree Planks Slab= | ||||||
|  | Jungle Tree Planks Stair= | ||||||
|  | Jungle Tree Sapling= | ||||||
|  | Jungle Tree Trunk= | ||||||
|  | Jungle Tree Trunk Slab= | ||||||
|  | Jungle Tree Trunk Stair= | ||||||
|  | Oak Tree= | ||||||
|  | Oak Tree Fence= | ||||||
|  | Oak Tree Fence Gate= | ||||||
|  | Oak Tree Fence Rail= | ||||||
|  | Oak Tree Leaves= | ||||||
|  | Oak Tree Planks= | ||||||
|  | Oak Tree Planks Slab= | ||||||
|  | Oak Tree Planks Stair= | ||||||
|  | Oak Tree Sapling= | ||||||
|  | Oak Tree Trunk= | ||||||
|  | Oak Tree Trunk Slab= | ||||||
|  | Oak Tree Trunk Stair= | ||||||
|  | Palm Tree= | ||||||
|  | Palm Tree Fence= | ||||||
|  | Palm Tree Fence Gate= | ||||||
|  | Palm Tree Fence Rail= | ||||||
|  | Palm Tree Leaves= | ||||||
|  | Palm Tree Planks= | ||||||
|  | Palm Tree Planks Slab= | ||||||
|  | Palm Tree Planks Stair= | ||||||
|  | Palm Tree Sapling= | ||||||
|  | Palm Tree Trunk= | ||||||
|  | Palm Tree Trunk Slab= | ||||||
|  | Palm Tree Trunk Stair= | ||||||
|  | Poplar Tree= | ||||||
|  | Poplar Tree Fence= | ||||||
|  | Poplar Tree Fence Gate= | ||||||
|  | Poplar Tree Fence Rail= | ||||||
|  | Poplar Tree Leaves= | ||||||
|  | Poplar Tree Planks= | ||||||
|  | Poplar Tree Planks Slab= | ||||||
|  | Poplar Tree Planks Stair= | ||||||
|  | Poplar Tree Sapling= | ||||||
|  | Poplar Tree Trunk= | ||||||
|  | Poplar Tree Trunk Slab= | ||||||
|  | Poplar Tree Trunk Stair= | ||||||
|  | Red= | ||||||
|  | Rubber Tree= | ||||||
|  | Rubber Tree Fence= | ||||||
|  | Rubber Tree Fence Gate= | ||||||
|  | Rubber Tree Fence Rail= | ||||||
|  | Rubber Tree Leaves= | ||||||
|  | Rubber Tree Planks= | ||||||
|  | Rubber Tree Planks Slab= | ||||||
|  | Rubber Tree Planks Stair= | ||||||
|  | Rubber Tree Sapling= | ||||||
|  | Rubber Tree Trunk= | ||||||
|  | Rubber Tree Trunk (Empty)= | ||||||
|  | Rubber Tree Trunk Slab= | ||||||
|  | Rubber Tree Trunk Stair= | ||||||
|  | Small poplar Tree Sapling= | ||||||
|  | Spruce Cone= | ||||||
|  | Spruce Tree= | ||||||
|  | Spruce Tree Fence= | ||||||
|  | Spruce Tree Fence Gate= | ||||||
|  | Spruce Tree Fence Rail= | ||||||
|  | Spruce Tree Leaves= | ||||||
|  | Spruce Tree Planks= | ||||||
|  | Spruce Tree Planks Slab= | ||||||
|  | Spruce Tree Planks Stair= | ||||||
|  | Spruce Tree Sapling= | ||||||
|  | Spruce Tree Trunk= | ||||||
|  | Spruce Tree Trunk Slab= | ||||||
|  | Spruce Tree Trunk Stair= | ||||||
|  | Willow Tree= | ||||||
|  | Willow Tree Fence= | ||||||
|  | Willow Tree Fence Gate= | ||||||
|  | Willow Tree Fence Rail= | ||||||
|  | Willow Tree Leaves= | ||||||
|  | Willow Tree Planks= | ||||||
|  | Willow Tree Planks Slab= | ||||||
|  | Willow Tree Planks Stair= | ||||||
|  | Willow Tree Sapling= | ||||||
|  | Willow Tree Trunk= | ||||||
|  | Willow Tree Trunk Slab= | ||||||
|  | Willow Tree Trunk Stair= | ||||||
|  | Yellow= | ||||||
|   | |||||||
							
								
								
									
										4
									
								
								mod.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,4 @@ | |||||||
|  | name = moretrees | ||||||
|  | depends = default, biome_lib, vessels | ||||||
|  | optional_depends = doors, stairs, moreblocks, farming | ||||||
|  | min_minetest_version = 5.2.0 | ||||||
							
								
								
									
										609
									
								
								node_defs.lua
									
									
									
									
									
								
							
							
						
						| @@ -1,147 +1,326 @@ | |||||||
| local S = moretrees.intllib | local S = minetest.get_translator("moretrees") | ||||||
|  |  | ||||||
| moretrees.avoidnodes = {} | moretrees.avoidnodes = {} | ||||||
|  |  | ||||||
| moretrees.treelist = { | moretrees.treelist = { | ||||||
| 	{"beech",		"Beech Tree"}, | 	{"beech",        S("Beech Tree")}, | ||||||
| 	{"apple_tree",	"Apple Tree"}, | 	{"apple_tree",   S("Apple Tree")}, | ||||||
| 	{"oak",			"Oak Tree",			"acorn",		"Acorn",		{-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 0.8 }, | 	{"oak",          S("Oak Tree"),       "acorn",                 S("Acorn"), {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 0.8 }, | ||||||
| 	{"sequoia",		"Giant Sequoia"}, | 	{"sequoia",      S("Giant Sequoia")}, | ||||||
| 	{"birch",		"Birch Tree"}, | 	{"birch",        S("Birch Tree")}, | ||||||
| 	{"palm",		"Palm Tree",		"coconut",		"Coconut",		{-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 1.0 }, | 	{"palm",         S("Palm Tree"),      "palm_fruit_trunk_gen",  S("Palm Tree"), {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 1.0 }, | ||||||
| 	{"spruce",		"Spruce Tree",		"spruce_cone",	"Spruce Cone",	{-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 0.8 }, | 	{"date_palm",    S("Date Palm Tree"), "date_palm_fruit_trunk", S("Date Palm Tree"), {0, 0, 0, 0, 0, 0}, 0.0 }, | ||||||
| 	{"pine",		"Pine Tree",		"pine_cone",	"Pine 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 }, | ||||||
| 	{"willow",		"Willow Tree"}, | 	{"cedar",        S("Cedar Tree"),     "cedar_cone",            S("Cedar Cone"), {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 0.8 }, | ||||||
| 	{"acacia",		"Acacia Tree"}, | 	{"poplar",       S("Poplar Tree")}, | ||||||
| 	{"rubber_tree",	"Rubber Tree"}, | 	{"poplar_small", S("Poplar Tree")}, | ||||||
| 	{"jungletree",	"Jungle Tree"}, | 	{"willow",       S("Willow Tree")}, | ||||||
| 	{"fir",			"Douglas Fir",		"fir_cone",		"Fir Cone",		{-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 0.8 }, | 	{"rubber_tree",  S("Rubber Tree")}, | ||||||
|  | 	{"fir",          S("Douglas Fir"),    "fir_cone",              S("Fir Cone"), {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 0.8 }, | ||||||
|  | 	{"jungletree",   S("Jungle Tree"),     nil,                    nil, nil, nil, "default_junglesapling.png"  }, | ||||||
| } | } | ||||||
|  |  | ||||||
| local dirs1 = { 21, 20, 23, 22, 21 } | moretrees.treedesc = { | ||||||
|  | 	beech = { | ||||||
|  | 		trunk = S("Beech Tree Trunk"), | ||||||
|  | 		planks = S("Beech Tree Planks"), | ||||||
|  | 		sapling = S("Beech Tree Sapling"), | ||||||
|  | 		leaves = S("Beech Tree Leaves"), | ||||||
|  | 		trunk_stair = S("Beech Tree Trunk Stair"), | ||||||
|  | 		trunk_slab = S("Beech Tree Trunk Slab"), | ||||||
|  | 		planks_stair = S("Beech Tree Planks Stair"), | ||||||
|  | 		planks_slab = S("Beech Tree Planks Slab"), | ||||||
|  | 		fence = S("Beech Tree Fence"), | ||||||
|  | 		fence_rail = S("Beech Tree Fence Rail"), | ||||||
|  | 		fence_gate = S("Beech Tree Fence Gate"), | ||||||
|  | 	}, | ||||||
|  | 	apple_tree = { | ||||||
|  | 		trunk = S("Apple Tree Trunk"), | ||||||
|  | 		planks = S("Apple Tree Planks"), | ||||||
|  | 		sapling = S("Apple Tree Sapling"), | ||||||
|  | 		leaves = S("Apple Tree Leaves"), | ||||||
|  | 		trunk_stair = S("Apple Tree Trunk Stair"), | ||||||
|  | 		trunk_slab = S("Apple Tree Trunk Slab"), | ||||||
|  | 		planks_stair = S("Apple Tree Planks Stair"), | ||||||
|  | 		planks_slab = S("Apple Tree Planks Slab"), | ||||||
|  | 		fence = S("Apple Tree Fence"), | ||||||
|  | 		fence_rail = S("Apple Tree Fence Rail"), | ||||||
|  | 		fence_gate = S("Apple Tree Fence Gate"), | ||||||
|  | 	}, | ||||||
|  | 	oak = { | ||||||
|  | 		trunk = S("Oak Tree Trunk"), | ||||||
|  | 		planks = S("Oak Tree Planks"), | ||||||
|  | 		sapling = S("Oak Tree Sapling"), | ||||||
|  | 		leaves = S("Oak Tree Leaves"), | ||||||
|  | 		trunk_stair = S("Oak Tree Trunk Stair"), | ||||||
|  | 		trunk_slab = S("Oak Tree Trunk Slab"), | ||||||
|  | 		planks_stair = S("Oak Tree Planks Stair"), | ||||||
|  | 		planks_slab = S("Oak Tree Planks Slab"), | ||||||
|  | 		fence = S("Oak Tree Fence"), | ||||||
|  | 		fence_rail = S("Oak Tree Fence Rail"), | ||||||
|  | 		fence_gate = S("Oak Tree Fence Gate"), | ||||||
|  | 	}, | ||||||
|  | 	sequoia = { | ||||||
|  | 		trunk = S("Giant Sequoia Trunk"), | ||||||
|  | 		planks = S("Giant Sequoia Planks"), | ||||||
|  | 		sapling = S("Giant Sequoia Sapling"), | ||||||
|  | 		leaves = S("Giant Sequoia Leaves"), | ||||||
|  | 		trunk_stair = S("Giant Sequoia Trunk Stair"), | ||||||
|  | 		trunk_slab = S("Giant Sequoia Trunk Slab"), | ||||||
|  | 		planks_stair = S("Giant Sequoia Planks Stair"), | ||||||
|  | 		planks_slab = S("Giant Sequoia Planks Slab"), | ||||||
|  | 		fence = S("Giant Sequoia Fence"), | ||||||
|  | 		fence_rail = S("Giant Sequoia Fence Rail"), | ||||||
|  | 		fence_gate = S("Giant Sequoia Fence Gate"), | ||||||
|  | 	}, | ||||||
|  | 	birch = { | ||||||
|  | 		trunk = S("Birch Tree Trunk"), | ||||||
|  | 		planks = S("Birch Tree Planks"), | ||||||
|  | 		sapling = S("Birch Tree Sapling"), | ||||||
|  | 		leaves = S("Birch Tree Leaves"), | ||||||
|  | 		trunk_stair = S("Birch Tree Trunk Stair"), | ||||||
|  | 		trunk_slab = S("Birch Tree Trunk Slab"), | ||||||
|  | 		planks_stair = S("Birch Tree Planks Stair"), | ||||||
|  | 		planks_slab = S("Birch Tree Planks Slab"), | ||||||
|  | 		fence = S("Birch Tree Fence"), | ||||||
|  | 		fence_rail = S("Birch Tree Fence Rail"), | ||||||
|  | 		fence_gate = S("Birch Tree Fence Gate"), | ||||||
|  | 	}, | ||||||
|  | 	palm = { | ||||||
|  | 		trunk = S("Palm Tree Trunk"), | ||||||
|  | 		planks = S("Palm Tree Planks"), | ||||||
|  | 		sapling = S("Palm Tree Sapling"), | ||||||
|  | 		leaves = S("Palm Tree Leaves"), | ||||||
|  | 		trunk_stair = S("Palm Tree Trunk Stair"), | ||||||
|  | 		trunk_slab = S("Palm Tree Trunk Slab"), | ||||||
|  | 		planks_stair = S("Palm Tree Planks Stair"), | ||||||
|  | 		planks_slab = S("Palm Tree Planks Slab"), | ||||||
|  | 		fence = S("Palm Tree Fence"), | ||||||
|  | 		fence_rail = S("Palm Tree Fence Rail"), | ||||||
|  | 		fence_gate = S("Palm Tree Fence Gate"), | ||||||
|  | 	}, | ||||||
|  | 	date_palm = { | ||||||
|  | 		trunk = S("Date Palm Tree Trunk"), | ||||||
|  | 		planks = S("Date Palm Tree Planks"), | ||||||
|  | 		sapling = S("Date Palm Tree Sapling"), | ||||||
|  | 		leaves = S("Date Palm Tree Leaves"), | ||||||
|  | 		trunk_stair = S("Date Palm Tree Trunk Stair"), | ||||||
|  | 		trunk_slab = S("Date Palm Tree Trunk Slab"), | ||||||
|  | 		planks_stair = S("Date Palm Tree Planks Stair"), | ||||||
|  | 		planks_slab = S("Date Palm Tree Planks Slab"), | ||||||
|  | 		fence = S("Date Palm Tree Fence"), | ||||||
|  | 		fence_rail = S("Date Palm Tree Fence Rail"), | ||||||
|  | 		fence_gate = S("Date Palm Tree Fence Gate"), | ||||||
|  | 	}, | ||||||
|  | 	spruce = { | ||||||
|  | 		trunk = S("Spruce Tree Trunk"), | ||||||
|  | 		planks = S("Spruce Tree Planks"), | ||||||
|  | 		sapling = S("Spruce Tree Sapling"), | ||||||
|  | 		leaves = S("Spruce Tree Leaves"), | ||||||
|  | 		trunk_stair = S("Spruce Tree Trunk Stair"), | ||||||
|  | 		trunk_slab = S("Spruce Tree Trunk Slab"), | ||||||
|  | 		planks_stair = S("Spruce Tree Planks Stair"), | ||||||
|  | 		planks_slab = S("Spruce Tree Planks Slab"), | ||||||
|  | 		fence = S("Spruce Tree Fence"), | ||||||
|  | 		fence_rail = S("Spruce Tree Fence Rail"), | ||||||
|  | 		fence_gate = S("Spruce Tree Fence Gate"), | ||||||
|  | 	}, | ||||||
|  | 	cedar =  { | ||||||
|  | 		trunk = S("Cedar Tree Trunk"), | ||||||
|  | 		planks = S("Cedar Tree Planks"), | ||||||
|  | 		sapling = S("Cedar Tree Sapling"), | ||||||
|  | 		leaves = S("Cedar Tree Leaves"), | ||||||
|  | 		trunk_stair = S("Cedar Tree Trunk Stair"), | ||||||
|  | 		trunk_slab = S("Cedar Tree Trunk Slab"), | ||||||
|  | 		planks_stair = S("Cedar Tree Planks Stair"), | ||||||
|  | 		planks_slab = S("Cedar Tree Planks Slab"), | ||||||
|  | 		fence = S("Cedar Tree Fence"), | ||||||
|  | 		fence_rail = S("Cedar Tree Fence Rail"), | ||||||
|  | 		fence_gate = S("Cedar Tree Fence Gate"), | ||||||
|  | 	}, | ||||||
|  | 	poplar = { | ||||||
|  | 		trunk = S("Poplar Tree Trunk"), | ||||||
|  | 		planks = S("Poplar Tree Planks"), | ||||||
|  | 		sapling = S("Poplar Tree Sapling"), | ||||||
|  | 		leaves = S("Poplar Tree Leaves"), | ||||||
|  | 		trunk_stair = S("Poplar Tree Trunk Stair"), | ||||||
|  | 		trunk_slab = S("Poplar Tree Trunk Slab"), | ||||||
|  | 		planks_stair = S("Poplar Tree Planks Stair"), | ||||||
|  | 		planks_slab = S("Poplar Tree Planks Slab"), | ||||||
|  | 		fence = S("Poplar Tree Fence"), | ||||||
|  | 		fence_rail = S("Poplar Tree Fence Rail"), | ||||||
|  | 		fence_gate = S("Poplar Tree Fence Gate"), | ||||||
|  | 	}, | ||||||
|  | 	poplar_small = { | ||||||
|  | 		sapling = S("Small poplar Tree Sapling"), | ||||||
|  | 	}, | ||||||
|  | 	willow = { | ||||||
|  | 		trunk = S("Willow Tree Trunk"), | ||||||
|  | 		planks = S("Willow Tree Planks"), | ||||||
|  | 		sapling = S("Willow Tree Sapling"), | ||||||
|  | 		leaves = S("Willow Tree Leaves"), | ||||||
|  | 		trunk_stair = S("Willow Tree Trunk Stair"), | ||||||
|  | 		trunk_slab = S("Willow Tree Trunk Slab"), | ||||||
|  | 		planks_stair = S("Willow Tree Planks Stair"), | ||||||
|  | 		planks_slab = S("Willow Tree Planks Slab"), | ||||||
|  | 		fence = S("Willow Tree Fence"), | ||||||
|  | 		fence_rail = S("Willow Tree Fence Rail"), | ||||||
|  | 		fence_gate = S("Willow Tree Fence Gate"), | ||||||
|  | 	}, | ||||||
|  | 	rubber_tree = { | ||||||
|  | 		trunk = S("Rubber Tree Trunk"), | ||||||
|  | 		planks = S("Rubber Tree Planks"), | ||||||
|  | 		sapling = S("Rubber Tree Sapling"), | ||||||
|  | 		leaves = S("Rubber Tree Leaves"), | ||||||
|  | 		trunk_stair = S("Rubber Tree Trunk Stair"), | ||||||
|  | 		trunk_slab = S("Rubber Tree Trunk Slab"), | ||||||
|  | 		planks_stair = S("Rubber Tree Planks Stair"), | ||||||
|  | 		planks_slab = S("Rubber Tree Planks Slab"), | ||||||
|  | 		fence = S("Rubber Tree Fence"), | ||||||
|  | 		fence_rail = S("Rubber Tree Fence Rail"), | ||||||
|  | 		fence_gate = S("Rubber Tree Fence Gate"), | ||||||
|  | 	}, | ||||||
|  | 	fir = { | ||||||
|  | 		trunk = S("Douglas Fir Trunk"), | ||||||
|  | 		planks = S("Douglas Fir Planks"), | ||||||
|  | 		sapling = S("Douglas Fir Sapling"), | ||||||
|  | 		leaves = S("Douglas Fir Leaves"), | ||||||
|  | 		trunk_stair = S("Douglas Fir Trunk Stair"), | ||||||
|  | 		trunk_slab = S("Douglas Fir Trunk Slab"), | ||||||
|  | 		planks_stair = S("Douglas Fir Planks Stair"), | ||||||
|  | 		planks_slab = S("Douglas Fir Planks Slab"), | ||||||
|  | 		fence = S("Douglas Fir Fence"), | ||||||
|  | 		fence_rail = S("Douglas Fir Fence Rail"), | ||||||
|  | 		fence_gate = S("Douglas Fir Fence Gate"), | ||||||
|  | 	}, | ||||||
|  | 	jungletree = { | ||||||
|  | 		trunk = S("Jungle Tree Trunk"), | ||||||
|  | 		planks = S("Jungle Tree Planks"), | ||||||
|  | 		sapling = S("Jungle Tree Sapling"), | ||||||
|  | 		leaves = S("Jungle Tree Leaves"), | ||||||
|  | 		trunk_stair = S("Jungle Tree Trunk Stair"), | ||||||
|  | 		trunk_slab = S("Jungle Tree Trunk Slab"), | ||||||
|  | 		planks_stair = S("Jungle Tree Planks Stair"), | ||||||
|  | 		planks_slab = S("Jungle Tree Planks Slab"), | ||||||
|  | 		fence = S("Jungle Tree Fence"), | ||||||
|  | 		fence_rail = S("Jungle Tree Fence Rail"), | ||||||
|  | 		fence_gate = S("Jungle Tree Fence Gate"), | ||||||
|  | 	}, | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | -- local dirs1 = { 21, 20, 23, 22, 21 } | ||||||
| local dirs2 = { 12, 9, 18, 7, 12 } | local 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 | ||||||
|  |  | ||||||
| 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 = 1.189 | 	moretrees_plantlike_leaves_visual_scale = math.sqrt(2) | ||||||
| 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 = 1.189 | 		visual_scale = math.sqrt(2) | ||||||
| 	}) |  | ||||||
| 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 = 1.189 | 		visual_scale = math.sqrt(2) | ||||||
| 	}) |  | ||||||
| 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] | ||||||
|  |  | ||||||
| 	if treename ~= "jungletree" then -- the default game provides jungle tree trunk/planks nodes. | 	local saptex = moretrees.treelist[i][7] | ||||||
|  |  | ||||||
|  | 	-- 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.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 = S(treedesc.." Trunk"), | 			description = moretrees.treedesc[treename].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 = true, | 			is_ground_content = false, | ||||||
| 			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 = S(treedesc.." Planks"), | 			description = moretrees.treedesc[treename].planks, | ||||||
| 			tiles = {"moretrees_"..treename.."_wood.png"}, | 			tiles = {"moretrees_"..treename.."_wood.png"}, | ||||||
| 			is_ground_content = true, | 			is_ground_content = false, | ||||||
| 			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 = S(treedesc.." Sapling"), | 			description = moretrees.treedesc[treename].sapling, | ||||||
| 			drawtype = "plantlike", | 			drawtype = "plantlike", | ||||||
| 			tiles = {"moretrees_"..treename.."_sapling.png"}, | 			tiles = {saptex}, | ||||||
| 			inventory_image = "moretrees_"..treename.."_sapling.png", | 			inventory_image = saptex, | ||||||
| 			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", | ||||||
|  | 					-- 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, | ||||||
| 		}) | 		}) | ||||||
|  |  | ||||||
| 		minetest.register_node("moretrees:"..treename.."_sapling_ongen", { |  | ||||||
| 			description = S(treedesc.." Sapling"), |  | ||||||
| 			drawtype = "plantlike", |  | ||||||
| 			tiles = {"moretrees_"..treename.."_sapling.png"}, |  | ||||||
| 			inventory_image = "moretrees_"..treename.."_sapling.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_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 | 		local moretrees_new_leaves_waving = nil | ||||||
|  |  | ||||||
| @@ -152,14 +331,15 @@ for i in ipairs(moretrees.treelist) do | |||||||
| 		end | 		end | ||||||
|  |  | ||||||
| 		minetest.register_node("moretrees:"..treename.."_leaves", { | 		minetest.register_node("moretrees:"..treename.."_leaves", { | ||||||
| 			description = S(treedesc.." Leaves"), | 			description = moretrees.treedesc[treename].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", | ||||||
| 			groups = {snappy=3, flammable=2, leaves=1, moretrees_leaves=1}, | 			is_ground_content = false, | ||||||
|  | 			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 = { | ||||||
| @@ -171,9 +351,10 @@ for i in ipairs(moretrees.treelist) do | |||||||
| 			}, | 			}, | ||||||
| 		}) | 		}) | ||||||
|  |  | ||||||
| 		if minetest.get_modpath("moreblocks") and moretrees.enable_stairsplus then | 		if moretrees.enable_stairs 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", | ||||||
| @@ -186,7 +367,7 @@ for i in ipairs(moretrees.treelist) do | |||||||
| 							"moretrees_"..treename.."_trunk_top.png", | 							"moretrees_"..treename.."_trunk_top.png", | ||||||
| 							"moretrees_"..treename.."_trunk.png" | 							"moretrees_"..treename.."_trunk.png" | ||||||
| 						}, | 						}, | ||||||
| 					description = S(treedesc.." Trunk"), | 						description = moretrees.treedesc[treename].trunk, | ||||||
| 						drop = treename.."_trunk", | 						drop = treename.."_trunk", | ||||||
| 					} | 					} | ||||||
| 				) | 				) | ||||||
| @@ -198,39 +379,143 @@ for i in ipairs(moretrees.treelist) do | |||||||
| 					{ | 					{ | ||||||
| 						groups = { snappy=1, choppy=2, oddly_breakable_by_hand=2, flammable=3, not_in_creative_inventory=1 }, | 						groups = { snappy=1, choppy=2, oddly_breakable_by_hand=2, flammable=3, not_in_creative_inventory=1 }, | ||||||
| 						tiles = { "moretrees_"..treename.."_wood.png" }, | 						tiles = { "moretrees_"..treename.."_wood.png" }, | ||||||
| 					description = S(treedesc.." Planks"), | 						description = moretrees.treedesc[treename].planks, | ||||||
| 						drop = 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.png" | ||||||
|  | 					}, | ||||||
|  | 					moretrees.treedesc[treename].trunk_stair, | ||||||
|  | 					moretrees.treedesc[treename].trunk_slab, | ||||||
|  | 					default.node_sound_wood_defaults() | ||||||
|  | 				) | ||||||
|  |  | ||||||
|  | 				stairs.register_stair_and_slab( | ||||||
|  | 					"moretrees_"..treename.."_planks", | ||||||
|  | 					"moretrees:"..treename.."_planks", | ||||||
|  | 					{ snappy=1, choppy=2, oddly_breakable_by_hand=2, flammable=3 }, | ||||||
|  | 					{ "moretrees_"..treename.."_wood.png" }, | ||||||
|  | 					moretrees.treedesc[treename].planks_stair, | ||||||
|  | 					moretrees.treedesc[treename].planks_slab, | ||||||
|  | 					default.node_sound_wood_defaults() | ||||||
|  | 				) | ||||||
|  |  | ||||||
| 			end | 			end | ||||||
| 		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 | ||||||
|  |  | ||||||
|  | 	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 | ||||||
| 		minetest.register_node("moretrees:"..fruit, { | 		fruitname = "moretrees:"..fruit | ||||||
| 			description = S(fruitdesc), | 		minetest.register_node(fruitname, { | ||||||
|  | 			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, | ||||||
| 			walkable = false, |  | ||||||
| 			paramtype = "light", | 			paramtype = "light", | ||||||
|  | 			sunlight_propagates = true, | ||||||
|  | 			is_ground_content = false, | ||||||
|  | 			walkable = false, | ||||||
| 			selection_box = { | 			selection_box = { | ||||||
| 				type = "fixed", | 				type = "fixed", | ||||||
| 					fixed = selbox | 					fixed = selbox | ||||||
| 				}, | 				}, | ||||||
| 			groups = {fleshy=3,dig_immediate=3,flammable=2, attached_node=1}, | 			groups = {fleshy=3,dig_immediate=3,flammable=2, attached_node=1, leafdecay = 1, leafdecay_drop = 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 | ||||||
| 				nfdir = dirs2[fdir+1] | 				local 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, | ||||||
| 	}) | 	}) | ||||||
| @@ -243,46 +528,50 @@ for i in ipairs(moretrees.treelist) do | |||||||
| 	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: | ||||||
|  |  | ||||||
| minetest.register_node("moretrees:jungletree_sapling", { | local jungleleaves = {"yellow","red"} | ||||||
| 	description = S("Jungle Sapling"), | local jungleleavesnames = {S("Yellow"), S("Red")} | ||||||
| 	drawtype = "plantlike", | for color = 1, #jungleleaves do | ||||||
| 	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 | ||||||
| @@ -294,18 +583,19 @@ for color = 1, 3 do | |||||||
| 	end | 	end | ||||||
|  |  | ||||||
| 	minetest.register_node(leave_name, { | 	minetest.register_node(leave_name, { | ||||||
| 		description = S("Jungle Tree Leaves ("..jungleleavesnames[color]..")"), | 		description = S("Jungle Tree Leaves (@1)", jungleleavesnames[color]), | ||||||
| 		drawtype = moretrees_new_leaves_drawtype, | 		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", | ||||||
| 		groups = {snappy=3, flammable=2, leaves=1, moretrees_leaves=1}, | 		is_ground_content = false, | ||||||
|  | 		groups = {snappy = 3, flammable = 2, leaves = 1, moretrees_leaves = 1, leafdecay = 3 }, | ||||||
| 		drop = { | 		drop = { | ||||||
| 			max_items = 1, | 			max_items = 1, | ||||||
| 			items = { | 			items = { | ||||||
| 				{items = {'moretrees:jungletree_sapling'}, rarity = 100 }, | 				{items = {"default:junglesapling"}, rarity = 100 }, | ||||||
| 				{items = {"moretrees:jungletree_leaves_"..jungleleaves[color]} } | 				{items = {"moretrees:jungletree_leaves_"..jungleleaves[color]} } | ||||||
| 			} | 			} | ||||||
| 		}, | 		}, | ||||||
| @@ -313,6 +603,19 @@ for color = 1, 3 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 = "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 | ||||||
| @@ -329,7 +632,8 @@ 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", | ||||||
| 	groups = {snappy=3, flammable=2, leaves=1, moretrees_leaves=1 }, | 	is_ground_content = false, | ||||||
|  | 	groups = {snappy = 3, flammable = 2, leaves = 1, moretrees_leaves = 1, leafdecay = 3 }, | ||||||
| 	drop = { | 	drop = { | ||||||
| 		max_items = 1, | 		max_items = 1, | ||||||
| 		items = { | 		items = { | ||||||
| @@ -340,22 +644,29 @@ 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 | ||||||
| 	minetest.override_item("default:apple", | 	local appledef = table.copy(minetest.registered_nodes["default:apple"]) | ||||||
| 		{groups = { fleshy=3, dig_immediate=3, flammable=2, leafdecay=3, leafdecay_drop=1, attached_node = 1} | 	appledef.groups.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, "moretrees:jungletree_trunk") | table.insert(moretrees.avoidnodes, "default:pine_tree") | ||||||
|  | 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, "moretrees:jungle_tree_sapling") | 	table.insert(moretrees.avoidnodes, "default:pine_sapling") | ||||||
| 	table.insert(moretrees.avoidnodes, "moretrees:jungle_tree_sapling_ongen") |  | ||||||
| end | end | ||||||
|  |  | ||||||
| -- "empty" (tapped) rubber tree nodes | -- "empty" (tapped) rubber tree nodes | ||||||
| @@ -367,10 +678,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, | ||||||
| }) | }) | ||||||
|  |  | ||||||
| @@ -380,12 +691,12 @@ 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 | ||||||
| 			nfdir = dirs2[fdir+1] | 			local 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 and recently-changed nodes. | -- For compatibility with old nodes, recently-changed nodes, and default 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") | ||||||
| @@ -399,15 +710,6 @@ minetest.register_alias("technic:rubber_tree_sapling", "moretrees:rubber_tree_sa | |||||||
| 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("default:junglesapling","moretrees:jungletree_sapling") |  | ||||||
| minetest.register_alias("moretrees:jungletree_trunk_sideways", "moreblocks:horizontal_jungle_tree") |  | ||||||
| minetest.register_alias("moretrees:jungletree_trunk", "default:jungletree") |  | ||||||
| minetest.register_alias("moretrees:jungletree_planks", "default:junglewood") |  | ||||||
|  |  | ||||||
| minetest.register_alias("jungletree:leaves_green", "moretrees:jungletree_leaves_green") |  | ||||||
| minetest.register_alias("jungletree:leaves_red", "moretrees:jungletree_leaves_red") |  | ||||||
| minetest.register_alias("jungletree:leaves_yellow", "moretrees:jungletree_leaves_yellow") |  | ||||||
|  |  | ||||||
| minetest.register_alias("moretrees:conifer_trunk",				"moretrees:fir_trunk") | minetest.register_alias("moretrees:conifer_trunk",				"moretrees:fir_trunk") | ||||||
| minetest.register_alias("moretrees:conifer_trunk_sideways",		"moretrees:fir_trunk_sideways") | minetest.register_alias("moretrees:conifer_trunk_sideways",		"moretrees:fir_trunk_sideways") | ||||||
| minetest.register_alias("moretrees:conifer_leaves",				"moretrees:fir_leaves") | minetest.register_alias("moretrees:conifer_leaves",				"moretrees:fir_leaves") | ||||||
| @@ -420,3 +722,22 @@ minetest.register_alias("conifers:leaves", "moretrees:fir_leaves") | |||||||
| minetest.register_alias("conifers:leaves_special",				"moretrees:fir_leaves_bright") | minetest.register_alias("conifers:leaves_special",				"moretrees:fir_leaves_bright") | ||||||
| minetest.register_alias("conifers:sapling",						"moretrees:fir_sapling") | minetest.register_alias("conifers:sapling",						"moretrees:fir_sapling") | ||||||
|  |  | ||||||
|  | minetest.register_alias("moretrees:jungletree_sapling",			"default:junglesapling") | ||||||
|  | minetest.register_alias("moretrees:jungletree_trunk_sideways",	"moreblocks:horizontal_jungle_tree") | ||||||
|  | minetest.register_alias("moretrees:jungletree_planks",			"default:junglewood") | ||||||
|  | minetest.register_alias("moretrees:jungletree_leaves_green",	"default:jungleleaves") | ||||||
|  |  | ||||||
|  | minetest.register_alias("moretrees:acacia_trunk",				"default:acacia_tree") | ||||||
|  | minetest.register_alias("moretrees:acacia_planks",				"default:acacia_wood") | ||||||
|  | minetest.register_alias("moretrees:acacia_sapling",				"default:acacia_sapling") | ||||||
|  | minetest.register_alias("moretrees:acacia_leaves",				"default:acacia_leaves") | ||||||
|  |  | ||||||
|  | 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") | ||||||
|   | |||||||
							
								
								
									
										143
									
								
								saplings.lua
									
									
									
									
									
								
							
							
						
						| @@ -1,93 +1,84 @@ | |||||||
| -- 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_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 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | 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 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | local sand_surfaces = { | ||||||
|  | 	set = true, | ||||||
|  | 	["default:sand"] = true, | ||||||
|  | 	["default:desert_sand"] = true, | ||||||
|  | 	["cottages:loam"] = 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 ~= "birch" and treename ~= "spruce" and treename ~= "fir" and treename ~= "jungletree" then | 	if treename == "spruce" | ||||||
|  | 	  or treename == "fir" | ||||||
|  | 	  or treename == "cedar" | ||||||
|  | 	  or treename == "pine" then | ||||||
|  | 		surfaces = conifer_surfaces | ||||||
|  | 	elseif string.find(treename, "palm") then | ||||||
|  | 		surfaces = sand_surfaces | ||||||
|  | 	else | ||||||
|  | 		surfaces = dirt_surfaces | ||||||
|  | 	end | ||||||
|  |  | ||||||
| 		plantslib:dbg(dump(moretrees[tree_biome].surface)) | 	if treename == "spruce" | ||||||
| 		plantslib:grow_plants({ | 	  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_delay = moretrees.sapling_interval, | ||||||
| 		grow_chance = moretrees.sapling_chance, | 		grow_chance = moretrees.sapling_chance, | ||||||
| 		grow_plant = "moretrees:"..treename.."_sapling", | 		grow_plant = "moretrees:"..treename.."_sapling", | ||||||
| 			grow_nodes = moretrees[tree_biome].surface, | 		grow_nodes = surfaces, | ||||||
| 			grow_function = moretrees[tree_model], | 		grow_function = grow_function, | ||||||
| 	}) | 	}) | ||||||
|  |  | ||||||
| 		plantslib:grow_plants({ | 	biome_lib:grow_plants({ | ||||||
| 		grow_delay = 2, | 		grow_delay = 2, | ||||||
| 			grow_chance = 30, | 		grow_chance = 1, | ||||||
| 		grow_plant = "moretrees:"..treename.."_sapling_ongen", | 		grow_plant = "moretrees:"..treename.."_sapling_ongen", | ||||||
| 			grow_nodes = moretrees[tree_biome].surface, | 		grow_nodes = surfaces, | ||||||
| 			grow_function = moretrees[tree_model], | 		grow_function = grow_function, | ||||||
| 	}) | 	}) | ||||||
|  |  | ||||||
| 	end |  | ||||||
| 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
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,168 @@ | |||||||
|  | -- 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
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 101 KiB | 
| Before Width: | Height: | Size: 150 B | 
| Before Width: | Height: | Size: 205 B | 
| Before Width: | Height: | Size: 599 B | 
| Before Width: | Height: | Size: 651 B | 
| Before Width: | Height: | Size: 175 B | 
| 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 | 
							
								
								
									
										
											BIN
										
									
								
								textures/moretrees_coconut_0.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 877 B | 
							
								
								
									
										
											BIN
										
									
								
								textures/moretrees_coconut_1.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 429 B | 
							
								
								
									
										
											BIN
										
									
								
								textures/moretrees_coconut_2.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1009 B | 
							
								
								
									
										
											BIN
										
									
								
								textures/moretrees_date.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 2.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								textures/moretrees_date_nut_bar.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 685 B | 
							
								
								
									
										
											BIN
										
									
								
								textures/moretrees_date_nut_batter.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 608 B | 
							
								
								
									
										
											BIN
										
									
								
								textures/moretrees_date_nut_cake.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 695 B | 
							
								
								
									
										
											BIN
										
									
								
								textures/moretrees_date_nut_snack.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 450 B | 
							
								
								
									
										
											BIN
										
									
								
								textures/moretrees_date_palm_leaves.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 757 B | 
							
								
								
									
										
											BIN
										
									
								
								textures/moretrees_date_palm_sapling.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 261 B | 
							
								
								
									
										
											BIN
										
									
								
								textures/moretrees_date_palm_trunk.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.2 KiB | 
							
								
								
									
										
											BIN
										
									
								
								textures/moretrees_date_palm_trunk_top.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 673 B | 
							
								
								
									
										
											BIN
										
									
								
								textures/moretrees_date_palm_wood.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 735 B | 
							
								
								
									
										
											BIN
										
									
								
								textures/moretrees_dates.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 9.2 KiB | 
							
								
								
									
										
											BIN
										
									
								
								textures/moretrees_dates_f0.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.8 KiB | 
							
								
								
									
										
											BIN
										
									
								
								textures/moretrees_dates_f1.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 4.0 KiB | 
							
								
								
									
										
											BIN
										
									
								
								textures/moretrees_dates_f2.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 8.9 KiB | 
							
								
								
									
										
											BIN
										
									
								
								textures/moretrees_dates_f3.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 8.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								textures/moretrees_dates_f4.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 9.0 KiB | 
							
								
								
									
										
											BIN
										
									
								
								textures/moretrees_dates_fn.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 2.5 KiB | 
							
								
								
									
										
											BIN
										
									
								
								textures/moretrees_dates_m0.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 4.0 KiB | 
							
								
								
									
										
											BIN
										
									
								
								textures/moretrees_dates_n.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 2.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								textures/moretrees_poplar_leaves.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 563 B | 
							
								
								
									
										
											BIN
										
									
								
								textures/moretrees_poplar_sapling.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 447 B | 
							
								
								
									
										
											BIN
										
									
								
								textures/moretrees_poplar_small_sapling.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 347 B | 
							
								
								
									
										
											BIN
										
									
								
								textures/moretrees_poplar_trunk-1.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.2 KiB | 
							
								
								
									
										
											BIN
										
									
								
								textures/moretrees_poplar_trunk.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 980 B | 
							
								
								
									
										
											BIN
										
									
								
								textures/moretrees_poplar_trunk_top.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 751 B | 
							
								
								
									
										
											BIN
										
									
								
								textures/moretrees_poplar_wood.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 726 B | 
| @@ -1,21 +1,22 @@ | |||||||
|  |  | ||||||
| 				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 | ||||||
|  | date palm		+11 to +30		 above +39		water, 1h,30v	  1		desert_sand			340			10 | ||||||
| apple			+ 1 to +10		+23 to +32		  n/a			n/a		dirt_with grass		331			15 | apple			+ 1 to +10		+23 to +32		  n/a			n/a		dirt_with grass		331			15 | ||||||
| oak				  0 to +10		+ 4 to +16		  n/a			n/a		dirt_with grass		332			15 | oak				  0 to +10		+ 4 to +16		  n/a			n/a		dirt_with grass		332			15 | ||||||
| sequoia			  0 to +10		-30 to +50		  n/a			n/a		dirt_with grass		333			10 | sequoia			  0 to +10		-30 to +50		  n/a			n/a		dirt_with grass		333			10 | ||||||
| birch			+10 to +15		-20 to +10		  n/a			n/a		dirt_with grass		334			 5 | birch			+10 to +15		-20 to +10		  n/a			n/a		dirt_with grass		334			 5 | ||||||
| spruce			 above +20		-20 to +10		  n/a			n/a		dirt_with grass		335			10 | spruce			 above +20		-20 to +10		  n/a			n/a		dirt_with grass		335			10 | ||||||
| pine		    n/a		    n/a		water, 15	   5	dirt_with grass		336		10 | cedar			    n/a			    n/a			water, 15		  5		dirt_with grass		336			10 | ||||||
| willow			- 5 to + 5		    n/a			water, 15		  5		dirt_with grass		337			20 | willow			- 5 to + 5		    n/a			water, 15		  5		dirt_with grass		337			20 | ||||||
| acacia		    n/a		    n/a		  n/a		n/a	dirt_with_grass, |  | ||||||
| 									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 | ||||||
|  |  | ||||||
| @@ -26,9 +27,8 @@ 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,8 +10,7 @@ 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={ | ||||||
| @@ -27,7 +26,6 @@ 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={ | ||||||
| @@ -43,7 +41,36 @@ 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={ | ||||||
| @@ -58,8 +85,7 @@ 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={ | ||||||
| @@ -74,8 +100,7 @@ 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={ | ||||||
| @@ -90,12 +115,16 @@ 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&FFFFFddd[^&&&GR][^///&&&GR][^//////&&&GR][^***&&&GR]FA//A//A//A//A//A", | 	axiom="FFcccccc&FFFFFdddRA//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="/", | ||||||
| @@ -107,9 +136,33 @@ moretrees.palm_model={ | |||||||
| 	random_level=0, | 	random_level=0, | ||||||
| 	trunk_type="single", | 	trunk_type="single", | ||||||
| 	thin_branches=true, | 	thin_branches=true, | ||||||
| 	fruit="moretrees:coconut", | 	fruit="moretrees:palm_fruit_trunk_gen", | ||||||
| 	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[TGGGGT]".. | ||||||
|  | 		"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={ | ||||||
| @@ -126,8 +179,7 @@ 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={ | ||||||
| @@ -143,26 +195,24 @@ 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.pine_model={ | moretrees.cedar_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:pine_trunk", | 	trunk="moretrees:cedar_trunk", | ||||||
| 	leaves="moretrees:pine_leaves", | 	leaves="moretrees:cedar_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:pine_cone", | 	fruit="moretrees:cedar_cone", | ||||||
| 	fruit_chance=8, | 	fruit_chance=8 | ||||||
| 	enable_unique_ids = true, |  | ||||||
| } | } | ||||||
|  |  | ||||||
| moretrees.willow_model={ | moretrees.willow_model={ | ||||||
| @@ -176,40 +226,7 @@ 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={ | ||||||
| @@ -222,16 +239,15 @@ 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="default:jungletree", | 	trunk="moretrees:jungletree_trunk", | ||||||
| 	leaves="moretrees:jungletree_leaves_green", | 	leaves="default:jungleleaves", | ||||||
| 	leaves2=nil, | 	leaves2=nil, | ||||||
| 	leaves2_chance=nil, | 	leaves2_chance=nil, | ||||||
| 	angle=45, | 	angle=45, | ||||||
| @@ -240,8 +256,7 @@ 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={ | ||||||
| @@ -256,6 +271,5 @@ 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, |  | ||||||
| } | } | ||||||
|   | |||||||